视图解析器的作用:
就是当 DispatcherServlet将ModelAndView传递给视图解析器的时候,将ModelAndView数据填充到相应的视图中,然后返回一个带有数据的视图给DispatcherServlet.
视图解析其中有个抽象类:
AbstractCachingViewResolver 它将解析过的视图进行缓存,下次再次解析的时候就会在缓存中直接寻找该视图。
第一种视图:UrlBasedViewResolver,继承上面这个抽象类,具有缓存功能。但这里不介绍了,因为有个更通用的方法替代这个视图。
第二种视图:InternalResourceViewResolver 继承UrlBasedViewResolver` 而且有自己的特点。
先来看看它是如何配置的:
springmvc.xml:
<mvc:annotation-driven></mvc:annotation-driven>
<!--<bean class="controller.FruitsController"></bean>-->
<context:component-scan base-package="controller"></context:component-scan>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp"></property>
<property name="suffix" value=".jsp"></property>
</bean>
处理器:
modelAndView.setViewName("/fruitsList");
当你访问:http://localhost:8080/SpringMVC_test/queryList.action即可。总结:
- 利用前缀和后缀的配置,可以减少Contreller中视图定义的代码。
- 该解析器也有对视图缓存的功能
- 通常把jsp放在WEB-INF目录下,视图解析器会在服务器中将请求foreword到对应的视图上。
再来介绍一个返回模板类型的视图解析器:FreeMarkerViewResolver。
它会解析逻辑视图配置,返回一种Freemarker模板,该模板负责将数据模型中的数据合并到模板中,从而生成标准的输出,可以生成各种文本,包括HTML,XML,java源码等。
先来看看配置吧,springmvc要配置两个部分:
<mvc:annotation-driven></mvc:annotation-driven>
<!--<bean class="controller.FruitsController"></bean>-->
<context:component-scan base-package="controller"></context:component-scan>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
<property name="prefix" value="fm_"></property>
<property name="suffix" value=".ftl"></property>
<property name="order" value="1"></property>
</bean>
<!--模板文件的路径以及其他配置-->
<bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
<property name="templateLoaderPath" value="/WEB-INF/freemarker"></property>
</bean>
再看看控制器:
//标识是一个控制器,可以被处理器适配器找到
@Controller
public class FruitsController {
private FruitService fruitService = new FruitService();
//@RequestMapping实现将queryList方法和url进行映射,一个方法对应一个url
//一般建议将url设置和方法写一样
@RequestMapping("/queryList")
public ModelAndView queryList() {
List<Fruit> list = fruitService.queryFruitsList();
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("fruits",list);
System.out.println(modelAndView.getModelMap());
modelAndView.setViewName("fruit");
return modelAndView;
}
class FruitService{
public List<Fruit> queryFruitsList(){
List<Fruit> list = new ArrayList<Fruit>();
list.add(new Fruit("苹果",5));
list.add(new Fruit("火龙果",7));
list.add(new Fruit("雪莲果",4));
return list;
}
}
}
所以要在/WEB-INF/freemarker的目录下创建一个模板:
/WEB-INF/freemarker/fm_fruit.ftl
所以只要
http://localhost:8080/SpringMVC_test/queryList.action 就可以访问到
/WEB-INF/freemarker/fm_fruit.ftl
注意:maven还要配置:
<dependency>
<!--在spring中使用Freemarker这个必不可少,否则报错-->
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.3.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.28</version>
</dependency>
不过最后的编码问题还有数据访问没实现…… 试了下网上方法不行。模板这一块 以后再了解。总结:
使用FreeMarkerViewResolver可以生成Freemarker模板。
哈哈哈 其他的还有很多,我就不多介绍了。一个用来jsp,一个用来模板 我觉得这两个基本已经够满足要求的了。