struts基础学习

来源:互联网 发布:诺基亚运行python 编辑:程序博客网 时间:2024/06/06 14:21

1.struts1.x于struts2.x区别

        1.struts2没有像struts1一样与servlet API耦合
        2.struts2的核心为xwork。一个请求生成一个实例,而1是使用的同一个
        3.Struts 2直接使用Action属性作为输入属性,而struts1使用actionform
        4.struts2加入了ognl........// 详细见:http://blog.csdn.net/ilmlife/article/details/9704753


2.struts2基础学习

    2.1 配置文件

             a) 常量配置(详细参见struts的属性文件) 
                      eg.指定web应用默认字符集,开发模式的使用(修改action、修改xml文件后不需要再重启服务器,直接就可以看到结果。 但是,项目上线后,需要关闭开发模式)
              <constant name="struts.i18n.encoding" value="gbk" />
<pre name="code" class="html">              <constant name="struts.devMode" value="true" />
              b)  package配置(把action、result、type、interceptor等这些元素打包到一个逻辑单元中)。可继承使用(extends)
                       eg.
         <package name="action" namespace="/action" extends="struts-default"><action name="action" class="com.struts.action.Action"><result name="success">/pagestruts/Action.jsp</result></action><action name="actionimpl" class="com.struts.action.ActionExtends"><result name="success">/pagestruts/Action.jsp</result></action><action name="actionextends" class="com.struts.action.ActionImpl"><result name="success">/pagestruts/Action.jsp</result></action></package>
             c)  配置命名空间(namespace)(通过不同的命名空间划分不同的功能模块,利于多人协作开发时保持相互之间的独立性,提高开发效率)
                      eg.
        <package name="wildcard" namespace="/wildcard" extends="struts-default"><action name="*_*" class="com.struts.wildcard.{1}Action" method="{2}"><result>/pagestruts/{1}_{2}.jsp</result></action></package>
             d)  配置Action(将url、Action类、展示页面三者绑定)
                      url:namespace + actionname
                      class:Action Class
                      return:view。返回类型:

type

使用说明

chain 

用来处理Action链,将一个action的执行与另外一个配置好的action串连起来。用第一个action的getter方法和第二个action的setter方法来完成action之间属性的复制。服务器端跳转到action

dispatcher  

用来转向JSP页面,这是默认的结果类型,如果在action配置中没有配置其他的结果类型,它就会被使用。服务器端跳转到视图

freemaker   

处理FreeMarker模板   

httpheader

控制特殊HTTP行为的结果类型

redirect  

   重定向到一个URL。客户端跳转到视图

redirectAction 

  重定向到一个Action。客户端跳转到Action

stream 

  向浏览器发送InputSream对象,通常用来处理文件下载,还可用于返回AJAX数据 

velocity

  处理Velocity模板 

xslt  

处理XML/XLST模板   

plainText   

   显示原始文件内容,例如文件源代码  

                            global result配置:
<package name="test" namespace="/globalResult" extends="struts-default">    <global-results>    <span style="white-space:pre"></span><result name="mainpage">/main.jsp</result>    <span style="white-space:pre"></span></global-results>     </package>
               e)  include 多配置文件配置
<include file="XXXXX.xml" />
                      可以通过注解的方式实现零配置

    2.2 Action

            a) 不继承任何的Action(Action类完全不和struts2框架发生耦合,但不能使用struts2中的某些功能)
package com.struts.action;public class Action {public final String SUCCESS = "success";public String execute(){return SUCCESS;}}


            b) 实现Action接口
package com.struts.action;import com.opensymphony.xwork2.Action;public class ActionImpl implements Action{public String execute() throws Exception {return SUCCESS;}}


            c) 继承ActionSupport类(推荐)
package com.struts.action;import com.opensymphony.xwork2.ActionSupport;public class ActionExtends extends ActionSupport{private static final long serialVersionUID = 8545758502007427546L;@Overridepublic String execute() throws Exception {return SUCCESS;}}
           action的动态调用 访问方式为actionname!methodname

    2.3 struts标签

                2.3.1  property 输出变量值
                <li>property: <s:property value="username"/> </li><li>property 取值为字符串: <s:property value="'username'"/> </li><li>property 设定默认值: <s:property value="admin" default="管理员"/> </li><li>property 设定HTML: <s:property value="'<hr/>'" escape="false"/> </li>
               2.3.2  set 设置变量值
<pre name="code" class="html">                <li>set 设定adminName值(默认为request 和 ActionContext): <s:set var="adminName" value="username" /></li><li>set 从request取值: <s:property value="#request.adminName" /></li><li>set 从ActionContext取值: <s:property value="#adminName" /></li><s:debug></s:debug><%--<li>set 设定范围: <s:set name="adminPassword" value="password" scope="page"/></li><li>set 从相应范围取值: <%=pageContext.getAttribute("adminPassword") %></li>--%><li>set 设定var,范围为ActionContext: <s:set var="adminPassword" value="password" scope="session"/></li><li>set 使用#取值: <s:property value="#adminPassword"/> </li><li>set 从相应范围取值: <s:property value="#session.adminPassword"/> </li>
               2.3.3  action 执行Action
                <s:action var="a" name="testOgnl" namespace="/" executeResult="true" ignoreContextParams="false" >      <s:param name="uname">老高</s:param>          </s:action>
               2.3.4  include 包含其他资源执行结果
                <li>include _include1.html 包含静态英文文件,说明%用法<s:set var="incPage" value="%{'/_include1.html'}" /><s:include value="%{#incPage}"></s:include></li>
               2.3.5  if elseif else 流程控制标签
         <%request.setAttribute("random",new Random().nextInt(100)); %> <s:if test="#request.random>=80"> <b>优秀!</b> </s:if> <s:elseif test="#request.random>=60"> <b>一般!</b> </s:elseif><s:else><b>不合格!</b></s:else>
           2.3.5  date 输出日期
         <%  request.setAttribute("d",new Date(23432432L));   %>   <s:date name="#request.d" format="yyyy-MM-dd" nice="true" /> <!-- 增加nice,format属性不起作用 -->   <hr/>   <s:date name="#request.d" format="yyyy-MM-dd"  var="c"/> <!-- 使用var,时间不会打印出,而是保存在c变量中! -->
           2.3.6  iterator 循环迭代标签 

                         1. value 将要迭代的集合,使用OGNL表示

                         2. var   指向集合中正被迭代的对象

                         3. begin  如果指定,迭代器从begin指定的索引开始

                         4. end    如果指定,迭代器到end指定的索引结束(包含end索引指向的对象)

                         5. step      如果指定,迭代器每次递增的增量。如果不指定,默认是1

                         6. status  用来表示迭代器状态的变量。他有如下的方法:
                                           int  getCount()返回迭代次数
                                           int getIndex()返回当前迭代的索引值
                                           boolean isEven()当前迭代的索引值是否偶数
                                           boolean isFirst()当前迭代的索引值是否第一个元素
                                           boolean isLast()当前迭代的索引值是否最后一个元素
                                           boolean isOdd()当前迭代的索引值是否奇数

 <body>  <s:set var="s" value="{00,11,22,33,44,55,66,77,88,99}" ></s:set>  <table width="200px" border="1">   <s:iterator value="#request.s"  var="temp" begin="0" end="7" step="1" status="idx">   <s:if test="#idx.odd"><tr bgcolor="gray"><td><s:property value="#idx.index"/>---<s:property value="#temp" /></td></tr>   </s:if>   <s:else><tr><td><s:property value="#idx.index"/>---<s:property value="#temp" /></td></tr>   </s:else>   </s:iterator>  </table>  </body>
                2.3.7  textfield 文本域 |  textarea 多行文本域 | file 文件域 | checkbox | checkboxlist 复选框 | radio 单选按钮 |  selet下拉框 等参见开发文档

    2.4 ognl

               2.4.1  优点:保持EL语言的优点外• 能够访问对象的普通方法• 能够访问类的静态属性和静态方法• 强大的操作集合类对象的能力• 支持赋值操作和表达式串联• 访问OGNL上下文和ActionContext
               2.4.2  使用:
                                  • 操作OgnlValueStack中属性  直接拿栈中的对象使用   xxx.xxx.xxx 如:user.username
                                  • 操作AcitionContext其他域中的属性  获取上下文中的值   #xxx.xxx如:#session.id
                                  • 和[]操作符(没有点运算符操作方便,但是功能强大,可以传入变量值,动态取值)
                                  • OGNL支持所有的JAVA运算符
                                  • OGNL操作集合 
                                          — List/ Set
  <body>  <s:set var="list" value="{'a','b','c'}" scope="request"></s:set><p><s:property value="#request.list.get(2)" /></p>  </body>
                                          — Map
<body>  <%  request.setAttribute("a","123456");   %>  <s:set var="m" value="#{'name':'老高','pwd':#request.a}" scope="request"></s:set><p><s:property value="#request.m.name" /></p><p><s:property value="#request.m.pwd" /></p>  </body>
                                          — in和not in操作符
  <body>  <s:set var="s" value="{'a','b','c'}" scope="request"></s:set>  <s:set var="m" value="#{'name':'老高','pwd':'123456'}" scope="request"></s:set><p><s:property value="'a' in {'a','b','c'}" /></p><p><s:property value="'a' not in #request.s" /></p><p><s:property value="'name' in #request.m.keys" /></p><p><s:property value="'老高' in #request.m.values" /></p>  </body>
            2.4.3  过滤/投影(我们把过滤集合中的元素产生一个子集合,叫做投影)
                      ?---符合选择逻辑的所有元素
                      ^---符合选择逻辑的第一个元素
                      $---符合选择逻辑的最后一个元素
                #this---表示集合是的元素
<html>  <head>    <title>测试OGNL</title>  </head>  <body>  <%  User u1 = new User("张三","123456");  User u3 = new User("王五","123456");  User u5 = new User("高淇","654321");  User u6 = new User("马士兵","654321");  List list = new ArrayList();  list.add(u1);  list.add(u3);  list.add(u5);  list.add(u6);  request.setAttribute("s",list);   %>   <s:set var="s1" value="#request.s.{?#this.pwd=='654321'}" scope="request" ></s:set>   <s:iterator value="#request.s1" var="temp" > <p><s:property value="#temp.uname" /></p>   </s:iterator>  </body></html>
            2.4.4  OGNL其他技术
                      • 调用对象普通方法  直接调用即可:<s:property value="#request.t5.test1()" /> 
                      • 调用类的静态方法和静态属性 @class@method(args) //调用静态方法        @class@field //调用静态字段
                        (其中class必须给出完整的类名(包括包名),如果省略class,那么默认使用的类是java.util.Math,如: @@min(5,3) @@max(5,3) @@PI)
                        同时,需要修改struts.xml配置,增加:
                                       <constant name="struts.ognl.allowStaticMethodAccess" value="true" />

原创粉丝点击