当前课程知识点:Web后端开发技术 > 第2章 Servlet技术基础 > 2.3 Servlet应用 > 2.3.3 处理结果
欢迎大家回来继续学习
Web后端开发技术
本小节我们将介绍如何处理
Servlet的结果
当Servlet执行完成以后
它向客户端返回结果
实际上有三种选择
第1种选择是直接输出结果
第2种叫做重定向
第3种叫做请求的转发
下面我们逐一介绍一下
直接输出结果其实我们已经非常熟悉
当完成业务处理以后
我们就通过response这个对象得到
printWriter类型的这样一个对象的
引用
out
然后将结果以字符流的形式返回给
客户端
那么重定向是怎么一回事
重定向是指由原来的请求重新定位到
一个新的url上面
原来的请求失效
客户端所看到的是最后的新的请求所
返回的结果
比如用户请求ServletA那么在这里
ServletA通过重定向这个方法告诉
这个客户端说你再重新发送一次请求
重新发送的请求
然后将它的执行结果返回给
客户端
实际上执行了两次请求
有两次的相应
对于用户来讲
这个过程其实是看不到的
重定向是通过HTTPServlet
Response对象的sendRedirect
方法来实现的
它的基本语法是这个样子
在这个位置我们填写我们需要重定向的
地址
location这个地址可以是相对地址
也可以是绝对地址
比如我们看这样一个例子
他把重定向定向到当前应用下面的
CH02下面的index.jsp
文件上面去
对于重定向这种技术
它可以定向到哪里去
其实有三种
一种是定向到当前应用下面的某个资源
第2种是定向到当前站点下面其他
应用上的资源
还可以定向到其他站点上面的资源
这是重定向
请求转发和重定向是不同的一种
处理请求结果的方式
也就是说将请求转发到一个新的地址
当一个请求到达
ServletA的时候
ServletA通过调用forward的方法
进一步来处理请求
他要假设要寻找ServletB然后找到
ServletB以后
完成处理请求
将结果再返回给客户端
通过刚才动画大家可以看到
转发它实际上是完成了一次请求
一次响应
这个过程
对于用户来讲也是不可见的
我们看一下它语法
请求转发是通过request对象
或者说HTTPServletRequest这个
接口当中的get
ruquestDispatcher
这个方法得到一个这样的类型的对象
然后再调用Forward的方法
将原来的request原来的response
作为参数进行调用
就完成了一次请求的转发
下面是这样一个事例
这个请求转发是把请求转发到刚才
我们看到indexjsp页面下面去了
这里面有一个非常关键的问题
在请求转发和重定向的时候
我们都可以使用斜线来表示相对路径
那么这个斜线在这两个方法当中
它的意义是不一样的
在请求转发当中
这个斜线表示的是当前外部应用的
根目录
而在重定向当中
这个斜线表示的是Web站点的根目录
他们是不一样的
下面我们对请求转发和重定向做一个
简单的比较
我们首先看重定向
从请求的次数来说是发生了两次请求
从定向的范围上来看
是不限于同一个web应用
在地址栏上面请求转发是
最终用户看到的是新的地址
浏览器
他被告诉说你在发送一次请求
然后从请求对象来说是不同的请求对象
和不同的响应
从发送对象或者发送消息的对象来说
是使用的是响应对象
调用的方法叫做sendRedirect
对于请求了转发来说
他发送的是一个请求
然后他能够转发的是同一个Web应用
下的其他的组件
在地址栏用户看到的是同样的地址
原来的地址
这个浏览器并不知道服务器内部发生了
怎样的事情
从请求的对象和想要对象来说都是
一个一个请求对象
一个响应对象
执行体是通过请求对象间接来完成
请求转发的
调用的方法是dispatcher那个方法类
当中的forward方法来完成
请求的转发的
现在我们来介绍一下Servlet
处理重定向和请求转发
那么为了节约时间
我已经建好了几个页面
一个是indexjsp里面
是新页面
还有一个是RedirectServlet
我们用在Servlet
当中去写相关的代码
那么首先在doget的方法当中
我们去用response.sendRedirect
这个方法就可以进行重定向
我们重定向到哪去
我可以用request.getcontextpath
contextpath就是获取
上下文路径
比如说我现在这个项目叫做chapter2
那么我们上下文路径就是反斜杠
chapter2这么一个路径
然后我去连接上
在这个路径下
我要访问的要重定向到index.jsp
我这里跟一个index.jsp
就可以了
好保存
然后我们使它运行起来
打开我们的浏览器
输入我们的访问地址
chapter2
然后我们访问的是Redirect
这个Servlet
好
敲回车
大家注意看
大家可以看到刚才我输的是
Redirect
Servlet
但是他现在已经给我重定向到
index.jsp了
并且这里显示的是index.jsp的
一个新页面
这就是重定向
它会改变我地址栏的显示
我们再来看看我们的请求转发
我把相关的代码写在forwardServlet
下面
同样在doget的方法里面
我们去实现相关的代码
那么请求转发
我首先可以通过request的对象的一个
方法
叫做getdispatcher
requestdispathcer
它可以返回一个
requestDispatcher对象
requestdispatcher这么一个对象
那么这里面我传的参数就是我想请求到
转发到哪一个页面去
跟我们之前类似
我想转发到我的上下文
request.getContextPath
连接上我的index.jsp
然后我通过forward一个方法
forward有一个方法就叫做forward
好
把我们的request参数response参数
给进去
那么它就可以完成这样的一个请求
转发
保存
我们打开一个新的地址
输入我们的forward
Servlet敲回车
这里没有显示
有可能是因为他没有编译和运行
我把Context停止再重启一下
刷新
我们检查一下
forwardServlet
这里出现了错误
大家可以从我们的信息当中可以
看得出来
这里显示的是我们的chapter2
chapter2连续两个了
那么原因是这种请求转发
它默认是基于当前应用的
也就是基于这个目录
所以说我们在写代码的时候
就不要再加request.getContextPath
我们直接给他请求转发到
index.jsp就可以了
好
那么刷新
重新启动一下Tomcat
好
刷新
大家可以看到已经到了index.jsp
我是新页面显示了
但是大家可以看到我们的浏览器上
依然显示的是forward
Servlet地址栏并没有变
那么它俩请求转发
还有重定向
除了地址栏的变化
还有别的变化吗
我们再来演示一个
我在请求转发里面
在转发之前
我往request里面设置一个属性
比如说就叫做name
那么name的值将设为hbun
那么同样代码我也给设置到这个
forwardServlet当中
好
我们在index.jsp当中
我是新页面的后面
我想把这个属性值拿出来
我可以通过这样的方式去拿
request.getParametername
我们看看name值
到底输得出来还是输不出来
首先我们还是把重启一下
我们先访问
Redirect.Servlet
在这里我们访问
Redirect
Servlet
那么大家可以看到我是新页面出来了
但是这个值是拿不到的
那么我们访问forwardServlet
刷新一下
这里我写错了
不是getParameter
应该是request.getAttribute
好
我们重新看一下
我们用send
用RedirectServlet
它依然是拿不到的
那么我们用forwardServlet刷新
我们这个值应该是
name
因为这里写的他的替值是name
我们要通过name值拿到hbun的值
好
我们再来演示一下
RedirectServlet
大家可以看到这里的值是拿不到的
那么刷新它forwardServlet
可以看到我们通过name值拿到了
hbun所以我们用请求转发的方式
是能够拿到request里面域当中的值的
而用这种重定向是无法拿到的
好
本小节就讲到这里
-1.0 导学
--1.0.1 导学
-1.1 Web应用开发概述
--1.1.3 测试
-1.2 准备Java Web应用开发环境
--1.2.2 测试
-1.3 任务实现:Hello World Web项目
--1.3.2 测试
-1.4 小结
--1.4.1 小结
-本课程所有代码
--课程参考代码
-2.0 导学
--2.0.1 导学
-2.1 Servlet概述
--2.1.3 测试
-2.2 创建Servlet
--2,2,3 作业
-2.3 Servlet应用
--2.3.4 测试
-2.4 任务实现:某高校毕业生信息发布系统-注册与登录(Servlet版)
--2.4.3 测试
-2.5 ServletConfig接口
-2.6 ServletContext接口
-2.7 HttpServletRequest接口
--2.7.5 测验
-2.8 HttpServletResponse接口
--2.8.3 测试
-2.9 任务实现:某高校毕业生信息发布系统-简历添加
--2.9.1 任务实现:某高校毕业生信息发布系统-简历添加
-2.10 小结
-动画演示:Java Web应用服务器处理客户端请求的过程
-3.0 导学
--3.0.1 导学
-3.1 Cookie技术
--3.1.3 测试
-3.2 Session技术
--3.2.2 Session技术-Session技术应用购物车
--3.2.3 测试
-3.3 URL重写与隐藏表单域
--3.3.2 测试
-3.4 任务实现:某高校毕业生信息发布系统-简历修改
--3.4.1 任务实现:某高校毕业生信息发布系统-简历修改
-3.5 小结
--3.5.1 小结
-4.0 导学
-4.1 jsp概述
--4.1.2 测试
-4.2 脚本元素
--4.2.2 测试
-4.3 指令元素
--4.3.2 测试
-4.4 动作元素
--4.4.3 测试
-4.5 内置对象
--4.5.3 测试
-4.6 JavaBean
--4.6.3 测试
-4.7 任务实现:某高校毕业生信息发布系统-首页(JSP版)
--4.7.1 任务实现:某高校毕业生信息发布系统-首页(JSP版)
-4.8 小结
--4.8.1 小结
-5.0 导学
--5.0.2 测试
-5.1 el语法
--5.1.2 测试
-5.2 el隐含对象
--5.2.2 测试
-5.3 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.1 任务实现:某高校毕业生信息发布系统-学生详细信息展示
--5.3.2 测试
-5.4 小结
--5.4.1 小结
-6.0 导学
--6.0.2 测试
-6.1 核心标签库
--6.1.5 测试
-6.2 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.1 任务实现:某高校毕业生信息发布系统-首页(JSTL版)
--6.2.2 测试
-6.3 小结
--6.3.1 小结
-7.0 导学
--7.0_导学
-7.1 过滤器
--7.1.3 测试
-7.2 监听器
--7.2.1.1与ServletContext相关的监听器
--7.2.4 测试
-7.3 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.1 任务实现:某高校毕业生信息发布系统-单态登录
--7.3.2 测试
-7.4 小结
--7.4.1小结
-8.0 导学
--8.0_导学
-8.1 JDBC API
--8.1.2 测试
-8.2 JDBC API访问MySQL基本步骤
--8.2.2 测试
-8.3 任务实现:某高校毕业生信息发布系统-注册与登录
--8.3.1 任务实现:某高校毕业生信息发布系统-注册与登录(JDBC版)
--8.3.2 测试
-8.4 小结
--8.4.1小结
-9.0导学
--9.0导学
-9.1 技术准备
--9.1.5 测试.
-9.2 系统设计
-9.3 系统实现
-9.4 小结
--9.4.1小结

