Springmvc知識一------配置文件&URL&註解組件

配置文件

web.xml

Springmvc項目屬於動態的web項目,所以我們應該先建立一個動態web項目,然後,我們再加上相關配置即可。

web項目的總配置屬性在web.xml文件中,在集成其他框架時,我們只需要在其中加入相關配置即可。

    <!-- 配置springmvc的 servlet -->  
        <servlet>
            <servlet-name>springDispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!-- 配置初始化參數 :配置springmvc配置文件的名稱和路徑 classpath java源文件根目錄 -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc.xml</param-value>
            </init-param>
            <load-on-startup>1</load-on-startup>
        </servlet>

        <servlet-mapping>
            <servlet-name>springDispatcherServlet</servlet-name>
            <url-pattern>/</url-pattern>
        </servlet-mapping>

注意:還有一種方式就是按照默認的來進行加載springmvc的配置文件, 即將我們的springmvc配置文件命名爲-servlet.xml,並轉移到/WEB-INF/目錄下和web.xml同一目錄下,不需要通過init-param屬性再來進行配置 例如本例子中,將配置文件 【springDispatcherServlet-servlet.xml】放置到web.xml目錄下也是可以的。但是,建議使用第一種方式,可以靈活的指定名稱。另外解決我們的中文亂碼的POST請求,我們也是在這裏加上相應的配置filter

springmvc.xml

然後在Springmvc的配置文件中。在這裏的配置和spring的配置基本類似。只是還要引入Springmvc的命名空間視圖解析器的配置必須存在。還有就是後期對於內置的各種類的配置也是寫在這裏面

<!-- 命名空間 beans  context mvc-->
xmlns:mvc="http://www.springframework.org/schema/mvc"
http://www.springframework.org/schema/mvc 
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd


<!-- 配置自動掃描-->
    <context:component-scan base-package="com.wf.springmvc"/>

    <!-- 配置視圖解析器 : 如何把handler 方法返回值解析爲實際的物理視圖-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/view/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>

上面是最簡單的配置,配置這麼多就可以利用Springmvc進行相關代碼的編寫,後期當我們用到什麼的知識點時,會對我們的配置文件進行擴增,這裏只是配置了一個最最簡單的配置。

URL

@RequestMapping註解

    @RequestMapping("/helloworld")
    public String hello(){
        System.out.println("Hello World");
        return "success";
    }

注意:
1、RequestMapping進行映射請求的url,我們的前段控制器攔截用戶給我們的請求,然後我們的前端控制器會進行URL的解析,然後找到我們所對應的映射路徑,即是@RequestMapping組件進行的映射。然後進行對應的處理,返回 到前段控制器,這裏我們還沒有進行數據模型的存儲,根據返回的String值,進行對應的視圖渲染。返回值會根據視圖解析器解析爲實際的物理視圖,對於配置的InternalResourceViewResolver類的解析器【在springmvc的配置文件中】,會通過【prefix屬性值+函數返回值+suffix屬性值】,這樣的方式得到對應的物理視圖,然後做請求轉發。

2、RequestMapping 既可以標註在方法頭,也可以標記在類頭中,這樣的話,我們可以對我們的url路徑進行分類。 作用在類定義處:提供初步請求映射信息,作用在方法處:提供 進一步 細分映射信息。

RequestMapping註解常用屬性
value屬性:如果只有一個參數默認的值,即映射的路徑。
method屬性:指定頁面提交的方式 ,通常有get和post請求。

@RequestMapping(value="RequestMappingMethod",method=RequestMethod.GET)
    public String requestMappringmethod(){
        System.out.println("Hello requestMappringmethod");
        return SUCCESS;
    }

匹配Ant風格的URL

springmvc支持ant風格的URL(瞭解),使用Ant有以下三條規則:
?(問號)表示通配一個字符 ;※(星號)表示通配任意字符 ; ※※(星號)表示任意層路徑

//http://localhost:8080/springmvc001/RequestMappingTest/test/more/testAnt
//http://localhost:8080/springmvc001/RequestMappingTest/test/more/more/testAnt

@RequestMapping(value="test/**/testAnt")
    public String testAnt(){
        System.out.println("testAnt");
        return SUCCESS;
    }

// 注意:Ant遵循匹配相似度最高原則(has more characters),URL請求/test/more/testAnt,現在存在兩個路徑匹配模式/**/*和/test/more/*,那麼會根據模式/test/more/*來匹配

使用REST風格URL

註解@PathVariable的使用,就是爲了獲取REST風格的參數的傳遞,瞭解什麼是REST建議訪問【http://kb.cnblogs.com/page/186516/】和【http://www.infoq.com/cn/articles/rest-introduction

    /*  4  後臺處理
     * @PathVariable 註解 可以將url中的佔位符綁定到處理函數體內。 REST風格使用
     * 
     */
    @RequestMapping(value="/testPathVariable/{id}")
    public String TestPathVariable(@PathVariable(value="id") Integer id ){
        System.out.println("PathCariable= "+id);
        return SUCCESS;
    }

<b> 4前臺鏈接 </b><br>
    <a href="RequestMappingTest/testPathVariable/2">testPathVariable</a><br>

注意:關於REST 即是(Representational State Transfer) 資源表現層狀態轉化。是目前流行 的一種互聯網軟件架構。他主要的特點是結構清晰,符合標準,易於理解和方便擴展。
資源:網絡上的一個實體,或者說是網絡上的一個具體信息。它可以是一段文本,一張圖片等等,總之就是一個具體的存在。我們可以利用一個URI(統一資源定位符)指向它,每一種資源都有一個特定的URI,要獲取這個資源,我們就要訪問他的URI,因此,URI即爲每一個資源的獨一無二的識別符。(注意URL與URI的區別)
表現層:把資源具體的表現出來的形式,叫做它的表現層。文本可以以TXT格式表現,也可以用html格式表現,甚至可以採用二進制的方式。
狀態轉化:每次發出一個請求,就是一次客戶端與服務器的一次交互過程,http協議,是一個無狀態的協議,即所有的狀態都保存在服務器端,因此,如果客戶端想要操作服務器,就必須通過某種手段,讓服務器端發生“狀態轉化”。即HTTP協議裏面,GET用來獲取資源,POST用來新建資源,PUT用來更新資源,DELETE用來刪除資源。
@PathVariable 映射URL綁定的佔位符。帶佔位符的URL是spring3.0新增的功能,該功能在Springmvc向REST目標挺進的發展過程中具有重大意義。通過@PathVariable註解可以將URL中的佔位符綁定到控制器處理方法的入參中。即上述代碼中皆有體現。PathVariable的value屬性值需要與佔位符的名稱一致。

REST風格下將POST請求轉化爲DELETE與PUT請求

    <b> 前臺鏈接方式 注意前臺一定要隱藏input標籤且name屬性爲_method, </b>
    <a href="RequestMappingTest/TestRestGET/2">testPathVariable</a><br>

    <form action="RequestMappingTest/TestRestPOST" method="post">
        <input type="submit" value="TestRestPost">
    </form>

    <form action="RequestMappingTest/TestRestDELETE/1" method="post">
        <input type="hidden" name="_method" value="DELETE">
        <input type="submit" value="TestRestDELETE">
    </form>
    <form action="RequestMappingTest/TestRestPUT/1" method="post">
        <input type="hidden" name="_method" value="PUT">
        <input type="submit" value="TestRestPUT">
    </form>


<!--後臺進行數據處理 -->

    @RequestMapping(value="/TestRestGET/{id}",method=RequestMethod.GET)
    public String TestRestGET(@PathVariable(value="id") Integer id){
        System.out.println("TestRest GET: "+id);
        return SUCCESS;
    }

    @RequestMapping(value="/TestRestPOST",method=RequestMethod.POST)
    public String TestRestPOST(){
        System.out.println("TestRest POST ");
        return SUCCESS;
    }
    @RequestMapping(value="/TestRestDELETE/{id}",method=RequestMethod.DELETE)
    public String TestRestDELETE(@PathVariable(value="id") Integer id){
        System.out.println("TestRest DELETE: "+id);
        return SUCCESS;
    }
    @RequestMapping(value="/TestRestPUT/{id}",method=RequestMethod.PUT)
    public String TestRestPUT(@PathVariable(value="id") Integer id){
        System.out.println("TestRest PUT: "+id);
        return SUCCESS;
    }



<!--web.xml 配置過濾器 -->
<!-- 配置org.springframework.web.filter.HiddenHttpMethodFilter :可以把post請求轉化爲DELETE 或者PUT請求 -->
        <filter>
            <filter-name>HiddenHttpMethodFilter</filter-name>

            <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
        </filter>
        <filter-mapping>
             <filter-name>HiddenHttpMethodFilter</filter-name>
            <url-pattern>/*</url-pattern>  <!--  過濾所有請求-->
        </filter-mapping>

註解組件

@RequestMapping註解

映射路徑的註解,見上面【@RequestMapping註解】小節

@PathVariable註解

用於REST風格的參數取值。見上面【使用REST風格URL】小節

@RequestParam註解

RequestParam主要是用於綁定請求參數值。get Post請求都可以。用在方法體參數內
屬性
1. value=”name”, 求情參數的參數名
2. required=false, 是否必須存在
3. defaultValue=”0” 默認值

<b>前臺鏈接</b><br>
    <a href="RequestMappingTest/TestRequestParam?name=rose&age=12">testRequestParam</a><br>

    <form action="RequestMappingTest/TestRequestParam" method="post">
        name:<input type="text" name="name">
        age:<input type="text" name="age">
        <input type="submit" value="Submit">
    </form>


<!--後臺數據處理 -->
@RequestMapping(value="/TestRequestParam")
    public String TestRequestParam(
    @RequestParam(value="name",required=false ,defaultValue="tom") String name,
    @RequestParam(value="age",required=false) Integer age){
        System.out.println("RequestParam name: "+name+" RequestParam age: "+age);
        return SUCCESS;
    }

注意:在傳遞到後臺時,如果利用了required=false,建議利用基本類型的封裝類型進行接收,這麼的話可以設置爲null ,如果利用 了基本類型,則會不知道默認值是多少,報錯。或者利用defaultValue進行設置也是可以解決報錯問題的。

@RequestHeader註解

這個註解主要是用來獲取請求頭的相關信息,不常用,瞭解即可。他的屬性值也有【value】【required】【defaultValue】,value屬性值是http中的請求頭中的信息名,同RequestParam,用在方法參數體內。

    @RequestMapping(value="/TestRequestHeader")
    public String TestRequestHeader(@RequestHeader(value="Accept-Language") String al,
                                    @RequestHeader(value="Cookie") String ck){
        System.out.println("Accept-Languag : "+al);
        System.out.println("Cookie: "+ck);
        return SUCCESS;
    }

@CookieValue註解

用來獲取Cookie的信息,屬性值和RequestParam相同,用在方法體參數中。

@RequestMapping(value="/TestCookieValue")
    public String TestCookieValue(@CookieValue(value="JSESSIONID")  String cook){
        System.out.println("CookieValue : "+cook);
        return SUCCESS;
    }

POJO對象參數的傳遞

springmvc 會自動按照請求參數名和POJO 屬性名進行自動匹配,自動爲該對象填充屬性值,而且還支持級聯屬性的裝配,這樣的話,能大大縮減我們對錶單數據利用RequestParam獲取參數的重複工作

<b>前臺鏈接</b><br>
    <form action="RequestMappingTest/TestRequestParamPojo" method="post">
        userName:<input type="text" name="userName"><br>
        userPassworld:<input type="password" name="userPassworld"><br>
        userAge:<input type="text" name="userAge"><br>
        userEmail:<input type="text" name="userEmail"><br>
        addressCity<input type="text" name="address.addressCity"><br>
        addressStreet<input type="text" name="address.addressStreet"><br>
        <input type="submit" value="submit">
    </form>

<!-- 後臺處理 -->
    @RequestMapping(value="/TestRequestParamPojo")
    public String Test0000(User user){
        System.out.println("TestRequestParamPojo : "+user);
        return SUCCESS;
    }

注意:前臺的name屬性值,必須和POJO類中的變量名相同。,對於字段的數量則沒有要求,可以多於POJO類中的變量,多於的話,會忽略掉,或者利用RequestParam進行單獨接收,也可以少於POJO類中的變量,少於的話,會進行自動默認,在遇到級聯屬性時,利用【變量名.屬性名】進行設置,上圖就有。可以不必存在特定的構造函數。

使用原生ServletAPI作爲入參

使用Servlet作爲入參的話,首先我們應該加入所需要的jar包【servlet-api.jar】或者不導入,使用tomcat裏面的這個jar包。具體情況看能不能在使用HttpServletRequest等時加入正確的類。

<b>前臺鏈接</b><br>
<a href="RequestMappingTest/TestServletAPI">TestServletAPI</a><br>

<!--後臺處理 -->
@RequestMapping(value="/TestServletAPI")
    public void TestServletAPI(HttpServletRequest request,
                                HttpServletResponse response,
                                Writer out){
        System.out.println("request"+request+"; response  "+response);
        try {
            out.write("hello spring servletAPI");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

注意:在mvc中,並不能完全使用servlet的API,具體支持以下九種,最常用的三種
【HttpServletRequest 】【HttpServletResponse 】【 HttpSession】
【 java.security.Principal 】【 Locale 】【InputStream】
【 OutputStream 】【 Reader 】【 Writer】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章