1.什么是Servlet?
Servlet是运行在web服务器上的一个java类。通过HTTP协议接收客户端的请求,同时向客户端一个响应。
2.Servlet的执行流程
2.1首先我们要配置一个Servlet
我在这里用的服务器的Tomcat服务器,配置文件是写在/WEB-INF/wen.xml中的。
<servlet>
<description></description>
<servlet-name>ServletDemo1</servlet-name><!--servlet的名字-->
<servlet-class>com.servlet.ServletDemo1</servlet-class><!--servlet文件的全包路径-->
</servlet>
<servlet-mapping><!--配置servlet的映射路径-->
<servlet-name>ServletDemo1</servlet-name><!--浏览器只需要根据name就可以找到对应的servlet文件位置-->
<url-pattern>/ServletDemo1</url-pattern><!--浏览器的访问路径,路径必须以/开头-->
</servlet-mapping>
首先在浏览器中输入“http://Ip地址:端口号/项目名称/servlet路径名”,浏览器这个时候相当于提交一个请求,服务器就会根据servlet路径寻找到对应的servlet的名字,在根据名字访问到servlet的class文件。如图:
这个时候就会执行service()方法。
3.Servlet的实现关系。
我们知道Servlet是一个接口,它有两个实现类分别是HttpServlet和GenericServlet,其中GenericServlet与协议无关,而HttpServlet是专门处理HTTP请求的一个类,所以通常我们在编写一个Servlet时都是继承HttpServlet而不是实现Servlet,然后重写services方法。
然而通过对service方法体的查看我们会发现service方法就是根据请求的方式(request.getMethod())调用不同的doXXX()(例如是post方式就调用doPost()方法,是get就调用doget()方法)方法,所以我们就不用重写service()方法了,而只需要重写doPost()和doGet()方法,同时,由于doPost()和doGet()方法都是执行同样的操作,所有只需要在doGet()方法中调用doPost()方法就可以简化编程。
public class ServletDemo1 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ServletDemo1执行....");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4.Servlet的生命周期
Servlet的生命周期涉及到三个方法,分别是:
void init(ServletConfig config) //第一次访问servlet时,servlet在销毁之前会一直常驻在内存中,这个时候就会调用init()方法对servlet进行初始化,只会执行一次。
void service(ServletRequest req,ServletResponse res)//开启一个线程,只要服务器提交一次请求,就会执行一次service方法。
void destroy();//当tomcat正常关闭时执行,会调用destroy方法销毁servlet。
当Servlet启动时间比较长的时候,那么第一个访问的用户就会需要等待init方法执行完成,这个时候我们就需要在服务器启动的时候就完成Servlet的初始化。我们可以通过对web.xml文件配置达到这一目的。
<servlet>
<servlet-name>ServletDemo2</servlet-name>
<servlet-class>com.servlet.demo1.ServletDemo2</servlet-class>
<load-on-startup>2</load-on-startup>//2表示服务器启动时servlet加载的优先级,数字越小优先级越高,因为Tomcat中默认启动的Servlet优先级是1,所以我们设置2
</servlet>
<servlet-mapping>
<servlet-name>ServletDemo2</servlet-name>
<url-pattern>/ServletDemo2</url-pattern>
</servlet-mapping>
5.Servlet的访问路径(<url-pattern>的配置)
全路径:以/开头;例如:/ServletLife、/abc/ServletLife
目录匹配:以/开头,*结尾;例如:/*、/aaa/*(*代表任意字符)
扩展名匹配:以*开头,.XXX结尾;例如*.do、*.abc
精确度:全路径>目录>扩展名