目录
- HttpServletResponse
- 操作响应行
- 设置响应状态码
- 操作响应头
- 重定向
- 刷新
- 操作响应正文
- 改变服务器使用的字符集
- 告诉浏览器需要使用什么字符集解码
- 获得字节输出流( ServletOutputStream getOutputStream() )
- 获得字符输出流( PrintWriter getWriter() )
- 操作响应行
- HttpServletRequest
- 请求消息行
- 路径获取
- 获取请求头的信息
- 获取请求头的信息
- 获取请求头所有信息
- 获取请求头同一属性的所有值
- 请求正文
- 设置post表单提交数据的解码字符集
- 处理表单数据
- String getParameter(String name)
- String[] getParameterValues(String name)
- Map<String, String[]> getParameterMap()
- 域对象:request
- 操作request维护的Map
- 利用request完成请求转发
- 请求转发与重定向的区别
- 请求消息行
<一> HttpServletResponse
注:本篇文章仅仅分析常用方法,所有内容可以参考JAVA EE API
1> 操作响应行
- 设置响应状态码
|-response.setStatus(int sc) 设置相应状态码
|-SC_INTERNAL_SERVER_ERROR 500
|-SC_METHOD_not_ALLOWED 405
|-未重写doGet、doPost自动抛出
|-SC_NOT_FOUND 404
|-SC_OK 200
2> 操作响应头
- 重定向
- 覆盖设置响应头键值
- refresh刷新
- refresh重定向
- location重定向
|-响应头:
sendRedirect(String location)
setHeader(String name,String value)
|-覆盖
addHeader(String name,String value)
|-添加
setIntHeader(String name,int value)
3> 操作响应正文
- 改变服务器使用的字符集
- 告诉浏览器需要使用什么字符集解码
|-告诉服务器使用UTF-8字符集解析数据
|-response.setCharacterEncoding("UTF-8");
|-浏览器解析错误,因为浏览器默认编码错误,需要告诉浏览器使用指定编码解析
|-response.setHeader("content-type","text/html;charset=UTF-8");
|-上述两个操作被封装进一个方法
|-response.setContentType("text/html;charset=GBK");
|-写错会变成下载文件
- 获得字节输出流( ServletOutputStream getOutputStream() )
ServletOutputStream sos = response.getOutputStream();
//示例(输入输出流)
//通过全路径获取字节输入流
String path = this.getServletContext().getRealPath("/img/a.jpg");
FileInputStream fis = new FileInputStream(path);
//创建一个字节输出流
ServletOutputStream sos = response.getOutputStream();
//通过全路径获取文件名并URL化
String filename = path.substring(path.lastIndexOf("\\")+1);
filename = URLEncoder.encode(filename,"UTF-8");
- 获得字符输出流( PrintWriter getWriter() )
response.getWriter()
<二> HttpServletRequest
1> 请求消息行
getMethod() 获取请求方式: GET
getRequestURL() 获取全路径: http://localhost/day0523_servlet/servlet/demo7
getRequestURI() 获取资源名部分: /day0523_servlet/servlet/demo7
getContextPath() 获取当前应用名: /day0523_servlet
getQueryString() 获取请求行的参数部分
2> 获取请求头的信息
String getHeader(String name)
Enumeration getHeaderNames()
- 获取浏览器类型
private void checkBrowserType(HttpServletRequest request) {
String userAgent = request.getHeader("User-Agent");
//Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18363
System.out.println(userAgent);
if(userAgent.toLowerCase().contains("firefox")){
System.out.println("访问浏览器类型:Firefox");
}else if(userAgent.toLowerCase().contains("edge")){
System.out.println("访问浏览器类型:Microsoft Edge");
}else if(userAgent.toLowerCase().contains("chrome")){
System.out.println("访问浏览器类型:Chrome");
}else if(userAgent.toLowerCase().contains("safari")){
System.out.println("访问浏览器类型:Safari");
}else{
System.out.println("访问浏览器类型:其他");
}
}
- 获取请求头所有信息
/**
* 打印请求头所有信息于Tomcat控制台
* @param HttpServletRequest request
*/
private void printAllHeaderInfo(HttpServletRequest request) {
Enumeration<String> headerNames = request.getHeaderNames();
while(headerNames.hasMoreElements()){
String e = headerNames.nextElement();
System.out.println(e+":"+request.getHeader(e));
}
// host:localhost
// user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:76.0) Gecko/20100101 Firefox/76.0
// accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
// accept-language:zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
// accept-encoding:gzip, deflate
// connection:keep-alive
// upgrade-insecure-requests:1
}
- 获取请求头同一属性的所有值
- accept-language为例
/**
* 获取请求头同一属性的所有值
* accept-language:
* 浏览器支持的语言类型,逗号分隔,q表示权重系数[0,1]
* @param request
*/
private void printHeaders(HttpServletRequest request) {
Enumeration<String> headers = request.getHeaders("accept-language");
//结果: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
while (headers.hasMoreElements()) {
String e = headers.nextElement();
System.out.println(e);
}
String lang = request.getHeader("accept-language");
String[] langs = lang.split(",");
for(String i:langs){
System.out.println(i);
}
}
3> 请求消息正文(处理post方式提交的表单)
- 设置post表单提交数据的解码字符集
- request.setCharacterEncoding("UTF-8");
- String getParameter(String name)
- String[] getParameterValues(String name)
- Map<String, String[]> getParameterMap()
private void dealForm1(HttpServletRequest request) {
try {
User u = new User();
Map<String, String[]> parameterMap = request.getParameterMap();
for(Map.Entry<String, String[]> m:parameterMap.entrySet()){
String name = m.getKey();
String[] value = m.getValue();
//JavaBean内省机制
PropertyDescriptor pd = new PropertyDescriptor(name,User.class);
Method settler = pd.getWriteMethod();
if(value.length==1){
settler.invoke(u, value[0]);
}else{
settler.invoke(u, (Object)value);
}
}
System.out.println(u);
} catch (Exception e) {
e.printStackTrace();
}
}
private void dealForm2(HttpServletRequest request) {
//使用BeanUtils包
//BeanUtils.populate(Object,Map<String,? extends Object>)
//http://commons.apache.org/proper/commons-beanutils/download_beanutils.cgi
//http://commons.apache.org/proper/commons-logging/download_logging.cgi
User u = new User();
try {
BeanUtils.populate(u,request.getParameterMap());
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
System.out.println(u);
}
register.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/day0525_servlet/servlet/demo1" method="post">
用户名:<input type="text" name="username"/><br/>
密码<input type="text" name="password"/><br/>
性别:<input type="radio" name="sex" value="male" checked="checked"/>男
<input type="radio" name="sex" value="female" checked="checked"/>女<br/>
爱好:<input type="checkbox" name="hobby" value="music" checked="checked"/>音乐
<input type="checkbox" name="hobby" value="book"/>阅读
<input type="checkbox" name="hobby" value="file"/>电影<br/>
城市:<select name="city">
<option>-----请选择-----</option>
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="gz">广州</option>
</select>
<br/>
<input type="submit" value="注册"/>
<br/>
</form>
</body>
</html>
4> 域对象:request
- 操作request维护的Map
- 利用request完成请求转发
注:其内部维护着一个Map集合,可以通过setAttribute、getAttribute、removeAttribute进行操作;
- 请求转发与重定向的区别
请求转发:在服务器端完成(可以传递数据:request维护的Map)
上述的“欢迎!”会被显示在demo2 页面中
重定向:在客户端完成(意味着可以跳转到其他互联网页面:http://www.baidu.com)
上述的“欢迎!”会被显示在demo3 页面中(意味着打开了两次网页)
response.sendRedirect("/day0525_servlet/servlet/demo2");
response.setStatus(302);
//response.sendRedirect(request.getContextPath()+"/servlet/demo3");
response.sendRedirect("http://www.baidu.com");