10、自定义视图

背景:在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视图解析器一般都是最后执行的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值