【问题标题】:Access HttpServletRequest and HttpServletResponse in a Thymeleaf dialect processor在 Thymeleaf 方言处理器中访问 HttpServletRequest 和 HttpServletResponse
【发布时间】:2016-12-30 10:52:57
【问题描述】:

我正在尝试创建一个执行 ServletDispatcher.include 的 Thymeleaf 方言处理器。我扩展了 AbstractElementTagProcessor 并覆盖了 doProcess 方法。相关代码片段为:

@Override
protected void doProcess(final ITemplateContext context, final IProcessableElementTag tag, final IElementTagStructureHandler structureHandler) {
    ServletContext servletContext = null; // TODO: get servlet context
    HttpServletRequest request = null; // TODO: get request
    HttpServletResponse response = null; // TODO: get response

    // Retrieve dispatcher to component JSP view
    RequestDispatcher dispatcher = servletContext.getRequestDispatcher("/something");

    // Create wrapper (acts as response, but stores output in a CharArrayWriter)
    CharResponseWrapper wrapper = new CharResponseWrapper(response);

    // Run the include
    dispatcher.include(request, wrapper);

    String result = wrapper.toString();

    // Create a model with the returned string
    final IModelFactory modelFactory = context.getModelFactory();
    final IModel model = modelFactory.parse(context.getTemplateData(), result);

    // Instruct the engine to replace this entire element with the specified model
    structureHandler.replaceWith(model, false);

我过去以自定义 JSP 标记的形式编写了类似的代码。问题是:我不知道如何访问 ServletContext、HttpServletRequest 和 HttpServletResponse! 这完全可以做到吗,还是我应该接受 Thymeleaf 太擅长隐藏 HTTP 上下文?

【问题讨论】:

    标签: spring-mvc thymeleaf


    【解决方案1】:

    您可以直接在Thymeleaf 视图:

    ${#request.getAttribute('foo')}
    ${#request.getParameter('foo')}
    ${#request.getContextPath()}
    ${#request.getRequestName()}
    
    <p th:if="${#request.getParameter('yourParameter') != null
          th:text="${#request.getParameter('yourParameter')}"}">Request Param</p>
    
    ${#session.getAttribute('foo')}
    ${#session.id}
    ${#session.lastAccessedTime}
    
    <p th:if="${session != null}"> th:text="${session.yourAttribute}"</p>
    

    阅读更多here

    【讨论】:

    • 谢谢,DimaSan。我知道这一点,但我想从撰写观点的人那里抽象出所有这些。他们应该能够使用我的方言,像这样:
    • 我明白了,那么这篇文章也许对你有用:Extending Thymeleaf。看一下3.4 章。我们的头条新闻的元素处理器
    • 谢谢。阅读那篇文章后,我仍然不知道如何从处理器内部访问当前请求、servlet 上下文和/或响应。我想这根本不可能。我会寻找替代解决方案。
    • 也许你是对的。但是,如果您找到任何解决方案,请在此处发布,因为它将非常有用。
    • 您应该能够从 IExpressionContext 中获取请求对象,您可以从传递给您的处理器的 ITemplateContext 中获取。
    【解决方案2】:

    我发现自己有一个非常相似的要求,即从IExpressionObjectFactory 的实现访问request

    我解决它的方法(遵循@Sebastian Marsching 在先前评论中的建议)是通过访问在模板评估上下文中的视图中可用的IExpressionContext 中注册的对象(Appendix A 中描述的所有对象和 Appendix B 的 thymeleaf 文档),因此您可以访问请求、响应、servletContext 和许多其他实用程序对象。

    用代码说话:

    IExpressionObjects expressionObjects = context.getExpressionObjects();
    HttpServletRequest request = (HttpServletRequest)expressionObjects.getObject("request");
    

    还有一个 expressionObjects.getObjectNames() 方法,您可以调用该方法来获取带有所有已注册对象名称的 Set&lt;String&gt;,在我的例子中,它给出了以下列表:

    [i18nutils, ctx, root, vars, object, locale, request, response, session,
    servletContext, conversions, uris, calendars, dates, bools, numbers, objects,
    strings, arrays, lists, sets, maps, aggregates, messages, ids, execInfo,
    httpServletRequest, httpSession, fields, themes, mvc, requestdatavalues]
    

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 2011-05-17
      • 2016-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多