说明:前20点内容主要是SSH的搭建(复习)
(本文重点是25点 导出到Excel表格 ,熟悉SSH的话可以跳过直接看第25点)
1、创建web项目 ssh_POI ,在lib目录下引入jar包
因为之前打包了SSH相关的包,所以这次也是一次性全部引入(用maven管理jar包会好很多…)。
(项目的结构图)
2、创建实体类 并创建映射文件
package cn.poi.entity;
/**
* 用户实体类
*/
public class User {
private String id;
private String userName;
private String password;
private int age;
private String gender;
private String phone;
private String dept;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getDept() {
return dept;
}
public void setDept(String dept) {
this.dept = dept;
}
public User() {
super();
// TODO Auto-generated constructor stub
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public User(String id, String userName, String password, int age, String gender, String phone, String dept) {
super();
this.id = id;
this.userName = userName;
this.password = password;
this.age = age;
this.gender = gender;
this.phone = phone;
this.dept = dept;
}
}
映射文件
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.poi.entity">
<class name="User" table="user">
<id name="id" column="id">
<generator class="uuid.hex"></generator>
</id>
<property name="userName" ></property>
<property name="password" ></property>
<property name="age" ></property>
<property name="gender" ></property>
<property name="phone" ></property>
<property name="dept" ></property>
</class>
</hibernate-mapping>
3、在src目录下创建applicationContext.xml文件
applicationContext.xml常用的配置信息
+++++++++++++++
A、对象的创建
B、数据源dataSource
C、sessionFactory
D、事务管理
+++++++++++++++
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd">
<!-- UserDao 对象 -->
<bean id="userDao" class="cn.poi.dao.impl.UserDaoImpl">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- UserService 对象 -->
<bean id="userService" class="cn.poi.service.impl.UserServiceImpl">
<property name="userDao" ref="userDao"></property>
</bean>
<!-- 导入数据库连接信息 -->
<context:property-placeholder location="classpath:db.properties"/>
<!-- datasource数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbcUrl}"></property>
<property name="driverClass" value="${driverClass}"></property>
<property name="user" value="${user}"></property>
<property name="password" value="${password}"></property>
<!-- 初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
<property name="initialPoolSize" value="${initialPoolSize}"></property>
<!-- 连接池中保留的最小连接数。Default: 3 -->
<property name="minPoolSize" value="3"></property>
<!-- 连接池中保留的最大连接数。Default: 15 -->
<property name="maxPoolSize" value="${maxPoolSize}"></property>
<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
<property name="acquireIncrement" value="3"></property>
<!-- 最大空闲时间,1800秒内未使用则连接被丢弃,若为0则永不丢弃。Default: 0 -->
<property name="maxIdleTime" value="1800"></property>
</bean>
<!-- sessionFactory -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<!-- hibernate相关链接 -->
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="javax.persistence.validation.mode">none</prop>
</props>
</property>
<!-- 映射文件路径 -->
<property name="mappingLocations">
<list>
<value>classpath:cn/poi/entity/User.hbm.xml</value>
</list>
</property>
</bean>
<!-- 事务管理 -->
<!-- 创建事务管理器 -->
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 事务通知 -->
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<!-- 规定所有以find,list,get开头的方法,对数据库只有读取功能,不能修改数据库 -->
<tx:method name="find*" read-only="true"/>
<tx:method name="list*" read-only="true"/>
<tx:method name="get*" read-only="true"/>
<!-- 只要抛出异常,就回滚事务 -->
<tx:method name="*" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>
<!-- aop配置事务管理的类 -->
<aop:config>
<aop:pointcut expression="execution(* cn.poi.service.impl.*.*(..))" id="serviceOper"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOper" />
</aop:config>
</beans>
4、创建UserDao接口
package cn.poi.dao;
import java.io.Serializable;
import java.util.List;
import cn.poi.entity.User;
public interface UserDao {
public void save(User user);//保存
public void delete(User user);//删除
public void update(User user);//更新
public List<User> getAll();//查询所有用户
public User findById(Serializable id);//根据主键查找用户
}
5、创建UserDao实现类UserDaoImpl
package cn.poi.dao.impl;
import java.io.Serializable;
import java.util.List;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import cn.poi.dao.UserDao;
import cn.poi.entity.User;
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
public void save(cn.poi.entity.User user) {
getSession().save(user);
}
public void delete(cn.poi.entity.User user) {
getSession().delete(user);
}
public void update(cn.poi.entity.User user) {
getSession().update(user);
}
public List<User> getAll() {
return getSession().createQuery("FROM User").list();
}
public User findById(Serializable id) {
return (User) getSession().createQuery("FROM User WHERE id = ? ")//
.setParameter(0, id).list().get(0);
}
}
6、创建UserService接口
package cn.poi.service;
import java.io.Serializable;
import java.util.List;
import cn.poi.entity.User;
public interface UserService {
public void save(User user);// 保存
public void delete(User user);// 删除
public void update(User user);// 更新
public List<User> getAll();// 查询所有用户
public User findById(Serializable id);// 根据主键查找用户
}
7、创建UserService接口实现类UserServiceImpl
package cn.poi.service.impl;
import java.io.Serializable;
import java.util.List;
import cn.poi.dao.UserDao;
import cn.poi.entity.User;
import cn.poi.service.UserService;
public class UserServiceImpl implements UserService {
private UserDao userDao;
public void save(User user) {
userDao.save(user);
}
public void delete(User user) {
userDao.delete(user);
}
public void update(User user) {
userDao.update(user);
}
public List<User> getAll() {
return userDao.getAll();
}
public User findById(Serializable id) {
return userDao.findById(id);
}
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
8、写测试类
package cn.poi.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.poi.entity.User;
import cn.poi.service.UserService;
public class Test {
//获取spring容器
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
@org.junit.Test
public void testDBConection(){
User user = new User();
user.setUserName("Truly");
user.setAge(20);
user.setDept("行政");
user.setGender("female");
user.setPassword("123456");
user.setPhone("13866666666");
UserService userService = (UserService) applicationContext.getBean("userService");
userService.save(user);
}
}
9、根据db.properties配置信息,在创建一个数据库,不需要创建表,由hibernate自动创建
jdbcUrl=jdbc:mysql://localhost:3306/sshpoi?useUnicode=true&characterEncoding=utf8
driverClass=com.mysql.jdbc.Driver
user=root
password=root
initialPoolSize=10
maxPoolSize=30
10、测试结果
在对应数据库,hibernate自行创建了一张User表,并将User信息写进表中,
说明数据库连接没问题,spring和hibernate的整合没问题,可以继续整合Struts2.
11、引入Struts2相关的jar包(前面已经统一引入)
12、在WebRoot/WEB-INF目录下的web.xml配置Struts2的核心过滤器,spring监听器
<!-- spring监听器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<!-- struts2核心过滤器 -->
<filter>
<filter-name>ssh</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>ssh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
技巧:这么长,其实不用记,要么找已经有的web.xml复制过来,实在没有可以按ctrl+shift+T,只要在里面输入StrutsP,系统会自动补全并找到。
13、在src目录下创建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="sshPOI" extends="struts-default">
<action name="user_*" class="cn.poi.action.UserAction" method="{1}">
<result name="{1}">WEB-INF/jsp/{1}.jsp</result>
</action>
</package>
</struts>
14、创建UserAction类
package cn.poi.action;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
public String test(){
return "test";
}
}
15、在WEB-INF目录下创建jsp文件夹,并在jsp目录下创建test.jsp文件
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'test.jsp' starting page</title>
</head>
<body>
hello
</body>
</html>
16、把项目挂到Tomcat服务器,启动服务器。
17、访问路径 :http://localhost:8080/ssh_POI/user_test
说明struts2是没问题的。
18、把actoin的创建交给spring创建管理
<!-- UserAction 对象 -->
<bean id="userAction" class="cn.poi.action.UserAction" scope="prototype">
<property name="userService" ref="userService"></property>
</bean>
scope=”prototype” 是保证每个请求都有一个独立的userAction
19、在userAction中添加成员变量userService
package cn.poi.action;
import cn.poi.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
//
private UserService userService;
public String test(){
return "test";
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
}
20、以上步骤把SSH环境搭建好了,接下来实现JAVA读取数据库数据,显示在页面,并通过点击导出按钮导出为Excel文件
21、创建一个listUI.jsp页面,用于展示数据库中的用户信息
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'listUI.jsp' starting page</title>
</head>
<body>
<s:form action="http://localhost:8080/ssh_POI/user_export2Excel" method="">
<table border="1" cellpadding="0" cellspacing="1" width="800" align="center">
<tr align="center">
<td>选择用户</td>
<td>用户名</td>
<td>密码</td>
<td>年龄</td>
<td>性别</td>
<td>电话</td>
<td>部门</td>
</tr >
<s:iterator var="user" value="userList" status="st">
<tr align="center">
<td><input type="checkbox" id="selectedRow" name="selectedRow" value="<s:property value='id'/>"></td>
<td><s:property value="userName"/></td>
<td><s:property value="password"/></td>
<td><s:property value="age"/></td>
<td><s:property value="gender"/></td>
<td><s:property value="phone"/></td>
<td><s:property value="dept"/></td>
</tr>
</s:iterator>
<tr>
<td colspan="7" align="center">
<input type="submit" value="导出Excel" >
</td>
</tr>
</table>
</s:form>
</body>
</html>
说明:这里用到struts标签,所以在jsp页面需要引进struts的标签。
<%@ taglib uri=”/struts-tags” prefix=”s” %>
22、在UserAction类添加方法*(给出UserAction的完整代码,请对应看)*
package cn.poi.action;
import java.util.List;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.struts2.ServletActionContext;
import cn.poi.entity.User;
import cn.poi.service.UserService;
import com.opensymphony.xwork2.ActionSupport;
public class UserAction extends ActionSupport {
private UserService userService;
private List<User> userList;
private String[] selectedRow;
public String test(){
return "test";
}
/**
* 获取用户信息,跳转到listUI页面。
*/
public String listUI(){
//获取到数据库中所有user的数据,保存到userList中,然后再jsp页面遍历出来
userList = userService.getAll();
return "listUI";
}
public void export2Excel(){
try {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet();
HSSFRow row_title = sheet.createRow(0);
HSSFCell cell_title1 = row_title.createCell(0);
HSSFCell cell_title2 = row_title.createCell(1);
HSSFCell cell_title3 = row_title.createCell(2);
HSSFCell cell_title4 = row_title.createCell(3);
HSSFCell cell_title5 = row_title.createCell(4);
HSSFCell cell_title6 = row_title.createCell(5);
cell_title1.setCellValue("姓名");//姓名
cell_title2.setCellValue("密码");//密码
cell_title3.setCellValue("年龄");//年龄
cell_title4.setCellValue("性别");//性别
cell_title5.setCellValue("电话");//电话
cell_title6.setCellValue("部门");//部门
for(int i = 0; i < selectedRow.length;i++){
User user = userService.findById(selectedRow[i]);
HSSFRow row = sheet.createRow(i+1);
HSSFCell cell1 = row.createCell(0);
HSSFCell cell2 = row.createCell(1);
HSSFCell cell3 = row.createCell(2);
HSSFCell cell4 = row.createCell(3);
HSSFCell cell5 = row.createCell(4);
HSSFCell cell6 = row.createCell(5);
cell1.setCellValue(user.getUserName());//姓名
cell2.setCellValue(user.getPassword());//密码
cell3.setCellValue(user.getAge());//年龄
cell4.setCellValue(user.getGender());//性别
cell5.setCellValue(user.getPhone());//电话
cell6.setCellValue(user.getDept());//部门
}
HttpServletResponse response = ServletActionContext.getResponse();
//把响应头数据类型设置为任意二进制流,用于上传下载
response.setContentType("application/octet-stream");
//告诉浏览器通过下载方式打开,并设置下载文件名
response.setHeader("Content-Disposition", "attachment;fileName="//
+ new String("用户信息.xls".getBytes(),"ISO8859-1"));
ServletOutputStream sos = response.getOutputStream();
workbook.write(sos);
workbook.close();
if(sos != null){
sos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
/********成员变量的get/set方法*********/
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public List<User> getUserList() {
return userList;
}
public void setUserList(List<User> userList) {
this.userList = userList;
}
public String[] getSelectedRow() {
return selectedRow;
}
public void setSelectedRow(String[] selectedRow) {
this.selectedRow = selectedRow;
}
}
如果对jsp和action之间传值不太了解的话,可以看向struts2中的传值方法,非常方便,只需要设置成员变量并给出get/set方法即可。
23、访问地址http://localhost:8080/ssh_POI/user_listUI.action 就可以在页面上得到我们数据库中User的信息
24、回顾一下我们struts.xml的配置 ,看数据是怎么访问出来的 (本文第13点也贴有struts.xml的配置,可以对比看下)
<struts>
<!-- 把主题配置成simple -->
<constant name="struts.ui.theme" value="simple" />
<package name="sshPOI" extends="struts-default" namespace="/">
<action name="user_*" class="cn.poi.action.UserAction" method="{1}">
<result name="{1}">WEB-INF/jsp/{1}.jsp</result>
<result name="listUI">WEB-INF/jsp/listUI.jsp</result>
<result name="list" type="redirectAction">user_listUI</result>
</action>
</package>
</struts>
访问地址是http://localhost:8080/ssh_POI/user_listUI.action
所以会进到UserAction类中执行listUI方法,获取到userList后,返回字符串listUI,页面跳转到listUI.jsp 并把userList遍历出来,得到上面页面展示的数据。
**
25、重点 把选中的用户导出到Excel文件
–》 需要引入jar包 2003版本的
**
25.1、先解决如何把选择的用户传到后台Action中,往回看第21点中JSP页面代码
<td><input type="checkbox" id="selectedRow" name="selectedRow" value="<s:property value='id'/>"></td>
在每一个用户前面增加一个checkbox类型的表单,值是用户对应的id
因为有多个这样的表单,最终返回的是一个字符数组
所以在UserAction类中定义一个selectedRow数组,并给出get/set方法,就可以拿到选择了的id。
private String[] selectedRow;
(见第22点中的UserAction代码)
25.2、添加方法public void export2Excel(){} (见第22点中的UserAction代码)
在后台UserAction中拿到类id数组selectedRow,
先创建工作簿workbook,工作表sheet,(这两个对象只需要一个,不需要循环创建)
并将第一行的标题信息打印出来。
然后通过for循环,根据id数组中的每个id获取数据库中对应的user信息,然后写进每行对应的单元格中。
注意:创建行的时候行数要+1;因为第一行已经用来创建标题了,不+1会覆盖掉标题。
25.3、设置响应头,提供下载 (见第22点中的UserAction代码)
HttpServletResponse response = ServletActionContext.getResponse();
//把响应头数据类型设置为任意二进制流,用于上传下载
response.setContentType("application/octet-stream");
//告诉浏览器通过下载方式打开,并设置下载文件名
response.setHeader("Content-Disposition", "attachment;fileName="//
+ new String("用户信息.xls".getBytes(),"ISO8859-1"));
ServletOutputStream sos = response.getOutputStream();
workbook.write(sos);
workbook.close();
if(sos != null){
sos.close();
}
25.4、把listUI.jsp页面代码中form的action提交地址设置为:http://localhost:8080/ssh_POI/user_export2Excel (见第21点jsp代码)
通过提交按钮,请求访问到UserAction类中export2Excel这个方法。就会弹出下载窗口,
当然。Excel表格格式是可以按照需要进行设置的。