【SpringMVC】6.SpringMVC的视图和视图解析器

12 篇文章 0 订阅
3 篇文章 0 订阅

注意!!!


此文章需要配置了SpringDispatcherServletInternalResourceViewResolver才能够使用,如果不会配置,请翻看我【SpringMVC】系列的第一篇文章《【SpringMVC】1. SpringMVC的第一个程序——HelloWorld》


一、视图和视图解析器


1.什么是视图

  • 视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客户。
  • 为了实现视图模型和具体实现技术的解耦,Spring 在org.springframework.web. servlet 包中定义了一个高度抽象的 View 接口。
  • 视图对象由视图解析器负责实例化。由于视图是无状态(既每次都从新创建)的,所以他们不会有线程安全的问题。
  • 常用的视图实现类:
    这里写图片描述

2.SpringMVC如何解析视图

其实视图解析器我们在之前就已经配置过了,那就是配置在springmvc.xml中的InternalResourceViewResolver
它的作用就是把我们Handler方法中返回的StringModelAndViewView,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图。

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

这里写图片描述

SpringMVC解析视图流程


3.什么是视图解析器

  • SpringMVC 为逻辑视图名的解析提供了不同的策略,可以在 Spring WEB 上下文中配置一种或多种解析策略,并
    指定他们之间的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。
  • 视图解析器的作用比较单一:将逻辑视图解析为一个具体的视图对象。
  • 所有的视图解析器都必须实现 ViewResolver 接口
  • 常用的视图解析器实现类:程序员可以选择一种视图解析器或混用多种视图解析器每个视图解析器都实现了Ordered 接口并开放出一个 order属性,可 以通过 order 属性指定解析器的优先顺序,order 越小优先级越高。SpringMVC会按视图解析器顺序的优先顺序对逻辑视图名进行解 析,直到解析成功并返回视图对象,否则将抛出 ServletException 异常。

这里写图片描述

常用的视图解析器



二、使用InternalResourceViewResolver进行视图解析


相关代码:

1.加入相关的JAR包

  • jstl.jar
  • standard.jar
    ###2.在src目录下的springmvc.xml配置视图解析器(如果已经配置好则不需再次配置)和国际化资源文件
<!-- 配置视图解析器:如何把Handler方法返回值解析为实际的物理视图 -->
	<bean
		class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/views/"></property>
		<property name="suffix" value=".jsp"></property>
	</bean>
	
	<!-- 配置国际化资源文件 -->
	<bean id="messageSource"
		class="org.springframework.context.support.ResourceBundleMessageSource">
		<property name="basename" value="i18n"></property>
	</bean>

3.在src目录下创建国际资源文件i18n_en_US.propertiesi18n_zh_CN.properties

i18n_en_US.properties相关代码

i18n.username=Username
i18n.password=Password

i18n_zh_CN.properties相关代码
由于在properties文件中是不支持中文的,所以你在properties文件中输入中文,就会自动转变为Unicode编码。我输入的是中文的用户名和密码

i18n.username=\u7528\u6237\u540D
i18n.password=\u5BC6\u7801

4.Handler类com.springmvc.handlersSpringMVCTest相关代码

@RequestMapping("/testViewAndViewResolver")
	public String testViewAndViewResolver(){
		System.out.println("testViewAndViewResolver");
		return SUCCESS;
	}

5.WebRoot/WEB-INF/views/success.jsp相关代码

使用jstl的时候注意加入fmt标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>success</title>
</head>

<body>
	<h1>Success page</h1>
	<fmt:message key="i18n.username"></fmt:message>
	 <br>-----------------------------------------<br>
	 <fmt:message key="i18n.password"></fmt:message>
</body>
</html>

6.WebRoot/index.jsp的相关代码

在原来代码的基础上添加一个超链接

<a href="springmvc/testViewAndViewResolver">testViewAndViewResolver</a>

7.(可选)如果不想经过Handler方法,而是直接访问页面可以做以下配置

WebRoot/WEB-INF/views/success.jsp加入以下代码

<!-- 配置直接转发的页面 -->
	<!-- 可以直接响应转发的页面,而不需经过Handler的方法 -->
	<mvc:view-controller path="/success" view-name="success" />
	<!-- 实际开发中通常需要配置mvc:annotation标签 -->
	<mvc:annotation-driven></mvc:annotation-driven>

7.效果展示

运行Tomcat后访问http://localhost:8080/springmvc-1/index.jsp
点击超链接testViewAndViewResolver

这里写图片描述

会发现是中文字样的的账户和密码

如果我们更改浏览器的语言首选项为英语的时候,发现原来的中文变成了英文
这里写图片描述

修改语言首选项步骤:

1.打开IE,按一下右上角的齿轮标志,选择Internet选项

这里写图片描述

2.点击“语言”,弹出来的窗口选择“设置语言首选项”

这里写图片描述

3.选择“添加语言”,找到 English(United States)选择添加,等待自动下载完成后点击下面图片的上箭头标志,最后重启IE浏览器,重新访问即可。
这里写图片描述


三、使用BeanNameViewResolver来解析视图


1.springmvc.xml配置BeanNameViewResolver视图解析器

<!-- 配置视图BeanNameViewResolver解析器:使用视图的名字来解析视图 -->
	<!-- 通过order属性来定义视图解析器的优先级,,值越小优先级越高 -->
	<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
	<property name="order" value="100"></property>
	</bean>

2.新建包com.springmvc.views

并在这个包下新建视图类HelloView,并将该类放到spring容器中

package com.springmvc.views;

import java.util.Date;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.View;

@Component
public class HelloView implements View {

	@Override
	public String getContentType() {
		return "text/html";
	}

	@Override
	public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
		response.getWriter().print("hello view,time:"+new Date());
	}

}

3.测试类SpringMVCTest的相关代码

位于com.springmvc.handlers

/*
	 * 测试自定义视图
	 */
	@RequestMapping("/testView")
	public String testView(){
		System.out.println("Test view");
		return "helloView";
	}

4.WebRoot根目录下的index.jsp相关代码

<a href="springmvc/testView">testView</a>

5.效果展示

运行Tomcat后访问 http://localhost:8080/springmvc-1/index.jsp
点击超链接testView
这里写图片描述


四、重定向


  • 一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理。
  • 如果返回的字符串中带forward:或redirect:前缀时,SpringMVC会对他们进行特殊处理:将forward:和redirect:当成指示符,其后的字符串作为
    URL来处理
  • redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
  • forward:success.jsp:会完成一个到 success.jsp 的转发操作
@RequestMapping("/testRedirect")
	public String testRedirect(){
		System.out.println("testRedirect");
		return "redirect:/index.jsp";
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值