文章目录
Servlet处理Http请求的生命周期
- Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化.
- Servlet 调用 service() 方法来处理客户端的请求。
Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类
型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
- Servlet 通过调用 destroy() 方法终止(结束)。
destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
操作 HTTP Request头的方法
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
public class HttpServletTest1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=utf-8");
String encoding = req.getCharacterEncoding();
String contentType = req.getContentType();
String contextPath = req.getContextPath();
String ua = req.getHeader("User-Agent");
String host = req.getHeader("Host");
String method = req.getMethod();
String protocol = req.getProtocol();
String queryString = req.getQueryString();
String url = req.getRequestURI();
int contentLength = req.getContentLength();
Writer writer = resp.getWriter();
writer.write("<html>");
writer.write("encoding: " + encoding);
writer.write("<br/>");
writer.write("contentType: " + contentType);
writer.write("<br/>");
writer.write("contextPath: " + contextPath);
writer.write("<br/>");
writer.write("ua: " + ua);
writer.write("<br/>");
writer.write("host: " + host);
writer.write("<br/>");
writer.write("method: " + method);
writer.write("<br/>");
writer.write("protocol: " + protocol);
writer.write("<br/>");
writer.write("queryString: " + queryString);
writer.write("<br/>");
writer.write("url: " + url);
writer.write("<br/>");
writer.write("contentLength: " + contentLength);
writer.write("<br/>");
writer.write("</html>");
}
}
- form表单静态页面访问
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Welcome</title>
</head>
<body>
<form method="post" action="test2">
<input type="text" name="firstName" placeholder="firstName">
<input type="text" name="secondName" placeholder="secondName">
<input type="password" name="password" placeholder="password">
<input type="submit" value="join">
</form>
</body>
</html>
- 实现代码
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
public class HttpServletTest2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String firstName = req.getParameter("firstName");
String secondName = req.getParameter("secondName");
String password = req.getParameter("password");
resp.setContentType("text/html; charset=utf-8");
Writer writer = resp.getWriter();
writer.write("<html>");
writer.write("<h1>firstName: " + firstName + "</h1");
writer.write("<br/>");
writer.write("<h1>secondName: " + secondName + "</h1>");
writer.write("<br/>");
writer.write("<h1>password: " + password + "</h1>");
writer.write("</html>");
}
}
- 获取header部分
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.util.Enumeration;
public class HttpServletTest3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//resp.setContentType("text/html; charset=utf-8");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
//返回的是一个枚举
Enumeration<String> enumeration = req.getHeaderNames();
Writer writer = resp.getWriter();
writer.write("<html>");
while (enumeration.hasMoreElements()) {
String header = enumeration.nextElement();
writer.write("<h1>" + header + ": " + req.getHeader(header) + "</h1>");
}
writer.write("</html");
}
}
操作HTTP Response头的方法
- 返回一个404
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HttpServletTest5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 得到一个 Tomcat 内置的错误页面.
resp.sendError(404);
}
}
- 返回时间并设置一秒刷新一次
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
import java.util.Date;
public class HttpServletTest4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 每秒自动刷新
// 返回的页面中, 填写上当前时间.
// 获取当前时间
// System.currentTimeMillis();
// new Date();
// new Calender();
resp.setContentType("text/html; charset=utf-8");
//设置header部分 1 表示每间隔一秒
resp.setIntHeader("Refresh", 1);
Date date = new Date();
Writer writer = resp.getWriter();
writer.write("<html>");
writer.write("<h1>" + date.toString() + "</h1>");
writer.write("</html>");
}
}
- 返回重定向
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HttpServletTest6 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//重定向到一个网页 这个方法自动帮我们设置了respond的状态码和状态描述等相关信息
resp.sendRedirect("https://blog.csdn.net/Shangxingya/article/details/107295800");
}
}
设置 HTTP 状态代码的方法
Servlet 操作cookie方法
- 设置cookie
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class HttpServletTest7 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//构建一个Cookie
Cookie name = new Cookie("userName", "listen");
Cookie password = new Cookie("password", "listenY");
//把cookie写到respond中
resp.addCookie(name);
resp.addCookie(password);
resp.setContentType("text/html; charset=utf-8");
resp.getWriter().write("<h1>设置Cookie成功</h1>");
}
}
- 或得cookie
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
public class HttpServletTest8 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得Cookie字段
Cookie[] cookies = req.getCookies();
//将所有的cookie输出到响应报文中
resp.setContentType("text/html; charset=utf-8");
Writer writer = resp.getWriter();
writer.write("<html>");
for (Cookie c : cookies
) {
writer.write("<h1>" + c.getName() + ": " + c.getValue() + "</h1>");
}
writer.write("</html>");
}
}
- 删除cookie
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Writer;
public class HttpServletTest10 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//删除现有的cookie
//获取所有cookie 然后将这些cookie的生命时间设置为0
//将这些cookie保存在响应报文中
Cookie[] cookies = req.getCookies();
// 设置响应内容类型
resp.setContentType("text/html; charset=utf-8");
if (cookies != null) {
for (Cookie c : cookies
) {
c.setMaxAge(0);
resp.addCookie(c);
}
Writer writer = resp.getWriter();
writer.write("<html>");
writer.write("<h1>删除cookie成功</h1>");
} else {
Writer writer = resp.getWriter();
writer.write("<html>");
writer.write("<h1>当前没有cookie</h1>");
}
}
}
Servlet 操作session方法
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.Writer;
public class HttpServletTest9 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1. 先获取 Session. 如果用户曾经没有访问过, 此时将创建新的 session
// 如果用户已经访问过了, 就获取到曾经的 Session
// 新用户访问:
// 这个操作就会自动生成一个 sessionId, 同时创建一个 httpSession 对象
// 把这个键值对放到内置的 hash 表中. 同时把 sessionId 写回到浏览器的
// Cookie 中
// 老用户访问:
// 根据请求中 Cookie 里的 sessionId, 在 hash 表中查, 找到对应的 session 对象
HttpSession session = req.getSession(true);
// 2.判断是否为新用户
Integer count = 1;
if (session.isNew()) {
//新用户
// 把 count 值写入到 session 对象中.
// httpSession 也可以当成是一个 hash 表.
session.setAttribute("count", count);
} else {
// 老用户
// 从 httpSession 中读取到 count 值
count = (Integer) session.getAttribute("count");
count++;
session.setAttribute("count", count);
}
resp.setContentType("text/html; charset=utf-8");
Writer writer = resp.getWriter();
writer.write("<html>");
writer.write("<h1>" + session.getAttribute("count").toString() + "</h1>");
writer.write("</html>");
}
}
Servlet文件上传理解
- 前端表单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件表单</title>
</head>
<body>
<h1>选择上传的文件</h1>
<form method="post" action="upload" enctype="multipart/form-data">
<input type="file" name="file" size="50">
<br/>
<input type="submit" name="上传文件">
</form>
</body>
</html>
- 文件传输代码
import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.IOException;
import java.io.Writer;
//必须要有这个字段表示文件上传
@MultipartConfig
public class HttpServletTest11 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String loadPath = "D:\\java\\test\\";
//获取文件,文件在html中的name是“file”
Part imag = req.getPart("file");
//制作文件全路径
String path = loadPath + imag.getSubmittedFileName();
imag.write(path);
//如果上传成功就制作响应报文
resp.setContentType("text/html; charset=utf-8");
Writer writer = resp.getWriter();
writer.write("<html>");
writer.write("<h1>写入成功</h1>");
writer.write("<h1>路径为: " + path + "</h1>");
}
}