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è)面顯示: