-
添加Tomcat依赖
-
web.xml绑定servlet
-
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <servlet> <servlet-name>AddServlet</servlet-name> <servlet-class>com.servlets.AddServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>AddServlet</servlet-name> <url-pattern>/add</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>add.html</ welcome-file> </welcome-file-list> <!-- 1.用户发送请求,action=add 2.项目中,web.xml中找到url-pattern=/add 3. 绑定<servlet-name>类AddServlet 4.找和servlet-mapping中的servlet-name>一致的servlet 5.找servlet-class 6.用户发送的是post请求(method=post)因此tomcat会执行AddServlet中的dopost方法 7.<welcome-file-list> 默认页 8.<load-on-startup> 设置启动顺序,数字越小,越靠前 -->
-
dopost类
import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class AddServlet extends HttpServlet { //处理post请求 @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //需要放在第一行 req.setCharacterEncoding("UTF-8"); String fname=req.getParameter("name"); Integer price=Integer.parseInt(req.getParameter("price")); Integer count=Integer.parseInt(req.getParameter("count")); String remark=req.getParameter("remark"); System.out.println("姓名:"+fname+"价格:"+price+"数量:"+count+"备注:"+remark); }
-
设置编码
-
post方式下,设置编码,防止中文乱码
-
//需要放在第一行 req.setCharacterEncoding("TF-8");
-
-
get方式目前不需要设置编码(基于tomcat8)
-
tomcat8之前
-
String f_name=req.getParameter("fname"); //打散成字节数组 byte [] bytes=f_name.getBytes("ISO-8859-1"); //按照设定编码重新组装 f_name=new String(bytes,"UTF-8");
-
-
-
Servlet的继承关系
-
继承关系
javax.servlet.Servlet接口
javax.servlet.GenericServlet 抽象类
javax.servlet.http.HttpServlet 抽象子类 -
相关方法
-
javax.servlet.Servlet 接口
void init(config) -初始化方法
void service(request,response) -服务方法
void destroy() 销毁方法 -
javax.servlet.GenericServlet 抽象类
void service(request,response) 仍然是抽象的-
String method=req.getMethod(); 获取请求的方式
-
根据请求方式的不同,调用不同的do方法
-
if (method.equals("GET")) { this.doGet(req, resp); } else if (method.equals("POST")) { this.doPost(req, resp); } else if (method.equals("PUT")) { this.doPut(req, resp); } else if (method.equals("DELETE")) { this.doDelete(req, resp); } else if (method.equals("OPTIONS")) { this.doOptions(req, resp); } else if (method.equals("TRACE")) { this.doTrace(req, resp);
-
HttpServlet的do调用(默认调用子类,否则报405)
-
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String protocol = req.getProtocol(); String msg = lStrings.getString("http.method_get_not_supported"); if (protocol.endsWith("1.1")) { resp.sendError(405, msg); } else { resp.sendError(400, msg); } }
-
-
-
-
-
-
总结
- 继承关系:
- HttpServlet——> GenericServlet -> Servlet
- Servlet中的核心方法: init(),service(),destroy()
- 服务方法:
- 当有请求过来时,service方法自动响应(tomcat容器调用)
- 在HttpServlet中判断请求方式,再去决定调用哪个do方法
- 在HttpServlet中这些do方法默认都是405的实现风格,需要我们子类去实现对应的方法
- 因此,我们在新建Servlet时,才回去考虑请求方法,从而决定重写哪个do方法
-
-
Servlet生命周期
- 生命周期:
- 从出生到死亡的过程就是生命周期。
- 对应Servlet中的三个方法:init(),service(),destroy();
- 默认情况
- 第一次发送请求时,这个Servlet会进行实例化(调用构造方法),初始化(调用init()),然后服务(调用service())
- 从第二次开始,每一次都是服务
- 当容器关闭时,其中的所有的servlet实例会被销毁,调用销毁方法(destroy)
- 结论
- Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应
- 默认情况下,第一次请求时,tomcat才会去实例,初始化,然后在服务,这样做的好处是,提高系统的启动速度;缺点:第一次请求时,耗时较长
- 因此,如果需要提高系统的启动速度,当前默认情况就是这样。如果需要提高响应速度,我们应该设置servlet初始化时机
- servlet初始化时机
- 默认是第一次接收请求时,实例化,初始化
- 我们可以通过在web.xml设置load-on-startup的servlet启动的先后顺序,数字越小,启动靠前,最小值0
- Servlet实例tomcat只会创建一个,所有的请求都是这个实例去响应
- servlet在容器中是:单例的,线程不安全的
- 单例:所有的请求都是同一个实例去响应
- 线程不安全:一个线程需要根据这个实例中的某个成员去做逻辑判断,但是在中间的某个时机,另一个线程改变了这个成员变量的值,从而导致第一个线程的执行路线发生变化
- 我们已经知道了servlet是线程不安全的,所以尽量的不要在servlet中定义成员变量,
- 如果要定义,
- 那么不要去修改成员变量的值
- 不要根据成员变量的值做一些逻辑的判断
- 如果要定义,
- 生命周期: