search 页面通常点完search button 后还需要保留页面点击search之前已经输入的那些检索条件的值,通过request getparameter获得。

5 篇文章 0 订阅
3 篇文章 0 订阅

在jsp的跳转过程中,经常会传递一些参数值,这些值通常我们放到request中.但是哪些jsp的跳转方式是可以共享request,哪些又是不共享,即跳转后拿不到值的呢?

          一、首先来看可以共享request的情况:

          (1)<jsp:include page="...">

 页面间有包含关系的,包含进来的页面中的request中的属性和原页面共享属性数据以及请求参数,

          (2)属于服务器端进行跳转的方式

                (i)<jsp:forward page="...">用于从一个页面跳转到另一个页面,要跳转的页面也可进行共享原页面中request中设置的属性以及请求参数。这种jsp界面使用forward的方式与Servlet中forward()是相同的道理 

                (ii)forward()方法

                使用到javax.servlet.RequestDispatcher类

                RequestDispatcher rd =getServletContext().getRequestDispatcher("url");

                rd.forward(requestVar,requestVar); //传递servlet的入口参数

                forward函数已经把原页面的request,response对象传入新的页面,因此这新旧页面拥有相同的request,response对象。

                request.getparameter("var")就可以得到相应的值.

                forward()是直接在server做的,浏览器并不知道,也不和浏览器打交道,这也是浏览器的地址不变化的原因。

          

          二、不能共享request的jsp跳转方式

          (1)JavaScript跳转

 属于脚本语言的直接定位,不经过服务器传参,所以不能共享request数据

          (2)、HTML语言的自动跳转

            <html>

                  <head>

                     <meta http-equiv="refresh"content="0;url="http://www.baidu.com">

                    0是等待时间,如果设置为5表示等待5s后开始跳转

                  </head>

               …………

         (3) response跳转

            Response跳转方式其实是向浏览器发送一个特殊的Header,然后由浏览器来做转向,转到指定的页面,所以用sendRedirect时,浏览器的地址栏上可以看到地址的变化。新页面不能处理旧页面的pagecontext(request,response,...)对象.

         (4)还有的情况是HTML的特征,用src作为页面链入时也是不能进行request属性数据以及参数共享,

              (i)如<a></a>标签中的href=”…”,

              (ii)还有例如常用的frameset

                    <frameset   id="set" title="set">

                              <frame  src="left.jsp"  name="leftFrame"  scrolling="auto"/>

                              <frame  src="right.jsp"  name="main"   scrolling="auto"/>

                    </frameset>

               其中当前主页面和left.jsp和right.jsp不共享request对象.

              (iii)然后就是直接定位的window.open(),window.location()等函数都不能进行request对象属性数据共享,以及请求参数共享的情况中,request对象在跳转到新页面时被清空了.并没有经过服务器的传递.

 


调用RequestDispatcher.forward 方法的请求转发过程结束后,

浏览器地址栏保持初始的URL地址不变。

HttpServletResponse.sendRedirect方法对浏览器的请求直接作出响应,响应的结果就是告诉浏览器去重新发出对另外一个URL的访问请求;

RequestDispatcher.forward方法在服务器端内部将请求转发给另外一个资源,浏览器只知道发出了请求并得到了响应结果,并不知道在服务器程序内部发生了转发行为。

RequestDispatcher.forward方法的调用者与被调用者之间共享相同的request对象和response对象,它们属于同一个访问请求和响应过程;

而HttpServletResponse.sendRedirect方法调用者与被调用者使用各自的request对象和response对象,它们属于两个独立的访问请求和响应过程。

举个常见的例子,在search 页面通常点完search button 后还需要保留页面点击search之前已经输入的那些检索条件的值,

这时候就可以通过request.getParameter()来初始化页面的一些值,

比如说之前页面有dropdown list :

<select name="nation" >

<option value="1" selected> china<option> 

<option value="2"> usa<option>

<option value="2"> japan<option>

</select>


假设中间那个option list 是动态从数据库获得的,那么就可以<option value="1"  <%=if(request.getParameter("nation")==current_value? "selected" :"")%> > china<option> 


这个例子实际与A页面submit 之后经过servelt forward 到B页面,B页面可同request.getParamter 获取值。

虽然后台经过了servlet 转发,到在浏览器看来就是从A forward B了。



         虽然通过客户端进行跳转的方式很简单方便,但在共用request内容对象时就不方便了,但是这时候可以考虑使用session来存储对象数据.session是以浏览器级别的环境,上面所有情况都可以共享,当然在相同系统环境, 且不关闭浏览器为前提下。






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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值