SSM框架相關注解的總結
1.SpringMVC中返回值型別為string型別的詳解
- 如果方法上有@ResponseBody修飾的話,返回的就是這個字串物件。一般為傳送的ajax請求,需要將這個字串資料響應給瀏覽器。
- 如果方法上沒有@ResponseBody修飾的話,返回的string裡面如果裡面前面包括redirect:或者forward: 例如:return “forward:index.html”;或者 return “redirect:/namespace/toController”; 這兩個為轉發重定向。
- 如果方法上沒有@ResponseBody修飾的話,返回的string裡面只是一個簡單的字串內容,那麼它就會用到檢視解析器,返回到以檢視解析器裡面以什麼為開頭,什麼為結尾的具體的頁面上。
*一.Spring中的註解:
- 用於建立物件的註解:
相當於:
@Component註解:
作用:把資源讓spring來管理。相當於在xml中配置一個bean,次註解使用在實體bean的頭部
@Component(“accountService”)
public class AccountServiceImpl implements AccountService {}
value = “accountService”:相當於配置了bean標籤的id屬性,我們也可以不寫value的值預設bean的id是當前類的類名首字母小寫accountServiceImpl,單獨配置value時,可以省略value。
@Controller @Service @Repository:
Spring整合junit:
@RunWith: 作用: 替換掉junit的執行器,換成一個可以初始化spring容器的執行器。 屬性: value:單獨配置時,value屬性名稱可以省略,配置SpringJUnit4ClassRunner.class來代替原來junit的執行器 @ContextConfiguration: 作用: 載入配置類或者xml配置檔案 屬性: value[]:用來指定xml配置檔案的路徑 class[]: 用來指定配置類 示例:自動的載入配置檔案的資訊 //表示spring整合junit使用spring容器的執行器 @RunWith(SpringJUnit4ClassRunner.class) //表示載入xml的配置的檔案即可完成配置檔案的載入
@ContextConfiguration(locations={"classpath:applicationContext.xml"})
配置Aop註解:
@EnableAspectJAutoProxy: 宣告使用註解方式的AOP配置了: @Configuration: 標註此類是一個配置的類相當於applicationContext.xml的載入配置的類: @ComponentScan(“com.itheima”): 標註此類相當於applicationContext.xml的載入配置的類,開啟包的全域性的掃描的方式: @Configuration//標註此類是一個配置的類 @ComponentScan(“com.itheima”)//掃描的類 @EnableAspectJAutoProxy//宣告使用註解方式的AOP配置了 public class SpringConfiguration { } @Aspect: 指定當前類是通知類寫在類上: @Aspect//宣告這是一個切面類(通知類)裡面配置的有具體的通知的方法 @Service//將此類放到容器中 public class Logger { } @Before: 前置通知方法: @Before(“execution(* com.itheima.serviceImpl..(…))”) public void beforePrintLog() { System.out.println(“前置通知執行了”); } @after-returning: 後置通知方法: @AfterReturning(“execution(* com.itheima.serviceImpl..(…))”) public void afterReturningPrintLog() { System.out.println(“後置通知執行了”); } @after-throwing: 異常攔截通知方法: @AfterThrowing(“execution(* com.itheima.serviceImpl..(…))”) public void afterThrowingPrintLog() { System.out.println(“異常通知執行了”); } @after: 後通知方法: @AfterReturning(“execution(* com.itheima.serviceImpl..(…))”) public void afterReturningPrintLog() { System.out.println(“後置通知執行了”); } @PointCut: 抽取切點表示式: @Pointcut(“execution(* com.itheima.serviceImpl..(…))”) public void pt1(){ } @around: 環繞通知方法: /** * 環繞通知 * 問題: * 當配置完環繞通知之後,沒有業務層方法執行(切入點方法執行) * 分析: * 通過動態代理的程式碼分析,我們現在的環繞通知沒有明確的切入點方法呼叫 * 解決: * spring框架為我們提供了一個介面,該介面可以作為環繞通知的方法引數來使用 * ProceedingJoinPoint。當環繞通知執行時,spring框架會為我們注入該介面的實現類。 * 它有一個方法proceed(),就相當於invoke,執行目標方法 *
* spring的環繞通知: * 它是spring為我們提供的一種可以在程式碼中手動控制增強方法何時執行的方式。 */ @Around(“pt1()”) public Object around(ProceedingJoinPoint pjp) { try { System.out.println(“增強了前置通知!”); Object obj = pjp.proceed(); System.out.println(“增強了後置通知!”); return obj; } catch (Throwable e) { System.out.println(“增強了異常通知!”); throw new RuntimeException(e); } finally { System.out.println(“增強了最終通知!”); } }
基於註解的事務管理:
@Transactional: @Transactional 註解可以被應用於介面定義和介面方法、類定義和類的 public 方法上。 註解使用在類上表明此類下的所有的方法是一個基於註解的事務 定義在介面上,只有介面的代理的實現的類可認為是基於註解的方法。因為註解不能被繼承。 然而,請注意僅僅 @Transactional 註解的出現不足於開啟事務行為,它僅僅是一種元資料,能夠被可以識別。要開啟註解的植物管理 tx:annotation-driven/: SpringMvc中的註解: @Controller: Spring的Controller是Singleton的。這就意味著會被多個請求執行緒共享。因此,我們將控制器設計成無狀態類: @RequestMapping: 在類前面定義,則將url和類繫結;(如果該類裡只有單個方法的話可以這樣寫,訪問該地址直接呼叫該方法): 示例程式碼如下: @Controller @RequestMapping("/getUser") public class UserController { … … } 定義在方法上則會為方法生成一個請求的路徑: @RequestMapping("/hello") public String getHello() { return “index”; } 可以攜帶請求的引數 Rest風格(佔位符)的對映: @RequestMapping(value=“/user/{name}/{id} “) 請求URL:http://localhost:8080/user/zhangsan/1001.do 這種方式雖然和萬用字元“*”類似,卻比萬用字元更加強大,佔位符除了可以起到通配的作用,最精要的地方是在於它還可以傳遞引數。 測試一: @RequestMapping(value=“show4/{name}/{id}”) public ModelAndView test4(){ ModelAndView mv = new ModelAndView(); mv.setViewName(“hello”); mv.addObject(“msg”, “佔位符的對映:”); return mv; } 與其相關: @GetMapping:相當於@RequestMapping(method = RequestMethod.GET) @PostMapping:相當於@RequestMapping(method = RequestMethod.POST) @PutMapping:相當於@RequestMapping(method = RequestMethod.PUT) @DeleteMapping:相當於@RequestMapping(method = RequestMethod.DELETE) @PathVariable: 與 Rest風格(佔位符)的對映一起使用獲取引數資料: @RequestMapping(value=”/show4/{name}/{id}") public ModelAndView test4(@PathVariable(“name”)String name,@PathVariable(“id”)Long id){ ModelAndView mv = new ModelAndView(); mv.setViewName(“hello”); mv.addObject(“msg”, “佔位符的對映:”+name+"…"+id); return mv; } @PathVariable(“userId”) Long id, @PathVariable(“name”)String name獲取對應的引數: @PathVariable(“key”)中的key必須和對應的佔位符中的引數名一致,而方法形參的引數名可任意取: @RequestParam: A) 常用來處理簡單型別的繫結,通過Request.getParameter() 獲取的String可直接轉換為簡單型別的情況( String–> 簡單型別的轉換操作由ConversionService配置的轉換器來完成);因為使用request.getParameter()方式獲取引數,所以可以處理get 方式中queryString的值,也可以處理post方式中 body data的值: B)用來處理Content-Type: 為 application/x-www-form-urlencoded編碼的內容,提交方式GET、POST: GET模式下,這裡使用了@PathVariable繫結輸入引數,非常適合Restful風格。因為隱藏了引數與路徑的關係,可以提升網站的安全性,靜態化頁面,降低惡意攻擊風險。 POST模式下,使用@RequestBody繫結請求物件,Spring會幫你進行協議轉換,將Json、Xml協議轉換成你需要的物件。 C) 該註解有三個屬性: value、required、defaultValue: value用來指定要傳入值的id名稱: required用來指示引數是否必須繫結: defaultValue用來指定在前端沒有傳值的情況下限定預設的值: @RequestMapping(value=“show19”) public String test19(Model model,@RequestParam(value=“name”)String name){ model.addAttribute(“msg”, “使用@RequestParam接收到的引數為:”+name); return “hello”; } @ResponseStatus @ResponseStatus(value=HttpStatus.OK):如果不響應頁面,就需要響應狀態: @RequestMapping(value = “show23”) @ResponseStatus(value=HttpStatus.OK)//不響應頁面,就需要響應個狀態碼 public void test23(@RequestParam(“name”)String name, @RequestParam(“age”)Integer age, @RequestParam(“isMarry”)Boolean isMarry, //可以將on或者1轉換為true,0轉換為false. @RequestParam(“income”)Float income, @RequestParam(“interests”)String[] interests) { StringBuffer sb = new StringBuffer(); sb.append(“name:”+name+"\n"); sb.append(“age:”+age+"\n"); sb.append(“isMarry:”+isMarry+"\n"); sb.append(“income:”+income+"\n"); sb.append(“interests:[”); for (String inter : interests) { sb.append(inter+" “); } sb.append(”]"); System.out.println(sb.toString()); } @CookieValue使用方法同@RequestParam:獲取cookie的值: @RequestMapping(value = “show22”) public String test22(Model model, @CookieValue(“JSESSIONID”)String jsessionid) { model.addAttribute(“msg”, “jsessionid:” + jsessionid); return “hello”; } @ResponseBody: 只要有這個進行標記的話,所有都是將物件型別轉換為json格式的字串型別,返回的是轉換後的字串,包括返回值型別為string型別的資料,返回的都是一個物件。 當一個處理請求的方法標記為@ResponseBody時,表示該方法需要輸出其他檢視json、xml),springmvc會通過預設的json轉化器轉化輸出,但是需要引入相關的jar包: com.fasterxml.jackson.core jackson-databind /** * 將list集合響應成json資料 * @return */ @RequestMapping(value=“show28”) @ResponseBody//將資料響應成json格式的資料 public List test28() {
List<User> list = new ArrayList<User>();
for(int i = 0;i< 20;i++) {
User user = new User();
user.setId(i+1L);
user.setUsername("zhangsan"+i);
user.setName("張三"+i);
user.setAge(18);
list.add(user);
}
return list;
}
@RequestBody:接收一個json並且轉換成一個物件 /** * 將提交的json格式的資料封裝到user物件中 * * @RequestBody():自動將json資料序列化成一個user物件 * @param model * @param user * @return */ @RequestMapping(value=“show29”) public String test29(Model model,@RequestBody()User user) { model.addAttribute(“msg”, user); return “hello”; } @RestController:controller中的所有方法都預設是響應json格式的資料了。 有時如果在一個Contoller中所有的方法都是用來響應json格式資料的,那麼如果有多個方法,就需要在多個方法上使用@ResponseBody,這樣太麻煩,springmvc提供了一個@RestController,將該註解使用在Controller類上,那麼該controller中的所有方法都預設是響應json格式的資料了: