在Java EE逐渐没落的今天,Spring框架依然保持着强大的生命力。面试题中经常有它的身影,所以我就感觉到了学习的必要性;了解并实践了一些以后,发现Spring框架确实简化了很多问题,比如这篇博客要讲到的自动类映射,原来需要手动在业务代码里一行一行敲的内容由框架帮忙完成了,代码量减少了,便提高了工作效率。这里我们通过一个Item类的CRUD操作来总结一下我到目前为止的的Spring学习过程。
要实现的功能:item类的增删查改。Item的细节如下:
class Item {
String name;
String desc;
}
有名字和描述两个属性。我们要搭建一个web后端,能够实现与数据库的交互. 这里假设我们有一个ItemDAO类,来处理跟数据库连接有关的操作,细节略
interface ItemDAO {
void insert(Item item);
void update(Item item);
Item get(String name);
void delete(String name);
}
通常DAO类不会用接口来实现,这里为了简洁和代码能编译临时用一下。然后一个Java网络应用,我们用maven管理依赖,GitHub在这里 。复制粘贴pom.xml
, web.xml
,一些该有的文件夹要建好,与web交互无关的细节处理完毕,下面进入正题。
我们要使用4个HTTP动词:GET, POST, DELETE and PUT. 对应到HttpServlet力的do*()
方法:
public class ItemServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// TODO, fill this up
}
public void doPOST(HttpServletRequest request, HttpServletResponse response) {
// TODO, fill this up
}
public void doDELETE(HttpServletRequest request, HttpServletResponse response) {
// TODO, fill this up
}
public void doPUT(HttpServletRequest request, HttpServletResponse response) {
// TODO, fill this up
}
}
用户要增加一个对象,发了一段JSON字符串过来
{"name": "box", "desc": "it is nice"}
在Servlet中,你需要先得到这段字符串
BufferedReader rd = new BufferedReader(new InputStreamReader(request.getInputStream()));
StringBuffer sb = new StringBuffer();
boolean first = true;
String line = null;
while ((line = rd.readLine()) != null) {
if (first) {
sb.append(line);
first = false;
} else {
sb.append('\n' + line);
}
}
String jsonString = sb.toString();
读着可以看到,我们需要费一番功夫才能得到JSON字符串。然后可以用阿里的fastjson库快速从JSON映射到类:
Item item = com.alibaba.fastjson.JSON.parseObject(Item.class, jsonString);
然后再调用DAO类去增删查改。
Spring框架会多用一些依赖,一个是springmvc,另一个jackson跟本文要说的自动类映射有关。需要在web.xml里配置一个DispatcherServlet
作为中央路由处理,另外加一个
这里app可以替换成你的应用。可以从我的GitHub上复制粘贴。
Spring MVC用Controller来处理业务逻辑,注解会比较多。
@Controller
public class ItemController {
@RequestMapping(method = RequestMethod.GET)
public void doGet() {
// TODO, fill this up
}
@RequestMapping(method = RequestMethod.PUT)
public void doPut() {
// TODO, fill this up
}
@RequestMapping(method = RequestMethod.POST)
public void doPost() {
// TODO, fill this up
}
@RequestMapping(method = RequestMethod.DELETE)
public void doDelete() {
// TODO, fill this up
}
}
乍一看差距不大,但Spring MVC提供了这样的功能:
@RequestMapping(method = RequestMethod.POST)
public void doPost(@RequestBody Item item) {
itemDAO.insert(item);
}
一看就知道是什么意思,不用自己去处理IO了,Spring自动把用户发来的JSON转成了类。
使用这个功能还有一些条件,Bean里的Getter Setter要有,并遵从POJO规则,前端发来的JSON里的属性要和Bean的属性名保持一致,不然会有null出现。
本文介绍了Spring MVC里一个我很喜欢的功能 - 自动类映射,并通过与Servlet实现方式的比较,说明了它的优势所在。