springMVC介绍与使用

一 springMVC简介

SpringMVC 是一种基于Java实现的MVC设计模型的请求驱动类型的轻量级WEB层框架。用于替代Web层里面的Servlet的相关代码,核心流程是获得请求参数,调用业务,进行响应。

二springMVC流程与原理分析

1 流程

在pom文件中导入坐标后,配置核心控制器dispatcherServlet,对应web请求的url,

<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:applicationContext.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>

接着配置spring的相关xml,加载MVC注解驱动,配置视图解析器,对应服务器的响应。

     http://www.springframework.org/schema/context/spring-context.xsd">
    <!--1. 配置spring创建容器时要扫描的包 -->
    <context:component-scan base-package="com.itheima"></context:component-scan>
    
    <!--2. 加载mvc注解驱动-->
    <mvc:annotation-driven />
    <!--3. 配置视图解析器 -->
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

使用时,在web层controller代码里加入注解,

@Controller
public class HelloController {

    @RequestMapping(value="/hello/sayHello")
    public String sayHello(){
        System.out.println("HelloController 的 sayHello 方法执行了。。。。 ");
        return "success";
    }
}

  1. "参数名=参数值&参数名=参数值&参数名=参数值"---->参数类型form-data: get请求

  2. "参数名=参数值&参数名=参数值&参数名=参数值"----->x-www-form-urlencoded: 表单post方式提交

    • 1.1 以单个参数接收: 在处理请求的方法中添加参数,保证方法的参数名和请求参数名一致就行 springmvc对一些常用的类型,内置有转换器

    • 1.2 以对象接收

      • 1.2.1 POJO 对象,在处理请求的方法中添加一个POJO类型的参数,保证POJO中的参数名和要接收的参数名对应

      • 1.2.2 Map 对象(map的key就是参数名,map的value就是参数值只能是String类型) 必须在参数前添加上RequestParam注解

      • 1.2.3 接收多个同名的请求参数,直接封装到List中,此时要在List类型的参数前添加RequestParam注解

 
@RequestMapping中value代表对应的url。返回的“success”会被视图解析器找到对应的响应。
2 原理分析
1、服务器启动,应用被加载。 读取到 web.xml 中的配置创建 spring 容器并且初始化容器中的对象。
2、浏览器发送请求,被 DispatherServlet 捕获,该 Servlet 并不处理请求,而是把请求转发出去。转发的路径是根据请求 URL,匹配@RequestMapping 中的内容。
3、匹配到了后,执行对应方法。该方法有一个返回值。
4、根据方法的返回值,借助 InternalResourceViewResolver 找到对应的结果视图。
5、渲染结果视图,响应浏览器

  • DispatcherServlet:前端控制器(最重要最关键)

    用户请求到达前端控制器,它就相当于 mvc 模式中的 c, dispatcherServlet 是整个流程控制的中心,由 它调用其它组件处理用户的请求, dispatcherServlet 的存在降低了组件之间的耦合性(符合面向对象设计的"迪米特法则")。

  • HandlerMapping:处理器映射器

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

  • Handler:处理器 (自己写的Controller类)

    它就是我们开发中要编写的具体业务控制器。由 DispatcherServlet 把用户请求转发到 Handler。由 Handler 对具体的用户请求进行处理。

  • HandlAdapter:处理器适配器

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

  • View Resolver:视图解析器:将Controller返回的字符串,解析成具体的视图对象

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

  • View:视图

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

<mvc:annotation-driven> 注解说明 :

在 SpringMVC 的各个组件中,处理器映射器、处理器适配器、视图解析器称为 SpringMVC 的三大组件。使 用 <mvc:annotation-driven> 自 动 加 载 RequestMappingHandlerMapping ( 处 理 映 射 器 )RequestMappingHandlerAdapter ( 处 理 适 配 器 ) , 可 用 在 SpringMVC.xml 配 置 文 件 中 使 用 <mvc:annotation-driven/> 替代注解处理器和适配器的配置(默认情况下不配置也是可以使用的)。

三 注解详解

1 RequestMapping

RequestMapping注解的作用是建立请求URL和处理方法之间的对应关系

RequestMapping注解可以作用在方法和类上

  • 使用在类上:

    请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。 写的话需要以/开头 .它出现的目的是为了使我们的 URL 可以按照模块化管理

  • 使用在方法上:

    请求 URL 的第二级访问目录

@Controller
@RequestMapping("/account")
public class AccountController {
    @RequestMapping("/add")
    public String add(){
        System.out.println("添加账户");
        return "success";
    }
    @RequestMapping("/deletet")
    public String deletet(){
        System.out.println("删除账户");
        return "success";
    }
    @RequestMapping("/update")
    public String update(){
        System.out.println("更新账户");
        return "success";
    }
}

<h3>绝对路径的写法</h3>
<a href="${pageContext.request.contextPath }/account/add">添加账户</a><br/>
<a href="${pageContext.request.contextPath }/account/delete">删除账户</a><br/>
<a href="${pageContext.request.contextPath }/account/update">更新账户</a><br/>
<hr/>
<h3>相对路径的写法</h3>
<a href="account/add">添加账户</a><br/>
<a href="account/delete">删除账户</a><br/>
<a href="account/update">更新账户</a><br/>

RequestMapping的属性

path  value : 指定请求路径的url 前面的/可以不写

method : 指定该方法的请求方式 可以使用GetMapping、PostMapping注解指定只能使用get、post方式访问

RequestParam

  1 把请求中指定名称的参数给控制器中的形参赋值。

·    2 获取List、Map类型的请求参数必须添加

RequestBody

客户端传入给服务器端的请求参数一般分为两种:

  1 formdata类型的请求参数,例如:"username=aobama&pwd=123&nickname=圣枪游侠",获取这类请求参数已经在前面详细讲解过了

  2 json类型的请求参数,例如使用axios发送异步的post请求携带的请求参数,而RequestBody注解的作用就是将json类型的请求参数封装到POJO对象或者Map中

@RequestMapping("userRequestBody")
public String userRequestBody(@RequestBody User user){
    //RequestBody注解的作用1:获取请求体的数据
    System.out.println(user);
    //真正的目标:将请求体中的数据拿到,封装到POJO
    return "success";
}

PathVariable

作用:

用于绑定 url 中的占位符。 例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。 url 支持占位符是 spring3.0 之后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志。

属性:

value: 用于指定 url 中占位符名称。 required:是否必须提供占位符。

@DeleteMapping("/{userId}/{cardNumber}")
public String deleteById(@PathVariable("userId") int userId,@PathVariable("cardNumber") String cardNumber){
    System.out.println("要删除的用户的id为:" + userId+",身份证号是:"+cardNumber);
    return "success";
}

@GetMapping("/{userId}/{cardNumber}")
public String findById(@PathVariable("userId") int userId,@PathVariable("cardNumber") String cardNumber){
    System.out.println("要查询的用户的id为:" + userId+",身份证号是:"+cardNumber);
    return "success";
}

5 @ResponseBody  

该注解用于将 Controller 的方法返回的对象,通过 HttpMessageConverter 接口转换为指定格式的数据如: json,xml 等,通过 Response 响应给客户端,也可以用@RestController同时代替@Controller和@ResponseBody  

@RestController
@RequestMapping("/response")
public class ResponseController {
    @RequestMapping("/responseJson")
    public User responseJson(){
        User user = new User();
        user.setName("张三");
        user.setAddress("深圳");
        user.setBirthday(new Date());
        user.setAge(18);
        //目标: 将user转换成Json字符串,并且输出给浏览器
        return user;
    }
}

四 其他

解决DispatcherServlet拦截静态资源的问题

最常用,让DefaultServlet去处理静态资源,DispatcherServlet就不处理静态资源了,在spring的配置文件中配置,

<mvc:default-servlet-handler />

2拦截器

Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器(自己编写的Controller)进行预处理和后处理。用户可以自己定义一些拦截器来实现特定的功能。谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

要想自定义拦截器, 要求必须实现: HandlerInterceptor 接口。再进行IOC配置

/**
 * 1. 自定义一个拦截器实现HandlerInterceptor接口
 * 2. 重写它的方法
 *    preHandle:在执行处理器方法之前执行
 *    postHandle:执行处理器方法之后执行
 *    afterCompletion:这次请求完成之后执行
 * 3. 在springmvc的配置文件中,配置拦截器
 */
public class PermissionInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进行权限校验....");
        //返回true表示放行,返回false表示拦截
        return true;
    }

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("权限校验的posthandle方法执行了...");
    }
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("权限校验的afterCompletion方法执行了...");
    }
}

 

<!--配置拦截器-->
<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <!--排除某些请求-->
        <mvc:exclude-mapping path="/hello/sayHaha.do"/>
        <bean id="interceptor2" class="com.itheima.interceptor.CheckNameInterceptor">	</bean>
    </mvc:interceptor>
</mvc:interceptors>

  

posted @ 2021-08-07 15:04  春华_秋实  阅读(140)  评论(0)    收藏  举报