Spring MVC体系结构和处理请求
一、SpringMVC介绍
简介
SpringMVC百度百科
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架,如Struts1(现在一般不用),Struts 2(一般老项目使用)等等。
MVC设计模式
MVC即是:视图(View)、控制器(Controller)、模型(Model)
- 视图 对应组件:jsp或者HTML文件
- 控制器 对应组件:servlet
- 模型 对应组件:JavaBean
-
JSP Model1 -
JSP Model2
- JSP:负责生成动态网页
- Servlet:负责流程控制
- JavaBean:负责业务逻辑处理
JSP Model1与JSP Model2相比
Model1适合小型项目开发,结构简单,开发迅速。但是JSP页面相对复杂,不利于维护。
2、Model2适合大型项目开发,职责明确,而且适应变动的需求。
3、从模型上和时序图上很容易看出,Model2是在Model1的基础上,分离了控制,将业务逻辑处理分离出来。这样Model2相对来说便于维护。
———————————————— 版权声明:本文为CSDN博主「走出自己的未来」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/wpb92/article/details/51763404
MVC和三层架构的关系
因为同样是三层,许多人会认为他们之间会不会有着相等的关系。回答是:没有关系
具体可见文章
三层是从整个应用程序架构的角度来分的三层(如果程序需要,还可以分多层)。
三层是为了解决整个应用程序中各个业务操作过程中不同阶段的代码封装的问题,为了使程序员更加专注的处理某阶段的业务逻辑。
比如将数据库操作代码封装到dao(mapper)层中,提供一些方法根据参数直接返回用户需要的相应数据,这样在处理具体的业务逻辑的时候,就不用关心数据的存储问题了,而service层则用来处理业务逻辑, 例如你要实现转账业务,在dao层只需要update就行,传入参数(inUser,outUser,money),只需要关注与数据库之间的联系,而在service则需要判断转账的money是否为负值等问题。
MVC主要是为了解决应用程序用户界面的样式替换问题,把展示数据的 HTML 页面尽可能的和业务代码分离。MVC把纯净的界面展示逻辑(用户界面)独立到一些文件中(Views),把一些和用户交互的程序逻辑(Controller)单独放在一些文件中,在 Views 和 Controller 中传递数据使用一些专门封装数据的实体对象,这些对象,统称为Models。
只所以说MVC和三层毫无关系,是因为它们二者使用范围不同:三层可以应用于任何语言、任何技术的应用程序;而MVC只是为了解决BS应用程序视图层各部分的耦合关系。它们互不冲突,可以同时存在,也可根据情况使用其中一种。
三层架构是界面层(UI)业务逻辑层(BLL)和数据访问层(DAL)构成的,而MVC是模型层(M)界面层(View)和控制层(Controller)构成的,而且他们之间也不对应。
如果硬要给他们对应的话,那么三层架构中的UI对应MVC中的view(jsp),都是用于显示以及获取界面的数据;三层架构中的BLL层和DAL层对应MVC中的Model(javabean)层都是用于处理上层传递来的数据以及从数据库获取的数据的;MVC中的Controller(Servlet)最多算是三层架构中的UI的一部分,也就我们常说的是Servlet。
———————————————— 版权声明:以上为CSDN博主「曹胜欢」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/csh624366188/article/details/7183872
从模型上和时序图上很容易看出,Model2是在Model1的基础上,分离了控制,将业务逻辑处理分离出来。这样Model2相对来说便于维护。
MVC优点
- 多视图共享一个模型,大大提高代码的可重用性
- MVC三个模块相互独立,松耦合架构
- 控制器提高了应用程序的灵活性和可配置性
- 有利于软件工程化管理
MVC的缺点
- 原理复杂
- 增加了系统结构和实现的复杂性
- 视图对模型数据的低效率访问
SpringMVC架构
- 结构最清晰的MVC Model2实现
- Controller
- ModelAndView
二、Spring Mvc请求处理流程
三、Spring Mvc顺序执行
四、使用idea创建一个mvc项目
- 接下来一直下一步就行(选择名字和路径)
- 新建包
<!--servlet的jar-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>8.5.66</version>
</dependency>
<!--spring-context的jar-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.8</version>
</dependency>
<!--jstl标签库的jar-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--mvc的jar-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.9</version>
</dependency>
<!--日志输出的jar-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
配置application-springmvc.xml主配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!--1.扫描注解-->
<context:component-scan base-package="cn.*"/>
<!--2.开启mvc注解扫描-->
<!-- 配置注解驱动 可以将request参数与绑定到controller参数上 -->
<mvc:annotation-driven/>
<!--3.静态资源映射-->
<!--本项目把静态资源放在了webapp的statics目录下,资源映射如下-->
<mvc:resources mapping="/css/**" location="/static/css/"/>
<mvc:resources mapping="/js/**" location="/static/js/"/>
<mvc:resources mapping="/image/**" location="/static/images/"/>
<mvc:default-servlet-handler /> <!--这句要加上,要不然可能会访问不到静态资源,具体作用自行百度-->
<!--4.视图解析器 对视图前后缀的配置-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!--WEB-INF包下的资源只能通过controller才能找到-->
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>
日志输出文件log4j.properties配置
log4j.rootLogger=DEBUG,CONSOLE
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.smbms.dao=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
######################################################################################
# Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %d %c - %m%n
web.xml配置
注(一下版本不能识别jstl标签,更改为之后的):
<!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>
</web-app>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!--这个版本可以识别jstl标签-->
<display-name>Archetype Created Web Application</display-name>
<servlet>
<!--名字自定义-->
<servlet-name>springmvc</servlet-name>
<!--配置前端控制器-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--springmvc主配置文件-->
<param-value>classpath:applicationContext-springmvc.xml</param-value>
</init-param>
<!--越小启动级别越高-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!--拦截请求-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
load-on-startup详细解读
load-on-startup元素标记容器是否在启动的时候就加载这个servlet(实例化并调用其init()方法)。 2)它的值必须是一个整数,表示servlet应该被载入的顺序 3)当值为0或者大于0时,表示容器在应用启动时就加载并初始化这个servlet; 4)当值小于0或者没有指定时,则表示容器在该servlet被选择时才会去加载。 5)正数的值越小,该servlet的优先级越高,应用启动时就越先加载。 6)当值相同时,容器就会自己选择顺序来加载。
原文地址:https://www.cnblogs.com/penghq/p/7600888.html
url-pattern详细解读
< url-pattern>/</url-pattern> 会匹配到/login这样的路径型url,不会匹配到模式为*.jsp这样的后缀型url。 < url-pattern>/*</url-pattern> 会匹配所有url:路径型的和后缀型的url(包括/login,.jsp,.js和*.html等)。
创建一个controller测试
测试
五、配置解析
视图解析器配置
|