JSP中页面跳转的相关用法

本文详细介绍了JSP中页面跳转的五种方法,包括使用href属性、表单action属性、request.getRequestDispatcher()、response.sendRedirect(url)以及<jsp:forward>标签。重点对比了转发和重定向的区别,如请求次数、地址栏变化、数据传递及适用场景。对于response.sendRedirect(),解释了其工作原理,并建议在某些场景下使用response.addHeader("location", "login.jsp");response.setStatus(302);来替代。" 119732286,9914620,Java面试必备:JUC深度解析,"['Java', '并发', 'JUC', '线程', '锁']

1. 使用href属性

<a> 超链接标签的 href 属性用于指定超链接目标的 URL。href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。

<a href="http://www.w3school.com.cn">W3School</a>

2. 利用表单action属性

当表单提交时,表单会提交到action指向的页面。

<form method="post" action="ChangrCount.jsp" id="form1">
              <input type="hidden" name="albumId" value="${item.albumId}" />
              <input style="width:50px;" type="text" name="count" value="${item.count}" id="namecount"/>                                
</form>

3. request.getRequestDispatcher()

getRequestDispatcher()包含两个方法,分别是请求转发和请求包含。

RequestDispatcher rd = request.getRequestDispatcher(url);

  • 请求转发: rd.forward( request , response );
  • 请求包含: rd.include( request , response);

若一个请求跨多个Servlet,需要使用转发和包含。

请求转发:由下一个Servlet完成响应体,当前Servlet可以设置响应头。(留头不留体)
请求包含:由两个Servlet共同完成响应体。(留头又留体)

无论是请求转发还是请求包含,都在一个请求范围内,使用同一个request和response。

传值的问题
同一个请求范围内使用request.setAttribute()request.getAttribute()来传值!前一个Servlet调用setAttribute()保存值,后一个Servlet调用getAttribute()获取值。

4. response.sendRedirect(url);

response和request一样都是jsp内置对象,request是获取用户的请求,response处理用户请求。sendRedirect()函数的作用是重定向网页,向浏览器发送一个特殊的Header,然后由浏览器来做重定向,转到指定的页面。

response中的sendRedirect()重定向到另一个servlet时,调用的是doget方法,简单来说,sendRedirect()做了两件事情:
(1)设置HTTP响应报头中的Status为302;
(2)设置HTTP响应报头中的Location值为指定的URL;
浏览器对302的响应,默认情况下,使用HTTP协议的GET方法提交请求,最初请求的内容(比如 POST 参数)也就丢失了。 所以response.sendRedirect()是不能让浏览器来以post方法提交请求的。

这两件事情也可以用下面两条语句来完成:

response.setStatus(302);  
response.setHeader("Location", "OtherServlet"); 

注意这两条语句和redirect不等同。
response.sendRedirect(“login.jsp”);的http请求过程如下:
在这里插入图片描述
response.addHeader(“location”, “login.jsp”);
response.setStatus(302);
在这里插入图片描述
比较两张图可以发现:response.sendRedirect(“login.jsp”);在重定向时多加了一段http://localhost:8080/xxxSearch/

分析:
(1)当浏览器的访问路径是http://localhost:8080/xxxSearch/时,response.sendRedirect(“login.jsp”); 等于 response.addHeader(“location”, “login.jsp”);response.setStatus(302);
这时在jsp使用request.getContextPath()获取访问绝对路径是可以的
(2)但是当浏览器的访问路径是http://localhost/时就出现问题了。一些公司经常是这样的结构:用apache做前端,代理后面的tomcat,在tomcat看来访问路径还是http://localhost:8080/xxxSearch/,而用户真实访问的是http://localhost/
在这里插入图片描述
若是用response.sendRedirect(“login.jsp”);的话,用户会跳转到http://localhost:8080/xxxSearch/login.jsp。若是我们的防火墙不开放8080端口,我们就会看到无法访问的页面,而且我们也不想客户直接访问到tomcat上。
而用response.addHeader(“location”, “login.jsp”);response.setStatus(302);的话,客户会访问到login.jsp,这个路径是一个相对的路径,再加上客户浏览器的路径,客户实际访问的是http://localhost/login.jsp

所以总的来说,使用response.addHeader(“location”, “login.jsp”);response.setStatus(302);好像更好一点[狗头]

转发(forward)和重定向(redirect)的区别

  1. 转发是一个请求一次响应,而重定向是两次请求两次响应
  2. 转发地址不变化,而重定向会显示后一个请求的地址
  3. 转发只能转发到本项目其它Servlet,而重定向不仅能重定向到本项目的其它Servlet,还能定向到其它项目
  4. 转发是服务器端行为,只需给出转发的Servlet路径,而重定向是客户端行为,需要给出requestURL,需包含项目名。(注意:最好转发带‘/’,重定向不带‘/’。重定向加‘/’会报错,因为重定向是从服务器根目录tomcat/webapps/出发的,而Servlet转发是内部转发,从tomcat/webapps/项目出发)
  5. 转发可以把数据保存到request域对象中,而重定向不能把数据保存到request中,但是可以通过url携带需要的参数,但只能携带字符串的参数。其优点是重定向时浏览器默认是使用get请求方式,这样的请求方式速度更快一点,但是安全性却不高。

5. <jsp:forward>

与前几种不同的是(第3,4种),forward是jsp动作标签,不能放在<% %>的脚本里(QAQ好愁啊,老师要求用这个,还没想到怎么做)
forward动作是指页面跳转至某一页面,而param动作常常和forward动作一起使用,作为其子标签,为页面跳转添加一些参数。
1、forward动作的语法:<jsp:forward page="URL"/>,其中page是指跳转的页面名,forward动作类似于服务器内部转发方法:request.getRequestDispatcher("/url").forward(request, response)
2、param动作的语法:<jsp:param value="参数值" name="参数名"/>,使用param不仅可以新增一个参数,也可以修改原有的参数值。

注意:<jsp:forward> 动作等价于request.getRequestDispatcher("URL").forward(request, response);

<jsp:forward page="user.jsp">
	 	<jsp:param value="Boss" name="username"/>
	 	<jsp:param value="19911007" name="password"/>
	 	<jsp:param value="LoveLay@1007.cn" name="email"/>
</jsp:forward>

获取参数的时候用request.getParameter("")就好了。


关于JSP页面跳转暂时就整理到这了,以后发现还有补充的地方会再加上的ヾ(◍°∇°◍)ノ゙
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值