Spring, как объединить внешнюю html-страницу с сгенерированным контентом

Привет, в настоящее время я разрабатываю приложение Spring (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, но это не сработало.


person Tarken    schedule 04.06.2013    source источник
comment
Вы просто хотите вставить текст или изменить код?   -  person SSC    schedule 04.06.2013
comment
Я хочу вставить содержимое html во внешний html   -  person Tarken    schedule 04.06.2013
comment
Хорошо, так почему бы вам не использовать jQuery?   -  person SSC    schedule 04.06.2013
comment
Посмотрите, поможет ли это вам? stackoverflow.com/ вопросы/4967629/   -  person SSC    schedule 04.06.2013
comment
У меня нет контроля над внешней страницей, на которую я хочу вставить свой html. Как бы вы сделали это с помощью jquery? Использование jquery внутри моего html-контента не проблема, но мне придется каким-то образом внедрить его во внешний html, не так ли?   -  person Tarken    schedule 04.06.2013
comment
ссылка противоположна тому, что я хочу сделать ^^ То, что я знаю, как сделать ;-)   -  person Tarken    schedule 04.06.2013
comment
Извините, может быть, я не понял этого раньше. Чего вы пытаетесь добиться этим?   -  person SSC    schedule 04.06.2013
comment
Это распределенная архитектура, в которой многие приложения должны использовать этот внешний html (сгенерированный собственной сложной логикой). Получить его должно быть лучше, чем вставлять его и его логику в каждое приложение.   -  person Tarken    schedule 04.06.2013
comment
Я не знаю решения, но я надеюсь, что есть другие, кто сможет. Спасибо за ваши ответы, хотя @Tarken   -  person SSC    schedule 04.06.2013
comment
Может быть более надежным использование какого-либо синтаксического анализатора DOM или SAX для выполнения замены вместо прямого String.replace(). Но, помимо получения внешней страницы и замены ее части, я не знаю лучшего общего процесса для выполнения того, что вы пытаетесь сделать.   -  person CodeChimp    schedule 04.06.2013


Ответы (2)


Поскольку вы говорите о распределенной архитектуре со многими приложениями, Edge Side включает (ESI, см. http://en.wikipedia.org/wiki/Edge_Side_Includes) может быть тем, что вы ищете. Вы можете использовать, например. обратный прокси-сервер Varnish (см. https://www.varnish-cache.org/trac/wiki/ESIfeatures) для их обработки.

person Jukka    schedule 04.06.2013

Я нашел лучшее решение, используя фильтр для управления ответом. Делая это, я сохраняю один внутренний запрос, и это решение для повторного использования:

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 взят из этого примера: Пример

person Tarken    schedule 26.06.2013