整合說明:SSM整合能夠使用多種方式,我們會選擇XML(第三方對象) + 註解(本身new的對象)的方式css
整合的思路html
(1):先搭建整合的環境前端
(2):先把Spring的配置搭建完成java
(3):再使用Spring整合SpringMVC框架mysql
(4):最後使用Spring整合MyBatis框架jquery
數據源:web
create database itcastspringmvc;use itcastspringmvc;create table account( id int primary key auto_increment, name varchar(20), money double);
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.version>5.0.2.RELEASE</spring.version><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><mysql.version>5.1.6</mysql.version><mybatis.version>3.4.5</mybatis.version></properties><dependencies><!-- spring --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.8</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- log start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- log end --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version><type>jar</type><scope>compile</scope></dependency></dependencies><build><finalName>ssm</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding><showWarnings>true</showWarnings></configuration></plugin></plugins></build>
建立包com.le.ssm.domain,建立類Account.javaspring
public class Account implements Serializable {private Integer id;private String name;private Double money;}
DAOsql
建立包com.le.ssm.dao,建立類AccountDao.java數據庫
/*** AccountMapper接口,不用編寫實現類,框架生成代理對象*/public interface AccountDao {public List<Account> findAll();public void saveAccount(Account account);}
Service
建立包com.le.ssm.service,建立接口AccountService.java
public interface AccountService {public List<Account> findAll();public void saveAccount(Account account);}
建立類AccountServiceImpl,實現接口
/*** 帳號的實現類*/public class AccountServiceImpl implements AccountService {private AccountDao accountDao;public List<Account> findAll() {System.out.println("業務層:查詢全部的賬戶...");return accountDao.findAll();}public void saveAccount(Account account) {System.out.println("業務層:保存賬戶..."); accountDao.saveAccount(account);}}
建立包com.le.ssm.controller,建立類AccountController.java
/*** 賬戶*/public class AccountController {private AccountService accountService;/** * 查詢全部 * @return */public String findAll() {System.out.println("表現層:查詢全部帳戶...");List<Account> list = accountService.findAll();for (Account account : list) {System.out.println(account);}return "success";}/** * 保存 * @return */public String saveAccount(Account account) {System.out.println("表現層:保存帳戶..."); accountService.saveAccount(account);return "success";}}
在項目中的resources文件夾下建立applicationContext.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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 開啓註解掃描 -->當只使用SpringMVC的註解管理所有的時候,這裏就不須要開啓註解了<!--<context:component-scan base-package="com.le.ssm"> <!-- 忽略某些註解,把Controller給忽略了 --><context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/></context:component-scan>--></beans>
AccountService.java
/*** 帳號的實現類*/@Service("accountService")public class AccountServiceImpl implements AccountService {}
在項目中編寫測試方法,進行測試
建立測試類:com.le.test.TestService.java
public class TestService {/** * 測試Service層 */@Testpublic void testService(){ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");AccountService as = (AccountService) ac.getBean("accountService"); as.findAll();}}
web.xml
在web.xml中配置DispatcherServlet前端控制器
<!-- 配置前端控制器:服務器啓動必須加載,須要加載springmvc.xml配置文件 --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置初始化參數,建立完DispatcherServlet對象,加載springmvc.xml配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 服務器啓動的時候,讓DispatcherServlet對象建立 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 在web.xml中配置CharacterEncodingFilter過濾器解決post請求中文亂碼 配置解決中文亂碼的過濾器 --><filter><filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
springmvc.xml
在resources下,建立springmvc.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 掃描controller的註解,別的不掃描 --><context:component-scan base-package="com.le.ssm"><!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> 排除Service註解的掃描,讓spring掃描,不然事務可能會失效 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"></context:exclude-filter> --></context:component-scan><!-- 當使用下面這一句整合了APP的註解後,就不須要配上面兩句了 --><import resource="applicationContext.xml"></import><!-- 配置視圖解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- JSP文件所在的目錄 --><property name="prefix" value="/WEB-INF/pages/" /><!-- 文件的後綴名 --><property name="suffix" value=".jsp" /></bean><!-- 設置靜態資源不過濾,能夠使用:--><mvc:default-servlet-handler></mvc:default-servlet-handler><!-- <mvc:resources location="/css/" mapping="/css/**" /> <mvc:resources location="/images/" mapping="/images/**" /> <mvc:resources location="/js/" mapping="/js/**" />--><!-- 開啓對SpringMVC註解的支持 --><mvc:annotation-driven /></beans>
其中:
表示springmvc的註解包含@Controller的註解。
爲何要包含@Controller註解呢?
1)SpringMVC IOC容器 存在Controller的實例對象
2)Spring IOC容器 存在Controller的實例和Service層實例以及Dao層實例
重疊會引起一些問題:
例如:事務失效、相關注解失效
解決方案一:
SpringMVC只掃描 @Controller 註解、不掃描@Service註解
Spring不掃描 @Controller 註解
解決方案二:(建議使用)
只讓SpringMVC掃描,不讓Spring掃描
在springMVC的配置中添加
AccountController.java
/*** 賬戶*/@Controller@RequestMapping(path = "account")public class AccountController {@Autowiredprivate AccountService accountService;/** * 查詢全部 * @return */@RequestMapping(path = "/findAll")public String findAll() {System.out.println("表現層:查詢全部帳戶...");return "success";}}
index.jsp
<body><h3>帳號操做</h3><a href="account/findAll">查詢全部帳號</a></body>
success.jsp(WEB-INF/pages/success.jsp)
<body><h1>訪問成功</h1></body>
目的:在controller中能成功的調用service對象中的方法。(由spring建立對象,注入到Action中使用)
在項目啓動的時候,就去加載applicationContext.xml的配置文件,在web.xml中配置ContextLoaderListener監聽器(默認該監聽器只能加載WEB-INF目錄下的applicationContext.xml的配置文件)。使用contextConfigLocation的屬性讓它加載類路徑下的applicationContext.xml。
web.xml
<!-- 配置Spring的監聽器,默認加載WEB-INF下的applicationContext.xml --><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- 該監聽器默認只加載WEB-INF下的applicationContext.xml配置文件,經過contextConfigLocation改變位置 --><context-param><param-name>contextConfigLocation</param-name><param-value>classpath:applicationContext.xml</param-value></context-param>
AccountController.java
@Controller@RequestMapping(path = "account")public class AccountController {@Autowiredprivate AccountService accountService;/** * 查詢全部 * @return */@RequestMapping(path = "/findAll")public String findAll() {System.out.println("表現層:查詢全部帳戶...");List<Account> list = accountService.findAll();System.out.println(list);return "success";}}
SqlMapConfig.xml
在web項目中編寫SqlMapConfig.xml的配置文件,放置到resources下,編寫核心配置文件
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql:///itcastspringmvc"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><!-- 使用的是註解 --><mappers><!-- <mapper class="com.le.ssm.dao.AccountDao"/> --><!-- 該包下全部的dao接口均可以使用 --><package name="com.le.ssm.dao"/></mappers></configuration>
Xml的回顧:咱們採用的是註解
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.le.ssm.dao.AccountDao"><!--查詢全部--><select id="findAll" resultType="com.le.ssm.domain.Account"> select * from account</select><!--保存--><insert id="save" parameterType="com.le.ssm.domain.Account"> insert into account(name,money) values (#{name},#{money})</insert></mapper>
AccountDao.java
在AccountDao接口的方法上添加註解,編寫SQL語句
/*** AccountDao接口,不用編寫實現類,框架生成代理對象*/public interface AccountDao {@Select(value = "select * from account")public List<Account> findAll();@Insert(value = "insert into account (name,money) values (#{name},#{money})")public void saveAccount(Account account);}
在測試環境下,com.le.test中,編寫測試方法
public class TestMybatis {@Testpublic void testFindAll() throws Exception {// 加載配置文件InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");// 建立工廠SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);// 建立sqlSession對象SqlSession sqlSession = sessionFactory.openSession();// 獲取代理對象AccountDao accountDao = sqlSession.getMapper(AccountDao.class);// 獲取查詢全部的方法List<Account> list = accountDao.findAll();for(Account account:list){System.out.println(account);}// 釋放資源 sqlSession.close(); in.close();}@Testpublic void testSave() throws Exception {Account account = new Account(); account.setName("小菲"); account.setMoney(400d);// 加載配置文件InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml");// 建立工廠SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(in);// 建立sqlSession對象SqlSession sqlSession = sessionFactory.openSession();// 獲取代理對象AccountDao accountDao = sqlSession.getMapper(AccountDao.class); accountDao.saveAccount(account);// 提交事務 sqlSession.commit();// 釋放資源 sqlSession.close(); in.close();}}
Spring整合MyBatis框架
applicationContext.xml
目的:把SqlMapConfig.xml配置文件中的內容配置到applicationContext.xml配置文件中
<!-- 配置C3P0的鏈接池對象 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql:///itcastspringmvc" /><property name="user" value="root" /><property name="password" value="root" /></bean><!-- 配置SqlSession的工廠 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /></bean><!-- 配置掃描dao的包 --><bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.le.ssm.dao"/></bean>
SqlMapConfig.xml配置文件能夠刪除。
AccountDao.java
在AccountDao接口中添加@Repository註解,也能夠不填加。
@Repositorypublic interface AccountDao {@Select(value = "select * from account")public List<Account> findAll();@Insert(value = "insert into account (name,money) values (#{name},#{money})")public void saveAccount(Account account);}
TestSpringMybatis
@Testpublic void testFindAllSpring() throws Exception {ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");AccountDao accountDao = ac.getBean(AccountDao.class);List<Account> list = accountDao.findAll();for(Account account:list){System.out.println(account);}}
AccountServiceImpl.java
在service中注入dao對象
/*** 帳號的實現類*/@Service("accountService")public class AccountServiceImpl implements AccountService {@Autowiredprivate AccountDao accountDao;public List<Account> findAll() {System.out.println("業務層:查詢全部的賬戶...");return accountDao.findAll();}public void saveAccount(Account account) { accountDao.saveAccount(account);}}
AccountController.java
@Controller@RequestMapping(path = "account")public class AccountController {@Autowiredprivate AccountService accountService;/** * 查詢全部 * @return */@RequestMapping(path = "/findAll")public String findAll(Model model) {System.out.println("表現層:查詢全部帳戶...");List<Account> list = accountService.findAll();System.out.println(list); model.addAttribute("list",list);return "success";}/** * 保存 * @return */@RequestMapping(path = "/save")public String saveAccount(Account account) { accountService.saveAccount(account);return "success";}}
success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %><%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><html><head><title>Title</title></head><body><h1>訪問成功</h1><c:forEach items="${list}" var="account"> ${account.id}--- ${account.name}--- ${account.money}<br></c:forEach></body></html>
配置Spring的聲明式事務管理
applicationContext.xml
<!-- 配置事務管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 配置事務通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="*" read-only="true"/><tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/><tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/><tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/></tx:attributes></tx:advice><!-- 配置AOP加強事務 --><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.le.ssm.service..*.*(..))"/></aop:config>
Spring的聲明式事務處理(註解方式)
<!--使用註解的方式,配置spring的聲明式事務處理--><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!--開啓註解的方式使用事務--><tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
在Service的類上,配置@Transactional
@Service@Transactionalpublic class AccountServiceImpl implements AccountService {
index.jsp
<hr><form action="account/save" method="post"> 姓名:<input type="text" name="name"/><br/> 金額:<input type="text" name="money"/><br/><input type="submit" value="保存"/><br/></form>
AccountController.java
/*** 保存* @return*/@RequestMapping(path = "/save")public void saveAccount(Account account, HttpServletRequest request, HttpServletResponse response) throws Exception {System.out.println("表現層:保存帳戶..."); accountService.saveAccount(account); response.sendRedirect(request.getContextPath()+"/account/findAll");return;}
建議使用redirect關鍵字
@RequestMapping(path = "/save")public String saveAccount(Account account) throws Exception {System.out.println("表現層:保存帳戶..."); accountService.saveAccount(account);return "redirect:/account/findAll";}
配置springmvc.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 開啓註解掃描 --><context:component-scan base-package="com.le.ssm"></context:component-scan><!-- 配置視圖解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- JSP文件所在的目錄 --><property name="prefix" value="/WEB-INF/pages/" /><!-- 文件的後綴名 --><property name="suffix" value=".jsp" /></bean><!-- 設置靜態資源不過濾 --><mvc:resources location="/css/" mapping="/css/**" /><mvc:resources location="/images/" mapping="/images/**" /><mvc:resources location="/js/" mapping="/js/**" /><!-- 開啓對SpringMVC註解的支持 --><mvc:annotation-driven /><!-- 加載springMVC的同時,同時加載spring --><import resource="applicationContext.xml"></import></beans>
applicationContext.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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- 刪除組件掃描的配置 --><!-- 配置C3P0的鏈接池對象 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql:///itcastspringmvc" /><property name="user" value="root" /><property name="password" value="root" /></bean><!-- 配置SqlSession的工廠 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /></bean><!-- 配置掃描dao的包 --><bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.le.ssm.dao"/></bean><!-- 配置事務管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 配置事務通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="find*" read-only="true"/><tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/><tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/><tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/></tx:attributes></tx:advice><!-- 配置AOP加強事務 --><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.le.service..*.*(..))"/></aop:config></beans>
去掉web.xml中的監聽器
<!-- 配置Spring的監聽器,默認加載WEB-INF下的applicationContext.xml<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>該監聽器默認只加載WEB-INF下的applicationContext.xml配置文件,經過contextConfigLocation改變位置<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value></context-param> -->
web.xml
<!-- 配置前端控制器:服務器啓動必須加載,須要加載springmvc.xml配置文件 --><servlet><servlet-name>dispatcherServlet</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置初始化參數,建立完DispatcherServlet對象,加載springmvc.xml配置文件 --><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:springmvc.xml</param-value></init-param><!-- 服務器啓動的時候,讓DispatcherServlet對象建立 --><load-on-startup>1</load-on-startup></servlet><servlet-mapping><servlet-name>dispatcherServlet</servlet-name><url-pattern>/</url-pattern></servlet-mapping><!-- 配置解決中文亂碼的過濾器 --><filter><filter-name>characterEncodingFilter</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>characterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>
applicationContext.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: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/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"><!-- Spring整合Mybatis --><!-- 配置C3P0的鏈接池對象 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql:///itcastspringmvc" /><property name="user" value="root" /><property name="password" value="root" /></bean><!-- 配置SqlSession的工廠 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /></bean><!-- 配置掃描dao的包 --><bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.le.ssm.dao"/></bean><!-- spring的聲明式事務處理 --><!-- 配置事務管理器 --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"/></bean><!-- 配置事務通知 --><tx:advice id="txAdvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="find*" read-only="true"/><tx:method name="save*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/><tx:method name="update*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/><tx:method name="delete*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/></tx:attributes></tx:advice><!-- 配置AOP加強事務 --><aop:config><aop:advisor advice-ref="txAdvice" pointcut="execution(* com.le.ssm.service..*.*(..))"/></aop:config></beans>
springmvc.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"><!-- 開啓註解掃描 --><context:component-scan base-package="com.le.ssm"></context:component-scan><!-- 配置視圖解析器 --><bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!-- JSP文件所在的目錄 --><property name="prefix" value="/WEB-INF/pages/" /><!-- 文件的後綴名 --><property name="suffix" value=".jsp" /></bean><!-- 設置靜態資源不過濾 --><!--<mvc:resources location="/css/" mapping="/css/**" />--><!--<mvc:resources location="/img/" mapping="/img/**" />--><!--<mvc:resources location="/plugins/" mapping="/plugins/**" />--><!--靜態資源一概不攔截,包括html--><mvc:default-servlet-handler /><!-- 開啓對SpringMVC註解的支持 --><mvc:annotation-driven /><import resource="applicationContext.xml"></import></beans>
表結構:
number varchar // 登陸名
name varchar
password varchar // 密碼
mobile varchar
qq varchar
email varchar
create table `user` (`number` varchar(40) not null,`name` VARCHAR(20) DEFAULT NULL,`password` VARCHAR(60) DEFAULT NULL,`mobile` VARCHAR(11) DEFAULT NULL,`qq` VARCHAR(11) DEFAULT NULL,`email` VARCHAR(60) DEFAULT NULL, primary key (`number`)) ENGINE=INNODB DEFAULT CHARSET = utf8;
pom.xml
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring.version>5.0.2.RELEASE</spring.version><slf4j.version>1.6.6</slf4j.version><log4j.version>1.2.12</log4j.version><mysql.version>5.1.6</mysql.version><mybatis.version>3.4.5</mybatis.version></properties><dependencies><!-- spring --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.6.8</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>${spring.version}</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>compile</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency><dependency><groupId>javax.servlet.jsp</groupId><artifactId>jsp-api</artifactId><version>2.0</version><scope>provided</scope></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><!-- log start --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>${slf4j.version}</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>${slf4j.version}</version></dependency><!-- log end --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><dependency><groupId>c3p0</groupId><artifactId>c3p0</artifactId><version>0.9.1.2</version><type>jar</type><scope>compile</scope></dependency></dependencies><build><finalName>ssm</finalName><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding><showWarnings>true</showWarnings></configuration></plugin><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><!--插件使用的相關配置--><configuration><!--端口號--><port>18881</port><!--寫當前項目的名字(虛擬路徑),若是寫/,那麼每次訪問項目就不須要加項目名字了--><path>/</path><!--解決get請求亂碼--><uriEncoding>UTF-8</uriEncoding></configuration></plugin></plugins></build>
實體類User
public class User implements Serializable {private String number;private String name;private String password;private String mobile;private String qq;private String email;}
拷貝頁面到項目
建立UserController.java
頁面數據發送到Controller,建立Controller
@Controller@RequestMapping(value = "/user")public class UserController {@Autowiredprivate UserService userService;/*** * 增長用戶 * @param user * @return */@RequestMapping(value = "/save")public String save(User user){//增長int acount = userService.saveUser(user);if(acount>0){//新增成功,返回登陸頁面return "redirect:/login.html";}else{//新增失敗,返回註冊頁面return "redirect:/register.html";}}}
建立接口UserService.java和實現類UserServiceImpl.java
public interface UserService {/*** * 增長用戶 * @param user * @return */int saveUser(User user);}
@Servicepublic class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;public int saveUser(User user) {return userDao.save(user);}}
若是是註解的方式配置聲明式事務處理,須要添加在UserServiceImpl的類上添加:@Transactional
建立接口UserDao.java
//@Repositorypublic interface UserDao {/*** * 增長操做 * @param user * @return */@Insert("insert into user(number,password,mobile)values(#{number},#{password},#{mobile})")int save(User user);}
修改頁面
<form id="subform" action="/user/save" method="post" class="sui-form form-horizontal"><div class="control-group"><label class="control-label">用戶名:</label><div class="controls"><input type="text" name="number" placeholder="請輸入你的用戶名" class="input-xfat input-xlarge"></div></div><div class="control-group"><label for="inputPassword" class="control-label">登陸密碼:</label><div class="controls"><input type="password" id="pwd" name="password" placeholder="設置登陸密碼" class="input-xfat input-xlarge"></div></div><div class="control-group"><label for="inputPassword" class="control-label">確認密碼:</label><div class="controls"><input type="password" id="rpwd" placeholder="再次確認密碼" class="input-xfat input-xlarge"></div></div><div class="control-group"><label class="control-label">手機號:</label><div class="controls"><input type="text" name="mobile" placeholder="請輸入你的手機號" class="input-xfat input-xlarge"></div></div><div class="control-group"><label for="inputPassword" class="control-label"> </label><div class="controls"><input name="m1" type="checkbox" value="2" checked=""><span>贊成協議並註冊《品優購用戶協議》</span></div></div><div class="control-group"><label class="control-label"></label><div class="controls btn-reg"><button class="sui-btn btn-block btn-xlarge btn-danger" type="button" id="btn">完成註冊</button></div></div></form>
<script src="plugins/jQuery/jquery-2.2.3.min.js"></script><script> $(function () {/* * 點擊註冊按鈕 * 判斷2次密碼是否一致 * 若是一致,提交到後臺,不然提示錯誤 * */ $('#btn').click(function () {//獲取2次密碼var pwd = $('#pwd').val();var rpwd=$('#rpwd').val();if(pwd==rpwd){//提交到後臺 $('#subform').submit();}else{//提示 alert("2次密碼輸入有誤")}});});</script>
login.html登陸頁面
<form class="sui-form" action="/user/login" method="post"><div class="input-prepend"><span class="add-on loginname"></span><input id="prependedInput" type="text" name="number" placeholder="郵箱/用戶名/手機號" class="span2 input-xfat"></div><div class="input-prepend"><span class="add-on loginpwd"></span><input id="prependedInput" type="password" name="password" placeholder="請輸入密碼" class="span2 input-xfat"></div><div class="setting"><label class="checkbox inline"><input name="m1" type="checkbox" value="2" checked="">自動登陸</label><span class="forget">忘記密碼?</span></div><div class="logined"><button class="sui-btn btn-block btn-xlarge btn-danger" type="submit">登 錄</button></div></form>
UserController.java
/**** 用戶登陸* @return*/@RequestMapping(value = "/login")public String login(User user, HttpSession session){//數據庫查詢登陸User loginUser = userService.findByNumberAndPassword(user);//判斷loginUser是否爲空if(loginUser!=null){//登陸成功跳轉到歡迎頁 session.setAttribute("loginUser",user);return "redirect:/index/welcome";}else{//爲空,登陸失敗,繼續登陸return "redirect:/login.html";}}
UserServiceImpl.java
public User findByNumberAndPassword(User user) {return userDao.findByNumberAndPassword(user);}
UserDao.java
/***** 登陸* @param user* @return*/@Select("select * from user where number=#{number} and password=#{password}")User findByNumberAndPassword(User user);//@Select(value = "select * from user where number = #{number} and password=#{password}")//User findByNumberAndPassword(@Param("number") String number, @Param("password") String password);
登陸成功--->重定向到歡迎頁WelcomeController.java
@Controller@RequestMapping(value = "/index")public class WelcomeController {/*** * 歡迎頁 * @return */@RequestMapping(value = "/welcome")public String welcome(){return "index";}}
將admin下的index.html拷貝到WEB-INF\pages下
同時建立index.jsp,將index.html的內容放置到index.jsp
在index.jsp中獲取登陸信息
<!-- Sidebar toggle button--><a href="#" class="sidebar-toggle" data-toggle="offcanvas" role="button"><span class="sr-only">Toggle navigation</span></a>歡迎你:${sessionScope.loginUser.number}
整合攔截器
【需求】:用戶若是已經登陸
用戶若是沒有登陸,則不能訪問歡迎頁
LoginInterceptor.java
聲明攔截器
建立包com.le.ssm.interceptor
建立類LoginInterceptor.java
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {/**** * 用戶是否在線 * 若是不在線,不容許訪問歡迎頁 */Object loginUser = request.getSession().getAttribute("loginUser");if(loginUser==null){ response.sendRedirect(request.getContextPath()+"/login.html");return false;}return true;}}
springmvc.xml
<!--配置攔截器--><mvc:interceptors><mvc:interceptor><!--攔截 的url,全部攔截--><mvc:mapping path="/**"/><!--排除--><mvc:exclude-mapping path="/*.html"></mvc:exclude-mapping><mvc:exclude-mapping path="/js/**"></mvc:exclude-mapping><mvc:exclude-mapping path="/css/**"></mvc:exclude-mapping><mvc:exclude-mapping path="/img/**"></mvc:exclude-mapping><mvc:exclude-mapping path="/plugins/**"></mvc:exclude-mapping><mvc:exclude-mapping path="/user/save"></mvc:exclude-mapping><mvc:exclude-mapping path="/user/login"></mvc:exclude-mapping><bean class="com.le.ssm.interceptor.SessionInterceptor"></bean></mvc:interceptor></mvc:interceptors>
【測試】從新啓動,在沒有Session的狀況下,訪問/index/welcome,此時重定向到登陸頁面。