Request和Response,转发和重定向

主要内容:

HttpServletRequest

请求转发

HttpServletResponse

请求重定向

具体内容:

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

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/>");
}

获取参数时的乱码问题

解决方法一

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);

获取请求行的相关信息

 

@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中的数据

例子:

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"));

转发过程图解:

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

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响应消息。

重定向

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

sendRedirect

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

重点:

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

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

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

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中的请求转发重定向都是用于在不同的Servlet之间进行页面跳转的方式,但它们的实现方式和效果是不同的。 请求转发是指在当前Servlet中处理完请求后,将请求转发给另一个Servlet进行处理,转发后的请求由另一个Servlet来产生响应。请求转发的代码如下: ```java RequestDispatcher dispatcher = request.getRequestDispatcher("/b"); dispatcher.forward(request, response); ``` 其中,`/b`是要转发到的Servlet的路径,`request`和`response`是当前Servlet的请求和响应对象,转发后的请求和响应对象也是这两个对象。 请求转发的特点是:转发后的请求和响应对象与原始请求和响应对象是同一个,因此它们可以共享请求和响应的信息,比如请求参数、请求属性等。此外,请求转发是在服务器端完成的,客户端并不知道发生了转发,因此地址栏中的URL不会改变。 重定向是指在当前Servlet中处理完请求后,将请求重定向到另一个Servlet进行处理,重定向后的请求由浏览器重新发起,由另一个Servlet来产生响应。重定向的代码如下: ```java response.sendRedirect("/b"); ``` 其中,`/b`是要重定向到的Servlet的路径,`response`是当前Servlet的响应对象。 重定向的特点是:重定向后的请求和响应对象与原始请求和响应对象是不同的,因此它们不能共享请求和响应的信息。此外,重定向是在客户端完成的,因此地址栏中的URL会改变。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值