关闭

struts1与struts2的重要区别及struts2笔记

标签: strutsactioniteratorinternationalizationredirectbean
446人阅读 评论(0) 收藏 举报
分类:
.重大区别:
strut2是每次访问必定new一个新的action,永远不会出现线程同步的问题,strut1是每次访问很可能是同一个.


<!-- struts2中的路径问题是根据action的路径而不是jsp路径来确定,所以金狼不要使用相对路径
虽然可以用redirect,但redirect方式并非必要
解决办法非常简单,统一使用绝对路径.(在jsp中用request.getContentRoot方式来拿到webapp的路径
或者使用myeclipse经常用的,指定basePath) -->
<!-- Action执行的时候并不一定要执行execute方法:
 可以在配置文件中配置Action的时候用method=?来指定执行那个方法,也可以在url地址中动态指定(动态调用DMI)推荐
 前者会产生太多的action,所以不推荐使用-->
<!-- 使用通配符,将配置量降到最低不过,一定要将"约定优于配置" 的原则-->
<!-- DTO:data transfers object ,数据传输对象,有点类似于我们的entity -->
<!-- ModelDriver-->
<!-- 使用addFieldError方法和s:fieldError标签简单处理数据校验 -->




.struts2配置文件详解:
<package name="test" extends="struts-default">
<!--全局异常 -->
<global-exception-mapping result="error" exception="异常" />
</package>


<!--设置主题,在struts.xml中控制theme,默认为xthml,可以设置为:simple/css_html/ajax-->
<constant name="struts.ui.theme" value="simple">
<!--允许访问静态方法-->
<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>
<!-- 处理中文乱码问题,i18n:internationalization -->
<constant name="struts.i18n.encoding" value="GBK"/>
<!--struts.devMode:true,开发模式,改点东西,马上就有反馈  -->
<constant name="struts.devMode" value="true"/>
<!-- namespace决定了访问路径,默认为"",表示可以接受所有的路径 -->
<package name="bbs" namespace="/" extends="test">
<!--默认action-->
<default-action-ref name="index"></default-action-ref>
<!-- 当class没有配置的时候,会默认执行为ActionSupport这个calss,result没有配置的时候,默认就是SUCCESS-->
<action name="usersAction" class="com.bbs.web.action.UsersAction">
<result type="dispatcher">/index.jsp</result>
<!--声明式异常-->
<exception-mapping result="error" exception="java.sql.SQLException">
</action>
<!--两个**之间的_不是默认的,换成其他的符号也可以-->
<action name="*_*" class="com.bbs.web.action.{1}Action">
<!-- 通配符 -->
<result>/{1}_{2}_success.jsp</result>
</action>
</package>
<!--type常见的四种:
dispatcher:服务器跳转,forward到一个jsp页面/html,就是不能跳转到action中
redirect:重定向,forward到一个jsp页面/html,就是不能跳转到action中
chain:链条,可以forward到一个action中.
redirectAction:客户端跳转,到另外一个action
freemarker:
httpheader:http的头信息
stream:下载
velocity:与freemarker类型的一个模板
xslt:是修饰xml语言
plainttext:会改变页面的源码
tiles:将页面分成很多块


传递参数:
a>客户端跳转才需要传递
b>${}表达式(不是EL)
-->




    <package name="admin" namespace="/admin" extends="struts-default" >
<!--*与*中间使用了中干线,会有bug,与下面default-action-ref有冲突-->
       <action name="*-*" class="com.bjsxt.bbs2009.action.{1}Action" method="{2}">
        <result>/admin/{1}-{2}.jsp</result>
        <result name="input">/admin/{1}-{2}.jsp</result>
       </action>
       <!-- 
       <action name="category" class="com.bjsxt.bbs2009.action.CategoryAction">
        <result>/admin/category_list.jsp</result>
        <result name="add_input">/admin/category_add_input.jsp</result>
        <result name="update_input">/admin/category_update_input.jsp</result>
       
       </action>
        -->
    </package>
 <package name="front" namespace="/" extends="struts-default" >
   
    <default-action-ref name="Category_list" />
       <action name="Category_list" class="com.bjsxt.bbs2009.action.CategoryAction" method="list">
        <result>/index.jsp</result>
       </action>
    </package>


思考:
ActionContext.getContext()是单例吗?


[]访问的就是一个action中的stack中从上往下(一直到栈底)数的第几个元素
<li>[0]:<s:property value="[0]"/></li>
此时会顺着顺序,当第一个action不满足username,就会继续往下面找,
<li>[0]:<s:property value="[0].userName"/></li>




思考:什么情况下栈中会有两个action在ValueStack中呢?
例子:
     <package name="ognl" namespace="/test" extends="struts-default">
           
           <action name="ognlAction" class="com.web.action.OgnlAction">
               <result>/ognl.jsp</result>
           </action>
           
           <action name="test" class="com.web.action.TestAction">
               <result type="chain">ognlAction</result>
           </action>
     </package>






struts2标签:
1.使用bean,并用bean来定义新的属性值:
<s:bean name="com.bjsxt.struts2.tags.Dog"  var="myDog"><!--标签-->
<s:param name="name" value="oudy"/>
</s:bean>
拿出值:
<s:property value="#myDog.name"/>
查看debug情况,需要将dubug标签放在bean标签中,因为在bean标签外面来
查看dubug标签是已经将拿值出来的情况了.


2.<s:include value="%{#inclPage}">
使用%{}表示强制将{}中的内中强制转换成ognl表达式.
<s:set var="inclPage"  value="%{'/_include1.tml'}"/>


3.<s:fielderror fieldname="" theme="simple"/>


4.<s:if test="条件"></s:if>
<s:elseif test="条件"></s:elseif>
<s:else></s:else>


5.<s:iterator value="{'aaa','bbb','ccc'}" var="x">
<s:property value="#x.toUpperCase()"/>
</s:iterator>
<s:iterator value="{'aaa','bbb','ccc'}" status="status">
<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"/>是最后一个元素?
</s:iterator>
<s:iterator value="#{1:'a',2:'b',3:'c'}">
<s:property values="key" />
<s:property values="value" />
</s:iterator>
<s:iterator value="#{1:'a',2:'b',3:'c'}" var="x">
<s:property values="#x.key" />
<s:property values="#x.value" />
</s:iterator>


--------------$ # % 的区别
$:$传参数,用于i18n和struts配置文件,与{}搭配
#:#取得ActionContext的值
%:%将原本的文本属性解析为ognl,对于本来就是ognl的属性不起作用.












Don't go looking for Mrs.Right.
Go looking for Mrs.Right now.


北京尚学堂约定:简单就是美
1.数据可的约定(全部小写)
a)表明:[tb_*]
b)字段名:[*_*]
c)外建名:[*_*_*]


2.Action
a)如[*Action] 
b)对于Action中的方法[**],userEdit,userDelete,userAdd,userValidate,userList


3.实体类[*]
a)如:Topic


4.JSP[*_*.jsp]
a)user_add.jsp,user_validate.jsp


5.配置文件
a)如package[pk_*]:pk_user,pk_category
b)如namespace[*]:user,category
c)如action name[*]


  <body>
    编码约定:V0.1 <br>
    <ol>
    <li>板块命名首字母大写,采用驼峰标识</li>
    <li>表名与Model同名,加前缀t_</li>
    <li>action的类名为模块名 + 后缀Action</li>
    <li>每个模块原则上只配一个Action</li>
    <li>action在配置文件中的名字为模块名首字母小写</li>
    <li>增删改查的方法分别为add/update/delete/query</li>
    <li>采用*-*配置</li>
    <li>包名为模块名小写</li>
    <li>Action放在统一的包中</li>
    </ol>
  </body>


---------------------------------------------------
ext3.0:
通过server来查看ext文档.ext不能在本地看,因为ext中有许多的ajax内容,而这些ajax必须通过服务器来取.
这是ext的特点.
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:160376次
    • 积分:2470
    • 等级:
    • 排名:第14938名
    • 原创:61篇
    • 转载:156篇
    • 译文:0篇
    • 评论:22条
    最新评论