- 浏览: 19898 次
- 性别:
- 来自: 石家庄
最新评论
-
aidengxiang:
我晕 打开就调广告 ZL 你忽悠我们吧
java web标签大全(Struts2、Struts1、jstl、jsf、spring、Freemarker 、Velocity) -
qskm:
打开立马跳转到广告页面了。。。
java web标签大全(Struts2、Struts1、jstl、jsf、spring、Freemarker 、Velocity) -
派卡琪安:
Wonderful!
java web标签大全(Struts2、Struts1、jstl、jsf、spring、Freemarker 、Velocity) -
lvhjean:
不能用了。怎么办啊?
java web标签大全(Struts2、Struts1、jstl、jsf、spring、Freemarker 、Velocity) -
步青龙:
好啊,大赞啊
java web标签大全(Struts2、Struts1、jstl、jsf、spring、Freemarker 、Velocity)
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类的继承关系就明了了:
- 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) {
- 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.服务端
服务端主要是获得请求然后转向显示的页面
DisplayAction.java
- /*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
- package com.tangs.action;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- *
- * @author tangs
- */
- public class DisplayAction extends ActionSupport {
- private String cpage;
- private String total;
- private String url;
- public String list() {
- //Get data from server
- //...
- //这里没有做任何逻辑,直接跳转到了页面
- return SUCCESS;
- }
- 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;
- }
- }
/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.tangs.action; import com.opensymphony.xwork2.ActionSupport; /** * * @author tangs */ public class DisplayAction extends ActionSupport { private String cpage; private String total; private String url; public String list() { //Get data from server //... //这里没有做任何逻辑,直接跳转到了页面 return SUCCESS; } 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; } }
struts.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
- <struts>
- <package name="tagTest" extends="struts-default">
- <action name="list" class="com.tangs.action.DisplayAction">
- <result name="success">/list.jsp</result>
- </action>
- </package>
- </struts>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" > <struts> <package name="tagTest" extends="struts-default"> <action name="list" class="com.tangs.action.DisplayAction"> <result name="success">/list.jsp</result> </action> </package> </struts>
4.在页面中使用标签
list.jsp
- <%@page contentType="text/html" pageEncoding="UTF-8"%>
- <%@ taglib prefix="tangs" uri="/WEB-INF/tangs.tld"%>
- <%@ taglib prefix="s" uri="/WEB-INF/struts-tags.tld"%>
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>List</title>
- </head>
- <body>
-
共 <s:property value="total"/> 页 第 <s:property value=color: #00
发表评论
-
struts2中表单标签的默认选中
2010-11-09 20:07 862在struts2的表单标签中,如select,checkbox ... -
(转)Struts2中Action接收参数的方法
2010-11-07 16:28 1367Struts2中Action接收参数的方法主要有以下三种:1. ... -
java web标签大全(Struts2、Struts1、jstl、jsf、spring、Freemarker 、Velocity)
2010-11-07 10:05 3005java web标签大全 包含了Struts2、Struts ... -
struts2帮助手册(英文chm)
2010-11-07 09:57 1032struts2帮助手册(英文chm) 如果不能正常显示,请下 ... -
struts中显示用hibernate查询到的数据组的问题
2010-11-04 21:07 834各个功能的实现模块还得在mvc的相应组件中完成,以下为了叙述方 ... -
J2EE工程源代码编写规则
2010-11-03 14:55 955源代码编写规则目的: ...
相关推荐
标签源代码 博文链接: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, 不用这两个框架的话稍微做些修改就可以了,比较简单,就不啰嗦了,基本使用方法都差不多,有错误指出欢迎指正。