cad2009下载 免费中文版-filezilla乱码

struts2 标签
2023年4月6日发(作者:vlanid)

Struts2中实现自定义分页标签

Struts2中实现自定义标签很简单,主要分为3步:

1.创建taglib文件(.tld),编写标签声明。

2.编写自定义标签类。

3.在页面中使用标签。

下面以一个自定义的分页标签为例,进行说明。

其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承

gSupport类,重写doStartTag,doEndTag等方法即可。这里在实现

自定义标签时,继承的2个类分别是entTagSupport和

ent,ComponentTagSupport实际上是对BodyTagSupport

的一次封装,看一下ComponentTagSupport类的继承关系就明了了:

Java代码

port

gSupport

BodyTagSupport

entTagSupport

继承ComponentTagSupport类是为了获得标签中的属性值,并包装成Component对象。继承

Component类是为了从Struts2中的ValueStack中获得相对应的值。

1.声明自定义标签。

首先,需要创建一个tld文件,这是一个标准的XML文件,这个文件中就包含有对自定义标签的声明,

声明指出了标签的名字,实现标签的类,标签的属性等信息。当在页面中使用该标签时,web服务器

就会从这个文件中找出相对应的标签类,并实例化后执行。这个文件其实与文件的作用相

类似。

Xml代码

1.<?xmlversion="1.0"encoding="UTF-8"?>

2.

p:///dtd/web-jsptaglibrary_1_">

1.

2.

3.2.2.3

4.1.2

5.tangs

6./tangs

7."TangsTags"

8.

9.

10.pages

11.g//标签类

12.empty

13.//标签中的属性

14.cpage//属性名

15.true//是否必须

16.true//表示该自定义标签的某属性的值可以直接指定或者通过动态

计算指定

17.

18.

19.total

20.true

21.true

22.

23.

24.url

25.true

26.true

27.

28.

29.

2.编写标签类

Java代码

;

2.

tack;

rvletRequest;

rvletResponse;

ent;

entTagSupport;

8.

9./**

10.*分页标签

11.*@authortangs

12.*/

classPageTagextendsComponentTagSupport{

eStringcpage;//当前页

eStringtotal;//总页数

eStringurl;//请求地址

17.

voidsetCpage(Stringcpage){

=cpage;

20.}

21.

voidsetTotal(Stringtotal){

=total;

24.}

25.

voidsetUrl(Stringurl){

=url;

28.}

29.

30.@Override

ComponentgetBean(ValueStackarg0,HttpServletRequestarg1,HttpServletResponsearg2){

newPages(arg0);//返回PagesComponent,分页的逻辑处理都在这个Component中

33.}

34.

35.//获得参数

tedvoidpopulateParams(){

teParams();

38.

ages=(Pages)component;

ge(cpage);

al(total);

(url);

43.}

44.}

Java代码

;

2.

tack;

ption;

;

;

;

ent;

9.

10./**

11.*分页逻辑Bean

12.*@authortangs

13.*/

classPagesextendsComponent{

eStringcpage;

eStringtotal;

eStringurl;

18.

StringgetCpage(){

cpage;

21.}

22.

voidsetCpage(Stringcpage){

=cpage;

25.}

26.

StringgetTotal(){

total;

29.}

30.

voidsetTotal(Stringtotal){

=total;

33.}

34.

StringgetUrl(){

url;

37.}

38.

voidsetUrl(Stringurl){

=url;

41.}

42.

43.

Pages(ValueStackarg0){

(arg0);

46.}

47.

48.@Override

booleanstart(Writerwriter){

nresult=(writer);

{

Builderstr=newStringBuilder();

nisValid=true;

54.

55.//从ValueStack中取出数值

(isValid){

(With("%{")&&th("}")){

=ing(2,()-1);

=(String)ck().findValue(total);

d=total==null?false:true;

61.}else{

d=false;

63.}

64.}

(isValid){

(With("%{")&&th("}")){

=ing(2,()-1);

=(String)ck().findValue(cpage);

d=cpage==null?false:true;

70.}else{

d=false;

72.}

73.}

(isValid){

(With("%{")&&th("}")){

=ing(2,()-1);

=(String)ck().findValue(url);

d=url==null?false:true;

79.}else{

d=false;

81.}

82.}

83.

(isValid){

rcpageInt=f(cpage);

86.//当前页与总页数相等

((total)){

88.//如果total=1,则无需分页,显示“[第1页][共1页]”

("1".equals(total)){

("[第"+cpage+"页]");

("[共"+total+"页]");

92.}else{

93.//到达最后一页,显示“[首页][上一页][末页]”

("

(url);

("?cpage=1&total="+total+"&url="+url);

("'>[首页]

(url);

("?cpage="+(cpageInt-1)+"&total="+total+"&url="+url);

("'>[上一页]

(url);

("?cpage="+total+"&total="+total+"&url="+url);

("'>[末页]");

104.}

105.}else{

106.//当前页与总页数不相同

("1".equals(cpage)){

108.//第一页,显示“[首页][下一页][末页]”

("

(url);

("?cpage=1&total="+total+"&url="+url);

("'>[首页]

(url);

("?cpage="+(cpageInt+1)+"&total="+total+"&url="+url);

("'>[下一页]

(url);

("?cpage="+total+"&total="+total+"&url="+url);

("'>[末页]");

119.}else{

120.//不是第一页,显示“[首页][上一页][下一页][末页]”

("

(url);

("?cpage=1&total="+total+"&url="+url);

("'>[首页]

(url);

("?cpage="+(cpageInt-1)+"&total="+total+"&url="+url);

("'>[上一页]

(url);

("?cpage="+(cpageInt+1)+"&total="+total+"&url="+url);

("'>[下一页]

(url);

("?cpage="+total+"&total="+total+"&url="+url);

("'>[末页]");

134.}

135.}

136.}

137.

(ng());

139.

140.}catch(IOExceptionex){

ger(e()).log(,null,ex);

142.}

result;

144.}

145.}

3.服务端

服务端主要是获得请求然后转向显示的页面

Java代码

1./*

2.*Tochangethistemplate,chooseTools|Templates

3.*andopenthetemplateintheeditor.

4.*/

5.

;

7.

Support;

9.

10./**

11.*

12.*@authortangs

13.*/

classDisplayActionextendsActionSupport{

eStringcpage;

eStringtotal;

eStringurl;

18.

Stringlist(){

20.

21.//Getdatafromserver

22.//...

23.//这里没有做任何逻辑,直接跳转到了页面

SUCCESS;

25.}

StringgetCpage(){

cpage;

28.}

29.

voidsetCpage(Stringcpage){

=cpage;

32.}

33.

StringgetTotal(){

total;

36.}

37.

voidsetTotal(Stringtotal){

=total;

40.}

41.

StringgetUrl(){

url;

44.}

45.

voidsetUrl(Stringurl){

=url;

48.}

49.

50.

51.}

Xml代码

1.<?xmlversion="1.0"encoding="UTF-8"?>

2.

/dtds/">

3.

4.

5.

6./

7.

8.

9.

4.在页面中使用标签

Html代码

1.<%@pagecontentType="text/html"pageEncoding="UTF-8"%>

2.<%@taglibprefix="tangs"uri="/WEB-INF/"%>

3.<%@taglibprefix="s"uri="/WEB-INF/"%>

4.

5.

6.

7.

8.List

9.

10.

11.共页第

12.

13.

14.

好了,启动服务器,从浏览器中输入http://localhost:7001/TagTest/?cpage=1&total=5&url=

就会得到下面的结果:

Struts2中实现自定义分页标签--功能扩充

上一篇结合Struts2实现了分页的自定义标签。标签比较简单,3个参数,单一的显示样式。下面

对该标签的功能进行进一步的扩充,主要包括:

1.可以为标签指定样式。通过styleClass属性,可以为标签指定一个样式表。

2.增加了分页样式的选择。通过theme属性指定分页样式。

theme="text"的样式:

theme="number"的样式:

修改方案:

1.在tld文件中增加这两个属性的声明:

Xml代码

1.

2.styleClass

1.

2.false

3.true

4.

5.

6.theme

7.false

8.true

9.

2.在自定义标签类中分别增加styleClass和theme属性,并提供setter方法:

Java代码

1./*

2.*Tochangethistemplate,chooseTools|Templates

3.*andopenthetemplateintheeditor.

4.*/

5.

;

7.

tack;

rvletRequest;

rvletResponse;

ent;

entTagSupport;

13.

14./**

15.*分页标签

16.*@authortangs

17.*/

classPageTagextendsComponentTagSupport{

eStringcpage;

eStringtotal;

eStringurl;

eStringstyleClass;//新增的样式属性

eStringtheme;//新增的分页样式属性

24.

voidsetTheme(Stringtheme){

=theme;

27.}

28.

voidsetStyleClass(StringstyleClass){

lass=styleClass;

31.}

32.

voidsetCpage(Stringcpage){

=cpage;

35.}

36.

voidsetTotal(Stringtotal){

=total;

39.}

40.

voidsetUrl(Stringurl){

=url;

43.}

44.

45.@Override

ComponentgetBean(ValueStackarg0,HttpServletRequestarg1,HttpServletResponsearg2){

newPages(arg0,arg1);

48.}

49.

tedvoidpopulateParams(){

teParams();

52.

ages=(Pages)component;

ge(cpage);

al(total);

(url);

leClass(styleClass);

me(theme);

59.

60.}

61.}

Java代码

1./*

2.*Tochangethistemplate,chooseTools|Templates

3.*andopenthetemplateintheeditor.

4.*/

5.

;

7.

tack;

ption;

;

;

;

rvletRequest;

ent;

15.

16./**

17.*分页逻辑Bean

18.*@authortangs

19.*/

classPagesextendsComponent{

eHttpServletRequestrequest;

eStringcpage;

eStringtotal;

eStringurl;

eStringstyleClass;

eStringtheme;

27.

StringgetTheme(){

theme;

30.}

31.

voidsetTheme(Stringtheme){

=theme;

34.}

35.

36.

StringgetStyleClass(){

styleClass;

39.}

40.

voidsetStyleClass(StringstyleClass){

lass=styleClass;

43.}

44.

45.

StringgetCpage(){

cpage;

48.}

49.

voidsetCpage(Stringcpage){

=cpage;

52.}

53.

StringgetTotal(){

total;

56.}

57.

voidsetTotal(Stringtotal){

=total;

60.}

61.

StringgetUrl(){

url;

64.}

65.

voidsetUrl(Stringurl){

=url;

68.}

69.

70.

Pages(ValueStackarg0,HttpServletRequestrequest){

(arg0);

t=request;

74.}

75.

76.@Override

booleanstart(Writerwriter){

nresult=(writer);

{

Builderstr=newStringBuilder();

nisValid=true;

82.

83.//从ValueStack中取出数值

(isValid){

(With("%{")&&th("}")){

=ing(2,()-1);

=(String)ck().findValue(total);

d=total==null?false:true;

89.}else{

d=false;

91.}

92.}

(isValid){

(With("%{")&&th("}")){

=ing(2,()-1);

=(String)ck().findValue(cpage);

d=cpage==null?false:true;

98.}else{

d=false;

100.}

101.}

(isValid){

(With("%{")&&th("}")){

=ing(2,()-1);

=(String)ck().findValue(url);

d=url==null?false:true;

107.}else{

d=false;

109.}

110.}

111.

(isValid){

rcpageInt=f(cpage);

("

(styleClass!=null){

("class='"+styleClass+"'>");

117.}else{

(">");

119.}

120.

121.//文本样式

(theme==null||"text".equals(theme)){//theme="text"样式

123.//当前页与总页数相等

((total)){

125.//如果total=1,则无需分页,显示“[第1页][共1页]”

("1".equals(total)){

("[第"+cpage+"页]");

("[共"+total+"页]");

129.}else{

130.//到达最后一页,显示“[首页][上一页][末页]”

("

(url);

("?cpage=1&total="+total+"&url="+url);

("'>[首页]

(url);

("?cpage="+(cpageInt-1)+"&total="+total+"&url="+url);

("'>[上一页]

(url);

("?cpage="+total+"&total="+total+"&url="+url);

("'>[末页]");

141.}

142.}else{

143.//当前页与总页数不相同

("1".equals(cpage)){

145.//第一页,显示“[首页][下一页][末页]”

("

(url);

("?cpage=1&total="+total+"&url="+url);

("'>[首页]

(url);

("?cpage="+(cpageInt+1)+"&total="+total+"&url="+url);

("'>[下一页]

(url);

("?cpage="+total+"&total="+total+"&url="+url);

("'>[末页]");

156.}else{

157.//不是第一页,显示“[首页][上一页][下一页][末页]”

("

(url);

("?cpage=1&total="+total+"&url="+url);

("'>[首页]

(url);

("?cpage="+(cpageInt-1)+"&total="+total+"&url="+url);

("'>[上一页]

(url);

("?cpage="+(cpageInt+1)+"&total="+total+"&url="+url);

("'>[下一页]

(url);

("?cpage="+total+"&total="+total+"&url="+url);

("'>[末页]");

171.}

172.}

173.}elseif("number".equals(theme)){//theme="number"的数字样式[>>>]

rtotalInt=f(total);

175.

176.//如果只有一页,则无需分页

("[");

(totalInt==1){

("1");

180.}else{

181.//计算一共分几组

up=(totalInt-1)/10+1;

183.//当前第几组

oup=(cpageInt-1)/10+1;

185.

(cgroup>1){

187.//当前不是第一组,要显示“<<<”

188.//<<:返回前一组第一页

189.//<:返回前一页

("

(url);

("?cpage="+((cgroup-2)*10+1)+"&total="+total+"&url="+url);

("'>«");

("

(url);

("?cpage="+(cpageInt-1)+"&total="+total+"&url="+url);

("'>‹");

198.}

199.//10个为一组显示

(inti=(cgroup-1)*10+1;i<=totalInt&&i<=cgroup*10;i++){

(cpageInt==i){//当前页要加粗显示

("");

203.}

("

(url);

("?cpage="+i+"&total="+total+"&url="+url);

("'>"+i+"");

(cpageInt==i){

("");

210.}

211.}

212.//如果多于1组并且不是最后一组,显示“>>>”

(group>1&&cgroup!=group){

214.//>>:返回下一组最后一页

215.//>:返回下一页

("

(url);

("?cpage="+(cpageInt+1)+"&total="+total+"&url="+url);

("'>›");

("

(url);

("?cpage="+((cgroup*10+10)>totalInt?totalInt:(cgroup*10+10))+"&to

tal="+total+"&url="+url);

("'>»");

224.}

225.}

("]");

227.}

("");

229.}

230.

(ng());

232.

233.}catch(IOExceptionex){

ger(e()).log(,null,ex);

235.}

result;

237.}

238.}

3.在页面中使用标签

Html代码

1.

指定了styleClass和theme属性,得到的分页样式:

更多推荐

struts2 标签