SSM框架中的配置文件繁雜,此文幫大家疏通一下整體流程!
一 環境准備
1.1 創建maven工程
如圖所示:
輸入一下信息:
groupId:組織名稱
artifactId:項目名稱
便可進入項目中
1.2添加本次項目需要的jar包
jar包版本號
<spring.version>5.0.2.RELEASE</spring.version> <slf4j.version>1.6.6</slf4j.version> <log4j.version>1.2.12</log4j.version> <shiro.version>1.2.3</shiro.version> <mysql.version>5.1.6</mysql.version> <mybatis.version>3.4.5</mybatis.version>
對應的說明(坐標文件)
1 <dependency> 2 <groupId>junit</groupId> 3 <artifactId>junit</artifactId> 4 <version>4.11</version> 5 <scope>test</scope> 6 </dependency> 7 8 <!-- spring --> 9 <dependency> 10 <groupId>org.aspectj</groupId> 11 <artifactId>aspectjweaver</artifactId> 12 <version>1.6.8</version> 13 </dependency> 14 15 <dependency> 16 <groupId>org.springframework</groupId> 17 <artifactId>spring-aop</artifactId> 18 <version>${spring.version}</version> 19 </dependency> 20 21 <dependency> 22 <groupId>org.springframework</groupId> 23 <artifactId>spring-context</artifactId> 24 <version>${spring.version}</version> 25 </dependency> 26 27 <dependency> 28 <groupId>org.springframework</groupId> 29 <artifactId>spring-web</artifactId> 30 <version>${spring.version}</version> 31 </dependency> 32 33 <dependency> 34 <groupId>org.springframework</groupId> 35 <artifactId>spring-webmvc</artifactId> 36 <version>${spring.version}</version> 37 </dependency> 38 39 <dependency> 40 <groupId>org.springframework</groupId> 41 <artifactId>spring-test</artifactId> 42 <version>${spring.version}</version> 43 </dependency> 44 45 <dependency> 46 <groupId>org.springframework</groupId> 47 <artifactId>spring-tx</artifactId> 48 <version>${spring.version}</version> 49 </dependency> 50 51 <dependency> 52 <groupId>org.springframework</groupId> 53 <artifactId>spring-jdbc</artifactId> 54 <version>${spring.version}</version> 55 </dependency> 56 57 <dependency> 58 <groupId>junit</groupId> 59 <artifactId>junit</artifactId> 60 <version>4.12</version> 61 <scope>test</scope> 62 </dependency> 63 64 <dependency> 65 <groupId>mysql</groupId> 66 <artifactId>mysql-connector-java</artifactId> 67 <version>${mysql.version}</version> 68 </dependency> 69 70 <dependency> 71 <groupId>javax.servlet</groupId> 72 <artifactId>servlet-api</artifactId> 73 <version>2.5</version> 74 <scope>provided</scope> 75 </dependency> 76 77 <dependency> 78 <groupId>javax.servlet.jsp</groupId> 79 <artifactId>jsp-api</artifactId> 80 <version>2.0</version> 81 <scope>provided</scope> 82 </dependency> 83 84 <dependency> 85 <groupId>jstl</groupId> 86 <artifactId>jstl</artifactId> 87 <version>1.2</version> 88 </dependency> 89 90 <!-- log start --> 91 <dependency> 92 <groupId>log4j</groupId> 93 <artifactId>log4j</artifactId> 94 <version>${log4j.version}</version> 95 </dependency> 96 97 <dependency> 98 <groupId>org.slf4j</groupId> 99 <artifactId>slf4j-api</artifactId> 100 <version>${slf4j.version}</version> 101 </dependency> 102 103 <dependency> 104 <groupId>org.slf4j</groupId> 105 <artifactId>slf4j-log4j12</artifactId> 106 <version>${slf4j.version}</version> 107 </dependency> 108 <!-- log end --> 109 <dependency> 110 <groupId>org.mybatis</groupId> 111 <artifactId>mybatis</artifactId> 112 <version>${mybatis.version}</version> 113 </dependency> 114 115 <dependency> 116 <groupId>org.mybatis</groupId> 117 <artifactId>mybatis-spring</artifactId> 118 <version>1.3.0</version> 119 </dependency> 120 121 <dependency> 122 <groupId>c3p0</groupId> 123 <artifactId>c3p0</artifactId> 124 <version>0.9.1.2</version> 125 <type>jar</type> 126 <scope>compile</scope> 127 </dependency> 128 <dependency> 129 <groupId>org.junit.jupiter</groupId> 130 <artifactId>junit-jupiter-api</artifactId> 131 <version>RELEASE</version> 132 <scope>compile</scope> 133 </dependency> 134 <dependency> 135 <groupId>org.junit.jupiter</groupId> 136 <artifactId>junit-jupiter-api</artifactId> 137 <version>RELEASE</version> 138 <scope>compile</scope> 139 </dependency>
1.3 標記文件夾
需要注意,要用IDEA中的mark as將文件夾分別標注為源代碼和配置文件
1.4 編寫實體類
1 public class User { 2 private int id; 3 private String username; 4 private Date birthday; 5 private String sex; 6 private String address; 7 8 public int getId() { 9 return id; 10 } 11 12 public void setId(int id) { 13 this.id = id; 14 } 15 16 public String getUsername() { 17 return username; 18 } 19 20 public void setUsername(String username) { 21 this.username = username; 22 } 23 24 public Date getBirthday() { 25 return birthday; 26 } 27 28 public void setBirthday(Date birthday) { 29 this.birthday = birthday; 30 } 31 32 public String getSex() { 33 return sex; 34 } 35 36 public void setSex(String sex) { 37 this.sex = sex; 38 } 39 40 public String getAddress() { 41 return address; 42 } 43 44 public void setAddress(String address) { 45 this.address = address; 46 } 47 48 @Override 49 public String toString() { 50 return "User{" + 51 "id=" + id + 52 ", username='" + username + '\'' + 53 ", birthday=" + birthday + 54 ", sex='" + sex + '\'' + 55 ", address='" + address + '\'' + 56 '}'; 57 } 58 }
1.5 編寫業務層接口和持久層接口
持久層接口
1 public interface IUserDao { 2 public List<User> findAll(); 3 }
業務層接口
1 public interface IUserService { 2 public List<User> findAll(); 3 }
二、Spring框架
2.1 編寫spring配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/tx 10 http://www.springframework.org/schema/tx/spring-tx.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop.xsd 13 http://www.springframework.org/schema/context 14 http://www.springframework.org/schema/context/spring-context.xsd"> 15 <!-- 配置 spring 創建容器時要掃描的包 --> 16 <context:component-scan base-package="com.justnow"> 17 <!--制定掃包規則,不掃描@Controller 注解的 JAVA 類,其他的還是要掃描 --> 18 <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /> 19 </context:component-scan> 20 </beans>
使用componet-scan,可以讓Spring自動識別哪些類需要被裝配程Bean,從而減少在xml中的配置
2.2 使用注解配置業務層和持久層
此時,需要實現類,實現注解配置
其中持久層
1 import java.util.List; 2 3 @Repository("userDao") 4 public class UserDaoImpl implements IUserDao { 5 @Override 6 public List<User> findAll() { 7 System.out.println("查詢了所有賬戶"); 8 return null; 9 } 10 }
業務層
1 @Service("userService") 2 public class UserService implements IUserService { 3 4 @Autowired 5 private IUserDao userDao; 6 7 @Override 8 public List<User> findAll() { 9 return userDao.findAll(); 10 } 11 }
因為我們使用的是自動檢測Bean的方式,所以要明確知道哪些類需要注冊為spring Bean。此時,需要使用構造性(stereotype)來注解所標注的類
@Component:把資源讓spring來管理,相當於在xml中配置了一個Bean
@Controller:一般用於表現層的注解
@Service:一般用於業務層的注解
@Repository:一般用於持久層的注解
后面三個是第一個的衍生注解,與@Commponent作用和屬性是都一樣,只不過是提供了更加明確的使用場景。
注解的value指定了Bean的id。如@Service("userService"),可以表示將該類注冊為Bean,其中id為userService。如果沒有指定value的話,該Bean的id為類名第一個字母小寫
@Autowired:當Spring發現@Autowired注解時,將自動在代碼上下文中找到與其匹配(默認是類型匹配)的Bean,並自動注入到相應的地方去。
2.3 測試spring能否獨立運行
1 public class Test01Spring { 2 public static void main(String[] args) { 3 ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 4 IUserService userService = (IUserService) context.getBean("userService"); 5 userService.findAll(); 6 } 7 }
拿到配置文件,根據id值實例化類,執行findAll方法
執行的結果為:
說明,上述的配置過程無問題!
三、配置SpringMvc框架
3.1 在web.xml中配置核心控制器(DIspatcherServlet)
① 配置spring mvc的核心控制器
② 解決中文亂碼過濾器
③ 默認訪問的文件
代碼如下:
1 <!-- 1、配置 spring mvc 的核心控制器 --> 2 <servlet> 3 <servlet-name>springmvcDispatcherServlet</servlet-name> 4 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 5 <!-- 配置初始化參數,用於讀取 springmvc 的配置文件 --> 6 <init-param> 7 <param-name>contextConfigLocation</param-name> 8 <param-value>classpath:spring-mvc.xml</param-value> 9 </init-param> 10 <!-- 配置 servlet 的對象的創建時間點:應用加載時創建。取值只能是非 0 正整數,表示啟動順序 --> 11 <load-on-startup>1</load-on-startup> 12 </servlet> 13 <servlet-mapping> 14 <servlet-name>springmvcDispatcherServlet</servlet-name> 15 <url-pattern>/</url-pattern> 16 </servlet-mapping> 17 18 <!-- 2、解決中文亂碼過濾器 --> 19 <filter> 20 <filter-name>characterEncodingFilter</filter-name> 21 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 22 <!--設置過濾中的屬性值--> 23 <init-param> 24 <param-name>encoding</param-name> 25 <param-value>UTF-8</param-value> 26 </init-param> 27 <!--啟動過濾器--> 28 </filter> 29 <!--過濾所有請求--> 30 <filter-mapping> 31 <filter-name>characterEncodingFilter</filter-name> 32 <url-pattern>/*</url-pattern> 33 </filter-mapping> 34 35 <!--3、默認的訪問文件--> 36 <welcome-file-list> 37 <welcome-file>index.html</welcome-file> 38 <welcome-file>index.htm</welcome-file> 39 <welcome-file>index.jsp</welcome-file> 40 <welcome-file>default.html</welcome-file> 41 <welcome-file>default.htm</welcome-file> 42 <welcome-file>default.jsp</welcome-file> 43 </welcome-file-list>
3.2 編寫SpringMVC的配置文件spring-mvc.xml
① 掃描controller的注解,別的不掃描
② 配置視圖解析器
③ 開啟對SpringMVC注解的支持
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:mvc="http://www.springframework.org/schema/mvc" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 6 xmlns:aop="http://www.springframework.org/schema/aop" 7 xsi:schemaLocation=" 8 http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans.xsd 10 http://www.springframework.org/schema/mvc 11 http://www.springframework.org/schema/mvc/spring-mvc.xsd 12 http://www.springframework.org/schema/context 13 http://www.springframework.org/schema/context/spring-context.xsd 14 http://www.springframework.org/schema/aop 15 http://www.springframework.org/schema/aop/spring-aop.xsd 16 "> 17 18 <!-- 1、掃描controller的注解,別的不掃描 --> 19 <context:component-scan base-package="com.justnow.controller"> 20 </context:component-scan> 21 22 <!-- 2、配置視圖解析器 --> 23 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 24 <!-- JSP文件所在的目錄 --> 25 <property name="prefix" value="/pages/" /> 26 <!-- 文件的后綴名 --> 27 <property name="suffix" value=".jsp" /> 28 </bean> 29 30 <!--3、開啟對SpringMVC注解的支持 --> 31 <mvc:annotation-driven /> 32 33 34 </beans>
3.3 編寫Controller和jsp視圖,測試
此處並沒有連接數據庫,所以只是測試
創建UserController
1 package com.justnow.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 6 @Controller 7 @RequestMapping("/user") 8 public class UserController { 9 @RequestMapping("/findAll") 10 public String findAll(){ 11 System.out.println("測試通過"); 12 return "userList"; 13 } 14 }
當訪問/user/findAll的時候,就會在控制台打印"測試通過"
修改index.jsp為
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <body> 4 <h2>Hello World!</h2> 5 <a href="${pageContext.request.contextPath}/user/findAll">click</a> 6 </body> 7 </html>
最后的測試效果
四、整合Spring和SpringMVC
4.1 配置監聽器實現啟動服務創建容器
在web.xml中添加以下內容
1 <!--配置spring提供的監聽器,用於啟動服務器時加載容器。該監聽器只能加載WEB-INF目錄中名稱為applicationContext.xml的配置文件,所以需要手動指定spring配置文件的位置--> 2 <listener> 3 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 4 </listener> 5 6 <!--手動指定spring配置文件位置--> 7 <context-param> 8 <param-name>contextConfigLocation</param-name> 9 <param-value>classpath:applicationContext.xml</param-value> 10 </context-param>
五、使用Mybatis
MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設置參數以及獲取結果集。MyBatis 可以使用簡單的 XML 或注解來配置和映射原生類型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 對象)為數據庫中的記錄。
5.1 編寫SqlMapConfig.xml的配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <properties resource="jdbcConfig.properties"></properties> 7 <environments default="mysql"> 8 <environment id="mysql"> 9 <transactionManager type="JDBC"></transactionManager> 10 <dataSource type="pooled"> 11 <property name="driver" value="${jdbc.driver}"/> 12 <property name="url" value="${jdbc.url}"/> 13 <property name="username" value="${jdbc.username}"/> 14 <property name="password" value="${jdbc.password}"/> 15 </dataSource> 16 </environment> 17 </environments> 18 <mappers> 19 <!--該包下所有的dao接口--> 20 <package name="com.justnow.dao"/> 21 </mappers> 22 </configuration>
使用mybatis的注解配置,所以不需要再寫對應接口的映射文件
5.2 在IUserDao接口的方法上添加注解,編寫SQL語句
1 package com.justnow.dao; 2 3 import com.justnow.domain.User; 4 import org.apache.ibatis.annotations.Select; 5 6 import java.util.List; 7 8 public interface IUserDao { 9 @Select("select * from user") 10 public List<User> findAll(); 11 }
5.3 寫測試類,查看結果
強調,Resource類來自mybatis的包下,不要導錯了
1 package test; 2 3 import com.justnow.dao.IUserDao; 4 import com.justnow.domain.User; 5 import org.apache.ibatis.io.Resources; 6 import org.apache.ibatis.session.SqlSession; 7 import org.apache.ibatis.session.SqlSessionFactory; 8 import org.apache.ibatis.session.SqlSessionFactoryBuilder; 9 import org.junit.jupiter.api.Test; 10 11 import java.io.IOException; 12 import java.io.InputStream; 13 import java.util.List; 14 15 16 public class Test02Mybatis { 17 @Test 18 public void test() throws IOException { 19 //加載配置文件 20 InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); 21 //創建工廠 22 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream); 23 //創建sqlSession對象 24 SqlSession session = factory.openSession(); 25 //獲取代理對象 26 IUserDao dao = session.getMapper(IUserDao.class); 27 //調用查詢的方法 28 List<User> list = dao.findAll(); 29 for (User user : list) { 30 System.out.println(user); 31 } 32 //釋放資源 33 session.close(); 34 inputStream.close(); 35 } 36 }
查看測試結果
六 Spring整合Mybatis框架
6.1 SqlMapConfig.xm配置文件的內容配置到applicationContext.xml中
注意:配置完成后,直接刪除SqlMapConfig.xml。
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:aop="http://www.springframework.org/schema/aop" 5 xmlns:tx="http://www.springframework.org/schema/tx" 6 xmlns:context="http://www.springframework.org/schema/context" 7 xsi:schemaLocation="http://www.springframework.org/schema/beans 8 http://www.springframework.org/schema/beans/spring-beans.xsd 9 http://www.springframework.org/schema/tx 10 http://www.springframework.org/schema/tx/spring-tx.xsd 11 http://www.springframework.org/schema/aop 12 http://www.springframework.org/schema/aop/spring-aop.xsd 13 http://www.springframework.org/schema/context 14 http://www.springframework.org/schema/context/spring-context.xsd"> 15 <!-- 配置 spring 創建容器時要掃描的包 --> 16 <context:component-scan base-package="com.justnow"> 17 <!--制定掃包規則,不掃描@Controller 注解的 JAVA 類,其他的還是要掃描 --> 18 <context:exclude-filter type="annotation" 19 expression="org.springframework.stereotype.Controller" /> 20 </context:component-scan> 21 22 <!--加載配置文件--> 23 <context:property-placeholder location="classpath:jdbcConfig.properties" /> 24 25 <!--配置數據源--> 26 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 27 <property name="driverClass" value="${jdbc.driver}"></property> 28 <property name="jdbcUrl" value="${jdbc.url}"></property> 29 <property name="user" value="${jdbc.username}"></property> 30 <property name="password" value="${jdbc.password}"></property> 31 </bean> 32 <!--配置mybatis的Session工廠--> 33 <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 34 <!--數據庫連接池--> 35 <property name="dataSource" ref="dataSource"/> 36 37 <!-- 掃描sql配置文件:mapper需要的xml文件 --> 38 <property name="mapperLocations" value="classpath:mapper/*.xml"/> 39 </bean> 40 41 <!--配置掃描dao接口包,動態實現dao接口,注入到spring容器中--> 42 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 43 <!-- 注入sqlSessionFactory --> 44 <property name="basePackage" value="com.justnow.ssm.dao"/> 45 </bean> 46 47 48 </beans>
6.2 刪除dao接口的實現類,並修改Controller
1 package com.justnow.controller; 2 3 import com.justnow.domain.User; 4 import com.justnow.service.IUserService; 5 import org.springframework.beans.factory.annotation.Autowired; 6 import org.springframework.stereotype.Controller; 7 import org.springframework.web.bind.annotation.RequestMapping; 8 import org.springframework.web.servlet.ModelAndView; 9 10 import java.util.List; 11 12 @Controller 13 @RequestMapping("/user") 14 public class UserController { 15 @Autowired 16 private IUserService userService; 17 18 @RequestMapping("/findAll") 19 public ModelAndView findAll(){ 20 ModelAndView mv = new ModelAndView(); 21 List<User> userList = userService.findAll(); 22 mv.addObject("userList", userList); 23 mv.setViewName("userList"); 24 return mv; 25 } 26 }
6.3 修改jsp頁面,讀取服務器返回的參數
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 <html> 4 <head> 5 <title>title</title> 6 </head> 7 <body> 8 我是userList界面 9 展示user信息 10 <table border="1px"> 11 <tr> 12 <th>id</th> 13 <th>username</th> 14 <th>birthday</th> 15 <th>sex</th> 16 <th>address</th> 17 </tr> 18 19 <c:forEach items="${userList}" var="user"> 20 <tr> 21 <td>${user.id}</td> 22 <td>${user.username}</td> 23 <td>${user.birthday}</td> 24 <td>${user.sex}</td> 25 <td>${user.address}</td> 26 </tr> 27 </c:forEach> 28 29 </table> 30 </body> 31 </html>
6.4 訪問后的結果為:
七 Spring 配置注解事務
7.1 配置注解事務
如果不同的用戶同時插入數據,那么這時候就需要事務來處理問題。在applicationContenxt.xml中配置用注解的方法來設置事務的相關屬性
1 <!--3 配置Spring的聲明式事務管理 --> 2 <!--3.1 配置事務管理器 --> 3 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 4 <property name="dataSource" ref="dataSource"/> 5 </bean> 6 7 <!--3.2 事務驅動注解--> 8 <tx:annotation-driven transaction-manager="transactionManager"/>
同時在service的實現類中添加@Transactional
這里使用的默認的事務屬性,找到注解的源代碼
7.2 添加jsp頁面、修改controller、service、dao代碼
userInsert.jsp
1 <%@ page contentType="text/html;charset=UTF-8" language="java" %> 2 <html> 3 <head> 4 <title>title</title> 5 </head> 6 <body> 7 8 <form action="${pageContext.request.contextPath}/user/save" method="post"> 9 id<input type="text" name="id"> 10 username<input type="text" name="username"><br> 11 birthday<input type="date" name="birthday"><br> 12 sex<input type="text" name="sex"><br> 13 address<input type="text" name="address"><br> 14 <input type="submit" value="提交"> 15 </form> 16 </body> 17 </html>
在dao中添加插入方法
package com.justnow.dao; import com.justnow.domain.User; import org.apache.ibatis.annotations.Insert; import org.apache.ibatis.annotations.Select; import org.springframework.stereotype.Repository; import org.springframework.web.bind.annotation.RequestMapping; import java.util.List; public interface IUserDao { @Select("select * from user") public List<User> findAll(); @Insert("insert into user(id, username, birthday, sex, address) values (#{id}, #{username}, #{birthday}, #{sex}, #{address})") public void save(User user); }
在service中添加插入方法
在controller中添加兩個映射,一個跳轉到userInsert.jsp頁面,一個是form表單中提交后,重定向到用戶列表頁面userList.jsp中
注意:因為提交中參數出現了日期,所以必須在實體類中確定日期的格式。用注解的方法實現
現在開始測試,
第一步:打開user/add,並填入內容
第二步:查看是否插入成功
ok!,搞定
附上本次項目源代碼:
https://github.com/justn0w/javawebdemo/tree/master/ssmdemo