目录
一、简单的视图
1.1 简单的例子
1.2 视图解析工作过程
二、相关知识
2.1 概念
2.2 常用的视图实现类
视图解析器
常用的视图解析器实现类
InternalResourceViewResolver
Excel 视图
三、使用JSTL
四、国际化
4.1 添加依赖和配置文件
4.2 实现代码
五、 标签
六、自定义视图
七、视图的重定向操作
我们知道springMVC,MVC包括视图,一开始建立工程的时候就已经配置了,这里就不说了,直接上代码。
我在《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
请求处理方法执行完成后,最终返回一个 ModelAndView 对象。对于那些返回 String,View 或 ModeMap 等类型的处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图
Spring MVC 借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是 JSP ,也可能是Excel、JFreeChart 等各种表现形式的视图
对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
为了实现视图模型和具体实现技术的解耦,Spring 在 org.springframework.web.servlet 包中定义了一个高度抽象的 View接口:
org.springframework.web.servlet.view.java
视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题
SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多种解析策略,并指定他们之间的先后顺序。每一种映射策略对应一个具体
的视图解析器实现类。
视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
所有的视图解析器都必须实现 ViewResolver 接口:
JSP 是最常见的视图技术,可以使用InternalResourceViewResolver 作为视图解析器:
若项目中使用了 JSTL,则 SpringMVC 会自动把视图由InternalResourceView 转为 JstlView若使用 JSTL 的 fmt 标签则需要在 SpringMVC 的配置文件中配置国际化资源文件 若希望直接响应通过 SpringMVC 渲染的页面,可以使用 mvc:view-controller 标签实现使用JSTL很简单,只需要氢jstl和standard的jar包复制到lib下即可 下载地址:https://tomcat.apache.org/download-taglibs.cgi
在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=Passwordl18n_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=Passworddispatcher-servlet.xml, 添加如下配置:
<!-- 配置国际化资源文件 --> <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource"> <property name="basename" value="l18n"/> </bean>
在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强制刷新页面,发现变成了英文了
在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直接变了
点 Test Forward
点 Test Redirect