一、储备知识
1.1在请求中存取属性
1.2转发与重定向语法
二、示例
2.1需求
如果用户的注册名为admin,则注册失败,因为该用户名已经存在。需要重新跳转到用户注册页面,重新注册。反之,注册成功,跳转到首页去。
作用域:
request作用域:请求的范围,在一次请求的范围内。
示例代码:
request.setAttribute("mess", "注册失败");
// 转发
request.getRequestDispatcher("userCreate.jsp").forward(request, response);
Dispatcher:调度器
上面这段代码的意思是:获得一个响应的调度器,这个后面跟要跳转到的页面的url地址。同时后面还要跟forward方法,意思是携带我的请求和响应过去,把我的请求和响应继续往下传。
2.2示例代码:
用户注册的jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
用户注册
<%
Object omess = request.getAttribute("mess");
if (omess != null) {
out.println(omess);
}
%>
处理用户请求的jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'doUserCreate.jsp' starting page
<%
// 获取用户注册的数据:用户名、密码、email、爱好
String username = request.getParameter("username");
String pwd = request.getParameter("password");
String email = request.getParameter("email");
String[] hobbys = request.getParameterValues("hobby");
%>
用户名:<%
if(username != null && !username.equals("")){
if (username.equals("admin")){
// 一次请求范围内
request.setAttribute("mess", "注册失败");
// 转发
request.getRequestDispatcher("userCreate.jsp").forward(request, response);
} else {
request.setAttribute("mess", "注册成功");
// 重定向
response.sendRedirect(request.getContextPath() + "/index.jsp");
}
} else {
out.println("1");
}
%>
密码:<%=pwd %>
email:<%=email %>
爱好:<%
if(hobbys != null && hobbys.length != 0){
// 用户选择了爱好,获得爱好并输出
for(String hobby : hobbys) {
out.println(hobby);
}
}else{
out.println("没有选择任何爱好");
}
%>
注册成功后跳转到的jsp页面:
<%@page import="java.net.URLEncoder"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
My JSP 'doUserCreate.jsp' starting page
<%
Object omess = request.getAttribute("mess");
if (omess != null) {
out.println(omess);
}
%>
即时新闻
- 2016-4-28 10:33:33课工场Java Web,璇女神带你学习
- 2016-4-28 10:33:33课工场UI节日回馈,送线下项目实战课程
- 2016-4-28 10:33:33利用响应式布局搭建自己的个人简介网站
- 2016-4-28 10:33:33网页设计师的福利:可视化操作无需程序
- 2016-4-28 10:33:33提交课工场Bug或者建议,送K币,礼品
- 2016-4-28 10:33:33课工场Java Web,璇女神带你学习
- 2016-4-28 10:33:33课工场UI节日回馈,送线下项目实战课程
- 2016-4-28 10:33:33利用响应式布局搭建自己的个人简介网站
- 2016-4-28 10:33:33网页设计师的福利:可视化操作无需程序
- 2016-4-28 10:33:33提交课工场Bug或者建议,送K币,礼品
- 2016-4-28 10:33:33课工场Java Web,璇女神带你学习
- 2016-4-28 10:33:33课工场UI节日回馈,送线下项目实战课程
- 2016-4-28 10:33:33利用响应式布局搭建自己的个人简介网站
- 2016-4-28 10:33:33网页设计师的福利:可视化操作无需程序
- 2016-4-28 10:33:33提交课工场Bug或者建议,送K币,礼品
- 2016-4-28 10:33:33课工场Java Web,璇女神带你学习
- 2016-4-28 10:33:33课工场UI节日回馈,送线下项目实战课程
- 2016-4-28 10:33:33利用响应式布局搭建自己的个人简介网站
- 2016-4-28 10:33:33网页设计师的福利:可视化操作无需程序
- 2016-4-28 10:33:33提交课工场Bug或者建议,送K币,礼品
- PHP从入门到放弃
- Java Web从绝望到希望
- 课工场五一回馈
- Java Web从绝望到希望
分析:
1、在处理用户请求的jsp页面加上判断代码:如果用户名是admin,则注册失败,重定向到本页面;如果注册成功,则重定向到新闻界面。
2、在用户注册页面上加上读取request的属性内容的代码,如果注册失败,转发到这个页面的话则读取request的属性值。
3、在新闻页面上加上读取request的属性内容的代码,如果注册成功,重新定向到这个页面的话则读取request的属性值。
2.3问题一
当输入admin注册失败的时候,
可以看到在上面的地址栏的定位是doUserCreate页面,而不是在用户注册处理页面加的判断中的重定向的userCreate.jsp页面。
原因如下:当浏览器即userCreate.jsp界面的数据提交给doUserCreate.jsp的时候,在doUserCreate.jsp中处理数据,如果在该页面中有转发的话,则转发的过程是在服务器中完成的,服务器直接将转发后的界面返回给浏览器,浏览器端不需要进行转发操作。所以在这整个过程中,浏览器只是向服务器提交了一次请求,所以其在地址栏的url地址就是其form数据提交的action的地址,可以跟最后返回给浏览器的页面的地址不相符。
2.4问题二
注册成功之后拿不到request的属性值。
原因:这不是一次请求的范围内了,可以看跳转之后的地址栏。当服务器进行判断之后需要重定向的时候,不是服务器偷偷帮我跳好,而是服务器告诉浏览器你得发个请求重新定向到别的jsp页面,这时候浏览器会再重新发个请求去访问别的jsp页面。这时候服务器是发送了两个请求,这时候再第一次请求中设置的request值当然在第二次请求中拿不到了。
2.5总结:转发和重定向的区别
1、两者的写法不同。
转发后面还加了一个forward,这个方法的意思是把请求传递下去,即当服务器在偷偷地转发去别的页面的时候,把这一次请求的值也传过去。
2、两者最终结果显示的地址
转发最后结果页面显示的地址就是提交请求的那个地址,因为服务器偷偷地做了转发这个动作。而重定向最后结果的地址与页面的地址相符合,因为是浏览器自身又发出的请求。
实例:比如我让你帮我买个饼,你带上我的饭卡去了,然后爱吃饭的时候你基友比你先吃完,然后你就让你基友帮我买了,但是最终还是你带回来给我的,这就是转发。再比如我让你给我买个饼,你说你要陪你女票吃饭,你告诉我你基友可以帮我买,然后我就让你基友帮我买了,这就是重定向。
2.6我重定向了但是我还想拿到request怎么办?
第一个解决方案是;request作用域太小了,去放到一个更大的作用域。
第二个解决方案是:一参数的形式进行传递,
示例代码如下:
然后在新闻页面获取info参数:
结果:
但是这个地方如果是中文的话在传参数的过程中会出现乱码问题,会拿不到。但是如果非要传中文的话,需要重新编码一下,示例代码如下:
如果还是出现问题,则可以在新闻界面读取的时候进行解码,使用URLEncoder.decoder方法。