javaweb课程.classseven(Jsp内置对象.session/page/request传递数据的方式和特点)

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则不运行

多值请求异常问题

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值