- 浏览: 20578 次
- 性别:
- 来自: 石家庄
最新评论
-
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 910在struts2的表单标签中,如select,checkbox ... -
(转)Struts2中Action接收参数的方法
2010-11-07 16:28 1387Struts2中Action接收参数的方法主要有以下三种:1. ... -
java web标签大全(Struts2、Struts1、jstl、jsf、spring、Freemarker 、Velocity)
2010-11-07 10:05 3038java web标签大全 包含了Struts2、Struts ... -
struts2帮助手册(英文chm)
2010-11-07 09:57 1065struts2帮助手册(英文chm) 如果不能正常显示,请下 ... -
struts中显示用hibernate查询到的数据组的问题
2010-11-04 21:07 874各个功能的实现模块还得在mvc的相应组件中完成,以下为了叙述方 ... -
J2EE工程源代码编写规则
2010-11-03 14:55 988源代码编写规则目的: ...
相关推荐
本篇文章将探讨如何在Struts2中实现自定义分页标签,这是一项非常实用的功能,尤其对于处理大量数据展示时,能显著提高用户体验。我们将深入源码,了解其工作原理,并提供一个自定义分页标签的实现过程。 首先,...
本篇文章将深入探讨如何在Struts2中实现自定义分页标签,以及相关的源码分析和工具使用。 首先,我们需要理解分页的基本原理。分页通常涉及到两个主要部分:服务器端的分页逻辑和客户端的显示。服务器端负责处理...
在这个基于Struts2的自定义分页标签的实践中,我们将深入探讨如何创建、配置和使用自定义标签来实现数据的分页展示,同时与Oracle数据库进行交互。 首先,理解分页的基本概念至关重要。分页是将大量数据分成小块,...
首先,我们需要在Struts2的Action类中实现分页逻辑。Action类通常包含获取总记录数、当前页数、每页显示记录数等属性,以及对应的方法来计算总页数和获取当前页的数据。这些方法应连接到数据库,执行相应的SQL查询,...
在Struts2中,自定义标签可以用来扩展JSP页面的功能,使其能够更好地与后台业务逻辑交互。 自定义标签的实现通常分为以下几个步骤: 1. **创建标签库**:定义一个XML文件(如struts-tags.xml),用于声明自定义...
本教程主要探讨如何在Struts2框架下实现一个基于JSP的自定义分页组件,名为"zoo-paging-1.0.jar"。该组件不仅提供了分页功能,还附带了源代码和示例项目,方便开发者理解和应用。 首先,我们来理解分页的基本概念。...
本篇文章将深入探讨如何在Struts 2中实现自定义标签进行分页,包括简单的上下分页和数字分页。 首先,我们需要理解分页的基本概念。分页是指将大量数据分成若干小部分,每次只显示一部分,通过翻页来查看其他部分。...
开发者可能结合Struts1标签库与自定义分页标签一起使用,实现更复杂的业务逻辑。 4. **实例化分页类**: 分页标签可能需要一个分页类的实例,这个类通常会包含当前页数、总页数、每页大小等属性,以及相关的计算...
本项目"自定义分页标签struts2,spring"是针对Struts2和Spring框架的一个自定义标签实现,旨在简化开发过程,提高代码的可复用性和可维护性。下面我们将详细探讨这个项目中的关键技术点。 首先,Struts2是一个非常...
通过以上步骤,我们就成功地在Struts2中实现了自定义分页标签。这种方式不仅使代码结构清晰,还便于复用和扩展。同时,自定义标签还能更好地与其他业务逻辑解耦,提高代码的可维护性和可读性。在实际开发中,根据...
本项目以SSH(Struts2、Spring、Hibernate)经典框架为基础,通过自定义分页标签实现了这一功能。下面将详细介绍自定义分页标签在项目中的应用及其核心知识点。 首先,SSH框架是Java Web开发中广泛使用的三大组件。...
下面我们将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理。 自定义标签的创建主要涉及以下三个步骤: 1. **创建taglib文件 (.tld)**:TLD(Tag Library Descriptor)文件是自定义标签的元数据,用于...
本实例将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理和步骤。 首先,自定义标签在Web开发中的作用是提高代码的可读性和可维护性,它将复杂的Java代码封装起来,让HTML视图更加简洁。在Struts2中,...
在Java Web开发中,Struts框架是常用的MVC框架之一...这种方式比直接使用Struts的分页标签更加灵活,但需要更多的编码工作。总的来说,自定义标签是Java Web开发中的一个重要技能,能够提升应用的可维护性和可扩展性。
本文将详细介绍如何在Struts2中实现分页标签,并提供一个简洁易懂的项目示例。 1. **Struts2分页概念**: 分页是将大量数据分割成若干小块,每次只加载一部分数据到页面上,使得用户可以逐页浏览,减轻服务器压力...
综上所述,通过自定义标签在Struts框架中实现分页,可以有效分离视图和业务逻辑,提高代码可维护性。通过合理的数据查询和页面渲染,能够提供用户友好的浏览体验。结合提供的`example`和`doc`文件,你可以更深入地...