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

密码置为空
以最简单的方法来说,我们可以直接把密码字段给设置为null,这样就实现了不显示密码了。
在Service层,操作我们的业务逻辑,我们把从DAO层获取到的数据,根据User类的set方法,把密码字段置为空就好了。
思考:我们在User实体类中没有写Get和Set方法,在这里我们为什么可以直接使用呢?
答案:
因为lombok的@Data注解
@Data注解可以拆解成@Getter 和 @Setter
而他们会自动的帮我们写好get和set方法

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

那么既然提出了这个要求,那我就写一下吧。
思路:
- 引入fastjson
- 重新写一个controller,废弃了之前的那个
- 获取到用户数据后转成json
- 删除密码字段后再转成map,返回map
在pom.xml里引入fastjson

<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; 返回最终结果
}

这只是其中的一种方法,也可以使用自己认为更可靠的方法。到这里,我们可以了解到service层的用途了
总结
service层就是处理业务的,我们对数据进行加工的地方
更改请求提交方式
我们知道,GET请求的长度是有限的,Post请求可以提交更为复杂的参数,我们根据用户名获取用户是采用了Get请求,那么我们如果尝试使用POST请求会发生什么呢?
我们发现,当我们接口不要求请求类型的时候,GET和POST都可以正常响应的
@RequestMapping("/getUserByUserName")
public User getUser(String username) {
User user = userService.getUserByUserName(username);
return user;
}


那么如果我只希望请求提交的方式为POST,而不处理GET请求,该怎么做呢?
只接受GET请求
在这里,我们需要再写几个Controller了,为了方便,我们只关心Controller层,不再继续深度调用了,结果直接在Controller层返回到View了。
在Controller层添加
@RequestMapping(value = "/GET", method = RequestMethod.GET) // 注意这行的method
public String GET() {
return "你使用的是GET请求";
}
正常GET请求访问接口

使用POST请求访问接口

此时会显示错误码405,Method Not Allowed,这也就是说你的请求方式不对。
只接受POST请求
在Controller层添加
@RequestMapping(value = "/POST", method = RequestMethod.POST)
public String POST() {
return "你使用的是POST请求";
}
使用POST请求访问接口

使用GET请求访问接口

那我想GET和POST请求返回不同的结果呢?
这个问题问的好,既然是这样,我们RequestMapping中的method是不是不能再写了,因为写了的话,就必须是那种方式发的请求了,所以是需要缺省状态的。
那么我们怎么才能知道你的请求方式是什么呢?这时候才是考验我们的基本功的时候了,在Servlet中,我们知道HttpServletRequest这个类,他是处理我们HTTP请求的接口,一切的请求最终都会交给Servlet来处理。
我们写一个Controller
@RequestMapping(value = "/Request")
public String Request(HttpServletRequest hsr) {
return "你的请求方式是:"+hsr.getMethod();
}




我们可以看到,什么请求提交过来的,他都可以正确的识别了,那么接下来我们再写相关逻辑。
@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为什么不能写一样的呢?
答案
学傻了吧,方法名不能是一样的呀【不包含方法重载】


当然,写在同一个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 "请求非法";
}
}



优化注解
在每个请求映射中,我们写的是@RequestMapping,而想要规定请求方式,还需要加method属性,此时我们可以使用
@GetMapping
@PostMapping
比如
@GetMapping(value = "/test")

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