Springmvc知識三------重定向&表單標籤&靜態資源的處理

重定向

在一般情況下,我們的控制器方法返回字符串類型值,會被封裝成一個ModelAndView,然後被當做邏輯視圖名稱進行處理。但是如果返回的字符串中以“forward:”和“redirect:”開頭時,Springmvc將會對他們做特殊處理,將redirect當成重定向操作,將forward當成轉發操作

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


    <!-- 後臺處理 -->
    @RequestMapping("TestRedirect")
    public String testredirect(){
        System.out.println("TestRedirect");
        //return  "redirect:/index.jsp";  
        //return  "redirect:/WEB-INF/view/redirectview.html";  
        return  "redirect:/RequestMappingTest/TestViews";

        //return  "forward:/index.jsp";   
        //return "forward:/WEB-INF/view/forwardview.jsp"; //
        //return  "forward:/RequestMappingTest/TestViews";

    }

注意:關於forward與redirect的區別建議去看這兩篇帖子
http://zhulin902.iteye.com/blog/939049】和【http://www.cnblogs.com/selene/p/4518246.html#_label0
再注意一點:forward 可以直接的訪問/WEB-INF裏的頁面,而redirect就不能了,需要進行映射機制才能進行訪問,這也是我們常常犯的錯誤,直接重定向一個頁面。
redirect重定向也被稱作間接請求轉發,forward 轉發也被稱爲直接請求轉發

表單標籤

通過我們的Springmvc的表單標籤可以實現我們的模型數據和HTML表單元素的綁定,他可以實現表單數據更便捷的編輯,更重要的是 實現了表單值的回顯功能。
通過屬性modelAttribute屬性指定綁定的模型屬性,如果沒有指定該屬性,則默認從Request域對象中讀取command的表單屬性,如果該屬性值也不存在,則會發生錯誤。
Springmvc提供了多個表單組件標籤。
對於表單標籤共用的屬性【path:表單字段,對應HTML元素的name屬性,支持級聯屬性】
【htmlEscape:是否對錶單值的HTML特殊字符進行轉化,默認值是true】
【cssClass:表單組件對應的CSS樣式類名】
【cssErrorClass:表單組件的數據存在錯誤時,採取的CSS樣式】

表單標籤
【form:input】
【form:password】
【form:hidden】
【form:textarea】
【form:radiobutton】單選框組件標籤,當表單bean對應的屬性值和value值相等時,單選框被選中。
【form:radiobuttons】單選框組件標籤,用於構造多個單選框。items:可以是一個List、Map或String數組;itemValue:指定radio的value值,可以是集合中bean的一個屬性值;itemLabel:指定radio的label值;delimiter:多個單選框可以通過delimiter指定分隔符。
【form:Checkbox】複選框組件,用於構造單個複選框
【form:Checkboxs】用於構造多個複選框。使用方式同【form:radiobuttons】
【form:select】用於構造下拉框組件。使用方式同【form:radiobuttons】
【form:option】 下拉框選項組件標籤。使用方式同【form:radiobuttons】
【form:errors】顯示錶單組件或數據校驗所對應的錯誤
【form:error path=“※”】顯示錶單所有錯誤
【form:error path=“user※”】顯示錶單所有以user爲前綴的屬性對應的錯誤
【form:error path=“username”】顯示錶單特定對象屬性的錯誤

<!-- 前臺表單標籤 注意要導入標籤庫 -->
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<form:form action="${pageContext.request.contextPath }/emp" method="post" modelAttribute="employee" >
    <form:hidden path="id" />   <!-- 我們利用隱藏域傳遞id -->    
    email:<form:input path="email"/><br/>
        <%
            Map<String,String> genders = new HashMap<String,String>();
                genders.put("1", "Male");
                genders.put("0", "FeMale");
                request.setAttribute("genders", genders);
        %>
    gender:<form:radiobuttons path="gender" items="${genders }" /><br/>

        <!--支持級聯屬性 -->
        Department:<form:select path="department.id" 
        items="${departments}" itemLabel="departmentName" itemValue="id"></form:select><br/>
        <input type="submit" value="submit"/>
</form:form>

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

//新增一個數據,第一步跳轉到指定的頁面,新增數據進行回顯,應爲爲空,所以new一個新的employee
    @RequestMapping(value="/emp",method=RequestMethod.GET)
    public String addemp(Map<String,Object> maps){
        maps.put("employee", new Employee());  //對應於form表單的modelattribute屬性
        maps.put("departments",departmentDAO.getDepartments() );
        // 對應着前臺的select下拉列表的值
        return "addemp";
    }

    //新增一個數據, 第二步 進行提交到後臺處理 
    @RequestMapping(value="/emp",method=RequestMethod.POST)
    public String save(Employee employee){
        employeeDAO.save(employee);
        return "redirect:/list";  // 記得一定是redirect小寫的,大寫的識別不出來
    }

注意:在上面的單選框賦值和複選框賦值時,我們是採用一個在前臺,一個在後臺。

靜態資源文件的處理

問題:我們在使用REST風格的資源URL不希望帶.html或者.do等後綴的,而且我們在web.xml配置我們的springDispatcherServlet時利用的攔截WEB容器中的所有請求。所以,對於靜態資源例如js等文件的請求也是會進行攔截的。Springmvc會將他們當成一個普通的請求處理,因此會找不到對於的處理器而導致錯誤。

解決:方法一:我們可以進行攔截器對攔截請求的更改,比如只攔截.do或者.html的請求,但是這樣的話又不符合REST風格。
方法二:在Springmvc.xml中配置靜態資源的加載【default-servlet-handler】這樣的話,我們就可以利用我們的靜態資源了。

<mvc:default-servlet-handler/>
<mvc:annotation-driven></mvc:annotation-driven>

注意:在配置【default-servlet-handler】時,會導致其餘的正常連接不好使,所以我們也應該給標配上【mvc:annotation-driven】。
在一般情況下我們的WEB應用服務器默認的Servlet的名稱都是default,如果使用的WEB服務器的默認Servlet名稱不是default,則需要通過【default-servlet-name】屬性進行顯示指定。
Tomcat, Jetty, JBoss, and GlassFish 自帶的默認Servlet的名字 – “default”
Google App Engine 自帶的 默認Servlet的名字 – “_ah_default”
Resin 自帶的 默認Servlet的名字 – “resin-file”
WebLogic 自帶的 默認Servlet的名字 – “FileServlet”
WebSphere 自帶的 默認Servlet的名字 – “SimpleFileServlet”

跳轉不經過Controller的實現

在有些時候我們不想讓我們的連接經過Controller處理,直接跳轉到某一資源。這樣的話我們只需要進行一個配置即可。

<b>前臺鏈接</b><br>
<a href="success">Test no controller </a><br>

<!--springmvc.xml配置  可以在處理404等一致資源文件時,可以利用這個進行跳轉到同一頁面 -->


<!-- 配置mvc:view-controller屬性可以直接跳過controller的控制 -->
<mvc:view-controller path="/success" view-name="success"/>
<mvc:annotation-driven></mvc:annotation-driven>

注意:在這裏的跳轉和上面的會產生同樣的問題,造成其他的請求失敗,所以我們也需要進行標配【annotation-driven】

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