栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringMVC——基于MVC架构的Spring框架

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap

SpringMVC——基于MVC架构的Spring框架

活动地址:CSDN21天学习挑战赛

文章目录
  • 第1章 SpringMVC概述
    • 1.1 SpringMVC简介
    • 1.2 SpringMVC的优点
      • 1.2.1 基于MVC架构
      • 1.2.2 容易理解,上手快,使用简单
      • 1.2.3作为Spring框架一部分,能够使用Spring的IOC和AOP
      • 1.2.4 SpringMVC 强化注解的使用
    • 1.3SpringMVC优化的方向
    • 1.4 SpringMVC执行的流程
    • 1.5基于注解的SpringMVC程序
    • 1.6总结
  • 第2章 SpringMVC注解式开发
    • 2.1@RequestMapping定义请求规则
      • 2.1.1 指定模块名称
      • 2.1.2对请求提交方式的定义
        • (1)post提交方式
        • (2)get提交方式
      • 2.1.3@RequestMapping注解的params属性(了解)
      • 2.1.4@RequestMapping注解的headers属性(了解)
    • 2.2 五种数据提交的方式
      • (1)单个数据注入
      • (2)对象封装注入
      • (3)动态占位符提交(仅用于超链接)
      • (4)请求参数名称与形参名称不一致
      • (5)使用HttpServletRequest对象提取
      • (6)获取请求头信息@RequestHeader
      • (7)获取Cookie值@CookieValue
    • 2.3请求参数中文乱码解决
      • (1)解决方案
      • (2)源码分析
    • 2.4处理器方法的返回值(处理AJAX请求)
      • 2.4.1返回 ModelAndView
      • 2.4.2返回 String
      • 2.4.1无返回值void
      • 2.4.2返回对象Object
    • 2.5SpringMVC的四种跳转方式
      • 2.5.1 转发与重定向
      • 2.5.2 视图控制器view-controller
    • 2.6SpringMVC支持的默认参数类型
      • 2.6.1 使用ServletAPI向request域对象共享数据
      • 2.6.2 使用ModelAndView向request域对象共享数据
      • 2.6.3 使用Model向request域对象共享数据
      • 2.6.4 使用map向request域对象共享数据
      • 2.6.5 使用ModelMap向request域对象共享数据
      • 2.5.6 Model、ModelMap、Map的关系
      • 2.5.7、向session域共享数据
      • 2.5.8、向application域共享数据
    • 2.7日期处理
      • 2.7.1 日期注入
      • (1)在方法的参数上使用@DateTimeFormat注解
      • (2)在类的成员setXXX()方法上使用@DateTimeFormat注解
      • (3)@InitBinder注解解决类中日期问题
      • 2.7.2 日期显示
        • (1)JSON中的日期显示
        • (2)JSP页面的日期显示
    • 2.8 标签的使用
    • 2.9资源在WEB-INF目录下
    • 2.10SpringMVC支持ant风格的路径
    • 2.11@RestController注解
  • 第3章 拦截器与异常处理器
    • 3.1 拦截器介绍
      • 3.1.1拦截器的应用场景
      • 3.1.2 拦截器的执行原理
      • 3.1.3拦截器执行的时机
      • 3.1.4 拦截器实现的两种方式
    • 3.2 HandlerInterceptor接口分析
        • (1) preHandle
        • (2) postHandle
        • (3)afterCompletion
    • 3.3 自定义拦截器实现权限验证
    • 3.4 过滤器和拦截器的区别
      • 1、实现原理不同
      • 2、使用范围不同
      • 3、触发时机不同
      • 4、拦截的请求范围不同
      • 5、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,这点很重要,在拦截器里注入一个service,可以调用业务逻辑。
    • 3.5 多个拦截器的执行顺序
    • 3.6 异常处理器
      • 3.6.1 基于配置的异常处理
      • 3.6.2 基于注解的异常处理
  • 第4章RESTful
    • 4.1RESTful简介
    • 4.2RESTful的实现
    • 4.3HiddenHttpMethodFilter
  • 第5章 注解配置SpringMVC及执行流程
    • 5.1创建初始化类,代替web.xml
    • 5.2 创建SpringConfig配置类,代替spring的配置文件
    • 5.3 创建WebConfig配置类,代替SpringMVC的配置文件
    • 5.4测试功能
    • 5.5 SpringMVC常用组件
    • 5.6 SpringMVC的执行流程

第1章 SpringMVC概述 1.1 SpringMVC简介

MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分

M:Model,模型层,指工程中的JavaBean,作用是处理数据

JavaBean分为两类:

一类称为实体类Bean:专门存储业务数据的,如 Student、User 等

一类称为业务处理 Bean:指 Service 或 Dao 对象,专门用于处理业务逻辑和数据访问。

V:View,视图层,指工程中的html或jsp等页面,作用是与用户进行交互,展示数据

C:Controller,控制层,指工程中的servlet,作用是接收请求和响应浏览器

MVC的工作流程: 用户通过视图层发送请求到服务器,在服务器中请求被Controller接收,Controller

调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller再根据请求处理的结果

找到相应的View视图,渲染数据后最终响应给浏览器

SpringMVC是Spring的一个后续产品,是Spring的一个子项目

SpringMVC 是 Spring 为表述层开发提供的一整套完备的解决方案。在表述层框架历经 Strust、

WebWork、Strust2 等诸多产品的历代更迭之后,目前业界普遍选择了 SpringMVC 作为 Java EE 项目

表述层开发的首选方案。

注:三层架构分为表述层(或表示层)、业务逻辑层、数据访问层,表述层表示前台页面和后台

servlet

1.2 SpringMVC的优点 1.2.1 基于MVC架构

基于 MVC 架构,功能分工明确。解耦合。

1.2.2 容易理解,上手快,使用简单

就可以开发一个注解的 SpringMVC 项目,SpringMVC 也是轻量级的,jar 很小。不依赖的特定的接口和类。

1.2.3作为Spring框架一部分,能够使用Spring的IOC和AOP

方便整合Strtus,MyBatis,Hiberate,JPA 等其他框架。

1.2.4 SpringMVC 强化注解的使用

在Controller, Service, Dao 都可以使用注解。方便灵活。使用@Controller 创建处理器对象,@Service 创建业务对象,@Autowired 或者@Resource 在控制器类中注入 Service,在Service 类中注入 Dao。

1.3SpringMVC优化的方向

1.4 SpringMVC执行的流程

执行流程说明:

  1. 向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。
  2. DispatcherServlet 根据中的配置对请求的URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
  3. DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。
  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
    • 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
    • 数据格式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等。
    • 数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
  5. Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象。
  6. 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
  7. ViewResolver 结合Model和View,来渲染视图。
  8. 视图负责将渲染结果返回给客户端
1.5基于注解的SpringMVC程序

所谓 SpringMVC 的注解式开发是指:
在代码中通过对类与方法的注解,便可完成处理器在 springmvc 容器的注册。注解式开发是重点。

项目案例功能:用户提交一个请求,服务端处理器在接收到这个请求后,给出一条欢迎信息,在响应页面中显示该信息。

创建步骤:

  1. 新建maven_web项目

  1. 添加依赖
 
    org.springframework
    spring-webmvc
    5.2.5.RELEASE
 
 
    javax.servlet
    javax.servlet-api
    3.1.0 

  1. 删除web.xml文件重新添加,因为自动生成的web.xml文件版本太低了。

  1. 在web.xml文件中注册SpringMvc框架。

​ 因为web的请求都是由Servlet来进行处理的,而SpringMVC的核心处理器就是一个DispatcherServlet,它负责接收客户端的请求,并根据请求的路径分派给对应的action(控制器)进行处理,处理结束后依然由核心处理器DispatcherServlet进行响应返回。

中央调度器的全限定性类名在导入的 Jar 文件 spring-webmvc-5.2.5.RELEASE.jar 的第一个包org.springframework.web.servlet下可找到。

 
    springmvc
    org.springframework.web.servlet.DispatcherServlet
     
        contextConfigLocation
        classpath:springmvc.xml
    
    
    

 
    springmvc 
    *.action




    model.addAttribute("testScope", "hello,Model"); 
    return "success"; 
}
2.6.4 使用map向request域对象共享数据
@RequestMapping("/testMap")
public String testMap(Map map){ 
    map.put("testScope", "hello,Map");
    return "success"; 
}
2.6.5 使用ModelMap向request域对象共享数据
@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){
    modelMap.addAttribute("testScope", "hello,ModelMap");
    return "success";
}
2.5.6 Model、ModelMap、Map的关系

Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的

public interface Model{} 
public class ModelMap extends LinkedHashMap {} 
public class ExtendedModelMap extends ModelMap implements Model {} 
public class BindingAwareModelMap extends ExtendedModelMap {}
2.5.7、向session域共享数据
@RequestMapping("/testSession")
public String testSession(HttpSession session){
    session.setAttribute("testSessionScope", "hello,session"); 
    return "success"; 
}
2.5.8、向application域共享数据
@RequestMapping("/testApplication")
public String testApplication(HttpSession session){
    ServletContext application = session.getServletContext(); 
    application.setAttribute("testApplicationScope", "hello,application"); 
    return "success"; 
}
2.7日期处理 2.7.1 日期注入

日期类型不能自动注入到方法的参数中。需要单独做转换处理。

使用@DateTimeFormat注解,需要在springmvc.xml文件中添加 标签。

(1)在方法的参数上使用@DateTimeFormat注解
@RequestMapping("/submitone")
public String submitdateone(
    @DateTimeFormat(pattern="yyyy-MM-dd")  
    Date mydate){  
    System.out.println(mydate);   
    return "dateShow"; 
}
(2)在类的成员setXXX()方法上使用@DateTimeFormat注解
@DateTimeFormat(pattern="yyyy-MM-dd")
public void setDate(Date date) { 
    this.date = date;
}

但这种解决方案要在每个使用日期类型的地方都去添加使用@DateTimeFormat注解,比较麻烦,我们可以使用@InitBinder注解来进行类中统一日期类型的处理。

(3)@InitBinder注解解决类中日期问题
@InitBinder 
public void initBinder(WebDataBinder dataBinder) { 
    SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd"); 
    dataBinder.registerCustomEditor(Date.class, new CustomDateEditor(sf, true));
}

这样在类中出现的所有日期都可以进行转换了。

2.7.2 日期显示 (1)JSON中的日期显示

需要在类中的成员变量的getXXX方法上加注解.

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
public Date getDate() { 
    return date; 
}
(2)JSP页面的日期显示

需要使用国际化标签,先添加依赖

 
    jstl 
    jstl
    1.2

导入国际化的标签库

<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

再使用标签显示日期

 ${stu.name}-------${stu.age}-------
    
2.8 标签的使用
  • 会自动注册两个bean,分别为**DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter。**是springmvc为@controller分发请求所必须的。
  • 除了注册了这两个bean,还提供了很多支持。

1)支持使用ConversionService 实例对表单参数进行类型转换;

2)支持使用 @NumberFormat 、@DateTimeFormat;

3)注解完成数据类型的格式化;

4)支持使用 @RequestBody 和 @ResponseBody 注解;

5)静态资源的分流也使用这个标签;

2.9资源在WEB-INF目录下
  • 很多企业会将动态资源放在WEB-INF目录下,这样可以保证资源的安全性。
  • 在WEB-INF目录下的动态资源不可以直接访问,必须要通过请求转发的方式进行访问。
  • 这样避免了通过地址栏直接对资源的访问。重定向也无法访问动态资源。

项目案例:

页面结构图:

action:

@Controller
public class ShowAction { 
    @RequestMapping("/showIndex")  
    public String showIndex(){ 
        System.out.println("index............."); 
        return "index"; 
    }  
    @RequestMapping("/showMain") 
    public String showMain(){   
        System.out.println("main.............");
        return "main";
    }  
    @RequestMapping("/showLogin") 
    public String showLogin(){    
        System.out.println("login............."); 
        return "login"; 
    }
    @RequestMapping("/login")  
    public String login(String name, String pwd, HttpServletRequest request){ 
        if("admin".equals(name) && "123".equals(pwd)){  
            return "main"; 
        }    
        request.setAttribute("msg","用户名或密码不正确!"); 
        return "login"; 
    }
}

运行结果:

2.10SpringMVC支持ant风格的路径
  • ?:表示任意的单个字符(不包括**?**)
  • :表示任意的0个或多个字符(不包括*?**和 / )
  • **:表示任意层数的任意目录

注意:在使用 ** 时,只能使用xxx的方式, * *前后不能有任何字符,只能有//

2.11@RestController注解

@RestController注解是springMVC提供的一个复合注解,标识在控制器的类上,就相当于为类添加了@Controller注解,并且为其中的每个方法添加了@ResponseBody注解

第3章 拦截器与异常处理器
  • SpringMVC 中的 Interceptor 拦截器,它的主要作用是拦截指定的用户请求,并进行相应的预处理与后处理。
  • 其拦截的时间点在“处理器映射器根据用户提交的请求映射出了所要执行的处理器类,并且也找到了要执行该处理器类的处理器适配器,在处理器适配器执行处理器之前”。
  • 当然,在处理器映射器映射出所要执行的处理器类时,已经将拦截器与处理器组合为了一个处理器执行链,并返回给了中央调度器。
3.1 拦截器介绍 3.1.1拦截器的应用场景

1、日志记录:记录请求信息的日志

2、权限检查,如登录检查

3、性能检测:检测方法的执行时间

3.1.2 拦截器的执行原理

3.1.3拦截器执行的时机

1)preHandle():在请求被处理之前进行操作

2)postHandle():在请求被处理之后,但结果还没有渲染前进行操作,可以改变响应结果

3)afterCompletion:所有的请求响应结束后(渲染视图完毕)执行善后工作,清理对象,关闭资源

3.1.4 拦截器实现的两种方式

1)继承HandlerInterceptorAdapter的父类

2)实现HandlerInterceptor接口,实现的接口,推荐使用实现接口的方式

3.2 HandlerInterceptor接口分析

自定义拦截器,需要实现 HandlerInterceptor 接口。而该接口中含有三个方法:

(1) preHandle

该方法在处理器方法执行之前执行。其返回值为 boolean,若为 true,则紧接着会执行处理器方法,且会将 afterCompletion()方法放入到一个专门的方法栈中等待执行。

(2) postHandle

该方法在处理器方法执行之后执行。处理器方法若最终未被执行,则该方法不会执行。由于该方法是在处理器方法执行完后执行,且该方法参数中包含 ModelAndView,所以该方法可以修改处理器方法的处理结果数据,且可以修改跳转方向。

(3)afterCompletion

当preHandle()方法返回 true 时,会将该方法放到专门的方法栈中,等到对请求进行响应的所有工作完成之后才执行该方法。即该方法是在中央调度器渲染(数据填充)了响应页面之后执行的,此时对 ModelAndView 再操作也对响应无济于事。afterCompletion 最后执行的方法,清除资源,例如在 Controller 方法中加入数据等。

3.3 自定义拦截器实现权限验证

实现一个权限验证拦截器。

  1. 修改web.xml文件中请求路径

  1. 将所有的页面放入WEB-INF目录下

  1. 开发登录action

  1. 开发拦截器

  1. 配置springmvc.xml文件
 
  
     
         
         
        return new Class[]{SpringConfig.class};
    }

     @Override
    protected Class[] getServletConfigClasses() { 
        return new Class[]{WebConfig.class};
    }


     @Override
    protected String[] getServletMappings() {
        	return new String[]{"/"};
    }


     
    @Override
    protected Filter[] getServletFilters() {
    	CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter(); 
        encodingFilter.setEncoding("UTF-8"); encodingFilter.setForceRequestEncoding(true);
    	HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
    	return new Filter[]{encodingFilter, hiddenHttpMethodFilter};
    }
}
5.2 创建SpringConfig配置类,代替spring的配置文件
@Configuration
public class SpringConfig {
    //ssm整合之后,spring的配置信息写在此类中
}
5.3 创建WebConfig配置类,代替SpringMVC的配置文件
@Configuration
//扫描组件@ComponentScan("com.atguigu.mvc.controller")
//开启MVC注解驱动@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    //使用默认的servlet处理静态资源@Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer){
    	configurer.enable();
    }

    //配置文件上传解析器@Bean
    public CommonsMultipartResolver multipartResolver(){
        return new CommonsMultipartResolver();
    }

    //配置拦截器@Override
    public void addInterceptors(InterceptorRegistry registry) {
        FirstInterceptor firstInterceptor = new FirstInterceptor(); 
        registry.addInterceptor(firstInterceptor).addPathPatterns("

    //配置异常映射
    

    //配置生成模板解析器@Bean
    public ITemplateResolver templateResolver() { 
        WebApplicationContext webApplicationContext =
    ContextLoader.getCurrentWebApplicationContext();
    // ServletContextTemplateResolver需要一个ServletContext作为构造参数,可通过WebApplicationContext 的方法获得
    ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(
    webApplicationContext.getServletContext()); 
        templateResolver.setPrefix("/WEB-INF/templates/"); 
        templateResolver.setSuffix(".html"); templateResolver.setCharacterEncoding("UTF-8"); 
        templateResolver.setTemplateMode(TemplateMode.HTML); return templateResolver;
    }

    //生成模板引擎并为模板引擎注入模板解析器@Bean
    public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
        SpringTemplateEngine templateEngine = new SpringTemplateEngine(); 			
        templateEngine.setTemplateResolver(templateResolver);
        return templateEngine;
    }

    //生成视图解析器并未解析器注入模板引擎@Bean
    public ViewResolver viewResolver(SpringTemplateEngine templateEngine) { 
        ThymeleafViewResolver viewResolver = new ThymeleafViewResolver(); 
        viewResolver.setCharacterEncoding("UTF-8"); 
        viewResolver.setTemplateEngine(templateEngine);
        return viewResolver;
    }

}
5.4测试功能
@RequestMapping("/")
public String index(){
	return "index";
}
5.5 SpringMVC常用组件
  • DispatcherServlet:前端控制器,不需要工程师开发,由框架提供

    ​ 作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求

  • HandlerMapping:处理器映射器,不需要工程师开发,由框架提供

    ​ 作用:根据请求的url、method等信息查找Handler,即控制器方法

  • Handler:处理器,需要工程师开发

    ​ 作用:在DispatcherServlet的控制下Handler对具体的用户请求进行处理

  • HandlerAdapter:处理器适配器,不需要工程师开发,由框架提供

    ​ 作用:通过HandlerAdapter对处理器(控制器方法)进行执行

  • ViewResolver:视图解析器,不需要工程师开发,由框架提供

    ​ 作用:进行视图解析,得到相应的视图,例如:ThymeleafView、InternalResourceView、RedirectView

  • View:视图

    ​ 作用:将模型数据通过页面展示给用户

5.6 SpringMVC的执行流程
  1. 用户向服务器发送请求,请求被SpringMVC 前端控制器 DispatcherServlet捕获。

  2. DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI),判断请求URI对应的映射:

a) 不存在

i. 再判断是否配置了mvc:default-servlet-handler

ii. 如果没配置,则控制台报映射查找不到,客户端展示404错误

iii. 如果有配置,则访问目标资源(一般为静态资源,如:JS,CSS,HTML),找不到客户端也会展示404 错误

b) 存在则执行下面的流程

  1. 根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain执行链对象的形式返回。

  2. DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。

  3. 如果成功获得HandlerAdapter,此时将开始执行拦截器的preHandler(…)方法【正向】

  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)方法,处理请求。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

  • HttpMessageConveter:将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
  • 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
  • 数据格式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
  • 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
  1. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。

  2. 此时将开始执行拦截器的postHandle(…)方法【逆向】。

  3. 根据返回的ModelAndView(此时会判断是否存在异常:如果存在异常,则执行HandlerExceptionResolver进行异常处理)选择一个适合的ViewResolver进行视图解析,根据Model和View,来渲染视图。

  4. 渲染视图完毕执行拦截器的afterCompletion(…)方法【逆向】。

  5. 将渲染结果返回给客户端。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1041275.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号