SpringMVC学习笔记(一)
一、SpringMVC概述
1.概念
SpringMVC是一种基于Java的MVC设计模型的请求驱动类型的轻量级Web框架,属于Spring Framework的后续产品,已经融合在Spirng Web Flow中。使用Spring可插入的MVC架构,从而在使用Spring进行WEB开发时,可以选择SpringMVC或其他MVC集成开发框架,如Strut1(基本弃用),Struts2等。
SpringMVC已经成为最主流的MVC框架之一,并随着Spring3.0的发布,全面超越Struts2,成为最优秀的MCVC框架。
SpringMVC通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口。
SpringMVC支持RESTful编程风格的请求。
2.优势
1、清晰的角色划分:
前端控制器(DispatcherServlet)
请求到处理器映射(HandlerMapping)
处理器适配器(HandlerAdapter)
视图解析器(ViewResolver)
处理器或页面控制器(Controller)
验证器( Validator)
命令对象(Command 请求参数绑定到的对象就叫命令对象)
表单对象(Form Object 提供给表单展示和提交到的对象就叫表单对象)。
2、分工明确,而且扩展点相当灵活,可以很容易扩展,虽然几乎不需要。3、由于命令对象就是一个 POJO,无需继承框架特定 API,可以使用命令对象直接作为业务对象。
4、和 Spring 其他框架无缝集成,是其它 Web 框架所不具备的。
5、可适配,通过 HandlerAdapter 可以支持任意的类作为处理器。
6、可定制性,HandlerMapping、ViewResolver 等能够非常简单的定制。
7、功能强大的数据验证、格式化、绑定机制。
8、利用 Spring 提供的 Mock 对象能够非常简单的进行 Web 层单元测试。
9、本地化、主题的解析的支持,使我们更容易进行国际化和主题的切换。
10、强大的 JSP 标签库,使 JSP 编写更容易。
3.SpringMVC与Struts2的比较(面试)
共同点:
1)都是表现层框架,都是基于MVC模型编写的
2)底层都离不开原始ServletAPI
3)处理请求的机制都是一个核心控制器
不同点:
1)SpringMVC的入口是Servlet,Struts2的入口是Filter
2)SpringMVC执行速度稍快。SpringMVC是基于方法设计的,而Struts2是基于类,每次执行都会动态创建一个动作类
3)SpringMVC的使用更加简洁,同时还支持JSR303,处理ajax的请求更方便
4)Struts2由于支持OGNL表达式,其开发效率更高,但是执行效率并没有SpringMVC高
二、SpringMVC入门程序
言归正传,接下来我们开始编写SpringMVC的入门程序。前四步为环境搭建,后两步为程序编写
1.创建Maven项目
打开IDEA,创建一个Maven的web-app项目。并在src目录下创建一个java目录(标记目录类型为:Sources Root)与一个resources目录(标记目录类型为Resources Root)
2.配置pom.xml,导入jar包坐标
在<properties>中,添加版本锁定
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- 版本锁定 -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
在<dependencies>添加以下依赖
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</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>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
3.配置web.xml,获取servlet核心控制器
<!-- 配置SpringMVC核心控制器-->
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!-- 配置初始化参数,用于读取SpringMVC的配置文件 -->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
<!-- 配置Servlet对象的创建时间:应用加载时创建。
取值只能是非0正整数,表示启动顺序-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
4.创建SpringMVC配置文件
首先在Resources目录下创建springmvc.xml,然后所需的导入约束,最后配置创建Spring容器要扫描的包、视图解析器、处理映射器、处理适配器。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
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/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 开启注解扫描 -->
<context:component-scan base-package="cn.itcast"></context:component-scan>
<!-- 配置视图解析器 -->
<bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/pages/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 开启SpringMVC框架注解的支持-->
<mvc:annotation-driven/>
</beans>
5.编写Controller方法并使用注解配置
@Controller("helloController")
public class HelloController {
@RequestMapping("/hello")
public String sayHello() {
System.out.println("HelloController 的 sayHello 方法执行了。。。。");
return "success";
}
}
6.用jsp
<html>
<head>
<title>Title</title>
</head>
<body>
<h3>入门程序</h3>
<a href="hello">入门程序</a>
</body>
</html>
三、入门案例流程分析
1.服务器启动,加载web.xml配置,创建DispatcherServlet对象
2.加载springmvc.xml文件,创建SprigIOC容器,视图解析器,处理映射器,处理适配器等
3.浏览器发送请求,被DispatcherServlet捕获,并转发给处理映射器,匹配@RequestMapping注解内容,获取应该执行的方法(HelloController类中的sayHello方法)。
4.通过处理适配器,执行已获取的方法,并返回方法的返回值(success)
5.DispatcherServlet再将返回值交给视图解析器处理,得到一个结果视图(success.jsp)
6.渲染结果视图,相应浏览器
四、入门案例设计的SpringMVC组件
1.DispatcherServlet:前端控制器
用户请求到达前端控制器,它就相当于 mvc 模式中的 c,dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求,dispatcherServlet 的存在降低了组件之间的耦合性。
2.HandlerMapping:处理映射器
HandlerMapping 负责根据用户请求找到 Handler 即处理器,SpringMVC 提供了不同的映射器实现不同的 映射方式,例如:配置文件方式,实现接口方式,注解方式等
3.HandlerAdapter:处理适配器
通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。
4.ViewResolver:视图解析器
View Resolver 负责将处理结果生成 View 视图,View Resolver 首先根据逻辑视图名解析成物理视图名 即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户
5.<mvc:annotation-driven>说明
在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。
使用mvc:annotation-driven自动加载 RequestMappingHandlerMapping(处理映射器)和 RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用 mvc:annotation-driven替代注解处理器和适配器的配置。
五、RequestMapping注解
1.出现位置
由于@RequestMapping的元注解@Target中包含了ElementType.Method和ElementType.TYPE,所以此注解可以出现在方法或者类上
2.value与path属性
value与path是等价的,都用于指定执行此方法的获取路径
3.method属性
用于指定请求的方式,常见的值有RequestMethod.POST、RequestMethod.GET、RequestMethod.PUT、RequestMethod.DELETE等
4.param属性
用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
例如:
params = {“accountName”},表示请求参数必须有 accountName
params = {“moeny!100”},表示请求参数中 money 不能是 100。
5.headers属性
用于指定限制请求消息头的条件