利用webflow建網(wǎng)站大型seo公司
一. 攔截器實現(xiàn)HandlerInterceptor 接?
SpringMVC 中的 Interceptor 攔截器也是相當(dāng)重要和相當(dāng)有?的,它的主要作?是攔截?戶的請求并進?相應(yīng)的處理。?如通過它來進?權(quán)限驗證,或者是來判斷?戶是否登陸等操作。對于 SpringMVC 攔截器的定義?式有兩種:
實現(xiàn)接?:org.springframework.web.servlet.HandlerInterceptor
繼承適配器:org.springframework.web.servlet.handler.HandlerInterceptorAdapter
1.攔截器實現(xiàn)HandlerInterceptor 接?
/**1. 2. 攔截器實現(xiàn) HandlerInterceptor 接? */public class MyInterceptor01 implements HandlerInterceptor {/**3. 在 ?標Handler(?法)執(zhí)?前 執(zhí)? 4. 返回 true:執(zhí)?handler?法5. 返回 false:阻??標handler?法執(zhí)?6. @param request7. @param response8. @param handler9. @return10. @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {System.out.println("?標Handler執(zhí)?前執(zhí)?MyInterceptor01 --> preHandle?法...");/**11. 返回 true:執(zhí)?handler?法12. 返回 false:阻??標handler?法執(zhí)?*/return true;}/**13. 在 ?標Handler(?法)執(zhí)?后,視圖?成前 執(zhí)?14. @param request15. @param response16. @param handler17. @param modelAndView18. @throws Exception*/@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response,
Object handler, ModelAndView modelAndView) throws Exception {System.out.println("?標Handler執(zhí)?后,視圖?成前執(zhí)?MyInterceptor01 -->
postHandle?法...");}/**19. 在 ?標Handler(?法)執(zhí)?后,視圖?成后 執(zhí)?20. @param request21. @param response22. @param handler23. @param ex24. @throws Exception*/@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse
response, Object handler, Exception ex) throws Exception {
System.out.println("?標Handler執(zhí)?后,視圖?成后執(zhí)?MyInterceptor01 -->
afterCompletion?法...");}}
2.攔截器xml配置
<mvc:interceptors><!-定義在 mvc:interceptor 下?,可以?定義需要攔截的請求如果有多個攔截器滿?攔截處理的要求,則依據(jù)配置的先后順序來執(zhí)?--><mvc:interceptor><!-- 通過 mvc:mapping 配置需要攔截的資源。?持通配符??膳渲枚鄠€。 --><mvc:mapping path="/**"/> <!-- "/**"表示攔截所有的請求。 --><!-- 通過 mvc:mapping 配置不需要被攔截的資源。?持通配符??膳渲枚鄠€。 --><mvc:exclude-mapping path="/url/*"/> <!-- "/url/*"表示放?url路徑下的請求。 --><bean class="com.xxxx.springmvc.interceptor.MyInterceptor01"/></mvc:interceptor></mvc:interceptors>
二.繼承 HandlerInterceptorAdapter
實際上最終還是 HandlerInterceptor 接?實現(xiàn)。
- ?類實現(xiàn)類
/**1. 攔截器實現(xiàn) 2. 繼承 HandlerInterceptorAdapter 適配器*/public class MyInterceptor02 extends HandlerInterceptorAdapter {/**3. 在 ?標Handler(?法)執(zhí)?前 執(zhí)? 4. 返回 true:執(zhí)?handler?法 5. 返回 false:阻??標handler?法執(zhí)?6. @param request7. @param response8. @param handler9. @return10. @throws Exception*/@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {System.out.println("?標Handler執(zhí)?前執(zhí)?MyInterceptor02 --> preHandle?法...");/**11. 返回 true:執(zhí)?handler?法12. 返回 false:阻??標handler?法執(zhí)?*/return true;}}
- 攔截器xml配置
<mvc:interceptors><mvc:interceptor><!-- 攔截的資源 --><mvc:mapping path="/**"/><!-- 放?的資源 --><mvc:exclude-mapping path="/url/test01"/><mvc:exclude-mapping path="/url/test02"/><bean class="com.xxxx.springmvc.interceptor.MyInterceptor02"/></mvc:interceptor></mvc:interceptors>
- 多個攔截器實現(xiàn)
<mvc:interceptors><!-攔截器鏈(多個攔截器)如果有多個攔截器滿?攔截處理的要求,則依據(jù)配置的先后順序來執(zhí)?先配置的攔截器的 preHandle ?法先執(zhí)?先配置的攔截器的 postHandle、afterCompletion ?法后執(zhí)?--><mvc:interceptor><!-- 攔截所有請求 --><mvc:mapping path="/**" /><bean class="com.xxxx.springmvc.interceptor.MyInterceptor01" /></mvc:interceptor><mvc:interceptor><!-- 攔截所有請求 -->
<mvc:mapping path="/**" /><bean class="com.xxxx.springmvc.interceptor.MyInterceptor02" /></mvc:interceptor></mvc:interceptors>
三. ?件上傳
- pom.xml?件修改
<!-- 添加 commons-fileupload 依賴 --><dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.3.2</version></dependency>
- servlet-context.xml修改
<!-- ?件上傳 --><bean id="multipartResolver"class="org.springframework.web.multipart.commons.CommonsMultipartResolver"><!-- 允許?件上傳的最?尺? --><property name="maxUploadSize"><value>104857600</value></property><!--
設(shè)置?件放?臨時?件夾的最???限制。
此值是閾值,低于此值,則保存在內(nèi)存中,如?于此值,則?成硬盤上的臨時?件。--><property name="maxInMemorySize"><value>4096</value></property></bean>
四.RestFul URL
Restful ?格的 API 是?種軟件架構(gòu)?格,設(shè)計?格?不是標準,只是提供了?組設(shè)計原則和約束條件。它主要?于客戶端和服務(wù)器交互類的軟件?;谶@個?格設(shè)計的軟件可以更簡潔,更有層次,更易于實現(xiàn)緩存等機制。
在Restful ?格中,?戶請求的 url 使?同?個 url,?請求?式:get,post,delete,put…等?式對請求的處理?法進?區(qū)分,這樣可以在前后臺分離式的開發(fā)中使得前端開發(fā)?員不會對請求的資源地址產(chǎn)?混淆和?量的檢查?法名的麻煩,形成?個統(tǒng)?的接?。
在 Restful ?格中,現(xiàn)有規(guī)定如下:
GET(SELECT):從服務(wù)器查詢,可以在服務(wù)器通過請求的參數(shù)區(qū)分查詢的?式。
POST(CREATE):在服務(wù)器端新建?個資源,調(diào)? insert 操作。
PUT(UPDATE):在服務(wù)器端更新資源,調(diào)? update 操作。
PATCH(UPDATE):在服務(wù)器端更新資源(客戶端提供改變的屬性)。(?前 jdk7 未實現(xiàn),tomcat7 不?持)。
DELETE(DELETE):從服務(wù)器端刪除資源,調(diào)? delete 語句。
- Get 請求配置
/*** restful --> get 請求,執(zhí)?查詢操作
* @param id* @return*/@GetMapping("account/{id}")@ResponseBodypublic Account queryAccountById(@PathVariable Integer id){return accountService.selectById(id);}
- Delete 請求配置
/* restful-->delete 請求 執(zhí)?刪除操作* @param id* @return*/
@DeleteMapping("account/{id}")@ResponseBodypublic Map<String,Object> deleteAccount(@PathVariable Integer id){int result = accountService.delAccount(id);Map<String,Object> map=new HashMap<String,Object>();if(result == 1 ){
map.put("msg","success");map.put("code",200); }
else {map.put("msg","error");map.put("code",500);}return map;}
- Post 請求配置
/* restful --> post 請求,執(zhí)?添加操作* @return*/@PostMapping("account")@ResponseBodypublic Map<String,Object> saveAccount(@RequestBody Account account){int result = accountService.saveAccount(account);Map<String,Object> map=new HashMap<String,Object>();if(result == 1 ){
map.put("msg","success");map.put("code",200); }
else {map.put("msg","error");map.put("code",500);}return map;}
- Put 請求配置
/* restful-->put 請求執(zhí)?更新操作* @param id* @param account* @return*/@PutMapping("account")@ResponseBodypublic Map<String,Object> updateAccount(@RequestBody Account account){int result = accountService.updateAccount(account);Map<String,Object> map=new HashMap<String,Object>();if(result == 1 ){
map.put("msg","success");map.put("code",200); }
else {map.put("msg","error");map.put("code",500);}return map;}
五.全局異常統(tǒng)?處理
在 JavaEE 項?的開發(fā)中,不管是對底層的數(shù)據(jù)庫操作過程,還是業(yè)務(wù)層的處理過程,還是控制層的處理過程,都不可避免會遇到各種可預(yù)知的、不可預(yù)知的異常需要處理。每個過程都單獨處理異常,系統(tǒng)的代碼耦合度?,?作量?且不好統(tǒng)?,維護的?作量也很?。
SpringMVC 對于異常處理這塊提供了?持,通過 SpringMVC 提供的全局異常處理機制,能夠?qū)⑺蓄愋偷漠惓L幚韽母魈幚磉^程解耦出來,既保證了相關(guān)處理過程的功能較單?,也實現(xiàn)了異常信息的統(tǒng)?
處理和維護。
全局異常實現(xiàn)?式 Spring MVC 處理異常有 3 種?式:
- 使? Spring MVC 提供的簡單異常處理器 SimpleMappingExceptionResolver
- 實現(xiàn) Spring 的異常處理接? HandlerExceptionResolver ?定義??的異常處理器
- 使? @ExceptionHandler 注解實現(xiàn)異常處理
-
全局異常處理?式?
- 配置簡單異常處理器
可以在處理異常的??獲取異常信息 使用 ${ex}<!-- 配置全局異常統(tǒng)?處理的 Bean (簡單異常處理器) --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"><!-- ??在轉(zhuǎn)發(fā)時出現(xiàn)異常,設(shè)置默認的錯誤?? (error代表的是?個視圖) --><property name="defaultErrorView" value="error"></property><!-- 異常發(fā)?時,設(shè)置異常的變量名 --><property name="exceptionAttribute" value="ex"></property></bean>
- 使??定義異常
使? SimpleMappingExceptionResolver 進?異常處理,具有集成簡單、有良好的擴展性、對已有代碼沒有?侵性等優(yōu)點,但該?法僅能獲取到異常信息,若在出現(xiàn)異常時,對需要獲取除異常以外的數(shù)據(jù)的/*** ?定義異常:參數(shù)異常 */public class ParamsException extends RuntimeException {private Integer code = 300;private String msg = "參數(shù)異常!";public ParamsException() {super("參數(shù)異常!");}public ParamsException(String msg) {super(msg);this.msg = msg;}public ParamsException(Integer code) {super("參數(shù)異常!");this.code = code;}
情況不適?。
- 配置簡單異常處理器
-
全局異常處理?式?(推薦)
-
實現(xiàn) HandlerExceptionResolver 接?
/*** 全局異常統(tǒng)?處理 */@Componentpublic class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) {ModelAndView mv = new ModelAndView("error");mv.addObject("ex","默認錯誤信息");return mv;}}
-
?定義異常處理
/*** 全局異常統(tǒng)?處理 */@Componentpublic class GlobalExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler, Exception ex) {ModelAndView mv = new ModelAndView("error");mv.addObject("ex","默認錯誤信息");// 判斷是否是?定義異常 if (ex instanceof ParamsException) {mv.setViewName("params_error");ParamsException e = (ParamsException) ex;mv.addObject("ex", e.getMsg());}if (ex instanceof BusinessException) {mv.setViewName("business_error");BusinessException e = (BusinessException) ex;mv.addObject("ex", e.getMsg());}return mv;}}
使?實現(xiàn) HandlerExceptionResolver 接?的異常處理器進?異常處理,具有集成簡單、有良好的擴展性、對已有代碼沒有?侵性等優(yōu)點,同時,在異常處理時能獲取導(dǎo)致出現(xiàn)異常的對象,有利于提供更詳細的異常處理信息。
-
-
全局異常處理?式三
-
??處理器繼承 BaseController
public class BaseController {@ExceptionHandlerpublic String exc(HttpServletRequest request,HttpServletResponse response,Exception ex){request.setAttribute("ex", ex);if(ex instanceof ParamsException){return "error_param";}if(ex instanceof BusinessException){return "error_business";}return "error";}}
使? @ExceptionHandler 注解實現(xiàn)異常處理,具有集成簡單、有擴展性好(只需要將要異常處理的 Controller 類繼承于 BaseController 即可)、不需要附加Spring 配置等優(yōu)點,但該?法對已有代碼存在?侵性(需要修改已有代碼,使相關(guān)類繼承于 BaseController),在異常處理時不能獲取除異常以外的數(shù)據(jù)
-
-
未捕獲異常的處理
對于 Unchecked Exception ??,由于代碼不強制捕獲,往往被忽略,如果運?期產(chǎn)?了Unchecked Exception,?代碼中?沒有進?相應(yīng)的捕獲和處理,則我們可能不得不?對尷尬的 404、 500……等服務(wù)器內(nèi)部錯誤提示??。此時需要?個全??有效的異常處理機制。?前?多數(shù)服務(wù)器也都?持在 web.xml 中通過(Websphere/Weblogic)或者(Tomcat)節(jié)點配置特定異常情況的顯示??。修改 web.xml ?件,增加以下內(nèi)容:
<!-- 出錯??定義 --><error-page><exception-type>java.lang.Throwable</exception-type><location>/500.jsp</location></error-page><error-page><error-code>500</error-code><location>/500.jsp</location></error-page><error-page><error-code>404</error-code><location>/404.jsp</location></error-page>