HttpServletRequest 接口、HttpServletResponse 接口、请求转发与重定向
上篇文章我们讲了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 接口、请求转发与重定向的更多相关文章
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- 04_web基础(六)之请求转发与重定向
1.交互方式 Web组件之间跳转: 从AServlet 跳转到 BServlet. 三种类型: 1:请求转发(forward) 2:URL重定向(redirect) 3:请求包含(include) 3 ...
- spring mvc 请求转发和重定向(转)
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- spring mvc 请求转发和重定向
spring mvc controller间跳转 重定向 传参 url:http://zghbwjl.blog.163.com/blog/static/12033667220137795252845/ ...
- Spring MVC 3.0 请求转发和重定向
首先看一下如何获得request对象.session对象: 普通的Controller类,示例代码如下: @Controller @RequestMapping(value = "user& ...
- web之请求转发与重定向
请求转发: 重定向:
- JSP中的请求转发与重定向
在说请求转发和重定向之前,得了解下JSP九大内置对象中的response和request response:将服务器端数据发送到客户端,可通过在客户端浏览器中显示,用户浏览页面的重定向以及在客户端创建 ...
- javaweb之Servlet,http协议以及请求转发和重定向
本文是作者原创,版权归作者所有.若要转载,请注明出处. 一直用的框架开发,快连Servlet都忘了,此文旨在帮自己和大家回忆一下Servlet主要知识点.话不多说开始吧 用idea构建Servlet项 ...
- Servlet中的请求转发和重定向
跳转和重定向 有的时候客户端请求到达服务端后需要对请求重新转发到其它Servlet甚至别的服务器,这就需要跳转和重定向. 区别 一般来说,跳转是服务器内部跳转,例如将请求从一个Servlet转发给另外 ...
随机推荐
- Windows下对拍
What is 对拍 Tool: 你的程序 可以输出正解的暴力程序 数据生成器 输出对比器 RP 用来干什么? 用来造数据,检验你的程序的正确性,以方便修改和出现未考虑到的情况 如何工作? 数据生成器 ...
- 发布 Rafy .NET Standard 版本 Nuget 包
去年年中,Rafy 框架的源码就已经支持了 Net Standard 2.0 版本.其开源代码也已经上传到 Github 中:https://github.com/zgynhqf/rafy/tree/ ...
- web端创建地图
1>在首部引入标签 <link rel="stylesheet" href="http://cache.amap.com/lbs/static/main111 ...
- webpack4.x版本splitChunksPlugin的配置项详解与实际应用场景
在工程化地使用webpack时,公共代码抽离是不可或缺的,4.x版本之后,commonsChunkPlugin已经被去掉,splitChunksPlugins登上舞台,并且优化了很多配置选项,集体课件 ...
- vue项目 构建 打包 发布 三部曲
一.vue项目的创建 1.首先第一肯定是要有Node.js及npm这个不多说了2.安装脚手架 此时可以直接浏览-但是现在肯定有很多小白想将他发布到gitHub上并可以浏览,使用vue全家桶制作自己的博 ...
- FineReport启动后访问404
近期将FineReport以嵌入式方式部署在Tomcat8上,启动服务后,点击导出下载出现HTTP ERROR 404情况: 百思不得其解啊,纠结了好几天: 后查看原部署Tomcat6服务器的cata ...
- Oracle数据库表分区
一.Oracle数据库表分区概念和理解 1.1.已经存在的表没有方法可以直接转化为分区表. 1.2.不在分区字段上建立分区索引,在别的字段上建立索引相当于全局索引.效率 ...
- Pattern recognition and machine learning 疑难处汇总
不断更新ing......... p141 para 1. 当一个x对应的t值不止一个时,Gaussian nosie assumption就不合适了.因为Gaussian 是unimodal的,这意 ...
- springboot+mybatis+ehcache实现缓存数据
一.springboot缓存简介 在 Spring Boot中,通过@EnableCaching注解自动化配置合适的缓存管理器(CacheManager),Spring Boot根据下面的顺序去侦测缓 ...
- SpringBoot操作数据库 2017.12.14
http://blog.csdn.net/forezp/article/details/61472783