HI,
我们在FacesServlet
中声明了Web.xml
及其网址映射。根据我的理解,
FacesServlet
仅在服务器启动时加载一次。
URL映射仅在从外部上下文访问第一次JSP应用程序时使用。
JSF的新学习者之一向我提出了问题,这两件事只被应用程序使用过一次。这是真的吗?还有没有其他方法,不包括在web.xml中?
我应该回答什么?
更新
例如,我正在使用URL http://localhost:8080/webapp/index.jsf
访问该应用程序。当我们访问此URL时,会调用FacesServlet
并呈现视图。以下是我的问题:
在faces-config.xml中,我们给出了如下导航案例:
to-view-id> failure.jsp / to-view-id>
faces-config.xml
中给出* .jsp。如何在内部处理?答案 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会在调用该导航案例时加载该视图。