.重大区别:
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的特点.
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的特点.