SpringMVC【学习笔记】

SpringMVC是什么?

Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web 框架,即使用了MVC架构模式的思想,将web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。

使用SpringMVC的好处

  • 让我们能非常简单的设计出干净的Web 层和薄薄的Web 层;

  • 进行更简洁的Web 层的开发;请求参数是映射到方法的参数上

  • 天生与Spring框架集成(如IoC容器、AOP等);

  • 提供强大的约定大于配置的契约式编程支持;

  • 能简单的进行Web 层的单元测试;

  • 支持灵活的URL到页面控制器的映射;

  • 非常容易与其他视图技术集成,如Velocity、FreeMarker 等等,因为模型数据不放在特定的API 里,而是放在一个Model里(Map 数据结构实现,因此很容易被其他框架使用);

  • 非常灵活的数据验证、格式化和数据绑定机制,能使用任何对象进行数据绑定,不必实现特定框架的API;

  • 提供一套强大的JSP标签库,简化JSP开发;

  • 支持灵活的本地化、主题等解析;

  • 更加简单的异常处理;

  • 对静态资源的支持;

  • 支持Restful风格。

SpringMVC的六大组件

1.前端控制器(DispatcherServlet):
用户请求到达前端控制器,它就相当于mvc模式中的C , dispatcherservlet是整个流程控制的中心,由它调用其它组件处理用户的请求,dispatcherservlet的存在降低了组件之间的耦合性。

2.Handler : 处理器
Handler是继DispatcherServlet前端控制器的后端控制器,在DispatcherServlet的控制下Handler对具体的用户请求进行处理。
由于Handler涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发Handler。

3.View : 视图
Spring MVC框架提供了很多的View视图类型的支持,包括:jstlView、freemarkerView、pdfView等。最常用的视图就是jsp。
通过页面标签或页面模版技术将模过页面展示给用户,需要由程序员根据业务需求开发具体的页面。

4.HandlerMapping:处理器映射器
HandlerMapping负责根据用户请求找到Handler处理器,spring MVC提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

5.HandlerAdapter:处理器适配器
通过HandlerAdapter对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

6.View Resolver:视图解析器
View Resolver负责将处理结果生成View视图,View Resolver首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成View视图对象,最后对View进行渲染将处理结果通过页面展示给用户。

流程图:
在这里插入图片描述
代码实现:
在这里插入图片描述

SpringMVC的请求与响应

@RequestMapping:使用@RequestMapping注解可以定义不同的处理器映射规则。

1. URL路径映射:

@RequestMapping(value=“/queryAll”)或@RequestMapping("/queryAll”)
value的值是数组,可以将多个url映射到同一个方法

2. 窄化请求映射

​ 在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
如下:

@RequestMapping放在类名上边,设置请求前缀

@Controller

@RequestMapping(“/user”)

方法名上边设置请求映射url:

@RequestMapping放在方法名上边,如下:

@RequestMapping("/queryAll ")

访问地址为:/user/queryAll .action

3. 限制Http请求方式
@RequestMapping(value=“url”,method = RequestMethod.GET)
例如:限定GET方法,如果通过Post访问则报错:
HTTP Status 405 - Request method ‘POST’ not supported

4.替换写法

Springmvc提供一组注解用于替换@RequestMapping注解的

  • @GetMapping get请求
  • @PostMapping post请求
  • @PutMapping put请求
  • @DeleteMapping delete请求

Controller的返回值

有两中处理方式:1.页面跳转2.响应数据

页面跳转:

1.直接返回字符串:此种方式会将返回的字符串与视图解析器的前后缀拼接后跳转

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。

真正视图(jsp路径)=前缀+逻辑视图名+后缀
在这里插入图片描述

可以指定跳转方式:redirect 重定向,forward 转发
例如:
在这里插入图片描述

2 返回ModelAndView对象
ModelAndView: 在request域存放数据, 设置逻辑视图名
默认情况: 经过视图解析器,找物理视图, 转发
使用关键字redirect或者forward时, 视图是不经过视图解析器的
代码演示:

@RequestMapping("/index1")
public ModelAndView toIndex1(){
    ModelAndView modelAndView = new ModelAndView();
   // 转发(forward)/重定向(redirect)关键字:逻辑视图名:  不经过视图解析器,要求逻辑视图是一个完整的url,
   // 视图可以是页面,也可以是处理器
    modelAndView.setViewName("redirect:/index.jsp");
    return modelAndView;
}
@RequestMapping("/index2")
public ModelAndView toIndex2(){
    ModelAndView modelAndView = new ModelAndView();
    modelAndView.setViewName("forward:/WEB-INF/views/index.jsp");
    return modelAndView;
}
@RequestMapping("/index3")
public ModelAndView toIndex3(){
    ModelAndView modelAndView = new ModelAndView();
    //直接写的逻辑视图名: 经过视图解析器,找物理视图, 转发
    modelAndView.setViewName("index");
    return modelAndView;
}

3.void 表示无返回

/**
     * 返回值是void, 默认使用 使用绑定的url作为逻辑视图名
     *  经过视图解析器,找物理视图, 转发
     */
    @RequestMapping("/test10")
    public void test11(){
        System.out.println("执行了test10");
    }

    @RequestMapping("/index")
    public void index(){ }

响应数据:

1.response对象:
通过SpringMVC框架注入的response对象,使用response.getWriter().print(“hello world”) 回写数据,此时不需要视图跳转,业务方法返回值为void。

@RequestMapping("/test4")
public void test4(HttpServletResponse response) throws IOException {
    response.getWriter().print("hello world");
}

2.@ResponseBody注解
将需要回写的字符串直接返回,但此时需要通过**@ResponseBody**注解告知SpringMVC框架,方法返回的字符串不是跳转,而是直接在http响应体中返回

@RequestMapping("/test5")
@ResponseBody
public String test5() throws IOException {
	return "hello springMVC!!!"; 
}

在异步项目中,客户端与服务器端往往要进行json格式字符串交互,我们需要导入jackson依赖,将复杂的java对象转换成json格式的字符串。

通过SpringMVC帮助我们对对象或集合进行json字符串的转换并回写,为处理器适配器配置消息转换参数,指定使用jackson进行对象或集合的转换,因此需要在spring-mvc.xml中进行如下配置:

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
   <property name="messageConverters">
       <list>
           <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>
       </list>
   </property>
</bean>

补充

< !–mvc的注解驱动–>
mvc:annotation-driven/
它会帮我们自动配置SpringMVC的三大组件处理器映射器处理器适配器视图解析器
使用mvc:annotation-driven默认底层就会集成jackson进行对象或集合的json格式字符串的转换。

SpringMVC获取请求数据

springmvc中,接收页面提交的数据是通过方法形参来接收。而不是在controller类定义成员变更接收
在这里插入图片描述

1.默认支持数据类型
直接在controller方法形参上定义下边类型的对象,就可以使用这些对象。在参数绑定过程中,如果遇到下边类型直接进行绑定。

  • HttpServletRequest 请求对象
  • HttpServletResponse 响应对象
  • HttpSession session对象
  • Model/ModelMap Model是一个接口,ModelMap是一个接口实现 。作用:将model数据填充到request域。

2 简单数据类型
Controller中的业务方法的参数名称要与请求参数的name一致,参数值会自动映射匹配。
例如:
请求:http://localhost:8080/test8?username=zhangsan&age=12

@RequestMapping("/test8")
@ResponseBody
public void test8(String username,int age) throws IOException {
	System.out.println(username);
	System.out.println(age);
}

当请求的参数名称与Controller的业务方法参数名称不一致时,就需要通过@RequestParam注解显示的绑定
例如:
http://localhost:8080/test8?username=zhangsan&age=12

@RequestMapping("/test8")
@ResponseBody
public void test8(@RequestParam("username")String name,int age) throws IOException {
	System.out.println(name);
	System.out.println(age);
}

注解@RequestParam还有如下参数可以使用:

  • value:与请求参数名称

  • required:此在指定的请求参数是否必须包括,默认是true,提交时如果没有此参数则报错

  • defaultValue:当没有指定请求参数时,则使用指定的默认值赋值

3.获得POJO类型参数
Controller中的业务方法的POJO参数的属性名与请求参数的name一致,参数值会自动映射匹配。

4.自定义类型转换器
自定义类型转换器的使用步骤:

  1. 定义转换器类实现Converter接口
  2. 在配置文件中声明转换器
  3. <mvc:annotation-driven>中引用转换器

5 获得数组类型参数
Controller中的业务方法数组名称与请求参数的name一致,参数值会自动映射匹配。
请求:http://localhost:8080/test10?ids=1001&ids=1002&ids=1003

@RequestMapping("/test10")
@ResponseBody
public void test10(Integer[] ids) throws IOException {
	System.out.println(Arrays.asList(ids));
}

6 获得集合类型参数
注意:使用List接收页面提交的批量数据,通过包装类接收,在包装类中定义list属性

补充:

web.xml中的 < url-pattern > < /url-pattern> 的注意事项:
写法:
1. 前缀配置: /前缀名/* 比如: /api/*
2. 后缀配置: *.后缀名 比如: *.do *.action
3. / * 所有的请求经过前端控制器, 错误的, 访问jsp,经过前端控制器
通过处理器映射器根据url找处理器, jsp是一个页面, 找不到, 报404
4. / 所有的请求经过前端控制器,除jsp, restFul配置:注意:
访问静态资源,经过前端控制器,通过处理器映射器根据url找处理器, 找不到,报404
5.访问静态资源,需要在springmvc.xml中配置默认静态资源处理器< mvc:default-servlet-handler/ >

6.手动映射静态资源:使用资源映射 访问的url与本地的路径一 一映射
mapping: url /pages/ * * : / * *: 该目录以及所有后台目录
location: 本地路径 /pages/
注意: controller前缀的url不能与静态资源的路径一样
例如
<mvc:resources mapping=“/pages/ * *” location=“/pages/”/>
<mvc:resources mapping=“/css/ * *” location=“/css/”/>
<mvc:resources mapping=“/images/ * *” location=“/images/”/>

补充

@Controller注释类中的每个@RequestMapping注释方法最终都将转向 HandlerMethod 类(而这个类才是SpringMVC 注解开发方式的真正处理器)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值