項(xiàng)目實(shí)踐技術(shù)點(diǎn)積累

velocity

標(biāo)簽內(nèi)使用判斷語(yǔ)句汰聋,修改標(biāo)簽屬性

<li #if(${module}=="users") class="active" #end><a href="/admin/users">賬號(hào)管理</a></li>

使用模板布局,并傳輸參數(shù)

#set($module="users")
#parse( '/admin/nav_bar.html' )

讓velocity解析url上的參數(shù)

在application.properties上添加配置:

spring.velocity.exposeRequestAttributes=true

velocity頁(yè)面中文亂碼問(wèn)題

需要添加以下三個(gè)配置項(xiàng)

spring.velocity.charset=UTF-8
spring.velocity.properties.input.encoding=UTF-8
spring.velocity.properties.output.encoding=UTF-8

velocity 中的null值處理

后臺(tái)傳的值為null虾啦,默認(rèn)情況下,velocity會(huì)把變量 ${variable} 直接顯示出來(lái),而不會(huì)解析為空字符串纹冤。
如果要解析為空字符串,需把變量寫(xiě)成 $!{variable}
可以用#if("$!{varName}" == "") 來(lái)判斷變量空值购公。


Spring-boot

全局配置

Spring MVC 攔截器

Spring MVC中攔截器是實(shí)現(xiàn)了HandlerInterceptor接口的Bean

  • preHandle():預(yù)處理回調(diào)方法萌京,若方法返回值為true,請(qǐng)求繼續(xù)(調(diào)用下一個(gè)攔截器或處理器方法)宏浩;若方法返回值為false知残,請(qǐng)求處理流程中斷,不會(huì)繼續(xù)調(diào)用其他的攔截器或處理器方法比庄,此時(shí)需要通過(guò)response產(chǎn)生響應(yīng)求妹;
  • postHandle():后處理回調(diào)方法,實(shí)現(xiàn)處理器的后處理(但在渲染視圖之前)佳窑,此時(shí)可以通過(guò)modelAndView對(duì)模型數(shù)據(jù)進(jìn)行處理或?qū)σ晥D進(jìn)行處理
  • afterCompletion():整個(gè)請(qǐng)求處理完畢回調(diào)方法制恍,即在視圖渲染完畢時(shí)調(diào)用
    大部分時(shí)候可能只需要實(shí)現(xiàn)其中的preHandle()方法。
public class Interceptor extends HandlerInterceptorAdapter {

    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        System.out.println("This is interceptor.");
        return true;
    }
}

Spring 異常處理

  • 不要在``@Controller中自己進(jìn)行異常處理邏輯神凑。即使它只是一個(gè)Controller相關(guān)的特定異常净神,在@Controller中添加一個(gè)@ExceptionHandler方法處理。
  • 對(duì)于自定義的異常溉委,可以考慮對(duì)其加上@ResponseStatus注解
  • 使用@ControllerAdvice處理通用異常(例如資源不存在鹃唯、資源存在沖突等)

Controller部分

URL處理方法

@Controller 注解標(biāo)記這是個(gè)控制器。

@RequestMapping("/hello") 注解可以配置請(qǐng)求路由瓣喊,每一個(gè)類(lèi)中都可以包含一個(gè)或多個(gè)@RequestMapping注解的方法坡慌。可以標(biāo)記在類(lèi)上藻三,也可以標(biāo)記在方法上洪橘。

@ResponseBody 注解表示處理函數(shù)直接將函數(shù)的返回值傳回到瀏覽器端顯示絮爷。如果不標(biāo)記該注解,則默認(rèn)會(huì)根據(jù)返回的字符串去模板目錄下查詢(xún)同名的HTML模板文件梨树。

@RestController注解:在Controller上標(biāo)注了@RestController,這樣相當(dāng)于Controller的所有方法都標(biāo)注了@ResponseBody坑夯。Spring 4.x中支持。

URL中的變量可以用{variableName}來(lái)表示抡四,同時(shí)在方法的參數(shù)中加上@PathVariable("variableName")柜蜈,那么當(dāng)請(qǐng)求被轉(zhuǎn)發(fā)給該方法處理時(shí),對(duì)應(yīng)的URL中的變量會(huì)被自動(dòng)賦值給被@PathVariable注解的參數(shù)(能夠自動(dòng)根據(jù)參數(shù)類(lèi)型賦值)指巡。
如果用@RequestParam注解可以解析HTTP請(qǐng)求中Body中的內(nèi)容淑履。

@RequestMapping("/posts/{id}")
public String post(@PathVariable("id") int id) {
    return String.format("post %d", id);
}

@RequestMapping("/test")
 public String test(@RequestParam("name") String name){
  return "name=" + name;
 }

頁(yè)面redirect重定向

Spring MVC通過(guò)返回值中添加redirect:前綴來(lái)完成此類(lèi)重定向,如果需要封裝參數(shù)藻雪,可以使用RedirectView秘噪。

@RequestMapping(value = "/", method = RequestMethod.POST)
public String create(@Valid Post post, BindingResult result) {
    Post p = Data.add(post);
    return "redirect:/posts/" + p.getId();
}

forward跳轉(zhuǎn)后給頁(yè)面?zhèn)鲄?/h4>
@RequestMapping(value = "/create")
public String create(@Valid Post post, HttpServletRequest request) {
    request.setAttribute("status",1);
    return "forward:/admin/index";
}

Spring boot 自定義返回JSON(不使用對(duì)象)

Spring boot 如果在Controller上標(biāo)記@ResponseBody,則框架會(huì)對(duì)響應(yīng)信息默認(rèn)進(jìn)行JSON格式轉(zhuǎn)換勉耀,如果返回對(duì)象指煎,則會(huì)把對(duì)象格式化為標(biāo)準(zhǔn)JSON。
但是如果開(kāi)發(fā)者想自定義JSON時(shí)便斥,總不能每個(gè)JSON都去創(chuàng)建一個(gè)Entity類(lèi)至壤,這里建議使用返回Map的形式,也會(huì)被框架格式化為JSON枢纠。

@RequestMapping("/posts/{id}")
@ResponseBody
public String post(@PathVariable("id") int id) {
  Map<String,String> ret = new HashMap<String, String>(); 
  ret.put("success", "true");
  ret.put("updateRows", String.valueOf(i));
  return ret;
}

錯(cuò)誤處理

發(fā)現(xiàn)錯(cuò)誤以后像街,需要重新返回創(chuàng)建文章的頁(yè)面并把錯(cuò)誤提示給用戶(hù):

@RequestMapping(value = "/", method = RequestMethod.POST)
public String create(@Valid Post post, BindingResult result) {
    if (result.hasErrors()) {
        return "create";
    }
    Data.posts.add(post);
    return "createResult";
}

模板中獲取錯(cuò)誤信息:

<form action="/posts/" method="post" th:object="${post}">
  <div class="form-group">
    <label for="title">標(biāo)題</label>
    <input type="text" class="form-control"
           id="title" name="title" th:field="*{title}"
           placeholder="文章的標(biāo)題" autofocus=""/>
    <p th:if="${#fields.hasErrors('title')}" th:errors="*{title}">標(biāo)題長(zhǎng)度必須在2-30之間</p>
  </div>
  <div class="form-group">
    <label for="content">內(nèi)容</label>
    <textarea class="form-control" id="content" name="content" th:field="*{content}"
              placeholder="文章的內(nèi)容" rows="18"></textarea>
    <p th:if="${#fields.hasErrors('content')}" th:errors="*{content}">內(nèi)容不可為空</p>
  </div>
  <button type="submit" class="btn pull-right btn-primary">保存</button>
</form>

具體例子參考:http://course.tianmaying.com/web-development/lesson/form-validation#

Spring數(shù)據(jù)綁定

如果某個(gè)功能提交的請(qǐng)求參數(shù)較多,Spring支持在@RequestMapping注解的方法中使用對(duì)象來(lái)進(jìn)行參數(shù)綁定晋渺。

@RequestMapping(value = "/posts", method = RequestMethod.POST)
public String create(Post post) {
    Data.posts.add(post);
    return "createResult";
}

本質(zhì)上Post post參數(shù)實(shí)際上是由Spring創(chuàng)建并設(shè)置相應(yīng)的字段镰绎,所以需要保證Post類(lèi)有默認(rèn)構(gòu)造函數(shù)。

數(shù)據(jù)處理部分

Spring data JPA 使用更新操作

需要用@Modifying來(lái)標(biāo)記這是個(gè)更新語(yǔ)句木西。
需要在Service方法上標(biāo)記@Transactional事務(wù)注解畴栖,否則更新/刪除操作會(huì)報(bào)錯(cuò)。

@Modifying
@Transactional
@Query("update User u set u.enable = :enable where u.id = :id")
public int enableUser(@Param("id") Long id,  @Param("enable") Boolean enable);

如果是對(duì)整條數(shù)據(jù)的更新户魏,也可以通過(guò)傳入對(duì)象來(lái)更新驶臊,注意對(duì)象需設(shè)置id,否則會(huì)變成add操作叼丑。

   qa.setId(id);
   Qa qaSave = qaService.saveQa(qa);

Spring 事務(wù)處理

直接在需要添加事務(wù)的service上標(biāo)注@Transactional 注解就OK了,非常簡(jiǎn)單扛门。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鸠信,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子论寨,更是在濱河造成了極大的恐慌星立,老刑警劉巖爽茴,帶你破解...
    沈念sama閱讀 222,946評(píng)論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異绰垂,居然都是意外死亡室奏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)劲装,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)胧沫,“玉大人,你說(shuō)我怎么就攤上這事占业∪拊梗” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,716評(píng)論 0 364
  • 文/不壞的土叔 我叫張陵谦疾,是天一觀的道長(zhǎng)南蹂。 經(jīng)常有香客問(wèn)我,道長(zhǎng)念恍,這世上最難降的妖魔是什么六剥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,222評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮峰伙,結(jié)果婚禮上仗考,老公的妹妹穿的比我還像新娘。我一直安慰自己词爬,他們只是感情好秃嗜,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,223評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著顿膨,像睡著了一般锅锨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上恋沃,一...
    開(kāi)封第一講書(shū)人閱讀 52,807評(píng)論 1 314
  • 那天必搞,我揣著相機(jī)與錄音,去河邊找鬼囊咏。 笑死恕洲,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的梅割。 我是一名探鬼主播霜第,決...
    沈念sama閱讀 41,235評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼户辞!你這毒婦竟也來(lái)了泌类?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,189評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤底燎,失蹤者是張志新(化名)和其女友劉穎刃榨,沒(méi)想到半個(gè)月后弹砚,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,712評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡枢希,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,775評(píng)論 3 343
  • 正文 我和宋清朗相戀三年桌吃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片苞轿。...
    茶點(diǎn)故事閱讀 40,926評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茅诱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出呕屎,到底是詐尸還是另有隱情让簿,我是刑警寧澤,帶...
    沈念sama閱讀 36,580評(píng)論 5 351
  • 正文 年R本政府宣布秀睛,位于F島的核電站尔当,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蹂安。R本人自食惡果不足惜椭迎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,259評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望田盈。 院中可真熱鬧畜号,春花似錦、人聲如沸允瞧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,750評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)述暂。三九已至痹升,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間畦韭,已是汗流浹背疼蛾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,867評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留艺配,地道東北人察郁。 一個(gè)月前我還...
    沈念sama閱讀 49,368評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像转唉,于是被迫代替她去往敵國(guó)和親皮钠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,930評(píng)論 2 361

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

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理酝掩,服務(wù)發(fā)現(xiàn)鳞芙,斷路器,智...
    卡卡羅2017閱讀 134,720評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,869評(píng)論 6 342
  • 翻譯自Spring官方文檔 4.1.2版本 相關(guān)文章: Spring參考手冊(cè) 1 Spring Framework...
    liycode閱讀 689評(píng)論 0 2
  • 又到了一年七夕節(jié),傍晚有點(diǎn)下雨镶苞,但似乎只有單身狗們才能感受到這夏日不常見(jiàn)的蒙蒙陰雨喳坠,回家躲了起來(lái)。因?yàn)榇丝套诨丶?..
    陳浪浪閱讀 578評(píng)論 0 1
  • 暑假第47天茂蚓,周五壕鹉。 這幾天發(fā)現(xiàn)一對(duì)一老師過(guò)來(lái)得晚了,問(wèn)了下孩子聋涨,孩子說(shuō)晾浴,反正老師每次都會(huì)晚...
    記得祝福閱讀 167評(píng)論 0 2