0

こんにちは、私は現在、id で指定された特定のポイントでコンテンツを特定のページに挿入する必要がある春 (3.2.x) アプリケーションを開発しています。

これは私が現在行っていることです:

@RequestMapping(value = "/{part}", method = RequestMethod.POST, produces="text/html")
@ResponseBody
public String enterModul(HttpServletRequest request, @PathVariable String part, @ModelAttribute Body body){
    //body handling omitted
    //getting the external html
    String frame = restTemplate.getForObject("...externalUrl", String.class);

    //getting my content
    String uri = request.getRequestURL().toString();
    String content = restTemplate.getForObject(uri, String.class);

    // merge frame and content
    String completeView = this.mergeFrameAndContent(frame, content);
    return completeView;
}

@RequestMapping(value = "/{part}", method = RequestMethod.GET, produces="text/html")
@ResponseBody
public ModelAndView getInitialContentForPart(@PathVariable String part) {
    //irrelevant code/model creation ommited
    //just using InternalResourceViewResolver so nothing fancy here
    ModelAndView view = new ModelAndView(part, "model", model);
    return view;
}

private String mergeFrameAndContent(String frame, String content) {
            //id identifies position
    String view = frame.replace("id", content);
    return view;
}

しかし、このようにすることは、どういうわけか正しく感じられません。より良い解決策はありますか?タイル3でやってみましたがうまくいきませんでした。

4

2 に答える 2

0

Filter を使用して Response を操作することで、より良い解決策を見つけました。これを行うことで、内部リクエストを 1 つ節約できます。これは再利用可能なソリューションです。

public class FrameFilter extends GenericFilterBean { 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        ServletResponse newResponse = response;

        if (request instanceof HttpServletRequest) {
            newResponse = new CharResponseWrapper((HttpServletResponse) response);
        }

        chain.doFilter(request, newResponse);

        if (newResponse instanceof CharResponseWrapper) {
           String modulContent = newResponse.toString();
           if (modulContent != null) {
                RestTemplate restTemplate = new RestTemplate();
                String frame = restTemplate.getForObject("FRAMEURL", String.class);
                String completeView = this.mergeFrameAndContent(frame, modulContent);
                response.getWriter().write(completeView);
            }
        }
    }
}

CharResponseWrapper は、次の例から取得されます。

于 2013-06-26T10:58:10.110 に答える
0

多くのアプリを含む分散アーキテクチャについて話しているので、Edge Side Includes (ESI、http://en.wikipedia.org/wiki/Edge_Side_Includesを参照) が探しているものかもしれません。たとえば、Varnish リバース プロキシ ( https://www.varnish-cache.org/trac/wiki/ESIfeaturesを参照) を使用してそれらを処理できます。

于 2013-06-04T21:26:45.943 に答える