- JavaEE
- 1、Servlet
- 工作流程
- 生命周期
- HttpServletRequest
- HttpServletResponse
- cookie对象
- HttpSession
- ServletContext
- 文件上传和文件下载
- 2、过滤器(Filter)
- 3、监听器(Listener)
- Tomcat
- 1、整体架构
- 连接器(Coyote)
- Catalina
- Container
- Tomcat启动流程
- Tomcat请求流程
- 2、配置优化
- 3、Tomcat附加功能WebSocket
- 介绍
- 使用
- 通过Http请求头,获取访问主机
- 通过Http请求行,获取访问时那一个web应用
- 再通过Http请求行,获取请求路径
- 服务器创建Servlet对象(第一次请求,会创建Servlet实例,并执行init方法)
- 调用Service(request,response)方法来处理请求和响应
- 调用完毕Service方法,由服务器将Response缓冲区的数据取出,以Http响应的格式发送给浏览器。
生命周期是指servlet容器何时创建servlet实例,何时调用其方法进行请求处理,何时并销毁实例的整个过程。
- 实例和初始化时机:当请求到达容器时,容器查找该servlet对象是否存在,如果不存在,则会创建实例并进行初始化。
- 就绪/调用/服务阶段:有请求到达容器,容器调用servlet对象的service()方法,处理请求的方法在整个生命周期中可以被多次调用,HttpServlet的servlce()方法,会依据请求方式来调用doGet()或者doPost()方法。
- 销毁时机:当容器关闭时(应用程序停止时),会将程序中的servlet实例进行销毁。
servlet生命周期分为四步:servlet类加载->实例化->服务->销毁。
- 客户端向servlet容器(Tomcat)发送请求
- Tomcat接收请求
- Tomcat会创建一个HttpServletReqest对象,将客户端请求封装到对象中,创建一个响应对象HttpServletResponse。
- Tomcat调用HttpServlet对象的service方法,把HttpServletReqest和HttpServletResponse作为参数,传给HttpServlet。
- HttpServlet调用HttpServletRequest对象有关方法,获取Http请求信息
- HttpServlet调用HttpServletResponse对象有关方法,生成响应数据
- Tomcat把HttpServlet的响应结果传给客户端。
HttpServletRequest是ServletRequest的子接口。用来封装客户端请求的详细信息。
请求乱码
乱码问题的原因是:ISO-8859-1编码不支持中文,需要设置其编码格式为UTF-8。
处理方法:在参数获取钱设置编码格式,HttpServletRequest#setCharacterEncoding(“UTF-8”);
请求转发:
在服务器中将请求资源转发到另一份资源中,并且共享HttpServletRequest和HttpServletResponse。
转发方法,HttpServletRequest#getRequestDispatcher("")#forward(HttpServletRequest,HttpServletResponse);
作用域:
HttpServletRequest有一个可以携带其他非请求资源的信息,attribute通过HttpServletRequest#setAttribute(key,val)方法来往作用域里面,添加数据,通过HttpServletRequest#getAttribute(key)来获取数据,通过HttpServletRequest#removeAttribute(key)来移除数据。
HttpServletRequestWrapper和ServletRequestWrapper分别是HttpServletRequest和ServletRequest接口的实现类。在实际应用中,可以通过继承这两个类来重写HttpServletRequest方法。
HttpServletResponse例:在HttpServletRequest中body的方法只能被读取一次,无法重复读取,可以通过继承HttpServletRequestWrapper类来重写这个类,来实现body可以多次被读取。
用来向客户端吐出响应数据。
响应数据的方法:
getWriter():获取字符流(只能响应字符)
getOutputStream():获取字节流(能响应一切数据)
设置响应的数据类型
HttpServletResponse#setHeader(“content-type”:“xxxxxx”);
响应乱码:
产生原因:当客户端和服务端编码格式不同或者编码不支持中文时则会出现乱码问题。
处理方法:设置客户端和服务端编码格式一致。同时支持中文编码UTF-8。通过HttpServletResponse#setContentType(“xxxxxx;charset=utf-8”)来设置两端编码格式。
重定向:服务端指定客户端发出请求的方法,可以指定客户端进入全新的页面,并发送请求,客户端的请求地址会发生改变。
HttpServletResponse#sendRedirect(String)方法进行重定向。
HttpServletResponseWrapper和ServletResponseWrapper是HttpServletResponse和ServletResponse的实现类。在实际应用中,可以通过继承这两个类来重写HttpServletResponse方法。
cookie对象浏览器技术,将数据保存在本地计算机内,但是安全性能低,cookie采用键值对的方式存储,多个键值对采用**;**分割,cookie通过domain(域名)做区分。
创建和发送:
创建:cookie cookie = new cookie(key,val);
发送:HttpServletResponse#addcookie(cookie)
获取cookie:
获取所有的cookie对象,遍历查询对象名称的cookie。
最大存活时间:
- -1:默认值,表示浏览器关闭失效
- 0:表示删除
- 正整数:表示存货指定秒数
注意:cookie中不能存储中文。
cookie的Path,cookie可以设置指定path下拿到,当Path设置为**/时,代表当前域名下所有都能路径都能拿到。默认为 private static AtomicInteger onlineCount = new AtomicInteger(0); @OnOpen public void onOpen(Session session) { onlineCount.incrementAndGet(); // 在线数加1 log.info("有新连接加入:{},当前在线人数为:{}", session.getId(), onlineCount.get()); } @OnClose public void onClose(Session session) { onlineCount.decrementAndGet(); // 在线数减1 log.info("有一连接关闭:{},当前在线人数为:{}", session.getId(), onlineCount.get()); } @OnMessage public void onMessage(String message, Session session) { log.info("服务端收到客户端[{}]的消息:{}", session.getId(), message); this.sendMessage("Hello, " + message, session); } @OnError public void onError(Session session, Throwable error) { log.error("发生错误"); error.printStackTrace(); } private void sendMessage(String message, Session toSession) { try { log.info("服务端给客户端[{}]发送消息{}", toSession.getId(), message); toSession.getBasicRemote().sendText(message); } catch (Exception e) { log.error("服务端发送消息给客户端失败:{}", e); } } }



