根据视频及自己的学习进行的总结,以备以后利用查看。
Result
结果类型全局结果动态结果OGNL表达式
$ # % 区别Struts标签
UI标签通用标签控制标签声明式异常处理
i18N
Interceptor原理
Convert
默认类型的转换器 自定义类型转换器————————————– 华丽的分隔符 ————————————————–
OGNL是struts2默认的表达式语言。OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。 访问OGNL上下文(OGNL Context)和Action Context; 那么ActionContext是Action上下文,其中内置了一个Map,在ActionContext会除了存放request session application外,还存放着OGNL Context,而在OGNLContext中存有一个特殊的ValueStack,访问ValueStack的对象可以无需加#, 一、访问值栈中的值 在jsp页面中引入debug标签,可以看到值栈中的值,值栈中一般存放的都是action中的属性值,取这些属性相关的值时,可以直接取值,Action中的相关值都会被放到ValueStack的栈顶。
<li>访问值栈中的action中的普通属性:username=<s:property value="username" /></li> <li>访问值栈中类对象的普通属性(get/set方法):<s:property value="student.age" /></li> <li>访问值栈中类对象中的类对象的普通属性(get/set方法):<s:property value="cat.friend.dogname" /></li> <li>访问值栈中对象的普通属性方法:<s:property value="password.length()" /></li> <li>访问值栈中对象的普通属性方法:<s:property value="cat.miaomiao()" /></li> <li>访问值栈中action的普通方法:<s:property value="actionfun()" /></li> <li style="color: red">访问值栈中的属性时,直接进行属性名就可以访问</li> // 注意:value的值就是我们所说的ONGL表达式二、访问静态方法和属性
<li>访问静态方法 :<s:property value="@com.wf.action.student.S@s()" /></li> <li>访问静态属性:<s:property value="@com.wf.action.student.S@str" /></li> <li>访问Math类的静态方法:<s:property value="@@max(2,3)" /></li> <li style="color: red">访问静态属性和方法时只能用@标识符进行标注,写清类名, S@s()表示S类中有一个静态方法s(),S@str表示S类中存在一个静态变量str,@@代表Math类 </li>三、访问List集合
<li>访问List:<s:property value="stulist" /></li> <li>访问List中某个元素:<s:property value="stulist[0]" /></li> <li>访问List中元素某个属性的集合:<s:property value="stulist.{age}" /></li> <li>访问List中元素某个属性的集合中的特定值: <s:property value="stulist[0].age" />!<s:property value="stulist{age}[0]" /></li> <li style="color: red">集合访问元素下标[]形式,访问属性配置{}形式</li>四、访问Set集合
<li>访问Set:<s:property value="doglist" /></li> <li>访问Set中某个元素:<s:property value="doglist[1]" /></li> <li>访问Set中某个元素:<s:property value="doglist{1}" /></li> <li style="color: red">Set为无序集合,没有办法根据下标进行选择,所以二和三没有数据</li>五、访问Map集合
<li>访问Map:<s:property value="maplist" /></li> <li>访问Map中某个元素:<s:property value="maplist.dog101" /></li> <li>访问Map中所有的Keys:<s:property value="maplist.keys" /></li> <li>访问Map中所有的Values:<s:property value="maplist.values" /></li> <li>访问容器的大小<s:property value="maplist.size()" /></li> <li style="color: red">Map集合为键值对,所以访问某个元素时,用点key表示</li>六、投影,过滤和筛选 投影得到的结果是集合; ?# 表示过滤 ^#表示开始的条件限制 $#表示结束的条件限制 this表示集合中的存放的对象
<li>投影:(过滤) <s:property value="stulist.{?#this.age==1}" />! <s:property value="stulist.{?#this.age==1}[0]" /> </li> <li>投影: <s:property value="stulist.{^#this.age>1}.{age}" />! <s:property value="stulist.{^#this.age>1}.{age}[0]" /> </li> <li>投影:<s:property value="stulist.{$#this.age>1}.{age}" /></li> <%-- <li>投影:<s:property value="stulist.{$#this.age>1}.{age} == null"/></li> --%> <li style="color: red;">投影得到的结果是集合,只有三种情况?#和^#和$#,过滤,开始和结束的条件限制</li> <li>[]:<s:property value="[0]"/></li> <!-- 值栈的获取,如果有多个action都会一一压入到值栈中,action链中有体现,在debug模式下可以看到 -->谈到OGNL不得不说OGNL的三个特殊的符号# 、%{ }、$三个符号 1.#符号:用来访问除值栈之外的action存储值,在值栈的读取中可以直接忽略掉#,但是读取非值栈中的值时例如Request、Session、application等中的值要用#符号来进行数据的读取 ,另外对于Map集合的构造,也是需要利用#符号
<s:property value="#request.name"/>2.%{ }符号:%{ }是将{ }中的内容强制转化为OGNL表达式,
<s:set var="incPage" value="%{/_includel.html}" /> <s:include var="#{incPage}"></s:include>3.$符号:在struts.xml和国际化资源中引用OGNL表达式
<package name="student" namespace="/student" extends="struts-default"> <action name="student" class="com.wf.action.student.Student"> <result name="success" type="redirect">/student_error.jsp?t=${type}</result> </action> </package> <!-- 需要注意的是type是action中的一个属性,并且具有get和set方法 $存值是存到parameters中 --> <s:property value="#parameters.t"/> //取值是放到了parameters中想要使用Struts标签必须引入Struts标签库。
<%@ taglib prefix="s" uri="/struts-tags" %> // 在标题头引入标签库 uri 固定值1、UI标签 UI标签基本都是从HTML演变而来的。常见的UI标签有以下几种, textfield : 输入框 textarea : 输入域 password :密码框 radio : 单选框 list=”#{0:’girl’,1:’boy’}” value=”1” checkbox :选择框 checkboxlist :复选框 属性list进行参数设置 select :下拉列表 list属性进行列表值的设定 list=”{‘a’,’b’}” 也可以为集合 doubleselect :两个列表框,第二个列表框会随着第一个的选择而发生变化 list属性表示的为第一级列表的内容,doublelist表示为第二级列表的内容 file :文件的选择 利用UI标签进行页面布局的同时,利用标签的theme属性可以调整布局的不规则性
<body> <s:form action="login.action" method="post"> <s:textfield name="username" label="用户名"></s:textfield> <s:password name="pwd" label="密码"></s:password> <s:textarea name="ta" cols="20" rows="3" label="备注"></s:textarea> <s:select name="sl" label="角色" list="{'普通用户','管理员','游客'}"></s:select> <s:select name="sl2" label="学习课程" list="#{1:'jsp',2:'asp',3:'php'}"> <s:optgroup label="--------" list="#{4:'C++',5:'C#' }"></s:optgroup> <s:optgroup label="--------" list="#{6:'java',7:'javaweb' }"></s:optgroup> </s:select> <s:radio list="#{1:'男',2:'女'}" value="1" label="性别" name="sex"></s:radio> <s:checkbox label="选择" name="ck" value="是"></s:checkbox> <s:checkboxlist name="cbl" list="{'足球','篮球','排球'}" label="爱好"></s:checkboxlist> <s:file name="file1" accept="text/" label="路径"></s:file> <table> <tr> <td><s:submit name="btn" value="提交" theme="simple"></s:submit></td> <td><s:reset name="btn1" value="重置" theme="simple"></s:reset></td> </tr> </table> </s:form> </body>2.通用标签 常用的通用标签有Property标签、Set标签、bean标签、include标签、param标签等。
Property标签属性:value中的值会默认为OGNL表达式,加双引号则是不进行OGNL表达式转化,仅仅输出,在设定html时,利用escape为false,则会将默认的字符串翻译为队应的html标签。如果value没提供,默认为堆栈顶端的元素
<li>正常取值<s:property value="username"/></li> <li>取值为字符串<s:property value="'username'"/></li> <li>设置默认值<s:property value="admin" default="管理员"/></li> <li>设定HTML<s:property value="'<hr/>'" escape="false"/></li>Set标签的属性,set标签用来设置值使用,其中的value为Object对象,下图的admin会解析为变量名,如果value=”’username’” 则会指定为String类型。但是对于数字,则是转化为Integer类型,默认范围为action(即Request和pageContext中 )
<li>Set进行设值(默认request和ActionContext)<s:set var="admin" value="'zhangsan'"/></li> <li>request取值Set: <s:property value="#request.admin"/></li> <li>ActionContext取值Set: <s:property value="#admin"/></li> <li>Set指定范围<s:set var="password" value="123456" scope="page"/></li> <li>从设定的范围取值:<%=pageContext.getAttribute("password") %></li> <li>Var属性使用,范围变成ActionContext <s:set name="sex" value="'男'" /></li> <li>取值:<s:property value="#sex"/></li>Bean标签:设置javabean对象,两种方式,一种结束即销毁,一种是全局存在。第一种方式是没有var属性,对这个bean的访问和操作只能在bean里面进行。子标签param是进行对象的属性设置,很少使用这种方式进行属性的设置,
<s:bean name="com.wf.action.student.Student" var="Student01"> <s:param name="name" value="zhangsan"></s:param> <s:param name="psaaword" value="1234"></s:param> </s:bean>Include标签,包含一个servlet的输出(servlet或jsp的页面)。超级不建议使用,中文内容会解析出错。 param标签 ,为其他标签提供参数,比如include标签和bean标签.
3.控制标签 常用的有程序流程的if…elseif…else,类此于java的if…else的语句,属性test控制条件 循环遍历的iterator,常用于集合,数组等的遍历
<s:if test="1==2"> <span>条件成立执行语句</span> </s:if> <s:elseif test="1==3"> <span>条件成立执行语句</span> </s:elseif> <s:else> <span>最后执行</span> </s:else> <ul> <li>集合遍历一 <s:iterator value="{'aa','bb','cc'}"> <s:property/> </s:iterator> </li> <li>自定义变量 <s:iterator value="{'aa','bb','cc'}" var="x"> <s:property value="#x.toUpperCase()"/> <s:property value="#x"/> </s:iterator> </li> <li>使用status:记录当前循环的一些状态, <br> <s:iterator value="{'aa','bb','cc'}" var="x" status="status"> 元素值:<s:property value="#x"/> 元素第几个:<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"/><br> </s:iterator> </li> <li>Map的使用必须带#<br> <s:iterator value="#{1:'aa',2:'bb',3:'cc'}" var="x"> <s:property value="#x.key"/>=<s:property value="value"/><br> </s:iterator> </li> <li>循环遍历ArrayList时,在进行遍历存储对象进行输出时,value值为对象的属性。 <s:iterator value="#request.ilist"> <tr> <td><s:property value="productid"/></td> <td><s:property value="attr1"/></td> <td><s:property value="listprice"/></td> </tr> </s:iterator> </li> </ul>