深入详解Struts2——struts.xml配置之Result配置详解

一个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>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值