- 浏览: 40738 次
- 性别:
- 来自: 福州
最新评论
-
holdbelief:
哥哥,你这个到底是Struts几?
struts2异常处理 -
ideniece:
代码怎么都是重复的呀?
使用Struts2实现分页显示 -
jianxiangyi:
package articles.action.interce ...
java struts 2 使用拦截器完成权限控制 -
amdvia:
楼主太有才了
很多观点很精辟,很愤青啊
对软件应聘学生的建议 -
meteormatt:
这个讲解要是有图片或是视频就好了.我现在也在学Hibernat ...
Hibernate包介绍
Struts2中实现自定义标签很简单,主要分为3步:
1.创建taglib文件(.tld),编写标签声明。
2.编写自定义标签类。
3.在页面中使用标签。
下面以一个自定义的分页标签为例,进行说明。
其实,开发自定义标签并不需要Struts2的支持,一般情况下,只需要继承javax.servlet.jsp.tagext.BodyTagSupport类,重写doStartTag,doEndTag等方法即可。这里在实现自定义标签时,继承的2个类分别是org.apache.struts2.views.jsp.ComponentTagSupport和org.apache.struts2.components.Component,ComponentTagSupport实际上是对BodyTagSupport的一次封装,看一下ComponentTagSupport类的继承关系就明了了:
- java.lang.Object
- extended by javax.servlet.jsp.tagext.TagSupport
- extended by javax.servlet.jsp.tagext.BodyTagSupport
- extended by org.apache.struts2.views.jsp.StrutsBodyTagSupport
- extended by org.apache.struts2.views.jsp.ComponentTagSupport
java.lang.Object extended by javax.servlet.jsp.tagext.TagSupport extended by javax.servlet.jsp.tagext.BodyTagSupport extended by org.apache.struts2.views.jsp.StrutsBodyTagSupport extended by org.apache.struts2.views.jsp.ComponentTagSupport
继承ComponentTagSupport类是为了获得标签中的属性值,并包装成Component对象。继承Component类是为了从Struts2中的ValueStack中获得相对应的值。
1.声明自定义标签。
首先,需要创建一个tld文件,这是一个标准的XML文件,这个文件中就包含有对自定义标签的声明,声明指出了标签的名字,实现标签的类,标签的属性等信息。当在页面中使用该标签时,web服务器就会从这个文件中找出相对应的标签类,并实例化后执行。这个文件其实与struts.xml文件的作用相类似。
tangs.tld
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
- <taglib>
- <tlib-version>2.2.3</tlib-version>
- <jsp-version>1.2</jsp-version>
- <short-name>tangs</short-name>
- <uri>/tangs</uri>
- <display-name>"Tangs Tags"</display-name>
- <tag>
- <name>pages</name>
- <tag-class>com.tangs.tag.PageTag</tag-class> //标签类
- <body-content>empty</body-content>
- <attribute> //标签中的属性
- <name>cpage</name> //属性名
- <required>true</required> //是否必须
- <rtexprvalue>true</rtexprvalue> //表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定
- </attribute>
- <attribute>
- <name>total</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- <attribute>
- <name>url</name>
- <required>true</required>
- <rtexprvalue>true</rtexprvalue>
- </attribute>
- </tag>
- </taglib>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN" "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"> <taglib> <tlib-version>2.2.3</tlib-version> <jsp-version>1.2</jsp-version> <short-name>tangs</short-name> <uri>/tangs</uri> <display-name>"Tangs Tags"</display-name> <tag> <name>pages</name> <tag-class>com.tangs.tag.PageTag</tag-class> //标签类 <body-content>empty</body-content> <attribute> //标签中的属性 <name>cpage</name> //属性名 <required>true</required> //是否必须 <rtexprvalue>true</rtexprvalue> //表示该自定义标签的某属性的值可以直接指定或者通过动态计算指定 </attribute> <attribute> <name>total</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> <attribute> <name>url</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute> </tag> </taglib>
2.编写标签类
PageTag.java
- package com.tangs.tag;
- import com.opensymphony.xwork2.util.ValueStack;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts2.components.Component;
- import org.apache.struts2.views.jsp.ComponentTagSupport;
- /**
- * 分页标签
- * @author tangs
- */
- public class PageTag extends ComponentTagSupport {
- private String cpage; //当前页
- private String total; //总页数
- private String url; //请求地址
- public void setCpage(String cpage) {
- this.cpage = cpage;
- }
- public void setTotal(String total) {
- this.total = total;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- @Override
- public Component getBean(ValueStack arg0, HttpServletRequest arg1, HttpServletResponse arg2) {
- return new Pages(arg0); //返回Pages Component,分页的逻辑处理都在这个Component中
- }
- //获得参数
- protected void populateParams() {
- super.populateParams();
- Pages pages = (Pages)component;
- pages.setCpage(cpage);
- pages.setTotal(total);
- pages.setUrl(url);
- }
- }
package com.tangs.tag; import com.opensymphony.xwork2.util.ValueStack; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.components.Component; import org.apache.struts2.views.jsp.ComponentTagSupport; /** * 分页标签 * @author tangs */ public class PageTag extends ComponentTagSupport { private String cpage; //当前页 private String total; //总页数 private String url; //请求地址 public void setCpage(String cpage) { this.cpage = cpage; } public void setTotal(String total) { this.total = total; } public void setUrl(String url) { this.url = url; } @Override public Component getBean(ValueStack arg0, HttpServletRequest arg1, HttpServletResponse arg2) { return new Pages(arg0); //返回Pages Component,分页的逻辑处理都在这个Component中 } //获得参数 protected void populateParams() { super.populateParams(); Pages pages = (Pages)component; pages.setCpage(cpage); pages.setTotal(total); pages.setUrl(url); } }
Pages.java
- package com.tangs.tag;
- import com.opensymphony.xwork2.util.ValueStack;
- import java.io.IOException;
- import java.io.Writer;
- import java.util.logging.Level;
- import java.util.logging.Logger;
- import org.apache.struts2.components.Component;
- /**
- * 分页逻辑Bean
- * @author tangs
- */
- public class Pages extends Component {
- private String cpage;
- private String total;
- private String url;
- public String getCpage() {
- return cpage;
- }
- public void setCpage(String cpage) {
- this.cpage = cpage;
- }
- public String getTotal() {
- return total;
- }
- public void setTotal(String total) {
- this.total = total;
- }
- public String getUrl() {
- return url;
- }
- public void setUrl(String url) {
- this.url = url;
- }
- public Pages(ValueStack arg0) {
- super(arg0);
- }
- @Override
- public boolean start(Writer writer) {
- boolean result = super.start(writer);
- try {
- StringBuilder str = new StringBuilder();
- boolean isValid = true;
- //从ValueStack中取出数值
- if (isValid) {
- if (total.startsWith("%{") && total.endsWith("}")) {
- total = total.substring(2, total.length() -1);
- total = (String)this.getStack().findValue(total);
- isValid = total == null ? false : true;
- } else {
- isValid = false;
- }
- }
- if (isValid) {
- if (cpage.startsWith("%{") && cpage.endsWith("}")) {
- cpage = cpage.substring(2, cpage.length() - 1);
- cpage = (String)this.getStack().findValue(cpage);
- isValid = cpage == null ? false : true;
- } else {
- isValid = false;
- }
- }
- if (isValid) {
- if (url.startsWith("%{") && url.endsWith("}")) {
- url = url.substring(2, url.length() - 1);
- url = (String)this.getStack().findValue(url);
- isValid = url == null ? false : true;
- } else {
- isValid = false;
- }
- }
- if (isValid && cpage != null) {
- Integer cpageInt = Integer.valueOf(cpage);
- //当前页与总页数相等
- if (cpage.equals(total)) {
- //如果total = 1,则无需分页,显示“[第1页] [共1页]”
- if ("1".equals(total)) {
- str.append("[第 " + cpage + " 页]");
- str.append(" [共 " + total + " 页]");
- } else {
- //到达最后一页,显示“[首页] [上一页] [末页]”
- str.append("<a href='");
- str.append(url);
- str.append("?cpage=1&total="+total+"&url="+url);
- str.append("'>[首页]</a> <a href='");
- str.append(url);
- str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);
- str.append("'>[上一页]</a> <a href='");
- str.append(url);
- str.append("?cpage=" + total + "&total=" + total+"&url="+url);
- str.append("'>[末页]</a>");
- }
- } else {
- //当前页与总页数不相同
- if ("1".equals(cpage)) {
- //第一页,显示“[首页] [下一页] [末页]”
- str.append("<a href='");
- str.append(url);
- str.append("?cpage=1&total="+total+"&url="+url);
- str.append("'>[首页]</a> <a href='");
- str.append(url);
- str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);
- str.append("'>[下一页]</a> <a href='");
- str.append(url);
- str.append("?cpage=" + total + "&total=" + total+"&url="+url);
- str.append("'>[末页]</a>");
- } else {
- //不是第一页,显示“[首页] [上一页] [下一页] [末页]”
- str.append("<a href='");
- str.append(url);
- str.append("?cpage=1&total="+total+"&url="+url);
- str.append("'>[首页]</a> <a href='");
- str.append(url);
- str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url);
- str.append("'>[上一页]</a> <a href='");
- str.append(url);
- str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url);
- str.append("'>[下一页]</a> <a href='");
- str.append(url);
- str.append("?cpage=" + total + "&total=" + total+"&url="+url);
- str.append("'>[末页]</a>");
- }
- }
- }
- writer.write(str.toString());
- } catch (IOException ex) {
- Logger.getLogger(Pages.class.getName()).log(Level.SEVERE, null, ex);
- }
- return result;
- }
- }
package com.tangs.tag; import com.opensymphony.xwork2.util.ValueStack; import java.io.IOException; import java.io.Writer; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.struts2.components.Component; /** * 分页逻辑Bean * @author tangs */ public class Pages extends Component { private String cpage; private String total; private String url; public String getCpage() { return cpage; } public void setCpage(String cpage) { this.cpage = cpage; } public String getTotal() { return total; } public void setTotal(String total) { this.total = total; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public Pages(ValueStack arg0) { super(arg0); } @Override public boolean start(Writer writer) { boolean result = super.start(writer); try { StringBuilder str = new StringBuilder(); boolean isValid = true; //从ValueStack中取出数值 if (isValid) { if (total.startsWith("%{") && total.endsWith("}")) { total = total.substring(2, total.length() -1); total = (String)this.getStack().findValue(total); isValid = total == null ? false : true; } else { isValid = false; } } if (isValid) { if (cpage.startsWith("%{") && cpage.endsWith("}")) { cpage = cpage.substring(2, cpage.length() - 1); cpage = (String)this.getStack().findValue(cpage); isValid = cpage == null ? false : true; } else { isValid = false; } } if (isValid) { if (url.startsWith("%{") && url.endsWith("}")) { url = url.substring(2, url.length() - 1); url = (String)this.getStack().findValue(url); isValid = url == null ? false : true; } else { isValid = false; } } if (isValid) { Integer cpageInt = Integer.valueOf(cpage); //当前页与总页数相等 if (cpage.equals(total)) { //如果total = 1,则无需分页,显示“[第1页] [共1页]” if ("1".equals(total)) { str.append("[第 " + cpage + " 页]"); str.append(" [共 " + total + " 页]"); } else { //到达最后一页,显示“[首页] [上一页] [末页]” str.append("<a href='"); str.append(url); str.append("?cpage=1&total="+total+"&url="+url); str.append("'>[首页]</a> <a href='"); str.append(url); str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url); str.append("'>[上一页]</a> <a href='"); str.append(url); str.append("?cpage=" + total + "&total=" + total+"&url="+url); str.append("'>[末页]</a>"); } } else { //当前页与总页数不相同 if ("1".equals(cpage)) { //第一页,显示“[首页] [下一页] [末页]” str.append("<a href='"); str.append(url); str.append("?cpage=1&total="+total+"&url="+url); str.append("'>[首页]</a> <a href='"); str.append(url); str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url); str.append("'>[下一页]</a> <a href='"); str.append(url); str.append("?cpage=" + total + "&total=" + total+"&url="+url); str.append("'>[末页]</a>"); } else { //不是第一页,显示“[首页] [上一页] [下一页] [末页]” str.append("<a href='"); str.append(url); str.append("?cpage=1&total="+total+"&url="+url); str.append("'>[首页]</a> <a href='"); str.append(url); str.append("?cpage=" + (cpageInt - 1) + "&total=" + total+"&url="+url); str.append("'>[上一页]</a> <a href='"); str.append(url); str.append("?cpage=" + (cpageInt + 1) + "&total=" + total+"&url="+url); str.append("'>[下一页]</a> <a href='"); str.append(url); str.append("?cpage=" + total + "&total=" + total+"&url="+url); str.append("'>[末页]</a>"); } } } writer.write(str.toString()); } catch (IOException ex) { Logger.getLogger(Pages.class.getName()).log(Level.SEVERE, null, ex); } return result; } }
3.服务端
服务端主要是获得请求然后转向显示的页面
http://tangshuo.iteye.com/blog/189447?page=1#comments
发表评论
-
Struts 2 假分页
2009-03-05 17:48 1590主要思想,将要分面的数据全部取出。放入bigList,再根据c ... -
使用Struts2实现分页显示
2009-03-04 18:21 1744在开发web程序时,从数据库中取出来的数据一般都要分页显示在页 ... -
Struts2中实现自定义分页标签2
2009-03-04 18:09 1274UserDAOImpl.java public List al ... -
struts2异常处理
2009-03-02 16:26 3699通过Servlet异常处理,只要简单地在Web.xml ... -
深入Struts2的配置文件
2009-03-02 16:01 743本部分主要介绍struts.xml的常用配置。 1.1. ... -
Struts2 中 Result的 Chain Result,Redirect Action Res
2009-03-01 12:34 5770Chain Result:这个result调用另外的一个act ... -
struts2 redirect-action 传递 参数
2009-03-01 11:56 10890在做一个系统,使用struts2框架,在提交一个请求后 ... -
# 、%{} 和%{#} 什么时候该用
2009-02-28 21:10 899Struts2中有值堆栈和堆栈上下文的概念,你用 <s: ... -
struts2标签的学习总结(二)
2009-02-28 19:58 1252set标签赋予变量一个特定范围内的值。当希望给一个变量赋一个复 ... -
Struts 2中的OGNL
2009-02-28 17:21 877本人是一个EL(Expression Language,以 ... -
struts2标签的学习总结(一)
2009-02-28 16:27 1154Struts2标签使用 (1):& ... -
java struts 2 使用拦截器完成权限控制
2009-02-28 16:22 3054这段时间在学习一本新书——《struts2权威指南》(李刚著) ...
相关推荐
标签源代码 博文链接:https://tangshuo.iteye.com/blog/189820
Struts2自定义分页标签很详细了,新手可以少走弯路,节约时间 资源包括了后台如何操作。
基于struts2的自定义分页标签实现的一个demo,连接数据库为Oracle
Struts2中实现自定义标签很简单,主要分为3步: 1.创建taglib文件(.tld),编写标签声明。 2.编写自定义标签类。 3.在页面中使用标签。 下面以一个自定义的分页标签为例,进行说明。 其实,开发自定义标签并不...
Struts 2 自定义标签分页,有简单上下分页和数字分页
自定义标签实现分页,分页信息都封装在一个继承自TagSupport的java文件中,自定义一个tld文件,jsp页面通过taglib指令引入tld文件,使用自定义标签。
NULL 博文链接:https://wxb-j2ee.iteye.com/blog/916350
自定义struts2 分页标签,值得学习..
JSP自定义标签分页+Struts1.x标签,包含标签分页类、标签tld文件、web.xml配置和调用例子,非常地简单。 只要在Action传request.setAttribute("listUser", listUser);到JSP即可实现自动分页,输出分页样式可以自己去...
自己做的简单的基于struts2,spring的简单分页标签,技术实现:js,java(Tagsurport)
这是一个自定义分页的源代码, 这个分页标签只负责分页不操作数据库, 你只用给他一个集合,并为这个分页的分页类的实例起个名,但要用到C标签或Struts1标签中的迭代功能。
下面是我用Struts2做的一个分页显示实例,基本的思路是:把数据库表中的每一行数据封装成一个对象,用一个返回类型为List的方法返回这些对象,接着在Struts2的action里面定义一个List属性,用这个List来接收从数据库...
struts+hibernate+自定义标签 做的分页模板
在应用Struts框架的情况下,用自定义标签将查到的数据进行分页显示。
自定义分页标签,可分页显示保存在List中的任意对象
一个分页标签,只需使用一个标签就可以输出分页信息。配有示例,示例中使用了Struts 1.x + Hibernate, 不用这两个框架的话稍微做些修改就可以了,比较简单,就不啰嗦了,基本使用方法都差不多,有错误指出欢迎指正。