有时候我们想自定义一个视图,怎么做呢?
spring mvc怎么知道我们访问的是哪一个视图类?
一、实现方法
(1)新建一个视图类
新建了一个包view,然后新建了一个视图类testview.java,同时需要继承org.springframework.web.servlet.View。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package view; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Component; import org.springframework.web.servlet.View; @Component public class testview implements View { @Override public String getContentType() { // 获取本次请求过程中,页面的编码格式 return "text/html"; } @Override public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception { System.out.println("new view"); response.getWriter().print("new view"); } } |
getContentType()返回的是本次返回的页面编码格式,这里就返回了text/html。
render()渲染了一个视图,这个方法下面就是你自定义的视图,这里继承了servlet的方法,通过HttpServletResponse返回了一个视图的内容。
(2)千万要记住,把你刚才新建的视图类放进spring mvc的ioc容器中
这是时间的教训,浪费了我10分钟。
- 在视图类加上@Component注解,表示需要加入ioc容器中。
- 然后在视图解析器的配置文件配自动扫描:<context:component-scan base-package=”view”></context:component-scan>
把刚才的视图类加进ioc容器中,才能被spring mvc找到,并且映射出来。如果spring mvc找不到这个视图类,那就报404了。
(3)自定义视图需要再配一个视图解析器BeanNameViewResolver,不能用原来的
具体就是这个类:
org.springframework.web.servlet.view.InternalResourceViewResolver
1 2 3 |
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="100"></property> </bean> |
同为视图解析器,需要区分先后,决定我们的链接被解析到哪个视图,所以我们要配优先度。
这里就是<property name=”order” value=”100″></property>配了100。
spring mvc视图解析器默认的优先度是最低的,是integer的最大值,优先度数字越小,优先程度越高。
controller通过@RequestMapping传过来return,会先去找这个BeanNameViewResolver的视图解析器,看看ioc容器里有没有与请求相符的视图类(顾名思义,通过名字来找Bean)。
如果有,就返回相应的视图类,没有,就去默认的视图解析器找视图,如果还没有,就报错404了。
(4)写出controller
1 2 3 4 5 |
@RequestMapping(value = "/testview") public String testview() { System.out.println("testview success"); return "testview"; } |
注意这个return的值要和视图类名字一样哦,而且需要以小写开头。
(5)测试结果
这样就可以找到自定义的这个testview视图了。
二、总结
记录一下。