struts2中常用Result类型的用法


Warning: Undefined array key "HTTP_REFERER" in /www/wwwroot/prod/www.enjoyasp.net/wp-content/plugins/google-highlight/google-hilite.php on line 58

1, dispatcher -forward 转到指定的jsp页面
2,redirect 重定向到jsp页面或action
3,chain 由当前action转到另一action, 形成一个action链,彼些间共享一个ActionContext,在一个action中设置ActionContext属性,可被其它action共享。

redirect 与 dispatcher的区别与 reidrect,forward相似

一、dispatcher

(1)为缺省的result类型,一般情况下我们在struts.xml会这么写:
Xml代码

1. /main.jsp

/main.jsp

以上写法使用了两个默认,其完整的写法为:
Xml代码

1.
2. /maini.jsp 3.

/maini.jsp

第一个默认:type=”dispatcher”;第二个默认:设置的为location参数,location只能是页面,不能是另一个action(可用type=”chain”解决)。

(2)实现方式

从doExecute方法看出,有三个出口(finalLocation为要跳转的地址):

*

pageContext.include(finalLocation);
*

dispatcher.forward(request, response); (dispatcher是根据finalLocation创建的)
*

dispatcher.include(request, response);

而我们知道,forward与include都是转发到context内部的资源。

二、redirect

(1)可以重定向到一个页面,另一个action或一个网址。
Xml代码

1. aaa.jsp
2. bbb.action
3. www.baidu.com

aaa.jsp
bbb.action
www.baidu.com

(2)实现方式:

查看doExecute方法,只有一个出口:

response.sendRedirect(finalLocation);

sendRedirect是重定向,是重新产生一个HTTP请求到服务器,故重定向后其原来所在的action上下文就不可用了。

三、chain

(1)主要用于把相关的几个action连接起来,共同完成一个功能。
Xml代码


step2 //注:是step2而不是step2.action


finish.jsp

(2)实现方式:

查看execute()方法,主要思想如下:

// 根据Action名称finalActionName及要调用的方法finalMethodName来new一个代理对象proxy,并执行之
Java代码

proxy = actionProxyFactory.createActionProxy(finalNamespace,
finalActionName, finalMethodName, extraContext);
proxy.execute();

(3)多个action间数据的传递

主要有两种方式:

1)由于处于chain中的action属于同一个http请求,action处理完后转发到一个action,请求参数全部丢失,action处理结果不会丢失,共享一个ActionContext,故可以在上下文中获取,在页面上可以直接使用。手动获取的
方法如下:

Java代码

HttpServletRequest request = ServletActionContext.getRequest();
String s=(String)request.getAttribute(“propName”);

2)实现ModelDriven接口

在Step1Action中,加入getModel:
Java代码

1. public Object getModel() {
2. return message;
3. }

public Object getModel() {
return message;
}

在Step2Action中,加入setModel:
Java代码

1. public void setModel(Object o){
2. System.out.println(“message is:”+o);
3. }

public void setModel(Object o){
System.out.println(“message is:”+o);
}

注意,setModel的调用先于execute()方法后于构造方法。