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

浅析SpringMvc中参数的解耦

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

浅析SpringMvc中参数的解耦

浅析SpringMvc中参数的解耦
  • springmvc中请求参数的耦合
    • POJO类
    • 日期类型转换
    • List参数的解耦
    • map类型参数
    • restful风格的参数

springmvc中请求参数的耦合

这里所说的是请求时的参数耦合
在javaweb我们常常用request对象来获得请求中的参数
如果request获得的参数名称不匹配,那么获得的参数就为null

比如下面的代码---->>

package com.gavin.test;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@RestController
public class testController {
    @RequestMapping("/tolog.do")
    public String toLogin(HttpServletRequest request, HttpServletResponse resp) {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
//        连接数据库查询
        System.out.println(username + "--" + password);
        return "success";
    }
}


假如请求时参数不匹配,即我们的请求参数只能是username和password

这时候如果改变就会得不到想要的参数;

所以需要一种方式来实现低耦合,不用request对象获得参数并能获得请求时的参数

    @RequestMapping("/tologg.do")
    public String toLogin(String username, String password) {
     
//        连接数据库查询
        System.out.println(username + "--" + password);
        return "success";
    }

这里也是要求请求时的参数要和方法中的参数名一致,如果不一致---->>

那怎么实现解耦合?

我们可以指定请求时的参数别名

    @RequestMapping("/tologgg.do")
    public String toLog(@RequestParam("name") String username,@RequestParam("pwd") String password) {
//        连接数据库查询
        System.out.println(username + "--" + password);
        return "success";
    }

使用这种方式还可以自动实现类型的转换

有时候接收前端的参数太多像这样

后端接收

这时候就要将参数封装为一个类来实现

POJO类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TPerson {
    String name;
    Integer age;
    String gender;
    String[] hobby;
    String birth;
}

这样如果参数发生了变化,我们需要修改TPerson类中的属性而不是方法

springmvc底层是通过getset方法来实现参数的解析—即反射的方式,所以类中必须要有无参构造方法;


这里会涉及到一个问题就是对于一些基本类型的转换是可以的,如果是日期类型的,那会提示转换失败
其实原因很简单,关于日期的转换格式不知道,所以,无法进行解析

日期类型转换

那如果放在实体类中


我们看到既然注解放在参数上时时可以识别日期,那同样我们将注解放到TPerson类中的属性上

除了上述的注解转换方式,spring还提供了转换接口

import lombok.SneakyThrows;
import org.springframework.core.convert.converter.Converter;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class StringToDate implements Converter {
    SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd");
    @SneakyThrows//偷偷默默的抛出异常的注解
    @Override
    public Date convert(String source) {
        Date date = dateFormat.parse(source);
        return date;
    }
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class TPerson {
    String name;
    Integer age;
    String gender;
    String[] hobby;
//    @DateTimeFormat(pattern = "yyyy-MM-dd")
    Date birth;
    @Override
    public String toString() {
        return "TPerson{" +
                "name='" + name + ''' +
                ", age=" + age +
                ", gender='" + gender + ''' +
                ", hobby=" + Arrays.toString(hobby) +
                ", birth='" + birth + ''' +
                '}';
    }
}

请求后-----

害,没有配置转换类,
在配置文件中配置转换类
先看一下要使用的接口


再次请求后得到结果,

可以看到明明通过一个注解的方式解决,却要费尽心思用一个转换类加配置
类解决,显然不是一个方便的方式;

List参数的解耦
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title



名称:
种类:
名称:
种类:

后端—>

package com.gavin.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;


@Data
@AllArgsConstructor
@NoArgsConstructor
public class TUser implements Serializable {
    private Integer userId;

    private String userName;

    private String loginName;

    private String password;

    private Integer roleId;

    private String tel;

    private Date registerTime;

    private String status;

    
    private TRole tRole;
    private static final long serialVersionUID = 1L;


    private List fruitList;
}
    @RequestMapping("/dodo.do")
    public String dododo(TUser tUser){

        System.out.println(tUser.getFruitList());
        return "success";
    }

这里相当于遍历集合中的元素,按照下标的形式进行装配

map类型参数

跟list一样,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title



名称:
种类:
名称:
种类:

后端

    @RequestMapping("/dodo.do")
    public String dododo(TUser tUser){

        System.out.println(tUser.getFruitCount());
        return "success";
    }

只要满足键值对关系就可以了

restful风格的参数

说到这个restful风格,说起来也和常见,比如
链接一下baidu.com

这个就是一种restful风格的解析

在springmvc中怎么用着种风格呢?
我记得之前在某一篇帖子种写了这种方式,今天在此回顾一下,简单说一下大致原理

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

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

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