數據模型處理
Springmvc對於數據模型的處理提供了以下四種方式輸出數據模型:
ModelAndView:處理方法返回值類型爲ModelAndView時,方法即可通過該對象添加模型數據。
Map和Model:將Map作爲方法的參數傳遞到方法體中,springmvc會自動將這個參數放入到Request域對象中。
@SessionAttribute:將模型中的某個屬性暫時存放到HttpSession中,以便多個請求之間可以共享這個屬性。
@ModelAttribute:方法入參標註該註解後,入參的對象就會放到數據模型中。
ModelAndView
控制器處理方法的返回值如果爲ModelAndView,其中既包含視圖信息,也包含模型數據信息。
springmvc 會把ModelAndView 的model中的數據放到request域對象中。
添加模型數據方法:【addObject】【addAllObjects】
設置視圖方法:【setView】【setViewName】
<b>前臺鏈接</b><br>
<a href="RequestMappingTest/TestModelAndView">TestModelAndView</a><br>
<!--後臺處理 -->
@RequestMapping(value="/TestModelAndView")
public ModelAndView TestModelAndView(){
ModelAndView model = new ModelAndView("modelandview");
// 利用此構造方法,直接傳入物理視圖名稱
model.addObject("date", new Date());
return model;
}
<b>跳轉顯示</b><br>
model======> ${date}
Map和Model
Springmvc在內部使用了一個org.springframework.ui.Model的接口進行存儲模型數據。
Springmvc在調用方法之前會創建一個隱含的模型對象作爲模型數據的存儲容器,如果方法中的入參有Map或者Model類型,那麼Springmvc就會將隱含的引用傳遞給這些入參,在方法體內,我們可以通過這些入參對象訪問到模型中的所有數據,也可以向模型中添加新的屬性數據。
<b>前臺鏈接</b><br>
<a href="RequestMappingTest/TestMap">TestMap</a><br>
<!-- 後臺處理-->
@RequestMapping(value="/TestMap")
public String TestMap(Map<String,Object> map){
map.put("name","tom");
User user = new User("tom", "134", 15, "[email protected]");
Address address = new Address("henan", "luoyang");
user.setAddress(address);
map.put("name","tom");
map.put("user", user);
return SUCCESS;
}
<b>跳轉顯示</b><br>
map======> ${requestScope.name}
map======> ${requestScope.user.userName}
map======> ${requestScope.user.address}// User類中包含Address類
map======> ${requestScope.user.address.addressCity}
//注意 User類中
private String userName;
private String userPassworld;
private int userAge;
private String userEmail;
private Address address = new Address(); // 注意
注意: Springmvc對於級聯屬性的獲值:我們需要在POJO類中聲明屬於關係時,應該先實例化此關聯對象。否則我們在前臺進行調用時返回的爲null。
SessionAttributes
對於註解@SessionAttributes,是處理多個請求之間共用某個模型數據,@SessionAttributes只作用在類上面 ,不能使用在方法上面,Springmvc將模型中對應的屬性暫時存放到HttpSession中。他有兩個屬性value屬性表示存放 map的鍵值, types 屬性表示存放類,通過這兩個屬性,我們可以將我們的模型屬性數據存放到會話中。
// 類 註解
@SessionAttributes(value={"user00","user01"},types={String.class,Address.class})
// 後臺處理
@RequestMapping(value="TestSessionAttributes")
public String testSessionAttributes(Map<String, Object> map){
User user = new User("tom", "134", 15, "[email protected]");
User usersession = new User("tom12", "134", 15, "[email protected]");
Address address = new Address("henan", "luoyang");
map.put("age",12); // request域
map.put("name","tom");//session 域
map.put("user", user); // request域
map.put("user00",usersession);// session 域
map.put("address", address); // session 域
return SUCCESS;
}
<b>跳轉顯示</b>
requestScope--age======>${requestScope.age}<br>
sessionScope--age======>${sessionScope.age}<br>
requestScope--name======>${requestScope.name}<br>
sessionScope--name======>${sessionScope.name}<br>
requestScope--user======>${requestScope.user}<br>
sessionScope--user======>${sessionScope.user}<br>
requestScope--user00======>${requestScope.user00}<br>
sessionScope--user00======>${sessionScope.user00}<br>
requestScope--address======>${requestScope.address}<br>
sessionScope--address======>${sessionScope.address}<br>
注意:value屬性和types 屬性可以一起使用。
視圖
在我們的請求處理方法執行完成後,最後返回的 是一個ModelAndView對象,而對於那些返回String、View等類型的處理方法,Springmvc 也會在內部將他們裝配成一個ModelAndView對象,它包含了邏輯名和模型對象的視圖。Springmvc藉助視圖解析器(ViewResolver)得到最終的視圖對象(View),最終以不同的視圖形式進行顯示,可以是JSP,也可以是Excel,或者是JFreeChart等各種視圖。Spring MVC 框架並不知道使用的視圖,所以不會強迫您只使用 JSP 技術。所以最終採用何種視圖對象對數據模型進行渲染,處理器並不關心,處理器的工作重點是在生產模型數據的工作上。
視圖的作用就是渲染數據模型,將模型裏的數據以某種形式呈現給客戶。Spring在org.springframework.web.servlet包中定義了一個抽象的View接口。視圖對象由視圖解析器負責實例化,而且由於視圖是無狀態的,所以他們不會有線程安全的問題。
常用的視圖實現類
視圖解析器
Springmvc爲邏輯視圖名的解析提供了不同的策略,可以在Spring WEB 上下文中配置一種或者多種視圖解析器,並指定他們的先後順序。每一種映射策略對應一個具體的視圖解析器實現類。視圖解析器的作用就是將邏輯視圖解析爲一個具體的視圖對象。就好比視圖都要實現View接口一樣,所有的視圖解析器也都必須實現ViewResolver接口。
常用的視圖解析器實現類
我們可以使用一種或者多種視圖解析器進行混合使用
每一個視圖解析器都實現了Ordered接口並存在一個order屬性,可以通過order屬性值指定解析器的優先順序,order值越小表示優先級越高,Springmvc會按照視圖解析器的優先順序對邏輯視圖名進行解析,直到遇到解析成功並返回視圖對象,否則會拋出ServletException異常。
實例自定義視圖
<b>前臺鏈接</b><br>
<a href="RequestMappingTest/TestViews">TestViews</a><br>
<!-- 後臺處理 -->
@RequestMapping("TestViews")
public String testviews(){
System.out.println("TestViews");
// 返回值與自定義的視圖的類的名稱一致
return "helloView";
}
<!--自定義視圖類 -->
@Component
public class HelloView implements View {
// 返回內容類型
public String getContentType() {
return "text/html";
}
public void render(Map<String, ?> arg0, HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.getWriter().print("hello view ,time: "+new Date() );
}
}
<!--Springmvc.xml新增視圖解析器 -->
<!-- 配置視圖解析器 :使用視圖的名字,解析視圖 將自定義的放在前面,在解析不出來的時候,再進行通用的匹配,通過屬性配置order。order值越小,優先級越高 -->
<bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
注意:
1、如果我們在項目中使用了JSTL,則Springmvc會自動把視圖由默認的InternalResourceView轉爲JSTLView。
2、如果我們在項目中使用了JSTL的fmt 標籤,我們還需要在Springmvc的配置文件中配置國際化資源文件。
<b>前臺鏈接</b><br>
<a href="springmvc/testi18n">Testi18n</a>
<!--後臺處理 -->
@RequestMapping("/testi18n")
public String testi18n(){
System.out.println("測試i18n");
return SUCCESS;
}
<!--跳轉顯示 -->
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:message key="i18n.username"></fmt:message><br>
<fmt:message key="i18n.password"></fmt:message><br>
<!--Springmvc.xml國際化資源配置-->
<!-- 配置國際化資源i18n messageSource 必須小寫 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="i18n"></property>
</bean>
<!-- i18n.properties內容 -->
i18n.username=user
i18n.password=password
另外我們也需要在classpath下新增國際化資源文件【i18n.properties】【i18n_zh_CN.properties】【i18n_en_US.properties】