二、Struts2中的actionhtml
Struts2中的Action是一个纯Java对象,默认的Action会执行execute()方法。java
2.一、访问不一样的方法浏览器
一、能够为Action设置多个method,以后在struts.xml文件中配置这些Action所对应的方法。jsp
<!-- 能够为一个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要配置的数量太多,不方便操做 -->
二、只是写一个action,经过一些特殊的方法来进行访问。this
<!-- 如下方式能够仅仅写一个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方法 -->
以上操做的问题是:须要为不一样的方法设定不一样的返回值,这个名称很差统一。spa
特别注意:使用以上配置方法,必须设置如下值:code
<struts> <!-- 动态调用方法必须设置下面的值 --> <constant name="struts.enable.DynamicMethodInvocation" value="true" />
三、使用通配符的方式xml
<!-- 基于通配符的方式:这样只要约定好规则能够大大减小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的配置)。htm
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.三、全局结果集
<package name="default" namespace="/" extends="struts-default"> <!-- 全部的action只要返回了error,若是在action内部没有设置的话就会找到这个 全局结果集所对应的页面 --> <global-results> <result name="error">/WEB-INF/inc/error.jsp</result> </global-results>
2.四、参数的传递
一、对于servlet而言传递参数是经过request或Session等servlet做用域进行传递的。
二、对于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";
三、在action中接收参数:只要定义相应的属性而且设置相应的get和set方法,会自动完成传值。
http://localhost:8080/struts01/User_addInput.action?username=abc&password=123