result讲解

result讲解


2024年3月12日发(作者:苹果官方网站查序列号查询)

Rsult是什么

简单的说Result就是Action方法执行完毕之后返回的一串字符串,他指示出Action

执行完之后的下一个页面在哪里,具体页面的位置是我 们在中配置的,就是

子元素,例如我们在前面UserAction中配置的Result:

/

在Struts2中内建了许多ResultType,他们都定义在strtus-default包中,我们可以

在中找到这些Result Type的定义

虽然Strtus2内建支持这么多Result Type,但是一般情况下我们都用不到这么多,因

此我们挑几个常用的学习一下,其他的可以在需要的时候再去查看文档。

Result的配置非常简单,元素可以有name属性和type属性,但是两种属

性都不是必须的。

1:配置name属性

按照前面的讲述,name属性是用来跟Action的execute方法返回的字符串相对应

的,用来指示Action运行后跳转到的下一个页面,因此name属性的值可以是任意字符

串。比如有如下的execute方法:

java代码:

public String execute() throws Exception {

return "toWelcome";

}

那么,这里返回的“toWelcome”,在里面就有如下的配置来对应:

java代码:

class="orldAction">

/s2impl/

如果不设置的话,默认值为“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代码:

login

ervlet

login

/login

那么在中可以如下配置:

java代码:

/login

但是请注意,如果这个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">

/s2impl/

其他的可以不用改变,然后回到登录页面,填写帐号和密码,然后点击登录按钮,正

确的跳转到了欢迎页面,如下图所示:

仔细看看,有什么不同?

很明显,这里没有正确的显示出帐号的值来,看看后台有值吗?肯定是有的。这就说

明经过“redirect”这个ResultType,跳转到欢迎页面的时候,两个请求对象不是一个了,

因此在欢迎页面无法获取到帐号的值了。

你可以把中,type=“redirect”的配置去掉,或者改成type=“dispatcher”,

再次运行看看,欢迎页面就应该有值了。

2:几个小知识点

对比着dispatcher的ResultType,来看看相应的几个问题。

(1)同样在元素的定义中可以使用Action的execute方法运行之后的数据。

测试示例,同样在Action中定义一个folder字符串,并在execute中对它赋值,

跟前面一样,这里就不去赘述了。

那么,在的定义中就可以引用folder这个变量,示例如下:

java代码:

/${folder}/

由于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">

/s2impl/

仔细观察上面的欢迎页面,会发现能够访问到用户在登录页面填写的帐号数据。再来

看看后台,会输出如下信息:

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条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信