Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: TarkenОтветов: 2

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

  • Вы просто хотите вставить текст или изменить код? SSC 04.06.2013
  • Я хочу вставить содержимое html во внешний html Tarken 04.06.2013
  • Хорошо, так почему бы вам не использовать jQuery? SSC 04.06.2013
  • Посмотрите, поможет ли это вам? stackoverflow.com/ вопросы/4967629/ SSC 04.06.2013
  • У меня нет контроля над внешней страницей, на которую я хочу вставить свой html. Как бы вы сделали это с помощью jquery? Использование jquery внутри моего html-контента не проблема, но мне придется каким-то образом внедрить его во внешний html, не так ли? Tarken 04.06.2013
  • ссылка противоположна тому, что я хочу сделать ^^ То, что я знаю, как сделать ;-) Tarken 04.06.2013

javaspringspring-mvctemplate-engine

Ответы

Ответ 1 · Jukka

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

Ответ 2 · Tarken

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы