文档库 最新最全的文档下载
当前位置:文档库 › taglib(struts2标签)

taglib(struts2标签)

taglib(struts2标签)
taglib(struts2标签)

Taglib(Struts2标签库)

Struts2Taglib抽象了不同表示技术,现在Struts2主要支持三种表示技术:

JSP,FreeMarker和Velocity。但部分的Tag在三种表示技术下都可以使用,但是也有部分只能在某一种情况下使用。

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

4.1节通用标签

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

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

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

控制标签

if标签

描述

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

参数

Will Not Be Executed

Will Be Executed

Will Not Be Executed

elseIf标签

参考if标签

else标签

参考if标签

append标签

描述

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

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;}

标签使用

generator标签(JSP Tag)

描述

从val属性生成一个iterator。

参数

例子

例1:

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


例2:

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

Generate an iterator with count attribute


例3:

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

<%

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

while(i.hasNext()){

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

%>

<%=s%>

<%

}

%>

例4:

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


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对象

参数

例子

例1:

day is:

例2:

Days of the week

例3:

class="oddeven">

,

merge标签(同append?)

描述

参数

例子

sort标签(JSP-Tag)

描述

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

参数

Comparator是是https://www.wendangku.net/doc/0014874228.html,parator排序用的比较器Source否是String排序对象

例子

例1:

例2:

<%

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

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

//do something with each of the sorted elements

}

%>

subset

描述

递归iterator的一部分

参数

例子

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);

}

};

}

}

<%

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

while(i.hasNext()){

%>

<%=i.next()%>

<%}%>

数据标签

@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相关的属性和其他通用属性。

模版相关属性:

Tooltip相关属性:

通用属性:

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类中属性的值对应。

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

...

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

...

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)而言,使用以下例子来说明三者之间的关系。假如我们要开发如下的一个画面:

我们使用如下的代码:

这里每一个都是一个标签(tag)。

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

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

Name:

value=""id="login_name"/>

Password:

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

value="Submit"/>

value="Reset"/>

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

生成的代码为:

Name:

我们可以看到,标签提供的有效信息只有Name和name,而其余的部分,例如,,

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

name="${https://www.wendangku.net/doc/0014874228.html,?default("")?html}"<#rt/>

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

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

<#if parameters.maxlength?exists>

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

<#if https://www.wendangku.net/doc/0014874228.html,Value?exists>

value="<@s.property value="https://www.wendangku.net/doc/0014874228.html,Value"/>"<#rt/>

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

disabled="disabled"<#rt/>

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

readonly="readonly"<#rt/>

<#if parameters.tabindex?exists>

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

<#if parameters.id?exists>

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

<#if parameters.cssClass?exists>

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

<#if parameters.cssStyle?exists>

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

<#if parameters.title?exists>

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

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

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

例如:

TemplateForm_A,TemplateForm_B

TemplateTextField_A,TemplateTextField_B

TemplatePassword_A,TemplatePassword_B

,TemplateSubmit_A,TemplateSubmit_B

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主题,那么会在如下位置超找的主题

应用程序/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内置了Dojo0.4来提供对Ajax的支持。

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

1使用Ajax主题

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

AJAX标签主要有:

AJAX标签的一些通用属性:

Indicator

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标签定义,例如:

Initial Content

DIV标签:

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

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

例如:

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

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

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

出发内容更新。

@todo其他标签

4.5节OGNL

OGNL是Object Graph Navigation Language的简称,详细相关的信息可以参考:

https://www.wendangku.net/doc/0014874228.html,。这里我们只涉及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的属性

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

or

or

Action类可以使用ActionContext中的静态方法来访问ActionContext。ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);

OGNL与Collection(Lists,Maps,Sets)

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

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

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

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

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

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

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

muhahaha

boo

muhahaha

boo

取得一个List的一部分:

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

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

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

例如:

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

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

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

例如:

Fibonacci:

if n==0return0;

elseif n==1return1;

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

fib(0)=0

fib(1)=1

fib(11)=89

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

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

#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

true

4.6节Tag语法

适用Freemarker,Velocity,JSTL EL等(不

是OGNL)。

在Value Stack中的一个username属性。

es

Espanol

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

name="#https://www.wendangku.net/doc/0014874228.html,ername"/>

Session中的user对象的username属性。

label="FooBar"name="foo"

list="#{'username':'trillian', 'username':'zaphod'}"/>一个简单的静态Map,和

put("username","trillian")一样

SCME_STRUTS2试卷

--------------------------------------装--------------------------------------订------------------------------线---------------------------------------- **学院课程考试试卷 课程名称:《使用Struts2开发基于MVC设计模式的企业级应用》(A)卷 年级:班级: 姓名:_______________ 学号:_________________ 考试(考查) 闭卷 选择题(每题2分,共计100分) 1.在控制器类中一般需要添加相应属性的( A )和(C )。(选两项) A.setter方法 B.as方法 C.getter方法 D.is方法 2.业务控制器需要在( B )配置文件中进行配置 A.web.xml B.struts.xml C.struts2.xml D.webwork.xml 3.不属于Struts 2表单标签库的是( D )。 A. B. C. D.标签的property属性指定字段的名字,对应ActionForm bean中的一个属性,代码如下: 的对应的userForm bean属性 private String login_Name; public String getLogin_Name() { return login_Name; } public void setLogin_Name(String login_Name) { this.login_Name = login_Name; } 3,:生成HTML标签,使用方法与相同。 启用 停用 4,:生成HTML 5.在JSP页面中可以通过Struts 2提供的___D________标签来输出国际化信息。D A. B. C. D. 6.资源文件的后缀名为____D_______。D

Struts2试题

Struts2试题 1.struts2的执行流程? 客户端提交一个HttpServletRequest请求(action或JSP页面) 请求被提交到一系列Filter过滤器,如ActionCleanUp和FiterDispatcher等 FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器询问ActionMapper是否需要调用某个action来处理 如果ActonMapper据诶的那个需要调用某个A传统,FilterDispatcher则把请求教到ActionProxy,由其进行处理 ActionProxy通过Configuration Manager询问框架配置文件,找到需要调用的Action类ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用action Action执行完毕后,返回一个result字符串,此时再按相反的顺序通过Interceptor拦截器最后ActionInvocation负责根据struts配置文件中配置的result元素,找到与返回值对应的result 2.struts2的web里需要配置什么? 1. 2. 3.struts2 4. 5.org.apache.struts2.dispatcher.FilterDispatcher 6. 7. 8. 9.

10.struts2 11./* 12. 3.struts.xml文件哪个常量可以实现不用重新启动服务就可以得到反馈? 4.struts中的package的作用是什么?namespace可以为空吗?如果namespace为空会意味着什么呢? 标识 可以、 Timmer 如果没写,说明该包为默认空间只要敲index没有精确对应的package都交给namespackage 如果还没有就崩溃 5.Action的实现通集成常用那种方法? 一种是直接实现自己的Action 另一种是实现Action的接口 继承ActionSupport 6.路径设置用什么路径,绝对还是相对? 都可以 7.通配符有几种?要遵循什么原则? {1} 方法名 8.Action的属性?

Struts2中防止表单的重复提交

Struts2中防止表单的重复提交 在学习编程的过程中,我觉得不止要获得课本的知识, 更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,更多Java学习,请搜索疯狂Java; struts2的token令牌 1、javaweb控制表单重复提交 (1)在jsp页面上使用隐藏域 这样做,每次正常跳转到该页面隐藏域都会产生不同的value的值,此时属于正常操作 如果提交表单的时候,出现隐藏域的值相同,说明表单重复提交(2)在Action类中 先获取session中存放的token的值,String sessionToken = session.getAttibuter ("sessionToken"); 首先会获取页面表单隐藏域(token.html)的值,String token = request.getParameter("token.html"); 同时放置到session中,session.setAttibuter("sessionToken",token); 判断表单是否重复提交 if(sessionToken.equal(token)){//表单重复提交 } else{//表单没有重复提交 } 2、struts实现表单重复提交 (1)在某个页面验证表单重复提交,此时要添加标签,该标签可以产生如下代码: (2)由于token拦截器没有放置到默认栈中,所以当使用token表单重复提交的时候,需要在struts.xml中加载token拦截器

struts2复习模拟题

填空: 1.Struts 2以__过滤器__为核心,采用__拦截器__的机制来处理用户的请求。 2.构建Struts 2应用的最基础的几个类库是_struts2-core__、_commons-logging_、_xwork-core_、__freamarker___以及_ognl_。 3.Struts 2中的控制器类是一个普通的_POJO_。 4.如果要在JSP页面中使用Struts 2提供的标签库,首先必须在页面中使用taglib编译指令导入标签库,其中taglib编译指令为_____<%@ taglib prefix=”s” uri=”strut-tags”%>______。5.在Struts 2表单标签库中,表单标签为__________。 6.ActionSupport类实现了__action_________接口和___validateable________等接口。7.通过控制器类中的____validate()_______方法来输出校验错误信息。 8. 在Hibernate XML影射文件中描述主键生成机制,其属性描述了主键的生成策略,至少写出三种策略名 increment 、 native 、 uuid 。 9. 在Hibernate中级联操作的属性值至少写出三个____none_______ 、_____save-update______、____all_______。 10 Hibernate的会话接口是 ______Session接口_____,它由接口 __SessionFactory接口__创建;Hibernate处理事务的接口是____Transaction接口_______;封装HQL的接口是_____Criteria接口______ 。 11.Struts2框架由_____ Struts ______和______ WebWork _____框架发展而来。 12.Struts2中的控制器类是一个普通的____Class_______。 13.注入资源的注释是____@Resource ___

如何自定义Struts2表单验证后的错误信息显示格式

如何自定义Struts2表单验证后的错误信息显示格式/样式 (s:fielderror,换行,黑点) 前面一段时间学过一些Struts2的知识,感觉Struts2和1.x还是有很大的差别的,我还不好说1.x肯定会过时还是2.0会很快流行,这毕竟是需要作为导向的。 在Struts2中验证真的比较容易,可以在Action中直接写validate,也可以使用validate框架进行验证,这个我觉得比Struts1.x方便了很多,但是有个问题一直困扰了我,直到现在有个小程序要用到这个方面的知识,那就是验证后如何很好地人性化地在jsp 页面中显示了。 大家都知道,Struts2显示验证结果有一些方式,一般通过两种方式,介绍如下: 1.在页面的上面或者某个位置全部显示错误 代码: 这样会显示所有的错误信息,模拟效果如下: 2.在每个字段下面或上面显示,通过 XXX(标签的name属性,象https://www.wendangku.net/doc/0014874228.html,ername) 例:用 戶 名: https://www.wendangku.net/doc/0014874228.html,ername 显示效果如下:

上面的差不多是Struts默认显示的两种方式,但是我们常见的显示方式并不是这样的,所有我们需要自定义这种格式,我们的习惯是把错误信息显示在某个出错字段的后面,一行显示,而它给了一个小黑点并且换了行,我们现在就来解决这个问题。 这个问题困扰了我很久,真的很久以前想过,但是没有彻底地解决,一直留到现在,今天在google上搜了很久,终于给解决了,现在分享一下解决的途径。 先提供网上的思路给大家(关键解决的思路) 1.struts2表单验证_错误信息的显示问题中提到 引用 10 楼 starwar2030 的回复: 可以在CSS中定义 .formFieldError { font-family: verdana, arial, helvetica, sans-serif; font-size: 12px; color: #FF3300; vertical-align: bottom; } .formFieldError ul{ margin: 0px; padding: 3px; vertical-align: middle; } 而后使用类似用

相关文档