Web.xml中的FacesServlet和URL映射

时间:2011-01-27 15:35:08

标签: java jsf servlets java-ee

HI,

我们在FacesServlet中声明了Web.xml及其网址映射。根据我的理解,

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

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。如何在内部处理?

2 个答案:

答案 0 :(得分:3)

  

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

正确。

  

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

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

  

还有其他方法不包含在web.xml中吗?

如果您正在使用支持Servlet 3.0的servlet容器,您也可以通过@WebServlet注释执行此操作。但是,JSF 2.0旨在向后兼容Servlet 2.5,因此它不附带该注释,您需要在web.xml中明确声明它。

另见:


根据新的一系列问题

更新(每个问题应该属于自己的问题,但是ala)

  

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

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

  

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

FacesServlet知道自己的url-pattern

答案 1 :(得分:2)

是。加载应用程序容器时将加载web.xml并将提取

的数据

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

还有另一种方法可以通过注释

从JAVAEE-6中删除URL映射

类似

doPost()
  

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

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 {
}
  

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

它是<to-view-id>failure.jsp </to-view-id> 而不是view identifier FacesServlet会在调用该导航案例时加载该视图。