1.含义
request:代表请求,在浏览器的地址栏输入地址,点击回车,这个过程称为一次请求
response:代表响应,服务器端根据的请求,返回数据到浏览器中进行显示,这个过程称为一次响应
2. response
1.响应
- 状态码
setStatus(int sc) :设置状态码的方法
response.setStatus(302)
- 响应头
//key-value结构,一个key可以有一个value,一个key也可以有多个value
//第一个参数是响应名称;第二个参数值
setHeader(String name, String value)
//一个key和一个value
setHeader("aa","11");
setHeader("aa","22");//结果:名称 aa ,值 22
//针对特殊的类型,设置头的方法
= setIntHeader(String name, int value) :针对int类型值的方法
= setDateHeader(String name, long date) :值long类型,毫秒数
//一个key和多个value
addHeader("bb","55");
addHeader("bb","66");//结果:名称 bb ,值 55,66
//针对特殊的类型,设置头的方法
= addIntHeader(String name, int value) :针对int类型值的方法
= addDateHeader(String name, long date) :值long类型,是毫秒数
- 响应体
//向页面显示的内容
getWriter():使用字符流向页面输出内容
getOutputStream():使用字节流向页面输出内容
2.重定向
//得到输入的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//根据用户名和密码判断
if("admin".equals(username) && "123456".equals(password)) {
//向页面输出内容
response.getWriter().write("login success");
} else { //重定向到登录页面
//设置状态码
response.setStatus(302);
//使用头Location完成重定向
response.setHeader("Location", "/day08-1/login.html");
}
//重定向的代码简写的方式
response.sendRedirect("要重定向到的页面的路径");
- 定时跳转
response.setHeader("Refresh","在几秒值后跳转;url=要跳转到页面的路径");
//在五秒之后跳转到一个页面
response.setHeader("Refresh", "5;url=/day08-1/login.html");
3.中文乱码
- getOutputStream()
//设置浏览器的编码 使用头信息 Content-Type
response.setHeader("Content-Type", "text/html;charset=utf-8");
//设置字节数组的编码
response.getOutputStream().write("字节流中文".getBytes("utf-8"));
- getWriter()
//post提交,设置response缓冲区的编码
response.setCharacterEncoding("utf-8");
//get提交,设置浏览器的编码
response.setHeader("Content-Type", "text/html;charset=utf-8");
response.getWriter().write("字符流中文");
response.setContentType("text/html;charset=utf-8");
- 字节流和字符流互斥
- 字符流不能直接向页面输出数字
//根据数字到码表中查询数字对应的字符,把字符输出
response.setCharacterEncoding("utf-8");
response.getWriter().write(111);
4.文件下载
//得到要下载文件的路径
String path = getServletContext().getRealPath("/down/a.zip");
//得到文件的名称
//得到最后一个\位置,根据位置进行截取
int lens = path.lastIndexOf("\\");
String filename = path.substring(lens+1);
//设置头信息
response.setHeader("Content-Disposition", "attachment;filename="+filename);
//得到文件的输入流
InputStream in = new FileInputStream(path);
//使用输出流操作
OutputStream out = response.getOutputStream();
//流对接
int len = 0;
byte[] b = new byte[1024];
while((len=in.read(b))!=-1) {
out.write(b, 0, len);
}
//关闭流
in.close();
out.close();
3.request
代表请求的对象,HttpServletRequest接口,父接口是ServletRequest
1.请求行
getMethod() //得到http请求方式
getRequestURI() //得到请求地址(不包含ip+端口号)
getProtocol() //得到http的版本
2.请求头
getHeader(java.lang.String name) //根据名称得到请求头的值
request.getHeader("User-Agent");//获取当前请求的浏览器的类型
3.客户端信息
getContextPath() //请求项目的名称
getRequestURL() //客户端发送的请求的路径
getRemoteAddr() //获取当前客户端的ip地址
4.表单提交
String getParameter(java.lang.String name)
String[] getParameterValues(java.lang.String name)
Map<java.lang.String,java.lang.String[]> getParameterMap() :
Enumeration<java.lang.String> getParameterNames()
5.中文乱码
//post提交方式解决方法
request.setCharacterEncoding("utf-8");
//get提交中文乱码解决
//修改tomcat的配置文件
第1种<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" URIEncoding="utf-8"/>
第2种:把数据先编码,再进行解码
第3种:使用string构造进行编码
username = new String(username.getBytes("iso8859-1"),"utf-8");
6.request作用范围
- servletContext域对象:范围是整个web项目,存值setAttribute方法 和取值getAttribute方法
- request也是一个域对象:范围是一次请求,存值setAttribute(String name, Object o)取值的方法:getAttribute(String name)
- request域对象范围是一次请求,经常和转发一起使用request.getRequestDispatcher(“转发的路径不带项目名称”).forward(..);
request.setAttribute("msg", "hello");
//转发到servlet2
request.getRequestDispatcher("/servlet2").forward(request, response);
//创建servlet2,在servlet2里面获取通过servlet1向request域里面设置的那个值
response.getWriter().write(""+request.getAttribute("msg"));
4.重定向和转发的区别
(1)重定向
重定向请求两次,请求的地址带项目名称
302+Location实现重定向的操作
response.sendRedirect("路径 带项目名称");
(2)转发
转发请求一次,路径不需要带项目名称(在服务器内部进行操作)
request.getRequestDispatcher("转发的路径 不带项目名称").forward(request, response);
(3)重定向:从一个网站到另外的一个网站
转发:请求的过程中需要携带数据操作
//获取表单提交的用户名和密码
String username = request.getParameter("username");
String password = request.getParameter("password");
//判断 用户名 admin,密码 123456
if("admin".equals(username) && "123456".equals(password)) {
//登录成功
response.getWriter().write("login success");
} else { //登录失败
//转发到登录页面,同时向页面传递错误的信息
//把错误信息存到request域里面
request.setAttribute("msg", "用户名或者密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}