Spring MVC
- 前言
- 视图
- 视图解析器
- 附
前言
在上一章中,模型数据通过域对象共享的方式返回给前端控制器 DispatcherServlet 。那么,把结果封装成模型视图 ModelAndView 对象返回给前端控制器 DispatcherServlet 后,下一步是前端控制器 DispatcherServlet 依据视图解析器 ViewResolver 的解析,得到真实视图对象(JSP等)对处理结果的展现。
下面简单介绍视图与视图解析器:
视图
视图( View ),通常是一个 HTML 或 JSP 页面,也可以是其他类型的文档或图像。视图用于渲染模型数据,将模型数据以 HTML 、JSP 、Excel 、Word 、PDF 等形式呈现给用户。
在 org.springframework.web.servlet 包中,定义了一个高度抽象的 View(视图)接口。目的是实现视图模型和具体实现技术的解耦。 注:点击上方 Navigate 和 Class… ,输入 View 进行查找;选中 View 按 ctrl + h 查看 View 实现类的结构图。
常用的视图实现类:
视图实现类 | 说明 |
---|---|
InternalResourceView | Spring MVC 默认视图,主要用于请求转发的跳转 |
JstlView | InternalResourceView 的子类,主要用于支持国际化(多语言界面) |
RedirectView | 主要用于重定向 |
AbstractPdfView | PDF 文档视图 |
MappingJackson2JsonView | JSON 视图。将模型数据通过 Jackson 开源框架的 ObjectMapper 以 JSON 方式输出 |
视图解析器
视图解析器( ViewResolver ),将逻辑视图解析为一个具体的物理视图对象。
同样,在 org.springframework.web.servlet 包中,定义了一个 ViewResolver 接口。每一个视图解析器的实现类对应解析某一种类型的文档,所有视图解析器必须实现 ViewResolver 接口。
常用的视图解析器实现类:
视图解析器实现类 | 说明 |
---|---|
InternalResourceViewResolver | 解析为 URL 文件,默认视图解析器。即将视图名解析为一个 URL 文件。一般用于将视图名映射为一个保存在 WEB-INF 目录下的程序文件( 如 JSP ) |
BeanNameViewResolver | 解析为 Bean 的名字。即将逻辑视图名解析为一个 Bean ,Bean 的 id 等于逻辑视图名 |
FreeMarkerViewResolver | 解析为基于 FreeMarker 模板技术的模板文件 |
另外,可以选择一种或一种以上的视图解析器。可以使用 order 属性指定视图解析器的优先顺序进行解析,其属性值越小优先级越高。
<!-- 配置 springmvc 视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 配置视图页面 -->
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
<!-- 多个试题解析器,配置优先级 -->
<property name="order" value="1"></property>
</bean>
附
在软件开发中,国际化( Internationalization 简称 I18n ),是支持多种语言能够在不同的国家和地区使用,满足当地用户需求。下面使用 Jstl 的 fmt 标签实现国际化,Spring MVC 会把视图由 InternalResourceViewResolver 转换为 JstlView(InternalResourceView 的子类)。
简单示例:
首先,在 Spring MVC 配置文件 springmvc.xml 中配置国际化资源文件
<!-- 配置国际化资源文件 -->
<bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
<!-- 配置基本名字,值要与 .properties 文件的名字一致 -->
<property name="basename" value="i18n" />
<!-- 支持 UTF-8 的中文 -->
<property name="cacheSeconds" value="0"/>
<property name="defaultEncoding" value="UTF-8"/>
</bean>
注:资源文件字符编码一般默认为 GBK ,点击 File 和 Settings… ,弹出窗口找到 File Encodings 下的 Default encoding for properties files ,选择为 UTF-8 。
接着,在 resources 目录下创建默认国际化资源文件 i18n.properties (名字与 basename 值保持一致)
i18n.username=username
i18n.password=password
i18n.login=login
再在 resources 目录下创建中英国际化资源文件
命名格式:基本名_语言代码_国家或地区代码(必须按其命名格式命名)
中文(简体)国际化资源文件:i18n_zh_CN.properties
i18n.username=账号
i18n.password=密码
i18n.login=登录
英语(美国)国际化资源文件:i18n_en_US.properties
i18n.username=UserName
i18n.password=PassWord
i18n.login=Login
注:创建完成后,国际化资源文件会自动归档到 Resouce Bundle ‘i18n’ 中
然后,创建 i18n.jsp ,需要引入 fmt 标签
<%--
Created by IntelliJ IDEA.
User: dell
Date: 2023/7/28
Time: 19:58
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<html>
<body>
<form action="${pageContext.request.contextPath}/login" method="post">
<fmt:message key="i18n.username" /> : <input type="text" name="username" /> <br>
<fmt:message key="i18n.password" /> : <input type="text" name="password" /> <br>
<input type="submit" value="<fmt:message key="i18n.login" />" />
</form>
</body>
</html>
最后,在处理器 Controller 上简单编写一个方法,测试结果
package cn.edu.springmvcdemo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class I18nDemo {
@RequestMapping("/login")
public String i18nTest(){
return "i18n";
}
}
结果如图:
以 Firefox(火狐浏览器)进行测试
1.设置使用的语言为简体中文
2.设置使用的语言为 English(US)