servlet没有任何扩展吗?

时间:2010-02-01 02:14:00

标签: java servlets

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

2 个答案:

答案 0 :(得分: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>

上面的示例会将网址/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文件中进行。

答案 1 :(得分:1)

不,你完全掌握在自己手中。它不一定用它的名字来调用,而是由url-pattern调用。您可以将其命名为您想要的任何名称,例如每当您致电/pages/*http://example.com/pages/foo.jsp时,http://example.com/pages/foo都会运行servlet(而request.getPathInfo()又会将{/ 1}}提供给路径信息,以便您可以确定要采取的操作和/或将请求转发到的地方)。或*.page在您调用http://example.com/foo.page时运行servlet(request.getRequestURI()又提供URI)。

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

事实上,您可以根据需要创建尽可能多的servlet,例如RegisterServlet倾听/register支持register.jsp作为视图,LoginServlet监听/login并以login.jsp作为视图支持,等等。您可以通过将JSP放在/WEB-INF中来隐藏JSP直接访问,以便用户可以通过servlet调用它们。

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

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