java - 如何基本和简单地设置一个 Servlet 来处理和预处理 JSP 请求

标签 java jsp servlets

我想让一个 Servlet 首先处理对 JSP 页面的所有请求。 Servlet 将用于根据请求的 JSP 设置服务器端变量。

例如,我想要实现的是给定的url:example.com/index.jsp,Servlet首先通过解析出请求的JSP(index.jsp)来处理请求,设置特定于请求 index.jsp(使用 request.setAttribute),然后分派(dispatch)到实际的 index.jsp(例如/WEB-INF/index.jsp)。然后,JSP 将拥有所需的正确变量。

到目前为止,我的问题是我使用“/*”作为我的 Servlet 的映射模式。它处理请求,然后使用 requestDispatcher.forward("/WEB-INF/index.jsp") 结束无限循环,因为它也匹配“/*”模式。

我的 Servlet(s) 应该如何处理请求的 url?我应该在 web.xml 中使用什么作为映射模式?

有这方面的标准设置吗?我只是在寻找一种“最佳实践”方式来为我的所有 JSP 设置预处理。

最佳答案

/* 首先是一个奇怪的选择 servlet网址模式。这通常专门由 filters 使用.默认情况下,Servlet 也会在转发和包含时调用,但不会调用过滤器。使用 /* 将完全覆盖容器的内置 JspServlet,它应该在转发期间在 *.jsp 上调用。

而是使用更具体的 URL 模式,如 /pages/*/app/**.do* .html 等等。

当使用前缀 servlet 映射时,例如 /pages/* 并且您想隐藏 URL 中的额外路径,那么您应该保持前缀 servlet 映射不变,将所有 other 公共(public)路径中的资源(通常它只是像 CSS/JS/images 这样的静态资源)并创建一个额外的过滤器来检查它是否是资源请求,如果是,则继续链,否则,然后转发到 servlet。这不会更改 URL。 servlet 可以反过来安全地转发到 JSP。

这是一个示例,假设您的 servlet 映射到 /pages/* 并且所有不应由 servlet 处理的(静态)资源都放在 /resources 文件夹(您可以将 JSP 保存在 /WEB-INF 中,该部分不需要更改;无论如何转发都不会命中过滤器)。

HttpServletRequest req = (HttpServletRequest) request;
String path = req.getRequestURI().substring(req.getContextPath().length());

if (path.startsWith("/resources/")) {
    chain.doFilter(request, response);
} else {
    request.getRequestDispatcher("/pages" + path).forward(request, response);
}

最后只需将上述过滤器映射到 /* 的 URL 模式。

另见:

关于java - 如何基本和简单地设置一个 Servlet 来处理和预处理 JSP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11901789/

相关文章:

java - java 到 python 的最新通信

java - Hibernate 标准选择值是列值的前 5 个字符的所有行

java - 如何将计时器融入到心跳动画中?

java - 我从 UI 中的日历获取日期,格式为 dd/mm/yyyy。但我想要 18 年 7 月 12 日的格式

java - 使用OGNL获取参数

java - 如何使用注释使更具体的 urlPattern 覆盖更广泛的模式

java - invokeAndWait Java

javascript - jsp 和 javascript 中请求属性的对象索引数组

java - 如何配置项目(取决于 maven/web.xml/servlet API)AJAX 调用不包含项目名称?

java - 如何根据用户登录隐藏某些功能?