渲染web视图
- 讨论在控制器完成处理产生结果到渲染到用户的浏览器上这段时间发生了什么
- 控制器产生模型数据和视图逻辑名,用视图解析器来确定选择哪一个视图,在控制器中控制逻辑与视图渲染实现的解耦
1. 视图解析器
- 相关接口
- ViewResolver接口
package org.springframework.web.servlet;
import java.util.Locale;
public interface ViewResolver {
View resolveViewName(String viewName, Locale locale) throws Exception;//根据传来的视图逻辑名,Locale对象产生并返回一个View实例,Locale对象用来格式化地域相关值
}
- View接口
- View接口的任务是接受传来的模型,以及servlet的request和response对象,并将输出结果渲染到response中
package org.springframework.web.servlet;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.http.MediaType;
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";
String getContentType();
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
- Spring自带的视图解析器(主要讨论JSP的视图解析器)
- InternalResourcesViewResolver:将视图解析为web应用内部的资源
- TilesViewResolver:来控制jsp页面的布局
- Thymeleaf:一种用来替代jsp的新兴技术,它更像是最终产生的HTML,而不是驱动他们的java代码
2.创建JSP视图
Spring提供了两种产生jsp视图的方式
- 如果在JSP页面中使用了JSP标准标签库(JavaServer Pages Standard Tag Libary),InternalResourcesViewResolver需要将视图解析为JstlView对象,从而将Locale对象(地域相关的值:如日期和货币)和模型资源暴露给JSTL的格式化和信息标签
package config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;
@Configuration
@EnableWebMvc//注解启动SpringMVC的注解驱动
@ComponentScan("spitter_web")//启动组件扫描,怎样去控制仅仅扫描web组件????????
public class WebConfig {
@Bean
public ViewResolver viewResolver() {//配置jsp视图解析器
InternalResourceViewResolver resolver=new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");//设置视图名称前缀
resolver.setSuffix(".jsp");//设置视图名称后缀
resolver.setExposeContextBeansAsAttributes(true);//
resolver.setViewClass(JstlView.class);
//1、如果JSP应用了JSTL标签来处理格式化和信息,JSTL格式化标签需要一个Locale对象来处理与地域相关的值,
//2、所以讲将InternalResourceViewResolver产生的InternalResourceView设置为JstlView
//3、 通过解析JstlView能够或得Locale对象和Spring中配置的信息资源
return resolver;
}
}
- Spring提供了两个JSP标签库,一个用于表单到模型的绑定,另一个提供了通用的工具类特性
- 将表单绑定到模型上
- 表单绑定jsp标签库包含了14个标签,与原生标签的区别在于它们会绑定模型的一个对象,能根据模型中对象的属性填充值
- 通过<sf:errors>标签显示错误类型
- 将表单绑定到模型上
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="utf-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="sf" %>
<%@ page session="false" %>
<html>
<head>
<title>Spitter</title>
<link rel="stylesheet" type="text/css"
href="<c:url value="/resources/style.css" />" >
</head>
<body>
<h1>Register</h1>
<sf:form method="POST" commandName="spitter"><!-- 通过 commandName属性将模型中的spitter对象与表单绑定在一起-->
First Name: <sf:input path="firstName" /><br/><!-- path属性:指定标签的name,id,还有将上述对象指定的属性值填充到value -->
<sf:errors path="firstName"></sf:errors><!-- 设置错误显示 -->
Last Name: <sf:input path="lastName" /><br/>
Email: <sf:input type="email" path="email"/><br/>
Username: <sf:input path="username" /><br/>
Password: <sf:password path="password" /><br/>
<input type="submit" value="Register" />
</sf:form>
</body>
</html>
2. Spring通用的标签库