简介


- Servlet 是 JavaWeb 最为核心的内容,它是 Java 提供的一门动态 web 资源开发技术。
- 使用 Servlet 就可以实现,根据不同的登录用户在页面上动态显示不同内容。
- Servlet 是 JavaEE 规范之一,其实就是一个接口,将来我们需要定义 Servlet 类实现 Servlet 接口,并由 web 服务器运行 Servlet
继承关系

生命周期
- Servlet 运行在 Servlet 容器 (web 服务器) 中,其生命周期由容器来管理,分为 4 个阶段:
- 加载和实例化:默认情况下,当 Servlet 第一次被访问时,由容器创建 Servlet 对象
- 可用 loadOnStartup 修改成在服务器启动的时候创建。
- 初始化:在 Servlet 实例化之后,容器将调用 Servlet 的 init() 方法初始化这个对象,完成一些如加载配置文件、创建连接等初始化的工作。该方法只调用一次
- 请求处理:每次请求 Servlet 时,Servlet 容器都会调用 Servlet 的 service() 方法对请求进行处理
- 服务终止:当需要释放内存或者容器关闭时,容器就会调用 Servlet 实例的 destroy() 方法完成资源的释放。在 destroy() 方法调用之后,容器会释放这个 Servlet 实例,该实例随后会被 Java 的垃圾收集器所回收
Servlet 基础
package priv.noby.servlet.servlet;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class ServletNote implements Servlet {
private ServletConfig servletConfig = null;
@Override
public void init(ServletConfig servletConfig) {
this.servletConfig = servletConfig;
System.out.println("init执行");
System.out.println("servletConfig.getInitParameter(\"ENCODING\") = " + servletConfig.getInitParameter("ENCODING"));
System.out.println("servletConfig.getServletContext().getInitParameter(\"info2\") = " + servletConfig.getServletContext().getInitParameter("info2"));
}
@Override
public ServletConfig getServletConfig() {
return servletConfig;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) {
System.out.println(servletConfig.getInitParameter("ENCODING"));
System.out.println("service执行");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("destroy执行");
}
}
HttpServlet
Tomcat 对请求和响应的封装
- request: 获取请求数据
- 浏览器会发送 HTTP[请求行 + 请求头 + 请求体] 请求到后台服务器 [Tomcat]
- 后台服务器 [Tomcat] 会对 HTTP 请求中的数据进行解析并把解析结果存入到一个 request 对象中
- 我们可以从 request 对象中获取请求的相关参数获取到数据后就可以继续后续的业务,比如获取用户名和密码就可以实现登录操作的相关业务
- response: 设置响应数据
- 业务处理完毕,前端返回业务处理后,封装到 response 对象中的响应数据
- 后台服务器 [Tomcat] 会解析 response 对象,按照 [响应行 + 响应头 + 响应体] 格式拼接结果以 HTTP 协议返回给街蓝旗
- 浏览器最终解析结果,把内容展示在浏览器给用户浏览
Get 和 Post 的区别
- 两者都为 http 的请求方式,传输层协议均为 tcp 协议,get 请求用于获取请求数据,post 请求多为提交数据
- get 没有请求体,post 有请求体
- get 的请求参数位于请求行中在浏览器地址栏可见,post 的请求参数封装与请求体中浏览器地址不可见
- get 发送的请求数据量为一般为 1k(和浏览器有关),post 请求数据量没有限制
- get 只接受 ASCII 字符,对非 ascll 字符只能进行 url 编码,而 post 支持 utf-8 和 iso-8859-1 等多种编码方式。
- get 请求的乱码处理为修改 tomcat 配置文件 (乱码发生在 tomcat8 之前),或将乱码字符通过 iso-8859-1 重新编码为字节码,再通过 utf-8 解码为正确字符;post 请求的乱码处理为设置请求体为 utf-8 解码 (request.setCharacterEncoding("utf-8"))
- get 效率高于 post
- get 安全性低于 post
- get 的请求有浏览器地址输入、超链接、get 表单、ajax 的 get 请求,post 的请求有 post 表单、ajax 的 post 请求
转发和重定向的区别
- 转发通过 request 对象调用 getRequestDispatcher().forword() 方法转发,重定向通过 response 对象调用 sendRedirect() 方法重定向,转发路径参数可不包含 contextPath,重定向路径参数必须包含 contextPath
- 转发过程中 request 域有效,重定向过程中 rquest 域无效
- 转发请求的发起者为服务器,转发路径使用相对路径,重定向请求的发起者为浏览器,重定向路径使用绝对路径
- 转发前后为同一次请求,重定向前后为两次不同的请求
- 转发前后浏览器地址栏的路径不改变,重定向前后浏览器地址栏的路径改变
- 转发的响应速度快,重定向的响应速度相对较慢
- 转发只能在当前网站的资源中跳转,重定向可在不同的网站中跳转
常用的响应码
- 200 正常响应
- 302 重定向
- 400 请求的条件不满足 (必须携带某个参数)
- 401 未认证 (Authentication 判断用户是否登录)
- 403 未授权 (Authorization 登录的用户能否执行对应的操作)
- 404 未找到资源文件
- 405 请求方式错误
- 408 请求超时
- 500 服务器异常
- 502 错误网关 (nginx)
编码和解码的方式
- html 页面
<meta charset="UTF-8"> 设置浏览器的解码方式 - response.setContentType("text/html;charset=utf-8"); 响应的数据为 html,服务器编码方式为 utf-8
- 作为以下的简写,同时简写方式还能告诉浏览器自适应当前的编码
- response.setHeader("content-type", "text/html");//设置相应的内容类型
- response.setCharacterEncoding("utf-8");//设置内容的服务器编码方式
- request.setCharacterEncoding("utf-8"); 设置服务器对请求体解码方式为 utf-8
package priv.noby.servlet.servlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet(urlPatterns = "/httpServletNote",
initParams = {@WebInitParam(name = "username", value = "noby"), @WebInitParam(name = "password", value = "123")},
loadOnStartup = 0)
public class HttpServletNote extends HttpServlet {
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
super.service(req, res);
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
System.out.println("this.getInitParameter(\"username\") = " + this.getInitParameter("username"));
System.out.println("getInitParameter(\"password\") = " + getInitParameter("password"));
System.out.println("getServletContext().getInitParameter(\"info2\") = " + getServletContext().getInitParameter("info2"));
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HttpServletNote.doPost");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HttpServletNote.doGet");
}
}
Request 请求
package priv.noby.servlet.httpServlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/requestServletNote")
public class RequestServletNote extends HttpServlet {
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("requestServletNote\n");
request.getRequestDispatcher("/includeServlet").include(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
Response 请求
package priv.noby.servlet.httpServlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/responseServletNote")
public class ResponseServletNote extends HttpServlet {
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("/servlet/redirect.html");
}
// protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
请求的包含
package priv.noby.servlet.httpServlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/includeServlet")
public class IncludeServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("IncludeServlet");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
会话跟踪
请求和会话
- 一次请求为浏览器发出请求到服务器响应数据结束
- 一次会话为浏览器和服务器建立连接到其中一方关闭连接。一次会话为一个用户对应在服务器中的 session 和对应在浏览器中 cookie 的 sessionID 的有效期限,可为连写也可为断续的
- 会话跟踪:浏览器使用的 http 协议为无状态协议,每次请求都是独立的,该技术是为了建立各个请求之间的数据共享,会话跟踪同一次会话中多次请求中间的数据的共享技术
如何实现会话跟踪
- 第一次浏览器向服务器发起请求
- request 请求中不会携带来自浏览器中的任何 cookie
- 服务器调用 request.getSession() 方法获取 session,未通过 cookie 获取到 JSESSIONID 的情况下服务器会新建一个 session
- 当服务器向浏览器响应数据时存在 Set-Cookie 响应头,该响应头存在该 session 的 JSESSIONID
- 浏览器接收到响应后将 Set-Cookie 响应头中的 JSESSIONID 存入该网站的 cookie 中
- 第二次该浏览器向该服务器发起请求
- request 请求中携带来自浏览器中对应该网站包含 JSESSIONID 在内的所有 cookie
- 服务器调用 request.getSession() 方法获取 session,服务器通过 cookie 中的 JSESSIONID 查询对应的 session 并返回,这样就可以保证和上次浏览器访问时获得的 session 为同一 session
Cookie 和 Session 的区别
- 存储位置:Cookie 存储在浏览器;Session 存储在服务器
- 安全性:Cookie 因为存在浏览器当中,有被窃取的风险,也会随请求在网络中传输,有被劫持的风险,因此不安全;Session 存在服务器当中且不再不随响应在网络中传输,所以较安全
- 数据类型及大小:Cookie 只能存储字符串且不能直接存储中文字符串,中文通常使用 URL 编码的方式做传输前的处理,且大小为 3kb;Session 可以存储对象在内的所有数据,且没有大小限制
- 存储时间:Cookie 默认为关闭浏览器失效,可调用 Cookie 的成员方法 setMaxAge() 设置其有效时间,负数为关闭浏览器失效,正数为有效的秒数,0 为删除;Session 默认为 30 分钟失效,可通过配置文件设置其有效时间 (单位为分),setMaxInactiveInterval(int s) 方法可覆盖配置文件的有效时间 (单位为秒),可调用 invalidate() 的方法销毁,当服务器重启时会通过钝化和活化的方式保证在 Session 规定时间内的有效性
- 钝化:服务器关机前把 session 通过序列化的方式保存到硬盘文件中。
- 活化:服务器开机后把硬盘文件中的 session 在反序列化回内存。
- 服务器性能:Cookie 不占用服务器资源,相对性能高;session 占用服务器资源,相对性能低
Cookie
package priv.noby.servlet.sessionTracking;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.PrintWriter;
import java.net.URLEncoder;
@WebServlet("/cookieNote")
public class CookieNote extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charSet=UTF-8");
String value = "noby中文";
String urlValue = URLEncoder.encode(value, "utf-8");
Cookie cookie = new Cookie("username", urlValue);
cookie.setMaxAge(60 * 60);
resp.addCookie(cookie);
String format = String.format("cookieNote已创建 %s:%s", cookie.getName(), cookie.getValue());
System.out.println(format);
PrintWriter writer = resp.getWriter();
writer.write(format);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
package priv.noby.servlet.sessionTracking;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.PrintWriter;
import java.net.URLDecoder;
@WebServlet("/cookieNote2")
public class CookieNote2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charSet=UTF-8");
Cookie[] cookies = req.getCookies();
PrintWriter writer = resp.getWriter();
if (cookies != null) {
for (Cookie cookie : cookies) {
writer.write(String.format("cookieNote2已获取cookie %s:%s", cookie.getName(), cookie.getValue()));
if ("username".equals(cookie.getName())) {
String format = String.format("cookieNote2已获取cookie %s:%s", cookie.getName(), URLDecoder.decode(cookie.getValue()));
writer.write(format);
System.out.println(format);
}
if ("username".equals(cookie.getName())) {
cookie.setMaxAge(0);
System.out.println("username cookie已删除");
}
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
Session
package priv.noby.servlet.sessionTracking;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.PrintWriter;
@WebServlet("/sessionNote")
public class SessionNote extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setAttribute("password","123");
response.setContentType("text/html;charSet=UTF-8");
PrintWriter writer = response.getWriter();
String password = String.format("已写入session %s:%s", "password", "123");
writer.write(password);
System.out.println(password);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package priv.noby.servlet.sessionTracking;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.PrintWriter;
@WebServlet("/sessionNote2")
public class SessionNote2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charSet=UTF-8");
PrintWriter writer = response.getWriter();
HttpSession session = request.getSession();
String format = String.format("已获取session %s:%s", "password", session.getAttribute("password"));
System.out.println(format);
writer.write(format);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
ServletContext
package priv.noby.servlet.sessionTracking;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/servletContextNote")
public class ServletContextNote extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charSet=UTF-8");
PrintWriter writer = response.getWriter();
ServletContext servletContext = getServletContext();
servletContext.setAttribute("info","servletContextValue");
String infoFormat = String.format("已写入 servletContext %s:%s", "info", "servletContextValue");
System.out.println(infoFormat);
writer.write(infoFormat);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
package priv.noby.servlet.sessionTracking;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet(value = "/servletContextNote2", initParams = {
@WebInitParam(name = "ENCODING", value = "UTF-8")
})
public class ServletContextNote2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charSet=UTF-8");
PrintWriter writer = response.getWriter();
ServletContext servletContext = this.getServletContext();
ServletConfig servletConfig = this.getServletConfig();
String infoFormat = String.format("获取到servletContext attribute %s:%s", "info", servletContext.getAttribute("info"));
System.out.println(infoFormat);
writer.write(infoFormat + "\n");
String info2Format = String.format("获取到servletContext initParameter %s:%s", "info2", servletContext.getInitParameter("info2"));
System.out.println(info2Format);
writer.write(info2Format + "\n");
String EncodingFormat = String.format("获取到servletConfig initParameter %s:%s", "ENCODING", servletConfig.getInitParameter("ENCODING"));
System.out.println(EncodingFormat);
writer.write(EncodingFormat);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
会话应用,验证登陆
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>verifyCode</title>
</head>
<body>
<form action="/servlet/loginNote">
账号:<input type="text" name="username" value="${cookie.username.value}"><br>
密码:<input type="password" name="password" value="123"><br>
验证码:<input type="text" name="userCode"> <img src="/servlet/verifyCodeNote" id="imgCode"/>
<input type="submit" value="提交">
</form>
</body>
</html>
package priv.noby.servlet.util;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Random;
public class VerifyCode {
private int w = 70;
private int h = 35;
private Random r = new Random();
private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
private String codes = "23456789abcdefghjkmnopqrstuvwxyzABCDEFGHJKMNPQRSTUVWXYZ";
private Color bgColor = new Color(255, 255, 255);
private String text ;
private Color randomColor () {
int red = r.nextInt(150);
int green = r.nextInt(150);
int blue = r.nextInt(150);
return new Color(red, green, blue);
}
private Font randomFont () {
int index = r.nextInt(fontNames.length);
String fontName = fontNames[index];
int style = r.nextInt(4);
int size = r.nextInt(5) + 24;
return new Font(fontName, style, size);
}
private void drawLine (BufferedImage image) {
int num = 3;
Graphics2D g2 = (Graphics2D)image.getGraphics();
for(int i = 0; i < num; i++) {
int x1 = r.nextInt(w);
int y1 = r.nextInt(h);
int x2 = r.nextInt(w);
int y2 = r.nextInt(h);
g2.setStroke(new BasicStroke(1.5F));
g2.setColor(Color.BLUE);
g2.drawLine(x1, y1, x2, y2);
}
}
private char randomChar () {
int index = r.nextInt(codes.length());
return codes.charAt(index);
}
private BufferedImage createImage () {
BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g2 = (Graphics2D)image.getGraphics();
g2.setColor(this.bgColor);
g2.fillRect(0, 0, w, h);
return image;
}
public BufferedImage getImage () {
BufferedImage image = createImage();
Graphics2D g2 = (Graphics2D)image.getGraphics();
StringBuilder sb = new StringBuilder();
for(int i = 0; i < 4; i++) {
String s = randomChar() + "";
sb.append(s);
float x = i * 1.0F * w / 4;
g2.setFont(randomFont());
g2.setColor(randomColor());
g2.drawString(s, x, h-5);
}
this.text = sb.toString();
drawLine(image);
return image;
}
public String getText () {
return text;
}
public static void output (BufferedImage image, OutputStream out)
throws IOException {
ImageIO.write(image, "JPEG", out);
}
}
package priv.noby.servlet.sessionTracking;
import priv.noby.servlet.util.VerifyCode;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.image.BufferedImage;
import java.io.IOException;
@WebServlet("/verifyCodeNote")
public class VerifyCodeNote extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
VerifyCode verifyCode = new VerifyCode();
BufferedImage image = verifyCode.getImage();
String text = verifyCode.getText();
request.getSession().setAttribute("sessionCode", text);
VerifyCode.output(image, response.getOutputStream());
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package priv.noby.servlet.sessionTracking;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/loginNote")
public class LoginNote extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
String username = request.getParameter("username");
String password = request.getParameter("password");
String userCode = request.getParameter("userCode");
Cookie usernameCookie = new Cookie("username", username);
response.addCookie(usernameCookie);
String sessionCode = session.getAttribute("sessionCode").toString();
if ("noby".equals(username)) {
if ("123".equals(password)) {
if (userCode.equalsIgnoreCase(sessionCode)) {
response.getWriter().write("欢迎:" + username);
} else {
response.getWriter().write("验证码错误");
}
} else {
response.getWriter().write("密码错误");
}
} else {
response.getWriter().write("该用户未注册");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
}
页面跳转的其他方式
表单隐藏域
package priv.noby.servlet.hidden;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hiddenServlet")
public class HiddenServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
String newHtml = "<form action=\"/servlet/hiddenServlet2\" method=\"post\">\n" +
" 问题1:<input type=\"input\" name=\"q1\">\n" +
" 问题2:<input type=\"input\" name=\"q2\">\n" +
" <input type=\"submit\" value=\"下一页\">\n" +
"</form>";
writer.write(newHtml);
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package priv.noby.servlet.hidden;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hiddenServlet2")
public class HiddenServlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.write("<form action=\"/servlet/hiddenServlet3\" method=\"post\">\n");
writer.write(" <input type=\"hidden\" name=\"q1\" value=\"" + request.getParameter("q1") + "\">\n");
writer.write(" <input type=\"hidden\" name=\"q2\" value=\"" + request.getParameter("q2") + "\">\n");
writer.write(" 问题3:<input type=\"input\" name=\"q3\">\n");
writer.write(" 问题4:<input type=\"input\" name=\"q4\">\n");
writer.write(" <input type=\"submit\" value=\"提交\">\n");
writer.write("</form>\n");
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
package priv.noby.servlet.hidden;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/hiddenServlet3")
public class HiddenServlet3 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String q1 = request.getParameter("q1");
String q2 = request.getParameter("q2");
String q3 = request.getParameter("q3");
String q4 = request.getParameter("q4");
PrintWriter writer = response.getWriter();
writer.write("<br>问题1" + q1);
writer.write("<br>问题2" + q2);
writer.write("<br>问题3" + q3);
writer.write("<br>问题4" + q4);
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
Url
package priv.noby.servlet.url;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/urlServlet")
public class UrlServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
String page = request.getParameter("page");
if (page == null) {
page = "1";
}
writer.write("<p>这是第" + page + "页</p>");
writer.write("<a href='/servlet/urlServlet?page=1'>1</a>");
writer.write("<a href='/servlet/urlServlet?page=2'>2</a>");
writer.write("<a href='/servlet/urlServlet?page=3'>3</a>");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
HTTP 测试
### cookie的创建
GET http://localhost:8080/servlet/cookieNote
### cookie的获取
GET http://localhost:8080/servlet/cookieNote2
### httpServletNote,get
GET http://localhost:8080/servlet/httpServletNote
### httpServletNote,pot
POST http://localhost:8080/servlet/httpServletNote
### requestServlet
GET http://localhost:8080/servlet/requestServletNote
### responseServlet
GET http://localhost:8080/servlet/responseServletNote
### servlet的生命周期
GET http://localhost:8080/servlet/servletNote
### servletContext的写入
GET http://localhost:8080/servlet/servletContextNote
### servletContext的获取
GET http://localhost:8080/servlet/servletContextNote2
### session的写入
GET http://localhost:8080/servlet/sessionNote
### session的获取(可测试sesison的钝化和活化)
GET http://localhost:8080/servlet/sessionNote2