Struts2 Interceptor * после * рендеринга JSP - как? - PullRequest
3 голосов
/ 23 августа 2009

Мне было интересно, смогу ли я получить результат действия после того, как результат вернется и JSP будет обработан. Я хочу иметь возможность взять весь результат (сгенерированный HTML) и поместить его в memcached, чтобы я мог принести его через Nginx без попадания на сервер приложений. Есть идеи?

PS: я знаю, что могу запустить перехватчик после выполнения действия, но до возвращения результата и визуализации JSP, но не после визуализации JSP.

Ответы [ 5 ]

1 голос
/ 16 сентября 2009

Я не нашел способа сделать это внутри Struts2, лучше всего было бы создать Фильтр сервлета и изменить его OutputStream.

http://onjava.com/pub/a/onjava/2003/11/19/filters.html

0 голосов
/ 21 января 2011

Эй, я знаю, что уже довольно поздно, чтобы ответить, что вы, возможно, уже узнали ответ, однако для других, чтобы помочь, я публикую ответ. Одна вещь, которая очень похожа на то, что вы делаете, выполняется фильтром sitemesh. Да, фильтр идет до и после самого фильтра Struts2, поэтому вы можете легко связываться со входами и выходами. Но Struts оценивает JSP / freemarker / speed и генерирует окончательный HTML, который передается пользователю. JSP немного сложнее, потому что внутренне сервлет вызывается, но проверив org.apache.struts2.views.freemarker.FreemarkerResult class, вы можете увидеть фактический HTML, сгенерированный в template.process(model, writer);. Этот писатель на самом деле ServletActionContext.getResponse().getWriter();

Теперь, чтобы получить HTML все, что вам нужно сделать, это ServletActionContext.getResponse().getWriter().toString() //This does not work out of box. Чтобы заставить toString () работать, вам нужно использовать ResponseWrapper - это тот же метод, чтобы получить результат html в фильтрах. См. Программирование пользовательских запросов и ответов .

Список для изменения результирующего html в Struts 2. Это не проверено, но оно извлечено из моего кода, который я написал ранее для пользовательского шаблонизатора Я, наверное, выложу полное описание в Кастомный движок шаблонов для struts2

public class DecoratorInterceptor implements Interceptor {
    public String intercept(ActionInvocation invocation) throws Exception {
       final ActionContext context = invocation.getInvocationContext ();
       HttpServletResponse responseParent = (HttpServletResponse) 
                               context.get(ServletActionContext.HTTP_RESPONSE);
       CharResponseWrapper wrapper = new CharResponseWrapper(responseParent);

       ServletActionContext.setResponse(wrapper);

       //Actual Action called
       String result =  invocation.invoke();

       String htmlReturned = wrapper.toString();
       //play with htmlReturned ...
       String modifiedhtml = pushintoMemCache(htmlReturned );           

       CharArrayWriter car = new CharArrayWriter();           
       car.write(modifiedhtml );

       PrintWriter out = responseParent.getWriter();
        out.write(car.toString());
        out.flush();
   }

  @Override
    public void destroy() {
    // TODO Auto-generated method stub

    }

  @Override
    public void init() {
    // TODO Auto-generated method stub

    }

}         
0 голосов
/ 11 октября 2010

В методе intercept() вашего перехватчика параметр ActionInvocation имеет метод getResult(), который возвращает null до выполнения действия (т. Е. Перед вызовом invocation.invoke() в вашем методе intercept()) и содержит реализацию Result потом. Этот объект должен дать вам какой-то способ доступа к нужным вам данным, но, как это сделать, вероятно, зависит от класса, который фактически используется.

См. Также мой несколько связанный вопрос и ответ, который я отправил после выяснения этого.

0 голосов
/ 22 апреля 2010

Вопрос: Как вы определяете, был ли создан вид? Вы устанавливаете заголовок запроса или какой-то флаг, чтобы определить, было ли создано представление?

Вы можете попробовать сгенерировать исключение MemCachedException, чтобы указать, что пора загружать в кеш mem. Ваш код перехватчика может читать

try {
   return invocation.invoke();
} catch (MemCachedException mce) {
   // Your code to upload to MemCache.
} finally {
  // blah blah clean up.
}
0 голосов
/ 23 августа 2009

Прочитать эту статью - http://struts.apache.org/2.0.6/docs/interceptors.html

РЕЗЮМЕ: Когда вы запрашиваете ресурс который отображается на «действие», Framework вызывает объект Action. Но, прежде чем действие будет выполнено, вызов может быть перехвачен другой объект. После действия выполняется, вызов может быть перехватил снова. Неудивительно, что мы Назовите эти объекты "Перехватчики".

...