Loading... # 项目优化 ## 操作密码字段 在0x02中,我们获取了用户的信息,但是我们不希望密码被显示出来,此时我们有两种考虑,第一种是删除返回的这个字段,另一个是置为空。 ![image.png](https://www.zunmx.top/usr/uploads/2022/10/3474537195.png) ### 密码置为空 以最简单的方法来说,我们可以直接把密码字段给设置为null,这样就实现了不显示密码了。 在Service层,操作我们的业务逻辑,我们把从DAO层获取到的数据,根据User类的set方法,把密码字段置为空就好了。 <div class="tip inlineBlock warning"> 思考:我们在User实体类中没有写Get和Set方法,在这里我们为什么可以直接使用呢? <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-cae4e13fac39462d0dbabc29505928eb19" aria-expanded="true"><div class="accordion-toggle"><span style="">答案:</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-cae4e13fac39462d0dbabc29505928eb19" class="collapse collapse-content"><p></p> 因为lombok的@Data注解 @Data注解可以拆解成@Getter 和 @Setter 而他们会自动的帮我们写好get和set方法 <p></p></div></div></div> </div> ![image.png](https://www.zunmx.top/usr/uploads/2022/10/1817184795.png) ### 删除密码字段 如果不是必须要求,这样写是比较麻烦的,因为我们已经写好了实体,但是不想显示这个实体中的一个属性,所以我们需要转成一个特殊的对象,而重新写一个没有密码字段的实体也是可以的,但是回想到Controller层,我们要的返回值是User,所以要是这样改的话,成本是不是有点太高了呢? ![image.png](https://www.zunmx.top/usr/uploads/2022/10/2273862480.png) 那么既然提出了这个要求,那我就写一下吧。 思路: 1. 引入fastjson 2. 重新写一个controller,废弃了之前的那个 3. 获取到用户数据后转成json 4. 删除密码字段后再转成map,返回map #### 在pom.xml里引入fastjson ![image.png](https://www.zunmx.top/usr/uploads/2022/10/3868202764.png) ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.62</version> </dependency> ``` #### 写Controller ```json @RequestMapping(value = "getUserByUserNameNoPassword",method = RequestMethod.POST) public Map getUserByUserNameNoPassword(String username){ return userService.getUserByUserNameNoPassword(username); } ``` #### 写service和实现类 ```java Map getUserByUserNameNoPassword(String username); ``` ```java 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](https://www.zunmx.top/usr/uploads/2022/10/1784951999.png) 这只是其中的一种方法,也可以使用自己认为更可靠的方法。到这里,我们可以了解到service层的用途了 ### 总结 service层就是处理业务的,我们对数据进行加工的地方 ## 更改请求提交方式 我们知道,GET请求的长度是有限的,Post请求可以提交更为复杂的参数,我们根据用户名获取用户是采用了Get请求,那么我们如果尝试使用POST请求会发生什么呢? 我们发现,当我们接口不要求请求类型的时候,GET和POST都可以正常响应的 ```java @RequestMapping("/getUserByUserName") public User getUser(String username) { User user = userService.getUserByUserName(username); return user; } ``` ![image.png](https://www.zunmx.top/usr/uploads/2022/10/3732600359.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/10/2061579285.png) 那么如果我只希望请求提交的方式为POST,而不处理GET请求,该怎么做呢? ### 只接受GET请求 在这里,我们需要再写几个Controller了,为了方便,我们只关心Controller层,不再继续深度调用了,结果直接在Controller层返回到View了。 在Controller层添加 ```java @RequestMapping(value = "/GET", method = RequestMethod.GET) // 注意这行的method public String GET() { return "你使用的是GET请求"; } ``` 正常GET请求访问接口 ![image.png](https://www.zunmx.top/usr/uploads/2022/10/1856211418.png) 使用POST请求访问接口 ![image.png](https://www.zunmx.top/usr/uploads/2022/10/1375699220.png) 此时会显示错误码405,Method Not Allowed,这也就是说你的请求方式不对。 ### 只接受POST请求 在Controller层添加 ```java @RequestMapping(value = "/POST", method = RequestMethod.POST) public String POST() { return "你使用的是POST请求"; } ``` 使用POST请求访问接口 ![image.png](https://www.zunmx.top/usr/uploads/2022/10/1078164994.png) 使用GET请求访问接口 ![image.png](https://www.zunmx.top/usr/uploads/2022/10/1707730780.png) ### 那我想GET和POST请求返回不同的结果呢? 这个问题问的好,既然是这样,我们RequestMapping中的method是不是不能再写了,因为写了的话,就必须是那种方式发的请求了,所以是需要缺省状态的。 那么我们怎么才能知道你的请求方式是什么呢?这时候才是考验我们的基本功的时候了,在Servlet中,我们知道HttpServletRequest这个类,他是处理我们HTTP请求的接口,一切的请求最终都会交给Servlet来处理。 我们写一个Controller ```java @RequestMapping(value = "/Request") public String Request(HttpServletRequest hsr) { return "你的请求方式是:"+hsr.getMethod(); } ``` ![image.png](https://www.zunmx.top/usr/uploads/2022/10/1513288597.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/10/3035357100.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/10/1108565571.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/10/2529551483.png) 我们可以看到,什么请求提交过来的,他都可以正确的识别了,那么接下来我们再写相关逻辑。 ```java @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为什么不能写一样的呢? <div class="panel panel-default collapse-panel box-shadow-wrap-lg"><div class="panel-heading panel-collapse" data-toggle="collapse" data-target="#collapse-b67437bc678b7d67b6313cb2f762fbe571" aria-expanded="true"><div class="accordion-toggle"><span style="">答案</span> <i class="pull-right fontello icon-fw fontello-angle-right"></i> </div> </div> <div class="panel-body collapse-panel-body"> <div id="collapse-b67437bc678b7d67b6313cb2f762fbe571" class="collapse collapse-content"><p></p> 学傻了吧,方法名不能是一样的呀【不包含方法重载】 <p></p></div></div></div> ![image.png](https://www.zunmx.top/usr/uploads/2022/10/156424645.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/10/3838567358.png) 当然,写在同一个Controller中也是可以的,但是这样就不是很好看了。 ```java @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](https://www.zunmx.top/usr/uploads/2022/10/797734736.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/10/548158810.png) ![image.png](https://www.zunmx.top/usr/uploads/2022/10/2824642029.png) ## 优化注解 在每个请求映射中,我们写的是@RequestMapping,而想要规定请求方式,还需要加method属性,此时我们可以使用 ```java @GetMapping @PostMapping ``` 比如 ```java @GetMapping(value = "/test") ``` © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏