目录
我们知道springMVC,MVC包括视图,一开始建立工程的时候就已经配置了,这里就不说了,直接上代码。
一、简单的视图
1.1 简单的例子
我在《hualinux springMVC 5.2:使用 idea建立简单springMVC》文章中就已经建立一简单的视图了
web-->WEB-INF-->dispatcher-servlet.xml 配置文件如下图:
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
@RequestMapping("/springmvc/testViewAndViewResolver")
public String testViewAndViewResolver(){
System.out.println("testViewAndViewResolver");
return "ok";
}
打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:
<p><a href="springmvc/testViewAndViewResolver">Test ViewAndViewResolver</a></p>
运行tomcat,idea会自动打开主页点,下面链接
看到返回“ok,访问成功!”时,再看idea最下方的日志输出如下:
testViewAndViewResolver
1.2 视图解析工作过程
请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图
Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是Excel、JFreeChart 等各种表现形式的视图
对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦
二、相关知识
2.1 概念
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View接口:
org.springframework.web.servlet.view.java
视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题
2.2 常用的视图实现类
视图解析器
SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体
的视图解析器实现类。
视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
所有的视图解析器都必须实现 ViewResolver 接口:
常用的视图解析器实现类
- 程序员可以选择一种视图解析器或混用多种视图解析器
- 每个视图解析器都实现了 Ordered 接口并开放出一个 order 属性,可以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。
- SpringMVC 会按视图解析器顺序的优先顺序对逻辑视图名进行解析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常
InternalResourceViewResolver
JSP 是最常见的视图技术,可以使用InternalResourceViewResolver 作为视图解析器:
- 若项目中使用了 JSTL,则 SpringMVC 会自动把视图由InternalResourceView 转为 JstlView
- 若使用 JSTL 的 fmt 标签则需要在 SpringMVC 的配置文件中配置国际化资源文件
- 若希望直接响应通过 SpringMVC 渲染的页面,可以使用 mvc:view-controller 标签实现
Excel 视图
- 若希望使用Excel 展示数据列表,仅需要扩展SpringMVC 提供的 AbstractExcelView 或AbstractJExcel View 即可。实现 buildExcelDocument() 方法,在方法中使用模型数据对象构建 Excel 文档就可以了。
- AbstractExcelView 基于 POI API,而 AbstractJExcelView 是基于 JExcelAPI 的。
- 视图对象需要配置 IOC 容器中的一个 Bean,使用BeanNameViewResolver 作为视图解析器即可
- 若希望直接在浏览器中直接下载 Excel 文档,则可以设置响应头 Content-Disposition 的值为attachment;filename=xxx.xls
三、使用JSTL
使用JSTL很简单,只需要氢jstl和standard的jar包复制到lib下即可
下载地址:https://tomcat.apache.org/download-taglibs.cgi
四、国际化
4.1 添加依赖和配置文件
在pom.xml添加如下依赖
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-impl -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-impl</artifactId>
<version>1.2.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.taglibs/taglibs-standard-spec -->
<dependency>
<groupId>org.apache.taglibs</groupId>
<artifactId>taglibs-standard-spec</artifactId>
<version>1.2.5</version>
</dependency>
在src\main\resources下建立3个配置类:l18n.properties、l18n_zh_CN.properties、l18n_en_US.properties
内容分别为:
l18n.properties
i18n.username=Usernmae
i18n.password=Password
l18n_zh_CN.properties
因为我用的是UTF-8,所以要用UTF-8在线转换工具 http://tool.chinaz.com/tools/utf-8.aspx
#下面两行特殊字符串分别是UTF-8编码,中文的“用户名”“密码”的意思
i18n.username=用户名
i18n.password=密码
l18n_en_US.properties
i18n.username=Usernmae
i18n.password=Password
dispatcher-servlet.xml, 添加如下配置:
<!-- 配置国际化资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value="l18n"/>
</bean>
4.2 实现代码
在web/ index.jsp,添加如下代码:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
…
<p><fmt:message key="i18n.username"></fmt:message></p>
<p><fmt:message key="i18n.password"></fmt:message></p>
运行测试,发现找不到fmt,这里我不解决,在为实际国际化不会放配置文件中,一般放数据库中,以下是我旧版本做出的结果:
打开IE浏览器,尾部添加/springmvc/testViewAndViewResolver,结果如下:
因为我IE10浏览器是中文的,现在设置为英文试下
然后按ctlr+F5强制刷新页面,发现变成了英文了
五、 <mvc:view-controller>标签
在springMVC的配置文件中使用<mvc:view-controller>标签可以使得url不需要进入handler处理方法,就可以直接跳转页面,配置方法如下
web/WEB-INF/dispatcher-servlet.xml, 添加如下配置:
<!-- 配置直接进行转发的页面,无须进入handler方法 -->
<mvc:view-controller path="/ok" view-name="ok" />
注:添加这个还需要添加多一个 <mvc:annotation-driven />,不然的话,index.jsp主页上所有链接将失效
根据如上的配置,直接在idea打开的浏览器尾部添加ok,就可以跳转至ok.jsp页面,而无需进入handler处理方法,更不需要进行@RequestMapping映射。
六、自定义视图
自定义视图,使用它可以很好的和jfreechar或excel整合,下面来具体说明。
首先新建一个视图,新建一个类,继承view接口,然后覆盖里面的方法,代码如下:
在src/main/java/com.hualinux.springmvc.handers/HelloView.java,代码如下:
package com.hualinux.srpingmvc.handers;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
import java.util.Map;
@Component
public class HelloView implements View {
@Override
public String getContentType() {
return "text/html";
}
@Override
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
response.getWriter().print("hello view,time:"+new Date());
}
}
如上所示,写一个类,继承View接口,然后覆盖里面的方法,就可以自己自定义视图了,但是目前这个视图还没有用,需要在dispatcher-servlet的配置文件中进行配置,才能使用这个视图,配置方法如下:
web/WEB-INF/dispatcher-servlet.xml添加如下配置:
<!-- 视图解析器 BeanNameViewResolver:使用视图的名字来解析视图 -->
<!-- 定义property属性来定义视力的优先级,order值越小,越优先,InternalResourceViewResolver视图的order最高为int最大值 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="10" />
</bean>
如上的配置,那么这个视图就可以使用了,然后我们写一个handler处理方法
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码
@RequestMapping("/springmvc/testView")
public String testView(){
System.out.println("hello view");
return "helloView";
}
打开web/index.jsp,在其页面的<body></body>标签中添加如下代码:
<p><a href="springmvc/testView">Test View</a></p>
运行tomcat,idea会自动打开主页点,下面链接
再看idea最下方的日志输出如下:hello view
七、视图的重定向操作
上面所说的全部都是视图的转发,而不是重定向,这次我来讲一下重定向是怎么操作的。
只要字符串中以forward或者redirect开头,那么springMVC就会把它解析成关键字,然后进行相应的转发,或者重定向操作
web/ t1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" pageEncoding="UTF-8" %>
<html>
<head>
<title>test1</title>
<meta charset="UTF-8">
</head>
<body>
<h3>this ia a t1</h3>
<h3>这个是t1.jsp页面</h3>
</body>
</html>
在src/main/java/com.hualinux.srpingmvc.handers/SpringMVCTest.java,添加如下代码:
/*
* 测试视图的重定向
* 只要在字符串中加了foword或者redirect开头,springMVC就会把它解析成关键字,进行相应原转发重定向操作
* */
@RequestMapping("/springmvc/testRedirect")
public String testRedirect(){
return "redirect:/t1.jsp";
}
/*
* 测试视图的转发
* 只要在字符串中加了foword或者redirect开头,springMVC就会把它解析成关键字,进行相应原转发重定向操作
* */
@RequestMapping("/springmvc/testForward")
public String testForward(){
return "forward:/t1.jsp";
}
分别是重定向与转发操作,其实不止java代码,<mvc:view-controller>标签中的返回视图,也可以加上redirect或者forward字符串,也会进行相应的操作。
在web/ index.jsp,添加如下代码:
<p><a href="springmvc/testRedirect">Test Redirect</a></p>
<p><a href="springmvc/testForward">Test Forward</a></p>
运行tomcat并分别点上面的链接效果如下:
下面是Redirect效果,url直接变了