- 浏览: 6616 次
- 性别:
- 来自: 石家庄
最近访客 更多访客>>
最新评论
-
laitaogood:
datepicker→datetimepicker
Struts2标签库 -
smaller1982:
zhxing 写道smaller1982 写道请问楼主,如何在 ...
Struts2标签库 -
zhxing:
smaller1982 写道请问楼主,如何在strut2中使用 ...
Struts2标签库 -
smaller1982:
请问楼主,如何在strut2中使用struts1的logic标 ...
Struts2标签库 -
zhuimin:
支持,支持
Struts2标签库
×××自定义分页标签清晰请见 http://tangshuo.iteye.com/blog/189447 ×××
×××功能扩展 http://tangshuo.iteye.com/blog/189820 ×××
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代码
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代码
<?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
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);
}
}
Pages.java
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;
}
}
3.服务端
服务端主要是获得请求然后转向显示的页面
DisplayAction.java
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;
}
}
struts.xml
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>
4.在页面中使用标签
list.jsp
Html代码
<%@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="cpage"/> 页
<tangs:pages cpage="%{cpage}" total="%{total}" url="%{url}"/>
</body>
</html>
好了,启动服务器,从浏览器中输入http://localhost:7001/TagTest/list.page?cpage=1&total=5&url=list.page
就会得到下面的结果:
×××功能扩展 http://tangshuo.iteye.com/blog/189820 ×××
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代码
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代码
<?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
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);
}
}
Pages.java
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;
}
}
3.服务端
服务端主要是获得请求然后转向显示的页面
DisplayAction.java
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;
}
}
struts.xml
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>
4.在页面中使用标签
list.jsp
Html代码
<%@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="cpage"/> 页
<tangs:pages cpage="%{cpage}" total="%{total}" url="%{url}"/>
</body>
</html>
好了,启动服务器,从浏览器中输入http://localhost:7001/TagTest/list.page?cpage=1&total=5&url=list.page
就会得到下面的结果:
相关推荐
本文将深入探讨如何在Struts2中实现自定义分页标签,这是一项非常实用的功能,可以帮助我们更好地管理和展示大量数据,提高用户体验。 首先,我们需要了解分页的基本原理。分页是将大量数据分成若干小部分,每次只...
本资源详细介绍了如何在Struts2中自定义分页标签,使得开发过程更加便捷。 在Struts2中,分页通常涉及到以下几个关键步骤: 1. **创建Action类**:首先,你需要创建一个Action类,该类将处理用户的请求,包括获取...
1. **创建自定义标签**:在Struts2中,自定义标签是通过实现`org.apache.struts2.views.jsp.TagSupport`接口来创建的。你需要创建一个Java类,继承这个接口,并实现相关方法。例如,你可以创建一个名为`PagingTag`的...
在Struts2中,自定义标签可以用来扩展JSP页面的功能,使其能够更好地与后台业务逻辑交互。 自定义标签的实现通常分为以下几个步骤: 1. **创建标签库**:定义一个XML文件(如struts-tags.xml),用于声明自定义...
在这个“Struts2 完美实现 标签分页”的项目中,我们主要关注如何在Struts2框架下实现高效的分页功能,并利用自定义标签来提供友好的用户界面。 分页是Web应用中常见的需求,它有助于提高用户体验,特别是当处理...
8. **页面展示**:最后,在JSP页面中,我们可以使用Struts 2的内置标签结合自定义分页标签来展示数据和分页控件。 总结一下,实现Struts 2 自定义标签分页需要对Struts 2框架有深入理解,包括标签库的创建、Java类...
本项目"自定义分页标签struts2,spring"是针对Struts2和Spring框架的一个自定义标签实现,旨在简化开发过程,提高代码的可复用性和可维护性。下面我们将详细探讨这个项目中的关键技术点。 首先,Struts2是一个非常...
通过以上步骤,我们就成功地在Struts2中实现了自定义分页标签。这种方式不仅使代码结构清晰,还便于复用和扩展。同时,自定义标签还能更好地与其他业务逻辑解耦,提高代码的可维护性和可读性。在实际开发中,根据...
开发者可能结合Struts1标签库与自定义分页标签一起使用,实现更复杂的业务逻辑。 4. **实例化分页类**: 分页标签可能需要一个分页类的实例,这个类通常会包含当前页数、总页数、每页大小等属性,以及相关的计算...
然而,有时候我们可能需要根据项目需求定制特定的功能,比如这里的"自定义标签代替Struts标签实现分页"。下面将详细阐述这个主题。 一、自定义标签的原理 自定义标签是JavaServer Pages (JSP) 技术的一个强大特性,...
在Struts2中,自定义标签的实现是提升可重用性和简化视图层代码的一个重要特性。下面我们将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理。 自定义标签的创建主要涉及以下三个步骤: 1. **创建taglib...
本实例将深入探讨如何在Struts2中实现自定义标签,以及其背后的原理和步骤。 首先,自定义标签在Web开发中的作用是提高代码的可读性和可维护性,它将复杂的Java代码封装起来,让HTML视图更加简洁。在Struts2中,...
在Struts2中,我们可以自定义标签来实现这一功能。 2. **分页标签实现**: - **Action类**:首先,你需要在Action类中获取数据并计算总页数。这通常涉及数据库查询,比如使用JDBC或ORM框架(如Hibernate)获取数据...
在Struts2中,自定义标签的实现通常包括以下步骤: 1. **定义TLD(Tag Library Descriptor)文件**: TLD文件是XML格式的,用于描述自定义标签的属性、行为以及它们之间的关系。在这个例子中,我们为分页标签添加...
在 Struts 自制标签分页封装的场景中,我们通常是为了提高应用的可维护性和易用性,通过自定义标签来实现页面的动态分页功能。在不依赖 Struts 1.3 框架包的情况下,我们可以自己编写相关的组件来达到相同的效果。 ...
本项目结合了JSP自定义标签、JPA(Java Persistence API)、Hibernate ORM框架以及Struts2框架,实现了高效且灵活的分页功能。下面我们将详细探讨这些技术及其在分页中的应用。 首先,JSP自定义标签(Custom Tags)...
本例中,我们探讨的是如何结合Struts、Hibernate和自定义标签实现分页功能,这是一种常见的优化用户界面体验的技术,特别是对于数据量大的查询结果。 1. **分页原理** 分页的基本思想是将大量数据分成多个小部分,...
在这个场景下,我们将深入探讨如何在Struts2框架中使用自定义标签来实现与Hibernate的整合,完成数据的分页显示。 首先,我们需要了解Struts2的自定义标签。自定义标签是Struts2提供的一种扩展机制,允许开发者创建...
总结来说,这个"Struts+Hibernate+自定义标签的网上书店"项目展示了Java Web开发中常用技术和最佳实践的集成应用,通过合理的设计和实现,为用户提供了一个功能齐全、安全可靠的图书购买环境。这样的系统对于学习和...
本教程将深入讲解如何在Struts1.2框架中实现分页功能。 一、理解分页原理 分页的基本思想是将数据库中的数据分割成若干个部分,每次只加载一部分到前端展示,用户可以通过点击页码或导航按钮来切换不同的数据页。...