本节书摘来自异步社区《Servlet、JSP和Spring MVC初学指南》一书中的第1章,第1.11节,作者:【加】Budi Kurniawan(克尼亚万) , 【美】Paul Deck著,更多章节内容可以访问云栖社区“异步社区”公众号查看
如在前面的例子中所见,编写和部署Servlet都是很容易的事情。部署的一个方面是用一个路径配置Servlet的映射。在这些范例中,是利用WebServlet标注类型,用一个路径映射了一个Servlet。
利用部署描述符是配置Servlet应用程序的另一种方法,部署描述符的详情将在第13章“部署描述符”中探讨。部署描述符总是命名为web.xml,并且放在WEB-INF目录下。本章介绍了如何创建一个名为app01c的Servlet应用程序,并为它编写了一个web.xml。
app01c有SimpleServlet和WelcomeServlet两个Servlet,还有一个要映射Servlets的部署描述符。清单1.5和清单1.6分别展示了SimpleServlet和WelcomeServlet。注意,Servlet类没有用@WebServlet标注。部署描述符如清单1.7所示。
清单1.5 未标注的SimpleServlet类
package app01c; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class SimpleServlet extends HttpServlet { private static final long serialVersionUID = 8946L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); writer.print("<html><head></head>" + "<body>Simple Servlet</body></html"); } }清单1.6 未标注的WelcomeServlet类
package app01c; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class WelcomeServlet extends HttpServlet { private static final long serialVersionUID = 27126L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter writer = response.getWriter(); writer.print("<html><head></head>" + "<body>Welcome</body></html>"); } }清单1.7 部署描述符
<?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>SimpleServlet</servlet-name> <servlet-class>app01c.SimpleServlet</servlet-class> <load-on-startup>10</load-on-startup> </servlet> <servlet-mapping> <servlet-name>SimpleServlet</servlet-name> <url-pattern>/simple</url-pattern> </servlet-mapping> <servlet> <servlet-name>WelcomeServlet</servlet-name> <servlet-class>app01c.WelcomeServlet</servlet-class> <load-on-startup>20</load-on-startup> </servlet> <servlet-mapping> <servlet-name>WelcomeServlet</servlet-name> <url-pattern>/welcome</url-pattern> </servlet-mapping> </web-app>使用部署描述符有诸多好处。其一,可以将在@WebServlet中没有对等元素的元素,如load-on-startup元素。这个元素使得Servlet在应用程序启动时加载,而不是在第一次调用时加载。如果Servlet的init方法需要花一些时间才能完成的话,使用load-on-startup意味着第一次调用Servlet所花的时间并不比后续的调用长,这项功能就特别有用。
使用部署描述符的另一个好处是,如果需要修改配置值,如Servlet路径,则不需要重新编译Servlet类。
此外,可以将初始参数传给一个Servlet,并且不需要重新编译Servlet类,就可以对它们进行编辑。
部署描述符还允许覆盖在Servlet标注中定义的值。Servlet上的WebServlet标注如果同时也在部署描述符中进行声明,那么它将不起作用。然而,在有部署描述符的应用程序中,却不在部署描述符中标注Servlet时,则仍然有效。这意味着,可以标注Servlet,并在同一个应用程序的部署描述符中声明这些Servlet。
图1.8展示了有部署描述符的目录结构。这个目录结构与app01a的目录结构没有太大区别。唯一的区别在于,app01c在WEB-INF目录中有一个web.xml文件(部署描述符)。
图1.8 有部署描述符的b3的目录结构
现在,在部署描述符中声明SimpleServlet和WelcomeServlet,可以利用这些URL来访问它们:
http://localhost:8080/app01c/simplehttp://localhost:8080/app01c/welcome关于部署以及部署描述符的更多信息,请参考第13章。
相关资源:敏捷开发V1.0.pptx