Spring常用注解
基本组件:
@Component:标识了一个受Spring管理的组件,泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Respository:标识持久层,数据访问组件,即DAO组件。
@Service:标识业务层组件。
@Controller:标识表现层,控制层组件。
@RequestMapping
@RequestMapping是用来处理请求地址映射的注解,可用于类或方法上。用在类上,标识类中所有的响应方法都是以该地址作为父路径来访问,用在方法上表示方法的访问路径,两者结合起来的访问路径为完整的访问某个方法的路径。
@RequestMapping注解的属性:
value:指请求的实际地址,指定的地址可以是URI Template模式;
method:指定访问的方法;
consumes:指定处理请求的内容类型,比如application/json;text/html;
produces:指定返回的内容类型;
params:指定request中必须包含某些参数时,才让该方法处理请求;
headers:指定request中必须包含的header值,才能让该方法处理请求。
1 @Controller 2 @RequestMapping(value = "/risklist/RiskLibraryController") 3 public class RiskLibraryController { 4 5 @Resource 6 private ErmCommonService ermCommonService; 7 }
1 @RequestMapping(value = "/riskLibraryIndex" method = RequestMethod.POST) 2 public String riskLibraryIndex(@RequestParam("riskOrgId") String riskOrgId, Model model) { 4 IRiskOrgBean riskOrg = ermCommonService.findById(RiskOrgBean.class, riskOrgId); 6 }
@Resource和@Autowired
@Resource和@Autowired都是做bean的注入时使用,都可以写在字段上,或者是setter方法上。
@Autowired注解是按照类型(byType)装配依赖对象(由Spring提供),默认情况下,他要求依赖对象必须存在,如果允许为null,则设置他的required=false
1 @Autowired(required=false)
如果在此基础上想通过byName来装配,可以结合@Qualifier注解来一起使用。
1 @Autowired() @Qualifier("baseDao") 2 private BaseDao baseDao;
@Resource默认是按byName自动注入。
@Resource有两个重要的属性,name和type。
@Resource如果写属性name,则按照byName来装配,如果属性为type,则按照byType来装配,不写按照默认的方式来装配(byName)
1 @Service 2 public class RiskCategoryServiceImpl implements RiskCategoryService { 3 4 @Resource 5 private RiskCategoryDao riskCategoryDao; 6 @Resource 7 private RiskCategoryHistoryDao riskCategoryHistoryDao; 8 @Resource 9 private ErmCommonService ermCommonService; 10 @Resource 11 private RiskCodeNumService riskCodeNumService; 12 @Resource 13 private RiskVersionDao riskVersionDao; 14 @Resource 15 private RiskLibraryService riskLibraryService; 16 @Resource 17 private RiskEventService riskEventService; 18 @Resource 19 private RiskCriteriaService riskCriteriaService; 20 @Resource 21 private ExtendFieldValueService extendFieldValueService; 22 }
@RequestParam
@RequestParam类似于request.getParameter("name")有三个参数:
defaultValue:表示设置默认值。
required:通过boolean设置是否是必须传入的参数。
value:表示接受传入参数的类型。
1 @RequestMapping("testRequestParam") 2 public String filesUpload(@RequestParam String inputStr, HttpServletRequest request) { 3 System.out.println(inputStr); 4 5 int inputInt = Integer.valueOf(request.getParameter("inputInt")); 6 System.out.println(inputInt); 7 8 // ......省略 9 return "index"; 10 }
1 // required=false表示不传的话,会给参数赋值为null,required=true就是必须要有 2 @RequestMapping("testRequestParam") 3 public String filesUpload(@RequestParam(value="aa", required=true) String inputStr, HttpServletRequest request)
@ResponseBody
该注解将controller的方法返回对象,通过适当的HttpMessageConverter转换为指定格式后写入到Response对象的body数据区。通常用来返回json数据或xml数据,需要注意的呢,在使用此注解之后不会再走视图处理器,而是直接将数据写入到输入流中,他的效果等同于通过response对象输出指定格式的数据。
返回的数据不是html标签页面,而是其他某种数据格式时(json、xml)等使用。
1 @RequestMapping("/login") 2 @ResponseBody 3 public User login(User user){ 4 return user; 5 }
user字段:userName pwd
那么在前台接受到的数据为:'{"userName":"xxx","pwd":"xxx"}'
效果等同于如下代码:
1 @RequestMapping("/login") 2 public void login(User user, HttpServletResponse response){ 3 response.getWriter.write(JSONObject.fromObject(user).toString()); 4 }
@RequestBody
该注解用于读取Request请求的body部分数据,使用系统默认配置HttpMessageCoverter进行解析,然后把相应的数据绑定到返回的对象上。然后再把HttpMessageCoverter返回的对象数据绑定到controller的方法参数上。
@RequestBody接受的是一个Json对象,其实,@RequestBody接受的是一个JSON对象的字符串,而不是json对象,然而在ajax请求往往传的都是json对象,用JSON.Stringify(data)的方式就能将对象转为字符串,同时使用ajax请求的时候也要指定dataType:“json”,contentType:“application/json”这样就可以轻易的将一个对象或者List传到Java端,使用@RequestBody即可绑定对象或者List。
1 <script type="text/javascript"> 2 $(document).ready(function(){ 3 var saveDataAry=[]; 4 var data1={"userName":"test","address":"gz"}; 5 var data2={"userName":"ququ","address":"gr"}; 6 saveDataAry.push(data1); 7 saveDataAry.push(data2); 8 $.ajax({ 9 type:"POST", 10 url:"user/saveUser", 11 dataType:"json", 12 contentType:"application/json", 13 data:JSON.stringify(saveData), 14 success:function(data){ 15 16 } 17 }); 18 }); 19 </script>
1 @RequestMapping(value = "saveUser", method = {RequestMethod.POST }}) 2 @ResponseBody 3 public void saveUser(@RequestBody List<User> users) { 4 userService.batchSave(users); 5 }
@Respository
@Respository用于注解DAO层,在daoImpl上面注解。
1 @Repository 2 public class RiskLibraryDaoImpl extends ErmGenericDaoImpl<RiskLibrary> implements RiskLibraryDao { 3 @Override 4 @SuppressWarnings("unchecked") 5 public IRiskLibraryBean findRiskLibraryByOrgAndVersion(String riskOrgId, String subVersionId,String riskLibraryType) { 6 if(StringUtils.isBlank(riskLibraryType)){//空的时候默认值 7 riskLibraryType = "Normal";//Project 8 } 9 String jpql = "from RiskLibraryBean rlb where rlb.riskOrg.id = ? and rlb.subVersionId = ? and type = ? "; 10 List<IRiskLibraryBean> riskLibraryList = (List<IRiskLibraryBean>) this.findInstance(jpql, riskOrgId, 11 subVersionId,riskLibraryType); 12 if (riskLibraryList != null && riskLibraryList.size() > 0) { 13 return riskLibraryList.get(0); 14 }else { 15 return null; 16 } 17 18 19 } 20 }
@ModelAttribute
被ModelAttribute注释的方法会在此controller每个方法执行前执行,因此对于一个controller映射多个URL的用法来说,要谨慎使用。
@ModelAttribute注解可以标注方法和参数,当标注参数时,表示从session或者impitmodel中获取这个属性对象,然后从request参数获取一些属性值来覆盖ModelAttribute标准的对象中的部分属性。
1 @RequestMapping(value="/model2/{username}") 2 public String test2(@ModelAttribute("model") DataBinderTestModel model)
1 /** 2 * 设置这个注解之后可以直接在前端页面使用hb这个对象(List)集合 3 * @return 4 */ 5 @ModelAttribute("hb") 6 public List<String> hobbiesList(){ 7 List<String> hobbise = new LinkedList<String>(); 8 hobbise.add("basketball"); 9 hobbise.add("football"); 10 hobbise.add("tennis"); 11 return hobbise; 12 }
前台代码:
1 <br> 2 初始化的数据 : ${hb } 3 <br> 4 5 <c:forEach items="${hb}" var="hobby" varStatus="vs"> 6 <c:choose> 7 <c:when test="${hobby == 'basketball'}"> 8 篮球<input type="checkbox" name="hobbies" value="basketball"> 9 </c:when> 10 <c:when test="${hobby == 'football'}"> 11 足球<input type="checkbox" name="hobbies" value="football"> 12 </c:when> 13 <c:when test="${hobby == 'tennis'}"> 14 网球<input type="checkbox" name="hobbies" value="tennis"> 15 </c:when> 16 </c:choose> 17 </c:forEach>