1.浏览器发出http://localhost:8080/web-demo/demo1请求,从请求中可以解析出三部分内容,分别是localhost:8080、web-demo、demo1
- 根据localhost:8080可以找到要访问的Tomcat Web服务器
- 根据web-demo可以找到部署在Tomcat服务器上的web-demo项目
- 根据demo1可以找到要访问的是项目中的哪个Servlet类,根据@WebServlet后面的值进行匹配
2.找到ServletDemo1这个类后,Tomcat Web服务器就会为ServletDemo1这个类创建一个对象,然后调用对象中的service方法
- ServletDemo1实现了Servlet接口,所以类中必然会重写service方法供Tomcat Web服务器进行调用
- service方法中有ServletRequest和ServletResponse两个参数,ServletRequest封装的是请求数据,ServletResponse封装的是响应数据,后期我们可以通过这两个参数实现前后端的数据交互
- 生命周期: 对象的生命周期指一个对象从被创建到被销毁的整个过程。
1.加载和实例化:默认情况下,当Servlet第一次被访问时,由容器创建Servlet对象
2.初始化:在Servlet实例化之后,容器将调用Servlet的init()方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
3.请求处理:每次请求Servlet时,Servlet容器都会调用Servlet的==service()方法对请求进行处理
4.服务终止:当需要释放内存或者容器关闭时,容器就会调用Servlet实例的destroy()==方法完成资源的释放。在destroy()方法调用之后,容器会释放这个Servlet实例,该实例随后会被Java的垃圾收集器所回收
@WebServlet(urlPatterns = "/demo2",loadOnStartup = 1)
初始化方法
* 1.调用时机:默认情况下,Servlet被第一次访问时,调用
* loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用
* 2.调用次数: 1次
init
* 初始化方法
* 1.调用时机:默认情况下,Servlet被第一次访问时,调用
* * loadOnStartup: 默认为-1,修改为0或者正整数,则会在服务器启动的时候,调用
* 2.调用次数: 1次
* @param config
* @throws ServletException
service
destroy
3.体系结构
在HttpServlet中我们一般封装了一些方法,变量和常量 当发送不同类型的请求时-Post或者Get,我们一般需要判断来获得其中的参数等等内容,这个HttpServlet这个类进行了封装,我们只需要重写doGet和doPost两个方法即可。其中的判断继承的HttpServlet已经帮我们写好了。
- HttpServlet的使用步骤
继承HttpServlet
重写doGet和doPost方法
- HttpServlet原理
获取请求方式,并根据不同的请求方式,调用不同的doXxx方法
视频:96 --Javaweb
4.urlPattern1.精确匹配
@WebServlet(urlPatterns={“/demo7”,“/demo8”})
2.目录匹配
3.扩展名匹配
4.任意匹配
注意:/和/*的区别?
- 当我们的项目中的Servlet配置了 “/”,会覆盖掉tomcat中的DefaultServlet,当其他的url-pattern都匹配不上时都会走这个Servlet
- 当我们的项目中配置了"/*",意味着匹配任意访问路径
- DefaultServlet是用来处理静态资源,如果配置了"/"会把默认的覆盖掉,就会引发请求静态资源的时候没有走默认的而是走了自定义的Servlet类,最终导致静态资源不能被访问
小结
- urlPattern总共有四种配置方式,分别是精确匹配、目录匹配、扩展名匹配、任意匹配
- 五种配置的优先级为 精确匹配 > 目录匹配> 扩展名匹配 > /* > / ,无需记,以最终运行结果为准。
前面对应Servlet的配置,我们都使用的是@WebServlet,这个是Servlet从3.0版本后开始支持注解配置,3.0版本前只支持XML配置文件的配置方法。
对于XML的配置步骤有两步:
- 编写Servlet类
- 在web.xml中配置该Servlet
5.Request和Response 1.Request 1.Request继承体系demo13 com.itheima.web.ServletDemo13 demo13 /demo13
Request的继承体系
- Request的继承体系为ServletRequest–>HttpServletRequest–>RequestFacade
- Tomcat需要解析请求数据,封装为request对象,并且创建request对象传递到service方法
- 使用request对象,可以查阅JavaEE API文档的HttpServletRequest接口中方法说明
1.请求行包含三块内容,分别是请求方式、请求资源路径、HTTP协议及版本
- 获取请求方式: GET
String getMethod()
- 获取虚拟目录(项目访问路径): /request-demo
String getContextPath()
- 获取URL(统一资源定位符): http://localhost:8080/request-demo/req1
StringBuffer getRequestURL()
- 获取URI(统一资源标识符): /request-demo/req1
String getRequestURI()
- 获取请求参数(GET方式): username=zhangsan&password=123
String getQueryString()
2.获取请求体数据
- getReader() ------------ 获取字符输入流,如果前端发送的是纯文本数据,则使用该方法
BufferedReader getReader()
BufferedReader reader = req.getReader();
String s = reader.readLine();
System.out.println(s);
- getInputStream()—获取字节输入流,如果前端发送的是字节数据,比如传递的是文件数据,则使用该方法
ServletInputStream getInputStream()
该方法可以获取字节
3.请求头数据
String getHeader(String name)
//获取请求头: user-agent: 浏览器的版本信息
String agent = req.getHeader("user-agent");
System.out.println(agent);
3.Request获取请求参数的通用方式
//@WebServlet(urlPatterns = "*.do")
public class Servletdemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp); //核心
}
}
- 获取所有参数Map集合
Map
getParameterMap()
- 根据名称获取参数值(数组)
String[] getParameterValues(String name)
- 根据名称获取参数值(单个值)
String getParameter(String name)
//获取所有参数的Map集合
Map parameterMap = req.getParameterMap();
for (String s : parameterMap.keySet()) {
System.out.print(s+':');
String[] strings = parameterMap.get(s);
for (String string : strings) {
System.out.print(string);
}
System.out.println();
}
//根据名称获取参数值(数组)
String[] usernames = req.getParameterValues("username");
for (String username : usernames) {
System.out.println(username);
}
//根据名称获取参数值(单个值)
String username = req.getParameter("username");
System.out.println(username);
4.IDEA快速创建Servlet
1.按照自己的需求,修改Servlet创建的模板内容
2.创建Servlet项目
1.POST
分析出现中文乱码的原因:
- POST的请求参数是通过request的getReader()来获取流中的数据
- TOMCAT在获取流的时候采用的编码是ISO-8859-1
- ISO-8859-1编码是不支持中文的,所以会出现乱码
解决方案:
- 页面设置的编码格式为UTF-8
- 把TOMCAT在获取流数据之前的编码设置为UTF-8
- 通过request.setCharacterEncoding(“UTF-8”)设置编码,UTF-8也可以写成小写
2.Get
URL编码:
这块知识我们只需要了解下即可,具体编码过程分两步,分别是:
(1)将字符串按照编码方式转为二进制
(2)每个字节转为2个16进制数并在前边加上%
张三按照UTF-8的方式转换成二进制的结果为:
1110 0101 1011 1100 1010 0000 1110 0100 1011 1000 1000 1001
String username = "张三";
//1. URL编码
String encode = URLEncoder.encode(username, "utf-8");
System.out.println(encode); //打印:%E5%BC%A0%E4%B8%89
//2. URL解码
//String decode = URLDecoder.decode(encode, "utf-8");//打印:张三
String decode = URLDecoder.decode(encode, "ISO-8859-1");//打印:`å¼ ä¸ `
System.out.println(decode);
GET请求中文参数出现乱码的原因
- 浏览器把中文参数按照UTF-8进行URL编码
- Tomcat对获取到的内容进行了ISO-8859-1的URL解码
- 在控制台就会出现类上å¼ ä¸‰的乱码,最后一位是个空格
解决方案:
1.按照ISO-8859-1编码获取乱码å¼ ä¸‰对应的字节数组
2.按照UTF-8编码获取字节数组对应的字符串
String username = request.getParameter("username");
byte[] bytes = username.getBytes(StandardCharsets.ISO_8859_1);
String s = new String(bytes, StandardCharsets.UTF_8);
System.out.println(s);
4.Request请求转发
1.请求转发(forward):一种在服务器内部的资源跳转方式。
(1)浏览器发送请求给服务器,服务器中对应的资源A接收到请求
(2)资源A处理完请求后将请求发给资源B
(3)资源B处理完后将结果响应给浏览器
(4)请求从资源A到资源B的过程就叫请求转发
2.请求转发的实现方式:
req.getRequestDispatcher(“资源B路径”).forward(req,resp);
3.请求转发资源间共享数据:使用Request对象
- 1.存储数据到request域[范围,数据是存储在request对象]中
void setAttribute(String name,Object o);
request.setAttribute(“name”,“hello”);
- 2.根据key获取值
Object getAttribute(String name);
- 3.根据key删除该键值对
void removeAttribute(String name);
2.Response
体系结构
Response重定向(redirect):一种资源跳转方式。
//重定向
//1.设置响应状态码 302
response.setStatus(302);
//设置响应头 Location
response.setHeader("Location","/request-demo/resp2");
//2.简化版本
resposne.sendRedirect("/request-demo/resp2")
重定向和转发的区别
判断依据:
- 浏览器使用:需要加虚拟目录(项目访问路径)
- 服务端使用:不需要加虚拟目录
- ` 超链接,从浏览器发送,需要加 - `



