实例:Struts2结合DisplayTag、DbUtils实现查询分页、导出Excel
这几天在看书的时候,发现了一个好东西,一个开源的jsp自定义标签库,可以实现分页显示,导出为excel或其他的格式,简单的学习了,还真的是很有用,对于不想写html表格代码的,带样式的、带分页的,使用这个我感觉已经戳戳有余了。有些功能已经提供了,但是由于是结合了Struts2,所以有些东西是需要设置的。同时项目中使用了DbUtils这个框架。Displaytag的内部已经内置了poi,如果使用我们自己的POI可能会出现错误,所以就不用管了。
Struts2使用的是2.3.4这个版本。
DbUtils的下载地址:
http://commons.apache.org/proper/commons-dbutils/
DisplayTag的下载地址:
http://sourceforge.net/projects/displaytag/files/display%20tag%20library/1.2/
下载的是1.2的版本。解压安装目录中的displaytag-examples-1.2.war文件,将目录中的前四个文件夹复制到项目的下面,并将WEB-INF下的lib下的所有的jar包放到项目的下面,如图所示:
2、将项目配置成struts2的开发环境,编写对应的实体类、控制器类、数据库访问类,最终的项目结构如下所示:
3、由于使用了struts2,所以需要配置一个displaytag提供的过滤器,解决一些乱码还有其他的问题,web.xml的代码如下所示:
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <display-name></display-name> <!-- struts2的核心控制器 --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter><!-- 在Struts2环境中,要使用这个过滤器来解决displaytag的一些问题 --> <filter-name>ResponseOverrideFilter</filter-name> <filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseOverrideFilter</filter-name> <url-pattern>*.action</url-pattern> </filter-mapping> <filter-mapping> <filter-name>ResponseOverrideFilter</filter-name> <url-pattern>*.jsp</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
4、然后需要在src文件夹下建立displaytag.properties文件,解决导出的问题,内容如下:
export.excel.class=org.displaytag.export.excel.ExcelHssfView
5、struts.xml文件如下所示:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN" "http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <constant name="struts.enable.DynamicMethodInvocation" value="true" /> <constant name="struts.devMode" value="true" /> <package name="default" extends="struts-default"> <action name="studentAction" class="com.qqhr.action.StudentAction"> <result name="success">/main.jsp</result> </action> </package> </struts>
6、action类的代码如下所示:
package com.qqhr.action; import java.util.List; import com.opensymphony.xwork2.ActionSupport; import com.qqhr.dao.StudentDao; public class StudentAction extends ActionSupport { private List list;//由于写在action类里,所以不用存在request作用域里 public List getList() { return list; } public void setList(List list) { this.list = list; } @Override public String execute() throws Exception { StudentDao dao = new StudentDao(); list = dao.getAllStudent();//从dao中取出 return SUCCESS; } }
7、dao层使用了DbUtils这个框架,可以从网上下载,将下载的jar包放到lib文件夹下,dao类如下所示:
package com.qqhr.dao; import java.sql.Connection; import java.sql.DriverManager; import java.util.List; import org.apache.commons.dbutils.DbUtils; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanListHandler; import com.qqhr.entity.Student; public class StudentDao { public List<Student> getAllStudent() { Connection con = null; try { String url = "jdbc:mysql://localhost:3306/qqhr?useUnicode=true&characterEncoding=UTF-8"; String driver = "com.mysql.jdbc.Driver"; String user = "root"; String pass = "123456"; DbUtils.loadDriver(driver); con = DriverManager.getConnection(url,user,pass); String sql = "select * from Student"; QueryRunner qr = new QueryRunner(); List<Student> list = qr.query(con,sql,new BeanListHandler(Student.class)); return list; } catch (Exception e) { e.printStackTrace(); } return null; } }
8、实体类要和数据库的结构相对应,entity类如下所示:
package com.qqhr.entity; /** * 对应数据库的实体类 * @author administrator * */ public class Student { private Integer sId; private String sNo; private String sName; private String sSex; private String sAddress; private String sClass; public Integer getsId() { return sId; } public void setsId(Integer sId) { this.sId = sId; } public String getsNo() { return sNo; } public void setsNo(String sNo) { this.sNo = sNo; } public String getsName() { return sName; } public void setsName(String sName) { this.sName = sName; } public String getsSex() { return sSex; } public void setsSex(String sSex) { this.sSex = sSex; } public String getsAddress() { return sAddress; } public void setsAddress(String sAddress) { this.sAddress = sAddress; } public String getsClass() { return sClass; } public void setsClass(String sClass) { this.sClass = sClass; } }
9、数据库如下所示:
10、系统首页面index.jsp如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>My JSP 'index.jsp' starting page</title> </head> <body> <h1 align="center" style="color:red"> 本系统使用了Struts2+DisplayTag+DbUtils三个开源框架 </h1> <h2><a href="<%=request.getContextPath()%>/studentAction.action" style="color:red">进入首页查询学生</a></h2> </body> </html>
11、在主页面中要使用displaytag需要引入标签库,d:table标签有个name属性,是action里查询的属性,由于action里的属性默认实在request作用域里的,所以这里写直接el表达式取出数据,注意要写上requestURI的属性,为分页时的请求路径,export 为是否导出,property的属性值要和数据库的里的一样,由于是使用了DbUtils的缘故,系统主页面main.jsp的代码如下所示:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib prefix="d" uri="http://displaytag.sf.net" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>本系统的首页面</title> <style type="text/css" media="all"> @import url("css/maven-base.css"); @import url("css/maven-theme.css"); @import url("css/site.css"); @import url("css/screen.css"); </style> <link rel="stylesheet" type="text/css" href="./css/print.css" media="print"> </head> <body> <h1 align="center" style="color:blue">本系统使用了Struts2+DisplayTag+DbUtils三个开源框架</h1> <d:table name="${list}" pagesize="4" requestURI="studentAction.action" export="true"> <d:caption style="color:green;font-size:24px;">导出Excel</d:caption> <d:column property="sId" title="学生的ID"/> <d:column property="sNo" title="学生的学号"/> <d:column property="sName" title="学生的姓名"/> <d:column property="sSex" title="学生的性别"/> <d:column property="sAddress" title="学生的地址"/> <d:column property="sClass" title="学生的班级"/> </d:table> </body> </html>
12、最终的效果如下所示:
感兴趣的可以上网找下资料,这个东西不错的。