视图和视图解析器
请求处理方法执行完成后,最终返回一个 ModelAndView对象。对于那些返回 String,View 或 ModeMap 等类型的
处理方法,Spring MVC 也会在内部将它们装配成一个ModelAndView 对象,它包含了逻辑名和模型对象的视图
• Spring MVC 借助视图解析器(ViewResolver)得到最终 的视图对象(View),最终的视图可以是 JSP ,也可能是Excel、JFreeChart 等各种表现形式的视图
• 对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现 MVC 的充分解耦
视图
视图的作用是渲染模型数据,将模型里的数据以某种形式呈现给客 户。
• 为了实现视图模型和具体实现技术的解耦,Spring 在org.springframework.web.servlet 包中定义了一个高度抽象的 View
视图的顶级接口:View
视图解析器:ViewResolver
常见的视图和解析器
Internal Resource View,Internal Resource View Resolve
接口:
视图对象由视图解析器负责实例化。由于视图是无状态的,所以他们不会有线程安全的问题
<!-- 配置视图解析器 为 controller 中返回中的字段 添加前缀 和 后缀-->
<bean class = "org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value = "/view/"></property>
<property name="suffix" value= ".jsp"></property>
</bean>
国际化
springMVC解析jsp时 会默认使用internalResourceView,如果发现jsp中包含jstl语言,则自动转成子类
JstlView 可以解析jstl实现国际化操作
国际化:针对不同地区,不同国家,进行不同显示
具体实现国际化的步骤:
1.创建资源文件
常见资源文件命名
基名_语言_地区.properties
一般会有一个基名.properties,当在指定资源文件中没有找到键值对,就会去这个文件中找
i18n_zh_CH.properties
resource.welcome = 你好
resource.exit = 退出
i18n_en_US.properties
resource.welcome = WELCOME
resource.exit = EXIT
2.配置springMVC.xml,加载资源文件
<!-- 加载国际化资源文件 \
1.将ResourceBundleMessageSource在程序加载时 加入springMVC:会自动查找id = “MessageSource”的bean 如果有则自动加载
2.如果配置了ResourceBundleMessageSource,则该类会在程序响应时介入
-->
<bean id = "messageSource" class = "org.springframework.context.support.ResourceBundleMessageSource">
<property name="basename" value = "i18n"></property>
</bean>
3.通过jstl使用国际化
引入标签库
<%@ taglib uri ="http://java.sun.com/jsp/jstl/fmt" prefix = "fmt" %>
。。。
<body>
<c:message key = "resource.welcome"></c:message>
<c:message key = "resource.exit"></c:message>
</body>
使用时不能直接访问国际化页面
ResourceBundleMessageSource会在springMVC响应程序时 介入(解析国际化资源文件)
跳转:
默认:index.jsp ->Controller -> success,jsp
如果要用springMVC实现index.jsp -> successs.jsp
<mvc:view-controller path = "view/welcome" view-name = "success"/>
<mvc:view-controller path="fmt" view-name = "fmt"/>
如果只有mvc标签:会让所有的请求 转入mvc:...中匹配映射地址,而忽略所有的@RequestMapping();
要想标签与控制器共存则需要加入一个注解
<mvc:view-controller path="fmt" view-name = "fmt"/>
<!-- 此配置时SpringMVC的基础配置,很多功能都需要通过该注解来协调 -->
<mvc:annotation-driven></mvc:annotation-driven>
控制器转发方式:
一般情况下,控制器方法返回字符串类型的值会被当成逻辑视图名处理
• 如果返回的字符串中带 forward: 或 redirect: 前缀 时,SpringMVC 会对他们进行特殊处理:将 forward: 和
redirect: 当成指示符,其后的字符串作为 URL 来处理 – redirect:success.jsp:会完成一个到 success.jsp 的重定向的操作
– forward:success.jsp:会完成一个到 success.jsp 的转发操作
默认时请求转发(地址栏不变)
可以通过加前缀指定转发方式(forward: redirect:)
return "forward:/view/ModelAndView.jsp";
return "redirect:/view/ModelAndView.jsp";
需要注意 此种方式,不会被视图解析器加上前缀(/view),后缀(.jsp)
处理静态资源:
若将 DispatcherServlet 请求映射配置为 /,则 Spring MVC 将捕获WEB 容器的所有请求,包括静态资源的请求, SpringMVC 会将他们当成一个普通请求处理,因找不到对应处理器将导致错误。
在springMVC中如果直接访问静态资源:404
原因:之前将所有的请求通过 通配符“/”拦截,进而交给分发器处理,去匹配所有的@RequestMapping
解决:需要springMVC处理的;交给@RequestMapping处理;如果不需要springMVC处理的,则使用tomcat默认的servlet处理
sevlet:如果有对应的对应的请求拦截,则交给对应的Servlet处理,如果没有对用的请求拦截,则直接访问
tomcat默认的Servlet在哪里?tomcat配置文件\conf\web.xml中(org.apache.catalina.servlets.DefaultServlet)
实现:只需要增加一个配置即可
<!-- 使用默认Servlet去访问静态资源 -->
<mvc:default-servlet-handler/>
需要有 <mvc:annotation-driven></mvc:annotation-driven>配置