result讲解
- 格式:doc
- 大小:109.50 KB
- 文档页数:5
Rsult是什么简单的说Result就是Action方法执行完毕之后返回的一串字符串,他指示出Action执行完之后的下一个页面在哪里,具体页面的位置是我们在struts.xml中配置的,就是<result>子元素,例如我们在前面UserAction中配置的Result:<action name="*User"class="erAction"method="{1}"><result name="input">/input.jsp</result><result name="success">success.jsp</result></action>在Struts2中内建了许多ResultType,他们都定义在strtus-default包中,我们可以在struts-default.xml中找到这些Result Type的定义虽然Strtus2内建支持这么多Result Type,但是一般情况下我们都用不到这么多,因此我们挑几个常用的学习一下,其他的可以在需要的时候再去查看文档。
Result的配置非常简单,<result>元素可以有name属性和type属性,但是两种属性都不是必须的。
1:配置name属性按照前面的讲述,name属性是用来跟Action的execute方法返回的字符串相对应的,用来指示Action运行后跳转到的下一个页面,因此name属性的值可以是任意字符串。
比如有如下的execute方法:java代码:public String execute() throws Exception {return "toWelcome";}那么,这里返回的“toWelcome”,在struts.xml里面就有如下的配置来对应:java代码:<action name="helloworldAction"class="cn.javass.action.action.HelloWorldAction"><result name="toWelcome">/s2impl/welcome.jsp</result></action>如果不设置的话,默认值为“success”,正好和Action中的“SUCCESS”这个常量相对应,那样的话,execute方法就应该返回SUCCESSDispatcher从是struts2.xml的配置中可以看出对于Dispatcher类型的Result Type被设置为默认使用的结果类型。
与Dispatcher类型对应的实现类为org.apache.struts2.dispatcher.ServletDispatcherResult,查看该类的源代码,其中的doExecute方法,可以看出Dispatcher内部使用了Servlet API,主要是使用RequestDispatcher类进行了请求的转交。
转发有两种方式,一是使用include方式,一是forward方式,这两种方式有些不同。
使用include方式是临时转交,在转发之前前一个Action已经开始写入了响应,include进来的内容只能作为请求的一部分。
使用forward 方法进行的转交是永久转交,在转交之前前一个Action并没有开始写入响应。
但是他们都与重定向的方式有所不同,整个转交过程都属于同一个Request请求。
那就是通过RequestDispatcher来进行页面跳转,将会保持是同一个请求对象。
这有什么好处呢?由于是同一个对象,那就意味着有同样的数据,而请求对象里面数据众多,在Servlet 的request对象里面,典型有如下数据:参数区(parameter),就是用户在页面上填写并提交的数据Head区,由浏览器在发出请求的时候,自动加入到请求包的数据属性区(Attribute),由开发人员存储在属性区的值,通常是通过request.setAttribute 方法、request.getAttribute方法来进行访问Cookie区,由浏览器在发出请求的时候,自动把相关的Cookie数据通过request传递到服务端对于dispatcher的使用范围,除了可以配置jsp外,还可以配置其他的web资源,比如其他的Servlet等。
如果在web.xml中有如下配置:java代码:<servlet><servlet-name>login</servlet-name><servlet-class>cn.javass.servlet.LoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>login</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>那么在struts.xml中可以如下配置:java代码:<result name="toWelcome">/login</result>但是请注意,如果这个web资源是另一个Action的话,不能这么配置,需要使用Struts2的另一种名称为“chain”的ResultType。
(3)使用“dispatcher”的ResultType,不能访问其他web应用中的web资源。
当然,这个特性是由javax.servlet.RequestDispatcher类的forward方法决定的。
(4)更完整的配置方式平时把result对应的jsp的路径,直接作为<result>元素中的文本来配置,这是简化的写法,实际上对于dispatcher还有两个参数可以配置,示例如下:java代码:<result name="toWelcome" type="dispatcher"><param name="location">/s2impl/welcome.jsp</param><param name="parse">true</param></result>location参数就是咱们平时写的下一个jsp的位置,而parse参数决定了location是否可以通过使用OGNL来引用参数,默认为true。
其实,前面使用${folder}来引用Action的folder属性的值的例子,就是使用的OGNL来引用参数。
Redirect5.2.4 名称为redirect的ResultType1:基本使用名称为“redirect”的ResultType,在struts-default.xml里的配置如下:java代码:<result-type name="redirect"class="org.apache.struts2.dispatcher.ServletRedirectResult"/>通过配置可以看出,它对应的实现类是ServletRedirectResult。
这种Result同常也使用JSP作为视图技术。
它包装的是javax.servlet.http.HttpServletResponse类的sendRedirect方法,这个ResultType也是用来实现跳转到下一个页面的。
但是它的功能与上面的dispatcher不同,“redirect”的特点是全新的请求,这就意味着,本次请求和跳转到下一个页面的请求是不同的对象,因此它们的值是不一样的。
可以通过如下的方式来测试一下。
修改前面dispatcher的示例,主要是修改struts.xml,需要把result的type设置为“redirect”。
示例如下:java代码:<action name="helloworldAction"class="cn.javass.action.action.HelloWorldAction"><result name="toWelcome" type="redirect">/s2impl/welcome.jsp</result> </action>其他的可以不用改变,然后回到登录页面,填写帐号和密码,然后点击登录按钮,正确的跳转到了欢迎页面,如下图所示:仔细看看,有什么不同?很明显,这里没有正确的显示出帐号的值来,看看后台有值吗?肯定是有的。
这就说明经过“redirect”这个ResultType,跳转到欢迎页面的时候,两个请求对象不是一个了,因此在欢迎页面无法获取到帐号的值了。
你可以把struts.xml中,type=“redirect”的配置去掉,或者改成type=“dispatcher”,再次运行看看,欢迎页面就应该有值了。
2:几个小知识点对比着dispatcher的ResultType,来看看相应的几个问题。
(1)同样在<result>元素的定义中可以使用Action的execute方法运行之后的数据。
测试示例,同样在Action中定义一个folder字符串,并在execute中对它赋值,跟前面一样,这里就不去赘述了。
那么,在<result>的定义中就可以引用folder这个变量,示例如下:java代码:<result name="toWelcome" type="redirect">/${folder}/welcome.jsp</result> 由于redirect采取重定向的方式,下一个页面会取不到上一个请求对象里面的值,如果要传值的话,可以采用get的方式传参。
示例如下:java代码:<resultname="toWelcome"type="redirect">/${folder}/welcome.jsp?account=${account}</ result>上面这个配置,会向新请求里面传入account的参数,这样在欢迎页面就可以获取到account 的值了。