当前位置:首页 > 开发 > 编程语言 > Struts2 > 正文

struts2 学习笔记

发表于: 2013-04-25   作者:chinrui   来源:转载   浏览次数:
摘要: Structs学习笔记 一、建立structs项目的时候需要配置structs.xml以及web.xml文件 web.xml的简单配置(配置filter) <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.n
Structs学习笔记

一、建立structs项目的时候需要配置structs.xml以及web.xml文件
web.xml的简单配置(配置filter)
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
structs.xml文件的配置(配置package)
<constant name="struts.devMode" value="false" />
<package name="default" namespace="/" extends="struts-default">
    <action name="hello_structs">
        <result>
            /Hello.jsp
        </result>
    </action>
</package>

二、namespace的作用
namespace决定了action的访问路径,默认为"",可以接收所有路径的action
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action, /xxx/index.action,或者/xxx/yyy/index.action.
namespace最好也用模块来进行命名

三、action的class属性
<package name="front" extends="struts-default" namespace="/">
    <action name="index" class="com.bjsxt.struts2.front.action.IndexAction1">
        <result name="success">/ActionIntroduction.jsp</result>
    </action>
</package>

当访问到index的时候,会访问IndexAction1的返回值来调用相应的result,返回相应的jsp文件。
而自己定义的Action只是一个普通的java类,里面只要含有public String execute()方法即可。
而实现Action有三种方法:
第一种:写一个普通的java类,里面包含execute()方法
public class IndexAction1 {
	public String execute() {
		return "success";
	}
}

第二种:写一个类实现Action接口,重写execute()方法
public class IndexAction2 implements Action {
	public String execute() {
		return "success";
	}
}

第三种:写一个类继承ActionSupport类,重写execute()方法
public class IndexAction3 extends ActionSupport {
	public String execute() {
		return "success";
	}
}

由于第三种方法实现了Action接口,且里面提供了大量的已经定义好的方法,所以在企业开发的过程中一般选用的第三种方法,前面两种方法可以不记。
四、路径问题
struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以尽量不要使用相对路径。
虽然可以用redirect方式解决,但redirect方式并非必要。
解决办法非常简单,统一使用绝对路径。(在jsp中用request.getContextRoot方式来拿到webapp的路径)
或者使用myeclipse经常用的,指定basePath
五、Action的动态方法调用(DMI)
<package name="user" extends="struts-default" namespace="/user">
    <action name="userAdd" class="com.bjsxt.struts2.user.action.UserAction" method="add">
        <result>/user_add_success.jsp</result>
    </action>
    
    <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
        <result>/user_add_success.jsp</result>
    </action>
</package>

指定method的时候,调用method指定的方法,如果没有指定method的值,则可以通过在写链接的时候在相应的action后面加上!和方法的名字,进行动态的调用方法,eg: user!add…其中user为action的名字,add为Action的方法。
六、通配符的使用(简化配置)
<package name="actions" extends="struts-default" namespace="/actions">
    <action name="Student*" class="com.bjsxt.struts2.action.StudentAction" method="{1}">
     	<result>/Student{1}_success.jsp</result>
    </action>
    
    <action name="*_*" class="com.bjsxt.struts2.action.{1}Action" method="{2}">
     	<result>/{1}_{2}_success.jsp</result>
    </action>
</package>

*表示匹配所有,而{1}和{2}分别表示匹配第一个*和第二个*所匹配的内容。
1、如果将请求的action写成Studentadd,那么{1}处就会指定调用的方法为add(),而action又指定为StudentAction,那么就会调用StudentAction里面的add()方法,返回的jsp文件为Studentadd_success.jsp.
2、如果将请求的action写成Teacher_add,那么{1}处为Teacher,所以调用TeacherAction,{2}处为add,所以调用add()方法,而返回的jsp文件为Teacher_add_success.jsp.
七、action参数的接收
1、通过Action类的成员变量来接收参数,不过必须让调用参数的方法名与参数名进行对应。
struts.xml文件配置
<package name="user" extends="struts-default" namespace="/user">
    <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
        <result>/user_add_success.jsp</result>
    </action>
</package>

发出请求
<a href="user/user!add?name=aaaa&age=8">添加用户</a>

参数的接收
public class UserAction extends ActionSupport {
	private String name;
	private int age;
	public String add() {
		System.out.println("name=" + name);
		System.out.println("age=" + age);
		return SUCCESS;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

2、使用DomainMode接收参数
struts.xml文件配置
<package name="user" extends="struts-default" namespace="/user">
    <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
        <result>/user_add_success.jsp</result>
    </action>
</package>

发出请求
<a href="user/user!add?user.name=a&user.age=8">添加用户</a>
参数接收,自己不要实例化Model,stucts会帮你创建
public class UserAction extends ActionSupport {
	private User user;
	public String add() {
		System.out.println("name=" + user.getName());
		System.out.println("age=" + user.getAge());
		return SUCCESS;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
}

对象的封装
public class User {
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}

***当传入的参数与要接收的参数不匹配时,使用DTO接收数据,再使用DTO将数据传给Model对象进行生成初始化Model
3、使用ModelDriven接收参数
struts.xml配置
<package name="user" extends="struts-default" namespace="/user">
    <action name="user" class="com.bjsxt.struts2.user.action.UserAction">
        <result>/user_add_success.jsp</result>
    </action>
</package>

发出请求
<a href="user/user!add?name=a&age=8">添加用户</a>

Action的写法,Model对象要自己创建,要实例ModelDriven接口,使用getModel()方法返回Model对象
public class UserAction extends ActionSupport implements ModelDriven<User>{
	private User user = new User();
	public String add() {
		System.out.println("name=" + user.getName());
		System.out.println("age=" + user.getAge());
		return SUCCESS;
	}
	@Override
	public User getModel() {
		return user;
	}
}

八、字符编码(中文)
<constant name="struts.i18n.encoding" value="GBK" /> <!-- internationalization -->
九、获得Web元素
public class LoginAction2 extends ActionSupport implements RequestAware,SessionAware, ApplicationAware {
	private Map<String, Object> request;
	private Map<String, Object> session;
	private Map<String, Object> application;

	//DI dependency injection
	//IoC inverse of control
	public String execute() {
		request.put("r1", "r1");
		session.put("s1", "s1");
		application.put("a1", "a1");
		return SUCCESS; 
	}

	@Override
	public void setRequest(Map<String, Object> request) {
		this.request = request;
	}
	@Override
	public void setSession(Map<String, Object> session) {
		this.session = session;
	}
	@Override
	public void setApplication(Map<String, Object> application) {
		this.application = application;
	}
}

还有其它三种获得request、session、application及HttpRequest、HttpSession、ServletContext对象的方法。不过实际开发只使用这种而已。
十、Struts里面的文件包含
<struts>
    <constant name="struts.devMode" value="false" />
    <include file="login.xml" />
</struts>

十一、设置默认的action
<default-action-ref name="index"></default-action-ref>
十二、常用的跳转方式
1. dispatcher :forword 到jsp页面
2. redirect :Redirecte 到jsp页面
3. chain :forword 到action
4. redirectAction :Redirect 到action
使用:(注意路径问题,即/的添加)
<action name="r1">
	<result type="dispatcher">/r1.jsp</result>
</action>
<action name="r2">
	<result type="redirect">/r2.jsp</result>
</action>
<action name="r3">
	<result type="chain">r1</result>
</action>
<action name="r4">
	<result type="redirectAction">r2</result>
</action>

十三、定义全局的action以及extends属性的作用
<struts>
	<constant name="struts.devMode" value="f" />
	<package name="user" namespace="/user" extends="struts-default">
		<global-results>
			<result name="mainpage">/main.jsp</result>
		</global-results>
		<action name="index">
			<result>/index.jsp</result>
		</action>
		<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
			<result>/user_success.jsp</result>
			<result name="error">/user_error.jsp</result>
		</action>
	</package>
	<package name="admin" namespace="/admin" extends="user">
		<action name="admin" class="com.bjsxt.struts2.user.action.AdminAction">
			<result>/admin.jsp</result>
		</action>
	</package>
</struts>

十四、动态结果集
访问请求:
<ol>
	<li><a href="user/user?type=1">返回success</a></li>
	<li><a href="user/user?type=2">返回error</a></li>
</ol>

Action:
public class UserAction extends ActionSupport {
	private int type;
	private String r;
	public String getR() {
		return r;
	}
	public void setR(String r) {
		this.r = r;
	}
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	@Override
	public String execute() throws Exception {
		if(type == 1) r="/user_success.jsp";
		else if (type == 2) r="/user_error.jsp";
		return "success";
	}
}

struts.xml的配置:
<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
	<result>${r}</result>
</action>

重点:使用${}读取ValueStack里面的值,而使用#key读取StackContext里面的值。
十五、向result传参数
访问请求:
<li><a href="user/user?type=1">传参数</a></li>

Action:
public class UserAction extends ActionSupport {
	private int type;
	public int getType() {
		return type;
	}
	public void setType(int type) {
		this.type = type;
	}
	@Override
	public String execute() throws Exception {
		return "success";
	}
}

struts.xml的配置:
	<package name="user" namespace="/user" extends="struts-default">
		<action name="user" class="com.bjsxt.struts2.user.action.UserAction">
			<result type="redirect">/user_success.jsp?t=${type}</result>
		</action>
	</package>

参数的读取:(由于传递给result的参数没有使用Action接收,所以存放在StackContext里面,使用${}进行读取)
<body>
	User Success!<br />
	from valuestack: <s:property value="t"/><br/>    此方法不能读取出任何值出来
	from actioncontext: <s:property value="#parameters.t"/>
	<s:debug></s:debug>
</body>

十六、OGNL表达式(Object Graph Navigation Language)
访问ValueStack里面的静态方法时,需要设置struts.ognl.allowStaticMethodAccess属性为true
  • 1、 ValueStack里面的值可以直接读取。eg:<s:property value="username"/> 读取username的值
  • 2、 Domain Model 的初始化:Domain Model可以自己通过new()方法来创建,也可以让其自动初始化,不过要传入相应的属性值,而且Domain Model要有参数为空的构造方法。
  • 3、 访问值栈对象普通的属性:<s:property value="cat.friend.name"/>
  • 4、 访问值栈对象普通的方法:<s:property value="password.length()"/>
  • 5、 访问值栈action的普通方法:<s:property value="m()" />
  • 6、 访问静态的方法:<s:property value="@com.bjsxt.struts2.ognl.S@s()"/>
  • 7、 访问静态的属性:<s:property value="@com.bjsxt.struts2.ognl.S@STR"/>
  • 8、 访问Math类的静态方法:<s:property value="@@max(2,3)" />
  • 9、 访问普通类的构造方法:<s:property value="new com.bjsxt.struts2.ognl.User(8)"/>
  • 10、 访问List:<s:property value="users"/>
  • 11、 访问List中某个元素:<s:property value="users[1]"/>
  • 12、 访问List中元素某个属性的集合:<s:property value="users.{age}"/>
  • 13、 访问List中元素某个属性的集合中的特定值: <s:property value="users[0].age"/>
  • 14、 访问Set中的某个元素:不能实现,因为Set为无序的
  • 15、 访问Map中某个元素:<s:property value="dogMap.dog101"/>   Map实例的名字加上Key值得到Value
  • 16、 访问Map中所有的key:<s:property value="dogMap.keys"/>
  • 17、 访问Map中所有的value:<s:property value="dogMap.values"/>
  • 18、 访问容器的大小:<s:property value="dogMap.size()"/> | <s:property value="users.size"/>
  • 19、 投影(过滤):<s:property value="users.{?#this.age==1}[0]"/>
  • 20、 投影:<s:property value="users.{^#this.age>1}.{age}"/>
  • 21、 投影:<s:property value="users.{$#this.age>1}.{age}"/>
  • 22、 投影:<s:property value="users.{$#this.age>1}.{age} == null"/>
  • 23、 []:<s:property value="[0].username"/>   通过[]访问ValueStack
  • 24、 什么时候会用两个action?答:当使用chain进行action之间的跳转的时候,会把所有用到的action都压缩进去。

十七、Struts Tags
[list]
  • 1、 property: <s:property value="username"/>
  • 2、 property 取值为字符串: <s:property value="'username'"/>
  • 3、 property 设定默认值: <s:property value="admin" default="管理员"/>
  • 4、 property 设定HTML: <s:property value="'<hr/>'" escape="false"/>
  • 5、 set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" />
  • 6、 set 从request取值: <s:property value="#request.adminName" />
  • 7、 set 从ActionContext取值: <s:property value="#adminName" />
  • 8、 set 设定var,范围为session: <s:set var="adminPassword" value="password" scope="session"/>
  • 9、 set 从相应范围取值: <s:property value="#session.adminPassword"/>
  • 10、 <s:bean></s:bean>标签
  • bean 定义bean,并使用param来设定新的属性值:(bean标签开始把值放在ValueStack里面,结束时去除存储的值,所以使用的时候只能从ValueStack里面取值,如果需要长期存储则使用var将其存放在StackContext里面)
  • <s:bean name="com.bjsxt.struts2.tags.Dog" >
    	<s:param name="name" value="'pp'"></s:param>
    	<s:property value="name"/>
    </s:bean>

    bean 查看debug情况:
    <s:bean name="com.bjsxt.struts2.tags.Dog" var="myDog">
    	<s:param name="name" value="'oudy'"></s:param>
    </s:bean>

    拿出值:<s:property value="#myDog.name"/>
  • 11、 使用%将String强制转换为OGNL<s:include value="%{#incPage}"></s:include>
  • 12、 if elseif else:
  • age = <s:property value="#parameters.age[0]" /> <br />
    	<s:if test="#parameters.age[0] < 0">wrong age!</s:if>
    	<s:elseif test="#parameters.age[0] < 20">too young!</s:elseif>
    	<s:else>yeah!</s:else><br />

    判断取值是否为空:
    <s:if test="#parameters.aaa == null">null</s:if>
  • 13、 <li>遍历集合:<br />
  • 	<s:iterator value="{1, 2, 3}" >
    		<s:property/> |
    	</s:iterator>
    	</li>
    	<li>自定义变量:<br />
    	<s:iterator value="{'aaa', 'bbb', 'ccc'}" var="x">
    		<s:property value="#x.toUpperCase()"/> |
    	</s:iterator>
    	</li>
    	<li>使用status:<br />
    	<s:iterator value="{'aaa', 'bbb', 'ccc'}" status="status">
    		<s:property/> | 
    		遍历过的元素总数:<s:property value="#status.count"/> |
    		遍历过的元素索引:<s:property value="#status.index"/> |
    		当前是偶数?:<s:property value="#status.even"/> |
    		当前是奇数?:<s:property value="#status.odd"/> |
    		是第一个元素吗?:<s:property value="#status.first"/> |
    		是最后一个元素吗?:<s:property value="#status.last"/>
    		<br />
    	</s:iterator>
    	</li>
  • 14、 定义Map的时候要加上#
  • <li>
    	<s:iterator value="#{1:'a', 2:'b', 3:'c'}" >
    		<s:property value="key"/> | <s:property value="value"/> <br />
    	</s:iterator>
    	</li>
    	<li>
    	<s:iterator value="#{1:'a', 2:'b', 3:'c'}" var="x">
    		<s:property value="#x.key"/> | <s:property value="#x.value"/> <br />
    	</s:iterator>
    	</li>

    [/list]
    十八、Struts里面的异常处理
    1、 一个单独的action里面的异常
    <action name="*-*" class="xiong.rui.love.action.{1}Action" method="{2}" >
    	<result>/admin/{1}-{2}.jsp</result>
    	<result name="input" >/admin/{1}-{2}.jsp</result>
    	<exception-mapping result="error" exception="java.lang.Exception" />
    	<result name="error" >/error.jsp</result>
    </action>

    2、 所有异常的处理
    (1)、如果每个单独的action要处理异常的页面不样,则新建一个全局的包,并让要处理异常的包继承这个包:
    <package name="default-exception" namespace="/" extends="struts-default" >
    	<global-exception-mappings>
    		<exception-mapping result="error" exception="java.lang.Exception" />
    	</global-exception-mappings>
    </package>

    (2)、统一处理所有异常
    <package name="default-exception" namespace="/" extends="struts-default" >
    	<global-results>
    		<result name="error" >/error.jsp</result>
    	</global-results>
    	<global-exception-mappings>
    		<exception-mapping result="error" exception="java.lang.Exception" />
    	</global-exception-mappings>
    </package>

    十九、国际化
    1、javaProject里面的国际化
    利用properties文件存储要显示信息,用相同的key值,当使用中文的时候,要使用e:\JAVA\JDK\bin\native2ascii命令转换。Eg: e:\JAVA\JDK\bin\native2ascii app_zh_CN_temp.properties app_zh_CN.properties
    注意:要转换的文件应该和你的机器的中文编码方式一样:我的是GBK,故app_zh_CN_temp.properties为GBK编码。
    3、 struts里面的国际化
    (1)、action级别的,极少用或者就是不用
    Properties文件为名称为:xxAction_zh_CN.properties
    Properties文件值的获取方法:<s:property value=”getText(‘login.username’)” />
    第二种获取properties值的方法:<s:text name=”login.username” />
    (2)、全局设置
    src目录下面建立文件xxx_zh_CN.properties,xxx表示任何字母组合,不过要在struts.xml声明<constant name="struts.custom.i18n.resources" value="xxx"></constant>,这样就可以使用国际化了!
    在使用国际化的配置文件中,也可以动态的指定显示内容:
    welcome.msg=welcome,{0} {0}为动态指定一个内容,使用标签<s:text>时,传入参数即可。
    <s:text name="welcome.msg">
    	<s:param value="username" ></s:param>
    </s:text>

    二十、数据类型转换
    1、 String转换成Date类型
    (1)、设置数据类型为java.util.Date
    (2)、传入参数的格式为:月/日/年  eg:10/16/1992
    (3)、获取日期类型的方法:<s:property value="date" />或者<s:date name="date" format="yyyy-MM-dd HH:mm:ss"/><br/>
    2、String转换成List<String>
    (1)、必须使用泛型
    (2)、传入参数的方式:list=first&list=second
    (3)、获取参数的方式:<s:property value=”list” />
    3、String转换成Map<String , String>
    (1)、必须使用泛型
    (2)、传入参数的方式:map['age']=age&map['name']=name
    (3)、获取参数的方式:<s:property value=”map” />

    struts2 学习笔记

    • 0

      开心

      开心

    • 0

      板砖

      板砖

    • 0

      感动

      感动

    • 0

      有用

      有用

    • 0

      疑问

      疑问

    • 0

      难过

      难过

    • 0

      无聊

      无聊

    • 0

      震惊

      震惊

    编辑推荐
    Struts2学习笔记 1.官网下载包 URL:http://struts.apache.org/ 解压:/apps/struts2-blank.war 拷贝:
    Struts2学习笔记 1.官网下载包 URL:http://struts.apache.org/ 解压:/apps/struts2-blank.war 拷贝:
    Struts原理简介:http://blog.csdn.net/wfdmd/article/details/367675 struts1: 全局forward是都可以
    Struts原理简介:http://blog.csdn.net/wfdmd/article/details/367675 struts1: 全局forward是都可以
    在ssh2框架中,jsp页面负责展示相应的信息,并通过相应的配置同action联系起来实现逻辑判断。这里面
    OGNL介绍 OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expressi
    OGNL介绍 OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expressi
    转自:http://blog.csdn.net/lilp_ndsc/article/details/4058389 另可参见:http://callan.iteye.co
    今天的重点: namespace决定了action的访问路径,默认为“”,可以接受所有路径的action namespace
    truts2 校验框架 Struts2 和Struts1同样也提供了校验框架,但在Struts2 已经不再把校验框架做为一个
    版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号