1.SpringMVC的基本概念
三层架构
MVC 模型
MVC 全名是 Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,是一种用于设计创建 Web 应用程序表现层的模式。
Model(模型):通常指的就是我们的数据模型。作用一般情况下用于封装数据。
View(视图):通常指的就是我们的 jsp 或者 html。作用一般就是展示数据的。通常视图是依据模型数据创建的。
Controller(控制器):是应用程序中处理用户交互的部分。作用一般就是处理程序逻辑的。
SpringMVC
SpringMVC 是一种基于 Java 的实现 MVC 设计模型的请求驱动类型的轻量级 Web 框架,通过一套注解,让一个简单的 Java 类成为处理请求的控制器,而无须实现任何接口。
Spring MVC的工作是要依赖整个Spring的。
springMVC三大组件
- 处理器映射器:HandlerMapping:用来解析请求url,解析出控制器,从而映射控制器
- 处理器适配器:HandlerAdapter:调度Controller来处理业务逻辑等
- 视图解析器:ViewResolver:解析DispatcherServlet传递的逻辑视图名,并将解析结果传回给DispatcherServlet。
DispatcherServlet就是所谓的SpringMVC前端控制器,作为整个SpringMVC的控制中心,是调度的核心,处理器映射器,视图解析器,业务处理器都要被前端控制器所调配。
Spring MVC工作流程
1.用户在客户端向DispatcherServlet发送请求。
2.DispatcherServlet接受到请求后调用处理器映射器映射对应的Controller。
3.处理器映射器返回映射到的Controller给DispatcherServlet。
4.DispatcherServlet通过得到的Controller来调用处理器。
5.Controller根据请求调用相应的业务逻辑Service。
6.Service调用数据访问层。
7.Service抽取数据模型。
8.Service把数据模型返回给Controller。
9.Controller包装数据返回给DispatcherServlet一个ModelAndView。
10.DispatcherServlet根据得到的ModelAndView调用视图解析器。
11.视图解析器返回一个指定格式的视图。
12.DispatcherServlet把得到的视图forward到JSP页面。
13.JSP页面响应用户的请求并显示到客户端。
2.请求路径匹配
@RequestMapping
注解:建立请求URL和处理方法之间的对应关系
@RequestMapping
注解可以作用在方法和类上
作用在类上:第一级的访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。它出现的目的是为了使我们的 URL 可以按照模块化管理。
作用在方法上:第二级的访问目录。
@RequestMapping
的属性:
path 指定请求路径的url
value value属性和path属性是一样的
mthod 指定该方法的请求方式
params 指定限制请求参数的条件
headers 发送的请求中必须包含的请求头
以上四个属性只要出现 2 个或以上时,他们的关系是与的关系
3.请求参数的绑定
绑定的机制:
表单提交的请求参数都是key=value 格式的,如username=haha&password=123
SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
要求:提交表单的key-name和控制器方法的参数的名称是相同的
支持的数据类型:
1.基本类型和 String 类型:请求参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
2.POJO(JavaBean)类型:JavaBean类型的参数,要想实现绑定,就必须实现其空参构造函数和所有属性的get,set方法
若JavaBean参数的属性中只包含基本数据类型和String类型属性,以属性名作为请求参数名
若JavaBean参数的属性中包含其它JavaBean对象,则以
外层类属性名.内层类属性名
作为请求参数3.集合类型
对于List类型参数,其请求参数名为
集合名[下标]
对于 Map 类型参数,其请求参数名为
集合名[键]
自定义类型转换:
自定义的类型转换器要实现Converter<String, T>
接口,并在Spring容器配置bean.xml
中配置该实现类. 示例如下:在工程的java
目录下创建控制器类StringToDateConverter
类,实现Converter<String, Date>
接口,完成从String
类到Date
类的转换。
<!-- 配置类型转换器工厂 -->
<bean id="converterService"
class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器 -->
<property name="converters">
<array>
<!-- 配置自定义类型转换器 -->
<bean class="org.example.utils.StringToDate"></bean>
</array>
</property>
</bean>
通过原始ServletAPI对象处理请求
SpringMVC 还支持使用原始 ServletAPI 对象作为控制器方法的参数。支持原始 ServletAPI 对象有:
HttpServletRequest,HttpServletResponse,HttpSession,java.security.Principal,Locale,InputStream,OutputStream,Reader,Writer
可以把上述对象,直接写在控制的方法参数中使用
4.常用的注解
@RequestParam
:把请求中的指定名称的参数传递给控制器中的形参赋值
属性value:请求参数中的名称
属性required:请求参数中是否必须提供此参数,默认值是true,必须提供
@RequestBody
:用于获取请求体内容。直接使用得到是 key=value&key=value…结构的数据(get 请求方式不适用)
@PathVaribale
:绑定URL占位符,支持REST风格URL
例如:请求 url 中 /delete/{id},这个{id}就是 url 占位符。
属性value:用于指定 url 中占位符名称。
属性required:是否必须提供占位符。
例如以下的请求和方法:
<a href="account/findAccount/10">查询账户</a>
// 控制器类
@Controller
@RequestMapping(path = "/account")
public class HelloController {
@RequestMapping("/findAccount/{id}")
public void findAccount(@PathVariable(name = "id") Integer accountId) {
// accountId = 10
// 方法体...
}
}
访问URLhttp://localhost:8080/myProject/account/findAccount/10
会将10
传给findAccount
方法的accountId
参数.
REST风格URL补充
HTTP 协议里面,四个表示操作方式的动词:GET 、POST 、PUT、DELETE。它们分别对应四种基本操作:GET 用来获取资源,POST 用来新建资源,PUT 用来更新资源,DELETE 用来删除资源。
restful 的示例::
/account/1 HTTP GET : 得到 id = 1 的 account
/account/1 HTTP DELETE: 删除 id = 1 的 account
/account/1 HTTP PUT: 更新 id = 1 的 account
/account HTTP POST: 新增 account
@RequestHeader
:获取请求消息头
@CookieValue
:把指定 cookie 名称的值传入控制器方法参数
@ModelAttribute
:用于修饰方法和参数,出现在方法上,表示该方法是一个预处理方法,当前方法会在控制器的方法执行之前先执行;出现在参数上,获取指定的数据给参数赋值。
应用场景:当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
例如:在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会会把该字段内容置为 null,此时就可以使用此注解解决问题。
5.响应数据和结果视图
所需数据结构:
Model:spring自动为Model创建实例,并作为controller的入参
ModelMap:spring框架自动创建实例并作为controller的入参
ModelAndView:ModelAndView的实例是开发者自己手动创建的
通过控制器方法返回值指定返回视图
控制器返回String
对象:与string对应的jsp视图
@RequestMapping(value="/list-books")
private String getAllBooks(Model model){
logger.error("/list-books");
List<Book> books= bookService.getAllBooks();
model.addAttribute("books", books);
return "BookList";
}
在jsp页面利${books}即可取出其中的值 BookList.jsp
控制器返回void
:转发到当前URL
控制器返回ModelAndView
对象: 更灵活地添加属性和指定返回视图
主要方法:
public ModelMap getModelMap()
: 返回当前页面的ModelMap
对象.
public ModelAndView addObject(Object attributeValue)
: 向当前页面的ModelMap
对象中添加属性
public void setViewName(@Nullable String viewName)
: 指定返回视图,viewName
会先被视图解析器处理解析成对应视图.
例如
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView() {
// 创建ModelAndView对象
ModelAndView mv = new ModelAndView();
// 向model中存入属性attribute_user
mv.addObject("attribute_user", new User("张三", "123"));
// 指定返回视图,视图解析器将"success"解析为视图URL /WEB-INF/pages/succeess.jsp
mv.setViewName("success");
return mv;
}
}