您好,登錄后才能下訂單哦!
Spring Web MVC
Spring Web MVC需要使用IOC功能。
用于開發MVC結構的Web程序。
一.MVC思想
將程序組件分為模型,視圖,控制器三部分。
二.Spring如何實現MVC
a.瀏覽器發出一個HTTP請求
b.請求首先進入DispatcherServlet主控制器
c.主控制器調用HandlerMapping組件根據請求找映射的Controller處理
d.執行Controller處理方法,將返回結果給ViewResolver組件
e.ViewResolver組件根據Controller返回結果定位視圖JSP,將模型數據傳遞給JSP
f.由JSP生成響應結果,給瀏覽器輸出
發請求到DispatcherServlet,然后到HandlerMapping到Controller1接下來返回一個ViewResolver到視圖。
eg:頁面上發出hello.do請求,首先經過web.xml,知道.do請求需要進入到DispatcherServlet,DispatcherServlet去applicationContext.xml里面
尋找handlerMapping組件,根據mapping名為hello.do找hello.do找helloController組件處理。根據helloController里的ModelAndView和applicationContext.xml的prefix和suffix配置去找到/WEB-INF/hello.jsp
eg1:顯示登錄頁面
/tologin.do
—>DispatcherServlet(配置)//充當主控制器,發請求時先給他
—>hanlderMapping(配置)//定義Servlet請求和Controller對應關系,根據applicationContext.xml配置解析對應的哪一個Controller
—>toLoginController(編寫+配置)//調用DAO模型組件
—>ViewerResolver(配置)//封裝,轉發,重定向到JSP視圖
—>WEB-INF/login.jsp(編寫)
3.Spring Web MVC處理流程
a.RequestMappingHandlerMapping組件
@RequestMapping(“login.do”)該標記用在Controller業務方法前
b.Controller編寫和配置
取消了實現Controller接口及方法約定,可以允許程序員按需靈活定義業務方法;
public ModelAndView或String 方法名(根據request,session,response)
Controller需要掃描到Spring容器,必須使用@Controller
eg: public String execute(){
return “hello”;
}
d.Controller如何接收請求參數
1)利用HttpServletRequest
*2)利用業務方法參數(少量參數時使用)
*--參數名與請求參數key保持一致
—利用@RequestParam(“key")
*3)利用實體對象當方法參數(大量參數時使用)
使用建議:少量參數使用2);大量參數使用3);如果客戶端表單數據沒有格式檢查,遇到非字符串類型參數建議使用1)
e.如何向響應JSP傳值
*1)利用HttpServletRequest
2)利用ModelAndView做返回值
*3)利用ModelMap方法參數
4)使用@ModelAttribute(“key")
public String checkLogin(@ModuleAttribute(“user”) String username){
return “ok”;}//ok.jsp使用${user}
@ModelAttribute(“user")
public String getName(){
return “tom”;}
等價于model.put(“user”, getName());//${user}即tom
f.Controller如何使用Session
代碼示例:
web.xml:
<servlet> <servlet-name>webLogin2</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>webLogin2</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping>
handlermapping和controller:
@Controller public class LoginController { //登錄按鈕處理 @RequestMapping("/login.do") public String checkLogin3(String username, String password, ModelMap modelMap, HttpSession session){ if ("root".equals(username) && "1234".equals(password)){ modelMap.put("user", username); session.setAttribute("username", username); return "ok";//ok.jsp 使用${user} } else { modelMap.put("msg", "用戶名或密碼錯誤"); return "login";//login.jsp使用${msg} } }
spring配置:
<!--等價于handlermapping--> <mvc:annotation-driven></mvc:annotation-driven> <context:component-scan base-package="controller"> </context:component-scan> <!--配置viewerResolver--> <bean id="viewresolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!--去prefix配置下找頁面--> <property name="prefix" value="/WEB-INF/"> </property> <!--提取出.jsp結尾文件,文件名為Controller中ModelAndView返回的名字--> <property name="suffix" value=".jsp"> </property> </bean>
ok.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> </head> <body> <form action="ok.do" method="post"> <h3>${user} login success</h3> session內容: ${sessionScope.username} </form> </body> </html>
login.jsp:
<%@ page language="java" pageEncoding="UTF-8"%> <html> <head> </head> <body> <h3>用戶登錄</h3> ${msg} <form action="login3.do" method="post"> 用戶名:<input type="text" name="username"><br/> 密碼:<input type="password" name="password"><br/> <input type="submit" value="登錄"> </form> </body> </html>
訪問:http://localhost:8090/webLogin2_war(此處為自己定義的war包名)/login.do
用正確的用戶名密碼進入顯示:
session內容: root
4.Spring Web MVC
1) 解決中文接收亂碼問題
<!--spring mvc解決中文亂碼-->
<filter>
<filter-name>myfilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>myfilter</filter-name>
<url-pattern>*.do</url-pattern>
<!--或者寫<servlet-name>webLogin2</servlet-name>-->
</filter-mapping>
2)如何處理異常
a.全局異常處理:SimpleMappingExceptionResolver
@Controller public class ExceptionController { @RequestMapping("/exception.do") public String ex(){ String s = null; s.length(); return "ok"; } }
此時訪問exception.do會拋出nullpoint異常,需要進行異常處理,使用內置的全局異常處理方法
applicationContext.xml配置:
<!--異常處理器--> <!--<prop key="異常類型">視圖名</prop>--> <!--拋出異常后得到error視圖名傳遞給viewResolver--> <!--<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">error</prop> </props> </property> </bean>-->
此時處理流程圖:
b.局部異常處理:@ExceptionHandler
public String xxx(HttpServletRequest request, Exception e){}
@Controller public class AgeController { @RequestMapping("/toage.do") public String toage(){ //檢查session里是否有username return "age";//進入age.jsp } @RequestMapping("/age.do") public String age(String birth, ModelMap modelMap) throws Exception { //接收用戶輸入的生日,計算年齡 Date now = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-DD"); Date birth2 = sdf.parse(birth); int result = now.getYear() - birth2.getYear(); modelMap.put("msg", "年齡為: " + result); return "age";//進入age.jsp,${msg} //當出現異常時無法返回String故進入handleException方法 } /*當前Controller異常處理, * 當執行該方法后,不會再調用ExceptionResolver */ @ExceptionHandler//局部異常處理方法 public String handleException(HttpServletRequest request, Exception e) { request.setAttribute("msg", "輸入信息有誤導致計算失敗"); return "age";//返回age.jsp } }
c.自定義ExceptionResolver(實現HandlerExceptionResolver接口)
先寫自己的異常處理類:
public class MyExceptionHandler implements HandlerExceptionResolver { public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object method, Exception e) { //將異常信息寫入文件 System.out.println("將異常信息寫入文件: " + e); //跳轉到錯誤頁面 ModelAndView mav = new ModelAndView(); mav.setViewName("error"); return mav; } }
eorror.jsp
<%@ page language="java" pageEncoding="UTF-8" %> <html> <head> </head> <body> <h3>系統繁忙</h3> </body> </html>
注釋掉applicationContext.xml中的全局異常處理,寫上自己的異常處理類:
<!--使用自定義的ExceptionResolver, 訪問exception.do--> <bean class="controller.MyExceptionHandler"> </bean>
此時訪問exception.do當程序出錯時頁面將顯示系統繁忙字樣
3)如何實現登錄權限檢查
使用session進行約定值判斷。
實現方法:1.采用Filter(通用解決方法);2.采用攔截器(Spring WEB MVC)
a.攔截器組件簡介
攔截器組件時SpringMVC特有組件。
攔截器組件可以在Controller之前攔截;可以在Controller之后攔截;可以在JSP解析完畢給瀏覽器輸出之前攔截。
b.攔截器使用方法
首先編寫一個攔截器組件(實現HandlerInterceptor接口)
在約定方法中添加要插入的邏輯然后在applicationContext.xml中配置
攔截器類:
import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginInterceptor implements HandlerInterceptor { @Override //controlller之前,權限檢查,登錄檢查 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("---preHandle實現登錄檢查---"); HttpSession session = request.getSession(); //獲取登錄成功后放置的用戶信息 String name = (String) session.getAttribute("username"); if (name != null) {//登錄過 return true;//繼續執行mvc后續流程 } else {//登錄失效(session失效)或登錄失敗 response.sendRedirect("/tologin.do"); return false;//終止mvc后續流程 } } @Override //controller之后,統計請求到處理開始到完畢的日志,執行的時間性能監控,檢查耗時項 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("---postHandle---"); } @Override //請求處理完畢,輸出之前。統計請求到處理開始到完畢的日志,執行的時間性能監控,檢查耗時項 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("---afterHandle---"); } }
applicationContext.xml
<!--配置攔截器--> <mvc:interceptors> <mvc:interceptor> <!--攔截哪些請求--> <!--<mvc:mapping path="toage.do"/>--> <mvc:mapping path="/**/"/> <!--放過哪些請求--> <mvc:exclude-mapping path="/tologin.do"/> <mvc:exclude-mapping path="/login3.do"/> <bean class="controller.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。