当前位置: 首页 > 面试题库 >

将SiteMesh与RequestDispatcher的forward()结合使用

蒯胜泫
2023-03-14
问题内容

我正在尝试使用Tomcat
5作为容器将SiteMesh集成到旧版应用程序中。我main.jsp正在用一个简单的装饰器进行装饰。

在中decorators.xml,我只定义了一个装饰器:

<decorators defaultdir="/decorators">
  <decorator name="layout-main" page="layout-main.jsp">
    <pattern>/jsp/main.jsp</pattern>
  </decorator>
</decorators>

如果我手动转到,此装饰器将起作用http://example.com/my- webapp/jsp/main.jsp。但是,在某些地方,servlet而不是重定向到jsp,而是进行转发:

getServletContext().getRequestDispatcher("/jsp/main.jsp").forward(request, response);

这意味着该URL保留在类似http://example.com/my- webapp/servlet/MyServlet而不是jsp文件的位置,因此未修饰,因为它与中的模式不匹配,所以我想decorators.xml

我不能这样做,<pattern>/*</pattern>因为还有其他不需要用修饰的jsps layout- main.jsp。我不能这样做,<pattern>/servlet/MyServlet*</pattern>因为MyServlet可能main.jsp有时甚至error.jsp在其他时间转发。

有没有一种方法可以解决此问题,而无需对Servlet的工作方式进行广泛的更改?由于它是旧版应用程序,因此我没有太大的自由来进行更改,因此我希望在配置方面有所帮助,以解决此问题。

SiteMesh的文档确实不是很好。我主要是在与发行版一起提供的示例应用程序上工作。我真的很喜欢SiteMesh,希望在这种情况下可以使用它。


问题答案:

我的理解是SiteMesh作为Servlet过滤器集成到了应用程序中。默认情况下,仅针对原始传入请求(在您的情况下为对Servlet的请求)调用Servlet筛选器。随后的转发或包含请求不会通过过滤器传递,因此不会通过sitemesh传递。

但是,您可以使用以下命令指示要向前调用过滤器:

<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <servlet-name>MyServlet</servlet-name>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

它指示容器仅对FORWARD请求进行操作。其他选项包括INCLUDE和REQUEST,您可以具有多个元素。

因此,您的选择是更改过滤器配置以指定FORWARD,或者更改过滤器映射以匹配servlet路径而不是JSP路径。任一个应该起作用。



 类似资料:
  • 问题内容: 我在SO上发现了其他几个有关JavaMail API和通过SMTP服务器发送邮件的问题,但是没有一个使用TLS安全性进行讨论。我正在尝试使用JavaMail通过我的工作SMTP邮件服务器向我发送状态更新,但是它需要TLS,而且我在网上找不到任何有关如何使用JavaMail访问需要TLS加密的SMTP服务器的示例。有人能帮忙吗? 问题答案: 实际上,我们的产品中确实有一些通知代码,如果有

  • 我已经阅读了一些关于SaaS/PaaS/IaaS的信息,我在想: 如果我提供了一个SaaS应用程序,我的客户能否使用PaaS开发和部署他自己的应用程序,PaaS将使用一些API与我的SaaS应用程序交互?还是我对云服务的理解有误?

  • 问题内容: 谁能给我指出一个完整的示例,而 不是 在App Engine上使用OAuth2和Flask对Google帐户进行身份验证? 我试图让用户授予对Google日历的访问权限,然后使用该访问权限从日历中检索信息并对其进行进一步处理。我还需要存储并稍后刷新OAuth2令牌。 我看过Google的oauth2client库,可以开始检索授权代码了,但是我从那里有点迷失了。通过查看Google的O

  • 问题内容: TextMate似乎使用了我假定的内置Python版本(sys.path不起作用)。您如何配置它以使用3.1?我已经安装了3.1软件包,并且可以将IDLE用于交互式会话,但是现在需要使用TextMate。 谢谢 问题答案: TextMate使用变量的值来查找Python解释器的路径。一个好的解决方案是利用TextMate的能力来定义变量(例如基于每个项目): 打开一个新的或现有的Tex

  • 问题内容: 我想使用并且在本节中非常基础,我需要一些帮助,并且在网上之前对此主题进行了研究,但是没有令人满意的解决方案。 1-如何FFmpeg通过使用。(我不想使用Ubuntu,请不要建议。) 2-如何通过插入命令? 最后通知:我使用和。 任何建议,将不胜感激。 问题答案: 如果您需要进一步的帮助,请确切说明您要实现的目标以及不起作用的目标… 更新-根据评论: 要在Android上通过命令行使用f

  • 我严格遵循了一个教程,但我似乎无法让它发挥作用。本教程位于IDE的非模块化JavaFX和Intellij部分:https://openjfx.io/openjfx-docs/#install-爪哇 以下是我在尝试运行默认Intellij Idea JavaFX项目时收到的错误消息: 通向jdk-11.0.1和javafx-sdk-11.0.1的路径: C:\Program Files\Java J

  • 我有一个非常简单的场景:测试任何一对长度为10的随机字符串作为参数传递给一个case类对(一个正在测试的自定义字符串)应该是相同的。 但是,当我从sbt运行我只得到这个编译错误: 斯卡拉切克烹饪书中的一个注解说 该错误消息表明,我们的属性检查没有按照布尔逻辑进行评估 我希望内部块最终应该返回布尔值。如果您能指出我在这个实现中理解基于属性的测试或使用Inside trait时缺少什么,我将不胜感激。

  • Overview Ruby on Rails 一直有这种Web-page layout and decoration framework,用户只要定义页面核心的内容,框架会自动加上页头页脚,左边栏,右边栏之类的内容,在上述内容修改时无需批量修改页面。 它的实现原理,无非是用一个Filter读取页面准备输出的内容,然后分析页面内容,将title,header, body插入到模板里再重新输出。听到这