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目下:
注意新增的包。
步骤二:编写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,如图所示:
模板页面内容如下:
=====================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,如图所示:
步骤十: 在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行,注意老版本poi对Excel的行数列数有限制
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 进行测试,观察结果。