Servlet是如何处理请求的
1.HttpServlet抽象类HttpServlet中有doGet() doPost()等方法,其实现子类可以重写HttpServlet中也有service()方法,即模板设计模式,判断当前请求是GET还是POST。如果是GET请求,那么会去调用本类的doGet()方法,HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持(如GET POST等请求方式的
·
1.HttpServlet抽象类

- HttpServlet中有doGet() doPost()等方法,其实现子类可以重写
- HttpServlet中也有service()方法,即模板设计模式,判断当前请求
是GET还是POST。如果是GET请求,那么会去调用本类的doGet()方法, - HttpServlet类是GenericServlet的子类,它提供了对HTTP请求的特殊支持(如GET POST等请求方式的区分、)
- 通常我们都会通过继承HttpServlet来完成自定义的Servlet
2.Servlet对象生命周期

- 一个Servlet对象的根接口
- Servlet的实现类 的实例只能由Http服务器创建
- 一个类一个唯一实例对象
- 服务器启动时自动创建,服务器关闭时自动销毁(不像Spring的Bean可以自己决定懒汉还是饿汉)
3.HttpServletRequest接口
- 是对ServletRequest接口的Http功能封装
- 可以获取请求行、请求头、请求体(用getInputStream()但默认只能读取一次,除非用自行持久化)
- Http服务器已经对该接口有几个实现类
- 作为“入参”在多个Servlet对象(请求)之间传递
- HttpServletRequest 的方法:
- String getParameter(String paramName):获取指定请求参数的值;
- String getMethod():获取请求方法,例如GET或POST;
- String getHeader(String name):获取指定请求头的值;
- void setCharacterEncoding(String encoding):设置请求体的编码!因为GET请求没有请求体,所以这个方法只只对POST请求有效。当调用
request.setCharacterEncoding(“utf-8”)之后,再通过getParameter()方法获取参数值时,那么参数值都已经通过了转码,即转换成了UTF-8编码。所以,这个方法必须在调用getParameter()方法之前调用!
- 还可以getCookies() getSession
- HttpServletRequest虽然可以获取Cookie,Session,但是他的作用域是一次请求
4.HttpServletResponse接口
- void setCharacterEncoding(String encoding):用来设置字符响应流的编码,例如在调用setCharacterEncoding(“utf-8”);之后,再response.getWriter()获取字符响应流对象,这时的响应流的编码为utf-8,使用response.getWriter()输出的中文都会转换成utf-8编码后发送给客户端;
- void setHeader(String name, String value):向客户端添加响应头信息,例如setHeader(“Refresh”, “3;url=http://www.baidu.cn”),表示3秒后自动刷新到http://www.baidu.cn;有没有那种既视感~
- void setContentType(String contentType):该方法是setHeader(“content-type”, “xxx”)的简便方法,即用来添加名为content-type响应头的方法。content-type响应头用来设置响应数据的MIME类型,例如要向客户端响应jpg的图片,那么可以setContentType(“image/jepg”),如果响应数据为文本类型,那么还要台同时设置编码,例如setContentType(“text/html;chartset=utf-8”)表示响应数据类型为文本类型中的html类型,并且该方法会调用setCharacterEncoding(“utf-8”)方法;ContentType资料
- void sendError(int code, String errorMsg):向客户端发送状态码,以及错误消息。例如给客户端发送404:sendError(404, “您要查找的资源不存在!”)。
- PrintWriter getWriter():获取字符响应流,使用该流可以向客户端输出响应信息。例如response.getWriter().print(“<h1>Hello JavaWeb!</h1>”);
- ServletOutputStream getOutputStream():获取字节响应流,当需要向客户端响应字节数据时,需要使用这个流,例如要向客户端响应图片;
- print()方法:用上面两个流对象来调用,即把输出流写到响应体


5.GET和POST请求

- 实际上HTTP请求格式中,
请求方法和请求体正文都是写在二进制流中的,不存在说GET方式就不能存在请求体 - 但是HTTP协议并没有为GET请求的body部分赋语义,即不要求也不禁止
- 但是像谷歌浏览器则在此基础上禁止了GET请求携带body
- 如果服务提供者支持GET请求携带body,那么可以放心使用,但是不建议。
- GET请求的参数Param直接写在了URL上,相对更不安全; 而POST请求的参数写在了body中,安全且能携带更多的信息
- 二者都是明文传输,没有加密的数据流都是明文传输
6.重定向和转发
资源重定向
- 外部跳转
- 需要完整URL
- 重定向的请求必须是GET方式,一来本质是通过地址栏访问,只能是GET;二来可以防止对外部网站用POST进行攻击
- response.sendRedirect(“www.baidu.com”)
请求转发
- 内部跳转
- 只需要相对资源路径URI
- 因为浏览器只发送了一次请求,只有一个Http请求协议包,所以请求转发之间的所有Servlet对象都可以共享这同一个Request和Response
- 且请求方式可以一样(共享Request对象携带的请求体)

7.多个Servlet之间数据共享的方案
ServletContext接口——服务器全局域
- 服务器级别的全局作用域对象
- 相当于服务器中存储的一个Map
- 服务器启动时创建唯一ServletContext实例,服务器关闭时销毁
- 通过request.getServletContext()获取,然后调用setAttiribute()或getAttribute()
- 相当于一个永久的Session
Cookie类——浏览器域
- 键值对,k,v只能是String类型的
- 自动存在浏览器中,可以通过setMaxAge()来设置该Cookie的存活时间

HttpSession类——会话域
- 键值对,k是String类型,v可以为任意类型,因为他存放在服务器中
- 类似于HashMap,通过String类型的k来获取任意类型的v
- request.getSession().getAttribute(“key”)就可以获取任意类型的value了
request.getSession(boolean create)
可以看到,空参相当于create=true,即如果当前发送请求的浏览器并没有对应的session存在于服务器中,则创建一个目标浏览器的唯一session


Session的创建和销毁
- 首先:Session就是HttpSession,HttpSession是没有父类的
- 创建:
- 当浏览器发送请求时,服务器检测到Cookie中没有JSEESIONID的键值对,就
自动在服务器内部创建一个Session对象,并生成一个uuid即JSEESIONID自动写入到reponse.addCookie(“JESSIONID”,“这是一串随机码”)中 - 此后的浏览器发送请求,只要Cookie中有JESSIONID,服务器就可以request.getSession()获取
- 这个Cookies中的JSESSIONID
只能存在于浏览器缓存中,不能设置,当然你可以自己手动设置一个JESSIONID设置存活时间
- 当浏览器发送请求时,服务器检测到Cookie中没有JSEESIONID的键值对,就
- 销毁:
- 如果浏览器关闭导致存放JSESSIONID的Cookie失效,服务器还会一直持有这个Session对象吗?
- 并不会!Tomcat默认的空闲时间是30min,超过这个时间就会销毁服务器中对应的session对象
HttpServletRequest接口——请求域
上面已经写了很多,这里不再赘述了。
参考:
1
更多推荐



所有评论(0)