2010-02-01 57 views
1

我喜欢知道每当用户请求一个jsp页面时,我们会编写hello.jsp或任何html文件,我们编写hello.html或任何图像hello.jpeg。 我的问题是servlet没有任何扩展名?它是否被直接调用名称?Servlet没有任何扩展吗?

+1

您已经在2天内询问了7个与Java相关的问题,并且都没有被接受。如何清理积压? – skaffman 2010-02-01 02:45:07

回答

3

对于Servlet,您必须明确告诉Servlet容器哪些URL(特定的URL或通配符)映射到哪个servlet。例如:

<servlet> 
    <servlet-name>HelloWorld</servlet-name> 
    <servlet-class>com.example.HelloWorld</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>HelloWorld</servlet-name> 
    <url-pattern>/hello</url-pattern> 
</servlet-mapping> 

上面的例子将在URL /hello映射到servlet com.example.HelloWorld

你也可以做一些通配符映射。例如:

<servlet-mapping> 
    <servlet-name>HelloWorld</servlet-name> 
    <url-pattern>*.html</url-pattern> 
</servlet-mapping> 

这将映射 “.html” 到HelloWorld servlet的结束请求。但是你不限于任何特定的扩展。你可以使用任何你想要的:

<servlet-mapping> 
    <servlet-name>HelloWorld</servlet-name> 
    <url-pattern>*.foo</url-pattern> 
</servlet-mapping> 

所有这些配置都发生在你的web应用的web.xml文件。

+0

+1。也许还要提到,除了扩展名之外,您还可以注册路径前缀。 – Thilo 2010-02-01 02:40:07

1

不,你完全掌握在你自己的手中。它的名字不一定叫它叫做url-pattern。您可以将其命名为任何您想要的内容,例如/pages/*将在您拨打http://example.com/pages/foo.jsphttp://example.com/pages/foo(它将路径信息返回request.getPathInfo(),以便确定要执行的操作和/或将该请求转发到哪里)返回时运行servlet。或者*.page,只要您拨打http://example.com/foo.page(它反过来使URI返回request.getRequestURI())就会运行servlet。

要预处理请求(当请求页面查看时),通常使用doGet()方法。要后处理请求(POST表单提交后),通常使用doPost()方法。

实际上,您可以根据需要创建尽可能多的servlet,例如, RegisterServlet/register上收听,其中支持register.jsp作为观点,LoginServlet收听/login并且支持login.jsp作为观点,等等。您可以通过将它们放置在/WEB-INF中来隐藏JSP,以免用户通过该servlet调用它们。

在MVC世界里,通常会有意味着只有一个的servlet监听某个url-pattern,这就是所谓的前端控制器的。例如,在Sun JSF中,有一个FacesServlet,只要调用默认*.jsf/faces/*匹配的URL即可运行。例如,在Apache Struts中,有ActionServlet默认侦听*.do。它们根据URL,请求参数和/或映射来确定要采取的操作和/或要显示哪个视图(JSP文件)。但是,您可以自由更改这些默认值url-pattern。您甚至可以在服务商的web.xml中更改JspServlet的默认url-pattern,该默认值在*.jsp上侦听。然而,建议坚持一个明智的和标准化的url-pattern

知道任何其他“未确定”的URL模式被“默认”servlet覆盖可能很有趣。检查servlet容器的web.xml,你会看到一个servlet在/上监听,因此实际上服务于的一切。它还管理directoy列表的显示。例如在Tomcat中,它被称为DefaultServlet并描述了here