随笔
URL:统一资源定位符 URL--->(请求)--->服务器---->(响应)---->(浏览器、响应结果)
Servlet是运行在服务端的,由服务器统一调用和执行;和http协议是紧密联系,可以处理http协议相关的所有内容。
客户端请求服务器、服务器响应客户端

HttpServletRequest req(请求) HttpServletRonse resp(响应)
生命周期:
Servlet没有main()方法,不能独立运行,它运行完全由Servlet引擎来控制和调度。所谓生命周期指的是servlet容器何时创建servlet实例,何时调用其方法进行请求的处理、何时并销毁其实例的整个过程
- 实例和初始化时机
当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,则会创建实例并进行初始化。
- 就绪/调用/服务阶段
有请求到达容器,容器调用servlet对象的service()方法,处理请求的方法在整个生命周期中可以被多次调用;HttpServlet的service()方法,会依据请求方式来调用doGet()或者doPost()方法/但是,这两个do方法默认情况下,会抛出异常,需要子类去override
- 销毁时机
当容器关闭时(应用程序停止时),会将程序中的Servlet中的实例进行销毁
上述的生命周期可以通过Servlet中的生命周期方法来观察。在Servlet中的生命周期 方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法即可观察到Servlet的生命周期。
简单概括:servet 类加载 --->实例化--->服务--->销毁


- HttpServletRequest()对象:主要是用来接收客户端发送过来的请求信息,例如:请求的参数,发送的头信息;service()方法中形参接收的时HttpServletRequest接口的实例化对象,表示该对象主要应用在HTTO协议上,该对象是由Tomcat封装好传递过来的。
获取请求的参数值,返回的是字符串(!!!)(常用重点!!!)
String uname = requset.getParameter(“uname”); (一定要和传回来的参数名称保持一致)
String upwd = reauset.getParameter(“upwd”);
获取指定名称的参数的所有参数值(用于复选框传值)
String[] hobbys = requset.getParameterValues("hobby");然后遍历输出;;
- 请求乱码问题
Tomcat8以上版本
GET请求 不会乱码
POST请求 无论什么版本的服务器,post请求中文都会乱码,通过设置服务器解析编码的格式(requset.setCharacterEncoding(“UTF-8”(只针对post请求乱码));放在接收参数代码之前);
Tomcat7及其以下版本
GET请求 new String(requset.getParameter("uname").getBytes("ISO-8859-1"),"UTF-8");(了解即可)
- 请求转发跳转:让请求从服务端跳转到客户端(或者跳转到Servlet)
请求转发是一种服务器的行为,当客户端请求到达后,服务器进行转发,此时会将请求对象进行保存,地址栏中的URL地址不会变,得到响应后,服务器端再将响应发送给客户端,从始至终只有一个请求发出。(数据可以共享,01发出请求到02;01&02都可以享用数据)
可以转发跳转到jsp,html (多数后台跳前台)
requset.getRequestDispatcher(url).forward(requset,response);
- request作用域
通过对象可以在一个请求中传递数据,作用范围:在一次请求中有效,即服务器跳转有效。
设置域对象内容
(requset.setAttribute(String name, Object value);)
request.setAttribute(“name”,“admin”);
request.setAttribute("age",18);也可以添加数组
获取域对象内容
String name = (String)requset.getAttributr("name");
Integer age = (Integer) requset.getAttributr("age");
删除域对象内容
request.removeAttribute(String name);
- 重定向
重定向是一种服务器指导,客户端的行为。客户发出第一次请求,被服务器接受后处理后,服务器会进行响应,在响应的同时,服务器会给客户端一个新的地址(下次请求的地址 response.sendRedirec(url)),当客户端接收到响应后,会立刻马上自动根据服务器给的新地址发起第二次请求,服务器接受请求并做出响应,重定向完成。
request对象不共享。
请求转发与重定向的区别:
请求转发(req.getRequestDispatcher().forward()) 重定向(resp.sendRedirect())
一次请求,数据在request域中共享 两次请求,request域中数据不共享
服务器端行为 客户端行为
地址栏不发生变化(URL) (URL)地址栏发生变化
绝对地址栏定位到站点后 绝对地址栏可以写到http://
请求转发是当前资源根目录无法跨域比如到百度 (404) 重定向可以跨域(任何地址)
////////////////////////////////////////////////////////////////////////////////////////////////////
- HttpServletResponse对象
Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象和代表响应的 reponse对象。
request 和 response 对象代表请求和响应:获取客户端数据,需要通过request对象;向客户端输出数据,需要通过response对象;
HttpServletResponse 的主要功能用于服务器对客户端的请求进行响应,将web服务器处理后的结果返回给客户端。service()方法中形参接受的是HttpServletResponse 接口的实例化对象,这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。
- 相应数据 (两种流不能同时使用,同时使用会报错)
接收客户端请求后,可以通过HttpServletResponse 对象直接进行响应,响应时需要获取输出流。有两种方式。
getWriter() ( 字符输出流,输出字符串) 获取字符流(只能响应回字符)
//获取字符输出流
printWreter writer = response.getWriter(); 输出: writer.writer(“Hello”);
getOutputStream() (字节输出流,输出一切数据) 获取字节流(能响应一切数据)
//获取字节输出流
ServeletOutputStream out = response.getOutputStream(); 输出: out.write(“Hello”.getBytes());
响应回的数据到客户端被浏览器解析。
- 响应乱码问题
在响应中,如果我们响应的内容中含有中文,则会可能出现乱码。这是因为服务器响应的数据也会经过网络传输,服务器端有一种编码方式,在客户端也存在一种编码方式,当两端使用的编码方式不同时则会出现乱码。
getWriter()字符流乱码问题:
获取到的字符流,响应中必定出现乱码,由于服务器端在进行编码时默认会使用ISO-8859-1格式的编码,该编码方式不支持中文。
解决乱码:
告知服务器使用一种能够支持中文的编码格式,比如我们通常用的“UTF-8”(一定要在流前面设置服务端的编码格式!);
response.setCharacterEncoding(“UTF-8”);
设置指定客户端的编码格式(和响应的MIMEle类型)(服务端和客户端的编码格式都要设置 设置在流前面; 编码格式保持一致):
response.setHeader(" content-type " , " text/html; charset = UTF-8 ");
同时设置客户端和服务端的编码格式(!!!!常用)
response.setContentType(“text/html ; charset = UTF-8”);
getOutputStream()字节流乱码:
对于getOutputStream()方法获取到的字节流,响应中文时,由于本身就是传输的字节,所以此时可能出现乱码,也可能正确显示。当服务器端给的字节恰好和客户端使用的编码方式一致时则文本正确显示,否则出现乱码。无论如何我们都应该精准掌握服务器和客户端使用的是哪种编码格式,以确保数据正确显示。
指定客户端和服务器使用的编码方式一致:(前提是输出字节流提前指定编码getBytes("UTF-8"))
response.setContentType(“text/html ; charset = UTF-8”);

浙公网安备 33010602011771号