1.request传数据
用户发送带参数的请求给浏览器------tomcat自动创建request内置对象,把用户请求中的请求参数封装到request对象数据区的参数区。
------tomcat执行后台组件来处理用户的请求。
如果要从request中拿到所有参数以及参数的值,使用request.getParametervalues(name)语句
【通过getParameter()从request拿的数据都是string类型】
request中存放的是用户请求的参数和后端组件生成的属性【即request包含参数区与属性区】
如何把这些数据传给后台其他组件
2.服务端跳转vs后台跳转
服务端跳转:也叫后台跳转:用户无法看到后台跳转,请求只需发一次,不会重新发请求,request中参数以及参数对应的值一直存在
客户端跳转:用户重新发请求的跳转
服务端就是后台跳转,一般有标签跳转,request跳转
客户端是用户重新发送请求,一般是response
服务端跳转能否传递数据
能
服务端跳转,用户登录页面,输入密码和账号,点击登录,这个时候浏览器发出用户请求tomcat会自动创建request对象,把请求中包含的密码和账号封装到request对应数据区的参数区,然后通过application将数据传给后台的各个组件
客户端跳转能否传递数据
不能
客户端跳转的话,因为第一次登录页面的时候,你密码输错了,然后你就会退回登录界面。重新输入密码点击登录。是再次发出请求,对吧?而1request是请求开始创建,请求结束销毁。所以你上一次输入的密码它肯定不会保存在request里面,那么此时request.getParametervalues()从request中拿不到东西,就会报错,空指针异常。
听不懂看这里!!!
打一个比方,比如说,现在有用户进入登录页面进行登录操作,在浏览器输入账号和密码点击提交,这个时候浏览器发出用户请求,tomcat会自动创建request对象,把请求中包含的密码和账号封装到request对应数据区的参数区。我们需要写一个request.getParametervalues()去获取它所有的参数(就是获取用户信息)。获取信息之后,验证用户是否是合法的(是否存在、是否是本人)。这个时候我们会用到session传递验证信息。如果是本人,就进入成功页面,也就是进行服务端跳转,到后台去,进入成功页面。
如果不是本人,弹回登录页面,也就是所谓的客户端跳转,阻止非本人进入(或者密码填错了,让用户重新输入)。
3.利用session内置对象传递验证信息,保证安全性
sessionDemo01.jsp
<!--http://127.0.0.1:8080/test/base/03/sessionDemo01.jsp?uname=tom&upass=123-->
<%@ page contentType="text/html;charset=gb2312"%>
<%
String name = request.getParameter("uname");
String password = request.getParameter("upass");
if("tom".equals(name)&&"123".equals(password))
session.setAttribute("flag","ok") ;
%>
<%--<jsp:forward page="sessionDemo02.jsp"/>--%>
<a href="sessionDemo02.jsp">取款</a>
sessionDemo02.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<%
String flag = (String)session.getAttribute("flag") ;
%>
<h1>flag : <%=flag%></h1>
<%if(flag!=null)
out.print("取款成功");
else
out.print("取款失败");%><br>
<a href="sessionDemo03.jsp">转账</a>
sessionDemo03.jsp
<%@ page contentType="text/html;charset=gb2312"%>
<%
String flag = (String)session.getAttribute("flag") ;
%>
<h1>flag : <%=flag%></h1>
<%if(flag!=null)
out.print("转账成功");
else
out.print("转账失败");%><br>
运行结果:
#合法用户取款成功
#非法用户就会显示取款失败
#非法用户就会显示转账失败
4.page内置对象保存临时信息
page一访问页面就创建,一离开页面就销毁,它只在当前页面有效
page内置对象保存临时信息
request:仅对于当前请求
session:仅对于当前用户
page:仅对于当前页面
pageDemo01.jsp
<%
pageContext.setAttribute("name","ZTE") ;
pageContext.setAttribute("password","123") ;
%>
<%
String name = (String)pageContext.getAttribute("name") ;
String password = (String)pageContext.getAttribute("password") ;
%>
<h1>name : <%=name%></h1>
<h1>password : <%=password%></h1>
<jsp:forward page="pageDemo02.jsp"/>
pageDemo02.jsp
<%
String name = (String)pageContext.getAttribute("name") ;
String password = (String)pageContext.getAttribute("password") ;
%>
<h1>name : <%=name%></h1>
<h1>password : <%=password%></h1>
pageDemo03.jsp
<%
pageContext.setAttribute("name","tom",PageContext.APPLICATION_SCOPE) ;
pageContext.setAttribute("password","345",PageContext.APPLICATION_SCOPE) ;
%>
<jsp:forward page="pageDemo04.jsp"/>
pageDemo04.jsp
<%
String name = (String)application.getAttribute("name") ;
String password = (String)application.getAttribute("password") ;
%>
<h1>name : <%=name%></h1>
<h1>password : <%=password%></h1>
运行结果:
#通过PageContext.APPLICATION_SCOPE也可以调用用户信息
5.application内置对象传递公共信息
application内置对象传递公共信息(tomcat一启动就创建了)
用request传数据三大特点:
不会造成内存的太大负担
安全性:用户只发一次请求,黑客无法通过用户的请求来了解整个项目的执行过程
applicationDemo01.jsp
<%
application.setAttribute("name","ZTE") ;
application.setAttribute("password","ls") ;
%>
applicationDemo02.jsp
<%
String name = (String)application.getAttribute("name") ;
String password = (String)application.getAttribute("password") ;
%>
<h1>name : <%=name%></h1>
<h1>password : <%=password%></h1>
运行结果:
四种属性范围可以依靠pageContext展开
解决汉字乱码问题
乱码原因:静态编码只对text或者html有效,且只对当前页面有效
乱码解决:
静态:<%@ page contentType = "text/html;charset=gbk">
#这行代码只处理静态代码,用户在文本框输入的汉字无法处理,会形成乱码
动态:request.setCharacterEncoding("GBK");
#注意一定要是表单里的post请求和汉字,不是get请求,它只能对表单里的汉字做编码,如果使用get请求仍然会出现乱码
静态编码是对表单里的提示信息做编码
动态编码是对表单里的汉字内容做编码
demo01.html
<html>
<body>
<form action="demo02.jsp" method="get" >
用户名:<input type="text" name="uname">
<input type="submit" value="提交">
</form>
</body>
</html>
Demo02.jsp
<%@ page contentType="text/html;charset=gbk"%>
<html>
<body>
<%
// 接收内容
//String name = request.getParameter("uname") ;
//byte[] b=name.getBytes("ISO8859-1") ;
//name = new String(b) ;
request.setCharacterEncoding("GBK") ;
String name =request.getParameter("uname") ;
%>
<h1>输入内容为:<%=name%></h1>
</body>
</html>
6.多值请求 :一个参数对应多个参数值
这里我们需要用到复选框组件【checkbox】;我们需要创建字符串数组对象去接收多个值,数组中是同一种类型的值
Demo03.html
<html>
<body>
<form action="demo04.jsp" >
用户名:<input type="text" name="uname"><br>
兴趣:
<input type="checkbox" name="inst" value="bask">篮球
<input type="checkbox" name="inst" value="swim">游泳
<input type="checkbox" name="inst" value="sing">唱歌
<input type="checkbox" name="inst" value="dancd">跳舞
<input type="checkbox" name="inst" value="read">看书
<br>
<input type="submit" value="提交">
</form>
</body>
</html>
Demo04.jsp
<%@ page contentType="text/html;charset=gbk"%>
<html>
<body>
<%
// 接收内容
request.setCharacterEncoding("GBK") ;
String name = request.getParameter("uname") ;
System.out.println("name="+name+"");
#新建一个字符串数组inst1来接收request中多值参数inst所有的值
String []inst1 = request.getParameterValues("inst") ;
System.out.println("inst1="+inst1);
%>
<h1>用户名为:<%=name%></h1>
<h1>兴趣为:
<%
for(int i=0;i<inst1.length;i++)
{
%>
<%=inst1[i]%>、
<%
}
%>
</h1>
</body>
</html>
运行结果:
demo01.html
#
Demo02.jsp
Demo03.html
Demo04.jsp
空请求执行结果:【空指针异常】
解决空指针异常:
- Try catch抛出异常
- 判断是否参数是null,是null则不运行
多值请求异常问题