【问题标题】:FacesServlet and URL Mapping in Web.xmlWeb.xml 中的 FacesServlet 和 URL 映射
【发布时间】:2011-06-16 15:27:54
【问题描述】:

嗨,

我们在Web.xml 中声明FacesServlet 及其URL 映射。据我了解,

FacesServlet 仅在服务器启动时加载一次。 仅当 JSP 应用程序第一次从外部上下文访问时才使用 URL 映射。

JSF 的一位新学习者向我提出了这些问题,这两个东西只被应用程序使用过一次。这是真的吗?还有没有其他方法可以不包含在web.xml中?

我应该回答什么?

更新

例如,我正在使用 URL http://localhost:8080/webapp/index.jsf 访问应用程序。当我们访问这个 URL 时,FacesServlet 被调用并呈现视图。以下是我的问题:

  • 在 JSF 中,我们从未见过更改地址栏中的 URL。在这种情况下,它如何处理具有相同 URL 的新请求?
  • 在 faces-config.xml 中,我们给出如下导航案例:

    to-view-id>failure.jsp /to-view-id>

    • 为什么我们不需要将视图名称指定为 failure.jsf?我们只是在faces-config.xml 中提供*.jsp。内部如何处理?

【问题讨论】:

  • In JSF, we never seen changing the URL in the address bar. In that case, how it is handling the new request with the same URL? 你能给我们举个例子来解释这个场景吗

标签: java jsf servlets jakarta-ee


【解决方案1】:

FacesServlet 仅在服务器启动时加载一次。

正确。

仅当第一次从外部上下文访问 JSP 应用程序时才使用 URL 映射。

不正确。它已经在每个传入的HttpServletRequest 上进行了测试。容器应该如何知道调用哪个 servlet?

还有没有其他方法可以不包含在web.xml中?

如果您使用的是支持 Servlet 3.0 的 servletcontainer,您也可以通过 @WebServlet 注释来做到这一点。然而,JSF 2.0 被设计为向后兼容 Servlet 2.5,因此它不附带该注解,您需要在 web.xml 中显式声明它。

另见:


更新根据新的一系列问题(每个问题都应该属于自己的问题,但是ala)

在 JSF 中,我们从未见过更改地址栏中的 URL。在这种情况下,它如何处理具有相同 URL 的新请求?

只有当RequestDispatcher#forward() 的前锋在幕后发生时才会发生这种情况。在转发中,servlet 容器基本上重用 相同 HTTP 请求/响应视图(JSP/XHTML 页面)。它不会强制/指示网络浏览器发送全新的请求。另一方面,HttpServletResponse#sendRedirect() 将指示客户端(网络浏览器)触发 new GET 请求,因此 URL 将更改。您可以通过将<redirect/> 添加到<navigation-case> 来强制执行此操作。请注意,由于这会导致 新 请求,初始请求的所有请求范围的 bean 都将丢失。

为什么我们不需要将视图名称命名为 failure.jsf?我们只是在 faces-config.xml 中提供 *.jsp。内部如何处理?

FacesServlet 知道自己的 url-pattern。

【讨论】:

  • 我认为最后一个问题不清楚。我的问题是 JSF 的 URL 模式是 *.jsf,它在 web.xml 中提到,在这种情况下,必须像使用 .jsf 扩展名一样访问每个视图才能在 FacesContext 中调用,但是如果我们给出正常的 .jsp 扩展名。
  • 我很高兴写新问题,但我觉得它与同一个问题有关
  • *.jsf 只是一个用于调用 FacesServlet 的 url-pattern。无论如何,它都会将其转换为*.jsp 以定位具体的视图文件。
【解决方案2】:

是的。在加载您的应用程序容器时,将加载 web.xml 并为

提取数据

servlet 的特定 URL 模式。当请求到来时,它会从内存中检查该模式要调用哪个 servlet,然后如果 servlet 已经加载,它将从内存中获取它,否则它将创建一个 servlet 实例,它将调用 doGet() 或 doPost(),具体取决于请求类型。

还有另一种方法可以通过注释从 JAVAEE-6 中删除 URL 映射

类似

import javax.servlet.annotation.InitParam;
import javax.servlet.annotation.WebServlet;

@WebServlet(
    name = "SimpleServlet", 
    urlPatterns = {"/login"}, 
    initParams = {
        @InitParam(name = "param1", value = "value1"),
        @InitParam(name = "param2", value = "value2")}
)
public class SimpleServlet {
}

在 faces-config.xml 中,我们给出如下导航案例:

<to-view-id>failure.jsp </to-view-id>

为什么我们不需要将视图名称命名为 failure.jsf?我们只是在 faces-config.xml 中提供 *.jsp。内部如何处理?

它是view identifier 而不是URL FacesServlet 将在调用该导航案例时加载该视图。

【讨论】:

  • 如果可能,请回答我的其他问题。我已经更新了这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-04
  • 2012-04-17
  • 2014-05-01
  • 2011-03-14
  • 2012-03-29
  • 2011-09-20
  • 2013-03-01
相关资源
最近更新 更多