现在很多公司用的开源框架很多都是ssm框架的一个结构,这里我自己试着自己搭一个简单的框架,大家共同学习。下面一起跟着我搭建吧,本人菜鸟,有任何不对的地方有望指出。

框架结构:spring(4.3.9.RELEASE)+springmvc(4.3.9.RELEASE)+mybatis(3.4.4)+marven(4.0.0)需要注意的是,自己搭的时候注意mybatis的版本和spring的版本要兼容,具体可以去http://www.mybatis.org/spring/上查看

spring框架:核心是ioc和aop,主要负责bean容器的注入,和mybatis整合之后还负责数据库(连接数据库,sqlsession,事物)相关配置,并且还可以集成其他模块。

springmvc框架:主要处理请求,model,view,controller,一看就主要是controller和view之间的交互,所以主要配置controller和view的配置

mybatis框架:持久层框架,和spring整合之后负责有关sql的配置

软件:eclipse(4.4.1)+jdk1.7+tomcat7

一、创建一个maven项目 目录:

这里面的文件后面都会用到,都会一一说明,因为之前有搭过,后来忘了,现在搭的时候一些也忘了,也是百度了不少,所以有的地方我会啰嗦一点

 一、先引入jar包,可以去http://search.maven.org/网站查询自己所需要的jar包 

<!-- spring相关jar包  -->
    <!-- spring-context :  为Spring核心提供了大量扩展,
       这里marven会自动添加其依赖jar包  
      spring-aop.jar(使用aop特性时使用的类) 
      spring-beans.jar(包含访问配置文件、创建和管理bean以及进行Inversion of Control / Dependency Injection(IoC/DI)操作相关的所有类)
      spring-core。jar:spring核心工具包
      spring-orm。jar:spring对dao层特性的扩展
      spring-expression:Spring表达式语言??这边不能理解?
     -->
      <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>4.3.9.RELEASE</version>
    </dependency>
    <!-- mvc框架相关类 -->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>4.3.9.RELEASE</version>
    </dependency>
     <!-- aspect -->
    <dependency>  
    <groupId>org.aspectj</groupId>  
    <artifactId>aspectjrt</artifactId>  
    <version>1.6.11</version>  
    </dependency>  
    <dependency>  
    <groupId>org.aspectj</groupId>  
    <artifactId>aspectjweaver</artifactId>  
    <version>1.6.11</version>  
    <scope>runtime</scope>  
    </dependency>  
    <!-- 用于整合orm框架(hibernate,ibatis,)-->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-orm</artifactId>
    <version>4.3.9.RELEASE</version>
    </dependency>
    
    <!-- mybatis框架-->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.4</version>
    </dependency>
    <!-- spring和mybatis整合,通过spring设置bean来管理mybatis的配置 -->
    <dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
    </dependency>
    <!-- oracle连接驱动 -->
    <!-- maven没有提供oracle的连接驱动包 -->
     <!-- 导入dbcp的jar包,用来在spring-mybatis.xml中配置数据库 -->
    <dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
    </dependency>
    <!--对Spring 对JDBC 数据访问进行封装的所有类-->
    <dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>4.1.6.RELEASE</version>

<!-- 对json的支持 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0.pr4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.9.0.pr4</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.9.0.pr4</version>
</dependency>

</dependency>

 

这里我用的数据库连接是oracle,好像marven上没法下载oracle的驱动jar包就自己下了 ,用mysql的自己添加一下mysql的驱动包

 二、配置ApplicationContext.xml  spring的配置文件

oracal.properties   连接oracle相关数据配置

oracle.driverClassName=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@localhost:1521:xe
oracle.username=system
oracle.password=123456
oracle.initialSize=3
oracle.maxActive=300
oracle.maxIdle=2
oracle.minIdle=1

ApplicationContext.xml    spring的配置文件

<?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:aop="http://www.springframework.org/schema/aop" 
    xmlns:tx="http://www.springframework.org/schema/tx"
    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/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
                        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 扫描除了controller之外的bean  和springmvc的功能区分开 -->
<context:component-scan base-package="com.lyj">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- 加载连接oracle的配置文件 -->
<bean class="org.springframework.beans.factory.config.PreferencesPlaceholderConfigurer">
    <property name="locations">
        <list>
            <value>classpath:oracle.properties</value>
        </list>
    </property>
</bean>
<!-- 数据库 连接 采用dbcp方式,我这边用的是oracle数据库-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${oracle.driverClassName}"/>
    <property name="url" value="${oracle.url}"/>
    <property name="username" value="${oracle.username}"/>
    <property name="password" value="${oracle.password}"/>
    <!-- 配置连接池相关属性 -->
    <property name="initialSize" value="${oracle.initialSize}"/><!-- 启动时的连接数  -->
    <property name="maxActive" value="${oracle.maxActive}"/><!-- 最大连接数 -->
    <property name="maxIdle" value="${oracle.maxIdle}"/><!-- 最大空闲数,经过高峰之后 ,将连接渐渐释放直到释放到最大空闲值-->
    <property name="minIdle" value="${oracle.minIdle}"/><!-- 最小空闲值,当空闲的连接数少于此值,连接池会申请连接 -->
</bean>

<!-- 数据库连接已经建好,那么就要访问数据库,进行数据库操作 ,spring提供了sessionFactory 来建立与数据库的会话-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:sql-map-config.xml"/>
    <property name="mapperLocations">
        <list>
            <value>classpath:mybatis/*/*-mapper.xml</value>
        </list>
    </property>
</bean>


<!-- 通过注入sqlsessionFactory的方式来获取一个SqlsessionTemplate  -->
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
    <!-- 通过构造函数注入 -->
    <constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>


<!-- 扫描 basePackage下所有的接口,根据对应的mapper.xml为其生成代理类,实现dao曾的注入 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="basePackage" value="com.lyj.*.mapper" />
    
</bean>

<!-- 相关事务配置 -->
<!-- 可以理解为切面 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
<!-- transaction-manager:事务管理器,管理之前配置的数据库 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
    <tx:attributes>
    <!-- name:配置用到事务的方法名(相当于切点) propagation:如何使用事务  read-only:是否只读  rollback-for:回滚(注意:代码中不能try..catch..如果catch了就不会抛出异常,spring接受不到异常,事务就不会回滚) -->
        <tx:method name="*add*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
        <tx:method name="*delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
        <tx:method name="*update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
    </tx:attributes>
</tx:advice>

<aop:config>
    <!-- 切点集 这里配置在service层 ,在service层上面配置事物-->
    <aop:pointcut expression="execution(* com.lyj.*.service..*(..))" id="pc"/>
    <aop:advisor advice-ref="txAdvice" pointcut-ref="pc"/>
</aop:config>


</beans>

 三、dispatcher-servlet.xml    springmvc配置文件

<?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:mvc="http://www.springframework.org/schema/mvc"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd    
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"
>
<!-- springmvc主要处理view和controller之间的交互,所以这边将view和controller单独放在springmvc的配置-->

<!-- 定义 org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler
它会像一个检查员,对进入DispatcherServlet的URL进行筛查,如果发现是静态资源的请求,就将该请求转由Web应用服务器默认的Servlet处理,如果不是静态资源的请求,才由DispatcherServlet继续处理
-->
<!-- <mvc:default-servlet-handler /> -->

<!-- 会自动注入DefaultAnnotationHandlerMapping处理@requestMapping,将请求路径放在请求映射表上 和AnnotationMethordHandlerAdpter:根据前台请求地址决定调用哪个方法 两个bean是用于springmvc分发请求用到的 
并默认配置HttpMessageConverter:@responsebody返回某种格式,默认应该是json吧,是吗?哈哈,我这边出来就是json的
-->
<mvc:annotation-driven />  
<!-- 扫描controller注解的类 -->
<context:component-scan base-package="com.lyj">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- springMVC访问静态资源将/WEB-INF/resources路径通过ResourceHttpRequestHandler 映射成/resources/** 可以直接访问 -->
<mvc:resources mapping="/resources/**" location="/WEB-INF/resources/" />

<!-- 相关视图配置 -->
 <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <property name="prefix" value="/WEB-INF/view/" />
       <property name="suffix" value=".jsp" />
 </bean>
   
</beans>

三、mybatis的配置文件  sql-map-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD SQL Map Config 3.0//EN"  
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- mybatis的事情都让spring去做了,自己做啥呢,mybatis还有配置一些类的简写啊,全局配置啊,哈哈,万恶的spring -->
    <!-- 可以用来配置类的别名 -->
    <!-- <typeAliases></typeAliases> -->
    
    <!-- mybatis的一个插口,可以理解为拦截器拦截器,可以用来做基于mybatis的分页 -->
    <!-- <plugins>
        <plugin interceptor=""></plugin>
    </plugins> -->
</configuration>

四、web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>SSM</display-name>
  
<!-- 加载spring配置 -->  
<!--上下文,相当于全局的变量  -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:applicationContext.xml</param-value>
</context-param>

<context-param>
    <param-name>xhlbqlhlog4jConfigLocation</param-name>
    <param-value>classpath:log4j.properties</param-value>
</context-param>

<!-- 监听器 -->
 <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
 <listener>
    <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class>
  </listener>
<!--过滤器  -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
</filter>
 <filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern><!-- 匹配所有的路径包括有后缀的如。jsp,.html,.js等等 -->
  </filter-mapping>
 
<!-- servlet -->
<servlet>
    <servlet-name>springMvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:dispatcher-servlet.xml</param-value>
    </init-param>
</servlet>
 <servlet-mapping>
    <servlet-name>springMvc</servlet-name>
    <url-pattern>/</url-pattern>
    <!-- 注意:这里是/  不适用/*的原因:如访问student/queryStudednt路径时返回一个页面student/queryStudent.jsp
    这是这个路径又被拦截,dispatcher-servlet去寻找@requestMapping("student/queryStudent.jsp")的controller,此时没有这个controller,就报404
    换成/就直接返回页面了
     -->
  </servlet-mapping>

  <!-- 默认首页 -->
 <welcome-file-list>
   <welcome-file>index.jsp</welcome-file>
 </welcome-file-list>
 
 <!-- tomcat启动时首先加载WEB-INF下的web.xml,里面标签加载顺序  context-param》listener》filter》servlet ,spring的bean默认在起服务的时候就已经注入了-->
 
 
</web-app>

五、测试

Student.java

package com.lyj.student.model;

import org.springframework.stereotype.Component;

@Component
public class Student {
    private String id;

    private String name;
    
    private String age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAge() {
        return age;
    }

    public void setAge(String age) {
        this.age = age;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    
}

StudentMapper.java(dao层)

package com.lyj.student.mapper;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.lyj.student.model.Student;

@Repository
public interface StudentMapper {

    public List<Student> queryStudent();
}

studentMapper.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.lyj.student.mapper.StudentMapper">
    <select id="queryStudent" resultType="com.lyj.student.model.Student">
    select * from student
    </select>
</mapper>

 

studentService.java

package com.lyj.student.service;

import java.util.List;

import com.lyj.student.model.Student;

public interface StudentService {

    public List<Student> queryStudent();
}

studentServiceImpl.java

package com.lyj.student.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.lyj.student.mapper.StudentMapper;
import com.lyj.student.model.Student;
import com.lyj.student.service.StudentService;

@Service
public class StudentServiceImpl implements StudentService {

    @Autowired
    StudentMapper mapper;
    @Override
    public List<Student> queryStudent() {
        
        return mapper.queryStudent();
        
    }

}

StudentController.java

package com.lyj.student.controller;

import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import com.lyj.student.model.Student;
import com.lyj.student.service.StudentService;

@Controller
public class StudentController {

    @Autowired
    private StudentService studentService;
    
    @RequestMapping("student/queryStudent")
    public ModelAndView queryStudent(){
        
        ModelMap map=new ModelMap();
        List<Student> list=studentService.queryStudent();
        System.out.println(list.toString());
        map.put("studentList", list);
        return new ModelAndView("student/queryStudent");
        
    }
    
    @RequestMapping("student/queryStudentJson")
    @ResponseBody
    public Map insertStudent(){
        ModelMap map=new ModelMap();
        List<Student> list=studentService.queryStudent();
        System.out.println(list.toString());
        map.put("studentList", list);
        return map;
        
    }
}

访问:http://localhost:8081/SSM/student/queryStudent

控制台输出:[Student [id=1, name=小明, age=10], Student [id=2, name=小红, age=11], Student [id=3, name=小蓝, age=12]],页面也访问到了

六、注意:

1.jar包版本可能互相不支持,需注意,或者是不是少jar包了

2.eclipse配置方面,project facets的配置,jdk版本,web版本是不是对应的

3.配置文件中扫描bean的路劲,还有一些其他路径是否配置正确

 

等等。。。

好了就到这里。。。对于框架部分还是很浅的认知,目前只知道如何使用,哎。。。太菜。。。

 

posted on 2017-07-08 16:29  wjdxw  阅读(349)  评论(0编辑  收藏  举报