最近在学习Java的过程中接触到了SSM框架。这是学习Java过程中第一次接触到了那么多的XML文件。
刚开始学习的时候感到很迷茫,网上到处充满了各种如何配置的教程,按照教程的确能运行起来,不过心里总有一句“卧槽,这TM怎么运行起来的?”
我仍未明白这是干什么用的、看不懂、为什么要这么写、这么麻烦为什么不直接使用Servlet等各种问题。仿佛我刚开始学编程是碰到了“类”的概念一样,完全不明白。
经过一段时间的学习,有所“了解”,我将它写出来,给和我遇到一样情况的朋友。
注:
1、我刚刚接触SSM,我基于我目前的理解写下这篇文章。
一、SSM框架是什么?
SSM框架由三部分组成,分别是 Spring、Spring MVC 、 MyBatis。取各自的首字母组成。
必须要使用这三个吗?是的,这是因为使用了这三个所以才叫SSM。
Spring :
Spring是一个开源框架。是一个轻量级的控制反转(IoC Inversionof Control)+ 面向切面(AOP)的容器框架。
控制反转(IoC):
解释:https://zh.wikipedia.org/wiki/%E6%8E%A7%E5%88%B6%E5%8F%8D%E8%BD%AC
打个比方:我是一家公司老板,现在需要找个人(对象)来擦窗,我必须一个人一个人的问“你会不会擦窗?”、“你怕不怕高?”等等问题,很是麻烦。 于是我请了一个秘书(Spring),我只需要告诉它“找个能擦窗的过来”就行了,她会在员工名单内进行查找(容器),让这个人过来擦窗,我不知道这个人是从哪里来的(对象的创建),也不知道干完了之后他会去哪里(对象的销毁)。如果找不到合适的人,秘书就会告诉我没有人能来干(抛出异常)。
面向切面(AOP):
解释:https://zh.wikipedia.org/wiki/%E9%9D%A2%E5%90%91%E4%BE%A7%E9%9D%A2%E7%9A%84%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1
打个比方:每个方法是一个山楂,然后我可以使用任意顺序把它串起来,依次执行。那为啥不直接写在代码里?因为在运行时,AOP可以动态的将指定方法插入到目标方法的前、后、中(运行中)运行。
总结:
由它的功能可以看出,Spring在SSM框架中的主要作用使用来管理对象的,各种乱七八糟的对象都可以由Spring进行管理,我们需要什么是直接伸手要就行了。
Spring MVC:
Spring MVC提供了Web应用程序的MVC模块,将控制器、视图、模型分离(低耦合)
MVC:
解释:https://zh.wikipedia.org/wiki/MVC
简单来说,M是模型(Model),V是视图(View),C是控制器(Controller)
模型:
模型是用来封装数据、处理数据。
视图:
显示模型中的数据给用户看。
控制器:
就像它的名字一样,获取用户请求、调用相应模型处理数据,传递数据给视图显示。
总结:
它是用来处理用户请求并给予响应。
MyBatis:
它是一个持久层框架,使用它可比JDBC方便多了。
二、Spring MVC处理流程
有上面可以看到,Spring MVC是用来处理用户请求的,它是如果处理的有必要了解一下。
1.当用户发起一个请求时,首先会到达DispatcherServlet,它和普通Servlet一样,一旦url匹配成功,请求就会进入该Servlet。
2.进入DispatcherServlet之后,他会将请求发送给相应的控制器,但首先它要知道给哪一个控制器,所以它首先会在处理器映射中查询相应的控制器。
3.现在,DispatcherServlet知道了它的目标,它将用户请求发送给控制器,控制器开始处理用户数据(如提交的表单等等),一般控制器不处理数据,它会将数据委托给服务对象(自己写的类)进行处理。
4.控制器处理完成之后,一般会产生一些信息(用户查询的结果、用户是否注册成功),将这些信息封装起来就是模型(Model),仅仅有模型是不够的,用户一般需要一个视图(View)来显示这些信息,所以控制器会指定一个视图去显示信息,一般使用JSP,Freemarker。控制器会将数据信息以及视图名称进行打包,返回给DisoatcherServlet。
5.DispathcerServlet拿到控制器返回的信息后,会将逻辑视图名称交给视图解析器,视图解析器将会使用这个名称查找真正的视图。
6.既然已经知道了具体的视图,DispathcerServlet将会把模型交给视图,视图根据模型完成渲染,并将结果响应给用户,这样,用户就能就看到了。
三、编码
结尾处有完整源码。
打开Eclipse,创建一个Maven项目,如图。
选择位置
选择webapp
填写信息
Group Id 一般反过来写自己的域名
Artifact id 一般填的项目名
完成之后应该是这样的
目前项目有错误,HttpServlet这个类没有找到,把Tomcat添加进来即可解决。
点击菜单栏Window --> Preferences,打开Runtime Encironments,点击Add
选择您的Tomcat版本,我选择的9.0
选择Tomcat路径,Finish --》 Apply and close
在项目名上右键 选择Build Path --> Configure Build Path,选择Librarie选项卡,点击右侧的Add Library
选择图中这个
选择刚刚添加的Tomcat,Finish
完成后错误消失。
修改pom.xml的<dependencies>
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.14.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> </dependencies>
最后pom是这样的
这样就添加完了SSM框架所需要的各种jar包。
现在有了基本的环境,可以进行开发了。
我们按照Spring MVC流程图进行开发。
第一步,我们需要将DispatcherSerlver添加到servlet之中。打开web.xml
添加以下代码
<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:spring.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
如图
init-param中配置了一个参数,这样该Servlet在初始化时候会读取 类路径下的一个叫spring.xml的配置文件,有了配置文件,它才能知道要做什么。
配置spring.xml
首先在创建一个Source Folder用来存放配置文件,我的Source Folder叫config,如图
在里面新建一个文件,叫做spring.xml,此文件名称要和sevlet中的相同。
填写以下内容
<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 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-4.3.xsd"> <!-- 开启注解 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 组件扫描 --> <context:component-scan base-package="cn.abble.m2b2c.controller"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp" /> </bean> </beans>
解释一下
<mvc:annotation-driven>的作用是开启“注解类型的处理器映射”,这样可以使用注解来指定相应的控制器。
<context:component-scan base-package="cn.abble.m2b2c.controller"></context:component-scan> 是让Spring去自动扫描该包下的组建,并创建出对象,放入spring的容器中。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/" />
<property name="suffix" value=".jsp" />
</bean>
这是配置了视图解析器,根据SpringMVC的流程,控制器将会返回视图的逻辑名称,通过视图解析器可以找到相应的视图。如控制器返回“hello”,那么视图就是/WEB-INF/hello.jsp Spring将会自动创建出一个视图解析器的对象并放入容器中。
spring.xml完成之后,开始写控制器。
根据上面spring.xml的配置,我需要新建一个包叫cn.abble.m2b2c.controller。
在此包中创建一个类,名称随意,这里叫做Hello
代码如下:
package cn.abble.m2b2c.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @Controller public class Hello { @GetMapping(value = {"/","/index"}) public String index() { return "index"; } }
解释:
@Controller 表明该类是一个控制器类,由于该类在cn.abble.m2b2c.controller包中,根据spring.xml的配置,Spring将自动创建出该类的对象。
通过使用@GetMapping(value = {"/","/index"}) 来映射请求,当请求为get,请求路径为/ 或者 /index时,调用该方法进处理。
同理还有@PostMapping、@PutMapping、@DeleteMapping、@PatchMapping
返回值“index”表示返回一个逻辑视图名称为index的视图,根据spring.xml的配置,视图为/WEB-INF/index.jsp
所以现在需要在/WEB-INF下创建一个index.jsp。内容随意。
最后文件结构如图
OK,就像普通jsp网站一样,运行即可。
这就是一个基本的SSM框架的Web。当然目前还没有使用到MyBatis,因为并没有需要连接数据库的需求。
使用MyBatis
实现一个页面,用户输入相应的id,返回对应id的name
创建一个数据库和表
一个非常简单的表,表名为man,表结构及内容如下
创建一个实体类,叫做Man,放在cn.abble.m2b2c.entity下
代码如下
package cn.abble.m2b2c.entity; public class Man { private int id; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
创建一个jsp页面,放在/WEB-INF/下,叫做query.jsp
代码如下:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="utf-8" isELIgnored="false"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath}/query" method="post"> id:<input name="id"/> <input type="submit"/> </form> query user name is : ${name} </body> </html>
修改pom.xml,添加mysql驱动和spring jdbc,用来连接数据库
完整pom.xml如下
<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>cn.abble</groupId> <artifactId>m2b2c</artifactId> <packaging>war</packaging> <version>0.0.1-SNAPSHOT</version> <name>m2b2c Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>4.3.14.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>6.0.6</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.3.14.RELEASE</version> </dependency> </dependencies> <build> <finalName>m2b2c</finalName> </build> </project>
修改spring.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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd 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-4.3.xsd"> <!-- 开启注解 --> <mvc:annotation-driven></mvc:annotation-driven> <!-- 组件扫描 --> <context:component-scan base-package="cn.abble.m2b2c.controller"></context:component-scan> <!-- 配置视图解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/" /> <property name="suffix" value=".jsp" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/wx?serverTimezone=UTC&characterEncoding=utf-8" /> <property name="username" value="root" /> <property name="password" value="root" /> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> </bean> <!-- mapper扫描器 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.abble.m2b2c.mapper"/> </bean> </beans>
需要你自行修改jdbc连接信息。
新建包 cn.abble.m2b2c.mapper 创建一个类叫ManMapper(名称随意)
代码如下:
package cn.abble.m2b2c.mapper; import org.apache.ibatis.annotations.Select; import cn.abble.m2b2c.entity.Man; public interface ManMapper { @Select("select * from man where id=#{id}") Man query(int id); }
解释:
在spring.xml中增加了一条mapper扫描器,会自动扫描指定包中的mapper,具体可以查看中文文档:http://www.mybatis.org/mybatis-3/zh/index.html
每个mapper是一个接口,MyBatis会自动创建该接口的对象并放入Spring 容器中。
@Select 时根据id去查找用户,并自动返回成一个Man对象,可以参考 http://www.mybatis.org/mybatis-3/zh/statement-builders.html
创建一个控制器Query,放在cn.abble.m2b2c.controller
代码如下:
package cn.abble.m2b2c.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import cn.abble.m2b2c.entity.Man; import cn.abble.m2b2c.mapper.ManMapper; @Controller public class Query { @Autowired ManMapper mapper; @GetMapping("/query") public String q() { return "query"; } @PostMapping("/query") public String quert(int id,Model model) { System.out.println(id); Man m = mapper.query(id); model.addAttribute("name", m.getName()); return "query"; } }
解释:
@AutoWired 向Spring要一个ManMaper的实现类的对象,这个实现类有MyBatis自动产生并创建,比不需要用户关系,只要向Spring要就行了。
query(int id,Model model) id由Spring mvc自动传入,搜索“参数绑定”可以获取更多信息。Model是由Spring MVC传入的模型。
Man m = mapper.query(id) 调用mapper对象根据ManMapper代码中@Select中的sql进行查询,并返回封装好的对象
mode.addAttribute("name",m.getName()) 将用户名字放入模型中,在视图中可以使用name将用户名字取出
以上就是MyBatis的简单使用。
全部代码 链接: https://pan.baidu.com/s/1drKpRo 密码: vg15
以上就是SSM框架的简单使用。上面如果不懂的名词可以查一些百度,有很多博客有详细的解释。
XML文件占了大部分,如果不喜欢XML,可以去学习Spring Boot!无需配置即可运行。