SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis兩個開源框架整合而成(SpringMVC是Spring中的部份內容)。常做爲數據源較簡單的web項目的框架。javascript
1.SpringMVC:css
客戶端發送請求到DispacherServlet(分發器)html
由DispacherServlet控制器查詢HanderMapping,找處處理請求的Controllerjava
Controller調用業務邏輯處理後,返回ModelAndViewmysql
DispacherSerclet查詢視圖解析器,找到ModelAndView指定的視圖jquery
視圖負責將結果顯示到客戶端web
2.Spring:spring
Spring是一個輕量級的控制反轉(IOC)和麪向切面(AOP)的容器架構,IOC容器包含並管理應用對象的配置和生命週期,你能夠配置你的每一個bean如何被建立,也能夠配置每一個bean是隻有一個實例,仍是每次須要時都生成一個新的實例,以及它們是如何相互關聯的。sql
IOC思想最核心的地方在於,資源不禁使用資源的雙方管理,而由不使用資源的第三方管理,這能夠帶來不少好處。第一,資源集中管理,實現資源的可配置和易管理。第二,下降了使用資源雙方的依賴程度,也就是咱們說的耦合度。數據庫
容器提供了AOP技術,利用它很容易實現如權限攔截、運行期監控等功能。
3.MyBatis:
MyBatis是支持普通SQL查詢,存儲過程和高級映射的優秀持久層框架。MyBatis消除了幾乎全部的JDBC代碼和參數的手工設置以及結果集的檢索。MyBatis使用簡單的XML或註解用於配置和原始映射,將接口和Java的POJOs(Plan Old Java Objects,普通的Java對象)映射成數據庫中的記錄。
MyBatis的操做都是圍繞一個sqlSessionFactory實例展開的。MyBatis經過配置文件關聯到各實體類的Mapper文件,Mapper文件中配置了每一個類對數據庫所需進行的sql語句映射。在每次與數據庫交互時,經過sqlSessionFactory拿到一個sqlSession,再執行sql命令。
4.Maven:
JavaEE項目開發中爲了便於後期的維護,通常會進行分層開發,分層以後,各個層之間的職責會比較明確,後期維護起來也相對比較容易。
項目配置:
1.新建:New-->Other-->maven-->MavenProtect-->webapp-->SSM03
2.配置Tomcat:右擊Properties-->Java Build Path-->Libraries-->Add Library-->Server Runtime-->Apache Tomcat v8.5,完成
3.新建web動態項目,名稱隨便起,點擊next兩次,在Generate web.xml deployment descriptor前打勾,完成
咱們須要的是web.xml,留下<web-app></web-app>標籤,其他內容刪除,複製到SSM03下的web.xml中,並完全刪除新建的web動態項目
4.在Navigator中,找到SSM03項目,在包.settings下面找到org.eclipse.wst.common.project.facet.core.xml文件,修改<installed facet="jst.web" version="2.3"/>爲3.1版本
5.右擊SSM03,選擇Maven-->Update Project-->ok
6.刪除src-->main-->webapp-->index.jsp,從新創建index.jsp,在其中寫一句話,運行SSM03
7.配置pom.xml,導入依賴jar包,spring-context、spring-tx、spring-jdbc、spring-webmvc、mybatis、mybatis-spring、dbcp、mysql
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.18.RELEASE</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.2</version> </dependency> <dependency> <groupId>commons-dbcp</groupId> <artifactId>commons-dbcp</artifactId> <version>1.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> </dependency>
8.在Java Resources下的resources包中新建ssm.xml文件,該文件以spring爲核心(spring配置文件),在https://docs.spring.io/spring/docs/4.3.23.RELEASE/spring-framework-reference/htmlsingle/中找到7.2.1,複製。
可複製的內容以下:
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd"> </beans>
Spring最大的特色就是控制反轉,而實現控制反轉就是經過那一系列的配置文件。
(1)須要添加的內容:
A:添加mybatis的約束文件 xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" B:添加約束文件的地址: http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd
定義了三個命名空間,代號爲context,mvc,mybatis
其中,context的約束文件複製的是schemaLocation裏面的,將beans更改成context,而後複製兩行到下面,第二行加上spring-context.xsd
同理,mvc的約束文件複製的也是schemaLocation裏面的,將beans更改成mvc,而後複製兩行到下面,第二行加上spring-mvc.xsd
mybatis的約束文件須要單獨添加。
(2)注意:使用<context:component-scan>元素會掃描指定的包及其全部的子包,並查找出可以自動註冊爲Spring Bean的類。
base-package屬性標識了<context:component-scan>元素所掃描的包。同時,也會掃描包含@Service,@Component,@Repository,@Controller註解修飾的類。
(3)咱們經常會須要訪問靜態資源,如html,js,css,image等,默認訪問的URL都會被DispatcherServlet所攔截,SpringMVC提供了更爲便捷的方式處理靜態資源,直接在servlet-context.xml中添加資源映射。在本案例中,就是向ssm.xml中添加靜態資源映射。
<mvc:annotation-driven /><!-- 註解驅動 --> <mvc:default-servlet-handler /> <mvc:resources location="/resources/" mapping="/resources/**" /> <mvc:resources location="/images/" mapping="/images/**"></mvc:resources> <mvc:resources location="/js/" mapping="/js/**"></mvc:resources> <mvc:resources location="/css/" mapping="/css/**"></mvc:resources> <!-- 啓動Spring MVC的註解功能,完成請求和註解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" lazy-init="false" /> <!-- 另外最好還要加入DefaultAnnotationHandlerMapping,否則會被 XML或其它的映射覆蓋! --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />
(4)配置數據源
<!-- 加載數據庫配置文件 -->
<context:property-placeholder location="classpath:db.properties" />
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driver}"></property>
<property name="url" value="${jdbc.url}"></property>
<property name="username" value="${jdbc.username}"></property>
<property name="password" value="${jdbc.password}"></property>
</bean>
(5)經過IOC容器管理SqlSessionFactory對象
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加載數據庫鏈接池 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置掃描全部的 mapper.xml 文件 --> <property name="mapperLocations" value="classpath:com/beicai/mapper/*Mapper.xml" /> </bean> <!-- DAO(Mapper)接口所在包名,Spring會自動查找其下的類 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.beicai.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean>
ssm.xml(屬於整合SpringMVC)
(1)<?xml version="1.0" encoding="UTF-8"?>是指版本和編碼信息。
(2)beans標籤是整個配置文件的根節點,包含一個或者多個bean元素。
(3)命名空間:xmlns:XML NameSpace的縮寫。Spring默認的命名空間就是http://www.springframework.org/schema/beans
。
Spring容器在解析xml文件時,會獲取標籤的命名空間來跟上述url比較,判斷是否爲默認命名空間。
(4)xmlns:xsi(xml schema instance)是指具體用到的schema資源文件裏定義的元素所準守的規範。
即http://www.w3.org/2001/XMLSchema-instance
這個文件裏定義的元素遵照什麼標準 。
(5)xsi:schemaLocation 本文檔裏的xml元素所遵照的規範,這些規範都是由官方制定的,能夠進你寫的網址裏面看版本的變更。
xsd的網址還能夠幫助你判斷使用的代碼是否合法。
(6)spring從2.5版本開始支持註解注入,註解注入能夠省去不少的xml配置工做。因爲註解是寫入java代碼中的,因此註解注入會失去必定的靈活性,根據須要是否啓用註解注入。
<context:component-scan base-package="xxxxxxxxx"/>啓用了對類包進行掃描以實施註釋驅動 Bean 定義的功能,同時還啓用了註釋驅動自動注入的功能。
base-package 屬性指定了須要掃描的類包,類包及其遞歸子包中全部的類都會被處理。
<?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:mvc="http://www.springframework.org/schema/mvc" xmlns:mybatis="http://mybatis.org/schema/mybatis-spring" xsi:schemaLocation="http://www.springframework.org/schema/beans https://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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://mybatis.org/schema/mybatis-spring http://mybatis.org/schema/mybatis-spring.xsd "> <!-- 掃描器 --> <context:component-scan base-package="com.ztt"></context:component-scan> <!-- 靜態資源映射 --> <mvc:annotation-driven /><!-- 註解驅動 --> <mvc:default-servlet-handler /> <mvc:resources location="/resources/" mapping="/resources/**" /> <mvc:resources location="/images/" mapping="/images/**"></mvc:resources> <mvc:resources location="/js/" mapping="/js/**"></mvc:resources> <mvc:resources location="/css/" mapping="/css/**"></mvc:resources> <!-- 啓動Spring MVC的註解功能,完成請求和註解POJO的映射 --> <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" lazy-init="false" /> <!-- 另外最好還要加入DefaultAnnotationHandlerMapping,否則會被 XML或其它的映射覆蓋! --> <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" /> <!-- 數據源 --> <!-- 加載數據庫配置文件 -->
<context:property-placeholder location="classpath:db.properties" /> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </bean>
<!--經過IOC容器管理SqlSessionFactory對象--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 加載數據庫鏈接池 --> <property name="dataSource" ref="dataSource"></property> <!-- 配置掃描全部的 mapper.xml 文件 --> <property name="mapperLocations" value="classpath:com/ztt/mapper/*Mapper.xml" /> </bean>
<!-- DAO(Mapper)接口所在包名,Spring會自動查找其下的類 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.ztt.mapper" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property> </bean> </beans>
9.配置webapp中的web.xml
web.xml的做用?
web.xml文件是Java web項目中的一個配置文件,主要用於配置歡迎頁、Filter、Listener、Servlet等,但並非必須的,一個java web項目沒有web.xml文件照樣能跑起來。Tomcat容器/conf
目錄下也有做用於全局web應用web.xml文件,當一個web項目要啓動時,Tomcat會首先加載項目中的web.xml文件,而後經過其中的配置來啓動項目,只有配置的各項沒有錯誤時,項目才能正常啓動。
(1)對於<servlet>元素和<servlet-mapping>元素的理解(Servlet映射匹配問題)
因爲客戶端是經過URL地址訪問web服務器中的資源,因此Servlet程序若想被外界訪問,必須把servlet程序映射到一個URL地址上,這個工做在web.xml文件中使用<servlet>元素和<servlet-mapping>元素完成。
<servlet>元素用於註冊Servlet,它包含有兩個主要的子元素:
<servlet-name>:Servlet的註冊名稱
名稱爲:dispatcherServlet。
<servlet-class>:Servlet的完整類名
在本案例中找的是Libraries下的Maven Dependencies下的spring-webmvc-4.3.18.RELEASE.jar,找到org.springframework.web.servlet,找到 DispatcherServlet.class,並複製。即org.springframework.web.servlet.DispatcherServlet。
<servlet-mapping>元素用於映射一個已註冊的Servlet的一個對外訪問路徑,它包含有兩個子元素:
<servlet-name>:指定Servlet的註冊名稱
名稱爲:dispatcherServlet。
<url-pattern>,Servlet的對外訪問路徑
當我使用<url-pattern>/*</url-pattern>時,咱們能夠匹配全部的請求,即全部的請求都會通過該標籤對應的Servlet
注:<url-pattern>/</url-pattern>和<url-pattern>/*</url-pattern>效果是同樣的
<init-param>是放在一個servlet內的,因此這個參數是隻針對某一個servlet而言的
(2)在web.xml中使用contextConfigLocation參數定義要裝入的Spring配置文件。
在<param-value>標記要配置的文件。
(3)<filter>...</filter>: 定義一個過濾器。
<filter-mapping>...</ filter-mapping> :配置上面那個定義的過濾器。
<url-pattern>/*</url-pattern>表示適用的範圍是全部的請求。
<filter-name>過濾器的名字,能夠本身取。
<filter-class>引用的具體類文件名。通常引用官方包裝好的,名字固定。
定義和配置即<filter>和<filter-mapping>是成對出現的。其中的<filter-name>相同則是一對。
這段代碼的做用主要是爲了實現hibernate的延遲加載功能
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:ssm.xml</param-value> </init-param> </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> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>register.jsp</welcome-file> </welcome-file-list> </web-app>
10.在Java Resources下的resources包中新建db.properties文件
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mydb2 jdbc.username=root jdbc.password=123
11.將index.jsp修改成rigister.jsp
在webapp下新建js文件,將jquery-3.0.0.js粘貼進去
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="js/jquery-3.0.0.js"></script> </head> <body> <form action="register" method="post"> UserName:<input type="text" name="username" id="uname"><br/> PassWord:<input type="password" name="password" id="pword"><br/> <input type="button" value="Register" id="btn"> </form> <script type="text/javascript"> $("#btn").click(function(){ var uname = $("#uname").val(); var pword = $("#pword").val(); if (uname != null && pword != null && uname != "" && pword != "") { $("form").submit(); }else{ alert("用戶名或密碼不能爲空"); } }); </script> </body> </html>
注意:在這裏須要先創建com.ztt.mapper包,由於在ssm.xml中已經對mapper進行了掃描,對項目運行監測
12.(1)在src/main/java中建立com.ztt.controller包,並建立UserController.java類
package com.ztt.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.servlet.ModelAndView; import com.ztt.bean.User; import com.ztt.service.UserService; @Controller public class UserController { @Autowired UserService us ; @PostMapping("/register") public ModelAndView register(ModelAndView mv , User user) { boolean is = us.regsiter(user); if (is) { mv.setViewName("login.jsp"); mv.addObject("username", user.getUsername()); }else { mv.setViewName("register.jsp"); mv.addObject("errmsg","網絡錯誤,註冊失敗,請重試"); } return mv; } @PostMapping("/login") public ModelAndView login(ModelAndView mv , User user) { User u = us.login(user); if (u != null && u.getUsername() != null && u.getUsername() != "") { mv.setViewName("homepage.jsp"); }else { mv.addObject("errmsg", "網絡錯誤,請重試"); mv.setViewName("login.jsp"); } return mv; } }
(2)建立com.ztt.bean包,建立User.java,這須要與數據庫中的數據保持一致
package com.ztt.bean; public class User { int uid; String username; String password; String imgUrl; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } @Override public String toString() { return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", imgUrl=" + imgUrl + "]"; } }
(3)建立com.ztt.service包,建立UserService.java
package com.ztt.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.ztt.bean.User; import com.ztt.mapper.UserMapper; @Service public class UserService { @Autowired UserMapper um; public boolean regsiter(User user) { return um.addUser(user)>0?true:false; } public User login(User user) { return um.login(user); } }
(4)創建UserMapper.java接口
package com.ztt.mapper; import org.springframework.stereotype.Repository; import com.ztt.bean.User; @Repository public interface UserMapper { int addUser(User user); User login(User user); }
(5)新建UserMapper.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.ztt.mapper.UserMapper"> <!-- 標籤的ID必須和Mapper接口中的方法名保持一致 --> <insert id="addUser" parameterType="com.ztt.bean.User"> insert into user values(null , #{username} , #{password} , "") </insert> <select id="login" resultMap="loginRM"> select * from user where username = #{username} and password = #{password} </select>
<resultMap type="com.ztt.bean.User" id="loginRM"> </resultMap> </mapper>
13.建立login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript" src="js/jquery-3.0.0.js"></script> </head> <body> <form action="login" method="post"> UserName:<input type="text" name="username" id="uname" value="${username }"><br/> PassWord:<input type="password" name="password" id="pword"><br/> <input type="button" value="Login" id="btn"> </form> <script type="text/javascript"> $("#btn").click(function(){ var uname = $("#uname").val(); var pword = $("#pword").val(); if (uname != null && pword != null && uname != "" && pword != "") { $("form").submit(); }else{ alert("用戶名或密碼不能爲空"); } }); </script> </body> </html>
14.建立homepage.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> 歡迎光臨 </body> </html>