servlet概念
狭义的Servlet 是指Java 语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的(servlet通俗理解就是所有实现了servlet接口的实现类,程序员自己写了类继承了HTTPServlet,而HttpServlet继承了这个servlet接口,实现了这个接口,所有支持servlet标准的容器(服务器),就可以认识和处理我们写了servlet类了),一般情况下,人们将Servlet理解为后者。
Servlet运行于支持Java的应用服务器中。从原理上讲,Servlet可以响应任何类型的请求,但绝大多数情况下Servlet 只用来扩展基于HTTP协议的Web服务器
特点
- Servlet的运行必须要支持Servlet标准的Web容器,像Tomcat、Jboss、Weblogic、WebSphere、Jetty等都支持。
- Servlet的实现遵循了服务器能够识别的规则,也就是服务器会自动的根据请求调用对应的servlet进行请求处理。
- 简单方便,可移植性强
运行流程
- 浏览器发送请求到服务器,服务器根据请求URL地址中的URI信息在webapps目录下找到对应的项目文件夹,然后在web.xml中检索对应的servlet类(找到继承了servlet接口的类),通过反射实例化这个类。调用service方法,通过service方法来调用doget、dopost方法(注意,这个其他的方法,都是通过service方法来调用的,因为tomcat默认只会调用service方法)
Servlet生命周期
1、生命周期(默认)
当第一次servlet(类)被实例化加载到内存之后(默认第一次请求到来,才加载到内存),一直到服务器关闭
2、生命周期(配置)
在web.xml中设置了load-on-startup
<servlet> <servlet-name>ServletDemo</servlet-name> <servlet-class>com.zy.servlet.ServletDemo</servlet-class> <load-on-startup>1</load-on-startup> //设置随服务器启动,就将servlet加载到内存,数字越小,越优先加载到内存中 </servlet> <servlet-mapping> <servlet-name>ServletDemo</servlet-name> <url-pattern>/my</url-pattern> </servlet-mapping>
- 1.加载:容器通过类加载器使用Servlet类对应的文件来加载Servlet
- 2.创建:通过调用Servlet的构造函数来创建一个Servlet实例
- 3.初始化:通过调用Servlet的init()方法来完成初始化工作,这个方法是在Servlet已经被创建,但在向客户端提供服务之前调用。(只初始化一次)
- 4.处理客户请求:Servlet创建后就可以处理请求,当有新的客户端请求时,Web容器都会创建一个新的线程(在并发编程下servlet是线程不安全的)来处理该请求。接着调用Servlet的Service()方法来响应客户端请求(Servic方法中根据请求的method属性来调用doGet()和doPost())
- 5.卸载:容器在卸载Servlet之前需要调用destroy()方法,让Servlet释放其占用的资源。
Servlet使用
请求的数据如果出现乱码
请求中文乱码解决: 使用公共配置 get方式: 步骤一:req.setcharacterEncoding("utf-8"); 步骤二: 在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" useBodyEncodingForURI="true"/> //多加了一个useBodyEncodingForURI="true"; 或者参考:https://www.jb51.net/article/145741.htm post方式: req.setCharacterEncoding("utf-8");