一、储备知识
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"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用户注册</title>
</head>
<body>
<form name="registerForm" id="registerForm" action="doUserCreate.jsp" method="get">
<table class="tb" border="0" cellspacing="5" cellpadding="0" align="center">
<tr><td align="center" colspan="2" style="text-align:center;" class="text_tabledetail2">用户注册</td></tr>
<tr>
<td class="text_tabledetail2">用户名</td>
<td><input type="text" name="username" value=""/></td>
</tr>
<tr>
<td class="text_tabledetail2">密码</td>
<td><input type="password" name="password" value=""/></td>
</tr>
<tr>
<td class="text_tabledetail2">确认密码</td>
<td><input type="password" name="con_password" value=""/></td>
</tr>
<tr>
<td class="text_tabledetail2">email</td>
<td><input type="text" name="email" value=""/></td>
</tr>
<tr>
<td class="text_tabledetail2">爱好</td>
<td>
<input type="checkbox" name="hobby" value="swim" />游泳<br/>
<input type="checkbox" name="hobby" value="read" />阅读<br/>
<input type="checkbox" name="hobby" value="climb" />爬山<br/>
<input type="checkbox" name="hobby" value="travel" />旅游<br/>
</td>
</tr>
<tr>
<td style="text-align:center;" colspan="2">
<button type="submit" class="page-btn" name="save">注册</button>
<button type="button" class="page-btn" name="return" onclick="javascript:location.href='<%=request.getContextPath() %>/index.jsp'">返回</button>
</td>
</tr>
</table>
</form>
<%
Object omess = request.getAttribute("mess");
if (omess != null) {
out.println(omess);
}
%>
</body>
</html>
处理用户请求的jsp页面:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'doUserCreate.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
// 获取用户注册的数据:用户名、密码、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");
}
%><br/>
密码:<%=pwd %><br/>
email:<%=email %><br/>
爱好:<%
if(hobbys != null && hobbys.length != 0){
// 用户选择了爱好,获得爱好并输出
for(String hobby : hobbys) {
out.println(hobby);
}
}else{
out.println("没有选择任何爱好");
}
%><br/>
</body>
</html>
注册成功后跳转到的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+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'doUserCreate.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<link rel="stylesheet" type="text/css" href="<%=request.getContextPath() %>/css/common.css">
</head>
<body>
<!--页面顶部-->
<div id="header">
<div class="main-top">
<div class="logo"><a href=""><span>新闻大视野</span></a></div>
<div class="login-box">
<%
Object omess = request.getAttribute("mess");
if (omess != null) {
out.println(omess);
}
%>
<label>用户名</label><input type="text" name="uname" /><label>密码</label><input type="text" name="upassword" /><button>登录</button>
</div>
<div class="nav">
<ul class="clearfix">
<li><a href="#">首页</a></li>
<li><a href="#">国内</a></li>
<li><a href="#">国际</a></li>
<li><a href="#">娱乐</a></li>
<li><a href="#">军事</a></li>
</ul>
</div>
</div>
<!--banner-->
<div class="main-banner">
<img src="<%=request.getContextPath() %>/images/banner.png" />
</div>
<!--搜索横框-->
<div class="search-box">
<div class="sl">
<div class="sr clearfix">
<span class="left-search clearfix">
<label>站内搜索</label><input type="text" name="keyword" value="关键词" /><button class="go-btn"></button>
</span>
<span class="right-link">
<label>快速链接</label><select><option>-----专题选择-----</option></select><button class="go-btn"></button>
</span>
</div>
</div>
</div>
</div>
<!--d页面主体-->
<div id="content" class="main-content clearfix">
<!--主体的的左边部分-->
<div class="main-content-left">
<!--新闻专题分类-->
<div class="class-box">
<div class="class-box-header">
<span class="fr"><a href="#">更多...</a></span>
<h3>新闻专题</h3>
</div>
<div class="class-box-content">
<ul>
<li><a href="#">国内</a></li>
<li><a href="#">国际</a></li>
<li><a href="#">娱乐</a></li>
<li><a href="#">军事</a></li>
<li><a href="#">财经</a></li>
<li><a href="#">天气</a></li>
<li class="clear-bottom-line"><a href="#">科技</a></li>
</ul>
</div>
</div>
<!--最新新闻-->
<div class="left-box">
<div class="left-box-tbg">
<div class="left-box-bbg">
<div class="left-box-header"><h3><a href="#">最新新闻</a></h3></div>
<div class="left-box-content">
<ul>
<li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
<li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
<li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
</ul>
</div>
</div>
</div>
</div>
<!--最新评论-->
<div class="left-box">
<div class="left-box-tbg">
<div class="left-box-bbg">
<div class="left-box-header"><h3>最新评论</h3></div>
<div class="left-box-content">
<ul>
<li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
<li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
<li><a href="#">课工场最靠谱的互联网教育 Java Web从入门到成就!</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
<!--页面主体的右部,包括新闻的列表和评论内容 -->
<div class="main-content-right">
<!--各专题的新闻列表-->
<div class="main-text-box">
<div class="main-text-box-tbg">
<div class="main-text-box-bbg">
<div class="main-text-box-header">
<h3>即时新闻</h3>
</div>
<div class="main-text-box-content">
<ul class="news-list-ul clearfix">
<li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
<li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
<li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
<li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">课工场Java Web,璇女神带你学习</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">课工场UI节日回馈,送线下项目实战课程</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">利用响应式布局搭建自己的个人简介网站</a></li>
<li><span>2016-4-28 10:33:33</span><a href="#">网页设计师的福利:可视化操作无需程序</a></li>
<li class="li-line"><span>2016-4-28 10:33:33</span><a href="#">提交课工场Bug或者建议,送K币,礼品</a></li>
</ul>
</div>
<!--图片新闻-->
<div class="news-pic">
<dl>
<dt><img src="<%=request.getContextPath() %>/images/new-1.png" /></dt>
<dd>PHP从入门到放弃</dd>
</dl>
<dl>
<dt><img src="<%=request.getContextPath() %>/images/new-2.png" /></dt>
<dd>Java Web从绝望到希望</dd>
</dl>
<dl>
<dt><img src="<%=request.getContextPath() %>/images/new-3.png" /></dt>
<dd>课工场五一回馈</dd>
</dl>
<dl>
<dt><img src="<%=request.getContextPath() %>/images/new-2.png" /></dt>
<dd>Java Web从绝望到希望</dd>
</dl>
</div>
<div class="page-bar">
<ul class="page-num-ul clearfix">
<li><a href="#">上一页</a><li>
<li><a href="#" class="thisclass">1</a><li>
<li><a href="#">2</a><li>
<li><a href="#">3</a><li>
<li><a href="#">4</a><li>
<li><a href="#">5</a><li>
<li><a href="#">下一页</a><li>
</ul>
<span class="page-go-form"><label>跳转至</label><input type="text" name="numkey" class="page-key" />页<button type="submit" class="page-btn">GO</button></span>
</div>
</div>
</div>
</div>
<!--合作媒体-->
<div class="main-text-box">
<div class="main-text-box-tbg">
<div class="main-text-box-bbg">
<div class="main-text-box-header">
<h3>合作媒体</h3>
</div>
<div class="main-text-box-content">
<ul class="link-text-ul clearfix">
<li><a href="#">中国政府网</a></li>
<li><a href="#">中国政府网</a></li>
<li><a href="#">中国政府网</a></li>
<li><a href="#">中国政府网</a></li>
<li><a href="#">中国政府网</a></li>
<li><a href="#">中国政府网</a></li>
<li><a href="#">中国政府网</a></li>
<li><a href="#">中国政府网</a></li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
<!--页面底部-->
<div id="footer" class="main-footer-box">
24小时客户服务热线:010-68988888 常见问题解答 新闻热线:010-627488888<br />
文明办网文明上网举报电话:010-627488888 举报邮箱:jubao@bj-aptech.com.cn<br />
Coyright©1999-2007 News China gov,All Right Reserved.<br />
新闻中心版权所有
</div>
</body></html>
分析:
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方法。