struts2 学习笔记

[align=center][b] Structs学习笔记[/b][/align]
一、建立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的作用
[u]namespace决定了action的访问路径,默认为"",可以接收所有路径的action
namespace可以写为/,或者/xxx,或者/xxx/yyy,对应的action访问路径为/index.action, /xxx/index.action,或者/xxx/yyy/index.action.
namespace最好也用模块来进行命名[/u]
三、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
[list]
[*]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都压缩进去。
[/list]
十七、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” />
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值