四、springMVC之视图&视图解析器

一、视图解析

过程:

  请求处理方法执行完成后,最终返回一个ModelAndView对象。对于那些返回String、View 或 ModeMap等类型的处理方法,springMVC也会在内部将他们装配后成一个ModelAndView对象,他包含了逻辑名和模型对象的视图。

  springMVC借助视图解析器得到最终的视图对象View,最终的视图可以是JSP,也可能是Excel等各种表现形式的视图;对于最终究竟采取何种视图对象 对模型数据进行渲染,处理器不关心,处理器工作重点聚焦在生成模型数据的工作上,从而实现MVC的充分解耦;。

  视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户;视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有有线程安全的问题;

springMVC 解析视图过程

 常用的视图实现类:

大类 视图类型 说明
URL视图资源 InternalResourceView

将JSP或其它资源封装成一个视图是 InternalResourceViewResolver默认使用的视图实现类

 

JstlView

如果JSP文件中使用了JSTL国际化标签的功能,则需要使用该视图类。

文档资源 AbstractExcelView

Excel文档视图的抽象类,该视图的抽象类基于POI构造Excel文件。

AbstractPdfView

PDF文档视图的抽象类,该视图的抽象类基于iText构造PDF文件。

报表视图 ConfigurableJsperReportsView

几个使用JasperReports报表技术的视图

JasperReportsCsvView
JasperReportsMulitiFormatView
JasperReportshtmlView
JasperReportsPdfView
JasperReportsXlsView
JSON视图 MappingJacksonView

将模型数据通过jackson开源框架的ObjectMapper以JSON方式输出

常用的视图解析器实现类:

大类 视图类型 说明
解析为Bean的名称 BeanNameViewResolver 将逻辑视图名解析为一个Bean,Bean的id等于逻辑视图名。
解析为URL文件 InternalResourceViewResolver 将视图名解析为一个URL文件,一般使用该解析器将视图名映射为一个保存在WEB-INF目录下的程序文件(如JSP)
JasperReportsViewResolver

JasperReports是一个基于Java的开源报表工具,该解析器将视图名解析为报表文件对应的URL

模板文件视图 FreeMarkViewResolver

JasperReports是一个基于Java的开源报表工具,该解析器将视图名解析为报表文件对应的URL

 

VelocityViewResolver 解析为基于Velocity模板技术的模板文件
VelocityLayoutViewResolver

实例验证:

InternalResourceView 之前的实例都有;这里就验证jstlView实例;

目录结构和配置方式:

HelloWord的配置方式

jstlView实例

添加jstl jar包:

  • jstl.jar  

  • standard.jar

spring国际化配置:

basename:默认的扫描的国际化文件名为i18n。

1 <bean id="messageSource"
2         class="org.springframework.context.support.ResourceBundleMessageSource">
3         <property name="basename" value="i18n"></property>
4     </bean>

完整文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:mvc="http://www.springframework.org/schema/mvc"
 6     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
 7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <context:component-scan base-package="handler"></context:component-scan>
11 
12     <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
13     <bean
14         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
15         <property name="prefix" value="/WEB-INF/views/"></property>
16         <property name="suffix" value=".jsp"></property>
17     </bean>
18     
19     <!-- 配置国际化资源 -->
20     <!-- 注意id必须为messageSource 否则 使用<s:message code=''></s:message>会报错 -->
21     <bean id="messageSource"
22         class="org.springframework.context.support.ResourceBundleMessageSource">
23         <property name="basename" value="i18n"></property>
24     </bean>
25 
26 </beans>
View Code

 

国际化文件:

  •  i18n_en_US.properties 文件名为i18n ,en_US 代表英文
1 i18n.username=Username
2 i18n.password=Password
  • i18n_zh_CN.properties: 文件名为i18n ,zh_CN 代表中文
1 i18n.username=用户名
2 i18n.password=密码

 


RequestMappingTest:

 1 package handler;
 2 
 3 import org.springframework.stereotype.Controller;
 4 import org.springframework.web.bind.annotation.RequestMapping;
 5 
 6 @RequestMapping("/springmvc")
 7 @Controller
 8 public class RequestMappingTest {
 9     private static final String SUCCESS = "success";
10 
11     @RequestMapping("/testJstlView")
12     public String jstlView() {
13         System.out.println("jstlView");
14         return SUCCESS;
15     }
16 }

index.jsp:

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8" isErrorPage="false"%>
 3 <!DOCTYPE html>
 4 <html>
 5 <head>
 6 <meta http-equiv="Content-type" content="text/html;charset=UTF-8">
 7 <title>Insert title here</title>
 8 </head>
 9 <body>
10     <a href="/springmvc/testJstlView">testJstlView</a>
11 </body>
12 </html>
View Code

 

success.jsp:

添加taglib ;

 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
 2     pageEncoding="UTF-8" isErrorPage="true"%>
 3 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
 5 <%@ taglib prefix="s" uri="http://www.springframework.org/tags"%>
 6 <!DOCTYPE html>
 7 <html>
 8 <head>
 9 <meta charset="UTF-8">
10 <title>Insert title here</title>
11 </head>
12 <body>
13     <h4>success成功</h4>
14     <br>
15     <fmt:bundle basename="i18n">
16         <fmt:message key="i18n.username"></fmt:message>
17 
18     </fmt:bundle>
19     <br>
20     <fmt:bundle basename="i18n">
21         <fmt:message key="i18n.password"></fmt:message>
22     </fmt:bundle>
23     <br />
24     <s:message code="i18n.password"></s:message>
25 
26     <br />
27 </body>
28 </html>

 

运行结果:

 index.jsp运行结果如下图;点击testJstlView 跳转到success 页面,且控制台打印jstlView

 

 

配置可以直接转发的页面

如果配置了直接可以转发的页面,那么可以直接响应转发的页面,无需再经过Handler的方法。同时需要配置 mvc:annotation-driven标签

配置方法如下:

1 <mvc:view-controller path="/success" view-name="success"/>
2     
3     <!-- 在实际开发中通常需要配置mvc:annotation-driven标签 -->
4     <mvc:annotation-driven></mvc:annotation-driven>

spring.xml的完整文件:

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xmlns:context="http://www.springframework.org/schema/context"
 5     xmlns:mvc="http://www.springframework.org/schema/mvc"
 6     xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
 7         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
 8         http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 9 
10     <context:component-scan base-package="handler"></context:component-scan>
11 
12     <!-- 配置视图解析器 如何把handler 方法返回值解析为实际的物理视图 -->
13     <bean
14         class="org.springframework.web.servlet.view.InternalResourceViewResolver">
15         <property name="prefix" value="/WEB-INF/views/"></property>
16         <property name="suffix" value=".jsp"></property>
17     </bean>
18     
19     <!-- 配置国际化资源 -->
20     <!-- 注意id必须为messageSource 否则 使用<s:message code=''></s:message>会报错 -->
21     <bean id="messageSource"
22         class="org.springframework.context.support.ResourceBundleMessageSource">
23         <property name="basename" value="i18n"></property>
24     </bean>
25     
26     
27     <!-- 同时需要配置 mvc:annotation-driven标签 -->
28     <mvc:view-controller path="/success" view-name="success"/>
29     
30     <!-- 在实际开发中通常需要配置mvc:annotation-driven标签 -->
31     <mvc:annotation-driven></mvc:annotation-driven>
32 
33 </beans>
View Code

运行效果如下:

 

 

 

posted @ 2022-03-14 11:33  啄木鸟伍迪  阅读(214)  评论(0编辑  收藏  举报
//火箭 GenerateContentList();