SpringMVC基础知识
一,MVC设计模式
- 视图层(View):负责格式化数据并把它们呈现给用户,包括数据展示、用户交互、数据验证、界面设计等功能。
- 控制层(Controller):负责接收并转发请求,对请求进行处理后,指定视图并将响应结果发送给客户端。
- 数据模型层(Model):模型对象拥有最多的处理任务,是应用程序的主体部分,它负责数据逻辑(业务规则)的处理和实现数据操作(即在数据库中存取数据)。
MVC应该是耳熟能详的基本知识,从最开始学习JavaEE开始,最早接触的就是JSP+JavaBean的开发模式,JSP 用于处理用户请求,JavaBean 用于封装和处理数据。
学过JSP+JavaBean之后又接触Servlet+JSP+JavaBean的开发模式
Servlet+JSP+JavaBean 模式的结构清晰,是一个松耦合架构模式
我记得在这这本书,里面说Servlet消灭了大量的JSP中的代码,在实际学习过程中确实深有体会(但是仍然不能否认这是本十八流教材)。
二.SpringMVC的特点
为了使Spring可插入的MVC架构,SpringFrameWork在Spring基础上开发SpringMVC框架,从而在使用Spring进行WEB开发时可以选择使用Spring的SpringMVC框架作为web开发的控制器框架。
需要注意的是Spring基础上开发的框架所以在环境依赖就会有Spring的身影,并且在SpringMVC使用过程中会出现很多Spring 的设计思想(只是在学完配置环境时候的想法)
在C语言中文网教程中给出了Spring MVC 是结构最清晰的 Servlet+JSP+JavaBean 的实现,是一个典型的教科书式的 MVC 构架的评价
优点有
- 清晰地角色划分,Spring MVC 在 Model、View 和 Controller 方面提供了一个非常清晰的角色划分,这 3 个方面真正是各司其职,各负其责。
- 灵活的配置功能,可以把类当作 Bean 通过 XML 进行配置。
- 提供了大量的控制器接口和实现类,开发者可以使用 Spring 提供的控制器实现类,也可以自己实现控制器接口。
- 真正做到与 View 层的实现无关。它不会强制开发者使用 JSP,可以根据项目需求使用 Velocity、FreeMarker 等技术。
- 国际化支持
- 面向接口编程
- 与 Spring 框架无缝集成
说这么多,好用就完事儿了,比之前直接使用Servlet开发又快又优雅
三.SpringMVC的运行流程
1.请求:从客户端来的信息到达DispatcherServlet,DispatcherServlet拦截所有请求发送给处理器映射
2.解析:数据从DispatcherServlet到处理器映射就是处理url中的信息,比如/后面的名字,比如/Sayhello 它会解析到Sayhello这个Controller,包括多种Controller跳转,如/Hello/Sayhello。
3.返回Controller信息,包括名字和参数。
4.传递Controller信息到处理器适配器,它会检索控制器。选择合适参数的对应控制器
5.根据处理器适配器的信息,发送信息到控制器
6.控制器做好数据处理,通常的步骤有
-
收集数据
-
调用业务对象
-
响应处理
做好处理之后会带着视图和数据模型(就是需要返回给用户并在浏览器上显示的信息,通常还会格式化)返回给处理器适配器
7.处理器适配器处理好视图名字(也就是return的字符串)给DispatcherServlet
8.DispatcherServlet带着视图名字给视图解析器,它会检索视图(比如JSP,HTML之类的),之后组装成URL.。
9.数据返回给DispatcherServlet
10.DispatcherServlet带着数据模型和URL组装成视图
11.响应:程序作出响应也就时我们看到了网页响应
注:SpringMVC的三大组件:处理器适配器,视图解析器,处理器映射器
四,第一个SpringMVC程序
1.环境配置
1.项目的创建
(坑)选择Module Webapp,注意不要选错了,是Maven标准的
(坑)在此处可以最好更换为自己的仓库,以及加上archetypeCatalog=internal 否则构建项目极慢(因为下载不了某个配置文件)
创建好项目之后记得补全Maven标准目录
2.插件的准备
为了提高效率和心情愉悦,必须安排JRebel等热部署插件,大大缩短编码等待时间
由于插件收费,作为初学者实在负担不起
所以如下步骤激活
1.生成一个GUID
可以使用这个地址获取Generate GUIDs online (guidgen.com)
2.根据反向代理服务器地址拼接激活地址
服务器地址: https://jrebel.qekang.com/{GUID}
如果失效刷新GUID替换就可以
来自:博客园-工匠精神
3.Tomcat的配置
在这里直接选择Tomcat即可,进入后选择自己的项目部署,不多说了。
4.Maven依赖
之前提到过需要Spring依赖,所以Spirng必须有再加上Spring-MVC和Spring-web以及Servlet-api,由于maven的特性会自动的下载相互依赖的Jar包所以只需要添加 SpringMVC和Servlet的依赖
2.配置SpringMVC
1.web.xml中配置DispatcherServlet
如下配置
<servlet>
<!--配置Servlet -->
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<!--确定Spring配置文件 此处使用了通配的写法-->
<param-value>classpath:/SpringMVC/SpringMvc_*.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<!--指定相对于Servlet的URL的路径,此处特别注意!-->
<url-pattern>/</url-pattern>
</servlet-mapping>
细节:在指定指定相对于Servlet的URL的路径时,SpringMVC使用的是“/”,而不是“/*”
/ 模式下,Servlet不会拦截 .jsp(仅限于此,.html仍会被拦截)格式的请求;
而 /* 模式才是真正意义上的拦截所有形式的请求。
查看Tomcat的配置文件
发现web容器拦截了.jsp(Tomcat默认的servlet)
所以使用/*会发现转发不了页面,出现404
2.配置SpringMVC_config.xml
SpringMVC是Spring的衍生产品,所以使用和Spring 一样的DTD即可,由于idea的自带模板不全所以直接用下面的DTD
<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-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<beans/>
开发SpringMVC使用注解开发所以需要加入注解扫描、
<!--注解扫描-->
<context:component-scan base-package="#方式自定"/>
<!--创建处理器映射器-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" id="requestMappingHandlerMapping"/>
<!--c'jian-->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" id="requestMappingHandlerAdapter"/>
<!--创建视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<!--也就是转发到什么样的页面,比如页面的逻辑名字(Cotroller返回的字符串)为index则组装出来的Url为 /index.jsp-->
<!--组装前缀-->
<property name="prefix" value="/"/>
<!--组装后缀-->
<property name="suffix" value=".jsp"/>
</bean>
配置方案mvc:annotation-driven
但是SpringMVC加入< mvc:annotation-driven/>配置方案,可以让初学都快速应用默认配置方案,包括了
- 会自动注册RequestMappingHandlerMapping与RequestMappingHandlerAdapter
- 提供了数据绑定支持
- @NumberFormatannotation支持,@DateTimeFormat支持,@Valid支持读写XML的支持(JAXB)和读写JSON的支持(默认Jackson)等功能
所以我们可以写成
<context:component-scan base-package="#方式自定"/>
<mvc:annotation-driven/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver">
<property name="prefix" value="/"/>
<property name="suffix" value=".jsp"/>
</bean>
3.编写Controller
1.@Controller和@RequestMapping
@Controller:是@Component的衍生注解,作用是创建对象
@RequestMapping:是请求路径,其中有个值为value,用于指定某个Controller的位置
- 修饰范围: 用在方法或者类上
- 注解作用: 用来指定类以及类中方法的请求路径
- 注解位置:注解在类上则给所有方法给了一个统一的请求路径,在访问方法时需要加上类的路径
2.编写控制器类
@Controller("test")
//加在类上以后先访问类
//@RequestMapping(value = "HelloGroup")
public class TestController {
@RequestMapping(value = "Sayhello")
public String SayHello(){
System.out.println("TestController.SayHello");
//页面逻辑名字
return "index";
}
}
3.测试
我们输入一下URL
可以看见正常转发
接着取消第三行注释
发现转发失败
再接着加上类的访问路径
又可以看见正常转发