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

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为真,后面不会继续寻找视图处理器进行视图处理。
未完等填坑。
分享到:
评论

相关推荐

    springjpa 和 spring多视图配置实例

    本实例探讨的是如何在Spring环境中整合Spring MVC、Spring Data JPA以及使用Freemarker或JSON作为多视图配置。让我们深入理解这些技术及其相互作用。 首先,Spring MVC是Spring框架的一部分,专门用于构建Web应用...

    Spring MVC--5.视图和视图解析器

    视图解析器的职责在于将控制器处理完请求后返回的逻辑视图名映射到实际的视图资源路径。Spring MVC提供了多种内置的视图解析器,如InternalResourceViewResolver和BeanNameViewResolver等。以最常见的...

    spring2 集成视图

    在这个例子中,Controller处理`/hello`请求,并返回一个名为`hello`的视图,该视图可以在`/WEB-INF/views/hello.jsp`找到。 除了JSP,Spring还支持其他视图技术,如FreeMarker和Thymeleaf。配置FreeMarker需要添加`...

    SpringMVC自定义多视图

    在处理多视图时,我们可以基于请求的参数、请求头或者URL路径来决定返回哪种视图。例如,如果请求包含一个`Accept`头,我们可以检查其值来确定是否应返回JSON或HTML。如果URL路径以`.json`结尾,我们可以返回JSON...

    Spring MVC中InternalResourceViewResolver视图解析器的默认行为.docx

    在Spring MVC框架中,视图解析器扮演着至关重要的角色,它负责将控制器处理方法返回的逻辑视图名称转换为实际的物理视图资源。`InternalResourceViewResolver`是Spring MVC提供的一种内置的视图解析器,主要用于处理...

    SpringMVC第8讲:多视图支持

    "多视图支持"是SpringMVC的一个重要特性,它允许我们处理并返回各种类型的响应,如HTML、JSON、XML或者其他自定义格式。 首先,SpringMVC通过DispatcherServlet作为请求的调度中心,它可以将请求分发给相应的处理器...

    springmvc 3.1 多视图

    在处理请求时,Spring MVC会根据Controller方法返回的ModelAndView中的视图名,结合视图解析器,确定最终渲染的视图。通过改变返回的视图名或者使用不同的ModelAndView实例,可以实现从JSP到FreeMarker或其他视图...

    Spring例子

    在`ModelAndView`或`Model`对象中添加数据,然后在控制器方法中返回视图名,如`"callNumber"`,Spring MVC会自动寻找对应的视图文件。 配置方面,Spring MVC的应用通常通过`web.xml`(传统方式)或Spring Boot的`...

    springMVC 多视图配置(Jsp Freemarket Json)实例

    在 MultiView_demo 示例中,可能包含了控制器(Controller)类,它们分别处理 JSP、FreeMarker 和 JSON 请求,并返回相应的视图。例如: ```java @Controller public class ViewController { @RequestMapping...

    spring-petsore spring官方最新demo

    总的来说,Spring PetClinic是一个综合性的学习资源,涵盖了Spring框架的多个关键组件,包括Spring MVC、Spring Data、Spring Boot,以及数据库连接、RESTful API设计和错误处理等。通过深入研究这个示例项目,...

    Spring Boot 系列教程6-全局异常处理

    如果你的应用需要支持多语言,可以在异常处理器中结合Spring的`MessageSource`来提供本地化的错误信息。 8. **错误码与错误信息** 定义一套错误码体系,将每个异常对应一个错误码,可以提高异常处理的规范性和可...

    基于Spring MVC接收并处理HTTP请求

    Spring MVC是一个模型-视图-控制器(MVC)架构的实现,它通过DispatcherServlet作为前端控制器,处理所有的HTTP请求。当请求到达时,DispatcherServlet会根据请求信息(如URL、请求方法等)选择合适的...

    spring-web-5.2.3.RELEASE和spring-webmvc-5.2.3.RELEASE

    然后,处理器可以通过ModelAndView对象返回视图和模型数据。 在5.2.3.RELEASE版本中,Spring框架引入了一些新的特性和改进。例如,性能优化、错误处理的增强、对Java 13的支持以及更好的反应式编程支持。这个版本...

    spring-web和spring-webmvc_4.2.4

    4. **ModelAndView**:这是一个结果容器,包含处理方法返回的模型数据和视图信息,用于将数据传递到视图进行渲染。 5. **ViewResolver**:视图解析器根据`ModelAndView`中的视图名找到实际的视图对象,如JSP、...

    spring 与 servlet整合

    4. 编写Controller,处理请求并返回ModelAndView或直接重定向/转发到视图。 5. 配置视图解析器,如InternalResourceViewResolver,指定视图路径。 **最佳实践** 1. 使用注解配置减少XML配置。 2. 采用ModelAndView...

    Spring_springmvc详细总结

    为了实现页面布局,Spring MVC可以与Tiles或FreeMarker Layout等框架集成,使得多个视图可以共享公共头部、侧边栏等元素。 11. **Form Handling(表单处理)**: Spring MVC提供强大的表单处理能力,包括数据绑定...

    spring4.0框架demo

    1. MVC架构模式:Spring MVC是Spring框架的一部分,用于处理Web请求,遵循Model-View-Controller的设计模式,实现了业务逻辑与视图的分离。 2. HandlerMapping与HandlerAdapter:这两个组件负责映射HTTP请求到相应...

    SpringTest.zip

    4. ModelAndView:封装了处理结果和视图信息,用于返回给DispatcherServlet。 5. ViewResolver:解析ModelAndView中的视图名,找到对应的视图模板。 6. View:负责渲染视图,如JSP、FreeMarker等。 三、Spring MVC ...

    spring-MVC.zip_Java spring mvc_spring mvc_spring mvc

    7. ** ModelAndView**:这个类是用来存储模型数据和视图信息的,Controller处理完请求后,会返回一个ModelAndView对象,其中包含了要展示的数据和要跳转的视图名称。 8. **视图解析器(ViewResolver)**:它负责根据...

Global site tag (gtag.js) - Google Analytics