Servlet&JSP&Session&Cookie

javaWeb

Java Web

Servlet

一个与平台无关的组件、运行在Servlet容器/Web应用服务器/Tomcat、负责与客户端进行通信

Servlet功能

创建并返回基于客户请求的动态HTML页面
与数据库进行通信

Servlet使用

Servlet本身是一个接口、如果一个类实现了这个接口、则这个类就具备了接受客户端请求及做出响应的功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class MyServlet implements Servlet {

public MyServlet() {
System.out.println("我是无参构造、我创建对象");
}

//初始化Servlet
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("报告后台工作人员、我Servlet已初始化");
}

@Override
public ServletConfig getServletConfig() {
return null;
}

//Servlet执行
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
String id = servletRequest.getParameter("id");
//汉字编码转换
servletResponse.setContentType("text/html;charset=UTF-8");
System.out.println("我已收到你传入的参数:" + id );
servletResponse.getWriter().write("您好用户、我们后台已收到您的反馈、请您耐心等待");
}

@Override
public String getServletInfo() {
return null;
}

//Servlet销毁
@Override
public void destroy() {
System.out.println("报告后台工作人员、我Servlet已经销毁");
}
}

Servlet不能直接访问Servlet文件、只能通过映射方式来访问

  • XML配置映射关系
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.dream.xiaobo.Servlet.MyServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/myServlet</url-pattern>
</servlet-mapping>

</web-app>
  • 注解配置映射关系
1
2
 @WebServlet("/myServlet")
public class MyServlet implements Servlet { }

Servlet生命周期

1、调用init方法完成初始化操作
2、调用service方法完成业务逻辑操作
3、关闭tomcat时、调用destory方法、释放当前对象所占资源

  • 当浏览器访问Servlet时、Tomcat会查询当前Servlet实例化对象是否存在、如果不存在则通过反射机制动态创建对象、如果存在、则直接调用service方法执行业务逻辑操作

Servlet生命周期中方法的执行

无参构造:无参构造只调用一次、创建对象
init:init方法只调用一次、初始化对象
service:service方法被调用N次、执行业务逻辑
destory:destory只调用一次、释放对象

ServletConfig

ServletConfig是一个接口、该接口用来描述Servlet基本信息

ServletConfig中使用方法

getServletName():返回Servlet的名称、全类名
getInitParameter(String key):获取init参数值
getInitParameterNames()返回所有的InitParamter的name值、用于遍历init初始化参数

ServletContext

Servlet的上下文、是个Servlet的管理者

ServletConfig和ServletContext的区别

ServletConfig:作用于某个Servlet实例、每个Servlet都有对应的ServletConfig、局部对象
ServletContext:作用于整个Web应用、一个Web应用对应一个ServletContext、多个Servlet实例对应一个ServletContext、全局对象

Servlet层次结构

Servlet ——> GenericServlet ——> HttpServlet

HTTP常见的请求类型

GET:读取
POST:保存
PUT:修改
DELETE:删除

大致流程描述

GenenricServlet实现Servlet接口、同时为它的子类屏蔽不常用的方法、子类只需重写service方法即可
HttpServlet继承GenericServlet、根据请求类型进行分发处理、GET请求进入doGet方法、POST请求进入doPost方法
所以我们自定义的Servlet只需调用HttpServlet即可

大致工作流程演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
 public class MyGenerisServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {

}
@Override
public ServletConfig getServletConfig() {
return null;
}

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {

}
@Override
public String getServletInfo() {
return null;
}

@Override
public void destroy() {

}
}

public class MyHttpServlet extends MyGenerisServlet {

@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
String method = httpServletRequest.getMethod();
switch (method){
case "GET":
doGet(httpServletRequest,httpServletResponse);
break;
case "POST":
doPost(httpServletRequest,httpServletResponse);
break;
}
}

public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.getWriter().write("GET请求");
}

public void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.getWriter().write("POST请求");
}
}

@WebServlet("/TestServlet")
public class TestServlet extends MyHttpServlet {

@Override
public void doGet(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.setContentType("text/html;charset=UTF-8");
httpServletResponse.getWriter().write("我收到您发的GET请求了");
}

@Override
public void doPost(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) throws IOException {
httpServletResponse.setContentType("text/html;charset=UTF-8");
httpServletResponse.getWriter().write("我收到您发的POST请求了");
}
}

JSP

JSP本质就是一个Servlet、JSP主要负责与用户交互、最终将页面呈现给用户 HTML+CSS+JS+java混合的文件
当服务器接受到一个后缀JSP请求、将请求交给JSP引擎去处理、每一个JSP页面第一次被访问时、JSP引擎会将它翻译成一个Servlet文件、在有Web容器调用Servlet完成响应

JSP脚本、执行Java逻辑代码

<% java代码 %>

JSP声明:定义java方法

<%! 声明方法 %>

JSP表达式:把Java对象直接输出到HTML页面中

<%= java变量 %>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class MyJsp {

private int id;
private String name;
private int age;

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

public MyJsp(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<%@ page import="com.dream.xiaobo.jsp.MyJsp" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>小博来复习JavaWeb了</title>
</head>
<body>
<h1 style="color: red">Hello Java Web</h1>
<table>
<tr style="color: red">
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
List<MyJsp> list = new ArrayList<MyJsp>();
list.add(new MyJsp(1,"小博",21));
list.add(new MyJsp(2,"小张",22));
list.add(new MyJsp(3,"小金",24));
for (int i = 0; i < list.size(); i++) {
%>
<tr style="color: blue">
<td><%=list.get(i).getId()%></td>
<td><%=list.get(i).getName()%></td>
<td><%=list.get(i).getAge()%></td>
</tr>
<%
}
%>
</table>
</body>
</html>

JSP内置对象9个

方法 功能
request 表示一次请求、HttpServletRequest
response 表示一次响应、HttpServletResponse
pageContext 页面上下文、获取页面信息、pageContext
session 表示一次会话、保存用户信息、HttpSession
appliction 表时当前Web应用、全局对象、保存所有用户共享信息、ServletContext
config 当前JSP对应的Servlet的ServletConfig对象、获取当前Servlet的信息
out 向浏览器输出数据、JspWriter
page 当前JSP对应的Servlet对象、Servlet
execption 表示JSP页面发生的异常、Exception

Request常用方法

方法 功能
String getParameter(String key) 获取客户端传来的参数
void setAttribute(String key,Object value) 通过键值对的形式保存数据
Object getAttribute(String key) 通过key取出value
RequestDispatcher gerRequestDispatcher(String path) 返回一个RequestDispatcher对象、该对象的forward方法用于请求转发
String[] getParameterValues() 获取客户端传来的多个同名参数
void setCharacterEncoding(String charset) 指定每个请求的编码

HTTP请求状态码

  • 200: 正常
  • 403:无权限
  • 404:资源找不到
  • 400:请求类型不匹配
  • 500:程序抛出异常

Response常用方法

sendRedirect(String path)重定向、页面之间的跳转

转发和重定向的区别

转发是将同一个请求传给下一个页面
重定向是创建一个新的请求传给下一个页面、之前的请求结束生命周期
转发:同一个请求在服务器之间传递、地址栏不变、服务器跳转
重定向:由客户端发送一次新的请求来访问跳转后的目标资源、地址栏发生改变、客户端跳转

简单实现登录模拟转发和重定向

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>请登录</title>
</head>
<body>
<h1 style="color: aqua">请您登陆</h1>
<form action="/testServlet" method="post">
账号:<input type="text" name="userName" placeholder="请输入账号" /><br>
密码:<input type="text" name="passWord" placeholder="请输入密码" /><br>
<input type="submit" value="登录">
</form>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
@WebServlet("/testServlet")
public class TestServlet extends HttpServlet {

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
if(userName.equals("admin") && passWord.equals("xiaobo")) {
req.getRequestDispatcher("/index.jsp").forward(req,resp);
}else{
resp.sendRedirect("/login.jsp");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<%@ page import="com.dream.xiaobo.jsp.MyJsp" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>小博来复习JavaWeb了</title>
</head>
<body>
<h1 style="color: red">Hello Java Web</h1>
<table>
<tr style="color: red">
<th>编号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
<%
List<MyJsp> list = new ArrayList<MyJsp>();
list.add(new MyJsp(1,"小博",21));
list.add(new MyJsp(2,"小张",22));
list.add(new MyJsp(3,"小金",24));
for (int i = 0; i < list.size(); i++) {
%>
<tr style="color: blue">
<td><%=list.get(i).getId()%></td>
<td><%=list.get(i).getName()%></td>
<td><%=list.get(i).getAge()%></td>
</tr>
<%
}
%>
</table>
</body>
</html>

Session(用户会话)

客户端和服务器之间发生的一系列连续的请求和响应的过程、打开浏览器进行操作到关闭浏览器的过程

会话状态

服务器和浏览器在会话过程中产生的状态信息、借助会话状态、服务器把属于同一次会话的一系列请求和响应关联系起来

实现会话的两种形式

  • Session
  • Cookie

Session常用的方法

方法 功能
String getId() 获取SessionID
void setMaxInactiveInterval(int interval) 设置Session的失效时间、单位为秒
int getMaxInactiveInterval() 获取Session的失效时间
void invalldate() 设置Session立即失效
Object getAttribute(String key) 通过键获取对应的数据
void removeAttribute(String key) 通过键删除对应的数据

Session简单应用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<h1 style="color: red">请登录</h1>
<form action="loginServlet" method="post">
<table style="color: blue">
<tr>
<td>
<input type="text" name="userName" placeholder="请输入用户用" /><br>
</td>
</tr>
<tr>
<td>
<input type="password" name="passWord" placeholder="请输入密码" />
</td>
</tr>
<tr>
<td>
<input type="submit" value="登录" />
<input type="reset" value="重置" />
</td>
</tr>
</table>
</form>

</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class LoginServlet extends HttpServlet {

private String myUserName;
private String myPassWord;

@Override
public void init(ServletConfig config) throws ServletException {
myUserName = config.getInitParameter("userName");
myPassWord = config.getInitParameter("passWord");
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().invalidate();
resp.sendRedirect("login.jsp");
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String userName = req.getParameter("userName");
String passWord = req.getParameter("passWord");
if(userName.equals(myUserName) && passWord.equals(myPassWord)){
HttpSession session = req.getSession();
session.setAttribute("userName", userName);
req.getRequestDispatcher("/index.jsp").forward(req,resp);
}else{
resp.sendRedirect("login.jsp");
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">

<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.dream.xiaobo.session.LoginServlet</servlet-class>

<init-param>
<param-name>userName</param-name>
<param-value>admin</param-value>
</init-param>
<init-param>
<param-name>passWord</param-name>
<param-value>xiaobo</param-value>
</init-param>
</servlet>

<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/loginServlet</url-pattern>
</servlet-mapping>

</web-app>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>首页</title>
</head>
<body>
<h1 style="color: aqua">欢迎来到
<%= request.getSession().getAttribute("userName")
%>
的世界</h1>

<a href="/loginServlet">登出</a>
</body>
</html>

Cookie是服务器端在HTTP响应中附带传给浏览器的一文本文件、一旦浏览器保存某个Cookie、在之后的请求和响应中、会将Cookie来回传递、进而通过Cookie这个载体完成客户端和服务端的数据交互

Cookie创建

1
2
Cookie cookie = new Cookie("name","xiaobo");
resp.addCookie(cookie);

Cookie读取

1
2
3
4
5
6
<%
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies){
out.write(cookie.getName() + "\t" + cookie.getValue() + "</br>");
}
%>

Cookie常用方法

方法 功能
void setMaxAge(int age) 设置Cookie有效时间、单位为秒
int getMaxAge() 获取Cookie的有效时间
String getName() 获取Cookie的name
String getValue() 获取Cookie的value

Session和Cookie的区别

Session

保存在服务器
保存的数据是Object
随着会话的结束而销毁
保存着重要信息

存储用户信息

1
setAttribute("name","xiaobo");
1
getAttribute("name")
  • 生命周期

服务器端:只要Web应用程序关闭、就销毁
客户端:只要关闭浏览器就销毁

  • 退出登录
    invalidate()

保存在浏览器
保存的数据是String
可以长期保存在浏览器中、与会话无关
保存不重要信息

存储用户信息

1
addCookie(new Cookie("name","xiaobo"))
1
2
3
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies){
out.write(cookie.getName() + "\t" + cookie.getValue());
  • 生命周期

服务器端:服务器关闭时Cookie不被销毁
客户端:默认时只要浏览器关闭时就销毁、但是可以通过setMaxAge()方法设置有效期、一旦设置到了有效期就有设置的时间决定什么时候销毁了

  • 退出登录
    setMaxAge(0)
-------------本文结束 感谢您的阅读-------------

本文标题:Servlet&JSP&Session&Cookie

文章作者:小博

发布时间:2021年06月14日 - 22:30

最后更新:2021年06月14日 - 22:46

原始链接:https://codexiaobo.github.io/posts/3563979080/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。