其他分享
首页 > 其他分享> > struts2结果视图和动作类型

struts2结果视图和动作类型

作者:互联网

结果视图

1. 结果视图概念
action方法的返回值是String类型的,返回的是对应结果视图的名字,在动作类中,使用return关键字来表达,在对应的struts.xml文件中,使用标签来表达。
2. 结果视图属性

<result name="success" type="dispatcher">/jsp/success.jsp</result>
标签名 解释
name 这是的名字,需要和动作类中return后的名字保持一致
type 这是结果视图跳转的方式,默认是dispatcher,即请求转发值 中包围的内容,就是跳转的路径

3. 结果视图TYPE

类型 说名
type=“dispatcher” 请求转发,地址栏不变,默认值
type=“redirect” 重定向,地址栏变化,防止刷新
type=“chain” 请求转发到一个action动作类,地址栏不变
type=“redirectAction” 重定向到一个action动作类,地址栏变化
type=“stream” 文件上传下载

tips:TYPE类型为重定向时,中包围的内容,写另一个action的名字即可。

跨包重定向
跨包重定向到另一个action,需要借助标签,指定命名空间和参数。但注意,如果两个没有使用namespace进行区分的话,则不认为是跨包操作,redirectAction访问。仍可以直接使用chain或者

<result>
    <param name="namespace">/user</param>
    <param name="actionName">user</param>
</result>

4. 全局结果视图

标签如果写在某个内,则叫做局部结果视图,只对所在的有效,如果标签写在外,则叫做全局结果视图,对所有有效。result的就是要返回的视图路径,name就是result的命名,要对应action中的return字符串,type是跳转方式。
4.1 包内全局结果视图

<package>
    <global-results>
        <result name="error">error.jsp</result>
    </global-results>
    <action>...</action>
</package>

4.2 包外全局结果视图

<!--将global-result放到共同的父类包中-->
<package name="basePackage" extends="struts-default" abstract="true">
    <global-results>
        <result name="error">error.jsp</result>
    </global-results>
</package>
<package name="p1" extends="basePackage"></package>
<package name="p2" extends="basePackage"></package>

5. 返回JSON

Struts2对JSON类型有着良好的支持,但是需要额外导入一个jar包。

<!-- https://mvnrepository.com/artifact/org.apache.struts/struts2-json-plugin -->
<dependency>
	<groupId>org.apache.struts</groupId>
	<artifactId>struts2-json-plugin</artifactId>
	<version>2.5.14.1</version>
</dependency> 

[HTML页面端]

<div>ajax版登录</div>
<form id="form1">
	<input name="login.loginname" type="text" />
	<input name="login.loginpass" type="password" />
	<button type="button" id="btn1">登录</button>
</form>


[JS端:通过ajax将表单传入到action中]
$(function(){
    $("#btn1").on("click",function(){
        $.ajax({
            url : "/My_S25H431/loginAction!loginByAjax.action",
            type: "post",
            data: $("#form1").serialize(),
            success:function(response){
                // 这个返回值就你action中所有具有set/get方法的对象的JSON集合
                // 你可以直接从中获取你想要的值
                //console.log(response);
                if(response.status){
                    alert("登录成功!");
                    location.href="/My_S25H431/html/main.html";
                }else{
                    alert("登录失败!");
                    location.href="/My_S25H431/index.html";
                }
            }
        });
    });
});

[action端:正常return,无需获取response对象]
private Boolean status;// set/get
public String loginByAjax() {
	if(service.login(login)) {
		status=true;// 登录成功
	}else {
		status=false;// 登录失败
	}	
	return "ajaxResponse";
}

[struts.xml端:改动包的继承和result的type类型]

json-default包也是继承了struts-default的

<package name="package2" strict-method-invocation="false" extends="json-default">
	<action name="loginAction" class="com.xhh.action.LoginAction">
		<result name="ajaxResponse" type="json"></result>
	</action>
</package>

动作类型

1. 普通bean作为动作类

方法修饰: public
方法返回值 : String
方法参数: 不需要
方法名: 默认execute:当你不在xml文件中设置method的时候,会自动去寻找execute方法。

2. 实现Action接口

让普通的bean实现Action接口,就是比第一个多提供了一些情景常量。

SUCCESS 返回成功页面(你必须设置了result的name=“success”)
NONE 不返回任何页面,也不报错
ERROR 返回错误页面
INPUT 返回当提交表单发生错误,就跳回到表单页面
LOGIN 返回登录界面

3. 继承ActionSupport类

让普通的bean继承ActionSupport类,开发中常用。

4. Action生命周期

Action的生命周期就是一次请求。

创建:每次请求的时候都会创建一个Action对象(非单例,线程安全的)。
销毁:当Action的动作类执行完方法后,就消失了。

5. 通配符动作类访问

使用通配符来访问Action可以达到一个Action配置搞定多个Action访问。但同一个包中不能存在多个通配符方式的访问配置。
5.1 动作类

在TestAction.java中创建4个方法,这四个方法的名字要有相同的部分。

public String createUser(){
    System.out.println("创建了一个用户");
    return "tocreate";
}
public String retrieveUser(){
    System.out.println("查询一个用户");
    return "toretrieve";
}
public String updateUser(){
    System.out.println("修改一个用户");
    return "toupdate";
}
public String deleteUser(){
    System.out.println("删除一个用户");
    return "todelete";
}

5.2 struts.xml

<package name="pa0" extends="struts-default" strict-method-invocation="false">
    <action name="*User" class="com.xhh.action.TestAction" method="{1}User">
        <result name="{1}">/jsp/{1}User.jsp</result>
    </action>
</package>

{
tips:strtus2.5版本必须在中添加strict-method-invocation=“false”

5.3 访问
http://127.0.0.1:8080/项目名/createUser
http://127.0.0.1:8080/项目名/retrieveUser
http://127.0.0.1:8080/项目名/updateUser
http://127.0.0.1:8080/项目名/deleteUser

6. 动态访问Action

6.1 开启动态访问的权限

对struts.xml文件进行修改,修改如下:

<constant name="struts.enable.DynamicMethodInvocation" value="true" />

2.5版本,有所改动,需要在中更改strict-method-invocation的值为false。

<package name="" extends="struts-default" strict-method-invocation="false">

6.2 动态访问
http://127.0.0.1:8080/180512_j232/user!xxx.action

7. 获取ServletAPI

在Action中,我们也可以获取servlet的一些应用程序接口,来达到action+servlet的共同开发效果。

7.1 内置获取法

使用ServeltActionContext获取request和session和appliaction

HttpServletRequest request = ServletActionContext.getRequest();
HttpServletResponse response = ServletActionContext.getResponse();
HttpSession session = ServletActionContext.getRequest().getSession();
ServletContext application = ServletActionContext.getServletContext();

7.2 接口获取法

实现ServletRequestAware接口后,实现setServletRequest方法,并设置对应setServletRequest方法的request属性,之后在setServletRequest方法中赋值,即可通过反射,得到request,其余像response和appliaction,以此类推。
在这里插入图片描述
tips:红色圈起来的部分,全部需要自己手动编写。
tips:HttpSession可以通过request.getSession()来获取。(比实现SessionAware好)
tips:这种方式相对比较麻烦,一般不建议使用。

标签:return,动作,视图,Action,struts2,动作类,action,type
来源: https://blog.csdn.net/xhuihong/article/details/98469241