SpringMVC学习笔记

7 篇文章 0 订阅

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三大组件

  1. 处理器映射器:HandlerMapping:用来解析请求url,解析出控制器,从而映射控制器
  2. 处理器适配器:HandlerAdapter:调度Controller来处理业务逻辑等
  3. 视图解析器: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.请求参数的绑定

绑定的机制:

  1. 表单提交的请求参数都是key=value 格式的,如username=haha&password=123

  2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的

  3. 要求:提交表单的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;
   }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值