随笔记,分类于 乱七八糟 下,读《Spring 实战4》笔记
将控制器中请求处理的逻辑和视图中的渲染实现解耦是Spring MVC的一个重要特性。
Spring MVC 定义一个 ViewResolver 接口。
public interface ViewResolver {
@Nullable
View resolveViewName(String var1, Locale var2) throws Exception;
}
传入 视图名 和 Locale 对象,会返回 一个 View 实例。
public interface View {
String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
String PATH_VARIABLES = View.class.getName() + ".pathVariables";
String SELECTED_CONTENT_TYPE = View.class.getName() + ".selectedContentType";
@Nullable
default String getContentType() {
return null;
}
void render(@Nullable Map<String, ?> var1, HttpServletRequest var2, HttpServletResponse var3) throws Exception;
}
View 接口的任务就是接受模型以及Servlet的request 和 response 对象,并将输出结果渲染到 response 中。
可以编写 ViewResolver 和 View 的实现,将要渲染的内容放到 response 中,进而展现到用户的浏览器中。
Spring 为我们提供了一些视图解析器:
InternalResourceViewResolver
:一般用于 JSP。TilesViewResolver
:用于Apache Tiles视图。FreeMarkerViewResolver
:用于 FreeMaker。VelocityViewResolver
:用于 Velocity 视图。
展现国际化
将文本位于一个或多个属性文件中。借助<s:message>
,我们可以将硬编码的信息,使用如下方式展示:
<h1> <s:message code="xxx.xxx"></h1>
这种方式,<s:message>
会根据 key 为 xxx.xxx 的信息源来渲染文本。
使用 ResourceBundleMessageSource
从属性文件中 加载信息。
@Bean
public MessageSource messageSource(){
ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
messageSource.setBasename("message"); // 设置 根路径 下对应的 属性名文件
return messageSource;
}
basename
:指定了 对应的属性文件,在根路径下面。
另一个方案:使用ReloadableResourceBundleMessageSource
@Bean
public MessageSource messageSource(){
ReloadableResourceBundleMessageSource messageSource =
new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:message"); // 设置 根路径 下对应的 属性名文件
messageSource.setCacheSeconds(10);
return messageSource;
}
- 能够重新加载信息属性,而不是重新编译或重启应用。
- 可以加载 类路径下(
classpath:
前缀)文件。 - 文件系统中文件(
file:
前缀) - web 应用的根路径下,没有前缀
创建一个 properties
文件。
在里面设置 key 对应的信息
xxx.xxx = 123