当前位置: 首页 > 知识库问答 >
问题:

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

益和雅
2023-03-14

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

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

到目前为止,我的问题是我使用“/*”作为我的servlet的映射模式。它处理请求,然后使用requestdispatcher.forward(“/web-inf/index.jsp”),这将导致无限循环,因为它也与“/*”模式相匹配。

我的Servlet应该如何处理请求的URL?在web.xml中,I应该使用什么作为映射模式?

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

共有1个答案

都飞跃
2023-03-14

/*首先是servlet URL模式的奇怪选择。这通常只供过滤器使用。servlet在默认情况下也会在forwards和includes上调用,但不会在筛选器上调用。使用/*将完全覆盖容器的内置JSPServlet,该容器应该在转发期间在*.jsp上调用。

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

当使用前缀servlet映射时,如/pages/*,并且您希望从URL中隐藏额外的路径,那么您应该保持前缀servlet映射原样,将所有其他资源放在一个公共路径中(通常它只是静态资源,如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模式上。

  • Tomcat到FrontController Servlet的URL映射
  • 基于web的设计模式应用程序
  • servlet映射url模式中/和/*之间的差异
 类似资料:
  • 我有一个jsp页面和一个servlet,在jsp页面中我有两个表单,每一个都是选择输入类型,即选择class和选择student。当我从select下拉菜单中选择class时,通过onchange事件,它将转到abcServlet,从servlet中检索该类,并将其转发到jsp页面,转到jsp页面中的下一个表单,select student,它再次提交到同一个servlet,从他们的servlet

  • 问题内容: 单个Servlet如何处理以用户请求形式出现的多个客户端请求?基于单例设计模式,我知道我们创建了一个servlet实例,但是单个servlet如何处理数百万个请求。对其所涉及的线程也感到困惑。 同样,这里提供了任何浏览器规范或设置,可用于跨请求发送请求或生成针对请求发送的线程。 所有框架都相同还是不同(例如,struts v / s springs)? 问题答案: Struts / S

  • 问题内容: 有人可以解释什么是每个请求线程和每个连接线程吗?servlet使用哪种模型?如何分配线程来处理HTTP请求?是线程/请求还是连接? 假设我要在自己的方法中异步执行耗时的任务,那么我将使用Java执行程序启动一个新线程,以便在单独的线程中进行冗长的计算并立即发送响应。 现在,这是否可以确保我释放了正在处理我的线程,或者由于子线程仍在运行而仍在使用它? 问题答案: 每个请求意味着在发出HT

  • 正确使用CSS预处理器(如Sass),以及JS预处理器和转换器可以大大提升你的开发效率。本文讲解如何设置设置CSS和JS预处理器。 TL;DR 预处理器允许您使用浏览器原生不支持的CSS和JavaScript中的特性,例如,CSS变量。 如果你使用预处理器,使用Source Maps(源映射)将原始源文件映射到渲染输出文件。 确保您的网络服务器支持Source Maps(源映射)。使用支持的预处理

  • 我们在浏览网页的时候,经常需要向服务器提交信息,并让后台程序处理。浏览器中使用 GET 和 POST 方法向服务器提交数据。 GET 方法 GET方法将请求的编码信息添加在网址后面,网址与编码信息通过"?"号分隔。如下所示: http://www.runoob.com/hello?key1=value1&key2=value2 GET方法是浏览器默认传递参数的方法,一些敏感信息,如密码等建议不使用

  • 基于名字的虚拟主机 Nginx首先选定由哪一个虚拟主机来处理请求。让我们从一个简单的配置(其中全部3个虚拟主机都在端口*:80上监听)开始: server { listen 80; server_name example.org www.example.org; ... } server { listen 80; server_nam