ssm框架整合(spring+spring mvc+mybatis)
开发步骤:
1.新建一个web工程
2.导入ssm框架的jar包
- 配置三大框架的的配置文件
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>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<!-- 以下为配置spring -->
<!-- 配置spring listener -->
<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>
<!-- 以下为配置spring mvc -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern><!-- springmvc开发一般只拦.do文件 -->
</servlet-mapping>
<!-- 配置编码控制器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 配置OpenSessionInViewFilter,解决Hibernate的Session的关闭与开启问题
<filter>
<filter-name>openSessionInView</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>openSessionInView</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
-->
</web-app>
applacitonContext.xml(置于src根目录下) (这里配置的是spring的配置文件)
<?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: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/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 自动扫描 -->
<context:component-scan base-package="com.hw"></context:component-scan>
<!-- 加载属性文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 配置c3p0 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName">
<value>${jdbc.driverClassName}</value>
</property>
<property name="url">
<value>${jdbc.url}</value>
</property>
<property name="username">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>
<!--连接池中保留的最小连接数。 -->
<property name="initialSize" value="3" />
<!-- 连接池的最大值 -->
<property name="maxActive" value="300" />
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle" value="2" />
<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
<property name="minIdle" value="1" />
</bean>
<!--配置 mybaties -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--dataSource属性指定要用到的连接池 -->
<property name="dataSource" ref="dataSource" />
<!-- 所有配置的mapper文件 -->
<property name="mapperLocations" value="classpath*:com/hw/mapper/*Mapper.xml" /><!-- 相当于实现接口 -->
</bean>
<!-- 配置bean 自动扫描所有mapper 自动给Mapper接口产生代理类对象 并且给代理对象注入SqlSessionFactory -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage">
<value>com.hw.mapper</value><!-- 即原来框架整合时的dao包 -->
</property>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!-- 纯注解方式,只需要所需类前加上 @Transactional -->
<tx:annotation-driven transaction-manager="transactionManager" />
</beans>
开发项目时,上面的配置文件一般都不用改变
需要改变的有1、<property name="mapperLocations" value="classpath:com/hw/mapper/Mapper.xml" /> 这里面
根据情况作出改变2、<value>com.hw.mapper</value>
对应的包根据情况改变
mvc-servlet.xml(置于WEB-INF文件夹下) (这里配置的spring mvc的配置文件)
因为我做的项目涉及到上传与下载所以配置的时候定义了文件上传解析器
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
<!-- 让spring 去扫描类 建立关联 -->
<!-- 是对包进行扫描,实现注释驱动Bean定义,同时将bean自动注入容器中使用。即解决了@Controller标识的类的bean的注入和使用 -->
<mvc:annotation-driven/>
<!-- 扫苗controll包即下面的控制器 -->
<context:component-scan base-package="com.hw.controller"></context:component-scan>
<!-- 试图解析器 -->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 -->
<property name="prefix" value="/WEB-INF/per/"></property>
<!-- 后缀-->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 文件上传解析器 -->
<bean id="multipartResolver"
class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- one of the properties available; the maximum file size in bytes -->
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="104857600"/>
<property name="maxInMemorySize" value="4096"/>
</bean>
</beans>
上面的配置文件一般情况不改变,需要加功能可以往里面添加,比如上传下载需要用到文件上传解析器
4 与开发接口的关联的映射文件
userDaoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!-- 相当于实现dao中的接口 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace如果和spring整合时要用接口全类名,不整合任意名,id要用接口中的方法名 -->
<mapper namespace="com.hw.mapper.UserDao">
<resultMap type="com.hw.entity.User" id="userinfo"><!-- 如果不用resultMap则不写 -->
<result column="uid" property="uid" />
<result column="userName" property="userName" />
<result column="userPass" property="userPass" />
</resultMap>
<!-- parameterType参数类型,parameterMap参数集合,id要用接口中的方法名 -->
<select id="login" parameterType="map" resultType="boolean"><!-- 用户登录 -->
select * from tab_user where userName=#{userName} and userPass=#{userPass}
</select>
<insert id="add" parameterType="com.hw.entity.User">
insert into tab_user values(null,#{userName},#{userPass})
</insert>
</mapper>
注意返回类型是boolean,传入参数是map,在mybatis中select 涉及到传参的都是用map
controller层
UserAction
package com.hw.controller;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.hw.entity.User;
import com.hw.service.UserService;
import com.hw.utils.MD5Utils;
@Controller
@RequestMapping("user")
public class UserAction {
@Autowired
private UserService db;
@RequestMapping("add")
public String add(User user) throws Exception {
String ss=MD5Utils.MD5Src(user.getUserPass());//进行md5加密
user.setUserPass(ss);//加密后存进行去
db.add(user);
return "redirect:/index.jsp";
}
@RequestMapping("login")
public String login(User user) throws Exception {
//把密码通过md5加密后和数据库的表中的对应字段进行比较
Map<String,Object> map=new HashMap<String,Object>();
map.put("userName", user.getUserName());
map.put("userPass", MD5Utils.MD5Src(user.getUserPass()));
if(db.login(map)){
return "redirect:/per/listPerson.do";//重定向
}else{
return "redirect:/index.jsp";
}
}
}
上面要注意创建map集合存取对应的值
deptDaoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!-- 相当于实现dao中的接口 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace如果和spring整合时要用接口全类名,不整合任意名,id要用接口中的方法名 -->
<mapper namespace="com.hw.mapper.DeptDao">
<resultMap type="com.hw.entity.Dept" id="deptinfo"><!-- 如果不用resultMap则不写 -->
<result column="did" property="did" />
<result column="dname" property="dname" />
<!-- mybatis中 1方配置多方 --><!-- 对一个属性的类型是集合,就使用collection
对于一个属性的类型是一个类,就使用association
-->
<collection property="per" ofType="com.hw.entity.Person">
<result column="pid" property="pid" />
<result column="pname" property="pname" />
<result column="psex" property="psex" />
<result column="skilled" property="skilled" />
<result column="degree" property="degree" />
<result column="jobtime" property="jobtime" javaType="java.sql.Date" jdbcType="DATE" />
<result column="resume" property="resume" />
<result column="filepath" property="filepath" />
</collection>
</resultMap>
<!-- parameterType参数类型,parameterMap参数集合,id要用接口中的方法名 -->
<select id="list" resultMap="deptinfo"><!-- 用户登录 -->
select * from tab_dept
</select>
<insert id="add" parameterType="com.hw.entity.Dept">
insert into tab_dept values(null,#{dname})
</insert>
</mapper>
上面主要是注意1对多的关系,使用collection
personDaoMapper.xml
<?xml version="1.0" encoding="UTF-8" ?><!-- 相当于实现dao中的接口 -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace如果和spring整合时要用接口全类名,不整合任意名,id要用接口中的方法名 -->
<mapper namespace="com.hw.mapper.PersonDao">
<resultMap type="com.hw.entity.Person" id="personinfo"><!-- 如果不用resultMap则不写 -->
<result column="pid" property="pid" />
<result column="pname" property="pname" />
<result column="psex" property="psex" />
<result column="skilled" property="skilled" />
<result column="degree" property="degree" />
<result column="jobtime" property="jobtime" javaType="java.sql.Date"
jdbcType="DATE" />
<result column="resume" property="resume" />
<result column="filepath" property="filepath" />
<!-- mybatis中 多方配置1方 --><!-- 对一个属性的类型是集合,就使用collection
对于一个属性的类型是一个类,就使用association
-->
<!--多对一的关系, property: 指的是属性的值, javaType:指的是属性的类型 -->
<association property="dept" javaType="com.hw.entity.Dept">
<result column="did" property="did" />
<result column="dname" property="dname" />
</association>
</resultMap>
<!-- parameterType参数类型,parameterMap参数集合,id要用接口中的方法名 -->
<insert id="add" parameterType="com.hw.entity.Person">
insert into tab_per
values(null,#{pname},#{psex},#{skilled},#{degree},#{jobtime},#{resume},
#{filepath},#{dept.did})
</insert>
<update id="updatePerson" parameterType="com.hw.entity.Person">
update tab_per set pname=#{pname},psex=#{psex},skilled=#{skilled},
degree=#{degree},jobtime=#{jobtime},resume=#{resume},
filepath=#{filepath},did=#{dept.did} where pid=#{pid}
</update>
<delete id="del" parameterType="int" >
delete from tab_per where pid=#{pid}
</delete>
<!-- 批量删除 -->
<delete id="delSelectAll" parameterType="string">
delete from tab_per where pid in
<foreach collection="array" item="pid" open="(" separator="," close=")">
#{pid}
</foreach>
</delete>
<select id="getPerson" parameterType="int" resultMap="personinfo">
select * from tab_per where pid=#{pid}
</select>
<select id="list" parameterType="map" resultMap="personinfo">
select p.*,d.dname from tab_per p,tab_dept d where p.did=d.did order by p.pid desc
limit #{pageIndex},#{pageSize}
</select>
<select id="listLike" parameterType="map" resultMap="personinfo">
select p.*,d.dname from tab_per p,tab_dept d where p.did=d.did and p.pname like
'%${pname}%' and p.did=#{did} order by p.pid desc
limit #{pageIndex},#{pageSize}
</select>
<select id="getLikeCount" resultType="int" parameterType="map">
select count(pid) from tab_per where pname like '%${pname}%' and did=#{did}
</select>
<select id="listAll" resultMap="personinfo">
select p.*,d.dname from tab_per p,tab_dept d where p.did=d.did order by p.pid desc
</select>
<select id="getCount" resultType="int">
select count(pid) from tab_per
</select>
</mapper>
上面主要是注意多对一的关系,使用association 类与类之间的关联
controller层
PersonAction
package com.hw.controller;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import javax.servlet.http.HttpServletRequest;
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.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import com.hw.entity.Dept;
import com.hw.entity.Person;
import com.hw.service.DeptService;
import com.hw.service.PersonService;
import com.hw.service.impl.DeptServiceImpl;
import com.hw.service.impl.PersonServiceImpl;
import com.hw.utils.ExportExcel;
import com.hw.utils.FileDownLoad;
import com.hw.utils.PageUtils;
@Controller
@RequestMapping("per")
public class PersonAction {
@Autowired
private PersonService ps;
@Autowired
private DeptService ds;
private List<Dept> list=new ArrayList<Dept>();//有set get方法
private File myfile;//有set get方法
private String myfileFileName;//有set get方法
private List<String> perlist=new ArrayList<String>();
private List<Person> source=new ArrayList<Person>();
@RequestMapping("dept")
@ResponseBody //生成json格式
public List<Dept> dept(){//下载
List<Dept> list=ds.list();
return list;
}
@RequestMapping("download") //下载,没有返回值
public void download(HttpServletRequest request,HttpServletResponse response,Person per) throws Exception{//下载
FileDownLoad.download("\\upload\\"+per.getFilepath(), request, response);
}
@RequestMapping("toadd")
public String toAdd() throws Exception {// 到添加
list=ds.list();//查询出所有部门表
return "add";
}
@RequestMapping("toupdate")
public String toUpdate(HttpServletRequest request,Person per) throws Exception {// 到修改
per=ps.getPerson(per.getPid());//获取单个对象
request.setAttribute("per",per);//存起来
String []aa=per.getSkilled().split(",");
for(int i=0;i<aa.length;i++){
if(aa[i].equals("武术")){
request.setAttribute("a",aa[i]);
}else if(aa[i].equals("足球")){
request.setAttribute("b",aa[i]);
}else if(aa[i].equals("唱歌")){
request.setAttribute("c",aa[i]);
}else if(aa[i].equals("篮球")){
request.setAttribute("d",aa[i]);
}
}
return "update";
}
@RequestMapping("add")
public String add(MultipartFile file,HttpServletRequest request,Person user) throws Exception {// 添加
String path = request.getSession().getServletContext()
.getRealPath("upload");
String fileName = file.getOriginalFilename();
if(fileName.length()>0){
//解决文件同名问题
fileName = UUID.randomUUID().toString().replace("-", "")+fileName.substring(fileName.lastIndexOf("."));
File targetFile = new File(path, fileName);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// 保存
try {
file.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
request.setAttribute("fileUrl", request.getContextPath() + "/upload/"
+ fileName);
user.setFilepath(fileName);
}else{
user.setFilepath("");
}
/*如果不涉及上传则表单中不能设置enctype="multipart/form-data",
* 本方法中只需保留Person pe和以下2行代码即可
*/
ps.add(user);
return "redirect:listPerson.do";
}
@RequestMapping("update")
public String update(MultipartFile file,
HttpServletRequest request,Person per) {
String path = request.getSession().getServletContext()
.getRealPath("upload");
String fileName = file.getOriginalFilename();
if(fileName.length()>0){
//解决文件同名问题
fileName = UUID.randomUUID().toString().replace("-", "")+fileName.substring(fileName.lastIndexOf("."));
File targetFile = new File(path, fileName);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// 保存
try {
file.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
request.setAttribute("fileUrl", request.getContextPath() + "/upload/"
+ fileName);
per.setFilepath(fileName);
}else{
per.setFilepath(per.getFilepath());
System.out.println(per.getFilepath());
}
/*如果不涉及上传则表单中不能设置enctype="multipart/form-data",
*/
ps.updatePerson(per);
return "redirect:listPerson.do";
}
@RequestMapping("del")
public String del(Person per) throws Exception {// 删除
ps.del(per.getPid());//删除
return "redirect:listPerson.do";
}
@RequestMapping("delall")
public String delAll(HttpServletRequest request) throws Exception {// 批量删除
String id=request.getParameter("id");//取过来批量删除的id
System.out.println("ok批量删除:"+id);
String[] split = id.split(",");
ps.delSelectAll(split);//删除
return "redirect:listPerson.do";
}
@RequestMapping("listPerson")
public String listPerson(HttpServletRequest request) throws Exception {// 列表显示
String page = request.getParameter("currentPage") == null ? "1"
: request.getParameter("currentPage");// 如果是空则为1,或则取页数
int currentPage = Integer.parseInt(page);// 当前页
int pageSize = 3;// 当前页记录大小
int dataCount = ps.getCount();// 表记录多少
Map<String,Object> map=new HashMap<String, Object>();
map.put("pageIndex", (currentPage-1)*pageSize);
map.put("pageSize", pageSize);
source = ps.list(map);
request.setAttribute("list", source);
PageUtils.page(request, currentPage, pageSize, source, dataCount);
list=ds.list();//查询出所有部门表
System.out.println("perlistperson");
return "list";
}
@RequestMapping("listlikePerson")
public String listlikePerson(HttpServletRequest request){//模糊查询有分页
String page = request.getParameter("currentPage") == null ? "1"
: request.getParameter("currentPage");// 如果是空则为1,或则取页数
int currentPage = Integer.parseInt(page);// 当前页
String querypdept = request.getParameter("querypdept");
String querypname = request.getParameter("querypname");
System.out.println(querypdept+" ,"+querypname);
int pageSize = 3;// 当前页记录大小
Map<String,Object> map=new HashMap<String, Object>();
map.put("pageIndex", (currentPage-1)*pageSize);
map.put("pageSize", pageSize);
map.put("pname", querypname);
map.put("did", Integer.parseInt(querypdept));
int dataCount = ps.getLikeCount(map);// 表记录多少
source = ps.listLike(map);
// System.out.println("source:"+source.size()+","+dataCount);
request.setAttribute("list", source);
PageUtils.page(request, currentPage, pageSize, source, dataCount);
list=ds.list();//查询出所有部门表
return "list";
}
@RequestMapping("exportExcel") //导出excel
public void exportExcel(HttpServletResponse response) throws Exception {
// 初始化HttpServletResponse对象
// 定义表的标题
String title = "员工列表一览";
//定义表的列名
String[] rowsName = new String[] { "员工编号", "姓名", "性别", "特长", "学历",
"入职时间", "简历", "照片", "部门" };
//定义表的内容
List<Object[]> dataList = new ArrayList<Object[]>();
Object[] objs = null;
List<Person> listPerson = ps.listAll();
for (int i = 0; i < listPerson.size(); i++) {
Person per = listPerson.get(i);
objs = new Object[rowsName.length];
objs[0] = per.getPid();
objs[1] = per.getPname();
objs[2] = per.getPsex();
objs[3] = per.getSkilled();
objs[4] = per.getDegree();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
String date = df.format(per.getJobtime());
objs[5] = date;
objs[6] = per.getResume();
objs[7] = per.getFilepath();
objs[8] = per.getDept().getDname();
dataList.add(objs);
}
// 创建ExportExcel对象
ExportExcel ex = new ExportExcel(title, rowsName, dataList);
// 输出Excel文件
try {
OutputStream output = response.getOutputStream();
response.reset();
response.setHeader("Content-disposition",
"attachment; filename=personList.xls");
response.setContentType("application/msexcel");
ex.export(output);
output.close();
} catch (IOException e) {
e.printStackTrace();
}
// return "tolist";// 返回列表显示
}
@RequestMapping("importExcel") //spring mvc导入excel
public String importExcel(MultipartFile file,
HttpServletRequest request) throws Exception {
// 初始化HttpServletRequest对象
String path = request.getSession().getServletContext()
.getRealPath("upload");
String fileName = file.getOriginalFilename();
//解决文件同名问题
fileName = UUID.randomUUID().toString().replace("-", "")+fileName.substring(fileName.lastIndexOf("."));
File targetFile = new File(path, fileName);
if (!targetFile.exists()) {
targetFile.mkdirs();
}
// 保存
try {
file.transferTo(targetFile);
} catch (Exception e) {
e.printStackTrace();
}
// 获取服务器中文件的路径
String paths =request.getSession().getServletContext().getRealPath("")
+ "/upload/" + fileName;
// 上传文件到服务器中
// filename = FileUpload2.upload(filename, myfile);
Person per = new Person();// 新建一个user对象
Dept dept = new Dept();// 新建一个dept对象
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
try {
InputStream is = new FileInputStream(paths);
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
// 循环工作表Sheet
for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets(); numSheet++) {
HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
if (hssfSheet == null) {
continue;
}
// 循环行Row
for (int rowNum = 3; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if (hssfRow == null) {
continue;
}
// 循环列Cell
// "姓名","密码","性别","爱好","简介","部门did"};
per.setPname(getValue(hssfRow.getCell(1)));
per.setPsex(getValue(hssfRow.getCell(2)));
per.setSkilled(getValue(hssfRow.getCell(3)));
per.setDegree(getValue(hssfRow.getCell(4)));
per.setJobtime(sd.parse(getValue(hssfRow.getCell(5))));
per.setResume(getValue(hssfRow.getCell(6)));
per.setFilepath(getValue(hssfRow.getCell(7)));
// 这里很重要,通过部门列表然后与excel中的部门字段进行对比,匹配后获取对应的did
String dname = getValue(hssfRow.getCell(8));// 获取excel中的部门字段
list = ds.list();// 得到数据库中的部门列表
for (Dept dd : list) {// 增强for循环
if (dd.getDname().equals(dname)) {// 如果两者匹配
dept.setDid(dd.getDid());// 则得到对应的did,并设置dept对象的did
per.setDept(dept);// 再把dept对象设置到user对象中
}
}
ps.add(per);// 写入到数据中
}
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return "redirect:listPerson.do";// 返回列表显示
}
/**
* 得到Excel表中的值
*
* @param hssfCell
* Excel中的每一个格子
* @return Excel中每一个格子中的值
*/
@SuppressWarnings("static-access")
private static String getValue(HSSFCell hssfCell) {
if (hssfCell.getCellType() == hssfCell.CELL_TYPE_BOOLEAN) {
// 返回布尔类型的值
return String.valueOf(hssfCell.getBooleanCellValue());
} else if (hssfCell.getCellType() == hssfCell.CELL_TYPE_NUMERIC) {
// 返回数值类型的值
return String.valueOf(hssfCell.getNumericCellValue());
} else {
// 返回字符串类型的值
return String.valueOf(hssfCell.getStringCellValue());
}
}
public List<Dept> getList() {
return list;
}
public void setList(List<Dept> list) {
this.list = list;
}
public File getMyfile() {
return myfile;
}
public void setMyfile(File myfile) {
this.myfile = myfile;
}
public String getMyfileFileName() {
return myfileFileName;
}
public void setMyfileFileName(String myfileFileName) {
this.myfileFileName = myfileFileName;
}
public List<String> getPerlist() {
return perlist;
}
public void setPerlist(List<String> perlist) {
this.perlist = perlist;
}
public List<Person> getSource() {
return source;
}
public void setSource(List<Person> source) {
this.source = source;
}
@InitBinder// spring mvc中对时间进行处理
private void InitBinder(HttpServletRequest request,
ServletRequestDataBinder binder) {
// spring mvc中对时间进行处理
binder.registerCustomEditor(Date.class, new CustomDateEditor(
new SimpleDateFormat("yyyy-MM-dd"), true));
}
}
上面主要注意的是图片路径的设置问题 add添加时加一个判断,如果路径为空时
设置一个空的字符串防止报错
if(fileName.length()>0){ }else{
user.setFilepath("");
}
同理,update修改也需要加一个判断,如果不修改路径则为原路径没修改则
改变路径
if(fileName.length()>0){ }else{
per.setFilepath(per.getFilepath());
}
另外,注意批量删除传入的参数是数组,按照上面做法即可
update.jsp修改页面部门回显
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
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 's1.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<script type="text/javascript" src="js/My97DatePicker/WdatePicker.js"></script></head>
<script type="text/javascript"
src="<%=request.getContextPath()%>/js/jquery-1.8.2.js"></script>
<script type="text/javascript"
src="<%=request.getContextPath()%>/js/my.js" charset="gbk"></script>
<script type="text/javascript">
$(function() {
$.post("per/dept.do", function(msg) {
var aa = "${per.dept.did}";//将需要修改的部门id赋值给aa
for (i = 0; i < msg.length; i++) {
$("#querypdept").append(
"<option value="+msg[i].did+">" + msg[i].dname
+ "</option>");
if (msg[i].did == aa) {//判断部门id是否相等,相等则默认选择对应部门
$("#querypdept option[value='" + msg[i].did + "']").attr(
'selected', 'selected');
}
}
});
});
</script>
<body>
<center>
<h2>用户修改</h2>
<form action="per/update.do" method="post" name="kk"
enctype="multipart/form-data">
<table border=0 width=460 >
<tr>
<td>
员工编号:<input type="text" readonly="readonly" name="pid" value="${per.pid }" /><br>
姓名:<input type="text" name="pname" value="${per.pname }" /><br>
性别:<input type="radio" name="psex" value="男" ${per.psex=='男'?"checked='checked'":"" }>男<input
type="radio" name="psex" value="女" ${per.psex=='女'?"checked='checked'":"" }>女<br> 个人特长:<input
type="checkbox" name="skilled" value="足球" ${b=='足球'?"checked='checked'":"" } >足球 <input
type="checkbox" name="skilled" value="篮球" ${d=='篮球'?"checked='checked'":"" } >篮球 <input
type="checkbox" name="skilled" value="唱歌" ${c=='唱歌'?"checked='checked'":"" } >唱歌
<input type="checkbox" name="skilled" value="武术" ${a=='武术'?"checked='checked'":"" }>武术<br>
学历:<select name="degree">
<option ${per.degree== "博士"?"selected='selected'":""}>博士</option>
<option ${per.degree== "研究生"?"selected='selected'":""}>研究生</option>
<option ${per.degree== "本科"?"selected='selected'":""}>本科</option>
<option ${per.degree== "专科"?"selected='selected'":""}>专科</option>
</select><br> 入职时间: <input type="text" name="jobtime"
onclick="WdatePicker()" value="${per.jobtime }"><br>
上传修改照片: <input type="file" name="file"><img src="<%=request.getContextPath()%>/upload/${per.filepath}"
width="85" height="100"><br> 部门: <select
name="dept.did" id="querypdept"></select><br>
简历: <textarea
name="resume" cols="20" rows="6">${per.resume }</textarea>
</td>
</tr>
<tr>
<td align="center" colspan="10"><input type=submit value="修改">
<input type=reset value="清空"></td>
</tr>
</table>
</form>
</center>
</body>
</html>
上面主要加了
var aa = "${per.dept.did}";//将需要修改的部门id赋值给aa
if (msg[i].did == aa) {
//判断部门id是否相等,相等则默认选择对应部门
$("#querypdept option[value='" + msg[i].did + "']").attr('selected', 'selected');
}
注释也很清楚了,不多说
还有一个方法是利用c标签也可以实现部门回显
部门:<select name="dept.deid">
<c:forEach items="${list}" var="dept" >
<c:choose>
<c:when test="${doctor.dept.deid==dept.deid}">
<option value="${dept.deid }" selected="selected" >${dept.dname }</option>
</c:when>
<c:otherwise><option value="${dept.deid }" >
${dept.dname }</option>
</c:otherwise>
</c:choose>
</c:forEach>
</select>
相关源码:
链接:http://pan.baidu.com/s/1hsmLf72 密码:2ujv