SpringMVC深入三

来源:互联网 发布:东宫番外清风知我意 编辑:程序博客网 时间:2024/06/02 05:30

SpringMVC深入三

视图及视图解析器

请求处理方法执行完成后,最终返回一个ModelAndView对象。对于那些返回String、View或ModelMap等类型的处理方法,SpringMVC也会在内部将它们装配成一个ModelAndView对象,它包含了逻辑名和模型对象的视图。

SpringMVC借助视图解析器(ViewResolver)得到最终的视图对象(View),最终的视图可以是JSP,也可能是Excel、JFreeChart等各种表现形式的视图。

对于最终究竟采取何种视图对象对模型数据进行渲染,处理器并不关心,处理器工作重点聚焦在生产模型数据的工作上,从而实现MVC的充分解耦。

视图对象由视图解析器负责实例化,由于视图是无状态的,所以它们不会有线程安全的问题。

JSP是最常见的视图技术,可以使用InternalResourceViewResolver作为视图解析器:

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">    <property name="prefix" value="/WEB-INF/views/"></property>    <property name="suffix" value=".jsp"></property></bean>

JstlView

若项目中使用了JSTL,SpringMVC会自动把视图由InternalResourceViewResolver转为JstlView

若使用JSTL的fmt标签,则需要在SpringMVC的配置文件中配置国际化资源文件。

例如:
国际化资源文件为i18n.properties,对应创建i18n_zh_CN.propertiesi18n_en_US.properties

i18n.username=Usernamei18n.password=Password

在SpringMVC的配置文件配置国际化文件:

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

在JSP页面中导入fmt标签,并使用

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"  %>

使用方式如下:

<fmt:message key="i18n.username"></fmt:message><fmt:message key="i18n.password"></fmt:message>

mvc:view-controller

mvc:view-controller标签配置直接转发的页面,在事件使用时配合mvc:annotation-driven一起使用

如下配置:

<!--  配置直接转发的页面--><mvc:view-controller path="/success" view-name="success"/><mvc:annotation-driven></mvc:annotation-driven>

http://localhost:8080/springmvc-1/success直接访问success.jsp页面

自定义视图

定义一个自定义视图:

package com.springmvc.views;import java.util.Date;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;@Componentpublic class HelloView implements View {    @Override    public String getContentType() {        return "text/html";    }    @Override    public void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception {        response.getWriter().print("hello view, time: "+new Date());    }}

在SpringMVC的配置文件配置视图解析器BeanNameViewResolver,使用视图的名字来解析视图,需要把view放入到IOC容器中,所以view使用了@Component注解。

<!-- 配置视图BeanNameViewResolver解析器 --><!--      使用视图的名字来解析视图,通过order属性来定义视图解析器的优先级    order值越小,优先级越高--><bean class="org.springframework.web.servlet.view.BeanNameViewResolver">    <property name="order" value="100"></property></bean>

通过order属性来定义视图解析器的优先级order值越小,优先级越高。
InternalResourceViewResolver的优先级为Integer.MAX_VALUE

定义handler方法如下:

@RequestMapping("/testView")public String testView(){    System.out.println("testView");    return "helloView";}

重定向

如果返回的字符串中包含forward:redirect:前缀,SpringMVC会对他们进行特殊处理:将forward:redirect:当初指示符,其后的字符串作为URL来处理:

  • redirect:success.jsp : 会完成一个到success.jsp的重定向的操作
  • forward:success.jsp : 会完成一个到success.jsp的转发操作

处理静态资源

优雅的REST风格的资源URL不希望带.html或.do等后缀。
若将DispatchServlet请求映射为/。则SpringMVC将捕获WEB容器的所有请求,包括静态资源的请求,SpringMVC会将它们当成一个普通请求处理,因而会找不到对应处理器,导致错误。

在SpringMVC的配置文件中配置<mvc:default-servlet-handler/>即可结解决。需配合<mvc:annotation-driven></mvc:annotation-driven>使用

<mvc:default-servlet-handler/><mvc:annotation-driven></mvc:annotation-driven>

<mvc:default-servlet-handler/>将SpringMVC上下文中定义一二DefaultServletHttpRequestHandler,它会对进入DispatchServlet的请求进行筛选,如果发现是没有经过映射的请求,就将该请求交由WEB应用服务器默认的Servlet处理,如果不是静态资源的请求,才有DispatchServlet继续处理。

一般WEB应用服务器默认的Servlet的名称都是default,若所使用的WEB服务器的默认Servlet名称不是default,则需要通过default-servlet-name属性显示指定。

数据绑定

数据绑定流程
1.SpringMVC主框架将ServletRequest对象及目标方法的入参实例传递给WebDataBinderFactory实例,以创建DataBinder实例对象。
2.DataBinder调用装配在SpringMVC上下文中的ConvsersionService组件进行数据类型转换、数据格式化工作。将Servlet中的请求信息填充到入参对象中。
3.调用Validator组件对已经绑定了请求消息的入参对象进行数据合法性校验,并最终生成数据绑定结果BindingData对象。
4.SpringMVC抽取BindingResult中的入参对象和校验错误对象,将它们赋给处理方法的响应入参。

数据转换

SpringMVC上下文内置了很多转换器,可以完成大多数Java类型的转换工作。

自定义类型转换器

ConversionService是Spring类型转换体系的核心接口。
可以利用ConversionServiceFactoryBean在Spring的IOC容器中定义ConversionService。Spring将自动识别出IOC容器中的
ConversionService,并在Bean属性配置及SpringMVC处理方法入参绑定等场合使用它进行数据的转换。

可通过ConversionServiceFactoryBeanconverters属性注册自定义的类型转换器。

Spring支持的转换器
SpringMVC定义了3类型的转换器接口,实现任意一个转换器接口都可以作为自定义转换器注册到ConversionServiceFactoryBean中:

  • Converter<S, T> 将S类型转为T类型对象
  • ConverterFactory 将相同系列多个“同质”Converter封装在一起。如果希望将一种类型的对象转为另一种类型及其子类型的对象(例如将String转换为Number及Number子类(Integer、Long、Double等)对象)可以使用该转换器工厂类
  • GenericConverter 会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换

如下的例子,会把string类型转为Employee对象。String类型的格式为lastname-email-gender-department.id

处理表单请求的handler如下:

@Controllerpublic class SpringMVCTest {    @Autowired    private EmployeeDao employeeDao;    @RequestMapping("/testConversionServiceConverter")    public String testConverter(@RequestParam("employee") Employee employee){        System.out.println("testConverter");        employeeDao.save(employee);        return "redirect:/emps";    }}

自定义一个转换器EmployeeConverter,实现Converter接口

@Componentpublic class EmployeeConverter implements Converter<String, Employee> {    @Override    public Employee convert(String source) {        if (source != null) {            String[] vals = source.split("-");            if (vals != null && vals.length == 4) {                String lastName = vals[0];                String email = vals[1];                String gender = vals[2];                Department department = new Department();                department.setId(Integer.parseInt(vals[3]));                Employee employee = new Employee(null, lastName, email, gender, department);                System.out.println(source+"--convert--:"+employee);                return employee;            }        }        return null;    }}

在SpringMVC的配置文件中配置:

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven><!-- 配置ConversionService --><bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">    <property name="converters">        <set>            <ref bean="employeeConverter"/>        </set>    </property></bean>

mvc:annotation-driven

<mvc:annotation-driven/>会自动注册RequestMappingHandlerMapping、RequestMappingHandlerAdapter与ExceptionHandlerExceptionResolver(异常解析器)三个bean。

还提供以下支持:

  • 支持使用ConversionService实例对表单参数进行类型转换
  • 支持使用@NumberFormatannotation@DateTimeFormat注解完成数据类型的格式化
  • 支持使用@Valid注解对JavaBean实例进行JSR 303验证
  • 支持使用@RequsetBody@ResponseBody注解

@InitBinder

由@InitBinder标识的方法,可以对WebDataBinder对象进行初始化。WebDataBinder是DataBinder的子类,用于完成由表单字段到JavaBean属性的绑定。

@InitBinder方法不能有返回值,它必须声明为void。
@InitBinder方法的参数通常是WebDataBinder

数据格式化

步骤:

1.配置<mvc:annotation-driven></mvc:annotation-driven>
2.在目标属性上加上注解即可:

@DateTimeFormat(pattern="yyyy-MM-dd")private Date birth;

@NumberFormat(pattern="#,###,###.#")可以对数值进行格式化

在数据转换环节使用了自定义的转换器,也使用了<mvc:annotation-driven></mvc:annotation-driven>,如何才能既可以使用自定义的转换器,也可以使用SpringMVC提供的数据格式化注解?

使用org.springframework.format.support.FormattingConversionServiceFactoryBean

<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven><!-- 配置ConversionService --><bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">    <property name="converters">        <set>            <ref bean="employeeConverter"/>        </set>    </property></bean>

数据校验

JSR303是Java为Bean数据合法性校验提供的标准框架,它已经包含在Java6.0中。
JSR303通过在Bean的属性上标注类似于@NotNull@Max等标准的注解指定校验规则,并通过标准的验证接口对Bean进行验证。

Hibernate Validator是JSR 303的一个参考实现,除了支持所有标准的校验注解外,它还支持以下扩展注解

@Email 被注解的元素必须是电子邮箱地址@Length 被注解的字符串的大小必须在指定的范围内@NotEmpty 被注释的字符串必须非空@Range 被注释的元素必须在合适的范围内

1.如何校验?

a.使用JSR303验证标准
b.加入hibernate validator验证框架的jar包
c.在SpringMVC配置文件添加<mvc:annotation-driven/>
d.需要在bean的属性上添加对应的注解
e.在目标方法bean的属性上添加@Valid注解

2.验证出错,转向到哪一个页面?
3.错误消息,如何显示,如何把错误消息国际化?

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 2个月婴儿便秘怎么办 四个月宝宝拉稀带有泡沫怎么办 六个月宝宝拉肚子怎么办拉水 婴儿拉的是沫怎么办 婴儿拉泡沫屎是怎么办 宝宝吃奶粉上火大便干燥怎么办 没满月的宝宝拉肚子怎么办 婴儿吃奶粉上火不大便怎么办 四个月宝宝拉沫怎么办 4个月小孩拉肚子怎么办 3个月的宝宝拉稀怎么办 宝宝没喝过奶粉怎么办 宝宝喝冰酸奶咳嗽了怎么办 7个月不爱喝奶怎么办 宝宝不认妈妈该怎么办 九个月宝宝不喝牛奶怎么办 吃羊肉和西瓜后怎么办 娃儿感冒了很咳怎么办 5岁娃儿经常感冒发烧怎么办 娃儿冷得发抖感冒怎么办 吃羊肉和茶后怎么办 宝宝胆汁酸高22怎么办 5个月发烧38度怎么办 28个月宝宝不愿把尿怎么办 16个月宝宝咳嗽怎么办 宝宝晚上不用纸尿裤要尿床怎么办 宝宝头型睡偏了怎么办 初生婴儿鼻子被奶块堵住怎么办 月经排的不顺畅怎么办 四个月的小孩拉肚子怎么办 月经期做了水光怎么办 4个多月的宝宝拉肚子怎么办 2个月婴儿积食怎么办 3个月婴儿积食怎么办 2个月的婴儿干呕怎么办 脚上的皮烂了怎么办 嘴皮里面烂了怎么办 未满月婴儿拉屎很费劲怎么办 新生儿血钙1.7怎么办啊 3个月宝宝胃口小怎么办 3个月宝宝缺钙怎么办