SSM框架-1 基础
SSM(Spring+SpringMVC+MyBatis)框架由Sping、SpringMVC、MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架
其中sping是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。SpringMVC分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。
重要类解释
- DispatcherServlet:前端控制器,页面发起请求时会将request提交到DispatcherServlet。在Web项目中DispatcherServlet处于web.xml中的servlet,项目启动时会将此类加载。spring-mvc.xml会作为此类的init-param(初始化参数)被加载
- HandlerMapping:处理器映射器,通过扩展处理器映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。程序启动的时候会将所有的handlerMapping加载进handlerMappings(DispatcherServlet的一个属性)我知道的有4种:
- RequestMappingHandlerMapping
- BeanNameUrlHandlerMapping
- SimpleUrlHandlerMapping
- DefaultAnnotationHandlerMapping
- HandlerExecutionChain:处理器执行链由某一具体处理器
Spring MVC运行原理
整个处理过程从一个HTTP请求开始:
- Tomcat在启动时加载解析web.xml,找到Spring Mvc的前端控制器DispatcherServlet,并且通过DispatcherServlet来加载相关的配置文件信息
- DispatcherServlet接收到客户端请求,找到对应HandlerMapping,根据映射规则,找到对应的处理器(Handler)
- 调用相应处理器中的处理方法,处理该请求后,会返回一个ModelAndView
- DispatcherServlet根据得到的ModelAndView中的视图对象,找到一个合适的ViewResolver(视图解析器),根据视图解析器的配置,DispatcherServlet将要显示的数据传给对应的视图,最后显示给用户。
新建SSM项目
文件目录如下:
点击这里去github查看源码
新建一个空的项目点击这里查看如何新建一个空的项目
- File—>New—>Module—>Maven---->org.apache.maven.archetypes:maven-archetype-webapp,
创建成功后,默认web.xml的version=“2.3”,需要删除该版本,重新添加一个web.xml,版本为2.5,步骤如下:
目录如下:
- 重新添加一个web.xml,版本为2.5.
Filer–>Project Structure–>Modules–>
移除后点击Apply,然后在点击+
- pom.xml文件需要更改更改3个地方:
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.torey.ssmTest</groupId>
<artifactId>torey-ssmTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>torey-ssmTest Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<!--这里改为1.8-->
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<!--这里改为4.1.2-->
<version>4.12</version>
<scope>test</scope>
</dependency>
<!--添加spring-webmvc依赖-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
</dependencies>
<build>
<finalName>torey-ssmTest</finalName>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.1.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.1</version>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
- web.xml文件里配置前端控制器(servlet)
web.xml文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app 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_2_5.xsd"
version="2.5">
<!--配置前端控制器-->
<servlet>
<servlet-name>springMvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--配置启动web容器的时候实例化当前servlet实例,数字越大,优先级越高-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springMvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
- 发布tomchat,尝试运行:
运行报如下错误:
07-Sep-2018 05:31:03.703 严重 [RMI TCP Connection(3)-127.0.0.1] org.springframework.web.servlet.DispatcherServlet.initServletBean Context initialization failed
org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from ServletContext resource [/WEB-INF/springMVC-servlet.xml]; nested exception is java.io.FileNotFoundException: Could not open ServletContext resource [/WEB-INF/springMVC-servlet.xml]
报错原因是没有配置springMVC-servlet.xml
在main下新建resource文件夹,并右击该文件夹—>mark Directory as—>Resources Root
在resource文件夹下新建spring文件夹,在resource/spring文件夹下新建springMVC-servlet.xml文件,右击spring文件夹—>New---->XML Configuration File---->Spring Config---->取名为 springMVC-servlet
在web.xml配置加载springMVC-servlet.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/springMVC-servlet.xml</param-value>
</init-param>
<!--配置启动web容器的时候实例化当前servlet实例,数字越大,优先级越高-->
<load-on-startup>0</load-on-startup>
</servlet>
在main下新建 新建java文件夹,右击该文件夹Mark Directorey as —>Sources Root,然后在java文件夹下新建类:com.demo.controller.MvcController.class,该MvcController.class继承Controller。
如果出现如下界面,证明没有引入servlet,引入servlet方法请参照
实现访问MvcController.handleRequest方法,跳转到index.jsp页面
配置映射处理器-BeanNameUrlHandlerMapping
配置映射处理器,在springMVC-servlet.xml添加,class值在springframework:spring-webmvc:4.3.14–>org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
springMVC-servlet.xml内容如下
springMVC-servlet.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置映射处理器-->
<bean name="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean name="/test1/mvc" class="com.demo.controller.MvcController"></bean>
</beans>
MvcController.class文件内容如下:
package com.demo.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
public class MvcController implements Controller {
@Override
public ModelAndView handleRequest(javax.servlet.http.HttpServletRequest request, javax.servlet.http.HttpServletResponse response) throws Exception {
ModelAndView mv=new ModelAndView();
//默认为 转发
mv.setViewName("/index.jsp");
//redirect:重定向
// mv.setViewName("redirect:/index.jsp");
// forward 请求转发
// mv.setViewName("forward:/index.jsp");
return mv;
}
}
配置映射处理器 - SimpleUrlHandlerMapping
SimpleUrlHandlerMapping映射处理器:可以实现多个路径对应一个controller
springMVC-servlet.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--配置映射处理器-->
<!--beanNameUrlHandlerMapping 映射处理器-->
<!-- <bean name="beanNameUrlHandlerMapping" class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean name="/test1/mvc" class="com.demo.controller.MvcController"></bean>-->
<bean id="testController" class="com.demo.controller.MvcController"></bean>
<bean id="simpleUrlHandlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<!--多个路径对应一个controller-->
<prop key="/test.do">testController</prop>
<prop key="/hello.do">testController</prop>
</props>
</property>
</bean>
</beans>