今天在处理一个form表达提交时遇到一问题,我通过jsp页面的form提交一个请求至spring mvc的控制器,控制器处理完毕之后要返回到一个新的页面,由于我的页面组成是frame框架的,有两个frame,一个frame包含的是公共的头部文件,一个是主体页面,处理完毕返回的时候,无法在当前的主体frame中打开我想要打开的页面,而是在一个新的选项卡中打开。经过排查,发现form表单使用的是target="_blank",网上查看form属性如下: target完整的属性可能值是: _self:默认值,在原页面打开。 _blank:在新窗口打开。 _parent:在父窗口打开。 _top:在顶级窗口打开。 _frameName(xxxxIframe):在指定窗口打开。 当使用target=“_blank”时,毫无疑问是在一个新的浏览器窗口中打开,这样就无法在原先的frame中打开,form默认的target就是self,在原页面打开。所以,当控制器处理完form表单的请求之后,再查询在原页面打开的新页面中需要的数据,需要在原页面打开的新页面通过ModelAndView指定,然后请求返回原页面之后,在原页面重新打开,这样就还是在主体frame中打开新页面,头部frame也一样包含。
附: 表单是最常见的html元素,作用是向服务器提交数据。其中有一个属性target,深入理解之后,对页面的形成有帮助。下面详细分析。 一 表单提交到了哪里? 这 似乎是个无知的问题,我们都知道表单提交到服务器,java,php,asp等服务器,然后由服务器去读。那么之后呢,服务器总要返回点什么吧,要么返回 一个xml或json数据,要么返回一个页面,要么返回一个页面片段,但是返回到哪里了,这些结果在哪里展示?其实这就是常常被忽略的一个问题,尤其是 ajax用多了,觉得无刷新是理所当然的。在默认情况下,在什么页面提交的,就会将返回的数据(json或页面或页面片段)给这个页面。这里的页面指一个 框架,带有<html></html>结构的html页。 这样一来,当在A页面提交了一个表单,服务器返回了 一个信息,表示成功了,此时,返回的数据会给A页面,于是,A页面就"刷新"了一次。2005年,出现了异步刷新ajax。这样就可以“局部刷新”了,向 服务器提交数据时,不用通过表单了,可以通过浏览器对象来提交,服务器返回数据到该浏览器对象,这样便可以实现“局部刷新”了。 但是ajax有个致命问题,不能提交文件。怎么办? 二 文件还得用表单来提交 为了克服ajax不能提交文件的问题,我们又想起了表单。当表单的enctype=multipart/form-data时,就可以上传文件了。可是这样又需要整个页面刷新,问题来了,两个难以同时满足。 方法总是有的。于是出现了通过设置表单的target=xxxxIframe的方法。这样意味着表单提交到一个无关的页面,服务器返回时也返回到这个页面,再在这个无关的页面进行js操作,改变需要更新的页面区域。而整个表单提交过程中,无关页面都是隐藏的,是个幕后推手。这就是target=xxxxIframe的作用。 三 target属性 target完整的属性可能值是: _self:默认值,在原页面打开。 _blank:在新窗口打开。 _parent:在父窗口打开。 _top:在顶级窗口打开。 _frameName(xxxxIframe):在指定窗口打开。 |
|