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

SpringMVC

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringMVC

文章目录
      • 1、SpringMVC
      • 2、HelloWorld
          • web.xml配置
          • springMVC.xml
          • HelloController.java
          • index.jsp
      • 3、 @ReuqestMapping 注解
          • 用于标识类或者方法
          • @ReuqestMapping 属性值:
          • ant风格,路径规则、匹配
          • restful风格,路径占位符、传值
          • 派生注解
      • 4、获取请求数据
          • 原生ServletAPI获取请求参数
          • 控制器方法形参获取请求参数
          • @RequestParam
          • @RequesHeader
          • @CookieValue
          • 通过POJO获取请求参数
          • 解决乱码
      • 4、域对象数据共享
          • 1.ServletAPI向request域对象共享数据
          • 2.ModelAndView向request域对象共享数据
          • 3.Model向request域对象共享数据
          • 4.Map向request域对象共享数据
          • 5.ModelMap向request域对象共享数据
          • 6.Model、ModelMap、Map的关系
          • 7.向session域对象共享数据
          • 8.向application域对象共享数据
      • 5、视图
          • 转发视图 InternalResourceView
          • 重定向视图 RedirectView
          • 视图控制器 InternalResourceViewResolver
          • 路径只是为了跳转页面 mvc:view-controller
      • 6、HttpMessageConverter 报文信息转换器
          • @RequestBody
          • @ResponseBody
          • RequestEntity
          • ResponseEntity
          • @RestController
      • 7、文件下载、上传
          • 文件下载
          • 文件上传
      • 8、拦截器
          • 1.拦截器的配置
          • 2.拦截器的三个抽象方法
          • 3.多个拦截器的执行顺序
      • 9、异常处理器
          • 1.基于配置的异常处理
          • 2.基于注解的异常处理
      • 10、注解配置SpringMVC
          • 1.WebInit
          • 2.WebConfig
      • 11、SpringMVC的执行流程

1、SpringMVC
  1. 什么是MVC

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

    M:Model 模型, 指的是JavaBean 实体Bean和业务处理Bean(实体类和Dao、Service)

    V:View 视图, 指Html或者JSP等页面

    C:Controller 控制器,值工程中的Servlet,作用接收请求、响应请求

    MVC工作流程:

    用户通过视图发生请求到服务器,在服务器中被Controller接收,Controller调用相应的Model层处理请求,处理完毕将结果返回到Controller,Controller在根据请求处理的结果找到相应的View视图层,渲染数据后最终响应给游览器

2.什么是SpringMVC

SpringMVC是Spring的一个后续产品,是Spring的一个子模块,是Spring为表述层开发提供的一整套完备的解决方案

3.SpringMVC的特点

  • Spring家族原生产品,与IOC容器等基础设施无缝对接
  • 基于原生的Servlet,通过功能强大的DispatchServlet,对请求和响应进行统一处理
  • 代码清晰简洁
  • 性能卓越
2、HelloWorld web.xml配置

spring中要求配置文件位于recesouces下,则可以在web.xml的servlet配置中,配置init-param指定配置文件的位置,如果没有配置init-param,则需要在WEB-INF下创建名称为[servlet-name]-servlet.xml的配置文件



    SpringMVC
    org.springframework.web.servlet.DispatcherServlet

    
    
        contextConfigLocation
        classpath:springMVC.xml
    
    
    1



    SpringMVC
    
    
    return "index";
}
restful风格,路径占位符、传值

路径占位符常用于restful风格,在响应的@RequestMapping注解的value属性中通过占位符{xxx}表示要传输的数据,在通过@PathVarlable注解获取占位符中的值

//在@RequestMapping注解的value属性中通过占位符{xxx}表示要传输的数据,在通过@PathVarlable注解获取占位符中的值
@RequestMapping("/restful/{id}/{pageIndex}")
public String restful(@PathVariable("id") String id,@PathVariable("pageIndex") Integer pageIndex) {
    System.out.println("id:"+id);
    System.out.println("pageIndex:"+pageIndex);
    return "index";
}
派生注解

@GetMapping、@PostMapping、@DeleteMapping、@PutMapping

4、获取请求数据 原生ServletAPI获取请求参数 控制器方法形参获取请求参数 @RequestParam @RequesHeader @CookieValue 通过POJO获取请求参数

解决请求乱码问题

@RequestMapping("index")
public String index(HttpServletRequest request) {
    String username = request.getParameter("username");
    String password = request.getParameter("password");
    System.out.println("username:" + username);
    System.out.println("password:" + password);
    return "index";
}


@RequestMapping("index2")
public String index2(String username, String password) {
    System.out.println("username:" + username);
    System.out.println("password:" + password);
    return "index";
}


@RequestMapping(value = "index3")
public String index3(@RequestParam("user_name") String username) {
    System.out.println("username:" + username);
    return "index";
}

@RequestMapping(value = "index4")
public String index4(@RequestHeader("Host") String host) {
    System.out.println("host:" + host);
    return "index";
}


@RequestMapping(value = "index5")
public String index5(@CookieValue("JSESSIONID") String JSESSIONID) {
    System.out.println("JSESSIONID:" + JSESSIONID);
    return "index";
}


@RequestMapping(value = "index6")
public String index6(User user) {
    System.out.println(user);
    return "index";
}
解决乱码

get请求乱码 由tomcat照成,修改tomcat的配置文件

post乱码 配置CharacterEncodingFilter


    characterEncodingFilter
    org.springframework.web.filter.CharacterEncodingFilter
    
        encoding
        UTF-8
    
    
        forceResponseEncoding
        true
    


    characterEncodingFilter
    
    @ExceptionHandler(value = {ArithmeticException.class, NullPointerException.class})
    public String exceptionMethod(Exception ex, Model model) {
        model.addAttribute(ex);
        return "error";
    }
}
10、注解配置SpringMVC 1.WebInit

创建初始化类,代替web.xml

在Servlet3.0+环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。
Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。

public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {

    
    @Override
    protected Class[] getRootConfigClasses() {
        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 characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        characterEncodingFilter.setForceResponseEncoding(true);
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
    }
}

2.WebConfig

代替SpringMVC的配置文件

// 1.组件扫描  2.视图解析  3.view-controller  4.default-servlet-handler
// 5.mvc注解驱动  6.文件上传解析器  7.拦截器   8.异常处理

@Configuration
// 1.组件扫描
@ComponentScan("com.potato.controller")
// 5.mvc注解驱动
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {


    //2.视图解析
    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/static/");
        viewResolver.setSuffix(".jsp");
        registry.viewResolver(viewResolver);
    }

    //3.view-controller
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        WebMvcConfigurer.super.addViewControllers(registry);
    }

    //4.default-servlet-handler
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
        WebMvcConfigurer.super.configureDefaultServletHandling(configurer);
    }

    //6.文件上传解析器
    public CommonsMultipartResolver multipartResolver(CommonsMultipartResolver commonsMultipartResolver) {
        commonsMultipartResolver.setDefaultEncoding("UTF-8");
        commonsMultipartResolver.setMaxUploadSize(419430400);
        return commonsMultipartResolver;
    }

    //7.拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册自己定义的拦截器
        //registry.addInterceptor(new FirstInterceptor()).addPathPatterns("/**");
        WebMvcConfigurer.super.addInterceptors(registry);
    }

    //8.异常处理  可以使用注解配置代替
    @Override
    public void configureHandlerExceptionResolvers(List resolvers) {
        SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
        Properties prop = new Properties();
        prop.setProperty("java.lang.ArithmeticException", "error");
        //设置异常映射
        resolver.setExceptionMappings(prop);
        //设置共享异常信息的键
        resolver.setExceptionAttribute("ex");
        resolvers.add(resolver);
        WebMvcConfigurer.super.configureHandlerExceptionResolvers(resolvers);
    }
}

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

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

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

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

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

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

  7. Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象。

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

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

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

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

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

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

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