文章目录
一、Response
开发的软件是B/S结构的软件,可以通过浏览器访问服务器的软件。从浏览器输入一个地址访问服务器(将这个过程称为是请求)。服务器接收到请求,需要进行处理,处理以后需要将处理结果显示回浏览器端(将这个过程称为是响应)。
1.响应行的方法
使用状态码302和location头完成重定向操作
response.sendRedirect() 简化重定向操作的代码
2.响应头的方法
set开头的方法 : 针对一个key对应一个value的情况。
response.setHeader(name, value);
response.setDateHeader(name, date);
response.setIntHeader(name, value);
举例:比如有一个头 content-Type:text/html 执行 setHeader(content-Type" “text/plain”);
最终得到头的结果:content-Type:text/plain
add开头的方法:针对一个 key对应多个value的情况。
response.addHeader(name, value);
response.addIntHeader(name, value);
response.addDateHeader(name, date);
举例:比如有一个content-Type:text/html addHeader("“content-Type"text/plain");
最终得到头的结果:content-Type:text/html,text/plaine
3.响应体的方法
向页面输出
response.getWriter()
response.getOutputStream()
设置浏览器打开页面的字符集
response.setContentType(type);
设置响应字符流缓冲区的字符集
response.setCharacterEncoding(charset);
服务器向浏览器回写cookie的方法
response.addCookie(cookie);
代码演示
ResponseDemo中的方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setStatus(302);//设置状态码
response.setHeader("Location", "/web_test/ResponseDemo1");
//response.sendRedirect("/web_test/ResponseDemo1"); //可以替换上面那两句,实际开发中常用这个方法。
}
运行后结果如下:访问http://localhost:8080/web_test/ResponseDemo
自动跳转到http://localhost:8080/web_test/ResponseDemo1
完成定时刷新跳转的效果:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
response.getWriter().println("5秒后页面跳转!");
response.setHeader("Refresh", "5;url=/web_test/ResponseDemo1");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
运行后确实会跳转
拓展: 一般实现网页跳转可以使用JS的代码去使用,如下:
demo1.html
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="Refresh" content="5;url=/web_test/response/demo2.html">
<title>Insert title here</title>
<script type="text/javascript">
var i = 5;
function load(){
window.setInterval("changeSeconds()",1000);
}
function changeSeconds(){
i--;
document.getElementById("span1").innerHTML=i;
}
</script>
</head>
<body onload="load()">
<h1>demo1</h1>
<h3>页面将在<span id="span1">5</span>秒后跳转到demo2</h3>
</body>
</html>
demo2.html
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>demo2</h1>
</body>
</html>
这样的代码可以实现读秒跳转。
4.解决中文乱码问题
使用字节流响应中文
(中文有可能会乱码)
其实这个乱码的产生与中文转成字节数组及浏览器打开方式(打开的时候采用的默认字符集)有关。
解决:将中文转成字节数组的时候和浏览器默认打开的时候采用的字符集一致即可。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ResponseDemo2 extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletOutputStream sos = response.getOutputStream();
response.setHeader("Content-Type", "text/html;charset=UTF-8");//设置浏览器默认打开的时候采用的字符集
sos.write("任何浏览器,中文都不会乱码".getBytes("UTF-8"));//设置中文转成字节数组字符集编码
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
使用字符流响应中文
一定乱码
原因:字符流是有缓冲区的,response获得字符流,response设计默认的缓冲区编码是ISO-8859-1。这个字符集不支持中文的。
解决:设置response获得字符流缓冲区的编码和设置浏览器默认打开时候采用的字符集一致即可。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-Type", "text/html;charset=UTF-8");//设置浏览器默认打开的时候采用的字符集
response.setCharacterEncoding("UTF-8");//设置response获得字符流的缓冲区的编码
response.getWriter().println("任何浏览器,中文都不会乱码");
}
字符流向页面响应中文,有一种简化的方式:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");//一句顶两句
response.getWriter().println("任何浏览器,中文都不会乱码");
}
二、Request
开发的软件都是B/S结构软件,从浏览器向服务器提交一些数据,将这些内容进行封装就封装成了一个请求对象( Request对象)。
1.获得客户机信息
获得请求方式:
request.getMethod()
获得请求路径后的提交参数的字符串
request.getQueryString()
获得请求路径的URI和URL
request.getRequestURI()
request.getRequestURL()
获得客户端的IP地址
request.getRemoteAddr()
2.获得请求头的方法
request.getHeader(name) 获得一个key对应一个请求头的
request.getHeaders(name) 获得一个key对应多个请求头的
3.获得请求参数的方法
request.getParameter(name) 一个name对应一个value
request.getParameterMap() 获得提交的参数,将提交的参数的名称和对应的值存入到一个Map集合中
request.getParameterValues(name) 一个name对应多个value
4.Request作为域对象存取数据的方法
request.setAttribute(name, o) 从request域中存储数据
request.getAttribute(name) 从request域中获得数据
request.removeAttribute(name) 从request域中移除数据
代码演示
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("请求方式:"+request.getMethod());
System.out.println("客户机IP地址:"+request.getRemoteAddr());
System.out.println("请求参数的字符串:"+request.getQueryString());
System.out.println("请求路径的URL:"+request.getRequestURL());
System.out.println("请求路径的URI:"+request.getRequestURI());
//获得请求头信息
System.out.println("获得客户机浏览器类型:"+request.getHeader("User-Agent"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
运行后,如下图:
5.接收表单请求参数
关于表单中文会乱码的原因如下:
get方式提交。
产生乱码原因 : get方式提交的数据在请求行的url后面,在地址栏上其实就已经进行了一次URL的编码了。
解决方案 : 将存入到request缓冲区中的值以ISO-8859-1的方式获取到,以UTF-8的方式进行解码。
post方式提交。
post产生乱码的原因 : post方式提交的数据是在请求体中,request对象接收到数据之后,放入request的缓冲区中。缓冲区就有编码(默认IS0-8859-1)不支持中文)
解决方案 : 将request的缓冲区的编码修改了即可。
代码实现:
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RequestDemo1 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//request.setCharacterEncoding("UTF-8");//适用于post方式提交,解决中文乱码
String name = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String city = request.getParameter("city");
String[] hobby = request.getParameterValues("hobby");
String uninfo = request.getParameter("info");
//使用get方式提交表单数据进行解码
String encode = URLEncoder.encode(name,"ISO-8859-1");
String username = URLDecoder.decode(encode,"UTF-8");
//以下方式更加简单,对get方式提交一种优化
//String username = new String(name.getBytes("ISO-8859-1"),"UTF-8");
String info = new String(uninfo.getBytes("ISO-8859-1"),"UTF-8");
System.out.println("用户名:"+username);
System.out.println("密码:"+password);
System.out.println("性别:"+sex);
System.out.println("籍贯:"+city);
System.out.println("爱好:"+Arrays.toString(hobby));
System.out.println("自我介绍:"+info);
//使用map
//以下内容未解码,所以中文会乱码
Map<String, String[]> map = request.getParameterMap();
for (String key : map.keySet()) {
String[] value = map.get(key);
System.out.println(key+" "+Arrays.toString(value));
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
运行如下图: