java元婴期(31)----java进阶(springmvc(5)---数据回显数据交互拦截器)
數據回顯
什么數據回顯
提交后,如果出現錯誤,將剛才提交的數據回顯到剛才的提交頁面。
pojo數據回顯方法
1、springmvc默認對pojo數據進行回顯。
pojo數據傳入controller方法后,springmvc自動將pojo數據放到request域,key等于pojo類型(首字母小寫)
使用@ModelAttribute指定pojo回顯到頁面在request中的key
?
2、@ModelAttribute還可以將方法的返回值傳到頁面
在商品查詢列表頁面,通過商品類型查詢商品信息。
在controller中定義商品類型查詢方法,最終將商品類型傳到頁面。
頁面上可以得到itemTypes數據。
使用最簡單方法使用model,可以不用@ModelAttribute
簡單類型數據回顯
使用最簡單方法使用model。
model.addAttribute("id", id);?
數據交互
上傳圖片
需求
在修改商品頁面,添加上傳商品圖片功能。
springmvc中對多部件類型解析
在頁面form中提交enctype="multipart/form-data"的數據時,需要springmvc對multipart類型的數據進行解析。
在springmvc.xml中配置multipart類型解析器。
加入上傳圖片的jar
上邊的解析內部使用下邊的jar進行圖片上傳。
?
創建圖片虛擬目錄存儲圖片
通過圖形界面配置:(此處是基于eclipse開發)
也可以直接修改tomcat的配置:
在conf/server.xml文件,添加虛擬目錄 :
注意:在圖片虛擬目錄 中,一定將圖片目錄分級創建(提高i/o性能),一般我們采用按日期(年、月、日)進行分級創建。
上傳圖片代碼
頁面
controller方法
修改:商品修改controller方法:
json數據交互(重點掌握,涉及到與HTML頁面的交互)
為什么要進行json數據交互
json數據格式在接口調用中、html頁面中較常用,json格式比較簡單,解析還比較方便。
比如:webservice接口,傳輸json數據.
springmvc進行json交互
1、請求json、輸出json,要求請求的是json串,所以在前端頁面中需要將請求的內容轉成json,不太方便。
2、請求key/value、輸出json。此方法比較常用。
環境準備
加載json轉的jar包
springmvc中使用jackson的包進行json轉換(@requestBody和@responseBody使用下邊的包進行json轉),如下:
配置json轉換器
在注解適配器中加入messageConverters
<!--注解適配器 --><bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"><property name="messageConverters"><list><bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"></bean></list></property></bean>?
注意:如果使用<mvc:annotation-driven /> 則不用定義上邊的內容。
json交互測試
?
輸入json串,輸出是json串
jsp頁面
使用jquery的ajax提交json串,對輸出的json結果進行解析。
controller
測試結果
輸入key/value,輸出是json串
jsp頁面
使用jquery的ajax提交key/value串,對輸出的json結果進行解析。
controller
測試
攔截器
攔截定義
定義攔截器,實現HandlerInterceptor接口。接口中提供三個方法。
public class HandlerInterceptor1 implements HandlerInterceptor {//進入 Handler方法之前執行//用于身份認證、身份授權//比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//return false表示攔截,不向下執行//return true表示放行return false;}//進入Handler方法之后,返回modelAndView之前執行//應用場景從modelAndView出發:將公用的模型數據(比如菜單導航)在這里傳到視圖,也可以在這里統一指定視圖@Overridepublic void postHandle(HttpServletRequest request,HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {}//執行Handler完成執行此方法//應用場景:統一異常處理,統一日志處理@Overridepublic void afterCompletion(HttpServletRequest request,HttpServletResponse response, Object handler, Exception ex)throws Exception {}}攔截器配置
針對HandlerMapping配置
?
springmvc攔截器針對HandlerMapping進行攔截設置,如果在某個HandlerMapping中配置攔截,經過該 HandlerMapping映射成功的handler最終使用該 攔截器。
<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="interceptors"><list><ref bean="handlerInterceptor1"/><ref bean="handlerInterceptor2"/></list></property> </bean><bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/><bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>一般不推薦使用。
類似全局的攔截器
springmvc配置類似全局的攔截器,springmvc框架將配置的類似全局的攔截器注入到每個HandlerMapping中。
攔截測試
測試需求
測試多個攔截器各各方法執行時機。
編寫兩個攔截
兩個攔截器都放行
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
?
HandlerInterceptor2...postHandle
HandlerInterceptor1...postHandle
?
HandlerInterceptor2...afterCompletion
HandlerInterceptor1...afterCompletion
總結:
preHandle方法按順序執行,
postHandle和afterCompletion按攔截器配置的逆向順序執行。
攔截器1放行,攔截器2不放行
HandlerInterceptor1...preHandle
HandlerInterceptor2...preHandle
HandlerInterceptor1...afterCompletion
總結:
攔截器1放行,攔截器2 preHandle才會執行。
攔截器2 preHandle不放行,攔截器2 postHandle和afterCompletion不會執行。
只要有一個攔截器不放行,postHandle不會執行。
攔截器1不放行,攔截器2不放行
HandlerInterceptor1...preHandle
攔截器1 preHandle不放行,postHandle和afterCompletion不會執行。
攔截器1 preHandle不放行,攔截器2不執行。
小結
根據測試結果,對攔截器應用。
比如:統一日志處理攔截器,需要該 攔截器preHandle一定要放行,且將它放在攔截器鏈接中第一個位置。
比如:登陸認證攔截器,放在攔截器鏈接中第一個位置。權限校驗攔截器,放在登陸認證攔截器之后。(因為登陸通過后才校驗權限)
攔截器應用(實現登陸認證)
需求
1、用戶請求url
2、攔截器進行攔截校驗
-
如果請求的url是公開地址(無需登陸即可訪問的url),讓放行
-
如果用戶session 不存在跳轉到登陸頁面
-
如果用戶session存在放行,繼續操作。
登陸controller方法
@Controller public class LoginController {// 登陸@RequestMapping("/login")public String login(HttpSession session, String username, String password)throws Exception {// 調用service進行用戶身份驗證// ...// 在session中保存用戶身份信息session.setAttribute("username", username);// 重定向到商品列表頁面return "redirect:/items/queryItems.action";}// 退出@RequestMapping("/logout")public String logout(HttpSession session) throws Exception {// 清除sessionsession.invalidate();// 重定向到商品列表頁面return "redirect:/items/queryItems.action";}}登陸認證攔截實現
代碼實現
public class LoginInterceptor implements HandlerInterceptor {//進入 Handler方法之前執行//用于身份認證、身份授權//比如身份認證,如果認證通過表示當前用戶沒有登陸,需要此方法攔截不再向下執行@Overridepublic boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {//獲取請求的urlString url = request.getRequestURI();//判斷url是否是公開 地址(實際使用時將公開 地址配置配置文件中)//這里公開地址是登陸提交的地址if(url.indexOf("login.action")>=0){//如果進行登陸提交,放行return true;}//判斷sessionHttpSession session = request.getSession();//從session中取出用戶身份信息String username = (String) session.getAttribute("username");if(username != null){//身份存在,放行return true;}//執行這里表示用戶身份需要認證,跳轉登陸頁面request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);//return false表示攔截,不向下執行//return true表示放行return false;}攔截器配置
小結
ssm框架的學習到此基本結束,后面的即是渡劫期(ssm的整合以及項目的實踐訓練)
?
總結
以上是生活随笔為你收集整理的java元婴期(31)----java进阶(springmvc(5)---数据回显数据交互拦截器)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java元婴期(30)----java进
- 下一篇: java渡劫期(32)----java进