上篇文章我们讲了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. jsonp跨域获取数据小解

    jsonp跨域获取数据小解 由于浏览器有同源策略,所以要想获取非同源(协议,域名,端口三者有一不同都算非同源)的页面的数据,就得进行跨域 (1) jsonp原理 由于script标签的src属性可以访 ...

  2. arcengine之版本管理

    public void VersionManagement(IVersionedWorkspace versionedWorkspace) { //creating the new version o ...

  3. Html5的表单元素

    表单是HTML中获取用户输入的手段,,对于web应用系统及其重要,文字是不能说明问题的: 直接上代码把: <!DOCTYPE html><html lang="en&quo ...

  4. Flask请求扩展和数据库连接池

    1.1.Flask之请求扩展 #!/usr/bin/env python # -*- coding:utf-8 -*- from flask import Flask, Request, render ...

  5. 登录测试用例sql语句注入

    利用SQL注入漏洞登录后台的实现方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-01-12我要评论 工作需要,得好好补习下关于WEB安全方面的相关知识,故撰此文,权当总结,别无它意.读 ...

  6. __BEGIN_DECLS 和 __END_DECLS

    扩充C语言在编译的时候按照C++编译器进行统一处理,使得C++代码能够调用C编译生成的中间代码. 由于C语言的头文件可能被不同类型的编译器读取,因此写C语言的头文件必须慎重. 我们编写代码,经常需要c ...

  7. 影响 MySQL Server 性能的相关因素

    MySQL 最多的使用场景是WEB 应用,那么我们就以一个WEB 应用系统为例,逐个分析其系统构成,进行经验总结,分析出数据库应用系统中各个环境对性能的影响. 商业需求对性能的影响 这里我们就拿一个看 ...

  8. 海量信息库,查找是否存在(bloom filter布隆过滤器)

    Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识 ...

  9. RESTful规范

    一. 什么是RESTful REST与技术无关,代表的是一种软件架构风格,REST是Representational State Transfer的简称,中文翻译为“表征状态转移” REST从资源的角 ...

  10. jquery input 搜索自动补全、typeahead.js

    最近做个一个功能需要用到自动补全,然后在网上找了很久,踩了各种的坑 最后用typeahead.js这个插件,经过自己的测试完美实现 使用方法:在页面中引入jquery.jquery.typeahead ...