`
橙臣1314
  • 浏览: 6329 次
社区版块
存档分类
最新评论

Spring多视图返回处理

阅读更多
鉴于ajax对于前端的重要性,我们经常需要对网页的小部分内容进行刷新处理,此时返回jsp视图已经并不合适,json视图的重要性被凸显出来,但同时网页之前的重定向处理可以一定程度地控制用户网站操作的流程,所以我们并不希望直接砍掉jsp视图处理器,以及我们不希望通过复制代码的方式或是太多判断选择分支在代码中泛滥,spring在3.1中提供的多视图同时处理可以解决以上问题。

请求某一种视图,一个可以通过Header中的Accept进行设置,但是在网络请求中我们并没有太多地关注header并修改,反而是地址的使用和修改更频繁,于是有了使用extension进行区分请求视图的方法。
<bean id="contentNegotiatingResolver" class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
        <property name="order" value="1" />
        <property name="ignoreAcceptHeader" value="true" />
        <property name="favorParameter" value="false" />
      <property name="contentNegotiationManager">
            <bean class="org.springframework.web.accept.ContentNegotiationManager">
                <constructor-arg>
                    <bean class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
                        <constructor-arg>
                            <map>
                                <entry key="html" value="text/html"/>
                                  <entry key="pdf" value="application/pdf"/>
                                  <entry key="xsl" value="application/vnd.ms-excel"/>
                                  <entry key="xml" value="application/xml"/>
                                  <entry key="json" value="application/json"/>
                            </map>
                        </constructor-arg>
                    </bean>
                </constructor-arg>
            </bean>
        </property>
      <property name="defaultViews">
         <list>
             <bean class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
            <bean class="org.springframework.web.servlet.view.xml.MarshallingView">      
               <constructor-arg>
                  <bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
                     <property name="classesToBeBound">
                        <list>
                        </list>
                     </property>
                  </bean>
               </constructor-arg>
            </bean>
            <bean class="com.xuyuan.spring3.recipes.mvc.web.views.ExcelReservationSummary"/>
            <bean class="com.xuyuan.spring3.recipes.mvc.web.views.PdfReservationSummary"/>  
         </list>
      </property>
</bean>
<bean id="internalResourceResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
       <!-- <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>  -->
        <property name="prefix" value="/springmvc/" />
        <property name="suffix" value=".jsp" />
        <property name="order" value="5" />
    </bean>


以上部分我们自定义了exl和pdf的输出视图,但是这个视图是针对某些特定class对象的,无法写入其它的复杂对象,当然我们可以控制反转,定义流程、流出接口,然后有意向写入excel/pdf视图的对象实现该接口即可。


@RequestMapping("/members/list")
    public String getRestMembersList(Model model) {
        Member member = new Member();
        member.setName("John Doe members");
        member.setPhone("1-800-800-800");
        member.setEmail("john@doe.com");
        Member member2 = new Member();
        member.setName("Jenry Doe members");
        member.setPhone("1-800-823-856");
        member.setEmail("jenry@doe.com");
       
        List<Member> members = new ArrayList<Member>();
        members.add(member2);
        members.add(member);
        model.addAttribute("member2", member2);
        model.addAttribute("member1", member);
        model.addAttribute("member", members);
        return "memberlist";
}
 
@InitBinder
    public void initBinder(WebDataBinder binder) {
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, false));
    }



结论:此处不必写注解@ResponseBody,同时我们也一般不会在网络请求处理方法中直接完成一个ResponseBody,如果使用ModelAndView返回,返回值不方便被转化成一个json或xml,ModelMap的实例是由bboss mvc框架自动创建并作为控制器方法参数传入,用户无需自己创建。ModelAndView需用户手动创建.但是网上博客的以下说法2-3条并不准确:

1.使用 String 作为请求处理方法的返回值类型是比较通用的方法,这样返回的逻辑视图名不会和请求 URL 绑定,具有很大的灵活性,而模型数据又可以通过 ModelMap 控制。
2.使用void,map,Model 时,返回对应的逻辑视图名称真实url为:prefix前缀+视图名称 +suffix后缀组成。
3.使用String,ModelAndView返回视图名称可以不受请求的url绑定,ModelAndView可以设置返回的视图名称。

String是三者中比较合适的返回值,会具体跟随请求的内容及视图处理器的顺序来解析要返回的具体内容,但是ModelAndVew不会

@XmlRootElement
public class Member {
 
@NotNull
@Size(min=2)
private Integer id;
    /**
* @uml.property  name="name"
*/
    @NotNull
    @Size(min=2)
    private String name;
 
    /**
* @uml.property  name="phone"
*/
    @NotNull
    @Size(min = 9, max = 14)
    private String phone;
   
    /**
* @uml.property  name="email"
*/
    @Pattern(regexp=".+@.+\\.[a-z]+")
    private String email;
}

该函数中,我们虽然放置了List到Model中,但是xml视图处理器无法处理,xml视图处理器只会去取key值member的value,然后默认value为一个Member对象,但是我们放置的对象是个list,故报错找不到name值

org.springframework.beans.NotReadablePropertyException: Invalid property 'name' of bean class [java.util.ArrayList]: Bean property 'name' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
at org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:709)

如果非得在xml中显示list等集合对象,要封装一个新类,看以下代码可以看出,该list要有一个name,猜测上方的name并非Member类中的name

@XmlRootElement
public class ReservationList {
 
     /**
      * @uml.property  name="name"
      */
     private String name;
     /**
      * @uml.property  name="list"
      */
     private List<Reservation> list;
    
     public ReservationList(){}
    public ReservationList(String name, List<Reservation> list) {
         this.name = name;
         this.list = list;
     }
 
     @XmlElements({
        @XmlElement(name = "reservations", type = Reservation.class),
    })
    public List<Reservation> getList() {
        return list;
    }
 
    public void setList(List<Reservation> list) {
        this.list = list;
    }
 
     /**
      * @return
      * @uml.property  name="name"
      */
     public String getName() {
          return name;
     }
 
     /**
      * @param name
      * @uml.property  name="name"
      */
     public void setName(String name) {
          this.name = name;
     }
}

Member对象虽然被网络传输,但是该对象没有实现Serializable
网络请求映射注解处没有使用@Responsebody,根据调试可知,在处理返回值处,该处注解会让框架设置request的handled为真,后面不会继续寻找视图处理器进行视图处理。
未完等填坑。
分享到:
评论

相关推荐

    spring mvc 思维导图

    Spring的模型-视图-控制器(MVC)框架是...•(6)(7)处理视图映射并返回模型: DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图。 •(8) Http响应:视图负责将结果显示到客户端。

    Spring面试题

    1.spring mvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。 2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller. 3....

    Spring-Reference_zh_CN(Spring中文参考手册)

    处理多个持久化单元 12.6.2. JpaTemplate 和 JpaDaoSupport 12.6.3. 基于原生的JPA实现DAO 12.6.4. 异常转化 12.6.5. 事务管理 12.6.6. JpaDialect III. Web 13. Web框架 13.1. 介绍 13.1.1. 与其他web框架的集成 ...

    java spring mvc

    主控制器调用Controller方法处理请求,(对DB操作可以调用DAO组件),方法执行后返回一个ModelAndView对象结果 d.ModelAndView里包含了响应View和数据信息,主控制器调用ViewResolver视图解析器根据ModelAndView的内容...

    spring MVC架构

    Spring MVC 是一个模型 - 视图 - 控制器(MVC)的Web框架建立在中央前端控制器servlet(DispatcherServlet),它负责发送每个请求到合适的处理程序,使用视图来最终返回响应结果的概念。Spring MVC 是 Spring 产品...

    Spring中文帮助文档

    11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6. 用Java对象来表达JDBC操作 11.6.1. SqlQuery类 11.6.2. MappingSqlQuery类 11.6.3. SqlUpdate类 11.6.4. StoredProcedure类 11.6.5. SqlFunction...

    Spring API

    11.5.9. 使用SimpleJdbcCall返回的ResultSet/REF Cursor 11.6. 用Java对象来表达JDBC操作 11.6.1. SqlQuery类 11.6.2. MappingSqlQuery类 11.6.3. SqlUpdate类 11.6.4. StoredProcedure类 11.6.5. SqlFunction...

    Spring.3.x企业应用开发实战(完整版).part2

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    springmybatis

    而且也比较轻量级,因为当时在项目中,没来的及做很很多笔记。后来项目结束了,我也没写总结文档。已经过去好久了。但最近突然又对这个ORM 工具感兴趣。因为接下来自己的项目中很有可能采用这个ORM工具。所以在此...

    21道Java Spring MVC综合面试题详解含答案(值得珍藏)

    在服务器中请求被Controller接收,Controller调用相应的Model层处理请求,处理完毕后结果返回到Controller。 Controller再根据请求处理的结果找到对应的View视图,渲染数据后最终响应给浏览器。 此外,Spring MVC还...

    Spring MVC 员工管理系统

    ④ 处理器完成业务逻辑的处理后将返回一个ModelAndView给DispatcherServlet,ModelAndView包含了视图逻辑名和渲染视图时需要用到的模型数据对象; ⑤ 由于ModelAndView中包含的是视图逻辑名,DispatcherServlet必须...

    Struts Spring Hibernate面试题汇总

    1. 谈谈你mvc的理解 MVC是Model—View—Controler... MVC的处理过程:首先控制器接受用户的请求,调用相应的模型来进行业务处理,并返回数据给控制器。控制器调用相应的视图来显示处理的结果。并通过视图呈现给用户。

    Spring3.x企业应用开发实战(完整版) part1

    10.4.1 Spring通过单实例化Bean简化多线程问题 10.4.2 启动独立线程调用事务方法 10.5 联合军种作战的混乱 10.5.1 Spring事务管理器的应对 10.5.2 Hibernate+Spring JDBC混合框架的事务管理 10.6 特殊方法成漏网之鱼...

    Spring MVC 学习笔记

    并返回一个ModelAndView对象(包含模型数据、逻辑视图名); 5、 ModelAndView的逻辑视图名交给ViewResolver解析器, ViewResolver解析器把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术...

    【Mybatis、SpringMVC单独配置及测试代码】

    Spring MVC 是一个建立在中央前端控制器servlet(DispatcherServlet)的MVC模式Web框架,它负责发送每个请求到合适的处理程序,使用视图来最终返回响应结果的概念。Spring MVC 是 Spring 产品组合的一部分,它享有 ...

    会员管理系统(struts+hibernate+spring)130226.rar

    它通过Action类来处理用户的操作,如注册、登录、修改个人信息等,并将处理结果返回给相应的视图层。Hibernate框架则作为数据持久化层,负责与数据库进行交互。它通过对象关系映射(ORM)技术,将Java对象与数据库表...

    SSM框架——(SpringMVC+Spring+MyBatis+Maven多模块)整合

    由DispacherServlet控制器查询HanderMapping,找到处理请求的Controller3.Controller调用业务逻辑处理后,返回ModelAndView4.DispacherSerclet查询视图解析器,找到ModelAndView指定的视图5.视图负责将结果显示到...

    简单的SSM.txt

    Springmvc就是spring框架的一个...4. Controller调用业务逻辑处理后,返回ModelAndView 5. DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图 6. 视图负责将结果显示到客户端

    struts2.4+spring3.1+hibernate4.1的SSH框架

    而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。  采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样...

Global site tag (gtag.js) - Google Analytics