使用SSM框架搭建項(xiàng)目

SSM框架

SSM(Spring+SpringMVC+MyBatis)框架集由Spring棺耍、MyBatis兩個(gè)開(kāi)源框架整合而成(SpringMVC是Spring中的部分內(nèi)容)。常作為數(shù)據(jù)源較簡(jiǎn)單的web項(xiàng)目的框架疯攒。

Spring

Spring就像是整個(gè)項(xiàng)目中裝配bean的大工廠儿惫,在配置文件中可以指定使用特定的參數(shù)去調(diào)用實(shí)體類(lèi)的構(gòu)造方法來(lái)實(shí)例化對(duì)象澡罚。也可以稱(chēng)之為項(xiàng)目中的粘合劑。
Spring的核心思想是IoC(控制反轉(zhuǎn))肾请,即不再需要程序員去顯式地new一個(gè)對(duì)象留搔,而是讓Spring框架幫你來(lái)完成這一切。

SpringMVC

SpringMVC在項(xiàng)目中攔截用戶(hù)請(qǐng)求铛铁,它的核心Servlet即DispatcherServlet承擔(dān)中介或是前臺(tái)這樣的職責(zé)隔显,將用戶(hù)請(qǐng)求通過(guò)HandlerMapping去匹配Controller,Controller就是具體對(duì)應(yīng)請(qǐng)求所執(zhí)行的操作饵逐。SpringMVC相當(dāng)于SSH框架中struts括眠。

mybatis

mybatis是對(duì)jdbc的封裝,它讓數(shù)據(jù)庫(kù)底層操作變的透明倍权。mybatis的操作都是圍繞一個(gè)sqlSessionFactory實(shí)例展開(kāi)的掷豺。mybatis通過(guò)配置文件關(guān)聯(lián)到各實(shí)體類(lèi)的Mapper文件,Mapper文件中配置了每個(gè)類(lèi)對(duì)數(shù)據(jù)庫(kù)所需進(jìn)行的sql語(yǔ)句映射薄声。在每次與數(shù)據(jù)庫(kù)交互時(shí)当船,通過(guò)sqlSessionFactory拿到一個(gè)sqlSession,再執(zhí)行sql命令默辨。

SSM框架運(yùn)行原理

頁(yè)面發(fā)送請(qǐng)求給控制器德频,控制器調(diào)用業(yè)務(wù)層處理邏輯,邏輯層向持久層發(fā)送請(qǐng)求廓奕,持久層與數(shù)據(jù)庫(kù)交互抱婉,后將結(jié)果返回給業(yè)務(wù)層,業(yè)務(wù)層將處理邏輯發(fā)送給控制器桌粉,控制器再調(diào)用視圖展現(xiàn)數(shù)據(jù)蒸绩。

SSM框架搭建一個(gè)簡(jiǎn)單的測(cè)試項(xiàng)目

1. 配置SpringMVC文件spring-mvc.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    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">

    <context:component-scan base-package="com.senchen">     <!-- 只管理  @Controller -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>       
        
    <!-- 試圖解析器  springMVC管理的jsp文件位置應(yīng)該在 /WEB-INF/meto/  -->
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/meto/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- 上傳解析器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        
        <property name="defaultEncoding" value="utf-8"/>
        <property name="maxUploadSize" value="200000000"/>

    </bean> 

</beans>

2. 配置SpringMVC文件spring-mvc.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:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    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">

    <context:component-scan base-package="com.senchen">     <!-- 只管理  @Controller -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>       
        
    <!-- 試圖解析器  springMVC管理的jsp文件位置應(yīng)該在 /WEB-INF/meto/  -->
    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/meto/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    
    <!-- 上傳解析器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        
        <property name="defaultEncoding" value="utf-8"/>
        <property name="maxUploadSize" value="200000000"/>

    </bean> 

</beans>

3. 加入mybatis配置myBatis.cfg.xml

<?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>
    <settings>
        <setting name="logImpl" value="log4j" />
    </settings>

    <typeAliases>
        <typeAlias  alias="Users" type="com.senchen.shop.entity.Users"/>            <!-- User類(lèi) 別名 -->
    </typeAliases>
</configuration>

4.加入Log4j配置log4j.properties

### Console ###
log4j.appender.AA=org.apache.log4j.ConsoleAppender
log4j.appender.AA.Target=System.out
log4j.appender.AA.layout=org.apache.log4j.PatternLayout
log4j.appender.AA.layout.ConversionPattern=%p [%C{1}:%L] %m%n

### File ###
log4j.appender.D=org.apache.log4j.FileAppender
log4j.appender.D.File=D://logs/log.log
log4j.appender.D.Append=true
log4j.appender.D.Threshold=DEBUG
log4j.appender.D.layout=org.apache.log4j.PatternLayout
log4j.appender.D.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}  [ %t:%r ] - [ %p ]  %m%n

### root level ###
log4j.rootLogger=debug,AA

### spring level ###
log4j.logger.org.springframework=WARN

### your package level ###
log4j.logger.com.senchen=WARN
### your sub package level ###
log4j.logger.com.senchen.shop=debug
log4j.logger.apache.ibatis=debug

5.加入Spring配置app.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"
    
    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">
    
    <context:component-scan base-package="com.senchen"> <!-- 避免  spring-mvc 再次創(chuàng)建一個(gè)Controller 實(shí)例 -->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>                           <!-- 只管理  @Component, @Service, @Repository -->
    
    <aop:aspectj-autoproxy/>
    
    <!-- 代替mybatis配置 讀取 數(shù)據(jù)庫(kù)連接配置  -->
    <context:property-placeholder location="classpath:dbConfig.properties"/>
    
    <!-- 代替mybatis配置  spring管理數(shù)據(jù)源 -->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName"    value="${myDriver}"/>
        <property name="url"                value="${myUrl}"/>
        <property name="username"           value="${myUname}"/>
        <property name="password"           value="${myPwd}"/>
    </bean>
    
    <!-- 代替mybatis配置  spring管理 mybatis SqlSessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:myBatis.cfg.xml"/>
        <property name="mapperLocations" value="classpath:com/senchen/shop/mapper/*.xml"/>
    </bean>
    
    <!-- 代替mybatis配置  spring管理 mybatis Dao的實(shí)現(xiàn)類(lèi) -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.senchen.shop.dao" />
    </bean>
</beans>

6.加入數(shù)據(jù)源文件dbConfig.properties

myDriver=com.mysql.jdbc.Driver
myUrl=jdbc:mysql://localhost:3306/elm
myUname=root
myPwd=root

7.項(xiàng)目配置web.xml加入Spring,Spring MVC

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
  <display-name></display-name>
  
  <!-- spring文檔位置 -->
   <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:app*.xml</param-value>
  </context-param>
  
  <!-- 讀spring文檔位置 相對(duì)于  ioc = new ClassPathXMLApplicationContext( contextConfigLocation ) 
       application.setAttribute( WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, ioc);
  -->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener> 
  <servlet>
    <servlet-name>xxyyzz</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring-mvc.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>xxyyzz</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
 
</web-app>

8.創(chuàng)建控制器SsmTestController.java,調(diào)用業(yè)務(wù)層接口SsmTestService.java

package com.senchen.shop.controller;

import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.senchen.shop.entity.Users;
import com.senchen.shop.svs.SsmTestService;

@Controller
public class SsmTestController {
    Logger log = Logger.getLogger( SsmTestController.class);
    
    
    @Resource
    SsmTestService tSvs;
    //測(cè)試URL /ssm.do
    @RequestMapping("/ssm")
    public String m1(Model md){
        log.debug("訪問(wèn)到spring mvc...");
        
        List<Users> list = tSvs.findAllUser();
        
        log.debug("\tspring 已注入service 查詢(xún)出 " +( null!=list?list.size():-1 ));
        
        md.addAttribute("datas", list);
        
        return "ssm_test";
    }//m1
}

9. 創(chuàng)建業(yè)務(wù)層接口SsmTestService.java,和業(yè)務(wù)層實(shí)現(xiàn)類(lèi)SsmTestServiceImpl.java,業(yè)務(wù)層實(shí)現(xiàn)類(lèi)調(diào)用數(shù)據(jù)訪問(wèn)層接口SsmTestDao.java

package com.senchen.shop.svs;

import java.util.List;

import org.springframework.stereotype.Service;

import com.senchen.shop.entity.Users;


public interface SsmTestService {
    
    public List<Users> findAllUser()throws RuntimeException;
}

package com.senchen.shop.svs.impl;

import java.util.List;

import javax.annotation.Resource;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Service;

import com.senchen.shop.dao.SsmTestDao;
import com.senchen.shop.entity.Users;
import com.senchen.shop.svs.SsmTestService;

@Service
public class SsmTestServiceImpl  implements SsmTestService{
    
    Logger log = Logger.getLogger( this.getClass());
    
    @Resource
    SsmTestDao tdao;
    
    @Override
    public List<Users> findAllUser() throws RuntimeException {
        log.debug("\tspring 已注入tdao ");
        return tdao.selectTest();
    }
}

10. 建立數(shù)據(jù)訪問(wèn)層接口SsmTestDao.java

package com.senchen.shop.dao;

import java.util.List;

import com.senchen.shop.entity.Users;

public interface SsmTestDao {
    
    public List<Users> selectTest()throws RuntimeException;
    
}

11. 建立實(shí)體類(lèi)Users和其專(zhuān)屬映射文件SsmTestMapper.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.senchen.shop.dao.SsmTestDao">
    <select id="selectTest" resultType="Users">
        select * from users
    </select>
</mapper>

12.建立測(cè)試跳轉(zhuǎn)的頁(yè)面ssm_test.jsp在MVC定義的跳轉(zhuǎn)路徑WEB-INF/meto下,接收Controller存入的數(shù)據(jù)并顯示

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>
  
  <body>
    This is my JSP page.111 <br>
    
    <table border="1">
        <tr>
            <th>序號(hào)</th>
            <th>姓名</th>
            <th>手機(jī)號(hào)</th>
            <th>郵箱</th>
        </tr>
        
        <c:if test="${ !empty datas }">
            <c:forEach items="${datas}" var="u" varStatus="st">
                <tr>
                    <td>${st.count}</td>
                    <td>${u.uname}</td>
                    <td>${u.uphone}</td>
                    <td>${u.uemail}</td>
                </tr>
            
            </c:forEach>
        </c:if>
    </table>
  </body>
</html>

13.在瀏覽器地址欄輸入測(cè)試URL進(jìn)行測(cè)試

控制臺(tái)顯示查到七行數(shù)據(jù):



頁(yè)面顯示:


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铃肯,一起剝皮案震驚了整個(gè)濱河市患亿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖步藕,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惦界,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡咙冗,警方通過(guò)查閱死者的電腦和手機(jī)沾歪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)雾消,“玉大人灾搏,你說(shuō)我怎么就攤上這事×⑷螅” “怎么了狂窑?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桑腮。 經(jīng)常有香客問(wèn)我泉哈,道長(zhǎng),這世上最難降的妖魔是什么破讨? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任丛晦,我火速辦了婚禮,結(jié)果婚禮上提陶,老公的妹妹穿的比我還像新娘采呐。我一直安慰自己,他們只是感情好搁骑,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布斧吐。 她就那樣靜靜地躺著,像睡著了一般仲器。 火紅的嫁衣襯著肌膚如雪煤率。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天乏冀,我揣著相機(jī)與錄音蝶糯,去河邊找鬼。 笑死辆沦,一個(gè)胖子當(dāng)著我的面吹牛昼捍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肢扯,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼妒茬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蔚晨?” 一聲冷哼從身側(cè)響起乍钻,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后银择,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體多糠,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年浩考,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夹孔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡析孽,死狀恐怖析蝴,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绿淋,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布尝盼,位于F島的核電站吞滞,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盾沫。R本人自食惡果不足惜裁赠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望赴精。 院中可真熱鬧佩捞,春花似錦、人聲如沸蕾哟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)谭确。三九已至帘营,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逐哈,已是汗流浹背芬迄。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昂秃,地道東北人禀梳。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像肠骆,于是被迫代替她去往敵國(guó)和親算途。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • 對(duì)于java中的思考的方向蚀腿,1必須要看前端的頁(yè)面郊艘,對(duì)于前端的頁(yè)面基本的邏輯,如果能理解最好,不理解也要知道幾點(diǎn)纱注。 ...
    神尤魯?shù)婪?/span>閱讀 819評(píng)論 0 0
  • SSM框架整合理解 把IntelliJ IDEA+Maven+Spring + SpringMVC + MyBat...
    青年馬土豆閱讀 9,459評(píng)論 0 21
  • 摘要: 基本概念 1.1畏浆、Spring spring是一個(gè)開(kāi)源框架,Spring是于2003 年興起的一個(gè)輕量級(jí)的...
    ITsupuerlady閱讀 1,410評(píng)論 0 8
  • 雜談 很久不更新微博了狞贱,失蹤了很久...究其原因嘛...找到了實(shí)習(xí)刻获,只不過(guò)不是Android的而是Java的,先來(lái)...
    奔跑之咸魚(yú)閱讀 2,301評(píng)論 0 13
  • 最近越來(lái)越愛(ài)上自己給自己灸了瞎嬉,灸完之后感覺(jué)確實(shí)從生理到精神狀態(tài)上蝎毡,都能量滿(mǎn)滿(mǎn)了。灸完就發(fā)自?xún)?nèi)心的去分享氧枣,也能自帶宣...
    暖靜兒閱讀 195評(píng)論 0 2