Spring中級(jí)課程第一課

一. 創(chuàng)建簡單工程
網(wǎng)頁SpringBoot
進(jìn)入[SpringBoot網(wǎng)站][],選擇自己需要的依賴(Web,Velocity,AOP),生成工程,減少自己配置的工作量。
打開Idea,導(dǎo)入工程,然后靜靜等待一會(huì)即可。
[SpringBoot網(wǎng)站]:http://start.spring.io/

  1. 簡單結(jié)構(gòu)
    web請(qǐng)求--->控制器---->服務(wù)---->DAO(--->數(shù)據(jù)庫)
  2. 注解和對(duì)應(yīng)方法參數(shù)
//相對(duì)路徑,參數(shù)value和path意義相同,可以寫多個(gè),{"/path1","/path2"}
@RequestMapping(value = {"/profile/{groupId}/{userId}"})
// 該注解用于將Controller的方法返回的對(duì)象,通過適當(dāng)?shù)腍ttpMessageConverter轉(zhuǎn)換為指定格式后,寫入到Response對(duì)象的body數(shù)據(jù)區(qū)。
//根據(jù)返回的字符串,去資源文件夾下找匹配的文件,否則直接返回字符串,
@ResponseBody
//路徑參數(shù)用PathVariable,請(qǐng)求參數(shù)用RequestParam
public String profile(@PathVariable("groupId") String groupId,                      
@PathVariable("userId") int userId,
@RequestParam(value = "type", defaultValue = "1") int type,                      
@RequestParam(value = "key", defaultValue = "nowcoder") String key) {
}
  1. Velocity 模板語法
##獲取變量值
$!{變量/表達(dá)式}
#*多行
注釋*#
##.index 0開始索引,.count為計(jì)數(shù)
#foreach($color in $colors)
Color$!(foreach.count)/$(foreach.index):$!(color)
#
  1. 資源文件
  2. 靜態(tài):static/templates css和images
  3. 模板文件: templates xxx.vn
    a. 模板文件例子1
//java文件
@RequestMapping(value = {"/vm"})
//model 引入變量,多次使用時(shí)模板html中可以替換該值
public String news(Model model){
model.addAttribute("value1", "vv1");   
List<String> colors = Arrays.asList(new String[]{"RED", "GREEN", "BLUE"});
Map<String,String> map = new HashMap<String,String>();
for (int i = 0; i < 4; i++) {    
 map.put(String.valueOf(i), String.valueOf(i * i));
}
model.addAttribute("colors", colors);
model.addAttribute("map", map); 
return "news";
}
//然后可以在模板文件夾下的news.vm文件中調(diào)用value1變量
<html>
<body>
<pre>
    Hello, VM
    ##你看不到我(注解格式)
    $!{value1}##有則輸出,無則空行
    $!{value2}
    ${value3}##完整輸出該字符
##for循環(huán)
    #foreach ($color in $colors)
        Color $!{foreach.index}/$!{foreach.count}:$!{color}
    #end
    #foreach($key in $map.keySet())
        Number $!{foreach.index}/$!{foreach.count}:$!{key} $map.get($key)
    #end
    #foreach($kv in $map.entrySet())
        Number $!{foreach.index}/$!{foreach.count}:$!{kv.key} $!{kv.value}
    #end
    User: $!{user.name}
    User: $!{user.getName()}
  
    #set($hello = "hello") ##類似宏定義
    #set($hworld1 = "$!{hello} world")
    #set($hworld2 = '$!{hello} world')
    hworld1: $hworld1
    hworld2: $hworld2
</pre>
</body>
</html>

b. include和parse

##header.vm
Title <h>$!title</h>
##news.vm
##設(shè)置title變量值
#set($title = "nowcoder")
Include: #include("header.vm")
Parse: #parse("header.vm")
/*輸出 Include: TiTle $!title    Parse: TiTle nowcoder
說明,include嵌入文件,parse還會(huì)解析其中的變量*/

c. macro

#macro(render_color, $color, $index)    
    Color By Macro $index, $color
#end
#foreach ($color in $colors)    
    #render_color($color, $foreach.index)
#end
  1. 請(qǐng)求和響應(yīng)
    a. 請(qǐng)求
    參數(shù)解析,cookie讀取,http請(qǐng)求字段和文件上傳
@RequestMapping(value = {"/request"})
@ResponseBody
//一般都設(shè)置這三個(gè)參數(shù)
public String request(HttpServletRequest req,
HttpServletResponse resp,
HttpSession session){    
StringBuilder sb = new StringBuilder();
//獲取請(qǐng)求頭的名字,返回枚舉類型
Enumeration<String> headerNames = req.getHeaderNames();    
while (headerNames.hasMoreElements()) {
String name = headerNames.nextElement();
sb.append(name + ":" + req.getHeader(name) + "<br>");    
}    
return sb.toString();
}

b. 響應(yīng)
頁面內(nèi)容返回,cookie下發(fā),http字段設(shè)置,headers

@RequestMapping(value = {"/response"})
@ResponseBody
public String response(@CookieValue(value = "nowcoderid", defaultValue = "a") String nowcoderId,
@RequestParam(value = "key", defaultValue = "key") String key,
 @RequestParam(value = "value", defaultValue = "value") String value,
HttpServletResponse resp) {
resp.addCookie(new Cookie(key,value));
resp.addHeader(key, value);
return "NowCoderId From COOkie: " + nowcoderId;}
  1. 重定向
    301:永久轉(zhuǎn)移,第一次訪問后記錄在瀏覽器中,再次訪問時(shí),直接跳重定向的路徑,而不用先訪問原地址。
    302:臨時(shí)轉(zhuǎn)移,直接的方式return "redirect:/"
@RequestMapping("/redirect/{code}")
public RedirectView redirect(@PathVariable("code") int code) {
    RedirectView red = new RedirectView("/",true);
    if (code == 301) {
        red.setStatusCode(HttpStatus.MOVED_PERMANENTLY);
    }
    return red;
}
  1. 錯(cuò)誤處理
@RequestMapping("/admin")
@ResponseBodypublic
 String admin(@RequestParam(value = "key", required = false) String key){
    if ("admin".equals(key)) {
        return "Hello admin! ";
    }
//沒寫異常處理,拋出異常,類似沒找到資源,
    throw new IllegalArgumentException("Key 錯(cuò)誤");
}
/*結(jié)果:Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.

Wed Nov 16 14:03:51 CST 2016
There was an unexpected error (type=Internal Server Error, status=500).
Key 錯(cuò)誤*/
//寫異常處理
@ExceptionHandler()
@ResponseBody
public String error(Exception e) {
    return "error: " + e.getMessage();
}
//結(jié)果:error: Key 錯(cuò)誤
  1. IoC:控制反轉(zhuǎn)分成兩種類型,依賴注入(DI)和依賴查找(DL),前者應(yīng)用比較廣泛,IoC一般指前者
//常規(guī)方式,通過構(gòu)造器傳參,類中的其他方法就可以調(diào)用
//Service.java
public String service(){
 return "service()";
}
//Application.java
public String application(){
   private Service service;
   public Application(Service service){
         this.service = service;
   }
}
//注解方式,通過使用注解,spring自動(dòng)匹配,可以直接調(diào)用,更方便
//Service.java
@Service
public String service(){
 return "service()";
}
//Application.java
public String application(){
   @AutoWired
   private Service service;
   }
}
  1. AOP:面向切面編程,所有業(yè)務(wù)都要處理的業(yè)務(wù),比如log服務(wù)
@Aspect
@Component
public class LogAspect {
    private static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
    @Before("execution(* com.nowcoder.controller.*Controller.*(..))")
    public void beforeMethod(JoinPoint joinPoint) {
        StringBuilder sb = new StringBuilder();
        for (Object arg : joinPoint.getArgs()) {
            sb.append("arg:" + arg.toString() + "|");
        }
        logger.info("before time: " + new Date());
        logger.info("before method: "+ sb.toString());
    }
    @After("execution(* com.nowcoder.controller.IndexController.*(..))")
    public void afterMethod() {
        logger.info("after method: ");
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評(píng)論 1 317
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,823評(píng)論 18 139
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,764評(píng)論 0 33
  • 1、Spring MVC請(qǐng)求流程 (1)初始化:(對(duì)DispatcherServlet和ContextLoderL...
    拾壹北閱讀 1,963評(píng)論 0 12
  • 百科說,自卑是一種不能自助和軟弱的復(fù)雜情感。有自卑的人輕視自己,認(rèn)為無法趕上別人。漢語詞典說,自卑是指自己看不起...
    隰有扶蘇閱讀 462評(píng)論 0 0
  • 這篇文章指出了Java中checked Exception的一些缺點(diǎn),提出應(yīng)該在程序設(shè)計(jì)中避免使用checked ...
    Jabari閱讀 836評(píng)論 0 1