Spring mvc 在Thymeleaf方言处理器中访问HttpServletRequest和HttpServletResponse

Spring mvc 在Thymeleaf方言处理器中访问HttpServletRequest和HttpServletResponse,spring-mvc,thymeleaf,Spring Mvc,Thymeleaf,我正在尝试创建一个Thymeleaf方言处理器,它执行ServletDispatcher.include。我扩展了AbstractElementTagProcessor并重写了doProcess方法。相关代码片段为: @Override protected void doProcess(final ITemplateContext context, final IProcessableElementTag tag, final IElementTagStructureHandler struct

我正在尝试创建一个Thymeleaf方言处理器,它执行ServletDispatcher.include。我扩展了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上下文吗?

您可以访问请求(通过使用
#request
对象,该对象允许您直接访问
javax.servlet.HTTP.HttpServletRequest
对象)参数和会话(使用允许您直接访问javax.servlet.http.HttpSession对象的
#session
对象)直接在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>
${#request.getAttribute('foo')}
${#request.getParameter('foo')}
${#request.getContextPath()}
${#request.getRequestName()}

请求参数

${#session.getAttribute('foo')} ${#session.id} ${session.lastAccessedTime}

th:text=“${session.yourAttribute}”


阅读更多。

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

我解决这个问题的方法(在前面的一篇评论中遵循@Sebastian Marsching advice)是通过访问在
IExpressionContext
中注册的对象,这些对象可以在模板评估的上下文中从视图中获得(thymeleaf文档和中描述的所有对象),因此您可以访问请求、响应、servletContext和许多其他实用程序对象

用代码说话:

IExpressionObjects expressionObjects = context.getExpressionObjects();
HttpServletRequest request = (HttpServletRequest)expressionObjects.getObject("request");
还有一个
expressionObjects.getObjectNames()
方法,您可以调用该方法来获取包含所有注册对象名称的
Set
,在我的示例中,该方法给出了以下列表:

[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]

谢谢,迪马桑。我知道这一点,但我想把所有这些从写观点的人那里抽象出来。他们应该能够使用我的方言,就像这样:我明白了,那么这篇文章可能对你有用:。看看第3.4章。我们标题的元素处理器。谢谢。读了那篇文章后,我仍然没有看到如何从处理器内访问当前请求、servlet上下文和/或响应。我想这是不可能的。我将寻找替代解决方案。也许你是对的。但是如果你找到任何解决方案,请将其发布在这里,因为它将非常有用。你应该能够从IExpressionContext中获取请求对象您可以从传递给处理器的ITemplateContext中获取。