1. 程式人生 > >Springmvc知識三------重定向&表單標籤&靜態資源的處理

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】