亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

我們今天來介紹一個(gè)SpringMVC的基本配置,靈活的使用這些配置,可以讓我們?cè)陂_發(fā)中更加靈活的處理業(yè)務(wù)邏輯。

OK,廢話不多說,那就開始吧。

SpringMVC基礎(chǔ)配置(通過注解配置,非xml配置)這篇文章中我們的案例都會(huì)有一個(gè)MvcConfig的類用來做一個(gè)簡(jiǎn)單的配置,主要是通過ViewResolver來解決映射路徑和實(shí)際頁面的位置,這個(gè)類我們還可以繼續(xù)擴(kuò)展,讓其解決更多的問題,我列舉幾個(gè):

  • 靜態(tài)資源映射
  • 攔截器使用
  • 全局配置問題

等等。這些問題我們可以重新定義一個(gè)新的類來解決,也可以擴(kuò)展MvcConfig來解決。我們來一個(gè)個(gè)看看。

靜態(tài)資源映射

我們都知道在SpringMVC中靜態(tài)資源文件都是直接訪問的,而不需要映射,這些靜態(tài)資源主要包括js文件、css文件、圖片文件等,那么這個(gè)需要我們單獨(dú)處理,否則系統(tǒng)會(huì)找不到路徑。OK,這個(gè)問題的解決也很容易,假設(shè)我有一張圖片放在src/main/resources/assets/img目錄下,然后想在jsp頁面中將其展示出來,我們先來看看jsp頁面:

<%@ page contentType="text/html;charset=UTF-8" language="JAVA" %><html><head><title>Hello Sang!</title></head><body><p>Welcome To SpringMVC World!</p><p><img src="../assets/img/1.png"></p></body></html>

然后我們創(chuàng)建MVCConfig類,作用還是和上文一樣,不同的是這次我們繼承自WebMvcConfigurerAdapter,然后重寫WebMvcConfigurerAdapter類中的addResourceHandlers方法來解決這個(gè)問題。如下:

@Configuration@EnableWebMvc@ComponentScan("org.sang")public class MVCConfig extends WebMvcConfigurerAdapter{@Beanpublic InternalResourceViewResolver viewResolver() {InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();viewResolver.setPrefix("/WEB-INF/classes/views/");viewResolver.setSuffix(".jsp");viewResolver.setViewClass(JstlView.class);return viewResolver;}/*** /**的意思是所有文件,包括文件夾中的子文件* /*是所有文件,不包含子文件* /是web項(xiàng)目的根目錄* @param registry*/@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {//兩個(gè)*表示以/assets開始的任意層級(jí)的路徑都可以訪問得到圖片,如<img src="../assets/img/1.png">//一個(gè)*表示只可以訪問assets目錄下的圖片文件registry.addResourceHandler("/assets/**").addResourceLocations("classpath:/assets/");}}

OK,這里繼承WebMvcConfigureAdapter之后,我們可以重寫它里邊的很多方法,重寫這些方法我們可以對(duì)SpringMVC進(jìn)行配置,addResourceHandler指的是訪問路徑,addResourceLocations指的是文件放置目錄。

攔截器

攔截器在JavaEE開發(fā)中還是非常重要的,亂碼解決、權(quán)限控制等等都會(huì)用到,使用Servlet的時(shí)候有一個(gè)Filter類用來進(jìn)行過濾,那么SpringMVC也在這方面給我們提供了相應(yīng)的解決方案。

定義攔截器

攔截器的定義我們可以通過繼承HandlerInterceptorAdapter或者實(shí)現(xiàn)HandlerInterceptor接口,我這里以實(shí)現(xiàn)接口為例:

public class MyInterceptors implements HandlerInterceptor {public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandle");return true;}public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle");}public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");}}

preHandle方法發(fā)生在請(qǐng)求發(fā)生前執(zhí)行,postHandle發(fā)生在請(qǐng)求發(fā)生后執(zhí)行,afterCompletion在請(qǐng)求完成時(shí)執(zhí)行,實(shí)際上執(zhí)行時(shí)機(jī)緊挨著postHandle這個(gè)方法。然后在MVCConfig類中添加addInterceptors方法注冊(cè)攔截器,如下:

@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptors());}@Beanpublic MyInterceptors myInterceptors() {return new MyInterceptors();}

這樣注冊(cè)成功之后,我們?cè)跒g覽器中訪問時(shí),打印日志如下:

基礎(chǔ)決定上層建筑:SpringMVC常用配置

全局配置

全局資源的配置問題,我們可以通過@ControllerAdvice來把控制器的全局配置放在同一個(gè)位置,這樣我們可以統(tǒng)一處理下面幾個(gè)問題:

  • 1 .全局異常處理
  • 2 .預(yù)設(shè)鍵值對(duì)綁定到Model中
  • 3 .預(yù)處理前臺(tái)請(qǐng)求參數(shù)

OK,下面來一個(gè)一個(gè)看一下。

全局異常處理

全局異常主要是通過@ExceptionHandler這個(gè)注解來解決。如下:

@ControllerAdvicepublic class ExceptionHandlerAdvice {//@ExceptionHandler用來設(shè)置攔截條件,這里表示攔截所有的Exception@ExceptionHandler(value = Exception.class)public ModelAndView exception(Exception e, WebRequest request) {ModelAndView modelAndView = new ModelAndView("error");modelAndView.addObject("errorMsg", e.getMessage());return modelAndView;}}

首先通過@ControllerAdvice聲明一個(gè)控制器建言,由于這個(gè)注解組合了@Component注解,這個(gè)這個(gè)類會(huì)自動(dòng)注冊(cè)為Spring容器中的Bean。@ExceptionHandler可以定義全局處理,其中Value屬性用來表示過濾攔截條件,Exception.class表示攔截所有的Exception。構(gòu)造ModelAndView時(shí)傳入的error表示出錯(cuò)的頁面。OK,我們來看一下控制器,我在控制器中添加如下方法:

@RequestMApping("/user")public String user(@ModelAttribute("msg") String msg, UserBean userBean) {System.out.println("username is :" + userBean.getUsername() + ";and id is :" + userBean.getId());throw new IllegalArgumentException("抱歉,參數(shù)異常/ 來自@ModelAttribute:" + msg);}

當(dāng)我訪問/user這個(gè)地址的時(shí)候,直接拋一個(gè)異常,這個(gè)異常會(huì)被使用了@ExceptionHandler注解并且滿足過濾條件的方法接收并處理,我們這里當(dāng)然是來到了exception這個(gè)方法中,在這個(gè)方法中我們又定位到了error.jsp頁面。同時(shí)這里的參數(shù)還使用了@ModelAttribute注解,這個(gè)注解我在下一小節(jié)再來說。我們?cè)賮砜纯催@個(gè)error.jsp頁面:

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>出錯(cuò)啦</title></head><body><p><h1>${errorMsg}</h1></p></body></html>

這個(gè)頁面很簡(jiǎn)單,就顯示一下錯(cuò)誤信息就行了。我們來看看訪問結(jié)果:

基礎(chǔ)決定上層建筑:SpringMVC常用配置

控制臺(tái)輸出的錯(cuò)誤信息:

基礎(chǔ)決定上層建筑:SpringMVC常用配置

預(yù)設(shè)鍵值對(duì)綁定到Model中

有的時(shí)候我們需要預(yù)設(shè)鍵值對(duì)到Model中,就像上面那個(gè)案例那樣,這個(gè)時(shí)候我們可以在ExceptionHandlerAdvice類中再添加一個(gè)方法:@ModelAttributepublic void addAttributes(Model model) {model.addAttribute("msg", "額外信息");}

在這個(gè)方法中我們向Model中綁定鍵值對(duì),綁定完成之后,在任何Controller中我們都可以通過給方法的參數(shù)設(shè)定@ModelAttribute注解來訪問這里存入的值,相當(dāng)于這里的值是一個(gè)全局變量。OK ,這里的訪問案例和上文一致,我就不再贅述了。

預(yù)處理前臺(tái)請(qǐng)求參數(shù)

OK,還有一種需求,有的時(shí)候我們需要預(yù)處理前臺(tái)傳來的參數(shù),比如說禁止掉某一個(gè)參數(shù),這個(gè)也可以統(tǒng)一處理,OK,繼續(xù)在ExceptionHandlerAdvice方法中添加方法

@InitBinderpublic void initBinder(WebDataBinder webDataBinder) {webDataBinder.setDisallowedFields("id");}

這個(gè)表示將客戶端傳來的id參數(shù)忽略掉,但是注意接收的方式,這里通過對(duì)象來接收參數(shù)的時(shí)候才有效(通過對(duì)象接收這個(gè)參數(shù)的時(shí)候才會(huì)屏蔽掉id),如果直接提取還是可以提取到的,我們來看一下控制器方法,還是剛才拋異常那個(gè)方法,但是在拋異常之前我先打印一下日志:

@RequestMapping("/user")public String user(@ModelAttribute("msg") String msg, UserBean userBean) {System.out.println("username is :" + userBean.getUsername() + ";and id is :" + userBean.getId());throw new IllegalArgumentException("抱歉,參數(shù)異常/ 來自@ModelAttribute:" + msg);}

我們看看控制臺(tái)的輸出:

基礎(chǔ)決定上層建筑:SpringMVC常用配置

OK, id已經(jīng)被屏蔽掉了。

本案例下載地址:https://github.com/lenve/JavaEETest/tree/master/Test18-SpringMVC3


原文:https://blog.csdn.net/u012702547/article/details/53695789

分享到:
標(biāo)簽:SpringMVC
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定