第四章 Taglib Struts标签库

struts2.0 taglib 标签库 struts2.0 taglib struts2.0 标签库,总结了从<s:a--------------<s:z的全部 立即下载

第四章 Tablib Struts标签库

Struts2 Taglib抽象了不同表示技术,现在Struts2主要支持三种表示技术:JSP,FreeMarker和Velocity。但部分的Tag在三种表示技术下都可以使用,但是也有部分只能在某一种情况下使用。

 

Tab可以分为两类:通用标签和UI标签。

 

4.1节 通用标签

通用标签用来在页面表示的时候控制代码执行的过程,这些标签也允许从Action或者值堆栈中取得数据。例如地域,JavaBeans,URLs,和action。

 

控制标签控制程序执行,例如:if,else,iterator

数据标签管理数据的取得和创建,例如:bean,push,i18n

 

控制标签

 

if标签

描述

  If标签用来控制基本的条件处理流程,通常和else标签或者elseif标签连用。

 

参数

名字

是否必须

默认值

可否使用表达式

类型

描述

id

否

 

是

String

用来表示该元素,对于UI和Form标签来说直接转变为HTML id属性

test

是

 

是

Boolean

用来决定是否显示标签内部内容的表达式

 

例子

<s:if test="%{false}">

    <div>Will Not Be Executed</div>

</s:if>

<s:elseif test="%{true}">

    <div>Will Be Executed</div>

</s:elseif>

<s:else>

    <div>Will Not Be Executed</div>

</s:else>

 

elseIf 标签

参考if标签

 

else 标签

参考if标签

 

append标签

描述

用来做iterator标签的辅助,将不同iterator中的内容合在一个iterator中。

 

参数

名字

是否必须

默认值

可否使用表达式

类型

描述

id

否

 

是

String

用来保存结果iterator的对象在value context中的名字。

 

例子

Action类

public class AppendIteratorTagAction extends ActionSupport {

 

 private List myList1;

 private List myList2;

 private List myList3;

 

 

 public String execute() throws Exception {

 

     myList1 = new ArrayList();

     myList1.add("1");

     myList1.add("2");

     myList1.add("3");

 

     myList2 = new ArrayList();

     myList2.add("a");

     myList2.add("b");

     myList2.add("c");

 

     myList3 = new ArrayList();

     myList3.add("A");

     myList3.add("B");

     myList3.add("C");

 

     return "done";

 }

 

 public List getMyList1() { return myList1; }

 public List getMyList2() { return myList2; }

 public List getMyList3() { return myList3; }

 

标签使用

<s:append id="myAppendIterator">

     <s:param value="%{myList1}" />

     <s:param value="%{myList2}" />

     <s:param value="%{myList3}" />

</s:append>

<s:iterator value="%{#myAppendIterator}">

     <s:property />

</s:iterator>

 

generator 标签(JSP Tag)

描述

从val属性生成一个iterator。

 

参数

例子

例1:

生成一个简单的iterator,并且使用iterator标签打印出内容。

<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}">

 <s:iterator>

     <s:property /><br/>

 </s:iterator>

</s:generator>

 

例2:

生成一个iterator,使用count属性。因为count属性值为3,所以只有前三个内容(aaa,bbb,ccc)在生成的iterator中。

Generate an iterator with count attribute

<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="3">

 <s:iterator>

     <s:property /><br/>

 </s:iterator>

</s:generator>

 

 

例3:

生成iterator,使用了id属性,之后生成的对象放在pageContext中,可以通过指定的id来访问。

<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" count="4" separator="," id="myAtt" />

<%

 Iterator i = (Iterator) pageContext.getAttribute("myAtt");

 while(i.hasNext()) {

     String s = (String) i.next();

%>

     <%= s %> <br/>

<%

} 

%>

 

例4:

生成iterator,使用converter属性,这里的convertor仅仅将每一个对象添加了一个"converter-"前缀。

<s:generator val="%{'aaa,bbb,ccc,ddd,eee'}" converter="%{myConverter}">

 <s:iterator>

     <s:property /><br/>

 </s:iterator>

</s:generator>

 

 

public class GeneratorTagAction extends ActionSupport {

 

  ....

 

  public Converter getMyConverter() {

     return new Converter() {

         public Object convert(String value) throws Exception {

             return "converter-"+value;

         }

     };

  }

 

  ...

 

}

 

iterator 标签

描述

迭代处理一个java.util.Connection或者java.util.Iterator对象

 

参数

名字

是否必须

默认值

可否使用表达式

类型

描述

id

否

 

是

String

Id,

status

否

否

是

Boolean

如果指定,在循环的过程中会保留一个IteratorStatus类型的变量,该变量用来查询当前迭代的状态

value

否

 

是

String

被迭代的对象

 

 

例子

例1:

<s:iterator value="days">

  <p>day is: <s:property/></p>

</s:iterator>

 

例2:

<s:bean name="org.apache.struts2.example.IteratorExample" id="it">

  <s:param name="day" value="'foo'"/>

  <s:param name="day" value="'bar'"/>

</s:bean>

<p/>

<table border="0" cellspacing="0" cellpadding="1">

<tr>

  <th>Days of the week</th>

</tr>

<p/>

<s:iterator value="#it.days" status="rowstatus">

  <tr>

    <s:if test="#rowstatus.odd == true">

      <td style="background: grey"><s:property/></td>

    </s:if>

    <s:else>

      <td><s:property/></td>

    </s:else>

  </tr>

</s:iterator>

</table>

 

例3:

<s:iterator value="groupDao.groups" status="groupStatus">

     <tr

class="<s:if test="#groupStatus.odd == true ">odd</s:if><s:else>even</s:else>">

         <td><s:property value="name" /></td>

         <td><s:property value="description" /></td>

         <td>

             <s:iterator value="users" status="userStatus">

                 <s:property value="fullName" />

<s:if test="!#userStatus.last">,</s:if>

             </s:iterator>

         </td>

     </tr>

 </s:iterator>

 

merge 标签(同append?)

描述

参数

例子

 

sort 标签(JSP-Tag)

描述

对一个可以迭代的对象进行排序操作。

 

参数

 

名字

是否必须

默认值

可否使用表达式

类型

描述

Comparator

是

 

是

java.util.Comparator

排序用的比较器

Source

否

 

是

String

排序对象

 

例子

例1:

<s:sort comparator="myComparator" source="myList">

     <s:iterator>

     <!-- do something with each sorted elements -->

     <s:property value="..." />

     </s:iterator>

</s:sort>

 

例2:

<s:sort id="mySortedList" comparator="myComparator" source="myList" />

<%

   Iterator sortedIterator = (Iterator) pageContext.getAttribute("mySortedList");

   for (Iterator i = sortedIterator; i.hasNext(); ) {

     // do something with each of the sorted elements

   }

%>

 

subset

描述

递归iterator的一部分

 

参数

名字

是否必须

默认值

可否使用表达式

类型

描述

count

False

 

是

Integer

Iterator中被递归的一部分的item的数量

Decider

否

 

是

org.apache.struts2.util.

SubsetIteratorFilter.Decider

用来判断iterator中的item是否包含在最终的subset内部

Source

否

 

是

String

Iterator的对象

Start

否

 

是

Integer

开始位置

 

例子

Java类

 

public class MySubsetTagAction extends ActionSupport {

     public String execute() throws Exception {

        l = new ArrayList();

        l.add(new Integer(1));

        l.add(new Integer(2));

        l.add(new Integer(3));

        l.add(new Integer(4));

        l.add(new Integer(5));

        return "done";

     }

 

 

     public Integer[] getMyArray() {

        return a;

     }

 

     public List getMyList() {

        return l;

      }

 

     public Decider getMyDecider() {

     return new Decider() {

         public boolean decide(Object element) throws Exception {

             int i = ((Integer)element).intValue();

             return (((i % 2) == 0)?true:false);

         }

     };

     }

 }

<!-- s: List basic -->

   <s:subset source="myList">

      <s:iterator>

         <s:property />

      </s:iterator>

   </s:subset>

<!-- B: List with count -->

   <s:subset source="myList" count="3">

      <s:iterator>

          <s:property />

      </s:iterator>

    </s:subset>

<!--  C: List with start -->

     <s:subset source="myList" count="13" start="3">

        <s:iterator>

          <s:property />

        </s:iterator>

     </s:subset>

<!--  D: List with id -->

     <s:subset id="mySubset" source="myList" count="13" start="3" />

     <%

         Iterator i = (Iterator) pageContext.getAttribute("mySubset");

         while(i.hasNext()) {

     %>

     <%=i.next() %>

     <%  } %>

<!--  D: List with Decider -->

    <s:subset source="myList" decider="myDecider">

           <s:iterator>

                <s:property />

           </s:iterator>

    </s:subset>

 

数据标签

@TODO 完成如下数据标签

数据标签包括

a

action

bean

date

debug

i18n

include

param

push

set

text

url

property

 

4.2节 UI标签

UI标签主要是指Form相关的标签,UI标签又分为两部分:form标签和构成form内部字段的其他标签。

每一个UI标签都是基于模板的,即:每一个标签都有一个对应的模板用来生成UI标签的样式,详细内容参看模板节。

 

所有的UI标签都有着共通的祖先UIBean,UIBean提供了这些UI标签的一系列共通的属性,这些属性可以分为三类:模版相关的属性,JavaScript相关的属性和其他通用属性。

 

模版相关属性:

属性

主题

数据类型

说明

templateDir

n/a

String

定义模版目录

theme

n/a

String

定义主题的名字

template

n/a

String

定义模版名字

 

JavaScript相关属性:

属性

主题

数据类型

说明

onclick

simple

String

html javascript onclick 属性

ondbclick

simple

String

html javascript ondbclick属性

onmousedown

simple

String

html javascript onmousedown属性

onmouseup

simple

String

html javascript onmouseup属性

onmouseover

simple

String

html javascript onmouseover属性

onmouseout

simple

String

html javascript onmouseout属性

onfocus

simple

String

html javascript onfocus属性

onblur

simple

String

html javascript onblur属性

onkeypress

simple

String

html javascript onkeypress属性

onkeyup

simple

String

html javascript onkeyup属性

onkeydown

simple

String

html javascript onkeydown属性

onselect

simple

String

html javascript onselect属性

onchange

simple

String

html javascript onchange属性

 

Tooltip相关属性:

属性

数据类型

默认值

说明

tooltip

String

none

为指定的组件设置Tooltip

jsTooltipEnabled

String

false

使用js表示tooltip

tooltipIcon

String

/struts/static/tooltip/tooltip.gif

指向tooltip图表的URL

tooltipDelay

String

500

多长时间后显示Tooltip

key

simple

String

这个输入字段对应的属性,用来自动设置name,label和value

 

通用属性:

属性

主题

数据类型

说明

cssClass

simple

String

定义html class 属性

cssStyle

simple

String

定义html style属性

title

simple

String

定义html title属性

disabled

simple

String

定义html disabled属性

label

xhtml

String

定义form字段的标签

labelPosition

xhtml

String

定义标签在Form中的位置,从左从上计算

requiredPosition

xhtml

String

定义必须的标签在Form中的位置,从左从上计算

name

simple

String

定义form字段的name映射

required

xhtml

Boolean

在label上添加一个*

tabIndex

simple

String

定义 html tabIndex属性

value

simple

Object

定义form字段的值

 

对于name和value的说明:

name用来说明Form字段的名字,和Action类的属性对应。

value用来记录Form字段的值,和Action类中属性的值对应。

所以在修改一个字段的内容的时候应该使用如下的标签:

<s:form action="updateAddress">

    <s:textfield label="Postal Code" name="postalCode" value="%{postalCode}"/>

    ...

</s:form>

但是,由于name和value的关系,struts2标准标签可以自动对应,所以也可以使用如下标签:

<s:form action="updateAddress">

    <s:textfield label="Postal Code" name="postalCode" />

    ...

</s:form>

 

UI标签说明:

Form部分

autocompleter

checkbox

checkboxlist

combobox

datetimepicker

doubleselect

head

file

form

hidden

label

optiontransferselect

optgroup

password

radio

reset

select

submit

textarea

textfield

token

updownselect

 

非Form部分:

actionerror

actionmessage

component

div

fielderror

table

tabbedPanel

tree

treenode

 

4.3节 主题和模板

概念说明:

标签(tag):一小段代码,在JSP,Velocity或者FreeMarker中执行。程序开发的最小单位,用来生成HTML对应的元素。

模板(template):一些代码,通常使用FreeMarker写成,可以被某些Tag表示出来(通常是UI Tag)。

主题(theme):一组模板打包在一起,提供通用功能的模版

 

主题和模板主要针对可视化的标签(Tag)而言,使用以下例子来说明三者之间的关系。

假如我们要开发如下的一个画面:

我们使用如下的代码:

 

<s:url action="login"  id="loginUrl"></s:url>

<s:form action="%{loginUrl}">

    <s:textfield label="Name" name="name"/>

    <s:password label="Password" name="password" />

    <s:submit></s:submit>

    <s:reset></s:reset>

</s:form>

 

这里<s:form>,<s:textfield>,<s:password>,<s:submit>,<s:reset>每一个都是一个标签(tag)。

 

我们在看看这些标签在一起生成的HTML源代码:

<form id="login" onsubmit="return true;"

    action="/login/login/login.action" method="post">

<table class="wwFormTable">

    <tr>

       <td class="tdLabel">

<label for="login_name" class="label">

Name:

</label>

</td>

       <td>

<input type="text" name="name"

value="" id="login_name" />

       </td>

    </tr>

 

    <tr>

       <td class="tdLabel">

<label for="login_password" class="label">

Password:

</label></td>

       <td>

<input type="password"

name="password" id="login_password" />

       </td>

    </tr>

 

    <tr>

       <td colspan="2">

       <div align="right"><input type="submit" id="login_0"

           value="Submit" /></div>

       </td>

    </tr>

 

    <tr>

       <td colspan="2">

       <div align="right"><input type="reset"

value="Reset" /></div>

       </td>

    </tr>

 

</table>

</form>

 



在由标签生成HTML代码的时候,例如:

<s:textfield label="Name" name="name"/>

生成的代码为:

<tr>

<td class="tdLabel">

<label for="login_name" class="label">

Name:

</label>

</td>

<td>

<input type="text" name="name" value="" id="login_name" />

</td>

</tr>

我们可以看到,<s:textfield>标签提供的有效信息只有Name和name,而其余的部分,例如<tr>,<td>,<label>等代码都根据一个固定的模板文件生成,这个模板文件为:

 

 

 

标签使我们开发JSP画面的时候使用的最小组件单元,我们根据客户的需要组合各种Tag达到客户的需求。模板是生成这些Tag时候使用的,使用模板可以定义Tag的基本形式,在使用tag的时候,我们只需要指定该Tag的不同属性,即可根据Tag指定的特殊属性,结合模板的基本属性生成可视化的HTML元素。主题是不同tag结合在一起而形成的。

<input type="text"<#rt/>

 name="${parameters.name?default("")?html}"<#rt/>

<#if parameters.get("size")?exists>

 size="${parameters.get("size")?html}"<#rt/>

</#if>

<#if parameters.maxlength?exists>

 maxlength="${parameters.maxlength?html}"<#rt/>

</#if>

<#if parameters.nameValue?exists>

 value="<@s.property value="parameters.nameValue"/>"<#rt/>

</#if>

<#if parameters.disabled?default(false)>

 disabled="disabled"<#rt/>

</#if>

<#if parameters.readonly?default(false)>

 readonly="readonly"<#rt/>

</#if>

<#if parameters.tabindex?exists>

 tabindex="${parameters.tabindex?html}"<#rt/>

</#if>

<#if parameters.id?exists>

 id="${parameters.id?html}"<#rt/>

</#if>

<#if parameters.cssClass?exists>

 class="${parameters.cssClass?html}"<#rt/>

</#if>

<#if parameters.cssStyle?exists>

 style="${parameters.cssStyle?html}"<#rt/>

</#if>

<#if parameters.title?exists>

 title="${parameters.title?html}"<#rt/>

</#if>

<#include "/${parameters.templateDir}/simple/scripting-events.ftl" />

<#include "/${parameters.templateDir}/simple/common-attributes.ftl" />

/>

 

我们考虑标签(Tag)使用模板(Template)生成HTML的过程,根据不同的模板,坑顶可以生成不同的HTML画面,这样我们可以把不同tag的,视觉效果一致的模板放在一起:

例如:

<s:form>        TemplateForm_A,       TemplateForm_B

<s:textfield>  TemplateTextField_A, TemplateTextField_B

<s:password>   TemplatePassword_A,  TemplatePassword_B

<s:submit>,    TemplateSubmit_A,    TemplateSubmit_B

<s:reset>       TemplateReset_A,      TemplateReset_B

 

这样将_A的模板放在一起叫做A主题(Theme),将_B的模板放在一起叫B主题。这样我们在分别使用A主题,B主题的时候可以得到同一个Tag的不同的视觉效果。

 

模版和主题的概念处在Struts Tag的核心位置。

 

Struts2默认提供了四种主题:

Simple    主题:最简单的主题

XHTML     主题:默认主题,使用常用的HTML技巧

CSS XHTML主题: 使用CSS实现的XHTML主题

AJAX      主题:基于XHTML主题,但是同工了AJAX功能

 

相关配置:

在struts.properties文件中有如下项目:

struts.ui.theme=xhtml

struts.ui.templateDir=template

struts.ui.templateSuffix=ftl

 

struts.ui.theme的值表示的是使用哪个主题,可选项位:xhtml,simple,css_html,ajax其中xhtml为默认值。

struts.ui.templateDir的值表示模板的存放目录。

struts.ui.templateSuffix的值表示模板文件明的后缀,因为Struts2默认使用FreeMarker来编写模板,所以这里我们基本使用ftl。 另外也可以使用vm(Velocity)和jsp(Java Server Page),但是所有的Template和Theme要我们自己开发。

 

关于模板文件的存放目录我们需要详细说明,如上述说明,模板文件的存放位置位template,那么系统在那里寻找template目录呢,

首先,在web应用程序中查找,如果应用程序中存在一个叫做template的目录(跟WEB-INF目录平级),那么所有的文件从这个目录中取得,具体的路径还要加上主题的名字。

然后,如果在web应用程序中没有找到template目录,那么struts2会在classpath中寻找,由于struts2-core-2.0.9.jar文件中存在template目录,其中内置了四种主题,所以会使用这里变的模板。

例如:

如果我们使用了ajax主题,那么会在如下位置超找<s:textfield>的主题

应用程序

/template/ajax/textfield.ftl

classpath

/template/ajax/textfield.ftl

 

 

修改或者扩展模板:

有些时候Struts提供的模板不一定能够满足我们的需求,这时候我们需要修改或者扩展现有模板。重新做新的模板是不明智的,如果是在需要全新的模板,可以考虑基于simple扩展。

 

修改:

根据模板的装载机制,可以考虑将模板从struts2-core-2.0.9.jar文件中解压缩到web项目目录,之后修改对应的文件。

 

包装:

XHTML提供了一个很好的例子,simple主题提供了基本的功能,XHTML将它包括起来,例如:

以下是template/xhtml/xxx.ftl(xxx表示模板名字)文件内容:

<#include "/${parameters.templateDir}/xhtml/controlheader.ftl" />

<#include "/${parameters.templateDir}/simple/xxx.ftl" />

<#include "/${parameters.templateDir}/xhtml/controlfooter.ftl" />

 

扩展(extend):

使用棉线对象的特性可以扩展一个主题,扩展一个主题的时候不需要实现所有的模板,只需要实现需要变化的标签。

扩展需要在目录中新建一个叫做theme.properties的文件,这个文件只有一行,表明了继承而来的主题的名字,例如:

/template/ajax/theme.properties文件内容为:

parent = xhtml

 

 

4.4节 AJAX标签(试验阶段)

Struts2内置了Dojo 0.4 来提供对Ajax的支持。

想要使用AJAX标签需要做到两点:

1 使用Ajax主题

2 在JSP画面中使用了head标签配置Ajax属性

 

AJAX标签主要有:

<s:div> 

<s:submit>

<s:a>

<s:tabbedPanel>

<s:autocompleter>

 

AJAX标签的一些通用属性:

属性

说明

类型

href

请求使用的URL

String

listenTopic

使用逗号分割的一组主题列表,这个列表中的主题会导致这个Tag自己内容(Div,Autocompleter)重新装载或者执行一个Action(Anchor,Submit)

String

notifyTopic

使用逗号分割的一组主题列表,向这个列表中的主题发布一些信息,例如:’data’,’type’,’request’,参看每个标签的详细说明

String

showErrorTransportText

设置是否显示错误消息(默认显示)

Boolean

indicator

请求过程中显示的对象,通常位ProgressBar等

String

 

Indicator

<img style="display:none"

src="${pageContext.request.contextPath}/images/indicator.gif"

alt="Loading..."/>

 

Topic

监听一个Topic:

dojo.event.topic.subscribe("/refresh", function(param1, param2) {

  //this function will be called everytime "/refresh" is published

});

向一个Topic发布内容:

dojo.event.topic.publish("/refresh", "foo", "bar");

 

URL

Href属性对应的URL必须使用URL标签定义,例如:

<s:url id="ajaxTest" value="/AjaxTest.action" />

<s:div theme=" ajax " href="%{ajaxTest}">

  Initial Content

</s:div>

 

DIV标签:

Div主要用来异步的显示数据, PageLoad会出发Div中数据的显示,除非把AutoStart设置为False。

另外,Div的数据显示可以使用Topic来触发。使用listenTopic来定义触发器。

 

例如:

<s:url id="ajaxTest" value="/AjaxTest.action" />

<s:div theme=" ajax " href="%{ajaxTest}" listenTopics="/refresh0,/refresh1"/>

每次想/refresh0,/refresh1发布内容的时候,上面代码定义的div都会刷新。

 

使用updateFreq可以让Div周期性的触发,在autoStart设置位true的情况下,可以使用delay来延迟首次画面加载的出发时间,例如:

<s:url id="ajaxTest" value="/AjaxTest.action" />

<s:div theme=" ajax " href="%{ajaxTest}" updateFreq="2000" delay="3000"/>

上述代码说明,每隔2秒该div触发内容更新一次,但是首次画面加载完成之后3秒div出发内容更新。

 

@todo 其他标签

 

 

 

4.5节 OGNL

OGNL是Object Graph Navigation Language的简称,详细相关的信息可以参考:http://www.ognl.org。这里我们只涉及Struts2框架中对OGNL的基本支持。

 

OGNL是一个对象,属性的查询语言。在OGNL中有一个类型为Map的Context(称为上下文),在这个上下文中有一个根元素(root),对根元素的属性的访问可以直接使用属性名字,但是对于其他非根元素属性的访问必须加上特殊符号#。

 

在Struts2中上下文为ActionContext,根元素位Value Stack(值堆栈,值堆栈代表了一族对象而不是一个对象,其中Action类的实例也属于值堆栈的一个)。ActionContext中的内容如下图:

              |

              |--application

              |

              |--session

context map---|

              |--value stack(root)

              |

              |--request

              |

              |--parameters

              |

              |--attr (searches page, request, session, then application scopes)

              |

因为Action实例被放在Value Stack中,而Value Stack又是根元素(root)中的一个,所以对Action中的属性的访问可以不使用标记#,而对其他的访问都必须使用#标记。

 

引用Action的属性

<s:property value="postalCode"/>

ActionContext中的其他非根(root)元素的属性可以按照如下的方式访问:

<s:property value="#session.mySessionPropKey"/> or

<s:property value="#session["mySessionPropKey"]"/> or

<s:property value="#request["mySessionPropKey"]/>

 

Action类可以使用ActionContext中的静态方法来访问ActionContext。

ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);

 

OGNL与Collection(Lists,Maps,Sets)

 

生成List的语法为: {e1,e2,e3}.

<s:select label="label" name="name"

list="{'name1','name2','name3'}" value="%{'name2'}" />

上面的代码生成了一个HTML Select对象,可选的内容为: name1,name2,name3,默认值为:name2。

 

生成Map的语法为:#{key1:value1,key2:value2}.

<s:select label="label" name="name"

list="#{'foo':'foovalue', 'bar':'barvalue'}" />

上面的代码生成了一个HTML Select对象,foo名字表示的内容为:foovalue,bar名字表示的内容为:barvalue。

 

判断一个对象是否在List内存在:

<s:if test="'foo' in {'foo','bar'}">

   muhahaha

</s:if>

<s:else>

   boo

</s:else>

 

<s:if test="'foo' not in {'foo','bar'}">

   muhahaha

</s:if>

<s:else>

   boo

</s:else>

 

取得一个List的一部分:

?  –  所有满足选择逻辑的对象

^  -   第一个满足选择逻辑的对象

$  -   最后一个满足选择逻辑的对象

例如:

person.relatives.{? #this.gender == 'male'}

上述代码取得这个人(person)所有的男性(this.gender==male)的亲戚(relatives)

 

 

Lambda 表达式

 

OGNL支持简单的Lambda表达式语法,使用这些语法可以建立简单的lambda函数。

 

例如:

Fibonacci:

if n==0 return 0;

elseif n==1 return 1;

else return fib(n-2)+fib(n-1);

fib(0) = 0

fib(1) = 1

fib(11) = 89

 

OGNL的Lambda表达式如何工作呢?

Lambda表达式必须放在方括号内部,#this表示表达式的参数。例如:

<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />

 

#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)]定义了一个Lambda表达式,

#fib(11) 调用了这个表达式。

 

所以上述代码的输出为:89

 

在JSP2.1中#被用作了JSP EL(表达式语言)的特殊记好,所以对OGNL的使用可能导致问题,

一个简单的方法是禁用JSP2.1的EL特性,这需要修改web.xml文件:

<jsp-config>

    <jsp-property-group>

      <url-pattern>*.jsp</url-pattern>

      <el-ignored>true</el-ignored>

    </jsp-property-group>

</jsp-config>

 

 

4.6节 Tag 语法

代码示例:

表达式

含义

<p>Username: ${user.username}</p>

一个在标准上下文中的JavaBean对象,可以适用Freemarker,Velocity,JSTL EL等(不是OGNL)。

<s:textfield name="username"/>

在Value Stack中的一个username属性。

<s:url id="es" action="Hello">

  <s:param name="request_locale">

    es

  </s:param>

</s:url>

<s:a href="%{es}">Espanol</s:a>

引用Value Stack中属性的另外一种方法。

<s:property

  name="#session.user.username" />

Session中的user对象的username属性。

<s:select

  label="FooBar" name="foo"

  list="#{'username':'trillian',

    'username':'zaphod'}" />

一个简单的静态Map,和put("username","trillian")一样

 

4.7 JSP,Freemarker和Velocity

@TODO 
taglib(struts2标签).doc 立即下载

相关推荐

Taglib自定义标签库

讲述Taglib 自定义标签

《研磨struts2》第八章 Struts2的Taglib 之 8.1 Struts2的Taglib概述

8.1  Struts2的Taglib概述 8.1.1概述 Struts2自带了一套非常强大的标签库,不仅自身功能强大,而且与Struts2中的其它部分无缝结合。在学习之前,先来简要回忆一下标签到底是干什么的? 估计大多数朋友都使用过JSTL,那自然熟悉JSTL的核心标签,也就是c标签。在JSP页面上使用标签,可以分离JSP上的Java代码与HTML。其中HTML用来管理把数据展现...

研磨struts2 161

SAP采购订单行项目增强实战:用BADI ME_GUI_PO_CUST添加自定义字段(避坑指南)

本文详细解析了如何通过BADI ME_GUI_PO_CUST在SAP采购订单行项目中添加自定义字段,包括技术架构理解、字段扩展步骤、自定义函数组创建及BADI实现。文章特别强调了避开官方文档未提及的陷阱,如字段映射限制和屏幕显示问题,并提供了高级优化技巧和性能建议。

weixin_30402343的博客 594

Struts2的标签库详解(一)

Struts2框架提供了丰富的标签库用于构建视图组件。Struts2标签库大大简化了视图页面的开发,并且提高了视图组件的可维护性。 Struts2标签库一般分为三大类:UI标签、非UI标签、Ajax标签。 UI标签(用户界面标签):主要用来生成HTML元素的标签。 非UI标签(非用户界面标签):只要用来实现数据访问、逻辑控制。 Ajax标签:主要用于Ajax技术。 ...

monkey_wei的博客 1630

手把手教你逆向抖店滑块验证码:从抓包到生成captchaBody的完整流程(附Python复现代码)

本文详细解析了抖店滑块验证码的逆向过程,从抓包分析到参数生成,最终用Python完整复现验证流程。涵盖关键接口分析、指纹参数生成、轨迹加密逻辑及核心加密算法实现,帮助开发者突破抖店的多重安全机制,实现高效的人机验证绕过。

weixin_30681121的博客 424

RaiDrive+AList保姆级教程:5分钟搞定OneDrive/百度网盘挂载到本地(附WebDAV配置)

本文提供RaiDrive+AList的保姆级教程,5分钟内实现将OneDrive/百度网盘挂载到本地的详细步骤,包括WebDAV配置。通过AList统一转换云存储协议,RaiDrive虚拟磁盘挂载,显著提升多网盘管理效率,适合需要跨平台操作文件的用户。

weixin_28331555的博客 456

Struts2 标签库

Struts2 标签库

685

tkinter动态表格 - 实时更新数据(TkinterTable)

tkinter动态表格 - 实时更新数据(TkinterTable) 参考 [TkinterTable] Tkinter上的表格GUI】 https://github.com/dmnfarrell/tkintertable/wiki/Usage https://github.com/dmnfarrell/tkintertable/issues/47 python使用tkinter编写一个数据显示窗口(实时显示更新的数据) 首先安装TkinterTable,即pip install tki

qq_33934427的博客 1万+

taglib指令标签的详细使用

taglib 指令标记的使用 taglib 指令用于引入 JSP 页面中需要使用的标签库的定义,以便在页面中使用标签库定义的标签。

weixin_64240179的博客 5272

量子密钥分发(QKD)原理、工程实现与实战部署全解析

密钥分发是信息安全的核心基础,它解决了通信双方如何安全共享秘密密钥的难题。传统方法依赖于数学问题的计算复杂性,而量子密钥分发(QKD)则基于量子力学原理,为密钥分发提供了信息论安全的物理保障。其核心价值在于,利用量子不可克隆定理和测量坍缩原理,使得任何窃听行为都会被合法通信方检测到,从而在理论上实现无条件安全的密钥协商。这项技术特别适用于对安全性要求极高的场景,如金融数据同步、政务专网和电力系统保护。本文聚焦于量子保密通信,深入剖析了以BB84协议为代表的QKD工作原理,并详细拆解了包含单光子探测、偏振编码

weixin_29324401的博客 346

MTK(基础篇)ROM烧录以及分区的作用

本文介绍了MTK芯片设备的刷机流程及关键分区功能。首先通过MTK烧录工具加载ROM文件(包括引导文件和分区表),重点解析了各分区的核心作用:preloader类似BIOS负责硬件初始化;lk作为二级引导程序加载内核;vbmeta验证系统完整性;boot包含Linux内核;dtbo调整硬件配置;modem管理通信功能;tee保护生物识别数据;system/vendor分别存放系统核心和硬件驱动。特别指出preloader、vbmeta等关键分区损坏会导致设备变砖,而recovery分区是重要的救砖入口。全文简

weixin_49303682的博客 444

比较全面的taglib标签库介绍

一、定义标签文件(web.xml) &lt;taglib&gt;    &lt;taglib-uri&gt;/tags/struts-logic&lt;/taglib-uri&gt;    &lt;taglib-location&gt;/WEB-INF/struts-logic.tld&lt;/taglib-location&gt; &lt;/taglib&gt; 二、引用标签文件(js...

fhuan123的专栏 336

商用车重型多挡位机械式变速器(AMT)结构设计与仿真分析

本文针对商用车重型AMT变速器开展结构设计与仿真分析。设计采用12挡双中间轴结构,匹配400kW柴油发动机,最大扭矩2000Nm。通过等比级数分配传动比(头挡14.5,最高挡0.78),采用主副箱组合实现多挡位。双中间轴结构可抵消径向力,提升承载能力。关键设计包括:235mm中心距、4.5-5.0mm齿轮模数、锁环式同步器和复合润滑系统。通过Python参数化建模进行强度校核,计算显示中间轴在2000Nm工况下等效应力满足安全系数要求(屈服强度850MPa,安全系数≥2)。该设计解决了传统MT变速器操作强度

AI的内部世界的博客 113

Taglib Struts标签库

 Struts2 Taglib抽象了不同表示技术,现在Struts2主要支持三种表示技术:JSP,FreeMarker和Velocity。但部分的Tag在三种表示技术下都可以使用,但是也有部分只能在某一种情况下使用。 Tab可以分为两类:通用标签和UI标签。 4.1节 通用标签通用标签用来在页面表示的时候控制代码执行的过程,这些标签也允许从Action或者值堆栈中取得数据。

a564941464的专栏 513

软件设计师---程序设计语言

软件设计师---程序设计语言

我从不打没有准备的仗! 2万+

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

简单TAGLIB

刚刚学习了TAGLIB,做了个简单应用,代码如下:类文件:package com.tonny.blog.taglib;import javax.servlet.jsp.tagext.*;import javax.servlet.jsp.*;public class MyTag extends TagSupport{    public MyTag(){}    public int doStart

YY空间 755

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

taglib uri="/struts-tags" prefix="s"

<%@ taglib uri="/struts-tags" prefix=“s”%> <s:iterator var="c" value="list"> <TR style="FONT-WEIGHT: normal; FONT-STYLE: normal; BACKGROUND-COLOR: white; TEXT-DECORATION: none"> &...

javadamn的博客 933

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JSP实现自定义标签Taglib重点总结

Taglib指令介绍 Taglib指令,其实就是定义一个标签库以及自定义标签的前缀。 比如struts中支持的标签库,html标签库、bean标签库、logic标签库。 其中的具体的实现方式,我们不过多介绍,我们给大家从宏观的角度以及解决其中的疑难点,后面会大家介绍相应的学习 资料。 除了struts的标签库,我们常见还有jstl标签库。 这样在

8560

html 怎么引入c标签库,JSP taglib指令:引入标签库指令

通过使用 JSP taglib 指令,开发者就可以在页面中使用这些基本标记或自定义的标记来完成特殊的功能。语法:参数说明:uri:该属性指定了 JSP 要在 web.xml 文件中查找的标签库描述符,该描述符是一个标签描述文件(*.tld)的映射。在 tld 标签描述文件中定义了该标签库中的各个标签名称,并为每个标签指定一个标签处理类。另外,通过 uri 属性直接指定标签描述文件的路径,而无需在 ...

weixin_35710005的博客 2044

第四章 Tablib Struts标签库

<br /><br />第四章 Tablib Struts标签库<br />Struts2 Taglib抽象了不同表示技术,现在Struts2主要支持三种表示技术:JSP,FreeMarker和Velocity。但部分的Tag在三种表示技术下都可以使用,但是也有部分只能在某一种情况下使用。<br /> <br />Tab可以分为两类:通用标签和UI标签。<br /> <br />4.1节 通用标签<br />通用标签用来在页面表示的时候控制代码执行的过程,这些标签也允许从Action或者值堆栈中取得数据。例

xuweihua723的专栏 370

Struts1 标签库 说明

Struts提供了五个标签库,即:HTML、Bean、Logic、Template和Nested。 HTML标签 : 用来创建能够和Struts 框架和其他相应的HTML 标签交互的HTML 输入表单 Bean标签:  在访问JavaBeans 及其属性,以及定义一个新的bean 时使用 Logic标签: 管理条件产生的输出和对象集产生的循环 Template标签:随着Tiles框架包的出

zhulefei的专栏 2万+
上一篇: 第六章 Localization
下一篇: 第七章 (类型转换)Type Convertion
struts2
博客等级 码龄19年 885粉丝 103原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值