2024年3月12日发(作者:苹果官方网站查序列号查询)
Rsult是什么
简单的说Result就是Action方法执行完毕之后返回的一串字符串,他指示出Action
执行完之后的下一个页面在哪里,具体页面的位置是我 们在中配置的,就是
在Struts2中内建了许多ResultType,他们都定义在strtus-default包中,我们可以
在中找到这些Result Type的定义
虽然Strtus2内建支持这么多Result Type,但是一般情况下我们都用不到这么多,因
此我们挑几个常用的学习一下,其他的可以在需要的时候再去查看文档。
Result的配置非常简单,
性都不是必须的。
1:配置name属性
按照前面的讲述,name属性是用来跟Action的execute方法返回的字符串相对应
的,用来指示Action运行后跳转到的下一个页面,因此name属性的值可以是任意字符
串。比如有如下的execute方法:
java代码:
public String execute() throws Exception {
return "toWelcome";
}
那么,这里返回的“toWelcome”,在里面就有如下的配置来对应:
java代码:
class="orldAction">
如果不设置的话,默认值为“success”,正好和Action中的“SUCCESS”这个常量
相对应,那样的话,execute方法就应该返回SUCCESS
Dispatcher
从是的配置中可以看出对于Dispatcher类型的Result Type被设置为默
认使用的结果类型。与Dispatcher类型对应的实现类为
tDispatcherResult,查看该类的源代码,其中的
doExecute方法,可以看出Dispatcher内部使用了Servlet API,主要是使用
RequestDispatcher类进行了请求的转交。转发有两种方式,一是使用include方式,一
是forward方式,这两 种方式有些不同。使用include方式是临时转交,在转发之前前
一个Action已经开始写入了响应,include进来的内容只能作为请求的一部分。 使用
forward方法进行的转交是永久转交,在转交之前前一个Action并没有开始写入响应。但
是他们都与重定向的方式有所不同,整个转交过程都属于 同一个Request请求。
那就是通过RequestDispatcher来进行页面跳转,将会保持是同一个请求对象。这有
什么好处呢?由于是同一个对象,那就意味着有同样的数据,而请求对象里面数据众多,
在Servlet的request对象里面,典型有如下数据:
参数区(parameter),就是用户在页面上填写并提交的数据
Head区,由浏览器在发出请求的时候,自动加入到请求包的数据
属性区(Attribute),由开发人员存储在属性区的值,通常是通过ribute
方法、ribute方法来进行访问
Cookie区,由浏览器在发出请求的时候,自动把相关的Cookie数据通过request
传递到服务端
对于dispatcher的使用范围,除了可以配置jsp外,还可以配置其他的web资源,
比如其他的Servlet等。
如果在中有如下配置:
java代码:
那么在中可以如下配置:
java代码:
但是请注意,如果这个web资源是另一个Action的话,不能这么配置,需要使用
Struts2的另一种名称为“chain”的ResultType。
(3)使用“dispatcher”的ResultType,不能访问其他web应用中的web资源。
当然,这个特性是由tDispatcher类的forward方法决定的。
(4)更完整的配置方式
平时把result对应的jsp的路径,直接作为
化的写法,实际上对于dispatcher还有两个参数可以配置,示例如下:
java代码:
/s2impl/
true
location参数就是咱们平时写的下一个jsp的位置,而parse参数决定了location是
否可以通过使用OGNL来引用参数,默认为true。
其实,前面使用${folder}来引用Action的folder属性的值的例子,就是使用的OGNL
来引用参数。
Redirect
5.2.4 名称为redirect的ResultType
1:基本使用
名称为“redirect”的ResultType,在里的配置如下:
java代码:
class="tRedirectResult"/> 通过配置可以看出,它对应的实现类是ServletRedirectResult。 这种Result同常也使用JSP作为视图技术。它包装的是 rvletResponse类的sendRedirect方法,这个ResultType也 是用来实现跳转到下一个页面的。 但是它的功能与上面的dispatcher不同,“redirect”的特点是全新的请求,这就意味 着,本次请求和跳转到下一个页面的请求是不同的对象,因此它们的值是不一样的。 可以通过如下的方式来测试一下。修改前面dispatcher的示例,主要是修改 ,需要把result的type设置为“redirect”。示例如下: java代码: class="orldAction"> 其他的可以不用改变,然后回到登录页面,填写帐号和密码,然后点击登录按钮,正 确的跳转到了欢迎页面,如下图所示: 仔细看看,有什么不同? 很明显,这里没有正确的显示出帐号的值来,看看后台有值吗?肯定是有的。这就说 明经过“redirect”这个ResultType,跳转到欢迎页面的时候,两个请求对象不是一个了, 因此在欢迎页面无法获取到帐号的值了。 你可以把中,type=“redirect”的配置去掉,或者改成type=“dispatcher”, 再次运行看看,欢迎页面就应该有值了。 2:几个小知识点 对比着dispatcher的ResultType,来看看相应的几个问题。 (1)同样在 测试示例,同样在Action中定义一个folder字符串,并在execute中对它赋值, 跟前面一样,这里就不去赘述了。 那么,在 java代码: 由于redirect采取重定向的方式,下一个页面会取不到上一个请求对象里面的值,如 果要传值的话,可以采用get的方式传参。示例如下: java代码: name="toWelcome"type="redirect">/${folder}/?account=${account} 上面这个配置,会向新请求里面传入account的参数,这样在欢迎页面就可以获取到 account的值了。 但是,前面写的欢迎页面是取不到这个account的值的,为什么呢?先来看看前面写 的欢迎页面取值的那句话,如下: java代码: 欢迎账号为 以前的欢迎页面,是通过使用Struts2的标签来获取的account的值,Struts2的标签 会到Struts2 的值栈里面去取值,而这里是执行Result的时候,才再请求上添加了account 这么一个参数,然后就直接回到页面了,根本不会再走一次 Struts2的运行过程,也就是 说,这里传递的这个参数,根本不会进入到这个请求对应的值栈,因此这里这个写法是取 不到值的。 那么该怎么写才能获取到这个account参数的值呢? 有两个简单的方法,一个是直接使用Servlet的HttpServletRequest对象的方法来获 取参数,另外一个方法是直接使用EL表达式,都是可以的,示例如下: java代码: 欢迎账号为<%=ameter("account") %>的朋友来访 欢迎账号为${param['account']}的朋友来访 再次测试看看,此时的欢迎页面就应该有account的值了。 对于dispacher类型和redirect类型的result的配置,我们都是用了简便的方式,实 际上他们有两个共同的参数: location:用来指出结果视图的地址 parse:用来表明是否要把location参数的值当作OGNL表达式来解析。默认值是 true。 1. 2. name="location">/s2impl/ 3. true 4. 5.2.5 名称为chain的ResultType、 1:基本使用 名称为“chain”的ResultType,在里的配置如下: java代码: class="ChainResult"/> chain是一种特殊的视图结果,用来将Action执行完之后链接到另一个Action中继 续执行,新的Action使用上一个Action的上下文(ActionContext),数据也会被传递。 来示例一下,先看看第一个Action,就用HelloWorldAction吧,稍微简化一下,示 例如下: java代码: public class HelloWorldAction extends ActionSupport { private String account; private String password; private String submitFlag; public String execute() throws Exception { ssExecute(); return "toSecond"; } public void businessExecute(){ n("用户输入的参数为 ==="+"account="+account+",password="+password+",submitFlag="+submitFla g); } //属性对应的getter/setter方法,省略了 } 第二个Action,示例代码如下: java代码:查看复制到剪贴板打印 public class SecondAction extends ActionSupport { public String execute() throws Exception { n("现在SecondAction进行处理"); return "toWelcome"; } } 然后到中,配置这两个Action,要注意第一个Action的配置,在配置 “toSecond”这个result的时候,用的就是chain这个ResultType,示例如下: java代码: class="orldAction"> secondAction name="secondAction"class="Action"> 仔细观察上面的欢迎页面,会发现能够访问到用户在登录页面填写的帐号数据。再来 看看后台,会输出如下信息: java代码: 用户输入的参数为===account=test,password=111111,submitFlag=login 现在SecondAction进行处理 其中第一行是HelloWorldAction输出的信息,而第二行,很明显是SecondAction 输出的信息了。 也就是说,用户提交登陆请求,只发出了一次请求,但是有两个Action 来处理了这个请求。这个请求先被HelloWorldAction进行处理,然后 链接到 SecondAction,由SecondAction来继续处理这个请求,并在处理完成后,产生响应, 回到欢迎页面。 2)在上面示例的欢迎页面,照样输出了用户在登录页面提交给HelloWorldAction 的值,这说明使用chian的方式,后面的Action会和前面的Action共用同一个 ActionContext,简单点说就是有同样的数据。 (3)名称为“chain”的ResultType在配置的时候,除了前面示例中的actionName 外,还有一个参数,名称为“namespace”,表示被链接的Action所在包的命名空间,如 果不设置,默认的即是当前的命名空间。配置示例如下: java代码: secondAction 其他Package的namespace
发布者:admin,转转请注明出处:http://www.yc00.com/num/1710190395a1716042.html
评论列表(0条)