Struts2中的action

原创
2016/10/27 23:13
阅读数 79

2、Struts2中的action

    Struts2中的Action是一个纯Java对象,默认的Action会执行execute()方法。

    2.1、访问不同的方法

        1、可以为Action设置多个method,之后在struts.xml文件中配置这些Action所对应的方法。

		<!-- 可以为一个action写多个方法进行对应,这样可以减少action类的数量,
				但是无法减少配置的数量 -->
		<action name="user_addInput" class="org.struts.action.UserAction" method="addInput">
			<result name="success">/WEB-INF/user/addInput.jsp</result>
		</action>
		<action name="user_add" class="org.struts.action.UserAction" method="add">
			<result name="success">/WEB-INF/user/add.jsp</result>
		</action>
		<action name="user_list" class="org.struts.action.UserAction" method="list">
			<result name="success">/WEB-INF/user/list.jsp</result>
		</action> 
        <!-- 创建了多个action,并且为action中的每一个方法都设置一个对应
             导致的问题就是:action要配置的数量太多,不方便操作 -->

        2、只是写一个action,通过一些特殊的方法来进行访问。

		<!-- 以下方式可以仅仅写一个action,之后通过在调用的时候确定方法,
             通过在调用时user!addInput.action来完成某个特定方法的调用。 
			这个方法虽然减少了action的配置,但是依然得增加大量的结果集进行配置 -->
		<action name="user" class="org.struts.action.UserAction">
            <!-- 默认的result的name就是success,
                 下面每一个方法都有不同的返回字符串 -->
			<result name="add">/WEB-INF/User/add.jsp</result>
			<result name="addInput">/WEB-INF/User/addInput.jsp</result>
			<result name="list">/WEB-INF/User/list.jsp</result>
		</action>
        <!-- 如果希望调用不同的方法,需要按照如下写法书写:
             user!add.action:表示会调用user这个action中的add方法
             user.action?method:list:表示会调用user这个action中的list方法 -->

        以上操作的问题是:需要为不同的方法设定不同的返回值,这个名称不好统一。

        特别注意:使用以上配置方法,必须设置以下值:

<struts>
	<!-- 动态调用方法必须设置下面的值 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />

        3、使用通配符的方式

		<!-- 基于通配符的方式:这样只要约定好规则可以大大减少action的编写 -->
		<!-- name="*_*":当在浏览器中输入User_addInput.action时,User就会去对应第一个*,
			addInput会去对应第二个*。
			{1}:表示第一个*所对应的名称,如果是User_add表示访问的action是UserAction。
			{2}:表示第二个*所对应的名称,如果是User_add表示会访问UserAction中的add方法 -->
		<action name="*_*" class="org.struts.action.{1}Action" method="{2}">
			<!-- 只要方法返回的是success就会去/WEB-INF/下找相应的jsp文件,如果是
				User_add.action表示会去找/WEB-INF/User/add.jsp文件 -->
			<result>/WEB-INF/{1}/{2}.jsp</result>
			<!-- 设置客户端跳转,方法返回的名称为name="r_list" -->
			<result type="redirect" name="r_list">/{1}_list</result>
		</action>

    在开发中一般都使用通配符的方式(这样可以大大减少action的配置)。

    2.2、一些常量的配置

    可以通过<constant>标签来设置一些常量的配置,这些常量可以通过struts的jar包来查询。

	<!-- 动态调用方法必须设置 -->
	<constant name="struts.enable.DynamicMethodInvocation" value="true" />
	<!-- 设置扩展名 -->
	<constant name="struts.action.extension" value="action,do,html"/>
	<!-- 设置修改了配置文件后不用重新启动直接生效 -->
	<constant name="struts.configuration.xml.reload" value="true"/>

    2.3、全局结果集

    <package name="default" namespace="/" extends="struts-default">
    	<!-- 所有的action只要返回了error,如果在action内部没有设置的话就会找到这个
    		全局结果集所对应的页面 -->
    	<global-results>
    		<result name="error">/WEB-INF/inc/error.jsp</result>
    	</global-results>

    2.4、参数的传递

        1、对于servlet而言传递参数是通过request或Session等servlet作用域进行传递的。

        2、对于Struts2而言,传递参数非常简单。

        方式一:

public class UserAction {
	/**
	 * 直接在action中设定两个属性,之后为属性提供get和set方法(struts是通过get和set来取值的)。
	 * 之后直接在页面通过EL表达式(${})或者<s:property value="xxx"/>标签即可以得到值
	 */
	private String username;
	private String password;
	
	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

    方式二:可以通过ActionContext来设置值。取值时:如果使用EL表达式直接取值即可,如果使用
                <s:property value="#aaa"/>建议在值前增加#。

	public String list() {
		//传值的第一种方式,直接通过在action中设置相应的get和set方法
		this.setUsername("张三");
		this.setPassword("123");
		//第二种方式通过ActionContext完成值的传递
		ActionContext.getContext().put("aaa", 12345);
		ActionContext.getContext().put("bbb", 67890);
		ActionContext.getContext().put("ccc", "abc");
		//第三种传值方式,可以直接通过Servlet的API传值
		ServletActionContext.getRequest().setAttribute("hello", "world");
		return "success";
	}

    方式三:使用Servlet API(一般不推荐使用)

		//第三种传值方式,可以直接通过Servlet的API传值
		//使用Servlet API来设置值,取值:EL表达式,<s:property value="#request.hello"/>
		ServletActionContext.getRequest().setAttribute("hello", "world");
		return "success";

    3、在action中接收参数:只要定义相应的属性并且设置相应的get和set方法,会自动完成传值。

http://localhost:8080/struts01/User_addInput.action?username=abc&password=123

 

展开阅读全文
打赏
0
2 收藏
分享
加载中
更多评论
打赏
0 评论
2 收藏
0
分享
返回顶部
顶部