cad2009下载 免费中文版-filezilla乱码
![struts2 标签](/uploads/image/0592.jpg)
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.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
计算指定
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
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.
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.
1.
2.
3.
4.
5.
6.
7.
8.
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 标签
发布评论