新建一个名为ssm的Dynamic Web Project,并生成web.xml。
将ssm整合所有用的jar包都引入(复制)到项目下WebRoot下WEB-INF下的lib下。
一. 先从数据层Mybatis开始整合。
在ssm project下建一个名为config的source folder。
在config下创建一个名为com.rl.mapper的Package,Package下创建好PersonMapper.xml,保留好动态增删改查的语句
在config下拉入log4j.properties
在config下创建并写好sqlMapConfig.xml,其中<environments>标签都不要了,用spring管理。<settings>(包括延迟加载什么的)也不要了,只要typeAliases别名和mappers(引入配置文件)。
二. Spring整合
在config下创建beans.xml
<?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:mvc="http://www.springframework.org/schema/mvc" 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-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <!-- 扫到rl那一层 --> <context:component-scan base-package="com.rl"/> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean> <!-- spring和mybatis的整合配置,一定要用SqlSessionFactoryBean类。 数据源的注入 读取核心配置文件sqlMapConfig.xml --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:sqlMapConfig.xml"></property> </bean> <!-- 事务管理器 --> <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"></property> </bean> <!-- 配置通知 --> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="save*" propagation="REQUIRED"/> <tx:method name="update*" propagation="REQUIRED"/> <tx:method name="delete*" propagation="REQUIRED"/> <tx:method name="select*" read-only="true"/> </tx:attributes> </tx:advice> <!-- 设置切点 --> <aop:config> <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.rl.service..*.*(..))"/> </aop:config> </beans>
三. SpringMVC配置
在config下创建springmvc.xml文件
前面那些地址都和配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:mvc="http://www.springframework.org/schema/mvc" 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-3.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd "> <!-- springmvc也有扫描器,扫到 controller层 --> <context:component-scan base-package="com.rl.controller"/> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/jsp/"></property> <property name="suffix" value=".jsp"></property> </bean> </beans>
四. 配置文件写好后,开始写DAO代码文件
在src下创建com.rl.model的package。在这个下面创建Person.java类。
package com.rl.model; import java.io.Serializable; import java.util.Date; import java.util.List; public class Person implements Serializable{ /** * */ private static final long serialVersionUID = -3327265996783250419L; private Integer personId; private String name; private Integer gender; private String personAddr; private Date birthday; public Integer getPersonId() { return personId; } public void setPersonId(Integer personId) { this.personId = personId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public String getPersonAddr() { return personAddr; } public void setPersonAddr(String personAddr) { this.personAddr = personAddr; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } @Override public String toString() { return "Person [personId=" + personId + ", name=" + name + ", gender=" + gender + ", personAddr=" + personAddr + ", birthday=" + birthday + "]"; } }
com.rl.model下面创建QueryCondition.java类。
package com.rl.model; import java.util.Date; public class QueryCondition { private Integer gender; private Date birthday; private String name; private String personAddr; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPersonAddr() { return personAddr; } public void setPersonAddr(String personAddr) { this.personAddr = personAddr; } public Integer getGender() { return gender; } public void setGender(Integer gender) { this.gender = gender; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } }
在src下创建com.rl.dao的package。在这个下面创建PersonDao.java接口。
package com.rl.dao; import java.util.List; import com.rl.model.Person; import com.rl.model.QueryCondition; public interface PersonDao { public void savePerson(Person p); public Person selectPersonById(Integer personId); public void update(Person p); public void delete(Integer personId); public List<Person> selectPersonByCondtion(QueryCondition qc); }
接下来建立实现类的包:com.rl.dao.impl,在下面创建实现类PersonDaoImpl.java并实现PersonDao接口。在Superclass中要选择SqlSessionDaoSupport。引入SqlSessionDaoSupport的目的是把sessionFactory注入进来。
package com.rl.dao.impl; import java.util.List; import org.mybatis.spring.support.SqlSessionDaoSupport; import com.rl.dao.PersonDao; import com.rl.model.Person; import com.rl.model.QueryCondition; public class PersonDaoImpl extends SqlSessionDaoSupport implements PersonDao { String ns = "com.rl.mapper.PersonMapper."; //找命名空间的 @Override public void savePerson(Person p) { //提交、关闭session等代码就不用写了 this.getSqlSession().insert(ns + "insert", p); //自动找到PersonMapper里的insert语句 } @Override public Person selectPersonById(Integer personId) { return (Person) this.getSqlSession().selectOne(ns + "selectPersonById",personId); } @Override public void update(Person p) { this.getSqlSession().update(ns + "dynamicUpdate",p);//动态修改 } @Override public void delete(Integer personId) { this.getSqlSession().delete(ns + "delete",personId); } @Override public List<Person> selectPersonByCondtion(QueryCondition qc) { return this.getSqlSession().selectList(ns + "selectPersonByCondtion", qc); } }
五. DAO完成后写Service
创建com.rl.service包,下面创建PersonService.java接口。把PersonDao中的代码拿过来就行。
package com.rl.service; import java.util.List; import com.rl.model.Person; import com.rl.model.QueryCondition; public interface PersonService { public void savePerson(Person p); public Person selectPersonById(Integer personId); public void update(Person p); public void delete(Integer personId); public List<Person> selectPersonByCondtion(QueryCondition qc); }
创建com.rl.serviceimpl包,在下面创建实现类PersonServiceImpl.java并实现PersonService接口
package com.rl.serviceimpl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.rl.dao.PersonDao; import com.rl.model.Person; import com.rl.model.QueryCondition; import com.rl.service.PersonService; @Service public class PersonServiceImpl implements PersonService { @Autowired private PersonDao personDao; @Override public void savePerson(Person p) { personDao.savePerson(p); } @Override public Person selectPersonById(Integer personId) { return personDao.selectPersonById(personId); } @Override public void update(Person p) { personDao.update(p); } @Override public void delete(Integer personId) { personDao.delete(personId); } @Override public List<Person> selectPersonByCondtion(QueryCondition qc) { return personDao.selectPersonByCondtion(qc); } }
六. Service写完了,写controller
在src创建com.rl.controller的package。包中创建PersonController.java 类。
要加@Controller注解
要加@RequestMapping("/person") 模块的命名空间
@Autowired可以省略了setter getter
package com.rl.controller; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.ServletRequestDataBinder; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import com.rl.model.Person; import com.rl.model.QueryCondition; import com.rl.service.PersonService; @Controller @RequestMapping("/person") public class PersonController { @Autowired private PersonService personService; /** * 查询 * @param qc * @param model * @return */ @RequestMapping("/listPerson.do") public String listPerson(QueryCondition qc,Model model) { List<Person> pList = personService.selectPersonByCondtion(qc); model.addAttribute("pList",pList); model.addAttribute("qc",qc); return "list"; } /** * 跳转到添加页面 * @return */ @RequestMapping("/tosave.do") public String toSave(){ return "save"; } /** * 添加 * @return */ @RequestMapping("/save.do") public String save(Person p){ personService.savePerson(p); return "redirect:listPerson.do"; //跳转到listPerson.do } /** * 根据ID查询Person * @param personId * @param model * @return */ @RequestMapping("/selectPerson.do") public String selectPerson(Integer personId,Model model){ Person p = personService.selectPersonById(personId); model.addAttribute("person", p); return "update"; //跳转到update页面 } /** * 修改 * @param p * @return */ @RequestMapping("/update.do") public String update(Person p){ personService.update(p); return "redirect:listPerson.do"; //跳转到listPerson.do } /** * 根据ID删除 * @param personId * @return */ public String delete(Integer personId){ personService.delete(personId); return "redirect:listPerson.do"; //跳转到listPerson.do } //更改时间格式 @InitBinder public void initBinder(ServletRequestDataBinder binder) { binder.registerCustomEditor(Date.class, new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd"), true)); } }
七. Controller写完,配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:beans.xml</param-value> </context-param> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> <filter> <filter-name>SpringCharacterEncodingFilter</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>SpringCharacterEncodingFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> </web-app>
然后右键项目 - 属性 - Resource - Text file encoding - others- UTF-8
改完后java文件的中文会乱码,xml文件不会。把java文件先复制,再改成utf-8,再粘贴。所以要在项目最开始的时候改成utf-8。
八. 写页面
在WebRoot下的Web-INF下建立文件夹叫jsp,创建list.jsp文件
去http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/ 下载jakarta-taglibs-standard-1.1.2.zip
解压后lib下的两个jar导入到项目里的lib里
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="person/listPerson.do" method="post"> <table> <tr> <td><label>姓名:</label><input type="text" name="name"></td> <td><label>性別:</label> <select name="gender"> <option value="">请选择</option> <option value="1">男</option> <option value="0">女</option> </select></td> <td><label>地址:</label><input type="text" name="personAddr"></td> <td><label>生日:</label><input type="text" name="birthday"></td> <td><input type="submit" value="查询"></td> </tr> </table> </form> <!-- 显示查找的内容 --> <table> <tr> <th>姓名</th> <th>性别</th> <th>地址</th> <th>生日</th> <th>操作</th> </tr> <c:forEach items="${pList }" var="person"> <tr> <td>${person.name }</td> <td><c:if test="${person.gender == 1 }">男</c:if> <c:if test="${person.gender == 0 }">女</c:if> </td> <td>${person.personAddr }</td> <td> <f:formatDate pattern="yyyy-MM-dd" value="${person.birthday }" /> </td> <td> <!-- 修改(修改前必须先查询) --> <a href="person/selectPerson.do?personId=${person.personId }">修改</a> <a href="person/delete.do?personId=${person.personId }">删除</a> </td> </tr> </c:forEach> </table> </body> </html>
然后在Eclipse中的server右键Tomcat,把ssm加进去,然后运行Tomcat。
在网页输入http://localhost:8080/ssm/person/listPerson.do
当更能可以实现后,发现输入的内容一查询后就没了,所以需要回写。
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="person/listPerson.do" method="post"> <table align="center" width="80%"> <tr> <td> <label>姓名:</label> <input type="text" name="name" value="${qc.name }"></td> <td> <label>性別:</label> <select name="gender"> <option value="">请选择</option> <option value="1" <c:if test="${qc.gender == 1 }">selected</c:if>>男</option> <option value="0" <c:if test="${qc.gender == 0 }">selected</c:if>>女</option> </select> </td> <td> <label>地址:</label> <input type="text" name="personAddr" value="${qc.personAddr }"> </td> <td><label>生日:</label><input type="text" name="birthday" value="<f:formatDate value="qc.birthday" pattern="yyyy-MM-dd" />" ></td> <td><input type="submit" value="查询"></td> </tr> </table> </form> <table align="center" width="80%"> <tr> <td> <a href="person/toSave.do">添加</a> </td> </tr> </table> <!-- 显示查找的内容 --> <table> <tr> <th>姓名</th> <th>性别</th> <th>地址</th> <th>生日</th> <th>操作</th> </tr> <c:forEach items="${pList }" var="person"> <tr> <td>${person.name }</td> <td><c:if test="${person.gender == 1 }">男</c:if> <c:if test="${person.gender == 0 }">女</c:if> </td> <td>${person.personAddr }</td> <td> <f:formatDate pattern="yyyy-MM-dd" value="${person.birthday }" /> </td> <td> <!-- 修改(修改前必须先查询) --> <a href="person/selectPerson.do?personId=${person.personId }">修改</a> <a href="person/delete.do?personId=${person.personId }">删除</a> </td> </tr> </c:forEach> </table> </body> </html>
继续做“添加”功能
在list.jsp添加一个a标签作为添加按钮,然后复制list.jsp,粘贴成save.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="person/save.do" method="post"> <table align="center" width="80%"> <tr> <td> <label>姓名:</label> <input type="text" name="name" ></td> <td> <label>性別:</label> <select name="gender"> <option value="">请选择</option> <option value="1" >男</option> <option value="0" >女</option> </select> </td> <td> <label>地址:</label> <input type="text" name="personAddr" > </td> <td><label>生日:</label><input type="text" name="birthday" ></td> <td><input type="submit" value="添加"></td> </tr> </table> </form> </body> </html>
接下来做修改,复制list.jsp,粘贴成update.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> </head> <body> <form action="person/update.do" method="post"> <input type="hidden" name="personId" value="${person.personId }"> <table align="center" width="80%"> <tr> <td> <label>姓名:</label> <input type="text" name="name" value="${person.name }"></td> <td> <label>性別:</label> <select name="gender"> <option value="">请选择</option> <option value="1" <c:if test="${person.gender == 1 }">selected</c:if>>男</option> <option value="0" <c:if test="${person.gender == 0 }">selected</c:if>>女</option> </select> </td> <td> <label>地址:</label> <input type="text" name="personAddr" value="${person.personAddr }"> </td> <td><label>生日:</label><input type="text" name="birthday" value="<f:formatDate value="person.birthday" pattern="yyyy-MM-dd" />" ></td> <td><input type="submit" value="修改"></td> </tr> </table> </form> </body> </html>
删除功能:
在list.jsp中改
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="f"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Insert title here</title> <script type="text/javascript"> function deletePerson(personId){ if(confirm("是否真的要删除?")){ window.location.href = "person/delete.do?personId="+personId; } } </script> </head> <body> <form action="person/listPerson.do" method="post"> <table align="center" width="80%"> <tr> <td> <label>姓名:</label> <input type="text" name="name" value="${qc.name }"></td> <td> <label>性別:</label> <select name="gender"> <option value="">请选择</option> <option value="1" <c:if test="${qc.gender == 1 }">selected</c:if>>男</option> <option value="0" <c:if test="${qc.gender == 0 }">selected</c:if>>女</option> </select> </td> <td> <label>地址:</label> <input type="text" name="personAddr" value="${qc.personAddr }"> </td> <td><label>生日:</label><input type="text" name="birthday" value="<f:formatDate value="qc.birthday" pattern="yyyy-MM-dd" />" ></td> <td><input type="submit" value="查询"></td> </tr> </table> </form> <table align="center" width="80%"> <tr> <td> <a href="person/toSave.do">添加</a> </td> </tr> </table> <!-- 显示查找的内容 --> <table> <tr> <th>姓名</th> <th>性别</th> <th>地址</th> <th>生日</th> <th>操作</th> </tr> <c:forEach items="${pList }" var="person"> <tr> <td>${person.name }</td> <td><c:if test="${person.gender == 1 }">男</c:if> <c:if test="${person.gender == 0 }">女</c:if> </td> <td>${person.personAddr }</td> <td> <f:formatDate pattern="yyyy-MM-dd" value="${person.birthday }" /> </td> <td> <!-- 修改(修改前必须先查询) --> <a href="person/selectPerson.do?personId=${person.personId }">修改</a> <a href="javascript:void(0);" onclick="deletePerson(${person.personId});">删除</a> </td> </tr> </c:forEach> </table> </body> </html>