1. 程式人生 > >spring mvc中controller使用介紹

spring mvc中controller使用介紹

SpringMVC是一個基於DispatcherServlet的MVC框架,每一個請求最先訪問的都是DispatcherServlet,DispatcherServlet負責轉發每一個Request請求給相應的Handler,Handler處理以後再返回相應的檢視(View)和模型(Model),返回的檢視和模型都可以不指定,即可以只返回Model或只返回View或都不返回。在使用註解的SpringMVC中,處理器Handler是基於@Controller和@RequestMapping這兩個註解的,@Controller宣告一個處理器類,@RequestMapping宣告對應請求的對映關係,這樣就可以提供一個非常靈活的匹配和處理方式。

DispatcherServlet是繼承自HttpServlet的,既然SpringMVC是基於DispatcherServlet的,那麼我們先來配置一下DispatcherServlet,好讓它能夠管理我們希望它管理的內容。HttpServlet是在web.xml檔案中宣告的。

    <servlet>  
        <servlet-name>blog</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>blog</servlet-name>  
        <url-pattern>*.do</url-pattern>  
    </servlet-mapping>  
上面聲明瞭一個名為blog的DispatcherServlet,該Servlet將處理所有以“.do”結尾的請求。在初始化DispatcherServlet的時候,SpringMVC預設會到/WEB-INF目錄下尋找一個叫[servlet-name]-servlet.xml的配置檔案,來初始化裡面的bean物件,該檔案中對應的bean物件會覆蓋spring配置檔案中宣告的同名的bean物件。如上面的就會在/WEB-INF目錄下尋找一個叫blog-servlet.xml的檔案;當然也可以在Servlet中宣告配置檔案的位置,那就是通過Servlet的初始化引數來設定contextConfigLocation引數的值。
    <servlet>  
        <servlet-name>blog</servlet-name>  
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>  
            <param-name>contextConfigLocation</param-name>  
            <param-value>/WEB-INF/blog-servlet.xml</param-value>  
        </init-param>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>blog</servlet-name>  
        <url-pattern>*.do</url-pattern>  
    </servlet-mapping>  

DispatcherServlet會利用一些特殊的bean來處理Request請求和生成相應的檢視返回。

關於檢視的返回,Controller只負責傳回來一個值,然後到底返回的是什麼檢視,是由檢視解析器控制的,在jsp中常用的檢視解析器是InternalResourceViewResovler,它會要求一個字首和一個字尾

<bean  
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
    <property name="prefix" value="/WEB-INF/" />  
    <property name="suffix" value=".jsp" />  
</bean> 

在上述檢視解析器中,如果Controller返回的是blog/index,那麼通過檢視解析器解析之後的檢視就是/WEB-INF/blog/index.jsp。

要使用註解的SpringMVC需要在SpringMVC的配置檔案中進行宣告,具體方式為先引入mvc名稱空間,然後利用<mvc:annotation-driven />進行宣告。

<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"  
    <span style="background-color: #00ff00;"><span style="color: #ff0000;">xmlns:mvc="http://www.springframework.org/schema/mvc"</span>  
</span>  
  
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd  
     http://www.springframework.org/schema/context  
     http://www.springframework.org/schema/context/spring-context-3.0.xsd  
    <span style="background-color: #00ff00; color: #ff0000;"> http://www.springframework.org/schema/mvc  
     http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"</span>  
  
>  
<mvc:annotation-driven />  
  
</beans>

主要是說說Controller.

在SpringMVC中Controller不需要繼承什麼類,也不需要實現什麼介面,一切使用了@Controller進行標記的類都是Controller

@Controller  
public class BlogController {  
  
} 
有了Controller之後,那麼到底是怎樣請求一個Controller具體的方法的呢,那是通過@RequestMapping來標記的,@RequestMapping可以標記在類上面,也可以標記在方法上,當方法上和類上都標記了@RequestMapping的時候,那麼對應的方法對應的Url就是類上的加方法上的,如下面的index方法,其對應的URL應為類上的/blog加上index方法上的/index,所以應為/blog/index,所以當請求/blog/index.do的時候就會訪問BlogController的index方法。加在類上的@RequestMapping不是必須的,當Controller類上加上了@RequestMapping的時候,那麼Controller方法上的@RequestMapping就是相對於類上的@RequestMapping而言的,也就是前面說的請求對映的時候是類上的地址加方法上的地址,而當Controller類上沒有加@RequestMapping的時候,方法上的@RequestMapping就是絕對路徑了。
@Controller  
@RequestMapping("/blog")  
public class BlogController {  
      
    @RequestMapping("/index")  
    public String index(Map<String, Object> map) {  
        return "blog/index";  
    }  
} 

 在上面的程式碼中,如果index方法上沒有RequestMapping註解,而只有BlogController類上有,且該類只有一個方法的時候,直接請求類上的URL就會呼叫裡面的方法,即直接請求/blog.do的時候就會呼叫index方法。

在RequestMapping中還可以指定一個屬性method,其主要對應的值有RequestMethod.GET和RequestMethod.POST,利用該屬性可以嚴格的控制某一方法只能被標記的請求路徑對應的請求方法才能訪問,如指定method的值為GET,則表示只有通過GET方式才能訪問該方法,預設是都可以訪問。RequestMapping中的URL對映還支援萬用字元*,如:

@Controller  
@RequestMapping("/blog")  
public class BlogController {  
    @RequestMapping("/*/index")  
    public String index(Map<String, Object> map) {  
        return "blog/index";  
    }  
} 

 在@RequestMapping中還有一個屬性params,可以通過該屬性指定請求引數中必須包含某一引數,或必須不包含某一引數,或某引數的值必須是什麼,以此來縮小指定的對映範圍。
    @Controller  
    @RequestMapping("/blog")  
    public class BlogController {  
          
        @RequestMapping(value="/index", params="param1=value1")  
        public String index(Map<String, Object> map) {  
            return "blog/index";  
        }  
    }  

在上面示例中,只有當請求/blog/index.do並且請求引數param1的值為value1的時候才能訪問到對應的index方法。如果params的值為"param1",則表示請求引數只要包含param1就可以了,至於它的值是什麼無所謂;如果params的值為"!param1",則表示請求引數必須不包含param1才可以。@RequestMapping中還可以使用header來縮小對映範圍,如:
    @Controller  
    @RequestMapping("/blog")  
    public class BlogController {  
        @RequestMapping(value="/index",headers="content-type=text/html")  
        public String index(Map<String, Object> map) {  
            return "blog/index";  
        }  
    }  

在SpringMVC中常用的註解還有@PathVariable,@RequestParam,@PathVariable標記在方法的引數上,利用它標記的引數可以利用請求路徑傳值,看下面一個例子
    @RequestMapping(value="/comment/{blogId}", method=RequestMethod.POST)  
    public void comment(Comment comment,@PathVariable int blogId, HttpSession session, HttpServletResponse response) throws IOException {  
          
    }  

在該例子中,blogId是被@PathVariable標記為請求路徑變數的,如果請求的是/blog/comment/1.do的時候就表示blogId的值為1,@PathVariable在進行賦值的時候如果像上面那樣沒有指定後面接的變數是對應URL中的哪個變數時預設是從URL中取跟後面接的變數名相同的變數,如上面示例中的@PathVariable int blogId,沒有指明要獲取URL中的哪個變數,這個時候就預設取URL中的blogId變數對應的值賦給方法引數中的blogId,那如果方法引數的名稱跟RequestMapping中定義的訪問路徑中的變數名不一樣,或者我要利用PathVariable明確指定後面接的方法引數是對應於URL中的哪個變數時,可以像下面這樣做,在PathVariable中給定一個value="blogId"(只有一個引數的時候value是可以省略的)值明確指定方法引數中的id變數是對應請求路徑定義中的blogId變數的。
    @RequestMapping(value="/comment/{blogId}", method=RequestMethod.POST)  
    public void comment(Comment comment,@PathVariable("blogId") int id, HttpSession session, HttpServletResponse response) throws IOException {  
          
    }  

同樣@RequestParam也是用來給引數傳值的,但是它是從頭request的引數裡面取值,相當於request.getParameter("引數名")方法。它的取值規則跟@PathVariable是一樣的,當沒有指定的時候,預設是從request中取名稱跟後面接的變數名同名的引數值,當要明確從request中取一個引數的時候使用@RequestParam("引數名"),如下所示:
    @RequestMapping("/show")  
    public void showParam(@RequestParam int id, @RequestParam("name") String username) {  
        //這樣做進行URL請求訪問這個方法的時候,就會先從request中獲取引數id的值賦給引數變數id,從request中獲取引數name的值賦給引數變數username  
    }  

在Controller的方法中,如果需要WEB元素HttpServletRequest,HttpServletResponse和HttpSession,只需要在給方法一個對應的引數,那麼在訪問的時候SpringMVC就會自動給其傳值,但是需要注意的是在傳入Session的時候如果是第一次訪問系統的時候就呼叫session會報錯,因為這個時候session還沒有生成。

接下來討論一下方法的返回值,主要有以下情況:

  • 返回一個ModelAndView,其中Model是一個Map,裡面存放的是一對對的鍵值對,其可以直接在頁面上使用,View是一個字串,表示的是某一個View的名稱
  • 返回一個字串,這個時候如果需要給頁面傳值,可以給方法一個Map引數,該Map就相當於一個Model,往該Model裡面存入鍵值對就可以在頁面上進行訪問了
  • 返回一個View物件
  • 返回一個Model也就是一個Map,這個時候將解析預設生成的view name,預設情況view name就是方法名,這裡之前搞錯了,感謝網友的指正。預設的View Name是由RequestToViewNameTranslator來解析的,顧名思義就是把request翻譯成viewName,在沒有指定RequestToViewNameTranslator時,Spring將使用其自身的預設實現DefaultRequestToViewNameTranslator的預設配置,即取到當前請求的URI,去掉最前和最後的斜槓“/”,以及對應的字尾。所以當你請求“http://localhost/app/abc”的時候,對應的預設viewName就是請求URI——“/abc”去掉最前最後的斜槓和字尾之後的結果,即“abc”,請求“http://localhost/app/abc/efg”時對應的預設檢視名稱是“abc/efg”,“http://localhost/app/abc/efg/hi.html”——>“abc/efg/hi”。如果需要改變預設的檢視名稱的解析方式,可以在SpringMVC的配置檔案中配置一個名稱為viewNameTranslator,型別為RequestToViewNameTranslator的bean。如果該bean是DefaultRequestToViewNameTranslator,那麼你可以通過prefix屬性指定檢視名稱的字首,通過suffix指定字尾,通過stripLeadingSlash指定是否需要去掉最前面的斜槓,更多可指定的屬性請參考DefaultRequestToViewNameTranslator的實現。當然你也可以定義自己的RequestToViewNameTranslator實現類,實現RequestToViewNameTranslator介面的getViewName(HttpServletRequest request)方法,實現自己的獲取預設檢視名稱的邏輯。
  • 什麼也不返回,這個時候可以在方法體中直接往HttpServletResponse寫入返回內容,否則將會由RequestToViewNameTranslator來決定
  • 任何其他型別的物件。這個時候就會把該方法返回型別物件當做返回Model模型的一個屬性返回給檢視使用,這個屬性名稱可以通過在方法上給定@ModelAttribute註解來指定,否則將預設使用該返回類名稱作為屬性名稱。
 @RequestMapping("/{owner}/index")  
public String userIndex(Map<String, Object> map,@PathVariable String owner, HttpServletRequest request) throws ParserException {  
    List<DefCategory> categories = categoryService.find(owner);  
    int offset = Util.getOffset(request);  
    Pager<Blog> pager = blogService.find(owner, 0, offset, maxResults);  
    int totalRecords = pager.getTotalRecords();  
    List<Blog> blogs = pager.getData();  
    Util.shortBlog(blogs);  
      
    List<Message> messages = messageService.find(owner, 0, 5).getData();  
    Util.shortMessage(messages, 20);  
    map.put("messages", messages);  
    map.put("totalRecords", totalRecords);  
    List<BlogStore> stores = storeService.find(owner, 0, 5).getData();  
    map.put("maxResults", maxResults);  
    map.put("blogs", blogs);  
    map.put("totalRecords", totalRecords);  
    map.put("owner", userService.find(owner));  
    map.put("defCategories", categories);  
    map.put("stores", stores);  
    return "blog/userIndex";  
}  

給頁面傳值

    在Controller中把請求轉發給業務邏輯層進行處理之後需要把業務邏輯層的處理結果進行展現,在展現的過程中就需要我們把處理結果傳給展示層進行展示。那麼處理結果是怎麼進行傳遞的呢?前面已經說了Controller的返回結果可以是一個包含模型和檢視的ModelAndView,也可以僅僅是一個檢視View,當然也可以什麼都不返回,還可以是僅僅返回一個Model。我們知道模型Model是用來封裝資料給檢視View進行展示的,那麼,在SpringMVC中,如果要把我們後臺的資訊傳遞給前臺進行展示的話應該怎麼做呢?這主要有兩種方式:
    1.返回包含模型Model的ModelAndView,或者是直接返回一個Model(這個時候就需要考慮預設的檢視),這種型別的返回結果是包含Model的,這個Model物件裡面的對應屬性列都可以直接在視圖裡面使用。
    2.如果是直接返回一個檢視View,這個時候SpringMVC提供了一種類似於在Controller方法中獲取HttpRequest物件的機制,這個時候我們只需要給定Controller方法一個Map引數,然後在方法體裡面給這個Map加上需要傳遞到檢視的鍵值對,這樣在檢視中就可以直接訪問對應的鍵值對

本文轉載自:http://haohaoxuexi.iteye.com/blog/1343761


相關推薦

spring mvccontroller使用介紹

SpringMVC是一個基於DispatcherServlet的MVC框架,每一個請求最先訪問的都是DispatcherServlet,DispatcherServlet負責轉發每一個Request請求給相應的Handler,Handler處理以後再返回相應的檢視(View

spring mvccontroller怎麼接收頁面表單提交的資料

轉自:http://blog.csdn.net/wujiaqi168/article/details/41957187 1、定義一個類,該類的欄位要包含表單中所有input的name對應的值,並且在類中為對應的欄位生成getter 與setter方法 2、在對應的c

spring MVCcontroller層和service層的junit4測試

import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResul

Spring MVCController如何將資料返回給頁面

要實現Controller返回資料給頁面,Spring MVC 提供了以下幾種途徑: ModelAndView:將檢視和資料封裝成ModelAndView物件,作為方法的返回值,資料最終會存到HttpServletRequest物件中! Model物件:通過給方法新增引用

Spring MVCController如何進行重定向

Spring MVC中進行重定向,本人知道的有兩種方式: 方法返回的URI(相對路徑)中加上"redirect:"字首,宣告要重定向到該地址 使用HttpServletResponse物件進行重定向

通過攔截器Interceptor實現Spring MVCController介面訪問資訊的記錄

java web工程專案使用了Spring+Spring MVC+Hibernate的結構,在Controller中的方法都是用於處理前端的訪問資訊,Controller通過呼叫Service進行業務處理後給前端返回ModelAndView物件或者只返回Json格式資料。如

Spring MVCController如何獲取Form表單提交的資料

表單提交的資料也就是請求資料,分為Get和Post兩種方式提交。 Controller中有三種方式獲取表單資料:  Controller的方法,新增HttpServletRequst型別入參,通過HttpServletRequst.getParameter()獲取請求資料

Spring MVC 的基於註解的 Controller(轉載)

med beans 沒有 對象引用 諸多 請求 icon .so 它的 終於來到了基於註解的 Spring MVC 了。之前我們所講到的 handler,需要根據 url 並通過 HandlerMapping 來映射出相應的 handler 並調用相應的

(親測有效。)Spring MVCController使用service只需使用註解,但是普通類獲取 service或 dao 都是null空的。

在springmvc中,controller中可以通過註解 @Autowired 獲取你的service層調方法。但是普通的工具類中呼叫service層。老是報null空指標。用new 物件可以,但是

Spring MVC獲取Controller的請求資訊

在我們平常的專案裡面經常需要進行許可權配置,其中有一個就是先把專案裡面的請求的路徑存進去,之後在進行一系列的設定,但是每次都要從程式碼裡面複製粘帖就很麻煩了。 在Spring MVC中是可以

spring mvc 通過controller 傳遞物件給jsp,並且資料繫結,在修改值後回傳物件給controller

在controller 中需要指定 sessionAttribute的key @sessionattributes註解應用到Controller上面,可以將Model中的屬性同步到session當中。 當需要清除session當中的值得時候,我們只需要在

Spring MVC 的基於註解的 Controller

        終於來到了基於註解的 Spring MVC 了。之前我們所講到的 handler,需要根據 url 並通過 HandlerMapping 來映射出相應的 handler 並呼叫相應的方法以響應請求。實際上,ControllerClassNameHand

使用HttpURLConnection呼叫url方式訪問spring mvccontroller並傳json值與返回

package com.zl.test2; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStream; import jav

27.Spring-Boot攔截器靜態資源的處理(踩過坑)以及Spring mvc configuring拓展介紹

一.springboot中對靜態資源的處理  預設情況下,springboot提供存放放置靜態資源的資料夾:  /static  /public   /resources  /META-INF/resources 對於maven專案即就是存在src/main/re

Spring MVCController是Serlvet嗎?

src png hand 圖片 javabean image info 創建 bean 1. Controller不是Servlet DispatcherServler是Spring MVC中的唯一Servlet,(這點可通過查看FrameworkServlet的子類確認)

spring mvc關於url傳遞中文亂碼的解決方法

般的 har rac color nco bytes utf8 int span 在傳值過程中,也是亂碼出現的頻繁地。先不說到底是什麽場景了,通常常用的方案有如下幾個 配置指定的filter <!-- 配置請求過濾器,編碼格式設為UTF-8,避免中文亂碼-->

spring mvc,如何在 Java 代碼裏,獲取 國際化 內容

source 所在 bundle 註入 pre 定義 pan col void 首先,在Spring的application.xml中定義 <bean id="messageSource" class="org.springframework.context.su

Spring MVC 框架結構介紹(二)

指定 let url 16px () isp -s 一個 ping Spring MVC框架結構    Spring MVC是圍繞DispatcherServlet設計的,DispatcherServlet向處理程序分發各種請求。處理程序[email prot

spring---aop(6)---Spring AOPProxyFactoryBean介紹

except trace col fine erl 參數 owa per face 寫在前面   這篇文章裏面就要說說Spring自己的AOP,搞清楚哪種方式是Spring自己實現的AOP,哪種方式是Spring引入aspectj的AOP。 簡單例子   Spring

Spring MVC HandlerInterceptorAdapter的使用

date oar option 不定 list 異常 attribute std view 一般情況下,對來自瀏覽器的請求的攔截,是利用Filter實現的,這種方式可以實現Bean預處理、後處理。 Spring MVC的攔截器不僅可實現Filter的所有功能,還可以更精確的