struts2 Action如何返回到视图中

Struts2框架 通过配置 result标签来 把Action的处理结果和视图对应,来决定Action返回到哪一个视图
1.Action的处理结果是一个字符串,Action把这个处理结果交给Struts2框架
2.Struts2框架决定这个处理结果对应哪个视图。

<struts>
    <package name="users" namespace="/users" extends="struts-default">      
        <action name="*_*" class="action.{1}Action" method="{2}">
            <!-- name:action返回结果,默认是success -->
            <!-- result的值 如果有"/" 表示:.jsp页面的绝对路径 --> 
            <!-- result的值 如果没有有"/" 表示:jsp页面 是执行action所在的package-namespace指定的路径-->
            <result name="success">/users/success.jsp</result>      
        </action>
    </package>
</struts>

1. result标签-name属性 代表Action的返回值:Struts2框架内置的5个返回值
SUCCESS:Action正确执行,返回给响应视图
NONE:Action正确执行,不返回任何视图
FAILURE:Action执行失败,返回处理错误结果的视图。
LOGIN:Action因为没有登录而执行失败,返回登录视图
INPUT :Action执行需要从前端页面获取参数,但是对这些参数的验证不通过( 1.参数类型转换错误(在age等)2.某些input值不能为空等),将自动返回该视图

上面的意思是:如果Action中的某个方法返回的是SUCCESS,将对应配置文件中<result name="success"> ,至于配置文件中<result name="success"> 对应哪个视图,就由程序员说了算了。

public class LoginAction {

    // 处理登录请求
    public String login() {
        // 如果用户名是amdin密码是123,用户登录成功     
        return SUCCESS;
    }
}
<struts>

    <package name="users" namespace="/" extends="struts-default">

        <action name="*_*" class="action.{1}Action" method="{2}">
            <result name="success">/users/users_login_success.jsp</result>      
        </action>

    </package>
</struts>

处理结果类型INPUT比较特殊 Action会自动返回 INPUT

情况一:参数类型转换错误。如果表单的参数中含有整形变量,但是表单中提交的是字符串,这时Action会自动返回INPUT. 并不会返回Action自定义的返回值。

    <form action="login.action" method="post">
        <div>
            用户名:<input type="text" name="username"></input>
        </div>
        <div>
            年龄:<input type="text" name="age"></input>
        </div>
        <div>
            <input type="submit" value="登录" />
        </div>
    </form>


public class LoginAction {

    private String username;
    private Integer age;

    // 处理登录请求
    public String login() {

        if ("admin".equals(username) ) {
            session.put("loginInfo", username);
            return SUCCESS;
        } else {
            session.put("loginError", "用户名或密码错误");
            return ERROR;
        }

    }
}

情况二:校验结果 this.addFieldError(“username”, “用户名不能为空”);中有数据
如果校验的 代码写在自定义方法中,要显示定义 返回INPUT

    public String login() {
        if (username == null || "".equals(username)) {
            this.addFieldError("username", "用户名不能为空");
            return INPUT;
        }

        if ("admin".equals(username) && "123".equals(password)) {
            session.put("loginInfo", username);
            return SUCCESS;
        } else {
            session.put("loginError", "用户名或密码错误");
            return ERROR;
        }

    }

情况三:校验代码写在validate()方法中 并且校验结果 this.addFieldError(“username”, “用户名不能为空”);中有数据 会自动返回INPUT

@Override
public void validate() {
    if (username == null || "".equals(username)) {
        this.addFieldError("username", "用户名不能为空");
    }
}

2. result标签的type属性 代表处理结果的类型

<action name="author">
    <result name="success" type="">/users/success.jsp</result>
</action>

struts2支持多种视图技术:JSP, Valocity,FreeMarker等

result中的type类型,type属性值代表的是支持的视图类型

type的默认值是dispatcher 支持jsp视图技术
属性值:chain:将action和另外一个action链接起来。
属性值:redirect:重定向(会丢失请求参数)。
属性值:plaintext:返回网页源代码。
属性值:stream:返回inputstream用于文件下载。

3. result标签的子标签

<action name="author">
    <result name="success">
        <!-- location属性 定义了该视图赌赢的实际视图资源 -->
        <param name="location">/users/success.jsp</param>
        <!-- parse属性 执行是否可以在实际视图名字中使用OGNL表达式,默认可以 -->
        <param name="parse">false</param>
    </result>

</action>

4. Action的返回结果有两种类型:局部结果和全局结果。

局部结果:每个Action中的结果 局部结果把<result>标签配置在<action>标签中

全局结果:所有Action共用的结果 全局结果把<result>标签配置在<global-results>标签中

<struts>
    <package name="pack001" extends="struts-default">
        <!-- 如果是404错误 -->
        <global-results>
            <result name="ERROR404">/note.jsp</result>
        </global-results>
    </package>

</struts>
posted on 2017-09-22 10:26  dreamstar  阅读(249)  评论(0编辑  收藏  举报