springmvc持续更新

springmvc持续更新,第1张

day01

现在解决一下tomcat中文乱码的问题

解决控制台乱码问题
1)    点击Help => Edit custom VM Options,在最后面添加
“-Dfile.encoding=UTF-8”
2)    点击右上角 Edit Configurations,在tomcat配置中的 VM option中添加
“-Dfile.encoding=UTF-8”
在第二步的Startup/Connection页签的Run和Debug添加一个key为JAVA_TOOL_OPTIONS, value为“-Dfile.encoding=UTF-8”
的环境变量
3)    保存后重启idea,可以发现控制台中文乱码显示正常了



1.1 SpringMVC概述

  • SpringMVC是Spring子框架,是Spring 为【展现层、展示层、表示层】提供的基于 MVC 设计理念的优秀的 Web 框架

  • Spring MVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器【请求处理器】,而无须实现任何接口。

    • SpringMVC是非侵入式

    • @Controller、@Component、@Reposity、@Service

  • 浏览器【客户端】发送请求

  • 由前端控制器【DispatcherServlet】将请求,委托给Controller【请求处理器】

  • Controller【请求处理器】调用业务逻辑层,并返回数据

  • 将数据封装到ModelAndView对象

  • 渲染视图【将View从ModelAndView中解析出来】

  • 将View对象交个DispatcherServlet,最终响应浏览器【客户端】

1.3第一步 搭建SpringMVC步骤

        1.导包


    
        
        
            org.springframework
            spring-webmvc
            5.3.1
        








        
        
            org.thymeleaf
            thymeleaf-spring5
            3.0.12.RELEASE
        

        
        
            javax.servlet
            javax.servlet-api
            4.0.1
            provided
        

        
            org.projectlombok
            lombok
            1.18.20
        

    

        2.

在web.xml中配置DispatcherServlet【前端控制器】

  • url设置为/

  • 设置springmvc.xml配置文件路径,从而管理springmvc容器对象

  • 设置DispatcherServlet的优先级,启动服务器创建当前DispatcherServlet

         3.

创建springmvc.xml配置文件

  • 位置:src/main/resources

  • 名称:推荐使用springmvc.xml

  • 示例代码

    • 开启组件扫描

    • 配置视图解析器



    

    
    

    
    

    
    
        
        
        
        
            
            
                
                
                    
                    
                        
                        
                        
                        
                        
                        
                    
                
            
        
    


创建Controller【请求处理器】及处理方法  跳转首页

@Controller
public class ToIndexController {

    @GetMapping("/")
    public String toindex(){
        //物理视图名=视图前缀+逻辑视图名+视图后缀
        //物理视图名=/WEB-INF/pages/index/.html
        System.out.println("跳转首页啦!!!!");
        return "index";
    }



@RequestMapping注解详解

该注解有以下几个子注解

@PutMapping 主要是基于RESF风格的修改功能
@DeleteMapping主要是基于RESF风格的删除功能
@PostMapping主要是基于RESF风格的增加功能
@GetMapping主要是基于RESF风格的查询功能

  1.  放在方法上可以单独使用 直接映射到方法上 这点就比servlet牛逼不知道多少倍
  2. 也可以放在类上  代表给这个类有一个大的约束url 但是注意的是不能够单独使用 需要配合方法使用
  • value属性

    • 类型:String[]

    • 作用:为方法或类映射URL

  • path属性

    • 类型:String[]

    • 作用:与value属性作用一致

  • method属性

    • 类型:RequestMethod[]

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

    • 作用:设置当前URL的请求方式【GET、POST、DELETE、PUT】

    • 注意:如请求方式不被支持,会报错:405

      Request method 'GET' not supported

  • params

    • 类型:String[]

    • 作用:为当前URL设置请求参数

    • 注意:如未携带指定参数,会报错

      Parameter conditions "stuName" not met for actual request parameters:

  • headers

    • 类型:String[]

    • 作用:为当前URL设置请求头

    • 注意:如未携带指定请求头,会报错:404



第三章 SpringMVC中REST风格的CRUD

3.1 REST概述

  • 简称为 REST 或 RESTful

  • REST风格的URL将HTTP协议中的四种请求方式GET、POST、PUT、DELETE分别对应四种基本 *** 作:

    • GET 用来获取资源

    • POST 用来新建资源

    • PUT 用来更新资源

    • DELETE 用来删除资源。

3.2 REST风格与传统风格对比

  • 传统风格

    功能URL请求方式
    增加/saveEmpPOST
    删除/deleteEmp?id=1001GET
    修改/updateEmpPOST
    查询/getEmpById?id=1001GET
  • REST风格

    功能URL请求方式
    增加/empPOST
    删除/emp/1001DELETE
    修改/empPUT
    查询/emp/1001GET
  • 总结:REST风格CRUD优势

    • 提高网站排名

    • 便于第三方平台对接

代码测试 

测试之前完成一件事 就是浏览器无法发送put和delete请求 得需要我们的配置

配置一个拦截器

    
    
        HiddenHttpMethodFilter
        org.springframework.web.filter.HiddenHttpMethodFilter
    
    
        HiddenHttpMethodFilter
        /*
    

编写html代码 测试crud 简单的测试 不包含myabtis





    
    CRUD


 测试get请求



测试post请求
姓名: 年龄:



测试delete请求 删除携带id



测试put请求 修改携带id

分别对应的controller控制器 为


/**
 * @ClassName RequsetMapping扩展
 * @Author Dongyu Zhou
 * @Date 2022/4/27 18:34
 * @Version 1.0
 */
@Controller
public class RequsetMapping扩展 {
    /**
     * get请求
     * @return
     */
    @GetMapping("/get")
    public String get(){
        System.out.println("get请求 ....");
        return "success";
    }

    /**
     * post请求
     * @return
     */
    @PostMapping("/post")
    //如果入参和请求参数名字一样 可以自动映射
    public String post(@RequestParam("name") String name, @RequestParam("age")Integer age){
        System.out.println("name = " + name);
        System.out.println("post ....");
        return "success";
    }

    /**
     * delete请求
     * @return
     */
    @DeleteMapping("/delete/{Empid}")
    public String delete(@PathVariable("Empid")Integer id){
        System.out.println("id = " + id);
        System.out.println("delete ....");
        return "success";
    }

    /**
     *
     * @return
     */
    @PutMapping("/put/{EmpId}")
    public String put(@PathVariable("EmpId") Integer id){
        System.out.println("id = " + id);
        System.out.println("put ....");
        return "success";
    }


第四章 SpringMVC处理请求数据

4.1 自动入参

  • 概述:请求参数名与请求参数名与入参参数名一致

  • 注意:如请求参数名与入参参数名不一致,会将null值注入【所以建议使用包装类型作为入参的类型】

  • 示例代码

    @GetMapping("/doDefaultParam")
    public String doDefaultParam(String stuName,Integer stuAge){
        System.out.println("stuName = " + stuName);
        System.out.println("stuAge = " + stuAge);
        return SUCESS;
    }

4.2 @RequestParam注解

  • 作用:将指定参数名设置请求方法入参参数中

  • 属性

    • value:设置需要入参的参数名

    • name:与value左右一致

    • required:设置当前标识的参数是否必须入参

      • true【默认值】:表示当前标识的参数必须入参,如未入参会报错

        Required Integer parameter 'sAge' is not present

      • false:表示当前标识的参数不必须入参,如未入参会将null值注入

    • defaultValue:设置当前入参参数默认值【参数值为null时显示】

  • 示例代码

    @GetMapping("/doDefaultParam")
    public String doDefaultParam(String stuName,
                                 @RequestParam(value = "sAge",
                                         required = false,
                                        defaultValue = "16") Integer stuAge){
        System.out.println("stuName = " + stuName);
        System.out.println("stuAge = " + stuAge);
        return SUCESS;
    }

4.3 POJO入参

  • 概述:入参时,参数名与POJO中属性一致时,SpringMVC支持POJO入参

  • 示例代码

    添加员工信息
    
    LastName:
    Email:
    Salary:
    DeptName:
    public class Employee {
        private Integer id;         //员工id
        private String lastName;    //员工姓名
        private String email;       //员工邮箱
        private Double salary;      //员工薪资
    ​
        private Dept dept;
        //.....
    }
    @PostMapping("/saveEmp")
    public String saveEmp(Employee employee){
        System.out.println("employee = " + employee);
        return SUCESS;
    }

4.4 获取请求头信息【@RequestHeader】

  • 作用:获取请求头信息

  • 属性

    • value:设置请求头名称

    • name:作用与value作用一致

    • required:设置当前请求头是否必须入参

      • true【默认值】:表示当前请求头必须入参,如未入参,会报错

      • false:表示当前请求头不必须入参,如未入参,不会报错【null】

    • defaultValue:设置当前请求头默认数值【请求头信息为null时,显示】

  • 示例代码

    /**
     * 测试获取请求头
     */
    @GetMapping("/getRequestHeader")
    public String getRequestHeader(@RequestHeader("User-Agent") String userAggent,
                                   @RequestHeader("Referer") String referer ){
        System.out.println("userAggent = " + userAggent);
        System.out.println("referer = " + referer);
        return SUCCESS;
    }

4.5 获取Cookie数值【@CookieValue】

  • 作用:通过Cookie的key获取Cookie的Value

  • 属性

    • value:设置Cookie的key

    • name:作用与value作用一致

    • required:设置当前Cookie是否必须入参

      • true【默认值】:表示当前Cookie必须入参,如未入参,会报错

      • false:表示当前Cookie不必须入参,如未入参,不会报错【null】

    • defaultValue:设置当前Cookie默认数值【Cookie信息为null时,显示】

  • 示例代码

    @GetMapping("/getCookieValue")
    public String setCookieValue(@CookieValue("stuName") String stuName){
        System.out.println("==>getCookie,stuName = " + stuName);
        return SUCCESS;
    }

4.6 SpringMVC中使用Servlet原生对象

  • 如需使用Servlet原生API怎么办?

    • 直接将原生对象入参即可

  • 示例代码

    @GetMapping("/testServletAPI")
    public String testServletAPI(HttpServletRequest request,
                                 HttpServletResponse response,
                                 HttpSession session){
        System.out.println("request = " + request);
        System.out.println("response = " + response);
        System.out.println("session = " + session);
        return SUCCESS;
    }

    ModelAndView源码解析

属性一view

第一个就是view 有两个属性 一个是view接口 不常用 还得new一个实现类 太麻烦了

第二个就是使用视图名字  这个常用 比如 返回一个视图 return "success"

属性二 ModelMap model  这个是啥玩意 咱也不知  按住ctrl点进去 

 原来他就是一个LinkedHashMap

再来看看方法  视图名称有get'和set方法

 但是没有model的方法 有三个 get方法

 这三个方法的区别

 总结

public class ModelAndView {

   /** View instance or view name String. */
    //视图对象【存储视图】:view对象或view名称【推荐使用view名称】
   @Nullable
   private Object view;

   /** Model Map. */
    //数据模型【存储数据】:ModelMap  继承 LinkedHashMap
   @Nullable
   private ModelMap model;
 
    /**
	 * 设置视图名称
	 */
	public void setViewName(@Nullable String viewName) {
		this.view = viewName;
	}

	/**
	 * 获取视图名称
	 */
	@Nullable
	public String getViewName() {
		return (this.view instanceof String ? (String) this.view : null);
	}

    /**
	 * 获取数据【Model可能为null,返回Map】
	 */
	@Nullable
	protected Map getModelInternal() {
		return this.model;
	}

	/**
	 * 获取数据【Model不为null,返回ModelMap】
	 */
	public ModelMap getModelMap() {
		if (this.model == null) {
			this.model = new ModelMap();
		}
		return this.model;
	}

	
	/**
	 * 获取数据【Model不为null,返回Map】 
	 */
	public Map getModel() {
		return getModelMap();
	}
    /**
    	设置数据
    */
    public ModelAndView addObject(String attributeName, @Nullable Object attributeValue) {
		getModelMap().addAttribute(attributeName, attributeValue);
		return this;
	}
    
    
}

使用

这几种方法 分别为 model modelMap map modelAndView  

这几种传递的数据模型存放在request域中

如果我们想要存放在session域中的话 就可以直接把HttpSession作为入参放到方法里面

 

总结



springMVC的工作原理源码解析

无论是返回值为modelandview 还是String 返回值最后都是modelandview

断点测试  modelandview

 测试String返回类型

 

 

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

这个方法就是调用Controller中的处理请求的方法

接下来 接着看 mv最终在一下方法中处理

 点进去看 这个是渲染视图

 怎么渲染 就点进去  这里往下走 就出现一个获取视图名

视图渲染  怎么渲染 可以再点进去看



解决springMVC的请求乱码问题

    
    
        CharacterEncodingFilter
        org.springframework.web.filter.CharacterEncodingFilter
        
        
            encoding
            utf-8
        
        
        
            forceRequestEncoding
            true
        
    
    
        CharacterEncodingFilter
        /*
    

为啥能解决呢

我们点进去这个类

CharacterEncodingFilter

不难发现这个类有三个属性 'encoding' 和

forceRequestEncoding 
forceResponseEncoding

这三个属性

看一下方法

 就能发现这个dofilter的方法 就是主要解决乱码问题 来看一下1

 默认为发false

所以我们设置true

 所以在web.xml配置filter拦截器

 


 

接着上面的视图渲染 我们刚才debug走到了

下面我们接着走 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/789912.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-05
下一篇 2022-05-05

发表评论

登录后才能评论

评论列表(0条)

保存