在springMVC中,使用的视图解析器是InternalResourceViewResolver 类,通过定义前缀和后缀来实现页面的跳转与渲染。 但能否自己自定义视图解析器呢? 1、进入InternalResourceViewResolver 类的源码,通过继承关系可以得知最后是继承至接口ViewResolver 2、我们可以按照源码实现ViewResolver 接口中的方法一般去实现 (1)自定义类实现接口
public class MyViewResolver implements ViewResolver{
public View resolveViewName(String viewName, Locale locale) throws Exception {
return null;
}
}
实现接口中的方法可以知道这里返回的是View对象,而这个通过查看源码我们可以知道也是一个接口,所以这里返回值也就需要自己去实现这个接口,用来返回结果
public class MyView implements View {
public String getContentType() {
return null;
}
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
}
}
通过继承的view接口实现方法名称可以看出这里两个方法一个是指定返回类型,一个是用来渲染,最后可以实现这两个接口中的方法,已达到自定义视图解析器的目的 (1)实现接口ViewResolver :MyViewResolver 类
public class MyViewResolver implements ViewResolver{
private int order;
public View resolveViewName(String viewName, Locale locale) throws Exception {
if(viewName.startsWith("msb:")){
System.out.println(viewName);
return new MyView();
}else {
return null;
}
}
public void setOrder(int order) {
this.order = order;
}
public int getOrder() {
return 0;
}
}
(2)实现View 接口:MyView
public class MyView implements View {
public String getContentType() {
return "text/html";
}
public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println(model);
response.setContentType("text/html");
PrintWriter printWriter = response.getWriter();
printWriter.write("<h1>sss</h1>");
}
}
(3)xml配置文件配置扫描到自定义是视图解析器类
<bean class="com.csh.viewResolver.MyViewResolver">
<property name="order" value="1"></property>
</bean>
(4)最后是测试类
@Controller
public class ViewResolverController {
@RequestMapping("/msb")
public String testView(){
System.out.println("msb");
return "msb:/index";
}
}
上面还说到了order,Order 也是一个接口,因为自定义视图解析器我们可以设置自己想要渲染的方式,但是forward、redirect原本使用springmvc的视图解析器这时候就用不了,所以肯定会有一种方式让两种都可以使用,也就是Order 接口了 通过继承Order 接口后设置参数的值,这里的Order接口设置了访问的优先级别,让两种视图解析器都可以实现。
|