博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
阅读量:6120 次
发布时间:2019-06-21

本文共 3928 字,大约阅读时间需要 13 分钟。

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

HttpServletRequest 接口

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

HttpServletRequest 主要功能

获取请求参数

1)什么是请求参数?

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

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

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

  b)通过表单提交

你喜欢的足球队
巴西
德国
荷兰

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 应用

 

图解转发和重定向

 

转载于:https://www.cnblogs.com/java-chen-hao/p/10729903.html

你可能感兴趣的文章
【设计模式系列】单例模式的7种写法
查看>>
汉字转拼音 (转)
查看>>
Machine Learning Techniques -6-Support Vector Regression
查看>>
会计基础_001
查看>>
Cordova 开发环境搭建及创建第一个app
查看>>
ajax请求拿到多条数据拼接显示在页面中
查看>>
小程序: 查看正在写的页面
查看>>
dedecms生成文档数据库崩溃 mysql daemon failed to start
查看>>
Linux的50个基本命令
查看>>
Objective-C中创建单例方法的步骤
查看>>
Codeforces 520B:Two Buttons(思维,好题)
查看>>
Jenkins持续集成环境部署
查看>>
emoji等表情符号存mysql的方法
查看>>
检查磁盘利用率并且定期发送告警邮件
查看>>
MWeb 1.4 新功能介绍二:静态博客功能增强
查看>>
linux文本模式和文本替换功能
查看>>
Windows SFTP 的安装
查看>>
摄像机与绕任意轴旋转
查看>>
rsync 服务器配置过程
查看>>
预处理、const与sizeof相关面试题
查看>>