By
zhpooer
更新日期:
HttpServletResponse
- 给客户处发出信息
- 由容器创建
- response.getOutputStream 和 response.getWriter 如果没有手动关 系统会自动关
1
2
3
| setStatus(int stauts);
addHeader();
setHeader();
|
输出响应正文: 中文
Response的字节流和字符流不能在一个Servlet中同时使用
字节流输出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| String data = "上海创智播客"
ServletOutputStream out = res.getOutputStream()
byte b[] = data.getBytes()
// byte b[] = data.getBytes("utf-8")
// 方式一
res.setHeader("Content-Type", "text/html;chaset=UTF-8")
// 方式二
out.write("<meta http-equiv='Content-Type' content='text/html;charset=UTF-8'>")
// 方式三
res.setContentType("text/html;charset=UTF-8")
out.write(b)
|
字符流输出
1
2
3
4
5
6
7
8
9
10
| String s = "中文";
res.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
res.setContentType("text/html;charset=UTF-8");
PrintWriter out = res.getWriter();
out.write(s);
|
中文文件的下载
1
2
3
4
5
6
7
8
9
10
11
12
13
| String path = getServletContext().getRealPath("/WEB-INF/classes/中文.jpg")
String filename = path.substring(path.lastIndexOf("//") + 1)
// 重点!!!
res.setHeader("Content-Disposition", "attachment:filename=" + URLEncoder.encode(filename, "UTF-8")+".jpg")
OutputStream out = res.getOutputStream()
InputStream in = new FileInputStream(path)
byte b[] = new byte[1024]
int len = -1
while((len=in.read(b))!=-1){
out.write(b, 0, len)
}
in.close()
out.close()
|
画验证码图片
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
| int width = 120
int height = 25
BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB)
// 画边框和背景
Graphics g = img.getGraphics()
g.setColor(Color.BLUE)
g.drawRect(0, 0, width, height)
g.setColor(Color.YELLOW)
g.fillRect(1, 1, width-2, height-2)
// 画干扰线
g.setColor(Color.GRAY)
Random r = new Random()
for( int i=0
g.drawLine(r.nextInt(width), r.nextInt(height), r.nextInt(width), r.nextInt(height))
// 画验证码
g.setColor(Color.RED)
g.setFont(new Font( "宋体", Font.BOLD|Font.ITALIC , 18))
int x = 18
for (int i=0
g.drawString(r.nextInt(10) + "", x, 20)
x += 22
}
ImageIO.write(img, "jpg", res.getOutputStream())
|
1
2
3
4
5
|
function (){
var imgObj = document.getElementById("img");
imgObj.src = "/ResponseDemo?" + new Date().getTime();
}
|
定时刷新
1
2
| res.setIntHeader("Refresh", 2);
res.setHeader("Refresh", "2;URL=/url");
|
控制资源的缓存时间
1
2
3
4
| res.setContentType("text/html;charset=UTF-8")
// 过期的时间 + 单位是毫秒
res.setDateHeader("Expires", System.currentTimeMillis() + 1*1000*60*60)
res.getWriter().write("我爱北京天安门")
|
HttpServletRequest
- 获取客户端带给服务器的信息
- 由容器创建
常用方法
1
2
3
4
5
6
7
| req.getRequestURL()
req.getRequestURI()
req.getQueryString()
req.getRemoteAddr()
req.getRemotePort()
req.getMethod()
req.getProtocol()
|
获取请求消息头
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| res.setContentType("text/html;charset=UTF-8")
PrintWriter out = res.getWriter()
// 获取单一的消息头
out.println( req.getHeader("Accept-Encoding") )
// 获取重名的消息头值
Enumeration<String> em = req.getHeaders("Accept-Encoding")
while(em.hasMoreElements()){
out.println(em.nextElement())
}
// 获取请求消息头的内容
Enumeration<String> en = req.getHeaderNames()
while(en.hasMoreElements()){
out.println( req.getHeader(en.nextElement()) )
}
|
获取客户端提交过来的请求参数
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
|
req.getParameter("username");
String ps[] = req.getParameterValues("");
Enumeration<String> names= req.getParameterNames();
while(names.hasMoreElements()) {
req.getParameterValues(names.nextElement());
}
Person p = new Person();
Enumeration<String> names= req.getParameterNames();
while(names.hasMoreElements()){
String paramName = names.nextElement();
String[] values = req.getParameterValues(paramName);
PropertyDescriptor pd = new PropertyDescriptor(paramName, Person.class);
Method m = pd.getWriteMethod();
if(values!=null && values.length() == 1){
m.invoke(pd, values);
}else {
m.invoke(pd, new Object[] (values));
}
}
Map<String, String[]> map = req.getParameterMap();
for(Entry<String, String[]> me: map.entrySet()){
BeanUtils.setProperty(p, me.getKey(),me.getValue());
}
BeanUtils.populate(p, req.getParameterMap());
|
各种表单输入域的获取
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
| <body>
<form action="/HelloServlet" method="post">
<input name="id" value="436" type="hidden"/>
<table border="1">
<tr>
<td>姓名: </td>
<td> <input type="text" name="name"/> </td>
</tr>
<tr>
<td>密码 </td>
<td> <input type="password" name="password"/></td>
</tr>
<tr>
<td>性别 </td>
<td>
<input type="radio" name="gender" value="0"/>
<input type="radio" name="gender" value="1"/>
</td>
</tr>
<tr>
<td>已婚 </td>
<td>
<input type="checkbox" name="married"/>
</td>
</tr>
<tr>
<td>爱好 </td>
<td>
<input type="checkbox" name="hobby" value="eat"/>
<input type="checkbox" name="hobby" value="sleep"/>
<input type="checkbox" name="hobby" value="java"/>
</td>
</tr>
<tr>
<td> 省份 </td>
<td>
<select name="province">
<option value="SH">上海 </option>
<option value="BJ">北京 </option>
</select>
</td>
</tr>
<tr>
<td> 简介 </td>
<td>
<textarea rows="3" cols="23" name="description"> </textarea>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit"/>
<input type="reset"/>
</td>
</tr>
</table>
</form>
<script type="text/javascript">
function regist(){
var nameInput = document.getElementById("name");
if(nameInput.value==""){
alert("请输入正确名称");
return false;
}
document.forms[0].submit();
}
</script>
</body>
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| public class Student {
private int id;
private String name;
private String password;
private String gender;
private boolean married;
private String[] hobby;
private String province;
private String descriptioin;
}
public void doGet(res, req){
Student s = new Student();
BeanUtils.populate(s, request.getParameterMap());
}
|
input type=text 这样的输入域, 用户没有输入值, 服务器得到的是空字符串
type=radio/checkbox 用户没有输入值, 服务器得到的是null
中文请求的转码
浏览器以当前编码发送中文字符串到服务器,服务器默认会以 ISO8859-1 编码来解码
如果客户端按照get方式发送请求, 我们只能手工进行指定字符集编码
1
2
3
4
|
String str = req.getParameter("username").getBytes("ISO8859-1");
String uname = new String(str, "utf-8");
|
如果客户端按照post方式发送请求, 设置请求对象的字符集
1
2
3
| // 设置查询码表
req.setCharacterEncoding("utf-8")
req.getParameter("username")
|
request域对象
1
2
3
4
5
|
request.setAttribute("p", "pp");
request.getAttribute("p");
|
请求重定向
- 地址栏会变
- 发两次请求
- 跨服务器
- 会发 302, Location
1
2
3
4
5
| // 方式一
res.setStatus(302)
res.setHeader("Location", "www.sina.com")
// 方式二
res.sendRedirect("www.sina.com")
|
转发
- 服务器的行为
- 发一次请求
- 地址栏不变
1
2
3
4
5
6
7
8
9
10
| req.setCharacterEncoding("utf-8")
String userName = req.getParameter("username")
req.setAttribute("", "")
// 获取RequestDispatcher, 用于实现请求转发
// 将数据进行向下传递
// 方式一: 转发的路径必须以斜线开头, "/"
getServletContext().getRequestDispatcher("/servleturl").forward(req, res)
// 方式二: 转发的路径可以以斜线开头, 可以不以斜线开头, 表示相对路径
req.getRequestDispatcher("").forward(req, res)
|
请求包含
RequestDispatcher: 请求分发器
- 实现转发, 源 -> 目标
- 实现包含, 目标 -> 源
1
2
3
4
5
6
7
8
9
10
11
12
|
// Servlet1
response.setContentType("text/html;charset=UTF-8")
PrintWriter out = res.getWriter()
out.write("我喜欢")
RequestDispatcher rd = request.getRequestDispatcher("Servlet2")
rd.include(req.res)
// Servlet2
response.setContentType("text/html;charset=UTF-8")
PrintWriter out = res.getWriter()
out.write("你")
|
各种URL地址的写法
重定向: responst.sendRedirect()
转发: request.getRequestDispatcher()
超连接: <a ref=""/>
表单: <form action=""/>