SpringMvc in Action——渲染Web视图(暂时跳过)

理解视图解析

将控制器中的请求处理的逻辑和视图的渲染解耦合是Spring MVC的一个重要特性。如果控制器直接负责产生HTML,那么就很难不影响处理逻辑的前提下,维护和更新视图。控制器方法和视图的实现会在模型内容上达成一致,这是两者最大的关联。除此之外,应该两者应该保持足够的距离实现解耦合。
在之前,我们使用了名为InternalResourceViewResolver的视图解析器,在它的配置中,我们使用“/WEB-INF/views”和".jsp"的前后缀来确定JSP的物理位置。现在,我们回过来看一下视图解析的基础知识,以及Spring提供的其他视图解析器。

SpringMVC定义了一个名为ViewResolver的接口,它大致如下所示:

public interface ViewResolver{
	View resolveViewName(String viewName,Locale locale)
		throws Exception;
}

给resolveViewName()方法传入一个视图名和Locale对象时,它会返回一个View实例,View是另外一个接口,如下所示:

public interface View{
	String getContentType();
	void render(Map<String,?> model,
				HttpServletRequest request,
				HttpServletResponse,response)throws Exception;
}

View 接口的任务就是接受模型以及Servlet的request和response对象,并将输出结果渲染到response中。
当然我们并不需要自己做这几个实现,Spring提供了多个内置实现:
SpringMvc in Action——渲染Web视图(暂时跳过)
SpringMvc in Action——渲染Web视图(暂时跳过)

创建JSP视图

配置适用于JSP的视图解析器

	@Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }

解析JSTL视图
到目前为止,我们对InternalResourceViewResolver 的配置都很基础和简单,它最终会将逻辑视图名解析为InternalResourceView的实例,这个实例会引用jsp文件。但如果这些jsp使用JSTL标签来处理格式化和信息的话,我们会希望InternalResourceViewResolver 将视图解析为JstlView。
如果想让InternalResourceViewResolver 将视图解析为JstView而不是InternalResourceView,我们只需设置它的viewClass属性即可。

	@Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        resolver.setViewClass(org.springframework.web.servlet.view.JstlView.class);
        return resolver;
    }

使用Spring的JSP库
为了避免在脚本块中直接编写java代码,Spring提供了两个JSP标签库,用来帮助定义Spring MVC Web的视图。其中一个标签库会用来渲染HTML表单标签,这些标签可以绑定model中的某个属性。另外一个标签包含了一些工具类标签。

  1. 将表单绑定到模型上
    Spring的表单绑定JSP标签库包含了14个标签,为了使用表单绑定库
    (暂略。)