前言:
在学习servlet的时候,看了很多的资料,包括网上写的特别牛逼的文章,本人是真的看不懂,但是初学者,可以看下这篇博客(大神可以自己走开了)
1.什么是servlet
它的全称是server applet,说白了就是运行在服务器端的小程序,Servlet就是一个接口,定义了Java类被浏览器访问到(服务器tomcat识别)的规则。当然不止是tomcat,还有jetty.这里可以将tomcat当成一个容器,帮你new 对象,帮你执行方法。
2.小demo(主要是为了解释原理)
web.xml的配置
<!--配置Servlet -->
<servlet>
<servlet-name>demo1</servlet-name>
<servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>demo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
实现Servlet,Servlet接口中就是有下面的五个方法,我们是要实现的!这就是规则。
public class ServletDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("hello servlet ");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
3.执行原理
如下图:当浏览器给服务器发送请求的时候,是以URL的形式发送的,如下图中的http://localhost:8080/day13_tomcat/demo1
,此时服务器接收到这个url的时候,会对此url进行解析,获取访问的Servlet的资源路径。从这个url中我们能看出来,首先localhost:8080是本地的tomcat,day13_tomcat是配置的虚拟目录,对应项目,demo1是对应的资源,这个映射到web.xml,然后解析这个xml,对应的是 url-pattern标签,发现/demo1正好相符,于是通过servlet-name中的值demo1找到了servlet-class中的cn.itcast.web.servlet.servletDemo1,这是一个全类名,它反射到services方法!tomcat相当于是一个容器,帮你new对象,帮你调用方法。此时只要tomcat启动,我们的service就执行了。
4.Servlet中的生命周期方法:(对应上面的代码部分)
init方法:
被创建的时候,执行init方法,而且,只执行一次!说明一个Servlet在内存中只存在一个对象,Servlet是单例的,那么就可能存在线程的安全的问题,所以解决办法就是尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值.
可以配置执行Servlet的创建时机。
在标签下配置
- 第一次被访问时,创建
的值为负数 - 在服务器启动时,创建
的值为0或正整数
service方法:
每次访问Servlet时,Service方法都会被调用一次。用来提供服务,
destory方法:
被销毁:执行destroy方法,只执行一次。这个如果是强制关闭是不会执行的,只有正常的关闭才会执行,它是在关闭之前执行的,就好比临终遗言!一般用于释放资源
5.注解的方式配置
此时web.xml就不需要了,只需要在类上加上@WebServlet注解就好了!
@WebServlet("/demo1")
public class ServletDemo1 implements Servlet {
6.servlet的体系结构
我们最常用的是HttpServlet
@WebServlet
public class ServletDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doget");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("dopost");
}
}