struts2学习中的那点事儿
来源:互联网 发布:开源java点餐系统 编辑:程序博客网 时间:2024/06/15 12:59
struts2学习中的那点事儿
第一:搭建
创建web工程,引入struts2对应版本的jar包,创建struts.xml配置文件,修改web.xml文件的filter及filter-mapping;
关注一下struts.xml文件,重点熟悉一些语义用法:
<constant name="" value=""/> 作用于struts2一些默认配置,具体配置在struts2-core-2.x.x.jar下的default.properties文件中可以找到,对其改变即可。
常用的,struts.devMode,配置开发者模式,struts.i18n.encoding,配置编码集,等。
<package name="" extends=""namespace=""/>
用于配置包儿,name唯一标识包名儿,extends指定当前包继承自其它的包,当然这也会继承父包中的所有配置,namespace用于划分命名空间,常用来依据逻辑进行命名。
<action name="" class="" method=""/>
用于定义struts控制类。name唯一标识action名儿,class定义指向类,method定义调用方法。
<result type="" name ="" />
用于定义控制结果。type用于定义结果类型,默认为dispatcher,用于转向页面,常用与jsp。常用还有chain,用于处理action链。
<default-action-ref name="" />
用于定义默认的action,配置默认action后访问工程路径会默认跳转。
第二:Action
Action,用于逻辑控制,最简单粗暴的实现方式:extends ActionSupport。
action调用过程存在多种实现方式,记住常用的:
1.默认调用class,并执行execute()方法,若指定method,则执行指定方法。
2.DMI:(Dynamic Method Invocation),动态方法调用,在页面中使用“action!method”的形式动态调用action逻辑方法,
例:页面中:<a href="UserAction!add"/>
配置文件中:<Action name = "UserAction" class="User"/>
User.java中要包含一个add()方法。
3.使用通配符实现调用,即“*”,使用*替换某种同类型操作的单词,再使用“{n}(如{1},{2})”的方式表示,{n}中的数字表示*出现在字符串中的位置(第n个)。
例;页面中:<a href="UserToAdd"/>
配置文件中:<Action name="*To*" class="{1}" method="{2}">
即实现了调用action:UserToAdd,类:User,方法:add();
逻辑调用过程中的传参方式记住常用的两种:
1.通过属性(Attribute)进行传参。Action定义全局变量及对应get(),set()方法,页面调用时在调用地址串中传参赋值。
例:页面中:<a href="UserAction!add&username='u'"/>
实现类中:UserAction.java中定义String username,getUsername(),setUsername(String str);
2.通过域模型(DomainModel)进行传参。通常在项目中将model与action分为两个包。实体类单独存放。这种情况下使用DomainModel更为方便.
例:定义User.java,定义public String username;及对应getUsername(),setUsername()方法,
定义UserAction.java,定义public User user;及对应getUser(),setUser()方法,
页面中:<a href="UserAction!add&user.username='u'"/> 通过对象的属性传参。
Action中访问web元素(request,session,application)方式记住常用两种:
1.页面用struts标签<s:debug>可以看到包含值栈(ValueStack)和action上下文(Stack Context),Stack Context为map类型,其中包含request,session,application的key。所以,可以在action中直接获得及赋值。
例:Action.java中:map request = (Map)ActionContext.getContext().get("request");
map session = (Map)ActionContext.getContext().get("session");
map application = (Map)ActionContext.getContext().get("application");
request.set("R1","r1");//session,application方式相同。
前台取值(#key实现):<s:property value="#request.R1"/> | <%=request.getAttribute("R1")% />
2.通过依赖注入(IOC:Inverse of Control也叫DI:Dependency Injection)的方式实现,即实现RequestAware,SessionAware, ApplicationAware接口,重写set方法,直接获取。
例:定义action类时实现接口:public class UserAction extends ActionSupport implements RequestAware,SessionAware, ApplicationAware{}
action中:定义map类型web元素:Map<String, Object> request; Map<String, Object> session; Map<String, Object> application;
重写set方法@override:
@Override //session,application方式相同。
public void setRequest(Map<String, Object> request) {
this.request = request;
}
赋值: request.set("R1","r1");//session,application方式相同。
前台取值(#key实现):<s:property value="#request.R1"/> | <%=request.getAttribute("R1")% />
第三:OGNL
OGNL:Object Graph Navigation Language (对象图导航语言),OGNL本身是一个map对象,通常使用对象名直接访问,也可以使用对象的属性名访问属性值。
1.访问属性(action全局变量,类似上述传参的两种方式联想):<s:property value="username"/>
2.访问属性(DomainModel形式,类似上述传参的两种方式联想):<s:property value="user.username"/>
3.访问普通方法:<s:property value="username.length()" /> <s:property value="user.say()">
4.访问静态属性:<s:property value="@com.testStatic.TestStatic.@staticStr" /> //用@调用静态类及属性,方法。
5.访问静态方法:<s:property value="@com.testStatic.TestStatic.@staticMethod()" />
6.访问容器:如List users = new ArrayList(); Map<String ,value> producer = new HashMap()<String ,value>; producer<"no1" ,new Producer()>;
访问集合:<s:property value="users"> <s:property value="producer">
访问元素:<s:property value="users[1]"> <s:property value="producer.no1">
访问元素集合:<s:property value="users.{age}"> //用{}表示元素的集合 <s:property value="producer.keys"> <s:property value="producer.values">
OGNL中的%,$,#
#:访问非根对象属性,
例:#session.msg表达式,因为Struts2中的ValueStack为根对象,所以访问其他非根对象时,需要加#前缀。
#:可用来构造map
例:#{'1':'一','2':'二','3':'三'}
%:在标签的属性值被理解为字符串类型时,通过%{}中添加的是OGNL表达式实现字符串表示,计算OGNL表达式的值。
例:<s:textfield name="test" label="%{user.username}"/> <p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>
$:在国际化资源文件中,引用OGNL表达式。
例:国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间(copy过来的)
$:在Struts 2配置文件中,引用OGNL表达式,获取值。
例:<result type="redirect">ListPhotos.action? albumId=${albumId}</result>
第四:标签
<%@taglib uri="/struts-tags" prefix="s"%> 用标签前,必须引入struts2标签库。
<s:property value="myBeanProperty" />
描述:Used to get the property of a value, which will default to the top of the stack if none is specified.
获取属性值(默认获取栈顶的,定义value后获取value的)。
value详解:default:<top of stack> type:Object
<s:set name="personName" value="person.name"/>
Hello, <s:property value="#personName"/>. How are you?
描述:The set tag assigns a value to a variable in a specified scope.
用于给一个值分配一个指定范围的变量。
value详解:type:String
<s:bean name="org.apache.struts2.example.counter.SimpleCounter" var="counter">
<s:param name="foo" value="BAR" /> //为Bean进行传参
The value of foot is : <s:property value="foo"/>, when inside the bean tag <br />
</s:bean>
描述:nstantiates a class that conforms to the JavaBeans specification.
实例化一个符合JavaBeans规范类。该标签具有体可以包含多个参数元素设置任何的mutator方法对这类。
var详解:如指定了该属性,则该Javabean实例会被放入StackContext中(不是ValueStack),从而允许直接通过该var属性来访问该JavaBean实例.
例:<s:bean name="lee.Person" var="p"> <!-- 根据JavaBean实例指定的var属性来访问JavaBean实例 -->
<s:property value="#p.name"/> <s:property value="#p.age"/>
<s:debug/> 这个就不用解释了,学的过程中全靠它了!
<s:if test="#parameters.country[1] == 'www'">中国</s:if>
<s:elseif test="#parameters.country[0] == '美国'">美国</s:elseif>
<s:else >其他国籍的人</s:else>
描述:Perform basic condition flow
流程执行的基本条件。
test详解:required:true Type:boolean 描述条件
<s:iterator value="{'1','2','3','4','5'}" id='number'>
<s:property value='number'/>A
</s:iterator>
<s:iterator value="{'a','b','c'}" id='char' status='st'>
<s:if test="#st.Even">
现在的索引是奇数为:<s:property value='#st.index'/>
</s:if>
当前元素值:<s:property value='char'/>
</s:iterator>
描述:Iterator will iterate over a value. An iterable value can be any of: java.util.Collection, java.util.Iterator。
迭代器的值将在迭代结束。
value详解:被迭代的集合 Type:String
id详解:指定集合里面的元素的id Type:String
status详解:迭代元素的索引。
第一:搭建
创建web工程,引入struts2对应版本的jar包,创建struts.xml配置文件,修改web.xml文件的filter及filter-mapping;
关注一下struts.xml文件,重点熟悉一些语义用法:
<constant name="" value=""/> 作用于struts2一些默认配置,具体配置在struts2-core-2.x.x.jar下的default.properties文件中可以找到,对其改变即可。
常用的,struts.devMode,配置开发者模式,struts.i18n.encoding,配置编码集,等。
<package name="" extends=""namespace=""/>
用于配置包儿,name唯一标识包名儿,extends指定当前包继承自其它的包,当然这也会继承父包中的所有配置,namespace用于划分命名空间,常用来依据逻辑进行命名。
<action name="" class="" method=""/>
用于定义struts控制类。name唯一标识action名儿,class定义指向类,method定义调用方法。
<result type="" name ="" />
用于定义控制结果。type用于定义结果类型,默认为dispatcher,用于转向页面,常用与jsp。常用还有chain,用于处理action链。
<default-action-ref name="" />
用于定义默认的action,配置默认action后访问工程路径会默认跳转。
第二:Action
Action,用于逻辑控制,最简单粗暴的实现方式:extends ActionSupport。
action调用过程存在多种实现方式,记住常用的:
1.默认调用class,并执行execute()方法,若指定method,则执行指定方法。
2.DMI:(Dynamic Method Invocation),动态方法调用,在页面中使用“action!method”的形式动态调用action逻辑方法,
例:页面中:<a href="UserAction!add"/>
配置文件中:<Action name = "UserAction" class="User"/>
User.java中要包含一个add()方法。
3.使用通配符实现调用,即“*”,使用*替换某种同类型操作的单词,再使用“{n}(如{1},{2})”的方式表示,{n}中的数字表示*出现在字符串中的位置(第n个)。
例;页面中:<a href="UserToAdd"/>
配置文件中:<Action name="*To*" class="{1}" method="{2}">
即实现了调用action:UserToAdd,类:User,方法:add();
逻辑调用过程中的传参方式记住常用的两种:
1.通过属性(Attribute)进行传参。Action定义全局变量及对应get(),set()方法,页面调用时在调用地址串中传参赋值。
例:页面中:<a href="UserAction!add&username='u'"/>
实现类中:UserAction.java中定义String username,getUsername(),setUsername(String str);
2.通过域模型(DomainModel)进行传参。通常在项目中将model与action分为两个包。实体类单独存放。这种情况下使用DomainModel更为方便.
例:定义User.java,定义public String username;及对应getUsername(),setUsername()方法,
定义UserAction.java,定义public User user;及对应getUser(),setUser()方法,
页面中:<a href="UserAction!add&user.username='u'"/> 通过对象的属性传参。
Action中访问web元素(request,session,application)方式记住常用两种:
1.页面用struts标签<s:debug>可以看到包含值栈(ValueStack)和action上下文(Stack Context),Stack Context为map类型,其中包含request,session,application的key。所以,可以在action中直接获得及赋值。
例:Action.java中:map request = (Map)ActionContext.getContext().get("request");
map session = (Map)ActionContext.getContext().get("session");
map application = (Map)ActionContext.getContext().get("application");
request.set("R1","r1");//session,application方式相同。
前台取值(#key实现):<s:property value="#request.R1"/> | <%=request.getAttribute("R1")% />
2.通过依赖注入(IOC:Inverse of Control也叫DI:Dependency Injection)的方式实现,即实现RequestAware,SessionAware, ApplicationAware接口,重写set方法,直接获取。
例:定义action类时实现接口:public class UserAction extends ActionSupport implements RequestAware,SessionAware, ApplicationAware{}
action中:定义map类型web元素:Map<String, Object> request; Map<String, Object> session; Map<String, Object> application;
重写set方法@override:
@Override //session,application方式相同。
public void setRequest(Map<String, Object> request) {
this.request = request;
}
赋值: request.set("R1","r1");//session,application方式相同。
前台取值(#key实现):<s:property value="#request.R1"/> | <%=request.getAttribute("R1")% />
第三:OGNL
OGNL:Object Graph Navigation Language (对象图导航语言),OGNL本身是一个map对象,通常使用对象名直接访问,也可以使用对象的属性名访问属性值。
1.访问属性(action全局变量,类似上述传参的两种方式联想):<s:property value="username"/>
2.访问属性(DomainModel形式,类似上述传参的两种方式联想):<s:property value="user.username"/>
3.访问普通方法:<s:property value="username.length()" /> <s:property value="user.say()">
4.访问静态属性:<s:property value="@com.testStatic.TestStatic.@staticStr" /> //用@调用静态类及属性,方法。
5.访问静态方法:<s:property value="@com.testStatic.TestStatic.@staticMethod()" />
6.访问容器:如List users = new ArrayList(); Map<String ,value> producer = new HashMap()<String ,value>; producer<"no1" ,new Producer()>;
访问集合:<s:property value="users"> <s:property value="producer">
访问元素:<s:property value="users[1]"> <s:property value="producer.no1">
访问元素集合:<s:property value="users.{age}"> //用{}表示元素的集合 <s:property value="producer.keys"> <s:property value="producer.values">
OGNL中的%,$,#
#:访问非根对象属性,
例:#session.msg表达式,因为Struts2中的ValueStack为根对象,所以访问其他非根对象时,需要加#前缀。
#:可用来构造map
例:#{'1':'一','2':'二','3':'三'}
%:在标签的属性值被理解为字符串类型时,通过%{}中添加的是OGNL表达式实现字符串表示,计算OGNL表达式的值。
例:<s:textfield name="test" label="%{user.username}"/> <p>使用%:<s:url value=”%{#foobar['foo1']}” /></p>
$:在国际化资源文件中,引用OGNL表达式。
例:国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间(copy过来的)
$:在Struts 2配置文件中,引用OGNL表达式,获取值。
例:<result type="redirect">ListPhotos.action? albumId=${albumId}</result>
第四:标签
<%@taglib uri="/struts-tags" prefix="s"%> 用标签前,必须引入struts2标签库。
<s:property value="myBeanProperty" />
描述:Used to get the property of a value, which will default to the top of the stack if none is specified.
获取属性值(默认获取栈顶的,定义value后获取value的)。
value详解:default:<top of stack> type:Object
<s:set name="personName" value="person.name"/>
Hello, <s:property value="#personName"/>. How are you?
描述:The set tag assigns a value to a variable in a specified scope.
用于给一个值分配一个指定范围的变量。
value详解:type:String
<s:bean name="org.apache.struts2.example.counter.SimpleCounter" var="counter">
<s:param name="foo" value="BAR" /> //为Bean进行传参
The value of foot is : <s:property value="foo"/>, when inside the bean tag <br />
</s:bean>
描述:nstantiates a class that conforms to the JavaBeans specification.
实例化一个符合JavaBeans规范类。该标签具有体可以包含多个参数元素设置任何的mutator方法对这类。
var详解:如指定了该属性,则该Javabean实例会被放入StackContext中(不是ValueStack),从而允许直接通过该var属性来访问该JavaBean实例.
例:<s:bean name="lee.Person" var="p"> <!-- 根据JavaBean实例指定的var属性来访问JavaBean实例 -->
<s:property value="#p.name"/> <s:property value="#p.age"/>
<s:debug/> 这个就不用解释了,学的过程中全靠它了!
<s:if test="#parameters.country[1] == 'www'">中国</s:if>
<s:elseif test="#parameters.country[0] == '美国'">美国</s:elseif>
<s:else >其他国籍的人</s:else>
描述:Perform basic condition flow
流程执行的基本条件。
test详解:required:true Type:boolean 描述条件
<s:iterator value="{'1','2','3','4','5'}" id='number'>
<s:property value='number'/>A
</s:iterator>
<s:iterator value="{'a','b','c'}" id='char' status='st'>
<s:if test="#st.Even">
现在的索引是奇数为:<s:property value='#st.index'/>
</s:if>
当前元素值:<s:property value='char'/>
</s:iterator>
描述:Iterator will iterate over a value. An iterable value can be any of: java.util.Collection, java.util.Iterator。
迭代器的值将在迭代结束。
value详解:被迭代的集合 Type:String
id详解:指定集合里面的元素的id Type:String
status详解:迭代元素的索引。
基本完成,剩余i18n,异常处理,拦截器未总结,待续........
0 0
- struts2学习中的那点事儿
- SSH框架整合中的那点事儿!
- 静态链接中的那点事儿(1)
- 关于学习编程那点事儿
- redis学习那点事儿(1)安装
- redis学习那点事儿(2)key
- 程序员那点事儿
- XML那点事儿
- 喝酒那点事儿
- P2P那点事儿
- 招聘那点事儿
- 性能那点事儿
- CMD那点事儿
- 面试那点事儿
- AOP 那点事儿
- 【中差评也就那点事儿】
- 系统维护那点事儿
- Proxy 那点事儿
- MongoDB基本管理命令
- PendingIntent Intent 传送数据 为null
- Android中Touch事件的处理逻辑
- 理解多态继承封装
- Special Matrices - CodeForces 489 F dp
- struts2学习中的那点事儿
- 在一个开发的项目中,让我更加深刻认识了自己的优点
- linux shell 不同进制数据转换
- 使用Phoneix踩过的坑
- APK反编译之一:基础知识--smali文件阅读
- 总结使用Unity 3D优化游戏运行性能的经验
- qwt的编译与安装
- UVALive_6609_Minimal Subarray Length(RMQ+二分)
- theme.info文件注释