一个result代表了一个可能的输出,当Action类的方法执行完成时,它返回一个字符串的结果码,框架根据这个结果码选择对应的result,向用户输出。
result元素有两个属性
name:指定result的逻辑名
type:指定result的类型,不同类型的result代表了不同类型的结果输出
在result元素中,可以使用param子元素来指定这个结果对应的实际资源的位置。param元素有一个必须的属性name,用于指定参数名,param元素的内容给出参数值。如果要指定资源的位置,name属性的值需要设置location,例如:
<packeage name="default" extends = "struts-default">
<action name="login" class="org.struts.action.LoginAction">
<result name="success" type="dispatcher">
<!-- param 元素作为result的子元素,用于为该类型的result设置参数 -->
<param name="location">/success.jsp</param>
</result>
<result name="error" type="dispatcher">
<param name="location">/error.jsp</param>
</result>
<action>
</package>
结果类型
chain:用于Action链式处理
dispatcher:用于Web资源的集成,包括JSP的集成
freemarker:用于FreeMarker的集成
httpheader:用于控制特殊的HTTP行为
redirect:用于重定向到另外的URL
redirectAction:用于重定向到另外的action映射
stream:用于向浏览器返回一个InputStream(通常用于文件下载)
velocity:用于Velocity集成
xslt:用于XML/XSLT集成
plainText:用于显示某特定页面(JSP、HTML)的原始内容(页面代码)
dispatcher
struts2的默认结果类型是dispatcher,也是最常用的结果类型。
dispatcher有两个属性:location和parse,这两个属性都可以通过Struts.xml配置文件中的result元素的param子元素来设置。param元素的name属性指定的结果类型实现类的属性名,param元素的内容给出属性的值,例如:
<result name="success" type="dispatcher">
<param name="location">/success.jsp?id={id}</param>
<param name="parse">true</param>
</result>
location参数用于指定action执行完毕后要转向的目标资源,parse属性是一个布尔类型,如果为true,则解析location参数中的OGNL表达式;如果为false,则不解析。默认为true。由于Dispatcher是默认类型,可以配置为:
<result name="success">/success.jsp</result>
redirect
在使用redirect结果类型的场景中,用户要完成一次与服务器之间的交互,浏览器需要发出两次请求:
例如:在用户登录程序中,用户登录成功后,我们使用redirect结果类型将其重定向到欢迎页面,在欢迎页面中需要显示用户名,那么在配置结果映射时,可以使用OGNL表达式
<action name="login" class="org.struts.action.LoginAction">
<result type="redirect">welcome.jsp?username={username}</result>
<result name="error">/error.jsp</result>
<action>
redirectAction
redirectAction和redirect的区别是前者主要是用于重定向到action
例如:
<package name="public" extends="struts-default">
<action name="login" class="...">
<result type="redirectAction">
<param name="actionName">dashboard</param>
<param name="namespace">/secure</param>
</result>
</action>
</package>
<package name="secure" extends="struts-default" namespace="/secure">
<action name="dashboard" class="...">
<result type="redirectAction">dashboard.jsp</result>
<result name="error" type="redirectAction">error</result>
</action>
<action name="error" class="...">
<result>error.jsp</result>
</action>
</package>
全局结果
在某些场景中,可能有多个action需要访问同一个结果,例如在论坛系统中,用户在发帖、回帖、搜索帖子时都需要先登录,那么我们就可以配置一个全局的login结果,这样action就不需要一 一配置login结果了。
例如:
<package name="default" extends="struts-default" namespace="/bbs">
<global-results>
<result name="error">/error.jsp</result>
<result name="login" type="redirectAction">login!input</result>
</global-results>
<action name="addAriticle" class="...">
<result>list.jsp</result>
</action>
<action name="login" class="...">
<result>index.jsp</result>
</action>
</package>
动态结果
所谓动态结果就是在配置时不知道要执行哪一个结果,在运行时在能确定,例如,一个公司的内部办公系统,它根据用户登录身份来决定可浏览的资源。雇员可访问EmployeeAction,经理可以访问ManagerAction,代码如下:
public class LoginAction extends ActionSupport{
private User user;
// 用于保存请求重定向到action的名字
private String nextAction;
// 提供getter方法,在result映射中使用表达式访问nextAction
public String getNextAction(){
return nextAction;
}
@Override
public String execute throws Exception{
if(...)// 验证用户名、密码
{
if(user.isManager()){
nextAction = "manager";
}
else
nextAction = "employee";
return SUCCESS;
}
else
return ERROR;
}
}
下面在看看Struts.xml配置
<package name="default" extends="struts-default" namespace="/bbs">
<action name="login" class="...">
<result type="redirectAction">${nextAction}</result>
<result name="error">/error.jsp</result>
</action>
<action name="employee" class="...."></action>
<action name="manager" class="...."></action>
</package>