现在很多公司用的开源框架很多都是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的路劲,还有一些其他路径是否配置正确
等等。。。
好了就到这里。。。对于框架部分还是很浅的认知,目前只知道如何使用,哎。。。太菜。。。