五、視圖和視圖解析器

  • 請(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";
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容