实例: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、最终的效果如下所示:
感兴趣的可以上网找下资料,这个东西不错的。