- 請(qǐng)求處理方法執(zhí)行完口,最終返回一個(gè)ModelAndView對(duì)象。對(duì)于那些返回String、view或ModeMap等類(lèi)型的處理方法,Spring MVC也會(huì)在內(nèi)部將它們裝配成一個(gè)ModelAndView,它包含了邏輯名和模型對(duì)象的視圖。
- Spring MVC 借助視圖解析器(ViewResolver)得到最終的視圖對(duì)象(View),最終的視圖可以是 JSP ,也可能是Excel、JFreeChart 等各種表現(xiàn)形式的視圖。
- 對(duì)于最終究竟采取何種視圖對(duì)象模型數(shù)據(jù)進(jìn)行渲染,處理器并不關(guān)心,處理器工作重點(diǎn)聚集在生產(chǎn)模型數(shù)據(jù)的工作上,從而實(shí)現(xiàn)MVC的充分解耦。
- 視圖對(duì)象由視圖解析器負(fù)責(zé)實(shí)例化。由于視圖是無(wú)狀態(tài)的,所以它們不會(huì)有線(xiàn)程安全的問(wèn)題。
InternalResourceViewResolver:
- 若項(xiàng)目中使用了JSTL,則SpringMVC會(huì)自動(dòng)把視圖由InternalResourceView轉(zhuǎn)為JstlView。
- 若使用JSTL的fmt標(biāo)簽則需要在SpringMVC的配置文件中配置國(guó)際化資源文件。
- 若希望直接相應(yīng)通過(guò)SpringMVC渲染的頁(yè)面,可以使用nvc:viewcontroller標(biāo)簽實(shí)現(xiàn)。
<!-- 配置直接轉(zhuǎn)發(fā)頁(yè)面 -->
<!-- 直接響應(yīng)轉(zhuǎn)發(fā)的頁(yè)面,無(wú)需經(jīng)過(guò)Handler的方法。 -->
<mvc:view-controller path="/views" view-name="success"/>
<!--實(shí)際項(xiàng)目中都需要配置mvc:annotation-driven -->
<mvc:annotation-driven></mvc:annotation-driven>
自定義視圖:
HelloView.java
package com.atguigu.springmvc.views;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;
@Component
public class HelloView implements View {
@Override
public String getContentType() {
// TODO Auto-generated method stub
return "text/html";
}
@Override
public void render(Map<String, ?> arg0, HttpServletRequest request,
HttpServletResponse response) throws Exception {
response.getWriter().print("hello view time"+new Date());
}
}
DispacherServlet-servlet.xml中注冊(cè)視圖解析器:
<!-- 配置BeanNameViewResolver視圖解析器:使用視圖的名字來(lái)解析視圖 -->
<!-- 通過(guò)order屬性值來(lái)設(shè)置視圖解析器的優(yōu)先級(jí),order值越小,優(yōu)先級(jí)越高 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"/>
</bean>
控制器中轉(zhuǎn)發(fā):
@RequestMapping("/testView")
public String testView(){
System.out.println("testView");
return "helloView";
}
Excel 視圖:
- 若希望使用 Excel 展示數(shù)據(jù)列表,僅需要擴(kuò)展SpringMVC 提供的AbstractExcelView 或AbstractJExcel View 即可。實(shí)現(xiàn)buildExcelDocument()方法,在方法中使用模型數(shù)據(jù)對(duì)象構(gòu)建 Excel 文就可以了。
- AbstractExcelView 基于 POI API,而AbstractJExcelView 是基于 JExcelAPI 的。
- 視圖對(duì)象需要配置 IOC 容器中的一個(gè) Bean,使用BeanNameViewResolver 作為視圖解析器即可。
- 若希望直接在瀏覽器中直接下載 Excel 文檔,則可以設(shè)置響應(yīng)頭 Content-Disposition 的值為attachment;filename=xxx.xls。
關(guān)于重定向:
- 一般情況下,控制器方法返回字符串類(lèi)型的值會(huì)被當(dāng)成邏輯視圖名處理
- 如果返回的字符串中帶 forward: 或 redirect: 前綴時(shí),SpringMVC 會(huì)對(duì)他們進(jìn)行特殊處理:將 forward: 和redirect: 當(dāng)成指示符,其后的字符串作為 URL 來(lái)處理。
- redirect:success.jsp:會(huì)完成一個(gè)到 success.jsp 的重定向的操作。
- forward:success.jsp:會(huì)完成一個(gè)到 success.jsp 的轉(zhuǎn)發(fā)操作。
@RequestMapping("/testRedirect")
public String testRedirect(){
System.out.println("testRedirect");
return "redirect:/index.jsp";
}