SSM框架集

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>
相關文章
相關標籤/搜索