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详解:迭代元素的索引。


基本完成,剩余i18n,异常处理,拦截器未总结,待续........







0 0
原创粉丝点击