服务端技术|request和response

第一章 request&response对象

1.1. 简介

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象

request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了。要向客户机输出数据,只需要找response对象就行了

第二章 HttpServletRequest

HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息。

2.1. 常用操作:

通过Request对象进行的常用操作

获取客户机信息

获取请求头信息

获取请求参数

利用请求域传递对象

转发

2.2. 常用方法:

img

3.3. request获取客户机信息

案例:

1
2
3
4
5
6
7
8
9
10
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

// 获得客户机iP
String remoteAddr = request.getRemoteAddr();
System.out.println("IP:" + remoteAddr);
//获取项目的虚拟目录名称
String contextPath = request.getContextPath();
System.out.println("项目路径:"+contextPath);
}

2.4. request获取请求头信息

2.5. request获取请求参数

2.6. 案例:完成用户登录功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录界面</title>
</head>
<body style="text-align: center">
<h3>登录界面</h3>
<form action="/JavaWebDay03/LoginServlet">
<br> 账号<input type="text" name="username"><br> <br>
密码<input type="password" name="password"><br> <br> <input
type="submit" value="登录"><br> <br>
</form>
</body>
</html>

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
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
67
68
69
70
package cn.yueqian.homework;

import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;

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 cn.yueqian.util.JDBCUtils;

/**
* Servlet implementation class LoginServlet
*/
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
//得到用户输入的信息
String username = request.getParameter("username");
String password = request.getParameter("password");
//编写sql语句
String sql = "select * from user where username=?";
//处理占位符
String str[] = {username};
//1.将用户名拿到数据库查询
ResultSet rs = JDBCUtils.executeQuery(sql, str);

try {
//如果:rs.next为true,说明有这个用户
if(rs.next()) {
//得到数据库中的密码
String password_db = rs.getString("password");
//如果有这个用户,将客户端输入的密码与数据库中的密码比较
if(password.equals(password_db)) {
System.out.println("登录成功");
response.getWriter().append("<h1>登录成功</h1>");
}else {
System.out.println("密码错误");
response.getWriter().append("<h1>密码错误</h1>");
}

}else {
//没有这个用户
System.out.println("没有这个用户");

response.getWriter().append("<h1>没有这个用户</h1>");
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}


}

protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

2.7. request利用请求域传递对象

将对象放到request域中:

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
@WebServlet("/Servlet3")
public class Servlet3 extends HttpServlet {
private static final long serialVersionUID = 1L;

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建一个用户对象
User user = new User("张三", "123456");
//将对象放到request域中
request.setAttribute("user", user);
//转发到另一个Servlet4:
request.getRequestDispatcher("Servlet4").forward(request, response);
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}


//转发过后获取数据;
@WebServlet("/Servlet4")
public class Servlet4 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收servlet3传递过来的数据
User user =(User) request.getAttribute("user");
System.out.println("传递过来的数据是:"+user);
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}

}

重定向:response.sendRedirect(“/myDemo2/jsp/index.jsp”);

2.8. 转发重定向简介

第三章 HttpServletResponse

HttpServletResponse对象服务器的响应。这个对象中封装了向客户端发送数据、发送响应头,发送响应状态码的方法。

3.1. response 代码案例

重定向(登陆页面

页面定时刷新(页面读秒操作)

禁用浏览器缓存(三个头信息)

向页面输出中文(乱码问题)

实现文件下载l 实现验证码

3.2. response 指定状态码&头信息

状态码(Status Code)

setStatus(int)

常用状态码:200、302、304、404、500

头信息 (Header Info)

addHeader(String,String) 在原有值添加

setHeader(String,String) 替换原有值

3.3. response状态码和头信息应用

通过response实现请求重定向。

请求重定向指:一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向

302+Location —— response.sendRedirect

案例:用户登陆时,用户名密码错误,重定向回登陆页面

3.4. 发送http头,控制浏览器定时刷新网页(refresh)

用mate标签完成:

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
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="refresh" content="5;/JavaWebDay03/login.html">

<title>定时刷新</title>

</head>
<body>
在开发中,meta标签可以模拟响应操作,
<span id="spanId">5</span> 秒后跳到登录界面


</body>
<script type="text/javascript">
var x = 5;
/*定义一个方法 */
function run(){
//获得span的id
var span = document.getElementById("spanId");
span.innerHTML = x;
x--;
//隔一秒执行一次
var time = setTimeout("run()", 1000);
if(x=="0"){
time.clean();
}
}
run();
</script>
</html>

3.5. Response禁用缓存

发送http头,控制浏览器禁止缓存当前文档内容

向页面输出时间,使用IE浏览器查看效果。

设置三个Http头信息禁用浏览器缓存

Cache-Control : no-cachel Pragma : no-cache

Expires: Thu, 01 Dec 1994 16:00:00 GMT (非常特殊,转换特定日期格式才可以 -1)

3.6. Response向页面输出中文

字节流输出中文

乱码和浏览器的编码有关

设置浏览器默认打开的时候的编码集

获得字节数组的时候,传入一个编码集

字符流输出中文

response的字符流的缓冲区是ISO-8859-1编码.

设置response缓冲区的编码.

设置浏览器的默认打开的时候字符集编码.

3.7. 注意事项:

img

3.8. Response文件下载

3.9. 输出验证码图片

步骤:

1.在内存中生成图片可以使用BufferedImage对象该对象可以获取画笔对象getGraphics()

2.随机生成字母或数字可以使用Random对象

3.把生成的数字或字母写在图片上通过画笔中的方法

4.把图片生成到页面上可以使用ImageIO对象

第四章 请求重定向和请求转发的区别 (面试题)

RequestDispatcher.forward方法只能将请求转发给同一个WEB应用中的组件;而HttpServletResponse.sendRedirect 方法还可以重定向到同一个站点上的其他应用程序中的资源,甚至是使用绝对URL重定向到其他站点的资源。
如果传递给HttpServletResponse.sendRedirect 方法的相对URL以“/”开头,它是相对于服务器的根目录;如果创建RequestDispatcher对象时指定的相对URL以“/”开头,它是相对于当前WEB应用程序的根目录。
调用HttpServletResponse.sendRedirect方法重定向的访问过程结束后,浏览器地址栏中显示的URL会发生改变,由初始的URL地址变成重定向的目标URL;调用RequestDispatcher.forward 方法的请求转发过程结束后,浏览器地址栏保持初始的URL地址不变。
HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。
RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。