SpingMVC框架知识

1.简介

SpringMVC 又名Spring Web MVC 是一种基于Java实现的MVC设计模型的轻量级Web框架。
SpingMVC就是对Servlet的封装,简化了Servlet的开发。
SpingMVC主要作用:1.接受请求。2.响应数据
SpingMVC的特点:1.使用一套注解就可以使得简单Java类变成处理请求的控制器;2.支持RESTful风格编程的请求

2.SpringMVC的工作流程

2.1 SpringMVC的请求处理流程

  1. 用户发送请求至前端控制器DispatcherServlet(整个流程的老大)
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器
  3. 处理器映射器根据请求Url找到具体的Handler(后端控制器),生成处理器对象及处理器拦截器(如果有则生成)一并返回DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器去调用Handler
  5. 处理器适配器HandlerAdapter执行Handler
  6. Handler执行完成给处理器适配器返回ModelAndView
  7. HandlerAdapter 向DispatcherServlet 返回ModelAndView (ModelAndView是SpingMVC框架的一个底层对象,包括Model和View)
  8. DispatcherServlet 请求视图解析器ViewResovler去进行视图解析,根据逻辑视图名来解析真正的视图。
  9. 视图解析器向前端控制器返回View
  10. 视图渲染将模型数据填充到request域中。
  11. 响应

2.2 SpringMVC九大组件

  1. HandlerMapping(处理器映射器)
    作用:用于查找Handler(处理器)和Interceptor(拦截链)。具体的表现形式可以是类,也可以是⽅法【被@RequestMapping 标注的方法可看做是一个handler】
  2. HandlerAdapter(适配器)
    由于不同形式的Handler(可以是类也可以是方法,还有接受的参数不同),把请求交给 Servlet 的时候,由于 Servlet 的⽅法结构都是doService(HttpServletRequest req,HttpServletResponse resp)形式的,要让固定的 Servlet 处理⽅法调⽤ Handler 来进⾏处理。
  3. HandlerExceptionResolver
    处理handler中产生的异常
  4. ViewResolver
    将物理视图名修改,在xml中添加前后缀标签变成逻辑视图名
  5. RequestToViewNameTranslator
    从请求url中获取 ViewName,ViewResolver需要根据ViewName获取view,在handle返回ModelAndView时需要设置ViewName.
  6. LocaleResolver
    国际化
  7. ThemeResolver
    样式相关
  8. MultipartResolver
    文件上传相关
  9. FlashMapManager
    FlashMap重定向时参数传递

3.请求参数绑定

3.1 url-pattern 三种拦截方式

1. 带后缀的 *.   如:*.action; *.do; 这种拦截比较精确
2. /  不拦截.jsp。但会拦截.html等静态资源(除了servlet和jsp之外的 js,css,png等)
3. /* 拦截所有 

3.1.1 /拦截静态资源缘由

为什么 /会拦截静态资源?
答:因为Tomcat容器中有web.xml(父),你的项目中也有一个WEB-INF/web.xml
父web.xml中有一个DefaultServlet, url-pattern 是一个 /。我们自己的web.xml中也配置了一个 / ,覆写了父web.xml的配置
在这里插入图片描述
为什么/不会拦截.jsp
Tomcat的web.xml有JspServlet,没有覆写父web.xml的这个servlet就不会被拦截。对于jsp的处理交给Tomcat处理

3.1.2 解决/ 拦截静态资源

在resource资源根目录下的xml文件中

方案一:
   /* 原理:添加该标签配置之后,会在SpringMVC上下文中定义一个DefaultServletHttpRequestHandler对象
         这个对象如同一个检查人员,对进入DispatcherServlet的url请求进行过滤筛查,如果发现是一个静态资源请求
         那么会把请求转由web应用服务器(tomcat)默认的DefaultServlet来处理,如果不是静态资源请求,那么继续由
         SpringMVC框架处理*/
    <mvc:default-servlet-handler/>

方案二: 
/*		静态资源配置,方案二,SpringMVC框架自己处理静态资源
        mapping:约定的静态资源的url规则
        location:指定的静态资源的存放位置*/
    <mvc:resources location="classpath:/"  mapping="/resources/**"/>

3.2 参数绑定

对于原生servlet ,在接受参数时需要进行一些操作,比如接受整型

String ageStr = request.getParameter("age");
Integer age = Integer.parseInt(ageStr);

而SpringMVC框架对Servlet的封装 简化了许多操作。

@RequestMapping
public String Handle(Integer age){}

常见接受参数的形式:

  1. 支持原生的Servlet对象(HTTPServletRequest,HTTPServletResponse,HttpSession)
  2. 简单数据类型(八大基本类型推荐使用包装数据类型),需要形参名与请求参数名一致,也可在handle请求参数中加@RequestParam(“请求参数名”),加了此注解参数名可不一致。
  3. 对于布尔类型的参数 请求参数为true/false或者1/0
  4. 接受pojo类型参数,形参名无所谓,但要保证请求参数里的属性名必须和Pojo的属性名一致。(找属性对应的set方法,用反射塞值),如果有嵌套情况,pojo中有对象,使用属性名+ . 对象属性的方式锁定。
  5. 日期类型,前端传String类型的,后端以Date类型无法接受,可通过自定义类型转换器(xxx器通常操作是实现接口,注册到容器 ,关联使用)

实现转换器接口 Converter<S, T>

import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        // 完成字符串向日期的转换
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");

        try {
            Date parse = simpleDateFormat.parse(source);
            return parse;
        } catch (ParseException e) {
            e.printStackTrace();
        }

        return null;
    }
}

注册实现的转换器,需要在处理器映射器中关联handle方法与转换器

   <!--注册自定义类型转换器-->
    <bean id="conversionServiceBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.edu.converter.DateConverter"></bean>
            </set>
        </property>
    </bean>
    
   <!--自动注册最合适的处理器映射器  这里将转换器与handle关联-->
   <mvc:annotation-driven conversion-service="conversionServiceBean"/> 

handle方法接受前端的String类型日期

@RequestMapping("/handle06")
    public ModelAndView handle06(Date birthday) {
        Date date = new Date();ModelAndView modelAndView = new ModelAndView();
        modelAndView.addObject("date",date);
        modelAndView.setViewName("success");
        return modelAndView;
    }

4.RestFul风格支持

4.1什么是RestFul风格

资源 ; 表现层; 状态转义;
没有Rest话:
原来Url设计中定义了动作,参数具体锁定到操作是谁、
如:http://localhost:8080/user/queryUserById.action?id=3
有了Rest:
Rest认为互联⽹中的所有东⻄都是资源,既然是资源就会有⼀个唯⼀的uri标识它,代表它,如:http://localhost:8080/user/3

Rest 风格带来的直观体现就是参数可以在uri中了。
/account/1 HTTP DELETE:删除 id = 1 的 account

根据请求⽅式不同,代表要做不同的操作
get 查询,获取资源
post 增加,新建资源
put 更新
delete 删除资源

4.2 SpringMVC对RESTFul风格的支持

  1. RESTFul 风格URL
    上述所说的参数可以在uri中,用@PathVariable 接受URL中路径参数。
  2. RESTFul 风格资源操作
    主要使用 Post和 Get 操作资源。Delete,Put操作可通过过滤器转换成Post

5.前后端交互

  1. @RequestBody : 前端发送Json请求,后端可用此注解接收为pojo参数。
  2. @ResponseBody: 后端向前端返回pojo对象,使用此注解前端可接收为Json对象或字符串。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值