1. 程式人生 > >Spring MVC常用技術及基本概念

Spring MVC常用技術及基本概念

什麼是Spring MVC

用來簡化基於MVC架構的web應用程式開發,屬於Spring框架的一部分

Spring MVC的核心元件

  1. DispatcherServlet 前端控制器
  2. HandlerMapping 對映處理器
  3. Controller 處理器
  4. ModelAndView 模型和檢視
  5. ViewResolver 檢視解析器

##元件之間的相互關係

  1. 請求先發送給DispatcherServlet,DispatcherServlet收到請求之後,依據HandlerMapping的配置呼叫對應的Controller來處理。
  2. Controller將處理結果封裝成ModelAndView,然後返回給DispatcherServlet。
  3. DispatcherServlet依據ViewResolver的解析,呼叫對應的jsp生成頁面。

Spring MVC常用技術

jsp頁面

<%@page pageEncoding="utf-8" contentType="text/html" %>
<html>
	<form action="login1.do" method="post">
		<p>使用者名稱:<input type="text" name="username"></p>
		<p>密碼:<input type="password" name="pwd"></p>
		<p><input type="submit" value="登入"></p>
	</form>
</html>

讀取請求引數值

  1. 通過request
  2. 通過@RequestParam
  3. 通過javabean
@RequestMapping("login2.do")
public String logins(HttpServletRequest req,
		@RequestParam("pwd")String password,User user){
	
	System.out.println(req.getParameter("username"));
	System.out.println(password);
	System.out.println(user);
	return "hello";
}

向頁面傳值

  1. 將資料綁訂到request。
  2. 返回ModelAndView。
  3. 將資料綁訂到ModelMap。
  4. 將資料綁訂到session。
@RequestMapping("login3.do")
public String loginsss(String username,String pwd,HttpServletRequest request){
	//通過requeset傳遞username
	request.setAttribute("username", username);
	//通過session
	HttpSession session = request.getSession();
	session.setAttribute("pwd", pwd);
	return "success";
}


@RequestMapping("login4.do")
public ModelAndView login6(String username,String pwd){

	User user = new User(username,pwd);
	Map<String, Object> data = new HashMap<String,Object>();
	data.put("data",user);//頁面直接${data}就能得到user
	ModelAndView mv = new ModelAndView("success",data);
	return mv;
}


@RequestMapping("login5.do")
public String log(String username,String pwd,ModelMap model){
	User user = new User(username,pwd);
	//需要注意的是ModelMap只能作為引數傳入才有效,在方法裡new傳參無效
	model.addAttribute("user",user);
	return "success";
}

//演示向頁面傳值
@RequestMapping("login6.do")
public String logs(@ModelAttribute("user") User user){
	return "success";
}

重定向

@RequestMapping("login7.do")
public String redirect(String username){
	System.out.println(username);
	//當返回值為String時用redirect:路徑
	return "redirect:hi.do";
}

@RequestMapping("login.do")
public ModelAndView redirects(String pwd){
	System.out.println(pwd);
	//當返回值為ModelAndView時用RedirectView,引數為重定向路徑
	RedirectView view = new RedirectView("hi.do");
	return new ModelAndView(view);
}

解決中文亂碼

為什麼會有亂碼?

表單提交時,瀏覽器會對中文引數值使用開啟該表單所在頁面時的字符集來編碼。比如使用”utf-8”來編碼。
伺服器端預設使用”iso-8859-1”來解碼。所以會產生亂碼。

如何解決?

在web.xml中配置springmvc提供的過濾器(CharacterEncodingFilter)。
注意:

  1. 表單提交方式必須設定為”Post”
  2. 頁面編碼與過濾器的初始化引數設定的編碼要一致。
<filter>
	<filter-name>encodingFilter</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>
	<init-param>
		<param-name>forceEncoding</param-name>
		<param-value>true</param-value>
	</init-param>
</filter>
<filter-mapping>
	<filter-name>encodingFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>

異常處理

Spring MVC提供了三種異常處理機制

使用Spring MVC提供的簡單的異常處理器SimpleMappingExceptionResolver即可

該種方式只需要在配置檔案裡進行配置即可

<!-- 配置spring MVC提供的簡單異常處理 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
           <!-- 定義預設的異常處理頁面,即系統出現<prop>未指定的異常時就跳轉預設指定的頁面 -->  
           <property name="defaultErrorView" value="erroe"/>  
           <!-- 定義異常處理頁面用來獲取異常資訊的變數名,也可不定義,預設名為exception,即就一個異常物件,
                                       可以在頁面獲取該異常物件的資訊-->  
           <property name="exceptionAttribute" value="ex" />  
           <!-- 指定異常型別,並給出相應頁面 -->
           <property name="exceptionMappings">
             <props>
               <prop key="java.lang.NullPointerException">erroe1</prop>
               <prop key="entity.MyException">erroe2</prop>
             </props>
           </property>
</bean>

自定義異常處理器

  1. 該種方式需要自定義一個類實現HandlerExceptionResolver介面,根據不同的異常型別採取相應的介面

public class MyMappingExceptionResolver implements HandlerExceptionResolver {

    public ModelAndView resolveException(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex) {
        
        //根據異常型別返回相應檢視
        if(ex instanceof NullPointerException){
            return new ModelAndView("erroe1");
        }
        
        if(ex instanceof MyException){
            return new ModelAndView("erroe2");
        }
        
        //其他錯誤就返回erroe.jsp
        return new ModelAndView("erroe");
    }

}
2.在配置檔案裡進行配置
<!-- 配置自定義異常處理器 -->
  <bean class="controller.MyMappingExceptionResolver"/>

使用@ExceptionHandler註解實現區域性異常處理

該種方式只能針對單一控制器內的異常進行處理,即在哪個處理器(controller)使用該註解,則哪個處理器的異常方法就被處理
@Controller
public class ExceptionController {
    
    //但需要注意的是這只是一個區域性異常處理註解,即只對當前控制器有效,對其他控制器無效
    //指定異常
    @ExceptionHandler(NullPointerException.class)
    public String ExceptionHandler(){
        
        return "erroe1";
    }
    
    //指定異常
    @ExceptionHandler(MyException.class)
    public String ExceptionHandler1(){
        
        return "erroe2";
    }
    
    //其他異常
    @ExceptionHandler(Error.class)
    public String ExceptionHandler2(){
        
        return "erroe";
    }
    
    @RequestMapping("exception.do")
    //測試系統異常
    public ModelAndView toTest1(){
        Map<String,Object> data = new HashMap<String,Object>(); 
        //故意製造一個空指標異常
        String str = null;
        str = str.substring(0, 5);
        data.put("data", str);
        ModelAndView mv = new ModelAndView("success",data);
        return mv;
    
    }
    
    @RequestMapping("exception1.do")
    //測試自定義異常
    public ModelAndView toTest2(){
        
        String str = null;
        
        if(str==null){
            throw new MyException("完了出錯了");
        }
      
        Map<String,Object> data = new HashMap<String,Object>(); 
        data.put("data", str);
        ModelAndView mv = new ModelAndView("success",data);
        return mv;
        
    }
    
    @RequestMapping("exception2.do")
    //測試未指定異常
    public ModelAndView toTest3(){
       
        String str = "abc";
        
        //故意製造一個型別轉換異常
        Integer.valueOf(str);
        
        Map<String,Object> data = new HashMap<String,Object>(); 
        data.put("data", str);
        ModelAndView mv = new ModelAndView("success",data);
        return mv;
        
    }
    
}

攔截器

什麼是攔截器?

DispatcherServlet收到請求之後,如果有攔截器,則先執行攔截器的方法,然後再執行處理器的方法。

注意:

過濾器屬於Servlet規範,而攔截器屬於Spring框架。

如何實現攔截器?

  1. 實現HandlerInterceptor介面或者繼承HandlerInterceptorAdapter類

二者的區別在於前者三個方法都得實現,後者可以根據實際需求重寫想要的方法

/**
 *該方法是建立攔截器的第二種方法,實現HandlerIntercep
 *用來監控登入所消耗的時間
 * @author Administrator
 *
 */
public class MySecondInterceptor implements HandlerInterceptor {
    
    private long start_time;
    private long end_time;
    
    //處理器執行請求前
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        start_time=System.currentTimeMillis();
        System.out.println("第二個攔截器請求結束前:第二個攔截器的方法已經執行");
        return true;
    }
    //處理器執行請求結束後,檢視層顯示前(即控制器向前端傳送頁面前)
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
            System.out.println("第二個攔截器請求結束後:請求結束後執行");
    }
    
    //處理器完全執行請求後,即檢視已經展示
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        end_time=System.currentTimeMillis();
        System.out.println("第二個攔截器請求完全結束後:登入共耗時"+(end_time-start_time)+"毫秒");
    }

}
/**
 *  自定義攔截器,用來實現登入驗證
 * @author WQP
 *
 */
public class MyFirstInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        System.out.println("第一個攔截器方法已經執行了");
        return true;
    }

}

2.在配置檔案中配置攔截器

<!-- 定義攔截器 -->
<mvc:interceptors>
    <!-- 實現登入驗證 -->
    <mvc:interceptor>
        <!-- 指定攔截路徑 -->
        <mvc:mapping path="/**"/>
        <!-- 指定不需要攔截的路徑 -->
        <mvc:exclude-mapping path="/tologin.do"/> 
        <mvc:exclude-mapping path="/login.do"/> 
        <!-- 注入攔截的類 -->    
        <bean class="ssm.test.interceptors.MyFirstInterceptor"/>
    </mvc:interceptor>
    <!-- 監控登入耗時 -->
    <mvc:interceptor>
        <!-- 指定攔截路徑 -->
        <mvc:mapping path="/login.do"/>
        <!-- 注入攔截的類 -->    
        <bean class="ssm.test.interceptors.MySecondInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

3.實現登入操作後的控制檯輸出


相關推薦

Spring MVC常用技術基本概念

什麼是Spring MVC用來簡化基於MVC架構的web應用程式開發,屬於Spring框架的一部分Spring MVC的核心元件DispatcherServlet 前端控制器HandlerMapping 對映處理器Controller 處理器ModelAndVi

spring-mvc.xml檔案基本約束

" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd

NRZ NRZI擾碼等序列編碼技術基本概念

序列編碼技術的基本概念 轉載請註明出處         序列編碼定義了由1和0組成的資料流以何種方式在傳送通道上傳輸,有許多不同的通道編碼標準存在,所有不同的編碼方式都是為了適應序列訊號的某些方面:DC分量、頻譜分佈、時鐘恢復等,這些問題,通常是通道編碼必須考慮的。 1

Elasticsearch核心技術(2)--- 基本概念(Index、Type、Document、叢集、節點、分片副本、倒排索引)

Elasticsearch核心技術(2)--- 基本概念 這篇部落格講到基本概念包括: Index、Type、Document。叢集,節點,分片及副本,倒排索引。 一、Index、Type、Document 1、Index index:索引是文件(Document)的容器,是一類文件的集合。 索引這個詞在

Rancher常用操作名詞概念解析

開發 隔離 用戶登錄 項目組 做什麽 前言: 關於Rancher安裝請參考Rancher-Server部署,此文操作過程是基於以上部署環境進行演示。關於Rancher是做什麽,能完成哪些功能,有哪些優據點請自行了解。 本文主要介紹以下幾點什麽是環境如何添加環境什麽是應用棧如何添

spring mvc常用註解的說明

control debug mvc ref this mediatype display 說明 tom 最近一段時間學習了springboot,所以熟悉一下mvc中常用的註解,這樣可以方便開發 簡介: @RequestMapping RequestMa

MVCSpring MVC常用配置

solver errors 自動裝箱 property byte mco 驗證 c基礎 form表單 一、SpringMVC基礎入門,創建一個HelloWorld程序 1.首先,導入SpringMVC需要的jar包。 2.添加Web.xml配置文件中關於Spring

Spring MVC 常用Jar包官方下載地址(官方Maven倉庫) 轉

term apache water arch release details libs sdn glib http://blog.csdn.net/u014749862/article/details/48894409 spring:http://maven.sprin

Spring MVC 視圖視圖解析器

解析器 分享圖片 img resolve not com handler servlet 圖片 org.springframework.web.servlet.view.InternalResoureceViewResolve 把邏輯視圖改為物理視圖 可混用多種視圖

spring基礎(1:基本概念

poj 操作 共享問題 元素 組成 The 開發 let 可選值 本系列筆記來自對《Spring實戰》第三版的整理,Spring版本為3.0 ??spring是為了解決企業級應用開發的復雜性而創建的,spring最根本的使命是:簡化Java開發。為降低開發復雜性有以下四種關

Java面向對象-- String 類 常用方法基本使用

for str news http clas substr 實例 div print 首先來學習基本使用Jdk api chm文檔: 點擊 左上角-顯示: 1, char chartAt(int index) 返回指定索引處的char值 這裏的index 是從0

Spring AOP的實現:AOP基本概念

Spring AOP的概述 目錄             AOP的概念 Java動態代理 Spring  AOP程式碼舉例      AOP的概念  

Spring MVC HelloWorld入門執行機制 (一)

介紹 SpringMVC是一款Web MVC框架。 它跟Struts框架類似,是目前主流的Web MVC框架之一。 文章通過例項來介紹SpringMVC的入門知識。 目錄   例項 maven依賴springmvc jar: <dependency> <gr

Java面向物件-- String 類 常用方法基本使用

首先來學習基本使用Jdk api chm文件: 點選 左上角-顯示:     1, char chartAt(int index) 返回指定索引處的char值 這裡的index 是從0開始的; package com.xuyigang1234.chp02.strin

Spring MVC常用註解

常用註解 Controller 註解一個類表示控制器,Spring MVC會自動掃描標註了這個註解的類。 RequestMapping 請求路徑對映,可以標註類,也可以是方法,可以指定請求型別,預設不指定為全部接收。 RequestParam 放在引數前,

大資料之(4)Hadoop生態系統體系架構基本概念

一、基本概念 機架:HDFS叢集,由分佈在多個機架上的大量DataNode組成,不同機架之間節點通過交換機通訊,HDFS通過機架感知策略,使NameNode能夠確定每個DataNode所屬的機架ID,使用副本存放策略,來改進資料的可靠性、可用性和網路頻寬的利用率。 資料塊(blo

Spring MVC常用標籤

[email protected] 在SpringMVC 中,控制器Controller 負責處理由DispatcherServlet 分發的請求,它把使用者請求的資料經過業務處理層處理之後封裝成一個Model ,然後再把該Model 

Spring註解配置Mongo基本CRUD操作簡介

Mongo安裝配置參考基本操作等可參考http://www.runoob.com/mongodb/mongodb-tutorial.html,其中help()方法十分實用,可以不用讓使用者不用記太多方法,如help.collection.help()會顯示集合(相當於傳統資料庫中的的表)的所有方

[Hbase]Hbase章1 Hbase框架基本概念

Hbase框架介紹 HBase是一個分散式的、面向列的開源資料庫。 不同點: l  和一般的關係資料庫不同,hbase是一個適合於非結構化資料儲存的資料庫。 l  Hbase是基於列而不是基於行的模式。   在分散式的生產環境中,HBase 需要執行在 HDFS 之上

spring boot 常用註釋用法

@Service 註解該類為業務邏輯類由spring容器進行管理  @Transactional(readOnly = true) 指定預設的事務類別(只讀)  @CacheConfig 配置了spring內建快取來快取常用查詢資料 findAll() 方法一