Struts2框架的总结二------OGNL&Struts标签

根据视频及自己的学习进行的总结,以备以后利用查看。

Struts2的知识概览

  • Action
    • nameSpace
    • path
    • action类的编写
    • DMI
    • 配置文件通配符的使用
    • 参数传递
    • 访问页面元素
  • Result

    • 结果类型
    • 全局结果
    • 动态结果
  • OGNL表达式

    • $ # % 区别
  • Struts标签

    • UI标签
    • 通用标签
    • 控制标签
  • 声明式异常处理

  • i18N

  • Interceptor原理

  • Convert

    • 默认类型的转换器
    • 自定义类型转换器

————————————– 华丽的分隔符 ————————————————–

OGNL表达式

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标签必须引入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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值