本人也是小白一枚,刚刚学习ssm框架,尝试着自己搭建一个属于自己的框架,这个框架虽然简单,却耗费了我饿一天的时间,下面是我搭建的过程,仅供参考。有什么不足之处大家可以指出。
ssm定义
SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。
Spring
Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。
Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地new
一个对象,而是让Spring框架帮你来完成这一切。
SpringMVC
SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。
mybatis
mybatis是对jdbc的封装,它让数据库底层操作变的透明。mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。
页面发送请求给控制器,控制器调用业务层处理逻辑,逻辑层向持久层发送请求,持久层与数据库交互,后将结果返回给业务层,业务层将处理逻辑发送给控制器,控制器再调用视图展现数据。(以上解释来自百度百科)
搭建一个简单的属于自己的ssm框架过程
1.首先新建一个maven项目
一直点击next
选择webapp的那一个创建项目。
然后点击finish,我们的maven项目创建完成。
2.调整我们刚刚创建的maven项目的目录结构
我们刚刚创建的项目目录结构是这样的,这是不正确的目录结构需要我们自己调整。下面看一下调整步骤。
1.右键单击项目
2.选择Build Path然后选择Build Path后面扩展出来的那个选项,然后我们会看到下面的页面
然后按照上面的步骤操作,选择我们自己的jdk,然后点击finish之后apply一下就可以了,至于为什么会这样我也不清楚- -!
此时再看我们的目录结构
这就是正确的目录结构了,但这不是完整的目录结构,因为我们还要放我们自己的东西,下面是我的目录结构,但也不是最完整的,这是我目前用的到的
这是我搭建的一个自己的小框架的目录结构。
下面我们来说一下,每个文件的作用和配置方法
1.首先是pom.xml文件,这个文件是maven依赖,是项目依赖的配置文件,这个项目所需要的jar包都可以通过pom文件来下载就不需要自己一个个的添加了,非常的方便。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Mysecondmaven</groupId>
<artifactId>Mysecondmaven</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>Tur Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<!-- Spring版本号 -->
<spring.version>4.3.8.RELEASE</spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<!-- Spring相关包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- 数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.20</version>
</dependency>
<!-- MyBatis相关包 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.3.0</version>
</dependency>
<!-- MySQL相关包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<!-- Spring集成MyBatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
<build>
<finalName>Mysecondmaven</finalName>
</build>
</project>
这上面每一个包的作用都有注释,写的很清楚,每一对dependency之间就是一个jar包,最上面记得写上spring的版本,这个版本并不是固定的。
2.然后我们看一下webapp文件夹下WEB-INF文件夹下的web.xml文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>Dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>
这里配置了去哪里读取xml文件,这句的意思是去spring文件夹下读取所有spring-开头的.xml文件 。
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:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- 启动自动扫描 -->
<context:component-scan
base-package="com.Mysecondmaven.controllers" /><!-- 这里写你的要扫面的java包名,我现在这么写就是扫描com.qcbylearn.controllers下的所有类-->
<!-- 注册MVC注解驱动 -->
<mvc:annotation-driven />
<!-- 静态资源可访问的设置方式 -->
<mvc:default-servlet-handler />
<!-- 配置视图解析器,可以显式设置,也可以不设置,不设置会依据SpringMVC的默认设置 -->
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/views/" />
<property name="suffix" value=".jsp" /><!-- 这里会自动在你输入的跳转路径前加上/views/前缀,在跳转路径后加上.jsp后缀 -->
</bean>
</beans>
这句的意思就是扫描com.Mysecondmaven.controllers文件夹下带@controller的文件,这些代码后面都有注释很好理解。
spring-mybatis.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"
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">
<!-- 导入db配置 -->
<context:property-placeholder ignore-unresolvable="true" location="classpath:spring/db.properties" />
<!-- Druid 数据库连接池-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<!-- 注册SqlSessionFactoryBean -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mappers.xml文件 -->
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml" />
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.Mysecondmaven.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>
</beans>
这是用来配置数据库的,上面都有注释,大家很好理解每一段是用来干嘛的。
db.properties文件
jdbc.driver=com.mysql.jdbc.Driver
#阿里云服务器IP地址 47.95.203.218
jdbc.url=jdbc:mysql://localhost/newtest
jdbc.username=root
jdbc.password=123456
这个文件是用来连接数据库的
上面这些就是ssm框架的一些配置文件的操作,还是比较好理解的吧0.0
我们来简单的测试一下这个框架
首先我们在数据库中新建一个表
取名为Person
填入一些数据
对数据库进行操作的是mapper文件夹下的.xml文件
我们在mybatis文件夹下的mapper文件夹下创建一个.xml文件
Myfirstbatis.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.Myfirstmaven.dao.PersonMapper" >
<resultMap id="BaseResultMap" type="com.Myfirstmaven.entities.Person">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="sex" property="sex" jdbcType="VARCHAR" />
<result column="age" property="age" jdbcType="INTEGER" />
</resultMap>
<sql id="Base_Column_List">
id, name, sex, age
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" >
select
<include refid="Base_Column_List"/>
from person
where id = #{id,jdbcType=INTEGER}
</select>
</mapper>
这里的意思是type后面这个文件夹下的Person类
column对应的是数据库中的列名,property对应的是类中的属性,jdbctype是数据类型。
然后我们进行测试,前台的访问,首先访问到controller层中,由controller接受请求,controller层负责与前台进行交互,然后发送给service层进行处理,处理的时候调用dao层的接口访问数据库,dao层接口的实现在上面提到的mapper文件夹下的.xml文件中实现。
我们在这几个文件夹下创建java文件,这里我只是简单的测试了一下,并没有用到所有的功能。
在controller层中创建Myfirstcontroller
package com.Myfirstmaven.controllers;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.Myfirstmaven.dao.PersonMapper;
import com.Myfirstmaven.entities.Person;
@Controller
public class Myfirstcontroller {
@Autowired
private PersonMapper personMapper;
@RequestMapping(value="/a")//设置访问controller的路径
public void test()
{
List<Person> personList = personMapper.selectByPrimaryKey(1234L);//通过主键去查询数据库
for(Person p : personList)
{
System.out.println(p.toString());//遍历输出查询到的结果
}
}
}
我建立了一个controller接受前台的请求,这里我没有用到service处理,我直接在controller中处理了请求。controller处理时调用了dao层的selectByPrimaryKey()方法。
在dao层中创建PersonMapper
package com.Myfirstmaven.dao;
import java.util.List;
import com.Myfirstmaven.entities.Person;
public interface PersonMapper {
List<Person> selectByPrimaryKey(Long id);
}
这个是dao层中的接口,只定义方法不实现。
在entities层中创建Person类
package com.Myfirstmaven.entities;
public class Person {
private long id;
private String name;
private String sex;
private int age;
public Person()
{
}
public Person(long id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
//重写toString方法,方便打印出属性的值
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
结果
在前端请求我们的地址
后端输出的结果
到这里,一个简单的ssm框架就介绍完毕了。
总结
下面我个人总结一下我这个框架的流程如有不足之处欢迎指出
1.首先我们搭建一个框架最重要的就是这个框架的配置问题,也就是这些.xml文件,这些文件在编译时是合成一个总的xml文件的,其实写在哪里是一样的。
2.配置好之后然后就流程了,首先前端发送一个请求到后端,首先到达的就是controller层,由controller接收前端的请求。
3.然后service层处理请求,然后调用dao层中的接口查找数据库,然后dao层的实现在mapper文件夹下的xml文件夹中实现,最后controller返回给前端。