request&response

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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值