我想知道每当用户请求jsp页面时,我们编写hello.jsp或任何html文件,我们编写hello.html或任何图像hello.jpeg。 我的问题是servlet没有任何扩展名吗?是否通过名称直接调用?
答案 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-pattern
中JspServlet
的默认web.xml
,默认情况下会监听*.jsp
。然而,建议坚持一个明智和标准化的url-pattern
。
知道任何其他“未完成”的URL模式都被“默认”servlet覆盖可能会很有趣。检查servletcontainer的web.xml
,你会看到一个监听/
的servlet,因此实际上是所有。它还管理directoy列表的显示。例如,在Tomcat中,它被称为DefaultServlet
,并描述了here。