背景:在web工程实际应用的时候,有时候不需要提前创建好jsp视图,也不知道提前创建什么样的视图,在web运行的时候,根据实际需要动态的创建自定义视图。示例如下:
一、创建视图类
首先创建一个视图类,用来创建要显示的视图。
@Component
public class HelloView implements View{
/*
* 获得视图的类型
* @see org.springframework.web.servlet.View#getContentType()
*/
@Override
public String getContentType() {
// TODO Auto-generated method stub
//返回的视图类型
return "text/html";
}
/*
* 对视图进行渲染
* @see org.springframework.web.servlet.View#render(java.util.Map, javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
*/
@Override
public void render(Map<String, ?> model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
response.getWriter().print("hello view, time: " + new Date());
}
}
该视图类生成视图名字默认为视图类名的首字母小写,即为helloView
二、创建请求
通过该请求去请求创建的helloView视图类
<a href="springMVC/testView">Test View</a>
三、创建控制器
控制器截获请求,处理数据,然后回显helloView视图。
@Controller
@RequestMapping("/springMVC")
public class TestSpringMVC {
@RequestMapping("/testView")
public String testView(){
System.out.println("testView");
return "helloView";
}
}
四、配置spring的配置文件
<context:component-scan base-package="com.lzj.springmvc"></context:component-scan>
<!--控制器返回helloView字符串后,不会立马就显示视图的,需要经过BeanNameViewResolver视图解析器直接从IOC容器中把helloView视图获取出来,所以前面需要在HelloView的视图类上加注解@Component,把视图先放在IOC容器中,否则视图解析器找不到。
order定义了视图解析器的级别,就是执行先后顺序,因为一个工程中可能有多个视图解析器-->
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
现在所有环境已经具备,发送index.jsp中的请求后,控制器截获该请求,并返回helloView字符串,Spring 把HelloView生成的视图Bean放到IOC容器中,由BeanNameViewResolver视图解析器根据控制器返回的helloView字符串去IOC容器中寻找helloView的视图Bean,找到之后就去显示该视图。
Order的用法:假设在spring的配置文件中配置如下信息:
<context:component-scan base-package="com.lzj.springmvc"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver">
<property name="order" value="100"></property>
</bean>
Order的用法:假设配置文件中配置了两个视图解析器InternalResourceViewResolver和BeanNameViewResolver,那么当控制器返回helloView字符串时,要运用哪个视图解析器进行解析呢?此时就需要用order进行定义,order的值越小,级别越高,优先用此解析器进行解析。
在实现InternalResourceViewResolver类时,源码中已经默认使用的order值最大,也就是说在spring配置文件中定义n个视图解析器的话,当其它的解析器都没能根据字符串helloView解析视图时,就会使用InternalResourceViewResolver定义的视图解析器,所以InternalResourceViewResolver视图解析器一般都是最后执行的。