4,spring MVC的视图

  Controller得到模型数据之后,通过视图解析器生成视图,渲染发送给用户,用户就看到了结果。

视图:view接口,来个源码查看;它由视图解析器实例化,是无状态的,所以线程安全。

spring mvc提供是视图种类如图所示,根据需要选择合适的视图:

视图解析器:值提供一个把视图名称,结合本地化得到视图实例的方法;

spring mvc提供的具体视图解析器有,除去两个抽象的,一共有14个;用户可选择多个视图解析器,通过orderNo指定优先级,默认的ContenNegotiatingViewResolver优先级最高,InternalResourceViewResolver,XsltViewResolver优先级最低;

下面分别对常用的视图举例,记录配置和使用方法:

Jsp和JStL的配置和使用方法:

jsp页面的写法:这里用到了三个标签库,还有国际化信息:

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <%@taglib prefix="fm" uri="http://java.sun.com/jsp/jstl/fmt" %>
  4. <%@taglib prefix="spring" uri="http://www.springframework.org/tags" %>
  5. <%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
  6. <c:set var="ctx" value="${pageContext.request.contextPath}"/>
  7. <html>
  8. <head>
  9. <title>${title}</title>
  10. </head>
  11. <body>
  12. <h1>${title}</h1>
  13. <form:form modelAttribute="account" method="post" action="${ctx}/account/${action}">
  14. <table width="100%" border="1px">
  15. <thead>
  16. <tr>
  17. <td colspan="2"></td>
  18. </tr>
  19. </thead>
  20. <tr>
  21. <td><fm:message key="account.username"/> </td>
  22. <td>
  23. <form:errors path="userName" cssStyle="color: red;font: bolder;"/>
  24. <form:input path="userName" size="50" htmlEscape="true"/>
  25. </td>
  26. </tr>
  27. <tr>
  28. <td><spring:message code="account.password"/></td>
  29. <td>
  30. <form:errors path="password" cssStyle="color: red;font: bolder;"/>
  31. <form:password path="password" size="50" htmlEscape="true"/>
  32. </td>
  33. </tr>
  34. <tr>
  35. <td>昵称</td>
  36. <td>
  37. <form:errors path="nickName" cssStyle="color: red;font: bolder;"/>
  38. <form:input path="nickName" size="50" htmlEscape="true"/>
  39. </td>
  40. </tr>
  41. <tr>
  42. <td><fm:message key="account.birthday"/></td>
  43. <td>
  44. <form:errors path="birthday" cssStyle="color: red;font: bolder;"/>
  45. <form:input path="birthday" size="50" htmlEscape="true"/>
  46. </td>
  47. </tr>
  48. <%--<tr>--%>
  49. <%--<td>有效期</td>--%>
  50. <%--<td>--%>
  51. <%--<form:errors path="validateTime" cssStyle="color: red;font: bolder;"/>--%>
  52. <%--<form:input path="validateTime" size="50" htmlEscape="true"/>--%>
  53. <%--</td>--%>
  54. <%--</tr>--%>
  55. <tr>
  56. <td><input type="submit" value="注册"/></td>
  57. <td><input type="reset" value="重置"/></td>
  58. </tr>
  59. </table>
  60. </form:form>
  61. </body>
  62. </html>

关于spring提供的form标签,如果是列表选择,一般带一个隐藏的字段,字段名是选择标签的名称前面加个下划线,保证服务器表单对象和页面表单组件数据一致;

Freemarker模版视图:

首先看配置:

然后是使用了spring提供的宏的一个简单模版:

  1. <#import "spring.ftl" as spring />
  2. <html>
  3. <head>
  4. <title>${title}</title>
  5. </head>
  6. <body>
  7. <table width="100%" border="1px;">
  8.  
  9. <#list accountList as account>
  10. <tr>
  11. <td>${account_index}</td>
  12. <td>${account[0]}</td>
  13. <td>${account[1]}</td>
  14. <td>${account[2]}</td>
  15. </tr>
  16. </#list>
  17. </table>
  18. </body>
  19. </html>

pdf:配置方法:

生成的视图类:

  1. package com.lfc.sh.web.sp.view;
  2.  
  3. import com.google.common.base.Charsets;
  4. import com.lfc.sh.web.sp.util.AppConstant;
  5. import com.lowagie.text.Element;
  6. import com.lowagie.text.Font;
  7. import com.lowagie.text.Table;
  8. import com.lowagie.text.pdf.BaseFont;
  9. import org.springframework.web.servlet.ModelAndView;
  10. import org.springframework.web.servlet.view.document.AbstractPdfView;
  11.  
  12. import javax.servlet.http.HttpServletRequest;
  13. import javax.servlet.http.HttpServletResponse;
  14. import java.awt.*;
  15. import java.util.List;
  16. import java.util.Map;
  17.  
  18. public class UserListPdfView extends AbstractPdfView {
  19. @Override
  20. protected void buildPdfDocument(Map<String, Object> model, com.lowagie.text.Document document, com.lowagie.text.pdf.PdfWriter writer, HttpServletRequest request, HttpServletResponse response) throws Exception {
  21.  
  22. String fileName = new String("用户列表".getBytes(), Charsets.ISO_8859_1);
  23. response.setHeader(AppConstant.RESPONSE_HEADER, "inline;filename=" + fileName);
  24. Table table = new Table(5);
  25. table.setWidth(100);
  26. table.setBorder(1);
  27. table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
  28. table.getDefaultCell().setVerticalAlignment(Element.ALIGN_MIDDLE);
  29. Font font = new Font(BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", false), 12, Font.BOLD, Color.BLACK);
  30. ModelAndView modelAndView= (ModelAndView) model.get("modelAndView");
  31. List<Object[]> accountList = (List<Object[]>)modelAndView.getModel().get("accountList");
  32. if(accountList!=null&&!accountList.isEmpty())
  33. for (Object[] account : accountList) {
  34. table.addCell(account[0].toString());
  35. table.addCell(account[3].toString());
  36. table.addCell(account[4].toString());
  37. table.addCell(account[2].toString());
  38. table.addCell(account[1].toString());
  39. }
  40.  
  41. document.addTitle("用户列表");
  42. document.add(table);
  43. }
  44. }

效果:

json:配置方式

controller的写法:

最终效果:

xls:配置方法:

<bean id="userListXls" class="com.lfc.sh.web.sp.view.UserListXlsView"></bean>

实现方法,引入poi;

  1. package com.lfc.sh.web.sp.view;
  2.  
  3. import com.google.common.base.Charsets;
  4. import com.lfc.sh.web.sp.util.AppConstant;
  5. import org.apache.poi.hssf.usermodel.HSSFRow;
  6. import org.apache.poi.hssf.usermodel.HSSFSheet;
  7. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  8. import org.springframework.web.servlet.view.document.AbstractExcelView;
  9.  
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. import java.util.List;
  13. import java.util.Map;
  14.  
  15. /**
  16. * Company: Copyright© 2009 www.7road.com All rights reserved.
  17. * com.lfc.sh.web.sp.view
  18. * Create Date: 13-11-19 下午12:14
  19. * Note:一个xls的视图
  20. */
  21. public class UserListXlsView extends AbstractExcelView {
  22.  
  23. @Override
  24. protected void buildExcelDocument(Map<String, Object> model, HSSFWorkbook workbook, HttpServletRequest request, HttpServletResponse response) throws Exception {
  25.  
  26. String fileName = new String("用户列表".getBytes(), Charsets.ISO_8859_1);
  27. response.setHeader(AppConstant.RESPONSE_HEADER, "inline;filename=" + fileName);
  28.  
  29. HSSFSheet sheet=workbook.createSheet("用户列表");
  30. HSSFRow head=sheet.createRow(0);
  31. head.createCell(0).setCellValue("编号");
  32. head.createCell(1).setCellValue("密码");
  33. head.createCell(2).setCellValue("昵称");
  34. head.createCell(3).setCellValue("用户名");
  35. head.createCell(4).setCellValue("生日");
  36.  
  37. List<Object[]> accountList= (List<Object[]>) model.get("accountList");
  38.  
  39. int rowNum=1;
  40. for(Object[] account:accountList)
  41. {
  42. HSSFRow row=sheet.createRow(rowNum);
  43. rowNum++;
  44. row.createCell(0).setCellValue(account[0].toString());
  45. row.createCell(1).setCellValue(account[3].toString());
  46. row.createCell(2).setCellValue(account[2].toString());
  47. row.createCell(3).setCellValue(account[4].toString());
  48. row.createCell(4).setCellValue(account[5].toString());
  49. }
  50. }
  51. }

RessourceBoundleViewResolver,不同的地区用户提供不同类型的视图;

<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
<property name="basename" value="/i18n/views"/>
</bean>

/account/list.(class)=org.springframework.web.servlet.view.InternalResourceViewResolver

内容协商视图:ContentNegotiatingViewResolver

配置方式:

  1. <property name="prefix" value="/WEB-INF/view/"/>
  2. <property name="suffix" value=".jsp"/>
  3. <property name="contentType" value="text/html;charset=UTF-8"/>
  4. <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
  5. </bean>
  6.  
  7. <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
  8. <property name="basename" value="/i18n/content"/>
  9. <property name="cacheSeconds" value="0"/>
  10. <property name="defaultEncoding" value="UTF-8"/>
  11. </bean>
  12.  
  13. <!-- 定义无Controller的path<->view直接映射 -->
  14. <!--<mvc:view-controller path="/" view-name="redirect:/task"/>-->
  15.  
  16. <bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
  17. <property name="order" value="3"/>
  18. </bean>
  19.  
  20. <bean id="userListPdf" class="com.lfc.sh.web.sp.view.UserListPdfView"></bean>
  21.  
  22. <bean id="userListJson" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
  23. <property name="prettyPrint" value="true"/>
  24. <property name="renderedAttributes" value="accountList"/>
  25. </bean>
  26.  
  27. <bean id="userListXls" class="com.lfc.sh.web.sp.view.UserListXlsView"></bean>
  28.  
  29. <!--<bean class="org.springframework.web.servlet.view.ResourceBundleViewResolver">-->
  30. <!--<property name="basename" value="/i18n/views"/>-->
  31. <!--</bean>-->
  32.  
  33. <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
  34. <property name="order" value="0"/>
  35. <property name="defaultContentType" value="text/html"/>
  36. <property name="ignoreAcceptHeader" value="true"/>
  37. <property name="favorParameter" value="true"/>
  38. <property name="favorPathExtension" value="false"/>
  39. <property name="parameterName" value="content"/>
  40. <property name="mediaTypes">
  41. <map>
  42. <entry key="html" value="text/html"/>
  43. <entry key="json" value="application/json"/>
  44. </map>
  45. </property>
  46. <property name="defaultViews">
  47. <list>
  48. <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView"></bean>
  49. </list>
  50. </property>
  51.  
  52. </bean>

效果:

//todo

5,spring MVC的本地化解析,文件上传,静态资源处理,拦截器,异常处理等

6,小结

spring笔记3 spring MVC的基础知识3的更多相关文章

  1. 《Programming Hive》读书笔记(两)Hive基础知识

    <Programming Hive>读书笔记(两)Hive基础知识 :第一遍读是浏览.建立知识索引,由于有些知识不一定能用到,知道就好.感兴趣的部分能够多研究. 以后用的时候再具体看.并结 ...

  2. tensorflow笔记(一)之基础知识

    tensorflow笔记(一)之基础知识 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7399701.html 前言 这篇no ...

  3. php面试笔记(5)-php基础知识-自定义函数及内部函数考点

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而函数相关的考点 ...

  4. php面试笔记(3)-php基础知识-运算符

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 在面试中,考官往往喜欢基础扎实的面试者,而运算符相关的考 ...

  5. Spring笔记(4) - Spring的编程式事务和声明式事务详解

    一.背景 事务管理对于企业应用而言至关重要.它保证了用户的每一次操作都是可靠的,即便出现了异常的访问情况,也不至于破坏后台数据的完整性.就像银行的自助取款机,通常都能正常为客户服务,但是也难免遇到操作 ...

  6. Spring笔记1——Spring起源及其核心技术

    Spring的作用 当我们使用一种技术时,需要思考为什么要使用这门技术.而我们为什么要使用Spring呢?从表面上面SSH这三大框架中,Struts是负责MVC责任的分离,并且提供为Web层提供诸如控 ...

  7. php面试笔记(2)-php基础知识-常量和数据类型

    本文是根据慕课网Jason老师的课程进行的PHP面试知识点总结和升华,如有侵权请联系我进行删除,email:guoyugygy@163.com 面试是每一个PHP初学者到PHP程序员必不可少的一步,冷 ...

  8. Spring笔记(6) - Spring的BeanFactoryPostProcessor探究

    一.背景 在说BeanFactoryPostProcessor之前,先来说下BeanPostProcessor,在前文Spring笔记(2) - 生命周期/属性赋值/自动装配及部分源码解析中讲解了Be ...

  9. Spring笔记(7) - Spring的事件和监听机制

    一.背景 事件机制作为一种编程机制,在很多开发语言中都提供了支持,同时许多开源框架的设计中都使用了事件机制,比如SpringFramework. 在 Java 语言中,Java 的事件机制参与者有3种 ...

随机推荐

  1. EF架构~CodeFirst自关联表的插入

    回到目录 这个文章对之前EF的一个补充,对于一些自关联表的添加,如果你建立了表约束确实有这种问题,一般主键为整形自增,父ID为可空,这时,在添加时如果不为ID赋值,结果就会出错. 错误: 无法确定依赖 ...

  2. .NetCore~Linux环境下部署

    NetCore正式版已经出现有段时候了,Windows下使用vs2015开发.netCore应用程序,然后通过dotnet程序开启WEB服务,用着很像node.js,当然我们不会于只局限于window ...

  3. jquery 的队列queue

    使用示列代码: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www ...

  4. js防止客户端多触发

    代码: /***防止多触发**id 必须唯一*fn 回掉函数*wait 延迟多长时间**使用例子:* ToPreventMoreTrigger('id', function () {//注意 id 是 ...

  5. Java 线程 — ConcurrentHashMap

    ConcurrentHashMap ConcurrentHashMap 结构 采用了分段锁的方法提高COncurrentHashMap并发,一个map里面有一个Segment数组--即多个Segmen ...

  6. 分享几个asp.net开发中的小技巧

    下面这几个,是在实际开发或阅读中发现的一些问题,有些甚至是有很多年开发人员写出的代码,也是很多人经常犯的错误.各位可以看看,你有没有躺着中枪. 第一个,对整型变量进行非null判断. // a 是in ...

  7. Docker之Linux Cgroups

    Linux Cgroups介绍 上面是构建Linux容器的namespace技术,它帮进程隔离出自己单独的空间,但Docker又是怎么限制每个空间的大小,保证他们不会互相争抢呢?那么就要用到Linux ...

  8. Spring MVC 学习总结(一)——MVC概要与环境配置

    一.MVC概要 MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范,用一种将业务逻辑.数据.显示分离的方法组织代码,MVC主要作用是降低了视图与业务 ...

  9. 在<a></a>标签中调用javascript脚本

    有时候,我们点击了<a></a>标签(除了跳转到指定链接外)想要它调用某个方法,及调用javascript脚本,该如何做: 方法1:<a href="javas ...

  10. IEE数据库安装向导

    RHEL 5用rpm包,直接安装后配置数据及缓存目录即可. RHEL 6用tar包+配置文件,本文是在RHEL 6上安装IEE的向导. ①上传infobright-4.0.6-x86_64.tar包和 ...