InternalResourceViewResolver
对于视图这一块相信大家每天都在用,而且也都觉得用的很方便,而且用的最多的视图解析器应该都是这家伙:
org.springframework.web.servlet.view.InternalResourceViewResolver, 这一点我跟大家都是一样的。以前也 从没想着说去了解下其原理是什么,今天没事就看了下源码,发现没什么好说的,还是随便总结下吧,看源码的过程就不贴了。
首先我们的方法无论返回的是String,ModelAndView还是View类型,在DispatcherServlet中都会给你转换为ModelAndView进行操作,这也是解析视图的第一步,统一操作。然后将页面带过来的参数放在一个叫做mv的ModelAndView对象中通过一步步的解析(这些步骤其实就是各种解析可看可不看 ),最后到InternalResourceViewResolver中通过转发到达目标页面。总结得不好,说不出来意思,唉语文太差
JstlView
当然除了这个解析器外还有一些别的比如JstlView,这个解析器只需要我们将jstl的包导入上面所说的mv就会自动变成JstlView,也没什么好说的。
自定义视图
有时候我们可能会用到自定义视图,此时我们就需要
org.springframework.web.servlet.view.BeanNameViewResolver这个视图解析器。通过源码我们可以看到这个解析器是直接从MVC容器中通过视图名来解析的,所以我们需要把自定义的视图放到容器中去。而方法方法返回的就是自定义视图在容器中的名字,得一一对应。在配置文件中BeanNameViewResolver配置如下
<!--自定义视图的视图解析器 -->
<!--order值越小视图解析器的优先级越高 -->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
这里的order是用来决定视图解析器的优先级的因为通常我们都还配了InternalResourceViewResolver,而他的order是最大值所以只要配了这个属性就行。
接下来是自定义视图类我们需要实现VIew类
@Component
public class MyView implements View {
@Override
public String getContentType() {
return "text/html"; //返回内容类型
}
@Override
public void render(Map<String, ?> arg0, HttpServletRequest arg1,
HttpServletResponse arg2) throws Exception {
arg2.getWriter().print("now time:"+new Date());
}
}
这里在页面上打印了当前时间,这样自定义视图就ok了
mvc:view-controller
至于这个标签是让我们直接访问物理视图文件即jsp文件而不经过方法,用法很简单
<mvc:view-controller path="/success1" view-name="success"/>
这样就ok了,当你输入localhost:8080/SpringMvc/success1就会直接去访问success.jsp
使用这个标签时必须得加上
<mvc:annotation-driven></mvc:annotation-driven>
否则其他需要经过方法的访问会出错
以上有错误的欢迎指正,谢谢!