对JSP与Servlet的request与session的set、getAttribute() 方法及重定向sendRedirect()、请求转发理解getRequestDispatcher()的理解

对JSP、Servlet中request与session以及它们的setAttribute()、getAttribute() 方法以及其与:重定向sendRedirect()、请求转发getRequestDispatcher()之间关系的理解。

记录个人学习servlet时的一点浅薄理解。
request与session的setAttribute()、getAttribute() 方法在请求转发(getRequestDispatcher()) 与重定向 (sendRedirect()) 时使用。
其中request.get/setAttribute()方法只能在请求转发(getRequestDispatcher)时生效,所谓“请求转发”顾名思义前一个页面将请求转发到第二个页面,此时它们request的内容是同一个。

eg: 从first.jsp到TestServlet.java中使用以上几种方法的区别

first.jsp中:

使用请求转发request.getRequestDispatcher() 
<%
	request.setAttribute("暗号" , "天王盖地虎");
	session.setAttribute("暗号", "小鸡炖蘑菇");
	//请求转发
	request.getRequestDispatcher("/TestServlet").forward(request, response);
%>
使用重定向request.getRequestDispatcher() 
<%
	request.setAttribute("暗号" , "天王盖地虎");
	session.setAttribute("暗号", "小鸡炖蘑菇");
	//重定向
	response.sendRedirect("/JavaWeb/TestServlet");
%>

TestServlet.java中内容不变:

		HttpSession session= request.getSession();
		String req = (String)session.getAttribute("暗号");
		
		String req1 = (String)request.getAttribute("暗号");
		
		PrintWriter out = response.getWriter();
		out.print("session:"+req+"<br>");
		out.print("request:"+req1+"<br>");


接下来看一下结果会有什么不同


请求转发结果:此处的url还是原本first.jsp的路径,并且字符也是中文(后面会讲我的理解)
在这里插入图片描述
重定向结果:url的地址改变了,并且session是乱码,而request直接是null了
在这里插入图片描述

为什么结果会出现这两种情况呢?

回到之前说的。首先request与session的作用域不同,session作用域是整个会话期间,在所有的页面都使用这些数据的时候使用;而request作用域则是请求和被请求页面之间。其内容也就是当前页面request的内容,所以在请求转发后,因两个界面request的内容是相同的,所以request set/getAttribute()的值相同;而在重定向后request的对应为:null


而虽然session不管是重定向还是请求转发其set/getAttribute()的值都相同(后面的???是编码问题),但为什么:请求转发其对应的值是中文,而重定向就是乱码?
其实也是之前所说的,请求转发前后两个页面的request内容相同,而jsp中的编码格式是utf-8,在这里插入图片描述
因而在请求转发后 其编码格式“utf-8”也到了TestServlet.java中了,所以是中文。

而重定向,顾名思义我理解为:重新确定方向,所以比起请求转发它的url地址也改变了,这时的字符编码如果没有设置,那么就是该文件默认的编码,所以接下来我设置一下,然后我们再来看一下结果。在TestServlet中增加两行代码设置前端编码为utf-8:

		//设置前端编码为utf-8
		response.setCharacterEncoding("utf-8");
		response.setHeader("content-type","text/html;charset=utf-8");
				
		HttpSession session= request.getSession();
		String req = (String)session.getAttribute("暗号");
		
		String req1 = (String)request.getAttribute("暗号");
		
		PrintWriter out = response.getWriter();
		out.print("session:"+req+"<br>");
		out.print("request:"+req1+"<br>");

查看结果:
在这里插入图片描述
确实如上所说。当然,这一切都只是我自己的一点浅显理解,也是参考了两篇博客,都写的很细,有些东西我现在还理解不了

  1. request.setAttribute()、session.setAttribute()和request.getParameter()的联系与区别(记录)
  2. getRequestDispatcher()与sendRedirect()的区别
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值