SpringBoot 项目入门 0x03

项目优化

操作密码字段

在0x02中,我们获取了用户的信息,但是我们不希望密码被显示出来,此时我们有两种考虑,第一种是删除返回的这个字段,另一个是置为空。
image.png

密码置为空

以最简单的方法来说,我们可以直接把密码字段给设置为null,这样就实现了不显示密码了。
在Service层,操作我们的业务逻辑,我们把从DAO层获取到的数据,根据User类的set方法,把密码字段置为空就好了。

注意

思考:我们在User实体类中没有写Get和Set方法,在这里我们为什么可以直接使用呢?

答案:

因为lombok的@Data注解
@Data注解可以拆解成@Getter 和 @Setter
而他们会自动的帮我们写好get和set方法

image.png

删除密码字段

如果不是必须要求,这样写是比较麻烦的,因为我们已经写好了实体,但是不想显示这个实体中的一个属性,所以我们需要转成一个特殊的对象,而重新写一个没有密码字段的实体也是可以的,但是回想到Controller层,我们要的返回值是User,所以要是这样改的话,成本是不是有点太高了呢?
image.png

那么既然提出了这个要求,那我就写一下吧。

思路:

  1. 引入fastjson
  2. 重新写一个controller,废弃了之前的那个
  3. 获取到用户数据后转成json
  4. 删除密码字段后再转成map,返回map

在pom.xml里引入fastjson

image.png

<dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.62</version>
        </dependency>

写Controller

@RequestMapping(value = "getUserByUserNameNoPassword",method = RequestMethod.POST)
    public Map getUserByUserNameNoPassword(String username){
        return userService.getUserByUserNameNoPassword(username);
    }

写service和实现类

Map getUserByUserNameNoPassword(String username);
public Map getUserByUserNameNoPassword(String username) {
        User result = userDao.getUserByUserName(username);  // 在这里还使用之前的那个接口,存在密码的
        Map<String, String> userNonPassword = JSONObject.parseObject(JSON.toJSONString(result), new TypeReference<Map<String, String>>() {
        }); // 把获取到有密码字段的User对象转换成字符串,然后根据JSON,转换成Map集合
        userNonPassword.remove("password"); //删除Map集合中的password键
        return userNonPassword; 返回最终结果
    }

image.png

这只是其中的一种方法,也可以使用自己认为更可靠的方法。到这里,我们可以了解到service层的用途了

总结

service层就是处理业务的,我们对数据进行加工的地方

更改请求提交方式

我们知道,GET请求的长度是有限的,Post请求可以提交更为复杂的参数,我们根据用户名获取用户是采用了Get请求,那么我们如果尝试使用POST请求会发生什么呢?
我们发现,当我们接口不要求请求类型的时候,GET和POST都可以正常响应的

@RequestMapping("/getUserByUserName")
        public User getUser(String username) {
        User user = userService.getUserByUserName(username);
        return user;
    }

image.png

image.png

那么如果我只希望请求提交的方式为POST,而不处理GET请求,该怎么做呢?

只接受GET请求

在这里,我们需要再写几个Controller了,为了方便,我们只关心Controller层,不再继续深度调用了,结果直接在Controller层返回到View了。
在Controller层添加

@RequestMapping(value = "/GET", method = RequestMethod.GET) // 注意这行的method
    public String GET() {
        return "你使用的是GET请求";
    }

正常GET请求访问接口

image.png
使用POST请求访问接口
image.png
此时会显示错误码405,Method Not Allowed,这也就是说你的请求方式不对。

只接受POST请求

在Controller层添加

@RequestMapping(value = "/POST", method = RequestMethod.POST)
    public String POST() {
        return "你使用的是POST请求";
    }

使用POST请求访问接口
image.png

使用GET请求访问接口
image.png

那我想GET和POST请求返回不同的结果呢?

这个问题问的好,既然是这样,我们RequestMapping中的method是不是不能再写了,因为写了的话,就必须是那种方式发的请求了,所以是需要缺省状态的。
那么我们怎么才能知道你的请求方式是什么呢?这时候才是考验我们的基本功的时候了,在Servlet中,我们知道HttpServletRequest这个类,他是处理我们HTTP请求的接口,一切的请求最终都会交给Servlet来处理。

我们写一个Controller

@RequestMapping(value = "/Request")
    public String Request(HttpServletRequest hsr) {
        return "你的请求方式是:"+hsr.getMethod();
    }

image.png
image.png
image.png
image.png
我们可以看到,什么请求提交过来的,他都可以正确的识别了,那么接下来我们再写相关逻辑。

@RequestMapping(value = "/operation", method = RequestMethod.POST)
    public String post2() {
        return "执行POST方法";
    }
    @RequestMapping(value = "/operation", method = RequestMethod.GET)
    public String get2() {
        return "执行GET方法";
    }

在这里,我们发现@RequestMapping中的value值是一样的,而method不一样,这是允许的,而下面的post2和get2为什么不能写一样的呢?

答案

学傻了吧,方法名不能是一样的呀【不包含方法重载】

image.png
image.png

当然,写在同一个Controller中也是可以的,但是这样就不是很好看了。

@RequestMapping(value = "/Request")
    public String Request(HttpServletRequest hsr) {
//        return "你的请求方式是:" + hsr.getMethod();
        if (hsr.getMethod().equals("POST")) {
            return "你的请求方式是:POST";
        } else if (hsr.getMethod().equals("GET")) {
            return "你的请求方式是:GET";
        }else{
            return "请求非法";
        }
    }

image.png
image.png
image.png

优化注解

在每个请求映射中,我们写的是@RequestMapping,而想要规定请求方式,还需要加method属性,此时我们可以使用

@GetMapping
@PostMapping

比如

@GetMapping(value = "/test")

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。