Servlet概述
servlet = server + applet:运行在服务器端的java程序
Servlet是一个接口,一个类想通过浏览器被访问到,那么这个类就必须直接或间接的实现Servlet接口
Servlet执行原理
Servlet生命周期
- init()
servlet创建对象时,调用此方法完成初始化操作
- service()
用户访问servlet时,调用此方法完成业务逻辑的处理
- destory()
servlet对象销毁,调用此方法完成销毁操作
Servlet体系结构
HttpServlet
- Servlet可以映射多个url
- url映射模式
Request
- 请求行
- 请求头
- 请求体(请求参数)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 设置解码为UTF-8,解决post中文乱码问题, 需放在首行
req.setCharacterEncoding("UTF-8");
doGet(req, resp);
}
- 请求转发
服务器内部的资源跳转方式
- 域对象
一个作用范围的对象,可以在范围共享数据
request域: 代表一次请求的范围,一般用于一次请求中转发的多个资源中共享数据
Response
response对象表示web服务器给浏览器返回的响应信息。
作用:返回给浏览器的响应信息。
- 响应行
- 响应头
- 响应体
- 响应重定向
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("访问到了CServlet,接下来重定向DServlet");
// 方式一:设置重定向
resp.setStatus(302);
// resp.setHeader("Location", "/项目名/DServlet");
// 方式二:设置重定向
resp.sendRedirect("/项目名/DServlet");
}
- 中文乱码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 第一种方式:设置编码,一定要设置首行
// resp.setCharacterEncoding("GBK");
// 第二种方式:统一浏览器和服务器编码
resp.setContentType("text/html;charset=UTF-8");
// 页面输出中文
PrintWriter writer = resp.getWriter();
writer.write("中文");
}
ServletContext
web容器在启动时,会为每个web项目创建一个对应的ServletContext对象。
ServletContext: 代表当前web项目
- ServletContext对象
- 域对象(共享数据)
当前项目范围内,共享数据(多个Servlet都可以获取)。
- 获取文件MIME类型
互联网通信过程中定义的一种文件数据类型格式。
Cookie
Cookie:客户端会话技术。
作用:在一次会话的多次请求之间共享数据,将数据保存到客户端(浏览器)。
服务器可以发送多个Cookie。
默认情况下,浏览器关闭(会话结束),cookie销毁(内存)。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 编码
String encodevalue = URLEncoder.encode("杰克 ", "UTF-8");
Cookie cookie = new Cookie("name", encodevalue);
resp.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
// 获取cookie的name
String name = cookie.getName();
// 获取cookie的value
String value = cookie.getValue();
// 解码
String decodeValue = URLDecoder.decode(value, "UTF-8");
System.out.println(name + ":" + decodeValue);
}
- Cookie特点
Session
Session:会话技术;基于cookie来实现的。
作用:在一次会话的多次请求之间共享数据,将数据保存到服务端。
- HttpSession
HttpSession:域对象。
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 将共享数据存到session
// 获取session对象
HttpSession session = req.getSession();
// 将session对象进行数据存入
session.setAttribute("name", "jack");
System.out.println("已将数据存到共享数据中。。。");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 将session中的共享数据取出来
// 获取session对象
HttpSession session = req.getSession();
// 获取共享数据
String name = (String) session.getAttribute("name");
System.out.println(name);
}
- Session生命周期
三大域对象
Request、Session、ServletContext
- API
- 生命周期
- ServletContext
- HttpSession
- HttpServletRequest
Filter:访问服务器资源,过滤请求,完成通用操作
web的三大组件:
servlet(控制器)
filter(过滤器)
listener(监听器)
- 执行原理
- 生命周期
- 拦截路径
- 过滤器链
Listener
<listener>
<listener-class>com.demo.listener.ServletContextListenerDemo</listener-class>
</listener>
package com.demo.listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class ServletContextListenerDemo implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("监听到servletContext对象创建了。。。");
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
System.out.println("监听到servletContext对象销毁了...");
}
}