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

Spring-MVC

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

Spring-MVC

Spring-MVC 一.基础配置
    引入依赖

  org.springframework
  spring-webmvc
  5.3.14

    Web.xml



    dispatcherServlet
    org.springframework.web.servlet.DispatcherServlet
    
    
        contextConfigLocation
        classpath:applicationContext.xml
    
    
    1



    dispatcherServlet
    
    /


    applicationContext.xml



    
    
    
    
    
    


二.SpringMVC相关组件

SpringMVC提供了DispatcherServlet作为前端控制器,用来分发请求

SpringMVC有很多组件,为了做不同的分工,控制器,验证器,模型对象每个功能的实现由专门的组件完成

SpringMVC可以对用户的输入做一个自动绑定,能够对数据进行一个数据转换

SpringMVC默认有一个叫做视图解析器的组件,默认情况下可以对jsp进行解析;如果要对其他的模板引擎解析,则需要引入额外的依赖

SpringMVC重要组件

key-value形式
左边是组件的接口,右边是组件的实现类

# i18n国际化组件(本地化解析器)
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
# 主题解析器
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
# 处理器/映射器
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,
	org.springframework.web.servlet.function.support.RouterFunctionMapping
# 处理器适配器
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,
	org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter,
	org.springframework.web.servlet.function.support.HandlerFunctionAdapter

# 异常处理器
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver,
	org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,
	org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
# 视图名称解析器
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
# 视图解析器
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
# FlashMap映射管理器
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
// 初始化SpringMVC其他的组件的策略	
protected void initStrategies(ApplicationContext context) {
       //初始化上传文件相关的解析器,默认为null
		initMultipartResolver(context);
       // 初始化本地化解析器
		initLocaleResolver(context);
       // 初始化主题解析器
		initThemeResolver(context);
    	// 初始化处理器映射器
		initHandlerMappings(context);
       // 初始化处理器适配器
		initHandlerAdapters(context);
       // 初始化异常处理器
		initHandlerExceptionResolvers(context);
       // 初始化请求到视图名的解析器
		initRequestToViewNameTranslator(context);
       // 初始化视图解析器
		initViewResolvers(context);
       // 初始化flish映射的解析器
		initFlashMapManager(context);
	}
三.处理请求 3.1 第一个请求
@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping(value = "/firstLogin",method = {RequestMethod.GET,RequestMethod.POST})
    @ResponseBody
    public String firstLogin(){
        return "index.html";
    }
}

@RequestMapping该注解的原属性除了value和path之外(这两个原属性的配置的是等效的),还有一个是method比较重要,用来赛选该方法只能处理那些HTTP方法的请求

RequestMethod[] method() default {};

而RequestMethod是一个枚举,里面列举了所有HTTP方法类型

public enum RequestMethod {
    GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

如果没有指定method属性,则当前方法可以处理任意HTTP请求方法类型

其实Spring后期,在基于RequestMapping注解之上做了一些派生注解

@RequestMapping(method = RequestMethod.POST)
public @interface PostMapping {
@RequestMapping(method = RequestMethod.GET)
public @interface GetMapping {

点开源码,实际就是对@RequestMapping做了一个派生

默认情况下@RequestMapping能够处理content-type为application/x-www-form-urlencoded

3.2 请求参数绑定
    什么注解都不加:直接在参数列表里面写上前端传过来的参数名,或者使用包装类

直接传参

@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping(value = "/firstLogin",method = {RequestMethod.GET,RequestMethod.POST})
    @ResponseBody
    // --> http://localhost:8080/login/firstLogin?username=admin
    public String firstLogin(String username){
        System.out.println("请求的username为"+username);
        //-->  请求的username为admin
        return "index.html";
    }
}

传包装类

@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping(value = "/firstLogin",method = {RequestMethod.GET,RequestMethod.POST})
    @ResponseBody
    // --> http://localhost:8080/login/firstLogin?username=admin&password=123
    public String firstLogin(User user){
        System.out.println("请求的user为"+user);
        //--> 请求的user为User{username='admin', password='123'}
        return "index.html";
    }
}

前端与后端参数命名不一致 使用注解@RequestParam

可以为名称不匹配的参数做绑定,可以设置该参数是否必传,也可以为该参数设置默认值,如果前端没有传,则默认值生效

@AliasFor("name")
String value() default "";
 //The name of the request parameter to bind to. 要绑定到的请求参数的名称。
@AliasFor("value")
String name() default "";
//Whether the parameter is required. 参数是否为必填项 默认为true
boolean required() default true;
// 默认值 --应用场景  不登录试玩
String defaultValue() default ValueConstants.DEFAULT_NONE;
@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping(value = "/firstLogin",method = {RequestMethod.GET,RequestMethod.POST})
    @ResponseBody
    // --> http://localhost:8080/login/firstLogin?user_name=admin
    public String firstLogin(@RequestParam("user_name") String username){
        System.out.println("请求的username为"+username);
        //--> 请求的username为admin
        return "index.html";
    }
}

还可以看出来,SpringMVC之前一直是基于Servlet,那么其实在方法的参数上还是可以加上原生的HttpServletRequest和HttpServletResponse

@Controller
@RequestMapping("/login")
public class LoginController {
    @RequestMapping(value = "/firstLogin",method = {RequestMethod.GET,RequestMethod.POST})
    @ResponseBody
    // --> http://localhost:8080/login/firstLogin?user_name=admin
    public String firstLogin(@RequestParam("user_name") String username, HttpServletRequest request, HttpServletResponse response){
        String user_name = request.getParameter("user_name");
        System.out.println("httpRequest获得的参数"+user_name);
        //httpRequest获得的参数admin
        System.out.println("MVC请求的username为"+username);
        //--> MVC请求的username为admin
        return "index.html";
    }
}

@PathVaruable

  //http://localhost:8080/login/firstLogin/20
    @RequestMapping(value = "/fr/{myage}")
    @ResponseBody
    public String firstRequest(@PathVariable("myage") Integer age) {
        System.out.println("====>age"+age);
     	  // -->age 20
        //默认情况返回字符串,SpringMVC会根据返回值查找对应的模板引擎的名字
        return "index.html";
    }

@RequestBody

用来接收请求体中的数据,特别是GET请求没有请求体

@cookievalue

用来绑定请求包中的cookie的值

@GetMapping("/cookieReq")
@ResponseBody
public String cookieRequest(@cookievalue("JSESSIONID") String sessionId){
    System.out.println("拿到的cookie的值为:"+sessionId);
    return sessionId;
}
3.3 接收各种类型的数据

用数组接收前端传过来的数组

@PostMapping("/getcomplexdata")
@ResponseBody
// @RequestParam 当使用List集合需要加上当前注解
public String getComplexDara(String username,String lady,int[] reason){

  return "success";
}

用集合接收前端传过来的数组

@PostMapping("/getcomplexdata")
@ResponseBody
// Map 如果是数组那么只能拿到第一个
public String getComplexDara(@RequestParam Map map){
System.out.println(map);
return "success";
}

@RequestParam当使用集合需要加上当前注解

用对象接收前端传过来的参数

@PostMapping("/getcomplexdata")
@ResponseBody
public String getComplexDara(Form form){
    System.out.println(form);
    return "success";
}

对象接受级联数据

public class Form {
    private String username;
    private String lady;
    private List reason;

    
    private EmsInfo emsInfo;

    public EmsInfo getEmsInfo() {
        return emsInfo;
    }

您的名字

您中意的女神是谁

您为什么喜欢她?

长相甜美 为了学习 魔鬼身材 其他

填写调差问卷有礼品相送,请填写您的地址和联系方式

地址:

+

联系方式:

+

四.SpringMVC中解决乱码问题 4.1 中文乱码原因

因为默认的字符集是ISO-8859-1,属于西欧字符集,只有数字,符号,英文,拉丁文…

所以解决乱码的核心就是将ISO-8859-1转换为UTF-8

4.2 乱码分类

    GET请求乱码

    如果你的Tomcat的版本比较高(Tomcat8.0及以上),则不会出现GET请求乱码

    如果Tomcat版本比较低,如果在不更换版本的前提下,避免GET请求中文乱码问题,则需要修改Tomcat配置文件

    在tomcat安装目录–conf–server.xml–Connector添加URIEncoding="UTF-8"

    POST请求乱码

    通过设置过滤器解决中文乱码问题

    
        character-filter
        org.springframework.web.filter.CharacterEncodingFilter
        
            encoding
            UTF-8
        
    
    
        character-filter
        
    @RequestMapping("/getcomplexdata")
    public String getComplexData(Form form, Model model) {
        model.addAttribute("username", "地雷2");
        System.out.println(form);
        return "/success.jsp";
    }
    

    2.ModelMap

    @RequestMapping("/getcomplexdata")
    public String getComplexData(Form form, ModelMap model) {
        model.addAttribute("username", "地雷2");
        System.out.println(form);
        return "/success.jsp";
    }
    

    ModelAndView

    @RequestMapping("/getcomplexdata")
    public ModelAndView getComplexData(Form form, ModelMap model) {
      model.addAttribute("username", "地雷2");
      System.out.println(form);
      ModelAndView modelAndView = new ModelAndView("/success.jsp");
      // 设置响应地址
      //modelAndView.setViewName("/success.jsp");
      // 设置绑定数据
      modelAndView.addObject("username","地雷么么哒");
      return modelAndView;
    }
    

    默认都是转发,如果需要重定向那么就需要添加前缀redirect:success.jsp/转发就是forword

        @RequestMapping("/getcomplexdata")
        public ModelAndView getComplexData(Form form, ModelMap model) {
            model.addAttribute("username", "地雷2");
            System.out.println(form);
            ModelAndView modelAndView = new ModelAndView("redirect/success.jsp");
            // 设置响应地址
            //modelAndView.setViewName("/success.jsp");
            // 设置绑定数据
            modelAndView.addObject("username","地雷么么哒");
            return modelAndView;
        }
    
    public class UrlbasedViewResolver extends AbstractCachingViewResolver implements Ordered {
    // 重定向前缀
    public static final String REDIRECT_URL_PREFIX = "redirect:";
    // 转发前缀(默认)
    public static final String FORWARD_URL_PREFIX = "forward:";
    
    5.3 作用域

    默认情况下,Model,ModelMap,ModelAndView数据模型组件,其保存的元素都是在请求作用域中

    如果想提升数据的作用域,在SpringMVC中可以使用@SessionAttributes

    @Controller
    @RequestMapping("/mav")
    @SessionAttributes("username")
    public class ModelAndViewController {	
    
    5.4 SpringMVC整合模板引擎
      对默认的视图解析器进行优化
    
      
      
      
      
      
      
    
    
    @RequestMapping("/getcomplexdata")
    public String getComplexData(Form form, ModelMap model) {
      model.addAttribute("username", "地雷2");
      System.out.println(form);
      return "success";
      // 如果不需要使用前后缀的配置 
      + return "forword:/success.jsp"
    }
    

    整合freemarker

      引入依赖

      
        org.freemarker
        freemarker
        2.3.28
      
      
      
        org.springframework
        spring-context-support
        ${spring-version}
      
      

      配置freemarker视图解析器FreeMarkerViewResolver

      
        
        
      
      
      
        
        
        
        
      
      

      FreeMarkerController

      @GetMapping("/first")
      public ModelAndView test() {
        ModelAndView modelAndView = new ModelAndView("first");
        modelAndView.addObject("username", "地雷");
        return modelAndView;
      }
      

      first.ftl

      
          

      用户名:${username}

    六.Resuful开发风格 6.1 简介

    REST (REpresentional State Transfer)

    表现层状态转换–>所有的资源都是通过URL来识别和定位的,对资源的操作(CRUD)是通过HTTP的方法来定义

    6.2 Restful开发风格

    基于REST理念的一种开发风格,最典型的例子就是前后端分离

    在Restful开发风格里面:

      使用URL来定位用户的入口,代表对资源文件具体的操作HTTP方法要明确,(GET,POST,PUT,DELETE)接口只返回数据(一般指的结构化数据)在URL中不能出现动词 (!/getCourses)
    URI说明
    GET/courses查询所有的课程信息
    GET/course/1(@PathVariable)查询id为1的课程信息
    POST /course新增课程
    PUT/PATCH/course/1修改id为1的课程信息
    DELETE/course/1删除id为1的课程信息

    案例

    
    
    
        
        Title
        
        
    
    
    
    
    
    
    
    

    @PutMapping("/request")
    public String putRequest(){
      return "Put成功";
    }
    
    
    @DeleteMapping("/request")
    public String deleteRequest(){
      return "Delete成功";
    }
    
    
      
        
          
            
              text/html;charset=utf-8
              application/json;charset=utf-8
              
            
          
        
      
    
    
    6.3 简单请求和非简单请求

    如果让页面发送 PUT/DELETE请求,携带参数的话,SpringMVC的接口拿不到请求中的数据

    $('#do-Put').click(function () {
        $.ajax({
            url: "rest/request",
            type: "Put",
            //前端希望后端返回的数据类型为json
            dataType: "json",
            data:"username='木子'",
            // contentType:发送请求的数据类型
            // 回调函数拿到后端返回的数据
            success: function (res) {
                console.log(res)
            }
        })
    });
    

    但是GET/POST没有这种问题

    SpringMVC在设计之初,只是为了解决表达数据的解析,而表单只支持GET/POST

    因为Restful的流行,以及客户端的多样性,SpringMVC通过加入过滤器来解决的

    从Spring5.1开始加入FormContentFilter来解析PUT/DELETE/PATCH请求参数中的问题

    
        formContent
        org.springframework.web.filter.FormContentFilter
    
    
        formContent
        
    public class MyInterceptor implements HandlerInterceptor {
    
        
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            System.out.println(request.getRequestURL()+"这个URL在preHandle被拦截了");
            return HandlerInterceptor.super.preHandle(request, response, handler);
        }
    
        
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println(request.getRequestURL()+"这个URL在postHandle被拦截了");
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println(request.getRequestURL()+"这个URL在afterCompletion被拦截了");
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }
    
    
        
        
            
            
            
            
            
            
            
            
            
        
    
    
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/709146.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

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

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