欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Request和Response,转发和重定向

程序员文章站 2022-04-20 22:20:35
...

主要内容:

HttpServletRequest

请求转发

HttpServletResponse

请求重定向

具体内容:

每次请求service()方法,都会由容器创建一个新的对象

Request和Response,转发和重定向

Servlet对象的比较

Request和response在每一次访问时都被创建。由容器创建的

Serlvet只会被创建一次,由用户来开发,由容器来创建,单一的实例。

ServletConfig会为每一个Servlet创建一个Config对象,且由Servlet维护。就是声明成了成员变量。

ServletContext对象,是这一个项目就只有一个此对象。

HttpServletRequest 简介

Servlet API 中定义的 ServletRequest 接口类用于封装请求消息。

HttpServletRequest 是专用于HTTP协议的ServletRequest 子接口,它用于封装 HTTP 请求消息。

service() 方法内部调用 HttpServletRequest 对象的各种方法来获取请求消息。

Request功能

接收用户的参数

接收用户的所有请求头信息

转发、包含

做为域对象也可以存放数据

接收用户的参数

getParameter(String)方法

  根据名字获取一个参数,返回类型为String

getParameterValues (String)方法

  根据名字获取一组相关的数据,返回类型为String[]

getParameterNames ()方法

  获取所有参数的名字,返回类型为Enumeration

getParameterMap ()方法

  获取所有数据,,返回类型为Map

例子:

<form action="one" method="post">
  姓名:<input type="text" name="name"><br>
  爱好:<input type="checkbox" name="hobby" value="read">读书
       <input type="checkbox" name="hobby" value="football">足球
       <input type="checkbox" name="hobby" value="run">跑步 <br>
  性别:<input type="radio" name="sex" value="male">男
       <input type="radio" name="sex" value="female">女<br>
  <input type="submit" value="提交">
</form>
// 获取名字<input type="text" name="name">的值
String name = req.getParameter("name");
// 爱好<input type="checkbox" name="hobby" value="read">
String[] hobbys = req.getParameterValues("hobby");
// 性别<input type="radio" name="sex" value="male">
String sex = req.getParameter("sex");
// 显示到页面上
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("你叫:" + name + "<br/>");
out.print("你的爱好是:<br/>");
for (String h : hobbys) {
  out.print(h + "<br/>");
}
out.print("你的性别是:" + sex + "<hr/>");
// 使用getParameterNames()获取所有参数名字
Enumeration<String> names = req.getParameterNames();
while (names.hasMoreElements()) {
String nm = (String) names.nextElement();
  out.print("获取到的名字:" + nm + "<br/>");
}
out.print("<hr/>");

// 使用getParameterMap()获取所有数据
Map<String, String[]> map = req.getParameterMap();
for (Entry<String, String[]> en : map.entrySet()) {
  out.print(en.getKey() + "<br>");
  String[] vs = en.getValue();
  for (String str : vs) {
    out.print(str + "<br>");
  }
  out.print("<hr/>");
}

获取参数时的乱码问题

Request和Response,转发和重定向

解决方法一

String name = req.getParameter("name");//目前获取到的是iso-8859-1的编码
byte[] bs = name.getBytes("iso-8859-1");//根据iso-8859-1获取字节码
String name1 = new String(bs,"utf-8");//根据utf-8编码,重新组成新字符串
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("姓名是:" + name1 + ",原来的是"+name);

解决方法二

req.setCharacterEncoding("utf-8");// 只能post类型有效
String name = req.getParameter("name");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
out.print("姓名是:" +name);

获取请求行的相关信息

Request和Response,转发和重定向

 

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  resp.setContentType("text/html;charset=uTF-8");
  PrintWriter out = resp.getWriter();
  out.print("请求类型:"+req.getMethod()+"<br/>");
  out.print("请求协议:"+req.getProtocol()+"<br/>");
  out.print("请求地址:"+req.getRequestURI()+"<br/>");
  out.print("你的ip:"+req.getRemoteAddr()+"<br/>");
  out.print("请求:"+req.getQueryString()+"<br/>");
  out.print("请求主机:"+req.getHeader("Host")+"<br/>");
  out.print("请求来自哪里:"+req.getHeader("Referer")+"<hr/>");
  //以下获取所有头信息
  Enumeration<String> en = req.getHeaderNames();
  while(en.hasMoreElements()){
    String key = en.nextElement();
    out.print(key+"=="+req.getHeader(key)+"<br/>");
  }
}

Request和Response,转发和重定向

Request和Response,转发和重定向

转发:

转发:是将请求在服务器内部交给另一个组件再去执行,同时共享request中的数据

Request和Response,转发和重定向

例子:

req.setAttribute("name", "Jack"+new Random().nextInt(100));
// 通过request获取RequestDispatcher
// 以 "/" 开始是指 项目的上下文根, http://127.0.0.1:8081/Servlet03 里面的 '/Servlet03’  
RequestDispatcher rd = req.getRequestDispatcher("/sb");
// 执行转发
rd.forward(req, resp);
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("这是servletB....."+req.getAttribute("name"));

转发过程图解:

Request和Response,转发和重定向

n包含:是将另一个组件的执行结果包含到自己的响应结果中 

Request和Response,转发和重定向

req.setAttribute("name", "山东济宁");
out.print("这是第一个ServletA<br/>");
req.getRequestDispatcher("/sd").include(req, resp);
out.print("这是第一个ServletA执行完成了<br/>");
out.print("这是第二个ServletB,"+req.getAttribute("name")+"<br/>");

HttpServletResponse简介

Servlet API中定义的ServletResponse接口类用于创建响应消息。

HttpServletResponse是专用于HTTP协议的ServletResponse子接口,它用于封装HTTP响应消息。

Request和Response,转发和重定向

Request和Response,转发和重定向

重定向

请求重定向:指的是一个web资源受到客户端请求后,通知客户端去访问另外一个web资源

Request和Response,转发和重定向

sendRedirect

使用方法:response.sendRedirect(路径)

Request和Response,转发和重定向

重点:

请求转发和重定向:
本质区别:请求转发只发送了一次请求,重定向发了两次请求
1)请求转发:地址栏还是初次请求的地址栏
       重定向:地址栏不再是第一次请求的地址,地址栏为最后一次请求的地址
2)请求转发:在最终的servlet中,request对象和中转的request对象是同一个对象
     重定向:在最终的servlet中,request对象和中转的request对象是不是同一个对象
3).请求转发:/代表的是当前web应用的根目录   http://localhost:8080/Servlet02--》这是web应用根目录
   重定向:/代表的是当前web站点的根目录  http://localhost:8080---》这是web站点
4)请求转发:只能转发到当前web应用
   重定向:可以重定向到外部资源

5)转发时请求的类型不变

重定向时 的被调用者的请求类型只能是get