GET/POST注解
在之前编写的实际代码中,通过请求获取值的方法都是GET,我在文字里提了一下使用POST也是可以的。
在实际开发中,一般提交表单都是POST请求,很多方法也需要区分接受的POST还是GET请求。
区分GET和POST方法,可以在@RequestMapping
的参数中使用method进行设置。如果不在@RequestMapping
中显式的设置方法,则这个控制器方法对于GET和POST请求都会进行处理。
从Spring 4.3开始,还引入了@GetMapping
和@PostMapping
两个注解,用于直接标示GET和POST方法,不符合要求的请求就会被忽略。
引入这两个注解主要是因为后边我们要用到的修改数据和新增数据,都要使用POST请求,而显示列表一般使用的是GET请求。
所以现在我们就把显示customer列表的方法改成@GetMapping,在之后编写控制器方法的时候,都会具体指定请求的种类。
@Controller @RequestMapping(value = "/customer") public class CustomerController { @Autowired private CustomerDAO customerDAO; <span style="color: red">@GetMapping(value = "/list")</span> public String test(Model model) { List<Customer> customers = customerDAO.getCustomers(); for (Customer c : customers) { System.out.println(c); } model.addAttribute("customers", customers); return "list-customers"; } }
Service层
看最开始的那副架构图,我们直接把DAO对象注入到了控制器对象中。实际并不是这样,而是要再多一层业务层。
由于我们现在的应用比较简单,业务逻辑都在控制层内完成,实际上控制层负责的是视图和与请求之间的交互,而数据处理和业务逻辑,都需要单独在业务层内进行。
通过新增加一层业务层,也将控制层和DAO层彻底分离,方便切换不同的业务和数据组件,还可以通过业务层,同时使用多个DAO层,极大的扩展了Web应用。
于是现在的结构变成:向Service层注入DAO对象,向控制层注入Service层对象。
对于Service对象,Spring也提供了一个注解@Service
,同样也继承了@Component注解,和另外两个类似。
现在来创建一个Service类实现的接口,以及一个Service实现类,并注入DAO对象。创建cc.conyli.service包,在其中先编写接口:
package cc.conyli.service; import cc.conyli.entity.Customer; import java.util.List; public interface CustomerService { public List<Customer> getCustomers(); }
这里的抽象方法也是返回List<Customer>对象,用于继续向控制层返回。
再来编写实现类:
package cc.conyli.service; import cc.conyli.dao.CustomerDAO; import cc.conyli.entity.Customer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import java.util.List; @Service public class CustomerServiceImpl implements CustomerService { @Autowired private CustomerDAO customerDAO; @Override @Transactional public List<Customer> getCustomers() { return customerDAO.getCustomers(); } }
@Service注解外加注入CustomerDAO对象对我们来说已经司空见惯了,这里的关键是@Transactional
注解被移动到了Service层的方法上,这也是一个传统做法,即一次性完成这个功能。这里就从DAO对象去掉相应的注解,代码就省略了。
然后我们需要修改Controller对象,注入的不再是DAO对象,而是Service对象:
@Controller @RequestMapping(value = "/customer") public class CustomerController { @Autowired private CustomerService customerService; @GetMapping(value = "/list") public String test(Model model) { List<Customer> customers = customerService.getCustomers(); for (Customer c : customers) { System.out.println(c); } model.addAttribute("customers", customers); return "list-customers"; } }
在控制层修改注入对象,然后更新一下调用的对象名称即可。重新启动项目,可以发现正常工作了。
这里需要注意Spring的开发组不推荐大家直接使用域注入,还是使用构造器注入比较好,今后编写代码时可以注意一下。
现在我们就按照标准Web应用的控制层-业务层-DAO层创建好了项目结构,剩下的各个功能,就在此基础上继续添加了。