上篇文章我们讲了servlet的基本原理,这章将讲一下剩余的部分。

HttpServletRequest 接口

  该接口是 ServletRequest 接口的子接口,封装了 HTTP 请求的相关信息,由 Servlet 容器创建其实现类对象并传入 service(ServletRequest req, ServletResponse res)方法中。我们请求的详细信息都可以通过 HttpServletRequest 接口的实现类对象获取。这个实现类对象一般都是容器创建的,我们不需要管理。

HttpServletRequest 主要功能

获取请求参数

1)什么是请求参数?

请求参数就是浏览器向服务器提交的数据

2)浏览器向服务器如何发送数据

  a)附在 url 后面,如:http://localhost:8989/MyServlet/MyHttpServlet?userId=20

  b)通过表单提交

<form action="MyHttpServlet" method="post">
你喜欢的足球队<br /><br />
巴西<input type="checkbox" name="soccerTeam" value="Brazil" />
德国<input type="checkbox" name="soccerTeam" value="German" />
荷兰<input type="checkbox" name="soccerTeam" value="Holland" />
<input type="submit" value="提交" />
</form>

3)使用HttpServletRequest对象获取请求参数

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  //一个name对应一个值
  String userId = request.getParameter("userId");
  System.out.println("userId="+userId);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//一个name对应一组值
String[] soccerTeams = request.getParameterValues("soccerTeam");
for(int i = 0; i < soccerTeams.length; i++){
System.out.println("team "+i+"="+soccerTeams[i]);
}
}

在请求域中保存数据

数据保存在请求域中,可以转发到其他Servlet或者jsp页面,这些Servlet或者jsp页面就会 从请求中再取出数据

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将数据保存到request对象的属性域中request.setAttribute("attrName", "attrValueInRequest");
//两个Servlet要想共享request对象中的数据,必须是转发的关系
request.getRequestDispatcher("/ReceiveServlet").forward(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从request属性域中获取数据
Object attribute = request.getAttribute("attrName");
System.out.println("attrValue="+attribute);
}

HttpServletResponse 接口

HttpServletResponse 是 ServletResponse 接口的子接口,封装了 HTTP 响应的相关信息,由

Servlet 容器创建其实现类对象并传入 service(ServletRequest req, ServletResponse res)方法中。主要功能:

1)使用 PrintWriter 对象向浏览器输出数据

//通过PrintWriter对象向浏览器端发送响应信息
PrintWriter writer = res.getWriter();
writer.write("Servlet response"); writer.close();

2)实现请求重定向

请求转发与重定向

请求转发和重定向是 web 应用页面跳转的主要手段,应用十分广泛,所以我们一定要搞清楚他们的区别。

请求转发:

  1)第一个 Servlet 接收到了浏览器端的请求,进行了一定的处理,然后没有立即对请求进行响应,而是将请求“交给下一个 Servlet”继续处理,下一个 Servlet 处理完成之后对浏览器进行了响应。在服务器内部将请求“交给”其它组件继续处理就是请求的转发。对浏览器来说,一共只发了一次请求,服务器内部进行的“转发”浏览器感觉不到,同时浏览器地址栏中的地址不会变成“下一个 Servlet”的虚拟路径。

  2)在转发的情况下,两个 Servlet 可以共享 Request 对象中保存的数据

  3)转发的情况下,可以访问 WEB-INF 下的资源

  4)当需要将后台获取的数据传送到 JSP 上显示的时候,就可以先将数据存放到 Request 对象中,再转发到 JSP 从属性域中获取。此时由于是“转发”,所以它们二者共享 Request 对象中的数据。

public class ForwardServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("forwardServlet doGet"); //请求的转发
//1.调用HTTPServletRequest 的getRequestDispatcher()方法获取RequestDispatcher对象
//调用getRequestDispatcher()方法时需要传入转发的地址
String path = "testServlet"; RequestDispatcher requestDispatcher = request.getRequestDispatcher("/"+path);
//2.调用调用HTTPServletRequest 的forward(request,response)进行请求的转发
requestDispatcher.forward(request,response);
}
}

请求重定向:

  1)第一个 Servlet 接收到了浏览器端的请求,进行了一定的处理,然后给浏览器一个特殊的响应消息,这个特殊的响应消息会通知浏览器去访问另外一个资源,这个动作是服务器和浏览器自动完成的,但是在浏览器地址栏里面能够看到地址的改变,会变成下一个资源的地址。

  2)对浏览器来说,一共发送两个请求,所以用户是能够感知到变化的。

  3)在重定向的情况下,不能共享 Request 对象中保存的数据。

public class RedirectServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("RedirectServlet doGet"); //执行请求的重定向,直接调用reponse.sendRedirect(path)方法
//path为重定向的地址
String path = "testServlet";
response.sendRedirect(path);
}
}

转发与重定向的区别:

转发

重定向

浏览器地址栏

不会变化

会变化

Request

同一个请求

两次请求

API

Request 对象

Response 对象

位置

服务器内部完成

浏览器完成

WEB-INF

可以访问

不能访问

共享请求域数据

可以共享

不可以共享

目标资源

必须是当前 Web 应用中的资源

不局限于当前 Web 应用

图解转发和重定向

HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向的更多相关文章

  1. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

      ServletRequest 基本概念 JavaWeb中的 "Request"对象  实际为   HttpServletRequest  或者  ServletRequest, ...

  2. 04_web基础(六)之请求转发与重定向

    1.交互方式 Web组件之间跳转: 从AServlet 跳转到 BServlet. 三种类型: 1:请求转发(forward) 2:URL重定向(redirect) 3:请求包含(include) 3 ...

  3. spring mvc 请求转发和重定向(转)

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  4. spring mvc 请求转发和重定向

    spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...

  5. Spring MVC 3.0 请求转发和重定向

    首先看一下如何获得request对象.session对象: 普通的Controller类,示例代码如下: @Controller @RequestMapping(value = "user& ...

  6. web之请求转发与重定向

    请求转发: 重定向:

  7. JSP中的请求转发与重定向

    在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建 ...

  8. javaweb之Servlet,http协议以及请求转发和重定向

    本文是作者原创,版权归作者所有.若要转载,请注明出处. 一直用的框架开发,快连Servlet都忘了,此文旨在帮自己和大家回忆一下Servlet主要知识点.话不多说开始吧 用idea构建Servlet项 ...

  9. Servlet中的请求转发和重定向

    跳转和重定向 有的时候客户端请求到达服务端后需要对请求重新转发到其它Servlet甚至别的服务器,这就需要跳转和重定向. 区别 一般来说,跳转是服务器内部跳转,例如将请求从一个Servlet转发给另外 ...

随机推荐

  1. Hadoop的多节点集群启动,唯独没有namenode进程?(血淋淋教训,一定拍快照)(四十五)

    前言 大家在搭建hadoop集群时,第一次格式化后,一路要做好快照.别随便动不动缺少什么进程,就来个格式化. 问题描述:启动hadoop时报namenode未初始化:java.io.IOExcepti ...

  2. 搜索应用参考示例XXL-SEARCH

    <搜索应用参考示例XXL-SEARCH> 一.简介 1.1 概述 XXL-SEARCH 是以 "lucene/elasticsearch" 为核心的,Pragmatic ...

  3. 搭建第一个spring boot项目

    一.开发工具建议使用Spring Tool Suite 下载地址:http://spring.io/tools/sts/all/ 点击versions选择相应的版本下载,解压后直接运行即可. 二.创建 ...

  4. REBEL IDEA热部署插件使用

    启动 一.在IDEA 的Plugins中搜索Jrebel for intellij 插件 二.https://my.jrebel.com/account/how-to-activate 注册或者使用f ...

  5. 解决0% [Waiting for headers] 导致的unable to lock the administration directory (/var/lib/dpkg/) is another process using it

    这是我在配置vim的YouCompleteMe时遇到的问题,我需要使用CMake来编译YCM. 在我输入 $ sudo apt install cmake 由于网络原因导致安装一直卡在0% [Wait ...

  6. Spring中的循环依赖

    循环依赖 在使用Spring时,如果主要采用基于构造器的依赖注入方式,则可能会遇到循环依赖的情况,简而言之就是Bean A的构造器依赖于Bean B,Bean B的构造器又依赖于Bean A.在这种情 ...

  7. redis两种持久化方法对比分析

    1.前言 最近在项目中使用到Redis做缓存,方便多个业务进程之间共享数据.由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了,于是需要开启redis的持久化功能, ...

  8. Android的JDK、SDK、Eclipse的理解

    今天看了这方面的内容,感觉学到了一些东西: 首先,jdk是用来处理Java语言的, sdk是用来处理Java语言和硬件之间的关联的, eclipse是用来编写Java语言的, 通过对这方面的理解,加深 ...

  9. Java 精简Jre jar打包成exe

    #开始 最近几天都在忙一个事情,那就是尝试精简jre,我想不明白为什么甲骨文官方不出exe打包工具... 网络上精简jre的文章很多,但是原创的似乎没几个,绝大多数都是转发同一个博客, 这里借鉴了不少 ...

  10. range与enumerate的区别

    在迭代中enumerate比range更能灵活,一般情况下尽量用erumerate,下面举例说明: 先来看range的使用: city_list = ['beijing', 'shanghai', ' ...