6.Http之HttpServlet

6.3 HttpServlet之Response

在前面,我们学习了HttpServlet中的Request对象,Request对象是对客户端浏览器请求的数据封装,其实本质就是对http请求体的封装

同样,按照http协议的交互模式,一次请求对应一次响应,那么在接收到用户请求之后,服务端要根据客户端的请求做出响应,那么这个响应对象的封装就是Response,也就是对http响应体的封装

设置响应行

  • public void setStatus(int sc) 根据参数名获取参数值

设置响应头

  • public void setHeader(String name, String value) 根据参数名获取参数值

设置响应体

​ 实现步骤

​ 1.获取输出流

​ 字符输出流:public PrintWriter getWriter()

​ 字节输出流:public ServletOutputStream getOutputStream()

​ 2.通过输出流将数据写出

代码演示说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
@WebServlet("/myHttpServlet")
public class MyHttpServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String content = "你好 servlet";
response.setHeader("content-type", "text/html;charset=utf-8");
response.setStatus(HttpServletResponse.SC_OK);
PrintWriter out = response.getWriter();
out.write(content);
out.close();
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String userName = request.getParameter("userName");
String userPassword = request.getParameter("userPassword");
String userAge = request.getParameter("age");

System.out.println(userName);
System.out.println(userPassword);
System.out.println(userAge);
}
}

6.4 请求转发与重定向

对于任何一个业务系统,我们都不可能把所有的请求处理的功能都放在一个Servlet中,根据面向对象设计的理念,我们会把不同的业务请求分散在不同的Servlet中,让多个Servlet之间相互协作来完成整个业务功能

至此,我们涉及到两种多个Servlet间协同调用的方法

  1. 请求转发:客户端一次请求,服务端内部多次跳转
  2. 重定向:关闭当前请求,并发送一个新的url到客户端,客户端使用的新的url进行请求

请求转发

代码演示说明

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet("/myHttpServlet")
public class MyHttpServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/index.html").forward(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

重定向

代码演示说明

1
2
3
4
5
6
7
8
9
10
11
12
13
@WebServlet("/myHttpServlet")
public class MyHttpServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.sendRedirect("index.html");
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

6.4 请求转发中的数据共享

在请求转发过程中,经常需要在多个跳转中进行数据共享

共享数据方法

  • public Object getAttribute(String name) 根据名称获取对应数据
  • public void setAttribute(String name, Object o) 添加共享数据
  • public void removeAttribute(String name) 移除指定名称的数据

7.JSP

7.1 JSP概述

JSP(Java Server Page),java服务器页面,其根本是一个简化的Servlet

它是在传统的HTML上加入了Java代码,从而形成了JSP文件,文件以.jsp为后缀

7.2 JSP指令

JSP指令用于配置JSP页面以及资源文件的导入

指令格式

​ <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 %>

指令分类

  • page
    • contentType:等同于response.setContentType()
    • import:导包
    • errorPage:当前页面异常时,自动跳转到指定页面
  • include:导入其他页面
  • taglib:导入资源

代码演示说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="false" %>
<%@ page import="java.util.Arrays" %>

<%@ include file="index.html" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>Title</title>
</head>
<body>

</body>
</html>

7.3 EL表达式

EL全名Expression Language,表达式语言

主要用于简化和替换jsp页面中java代码

所有的EL表达式都是以${开始以}结束

代码演示说明

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>Title</title>
</head>
<body>
${1 + 2}
${1 > 2}
${2 % 10}
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>Title</title>
</head>
<body>
${1 + 2}
${1 > 2}
${2 % 10}
</body>
</html>

EL运算符

  1. 算术运算符:+、-、 *、 /、 %
  2. 比较运算符:> 、<、 >=、 <=、 !=
  3. 逻辑运算符:&&、||、!
  4. 空运算符:empty

7.4 JSTL标签

jstl(JavaServer Pages Standard Tag Library,JSP标准标签库)

由apche开发的jsp标签,捐献给了sun公司,sun命名为jstl

如何使用jstl

  1. 导入jstl相关jar文件

  2. 在jsp页面引入jstl标签

    <%@taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core" %>

  3. 使用标签

jstl常用标签

  • if
  • choose
  • foreach

if标签

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>Title</title>
</head>
<body>
<c:if test="${1 == 2}">
true
</c:if>
</body>
</html>

choose标签

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>Title</title>
</head>
<body>
<c:choose>
<c:when test="${1 > 2}">
1 > 2
</c:when>

<c:when test="${1 < 2}">
1 < 2
</c:when>

<c:otherwise>
1 == 2
</c:otherwise>
</c:choose>
</body>
</html>

foreach标签

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<html>
<head>
<title>Title</title>
</head>
<body>
<c:forEach var="user" items="${list}">
用户名: ${user.userName}
</c:forEach>
</body>
</html>

8.Session&Cookie

8.1 会话跟踪概述

我们之前说过,http协议是一种无状态的协议,那么客户端每次发起的请求对于服务端来说都是一次新的请求。

在很多时候,我们需要对客户端的会话进行跟踪,这种技术就称之为会话跟踪技术

在java中,实现会话跟踪的技术有两种

  • Session:位于服务端的会话跟踪技术,数据保存在服务端
  • Cookie:位于客户端的会话跟踪技术,数据保存在客户端

8.2 Session会话

代码演示说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@WebServlet("/myHttpServlet")
public class MyHttpServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//在session会话中添加数据
session.setAttribute("currentUser", new User());
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}
}

代码演示说明

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@WebServlet("/myHttpServlet")
public class MyHttpServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
for(Cookie cookie : cookies) {
if("userName".equals(cookie.getName())) {
String userName = cookie.getValue();
System.out.println("userName: " + cookie.getName());
}
}
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.addCookie(new Cookie("userName", "admin"));
response.addCookie(new Cookie("userPassword", "123456"));
}
}

9.Filter过滤器

9.1 Filter入门

过滤器,通常用于特定请求的拦截,通常用于会话验证、统一编码处理等

实现步骤

  1. 自定义类并实现Filter接口
  2. 重写filter方法
  3. 配置拦截路径

代码演示说明

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
@WebFilter("/*")
public class MyFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {

}

@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;

request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");

filterChain.doFilter(request, response);

}

@Override
public void destroy() {

}
}