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