Springmvc知识二------数据模型的处理&视图&视图解析器

数据模型处理

Springmvc对于数据模型的处理提供了以下四种方式输出数据模型:
ModelAndView:处理方法返回值类型为ModelAndView时,方法即可通过该对象添加模型数据。
Map和Model:将Map作为方法的参数传递到方法体中,springmvc会自动将这个参数放入到Request域对象中。
@SessionAttribute:将模型中的某个属性暂时存放到HttpSession中,以便多个请求之间可以共享这个属性。
@ModelAttribute:方法入参标注该注解后,入参的对象就会放到数据模型中。

ModelAndView

控制器处理方法的返回值如果为ModelAndView,其中既包含视图信息,也包含模型数据信息
springmvc 会把ModelAndView 的model中的数据放到request域对象中。
添加模型数据方法:【addObject】【addAllObjects】
设置视图方法:【setView】【setViewName】

<b>前台链接</b><br>
<a href="RequestMappingTest/TestModelAndView">TestModelAndView</a><br>



<!--后台处理 -->
@RequestMapping(value="/TestModelAndView")
    public ModelAndView TestModelAndView(){
        ModelAndView model = new ModelAndView("modelandview");
        // 利用此构造方法,直接传入物理视图名称
        model.addObject("date", new Date());
        return model;
    }


<b>跳转显示</b><br>
model======> ${date}

Map和Model

Springmvc在内部使用了一个org.springframework.ui.Model的接口进行存储模型数据。
Springmvc在调用方法之前会创建一个隐含的模型对象作为模型数据的存储容器,如果方法中的入参有Map或者Model类型,那么Springmvc就会将隐含的引用传递给这些入参,在方法体内,我们可以通过这些入参对象访问到模型中的所有数据,也可以向模型中添加新的属性数据。

<b>前台链接</b><br>
    <a href="RequestMappingTest/TestMap">TestMap</a><br>


<!-- 后台处理-->
@RequestMapping(value="/TestMap")
    public String TestMap(Map<String,Object> map){
        map.put("name","tom");

        User user = new User("tom", "134", 15, "ff@163.com");
        Address address = new Address("henan", "luoyang");
        user.setAddress(address);

        map.put("name","tom");
        map.put("user", user);
        return SUCCESS;
    }

<b>跳转显示</b><br>
map======> ${requestScope.name}
map======> ${requestScope.user.userName}
map======> ${requestScope.user.address}// User类中包含Address类
map======> ${requestScope.user.address.addressCity} 


//注意  User类中
    private String userName;
    private String userPassworld;
    private int userAge;
    private String userEmail;
    private Address address = new Address();  // 注意

注意: Springmvc对于级联属性的获值:我们需要在POJO类中声明属于关系时,应该先实例化此关联对象。否则我们在前台进行调用时返回的为null。

SessionAttributes

对于注解@SessionAttributes,是处理多个请求之间共用某个模型数据,@SessionAttributes只作用在类上面 ,不能使用在方法上面,Springmvc将模型中对应的属性暂时存放到HttpSession中。他有两个属性value属性表示存放 map的键值types 属性表示存放类,通过这两个属性,我们可以将我们的模型属性数据存放到会话中。

// 类 注解
@SessionAttributes(value={"user00","user01"},types={String.class,Address.class})

// 后台处理

    @RequestMapping(value="TestSessionAttributes")
    public String testSessionAttributes(Map<String, Object> map){
        User user = new User("tom", "134", 15, "ff@163.com");
        User usersession = new User("tom12", "134", 15, "ff@163.com");
        Address address = new Address("henan", "luoyang");

        map.put("age",12); // request域
        map.put("name","tom");//session 域
        map.put("user", user); // request域
        map.put("user00",usersession);// session 域 
        map.put("address", address); // session 域
        return SUCCESS;
    }

<b>跳转显示</b>
    requestScope--age======>${requestScope.age}<br>
    sessionScope--age======>${sessionScope.age}<br>

    requestScope--name======>${requestScope.name}<br>
    sessionScope--name======>${sessionScope.name}<br>

    requestScope--user======>${requestScope.user}<br>
    sessionScope--user======>${sessionScope.user}<br>
    requestScope--user00======>${requestScope.user00}<br>
    sessionScope--user00======>${sessionScope.user00}<br>

    requestScope--address======>${requestScope.address}<br>
    sessionScope--address======>${sessionScope.address}<br>

注意:value属性和types 属性可以一起使用。

视图

在我们的请求处理方法执行完成后,最后返回的 是一个ModelAndView对象,而对于那些返回String、View等类型的处理方法,Springmvc 也会在内部将他们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。Springmvc借助视图解析器(ViewResolver)得到最终的视图对象(View),最终以不同的视图形式进行显示,可以是JSP,也可以是Excel,或者是JFreeChart等各种视图。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。所以最终采用何种视图对象对数据模型进行渲染,处理器并不关心,处理器的工作重点是在生产模型数据的工作上。

视图的作用就是渲染数据模型,将模型里的数据以某种形式呈现给客户。Spring在org.springframework.web.servlet包中定义了一个抽象的View接口。视图对象由视图解析器负责实例化,而且由于视图是无状态的,所以他们不会有线程安全的问题。

常用的视图实现类
这里写图片描述

视图解析器

Springmvc为逻辑视图名的解析提供了不同的策略,可以在Spring WEB 上下文中配置一种或者多种视图解析器,并指定他们的先后顺序。每一种映射策略对应一个具体的视图解析器实现类。视图解析器的作用就是将逻辑视图解析为一个具体的视图对象就好比视图都要实现View接口一样,所有的视图解析器也都必须实现ViewResolver接口。
这里写图片描述

常用的视图解析器实现类
这里写图片描述

我们可以使用一种或者多种视图解析器进行混合使用
每一个视图解析器都实现了Ordered接口并存在一个order属性,可以通过order属性值指定解析器的优先顺序,order值越小表示优先级越高,Springmvc会按照视图解析器的优先顺序对逻辑视图名进行解析,直到遇到解析成功并返回视图对象,否则会抛出ServletException异常。

实例自定义视图

<b>前台链接</b><br>
    <a href="RequestMappingTest/TestViews">TestViews</a><br>

<!-- 后台处理 -->
    @RequestMapping("TestViews")
    public String testviews(){
        System.out.println("TestViews");
        // 返回值与自定义的视图的类的名称一致 
        return "helloView";
    }

<!--自定义视图类 -->
@Component
public class HelloView implements View {
    // 返回内容类型
    public String getContentType() {
        return "text/html";
    }
    public void render(Map<String, ?> arg0, HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        response.getWriter().print("hello view ,time: "+new Date() );
    }
}

<!--Springmvc.xml新增视图解析器 -->

    <!-- 配置视图解析器 :使用视图的名字,解析视图  将自定义的放在前面,在解析不出来的时候,再进行通用的匹配,通过属性配置order。order值越小,优先级越高  -->
    <bean id="beanNameViewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver">
        <property name="order" value="100"></property>
    </bean>

注意:
1、如果我们在项目中使用了JSTL,则Springmvc会自动把视图由默认的InternalResourceView转为JSTLView。
2、如果我们在项目中使用了JSTL的fmt 标签,我们还需要在Springmvc的配置文件中配置国际化资源文件。

<b>前台链接</b><br>
<a href="springmvc/testi18n">Testi18n</a>


<!--后台处理 -->
    @RequestMapping("/testi18n")
    public String  testi18n(){
        System.out.println("测试i18n");
        return SUCCESS;
    }

<!--跳转显示 -->

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<fmt:message key="i18n.username"></fmt:message><br>
<fmt:message key="i18n.password"></fmt:message><br>

<!--Springmvc.xml国际化资源配置-->

<!--  配置国际化资源i18n messageSource 必须小写 --> 
    <bean id="messageSource" class="org.springframework.context.support.ResourceBundleMessageSource">
        <property name="basename" value="i18n"></property>
    </bean>

<!-- i18n.properties内容 -->
i18n.username=user
i18n.password=password

另外我们也需要在classpath下新增国际化资源文件【i18n.properties】【i18n_zh_CN.properties】【i18n_en_US.properties】

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值