spring mvc基础篇(九):视图解析链

9.1简介

Spring支持多个视图解析器一起使用,即视图解析链。 视图解析链包含一系列视图解析器,更方便开发人员处理某些特殊请求,比如在特定情况下重新定义某些视图(为某个视图解析器使用order,可以改变此视图解析器在整个视图解析链中的解析顺序:order值越小,它在整个视图解析链中的顺序越靠前,即它越会被优先选作为视图解析器)。

9.2 开发环境

开发工具:myeclipse8.6.1

数据库:mysql5.5.23

服务器: tomcat6.0.37

框架版本: spring3.2.2

 

9.3 案例开发步骤

步骤一:在myeclipse8.6中新建web工程springmvc09,拷贝如下包到lib目下:

注意新增的包。

 spring mvc基础篇(九):视图解析链

步骤二:编写web.xml 配置文件,代码如下:

=================================web.xml========================

<?xmlversion="1.0" encoding="UTF-8"?>

<web-appversion="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 

<!-- 配置spring的字符集过滤 -->

  <filter>

    <filter-name>encode</filter-name>

    <filter-class>org.springframework.web.filter

.CharacterEncodingFilter</filter-class>

    <init-param>

      <param-name>encoding</param-name>

      <param-value>UTF-8</param-value>

    </init-param>

    <init-param>

         <param-name>forceEncoding</param-name>

         <param-value>true</param-value>

    </init-param>

  </filter>

  <filter-mapping>

    <filter-name>encode</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

<servlet>

<servlet-name>springmvc</servlet-name>

<servlet-class>

org.springframework.web.servlet.DispatcherServlet

</servlet-class>

<load-on-startup>1</load-on-startup>

</servlet>

<servlet-mapping>

<servlet-name>springmvc</servlet-name>

<url-pattern>*.do</url-pattern>

</servlet-mapping>

</web-app>

================================================================

 

步骤三:建立index.jsp,和display.jsp,如下所示:

=========================index.jsp==============================

<body>

  <h1><a href="ViewSelect.do?op=excel">Excel页面</a></h1>

  <h1><a href="ViewSelect.do?op=fm">freeMarker页面</a></h1>

  <h1><a href="ViewSelect.do">jsp页面</a></h1>

</body>

====================================================================

=========================display.jsp==============================

<body>

<h1>这是jsp视图页面</h1>

</body>

=====================================================================

 

步骤四:在com.wx.controls包下面编写控制器SelectViewController.java,如下:

==================SelectViewController.java==========================

public class SelectViewControllerimplements Controller {

    public ModelAndView handleRequest(HttpServletRequest request,

           HttpServletResponseresponse) throws Exception {

       String param = request.getParameter("op");

       if(param==null){

           param="";

       }

       ModelAndView mav = new ModelAndView("display");

       if (param.equals("fm")) {

           //将请求转发到另外一个控制器,类似于servlet转发到另一个servlet

           //也类似于struts2中的从一个action到另一个action

           mav = new ModelAndView("forward:FreeMarker.do");

           return mav;

       } else if (param.equals("excel")) {

           mav = new ModelAndView("forward:ShowExcel.do");

           return mav;

       } else {

           return mav;

       }

    }

}

==================================================================

 

步骤五:在核心配置文件springmvc-servlet.xml里面完善如下配置

======================== springmvc-servlet.xml=======================

<beans>

    <!-- 模板视图解析器start -->

    <bean id="freemarkerConfig"

        class="org.springframework.web

.servlet.view.freemarker.FreeMarkerConfigurer">

       <property name="defaultEncoding"value="UTF-8" />

       <property name="templateLoaderPath"value="/freemarker/" />

    </bean>

    <bean id="fmViewResolver"       

       class="org.springframework.web.servlet

.view.freemarker.FreeMarkerViewResolver">

       <property name="contentType"value="text/html;charset=utf-8" />

       <property name="cache"value="false" />

       <property name="prefix"value="" />

       <property name="suffix"value=".ftl" />

       <property name="order"value="1"></property>

    </bean>

    <!-- 模板视图解析器end -->

    <!-- excel视图解析器start -->

    <bean id="rbViewResolver" class="org.springframework.web.servlet

.view.ResourceBundleViewResolver">

       <property name="basename"value="excelConfig"></property>

       <property name="order" value="2"></property>

    </bean>

    <!-- excel视图解析器end -->

    <!-- jsp视图解析器start -->

    <bean id="resourceView"

       class="org.springframework.web.servlet

.view.InternalResourceViewResolver">

       <property name="prefix"value="/"></property>

       <property name="suffix"value=".jsp"></property>

       <property name="order"value="3"></property>

    </bean>

    <!-- jsp视图解析器end -->

   

    <bean id="simpleUrlMapping"

       class="org.springframework.web

.servlet.handler.SimpleUrlHandlerMapping">

       <property name="mappings">

       <props>

           <prop key="/ViewSelect.do">viewControl</prop>

            <prop key="/FreeMarker.do">freeControl</prop>

            <prop key="/ShowExcel.do">excelControl</prop>

       </props>

       </property>

    </bean>

    <bean id="freeControl" class="com.wx.controls.FreeMarkerController"></bean>

    <bean id="excelControl" class="com.wx.controls.ExcelControl"></bean>

    <bean id="viewControl" class="com.wx.controls.SelectViewController"></bean>

</beans>

====================================================================

注意:InternalResourceViewResolver必须总是赋予最低的优先级(最大的order值),因为不管返回什么视图名称,它都将解析视图。如果它的优先级高于其它解析器的优先级的话,它将使得其它具有较低优先级的解析器没有机会解析视图。

 

步骤六:在com.wx.controls包下面编写控制器FreeMarkerController.java,如下:

==================FreeMarkerController.java==========================

public class FreeMarkerControllerextends AbstractCommandController {

    protected ModelAndView handleRequestInternal(

HttpServletRequest reqeust,HttpServletResponse response)

throws Exception {

        //视图解析器会根据base名称去找base.ftl的模板

       ModelAndView mav = new ModelAndView("base");

       mav.addObject("username", "张三");

       SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

       mav.addObject("time", sdf.format(new Date()));

       return mav;

    }

 

    //该方法无实际作用,但必须要实现它

    protected ModelAndView handle(HttpServletRequest request,

           HttpServletResponse response, Object command,BindException errors)

           throws Exception {

       return null;

    }

}

==================================================================

 

步骤七:在webroot目录下建立模板文件base.ftl,如图所示:

 spring mvc基础篇(九):视图解析链

模板页面内容如下:

=====================base.ftl====================================

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01Transitional//EN">

<html>

 <head>

    <title>freemaker示例</title>

    <meta http-equiv="pragma"content="no-cache">

    <meta http-equiv="cache-control"content="no-cache">

    <meta http-equiv="expires"content="0">   

  </head>

 

<body>

    欢迎来到FreeMarker模板页面<br/>

    welcome ${username}<br/>

    当前时间:${time}

</body>

</html>

==================================================================

步骤八:在com.wx.controls包下面编写控制器ExcelControl.java,如下:

==========================ExcelControl.java==========================

public class ExcelControl extends AbstractController {

    protected ModelAndView handleRequestInternal(HttpServletRequestrequest,

           HttpServletResponseresponse) {

       Map<String,Object> map = new HashMap<String,Object>();

       //可以由map对象传递一个值到excel的生成类

       map.put("msg", "传递过来的对象");

       return new ModelAndView("excel", map);

    }

}

==================================================================

 

步骤九:在src目录下建立属性文件excelConfig.properties,如图所示:

 spring mvc基础篇(九):视图解析链

 

 

步骤十: 在com.wx.other包下面编写excel生成类ExcelViewBuilder.java,如下:

=====================ExcelViewBuilder.java=========================

public class ExcelViewBuilder extends AbstractExcelView {

    /**

     * 在该方法里面,我们只需要设置wb对象(代表一个excel文件)的内容即可

     */

    protected void buildExcelDocument(Map<String,Object> model,HSSFWorkbook wb,HttpServletRequest req, HttpServletResponse resp)

throws Exception {

       //model对象由控制器的map对象传递而来

       System.out.println(model.get("msg"));

       // 第一步,在wb对象中(已经由spring容器创建)添加一个sheet,对应Excel文件中的 sheet

       HSSFSheet sheet = wb.createSheet("测试表格1");

       // 第二步,在sheet中添加表头第0行,注意老版本poiExcel的行数列数有限制

       HSSFRow row = sheet.createRow(0);

       // 第三步,创建单元格样式:居中

       HSSFCellStyle style = wb.createCellStyle();

       style.setAlignment(HSSFCellStyle.ALIGN_CENTER);

       // 第四步,创建表头单元格,并设置样式

       HSSFCell cell;

 

       cell = row.createCell(0);

       cell.setCellValue("员工工号");

       cell.setCellStyle(style);

 

       cell = row.createCell(1);

       cell.setCellValue("员工姓名");

       cell.setCellStyle(style);

 

       cell = row.createCell(2);

       cell.setCellValue("所属部门");

       cell.setCellStyle(style);

 

       cell = row.createCell(3);

       cell.setCellValue("职位");

       cell.setCellStyle(style);

 

       cell = row.createCell(4);

       cell.setCellValue("入职日期");

       cell.setCellStyle(style);

 

       cell = row.createCell(5);

       cell.setCellValue("备注");

       cell.setCellStyle(style);

 

       // 第五步,写入实体数据,实际应用中这些数据从数据库得到

       Date today = new Date();

       long aDay = 1000L* 60 * 60 * 24;

       SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");

       for (int i = 1; i <= 10; i++) {

           row = sheet.createRow(i);

           row.createCell(0).setCellValue(i);

           row.createCell(1).setCellValue("员工" + i);

           row.createCell(2).setCellValue("总公司");

           row.createCell(3).setCellValue("普通员工");

           row.createCell(4).setCellValue(

                  fmt.format(new Date(today.getTime() + i * aDay)));

           row.createCell(5).setCellValue("员工备注");

       }

    }

}

==================================================================

 

步骤十一: 启动tomcat,发布项目,在地址栏输入 http://localhost:8080/springmvc09/index.jsp 进行测试,观察结果。