聊聊Spring中的数据绑定 --- WebDataBinder、ServletRequestDataBinder、WebBindingInitializer...【享学Spring】

每篇一句

不要总问低级的问题,这样的人要么懒,不愿意上网搜索,要么笨,一点独立思考的能力都没有

前言

上篇文章聊了DataBinder,这篇文章继续聊聊实际应用中的数据绑定主菜WebDataBinder

在上文的基础上,我们先来看看DataBinder它的继承树:
在这里插入图片描述
从继承树中可以看到,web环境统一对数据绑定DataBinder进行了增强。

毕竟数据绑定的实际应用场景:不夸张的说99%情况都是web环境~

WebDataBinder

它的作用就是从web request里(**注意:这里指的web请求,并不一定就是ServletRequest请求哟**)把web请求的`parameters`绑定到`JavaBean`上

Controller方法的参数类型可以是基本类型,也可以是封装后的普通Java类型。若这个普通Java类型没有声明任何注解,则意味着它的每一个属性都需要到Request中去查找对应的请求参数。

// @since 1.2
public class WebDataBinder extends DataBinder {

	// 此字段意思是:字段标记  比如name -> _name
	// 这对于HTML复选框和选择选项特别有用。
	public static final String DEFAULT_FIELD_MARKER_PREFIX = "_";
	// !符号是处理默认值的,提供一个默认值代替空值~~~
	public static final String DEFAULT_FIELD_DEFAULT_PREFIX = "!";
	
	@Nullable
	private String fieldMarkerPrefix = DEFAULT_FIELD_MARKER_PREFIX;
	@Nullable
	private String fieldDefaultPrefix = DEFAULT_FIELD_DEFAULT_PREFIX;
	// 默认也会绑定空的文件流~
	private boolean bindEmptyMultipartFiles = true;

	// 完全沿用父类的两个构造~~~
	public WebDataBinder(@Nullable Object target) {
		super(target);
	}
	public WebDataBinder(@Nullable Object target, String objectName) {
		super(target, objectName);
	}

	... //  省略get/set
	// 在父类的基础上,增加了对_和!的处理~~~
	@Override
	protected void doBind(MutablePropertyValues mpvs) {
		checkFieldDefaults(mpvs);
		checkFieldMarkers(mpvs);
		super.doBind(mpvs);
	}

	protected void checkFieldDefaults(MutablePropertyValues mpvs) {
		String fieldDefaultPrefix = getFieldDefaultPrefix();
		if (fieldDefaultPrefix != null) {
			PropertyValue[] pvArray = mpvs.getPropertyValues();
			for (PropertyValue pv : pvArray) {

				// 若你给定的PropertyValue的属性名确实是以!打头的  那就做处理如下:
				// 如果JavaBean的该属性可写 && mpvs不存在去掉!后的同名属性,那就添加进来表示后续可以使用了(毕竟是默认值,没有精确匹配的高的)
				// 然后把带!的给移除掉(因为默认值以已经转正了~~~)
				// 其实这里就是说你可以使用!来给个默认值。比如!name表示若找不到name这个属性的时,就取它的值~~~
				// 也就是说你request里若有穿!name保底,也就不怕出现null值啦~
				if (pv.getName().startsWith(fieldDefaultPrefix)) {
					String field = pv.getName().substring(fieldDefaultPrefix.length());
					if (getPropertyAccessor().isWritableProperty(field) && !mpvs.contains(field)) {
						mpvs.add(field, pv.getValue());
					}
					mpvs.removePropertyValue(pv);
				}
			}
		}
	}

	// 处理_的步骤
	// 若传入的字段以_打头
	// JavaBean的这个属性可写 && mpvs木有去掉_后的属性名字
	// getEmptyValue(field, fieldType)就是根据Type类型给定默认值。
	// 比如Boolean类型默认给false,数组给空数组[],集合给空集合,Map给空map  可以参考此类:CollectionFactory
	// 当然,这一切都是建立在你传的属性值是以_打头的基础上的,Spring才会默认帮你处理这些默认值
	protected void checkFieldMarkers(MutablePropertyValues mpvs) {
		String fieldMarkerPrefix = getFieldMarkerPrefix();
		if (fieldMarkerPrefix != null) {
			PropertyValue[] pvArray = mpvs.getPropertyValues();
			for (PropertyValue pv : pvArray) {
				if (pv.getName().startsWith(fieldMarkerPrefix)) {
					String field = pv.getName().substring(fieldMarkerPrefix.length());
					if (getPropertyAccessor().isWritableProperty(field) && !mpvs.contains(field)) {
						Class<?> fieldType = getPropertyAccessor().getPropertyType(field);
						mpvs.add(field, getEmptyValue(field, fieldType));
					}
					mpvs.removePropertyValue(pv);
				}
			}
		}
	}

	// @since 5.0
	@Nullable
	public Object getEmptyValue(Class<?> fieldType) {
		try {
			if (boolean.class == fieldType || Boolean.class == fieldType) {
				// Special handling of boolean property.
				return Boolean.FALSE;
			} else if (fieldType.isArray()) {
				// Special handling of array property.
				return Array.newInstance(fieldType.getComponentType(), 0);
			} else if (Collection.class.isAssignableFrom(fieldType)) {
				return CollectionFactory.createCollection(fieldType, 0);
			} else if (Map.class.isAssignableFrom(fieldType)) {
				return CollectionFactory.createMap(fieldType, 0);
			}
		} catch (IllegalArgumentException ex) {
			if (logger.isDebugEnabled()) {
				logger.debug("Failed to create default value - falling back to null: " + ex.getMessage());
			}
		}
		// 若不在这几大类型内,就返回默认值null呗~~~
		// 但需要说明的是,若你是简单类型比如int,
		// Default value: null. 
		return null;
	}

	// 单独提供的方法,用于绑定org.springframework.web.multipart.MultipartFile类型的数据到JavaBean属性上~
	// 显然默认是允许MultipartFile作为Bean一个属性  参与绑定的
	// Map<String, List<MultipartFile>>它的key,一般来说就是文件们啦~
	protected void bindMultipart(Map<String, List<MultipartFile>> multipartFiles, MutablePropertyValues mpvs) {
		multipartFiles.forEach((key, values) -> {
			if (values.size() == 1) {
				MultipartFile value = values.get(0);
				if (isBindEmptyMultipartFiles() || !value.isEmpty()) {
					mpvs.add(key, value);
				}
			}
			else {
				mpvs.add(key, values);
			}
		});
	}
}

单从WebDataBinder来说,它对父类进行了增强,提供的增强能力如下:

  1. 支持对属性名以_打头的默认值处理(自动挡,能够自动处理所有的Bool、Collection、Map等)
  2. 支持对属性名以!打头的默认值处理(手动档,需要手动给某个属性赋默认值,自己控制的灵活性很高)
  3. 提供方法,支持把MultipartFile绑定到JavaBean的属性上~
Demo示例

下面以一个示例来演示使用它增强的这些功能:

@Getter
@Setter
@ToString
public class Person {

    public String name;
    public Integer age;

    // 基本数据类型
    public Boolean flag;
    public int index;
    public List<String> list;
    public Map<String, String> map;

}

演示使用!手动精确控制字段的默认值:

    public static void main(String[] args) {
        Person person = new Person();
        WebDataBinder binder = new WebDataBinder(person, "person");

        // 设置属性(此处演示一下默认值)
        MutablePropertyValues pvs = new MutablePropertyValues();

        // 使用!来模拟各个字段手动指定默认值
        //pvs.add("name", "fsx");
        pvs.add("!name", "不知火舞");
        pvs.add("age", 18);
        pvs.add("!age", 10); // 上面有确切的值了,默认值不会再生效

        binder.bind(pvs);
        System.out.println(person);
    }

打印输出(符合预期):

Person(name=null, age=null, flag=false, index=0, list=[], map={})

请用此打印结果对比一下上面的结果,你是会有很多发现,比如能够发现基本类型的默认值就是它自己
另一个很显然的道理:若你啥都不做特殊处理,包装类型默认值那铁定都是null了~

了解了WebDataBinder后,继续看看它的一个重要子类ServletRequestDataBinder

ServletRequestDataBinder

前面说了这么多,亲有没有发现还木有聊到过我们最为常见的Web场景API:javax.servlet.ServletRequest。本类从命名上就知道,它就是为此而生。

它的目标就是:data binding from servlet request parameters to JavaBeans, including support for multipart files.从Servlet Request里把参数绑定到JavaBean里,支持multipart。

备注:到此类为止就已经把web请求限定为了Servlet Request,和Servlet规范强绑定了。

public class ServletRequestDataBinder extends WebDataBinder {
	... // 沿用父类构造
	// 注意这个可不是父类的方法,是本类增强的~~~~意思就是kv都从request里来~~当然内部还是适配成了一个MutablePropertyValues
	public void bind(ServletRequest request) {
		// 内部最核心方法是它:WebUtils.getParametersStartingWith()  把request参数转换成一个Map
		// request.getParameterNames()
		MutablePropertyValues mpvs = new ServletRequestParameterPropertyValues(request);
		MultipartRequest multipartRequest = WebUtils.getNativeRequest(request, MultipartRequest.class);
	
		// 调用父类的bindMultipart方法,把MultipartFile都放进MutablePropertyValues里去~~~
		if (multipartRequest != null) {
			bindMultipart(multipartRequest.getMultiFileMap(), mpvs);
		}
		// 这个方法是本类流出来的一个扩展点~~~子类可以复写此方法自己往里继续添加
		// 比如ExtendedServletRequestDataBinder它就复写了这个方法,进行了增强(下面会说)  支持到了uriTemplateVariables的绑定
		addBindValues(mpvs, request);
		doBind(mpvs);
	}

	// 这个方法和父类的close方法类似,很少直接调用
	public void closeNoCatch() throws ServletRequestBindingException {
		if (getBindingResult().hasErrors()) {
			throw new ServletRequestBindingException("Errors binding onto object '" + getBindingResult().getObjectName() + "'", new BindException(getBindingResult()));
		}
	}
}

下面就以MockHttpServletRequest为例作为Web 请求实体,演示一个使用的小Demo。说明:MockHttpServletRequest它是HttpServletRequest的实现类~

Demo示例
    public static void main(String[] args) {
        Person person = new Person();
        ServletRequestDataBinder binder = new ServletRequestDataBinder(person, "person");

        // 构造参数,此处就不用MutablePropertyValues,以HttpServletRequest的实现类MockHttpServletRequest为例吧
        MockHttpServletRequest request = new MockHttpServletRequest();
        // 模拟请求参数
        request.addParameter("name", "fsx");
        request.addParameter("age", "18");

        // flag不仅仅可以用true/false  用0和1也是可以的?
        request.addParameter("flag", "1");

        // 设置多值的
        request.addParameter("list", "4", "2", "3", "1");
        // 给map赋值(Json串)
        // request.addParameter("map", "{'key1':'value1','key2':'value2'}"); // 这样可不行
        request.addParameter("map['key1']", "value1");
        request.addParameter("map['key2']", "value2");

         一次性设置多个值(传入Map)
        //request.setParameters(new HashMap<String, Object>() {{
        //    put("name", "fsx");
        //    put("age", "18");
        //}});

        binder.bind(request);
        System.out.println(person);
    }

打印输出:

Person(name=fsx, age=18, flag=true, index=0, list=[4, 2, 3, 1], map={key1=value1, key2=value2})

完美。

思考题:小伙伴可以思考为何给Map属性传值是如上,而不是value写个json就行呢?

ExtendedServletRequestDataBinder

此类代码不多但也不容小觑,它是对ServletRequestDataBinder的一个增强,它用于把URI template variables参数添加进来用于绑定。它会去从request的HandlerMapping.class.getName() + ".uriTemplateVariables";这个属性里查找到值出来用于绑定~~~

比如我们熟悉的@PathVariable它就和这相关:它负责把参数从url模版中解析出来,然后放在attr上,最后交给ExtendedServletRequestDataBinder进行绑定~~~

介于此:我觉得它还有一个作用,就是定制我们全局属性变量用于绑定~

向此属性放置值的地方是:AbstractUrlHandlerMapping.lookupHandler() --> chain.addInterceptor(new UriTemplateVariablesHandlerInterceptor(uriTemplateVariables)); --> preHandle()方法 -> exposeUriTemplateVariables(this.uriTemplateVariables, request); -> request.setAttribute(URI_TEMPLATE_VARIABLES_ATTRIBUTE, uriTemplateVariables);

// @since 3.1
public class ExtendedServletRequestDataBinder extends ServletRequestDataBinder {
	... // 沿用父类构造

	//本类的唯一方法
	@Override
	@SuppressWarnings("unchecked")
	protected void addBindValues(MutablePropertyValues mpvs, ServletRequest request) {
		// 它的值是:HandlerMapping.class.getName() + ".uriTemplateVariables";
		String attr = HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE;

		// 注意:此处是attr,而不是parameter
		Map<String, String> uriVars = (Map<String, String>) request.getAttribute(attr);
		if (uriVars != null) {
			uriVars.forEach((name, value) -> {
				
				// 若已经存在确切的key了,不会覆盖~~~~
				if (mpvs.contains(name)) {
					if (logger.isWarnEnabled()) {
						logger.warn("Skipping URI variable '" + name + "' because request contains bind value with same name.");
					}
				} else {
					mpvs.addPropertyValue(name, value);
				}
			});
		}
	}
}

可见,通过它我们亦可以很方便的做到在每个ServletRequest提供一份共用的模版属性们,供以绑定~

此类基本都沿用父类的功能,比较简单,此处就不写Demo了(Demo请参照父类)~

说明:ServletRequestDataBinder一般不会直接使用,而是使用更强的子类ExtendedServletRequestDataBinder

WebExchangeDataBinder

它是Spring5.0后提供的,对Reactive编程的Mono数据绑定提供支持,因此暂略~

data binding from URL query params or form data in the request data to Java objects

MapDataBinder

它位于org.springframework.data.web是和Spring-Data相关,专门用于处理targetMap<String, Object>类型的目标对象的绑定,它并非一个public类~

它用的属性访问器是MapPropertyAccessor:一个继承自AbstractPropertyAccessor的私有静态内部类~(也支持到了SpEL哦)

WebRequestDataBinder

它是用于处理Spring自己定义的org.springframework.web.context.request.WebRequest的,旨在处理和容器无关的web请求数据绑定,有机会详述到这块的时候,再详细说~


如何注册自己的PropertyEditor来实现自定义类型数据绑定?

通过前面的分析我们知道了,数据绑定这一块最终会依托于PropertyEditor来实现具体属性值的转换(毕竟request传进来的都是字符串嘛~)

一般来说,像String, int, long会自动绑定到参数都是能够自动完成绑定的,因为前面有说,默认情况下Spring是给我们注册了N多个解析器的:

public class PropertyEditorRegistrySupport implements PropertyEditorRegistry {

	@Nullable
	private Map<Class<?>, PropertyEditor> defaultEditors;

	private void createDefaultEditors() {
		this.defaultEditors = new HashMap<>(64);

		// Simple editors, without parameterization capabilities.
		// The JDK does not contain a default editor for any of these target types.
		this.defaultEditors.put(Charset.class, new CharsetEditor());
		this.defaultEditors.put(Class.class, new ClassEditor());
		...
		// Default instances of collection editors.
		// Can be overridden by registering custom instances of those as custom editors.
		this.defaultEditors.put(Collection.class, new CustomCollectionEditor(Collection.class));
		this.defaultEditors.put(Set.class, new CustomCollectionEditor(Set.class));
		this.defaultEditors.put(SortedSet.class, new CustomCollectionEditor(SortedSet.class));
		this.defaultEditors.put(List.class, new CustomCollectionEditor(List.class));
		this.defaultEditors.put(SortedMap.class, new CustomMapEditor(SortedMap.class));
		...
		// 这里就部全部枚举出来了
	}
}

虽然默认注册支持的Editor众多,但是依旧发现它并没有对Date类型、以及Jsr310提供的各种事件、日期类型的转换(当然也包括我们的自定义类型)。
因此我相信小伙伴都遇到过这样的痛点:Date、LocalDate等类型使用自动绑定老不方便了,并且还经常傻傻搞不清楚。所以最终很多都无奈选择了语义不是非常清晰的时间戳来传递

演示Date类型的数据绑定Demo:

@Getter
@Setter
@ToString
public class Person {

    public String name;
    public Integer age;

    // 以Date类型为示例
    private Date start;
    private Date end;
    private Date endTest;

}

    public static void main(String[] args) {
        Person person = new Person();
        DataBinder binder = new DataBinder(person, "person");

        // 设置属性
        MutablePropertyValues pvs = new MutablePropertyValues();
        pvs.add("name", "fsx");

        // 事件类型绑定
        pvs.add("start", new Date());
        pvs.add("end", "2019-07-20");
        // 试用试用标准的事件日期字符串形式~
        pvs.add("endTest", "Sat Jul 20 11:00:22 CST 2019");


        binder.bind(pvs);
        System.out.println(person);
    }

打印输出:

Person(name=fsx, age=null, start=Sat Jul 20 11:05:29 CST 2019, end=null, endTest=Sun Jul 21 01:00:22 CST 2019)

结果是符合我预期的:start有值,end没有,endTest却有值。
可能小伙伴对start、end都可以理解,最诧异的是endTest为何会有值呢???
此处我简单解释一下处理步骤:

  1. BeanWrapper调用setPropertyValue()给属性赋值,传入的value值都会交给convertForProperty()方法根据get方法的返回值类型进行转换~(比如此处为Date类型)
  2. 委托给this.typeConverterDelegate.convertIfNecessary进行类型转换(比如此处为string->Date类型)
  3. this.propertyEditorRegistry.findCustomEditor(requiredType, propertyName);找到一个合适的PropertyEditor(显然此处我们没有自定义Custom处理Date的PropertyEditor,返回null)
  4. 回退到使用ConversionService,显然此处我们也没有设置,返回null
  5. 回退到使用默认的editor = findDefaultEditor(requiredType);(注意:此处只根据类型去找了,因为上面说了默认不处理了Date,所以也是返回null)
  6. 最终的最终,回退到Spring对Array、Collection、Map的默认值处理问题,最终若是String类型,都会调用BeanUtils.instantiateClass(strCtor, convertedValue)也就是有参构造进行初始化~~~(请注意这必须是String类型才有的权利)
    1. 所以本例中,到最后一步就相当于new Date("Sat Jul 20 11:00:22 CST 2019")因为该字符串是标准的时间日期串,所以是阔仪的,也就是endTest是能被正常赋值的~

通过这个简单的步骤分析,解释了为何end没值,endTest有值了。
其实通过回退到的最后一步处理,我们还可以对此做巧妙的应用。比如我给出如下的一个巧用例子:

@Getter
@Setter
@ToString
public class Person {
    private String name;
    // 备注:child是有有一个入参的构造器的
    private Child child;
}

@Getter
@Setter
@ToString
public class Child {
    private String name;
    private Integer age;
    public Child() {
    }
    public Child(String name) {
        this.name = name;
    }
}

    public static void main(String[] args) {
        Person person = new Person();
        DataBinder binder = new DataBinder(person, "person");

        // 设置属性
        MutablePropertyValues pvs = new MutablePropertyValues();
        pvs.add("name", "fsx");

        // 给child赋值,其实也可以传一个字符串就行了 非常的方便   Spring会自动给我们new对象
        pvs.add("child", "fsx-son");
        
        binder.bind(pvs);
        System.out.println(person);
    }

打印输出:

Person(name=fsx, child=Child(name=fsx-son, age=null))

完美。


废话不多说,下面我通过自定义属性编辑器的手段,来让能够支持处理上面我们传入2019-07-20这种非标准的时间字符串

我们知道DataBinder本身就是个PropertyEditorRegistry,因此我只需要自己注册一个自定义的PropertyEditor即可:

1、通过继承PropertyEditorSupport实现一个自己的处理Date的编辑器:

public class MyDatePropertyEditor extends PropertyEditorSupport {

    private static final String PATTERN = "yyyy-MM-dd";

    @Override
    public String getAsText() {
        Date date = (Date) super.getValue();
        return new SimpleDateFormat(PATTERN).format(date);
    }

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        try {
            super.setValue(new SimpleDateFormat(PATTERN).parse(text));
        } catch (ParseException e) {
            System.out.println("ParseException....................");
        }
    }
}

2、注册进DataBinder并运行

    public static void main(String[] args) {
        Person person = new Person();
        DataBinder binder = new DataBinder(person, "person");
        binder.registerCustomEditor(Date.class, new MyDatePropertyEditor());
        //binder.registerCustomEditor(Date.class, "end", new MyDatePropertyEditor());

        // 设置属性
        MutablePropertyValues pvs = new MutablePropertyValues();
        pvs.add("name", "fsx");

        // 事件类型绑定
        pvs.add("start", new Date());
        pvs.add("end", "2019-07-20");
        // 试用试用标准的事件日期字符串形式~
        pvs.add("endTest", "Sat Jul 20 11:00:22 CST 2019");


        binder.bind(pvs);
        System.out.println(person);
    }

运行打印如下:

ParseException....................
Person(name=fsx, age=null, start=Sat Jul 20 11:41:49 CST 2019, end=Sat Jul 20 00:00:00 CST 2019, endTest=null)

结果符合预期。不过对此结果我仍旧抛出如下两个问题供小伙伴自行思考:
1、输出了ParseException…
2、start有值,endTest值却为null了

理解这块最后我想说:通过自定义编辑器,我们可以非常自由、高度定制化的完成自定义类型的封装,可以使得我们的Controller更加容错、更加智能、更加简洁。有兴趣的可以运用此块知识,自行实践~

WebBindingInitializer和WebDataBinderFactory

WebBindingInitializer

WebBindingInitializer:实现此接口重写initBinder方法注册的属性编辑器是全局的属性编辑器,对所有的Controller都有效。

可以简单粗暴的理解为:WebBindingInitializer为编码方式,@InitBinder为注解方式(当然注解方式还能控制到只对当前Controller有效,实现更细粒度的控制)

观察发现,Spring对这个接口的命名很有意思:它用的Binding正在进行时态~

// @since 2.5   Spring在初始化WebDataBinder时候的回调接口,给调用者自定义~
public interface WebBindingInitializer {

	// @since 5.0
	void initBinder(WebDataBinder binder);

	// @deprecated as of 5.0 in favor of {@link #initBinder(WebDataBinder)}
	@Deprecated
	default void initBinder(WebDataBinder binder, WebRequest request) {
		initBinder(binder);
	}

}

此接口它的内建唯一实现类为:ConfigurableWebBindingInitializer,若你自己想要扩展,建议继承它~

public class ConfigurableWebBindingInitializer implements WebBindingInitializer {
	private boolean autoGrowNestedPaths = true;
	private boolean directFieldAccess = false; // 显然这里是false

	// 下面这些参数,不就是WebDataBinder那些可以配置的属性们吗?
	@Nullable
	private MessageCodesResolver messageCodesResolver;
	@Nullable
	private BindingErrorProcessor bindingErrorProcessor;
	@Nullable
	private Validator validator;
	@Nullable
	private ConversionService conversionService;
	// 此处使用的PropertyEditorRegistrar来管理的,最终都会被注册进PropertyEditorRegistry嘛
	@Nullable
	private PropertyEditorRegistrar[] propertyEditorRegistrars;

	... //  省略所有get/set
	
	// 它做的事无非就是把配置的值都放进去而已~~
	@Override
	public void initBinder(WebDataBinder binder) {
		binder.setAutoGrowNestedPaths(this.autoGrowNestedPaths);
		if (this.directFieldAccess) {
			binder.initDirectFieldAccess();
		}
		if (this.messageCodesResolver != null) {
			binder.setMessageCodesResolver(this.messageCodesResolver);
		}
		if (this.bindingErrorProcessor != null) {
			binder.setBindingErrorProcessor(this.bindingErrorProcessor);
		}
		// 可以看到对校验器这块  内部还是做了容错的
		if (this.validator != null && binder.getTarget() != null && this.validator.supports(binder.getTarget().getClass())) {
			binder.setValidator(this.validator);
		}
		if (this.conversionService != null) {
			binder.setConversionService(this.conversionService);
		}
		if (this.propertyEditorRegistrars != null) {
			for (PropertyEditorRegistrar propertyEditorRegistrar : this.propertyEditorRegistrars) {
				propertyEditorRegistrar.registerCustomEditors(binder);
			}
		}
	}
}

此实现类主要是提供了一些可配置项,方便使用。注意:此接口一般不直接使用,而是结合InitBinderDataBinderFactoryWebDataBinderFactory等一起使用~

WebDataBinderFactory

顾名思义它就是来创造一个WebDataBinder的工厂。

// @since 3.1   注意:WebDataBinder 可是1.2就有了~
public interface WebDataBinderFactory {
	// 此处使用的是Spring自己的NativeWebRequest   后面两个参数就不解释了
	WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, String objectName) throws Exception;
}

它的继承树如下:
在这里插入图片描述

DefaultDataBinderFactory
public class DefaultDataBinderFactory implements WebDataBinderFactory {
	@Nullable
	private final WebBindingInitializer initializer;
	// 注意:这是唯一构造函数
	public DefaultDataBinderFactory(@Nullable WebBindingInitializer initializer) {
		this.initializer = initializer;
	}

	// 实现接口的方法
	@Override
	@SuppressWarnings("deprecation")
	public final WebDataBinder createBinder(NativeWebRequest webRequest, @Nullable Object target, String objectName) throws Exception {

		WebDataBinder dataBinder = createBinderInstance(target, objectName, webRequest);
		
		// 可见WebDataBinder 创建好后,此处就会回调(只有一个)
		if (this.initializer != null) {
			this.initializer.initBinder(dataBinder, webRequest);
		}
		// 空方法 子类去实现,比如InitBinderDataBinderFactory实现了词方法
		initBinder(dataBinder, webRequest);
		return dataBinder;
	}

	//  子类可以复写,默认实现是WebRequestDataBinder
	// 比如子类ServletRequestDataBinderFactory就复写了,使用的new ExtendedServletRequestDataBinder(target, objectName)
	protected WebDataBinder createBinderInstance(@Nullable Object target, String objectName, NativeWebRequest webRequest) throws Exception 
		return new WebRequestDataBinder(target, objectName);
	}
}

按照Spring一贯的设计,本方法实现了模板动作,子类只需要复写对应的动作即可达到效果。

InitBinderDataBinderFactory

它继承自DefaultDataBinderFactory,主要用于处理标注有@InitBinder的方法做初始绑定~

// @since 3.1
public class InitBinderDataBinderFactory extends DefaultDataBinderFactory {
	
	// 需要注意的是:`@InitBinder`可以标注N多个方法~  所以此处是List
	private final List<InvocableHandlerMethod> binderMethods;

	// 此子类的唯一构造函数
	public InitBinderDataBinderFactory(@Nullable List<InvocableHandlerMethod> binderMethods, @Nullable WebBindingInitializer initializer) {
		super(initializer);
		this.binderMethods = (binderMethods != null ? binderMethods : Collections.emptyList());
	}

	// 上面知道此方法的调用方法生initializer.initBinder之后
	// 所以使用注解它生效的时机是在直接实现接口的后面的~
	@Override
	public void initBinder(WebDataBinder dataBinder, NativeWebRequest request) throws Exception {
		for (InvocableHandlerMethod binderMethod : this.binderMethods) {
			// 判断@InitBinder是否对dataBinder持有的target对象生效~~~(根据name来匹配的)
			if (isBinderMethodApplicable(binderMethod, dataBinder)) {
				// 关于目标方法执行这块,可以参考另外一篇@InitBinder的原理说明~
				Object returnValue = binderMethod.invokeForRequest(request, null, dataBinder);

				// 标注@InitBinder的方法不能有返回值
				if (returnValue != null) {
					throw new IllegalStateException("@InitBinder methods must not return a value (should be void): " + binderMethod);
				}
			}
		}
	}

	//@InitBinder有个Value值,它是个数组。它是用来匹配dataBinder.getObjectName()是否匹配的   若匹配上了,现在此注解方法就会生效
	// 若value为空,那就对所有生效~~~
	protected boolean isBinderMethodApplicable(HandlerMethod initBinderMethod, WebDataBinder dataBinder) {
		InitBinder ann = initBinderMethod.getMethodAnnotation(InitBinder.class);
		Assert.state(ann != null, "No InitBinder annotation");
		String[] names = ann.value();
		return (ObjectUtils.isEmpty(names) || ObjectUtils.containsElement(names, dataBinder.getObjectName()));
	}
}
ServletRequestDataBinderFactory

它继承自InitBinderDataBinderFactory,作用就更明显了。既能够处理@InitBinder,而且它使用的是更为强大的数据绑定器:ExtendedServletRequestDataBinder

// @since 3.1
public class ServletRequestDataBinderFactory extends InitBinderDataBinderFactory {
	public ServletRequestDataBinderFactory(@Nullable List<InvocableHandlerMethod> binderMethods, @Nullable WebBindingInitializer initializer) {
		super(binderMethods, initializer);
	}
	@Override
	protected ServletRequestDataBinder createBinderInstance(
			@Nullable Object target, String objectName, NativeWebRequest request) throws Exception  {
		return new ExtendedServletRequestDataBinder(target, objectName);
	}
}

此工厂是RequestMappingHandlerAdapter这个适配器默认使用的一个数据绑定器工厂,而RequestMappingHandlerAdapter却又是当下使用得最频繁、功能最强大的一个适配器

总结

WebDataBinderSpringMVC中使用,它不需要我们自己去创建,我们只需要向它注册参数类型对应的属性编辑器PropertyEditorPropertyEditor可以将字符串转换成其真正的数据类型,它的void setAsText(String text)方法实现数据转换的过程。

好好掌握这部分内容,这在Spring MVC中结合@InitBinder注解一起使用将有非常大的威力,能一定程度上简化你的开发,提高效率

相关阅读

聊聊Spring中的数据绑定 — DataBinder本尊(源码分析)【享学Spring】
聊聊Spring中的数据绑定 — 属性访问器PropertyAccessor和实现类DirectFieldAccessor的使用【享学Spring】
聊聊Spring中的数据绑定 — BeanWrapper以及Java内省Introspector和PropertyDescriptor【享学Spring】


关注A哥

AuthorA哥(YourBatman)
个人站点www.yourbatman.cn
E-mailyourbatman@qq.com
微 信fsx641385712
活跃平台
公众号BAT的乌托邦(ID:BAT-utopia)
知识星球BAT的乌托邦
每日文章推荐每日文章推荐

BAT的乌托邦

  • 14
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
All Classes AbstractAdvisorAutoProxyCreator AbstractApplicationContext AbstractApplicationEventMulticaster AbstractAspectJAdvice AbstractAspectJAdvisorFactory AbstractAspectJAdvisorFactory.AspectJAnnotation AbstractAspectJAdvisorFactory.AspectJAnnotationType AbstractAutoProxyCreator AbstractAutowireCapableBeanFactory AbstractBeanDefinition AbstractBeanDefinitionParser AbstractBeanDefinitionReader AbstractBeanFactory AbstractBeanFactoryBasedTargetSource AbstractBeanFactoryBasedTargetSourceCreator AbstractBindingResult AbstractCachingLabeledEnumResolver AbstractCachingViewResolver AbstractCommandController AbstractCommandController AbstractComponentDefinition AbstractConfigurableMBeanInfoAssembler AbstractController AbstractController AbstractDataBoundFormElementTag AbstractDataFieldMaxValueIncrementer AbstractDataSource AbstractDependencyInjectionSpringContextTests AbstractEnterpriseBean AbstractEntityManagerFactoryBean AbstractExcelView AbstractExpressionPointcut AbstractFactoryBean AbstractFallbackTransactionAttributeSource AbstractFormController AbstractFormController AbstractFormTag AbstractGenericLabeledEnum AbstractGenericPointcutAdvisor AbstractHandlerMapping AbstractHandlerMapping AbstractHtmlElementBodyTag AbstractHtmlElementTag AbstractHtmlInputElementTag AbstractHttpInvokerRequestExecutor AbstractInterceptorDrivenBeanDefinitionDecorator AbstractInterruptibleBatchPreparedStatementSetter AbstractJasperReportsSingleFormatView AbstractJasperReportsView AbstractJExcelView AbstractJmsMessageDrivenBean AbstractJmxAttribute AbstractJndiLocatedBeanDefinitionParser AbstractJpaVendorAdapter AbstractLabeledEnum AbstractLazyCreationTargetSource AbstractLobCreatingPreparedStatementCallback AbstractLobHandler AbstractLobStreamingResultSetExtractor AbstractLobType AbstractLobType AbstractLobTypeHandler AbstractLocaleResolver AbstractMapBasedHandlerMapping AbstractMBeanInfoAssembler AbstractMessageDrivenBean AbstractMessageListenerContainer AbstractMessageListenerContainer.SharedConnectionNotInitializedException AbstractMessageSource AbstractModelAndViewTests AbstractMonitoringInterceptor AbstractMultipartHttpServletRequest AbstractOverridingClassLoader AbstractPathMapHandlerMapping AbstractPdfView AbstractPlatformTransactionManager AbstractPointcutAdvisor AbstractPoolingServerSessionFactory AbstractPoolingTargetSource AbstractPropertyAccessor AbstractPropertyBindingResult AbstractPrototypeBasedTargetSource AbstractReflectiveMBeanInfoAssembler AbstractRefreshableApplicationContext AbstractRefreshablePortletApplicationContext AbstractRefreshableTargetSource AbstractRefreshableWebApplicationContext AbstractRegexpMethodPointcut AbstractRemoteSlsbInvokerInterceptor AbstractRequestAttributes AbstractRequestAttributesScope AbstractRequestLoggingFilter AbstractResource AbstractSequenceMaxValueIncrementer AbstractSessionBean AbstractSessionFactory AbstractSessionFactoryBean AbstractSimpleBeanDefinitionParser AbstractSingleBeanDefinitionParser AbstractSingleSpringContextTests AbstractSingletonProxyFactoryBean AbstractSlsbInvokerInterceptor AbstractSpringContextTests AbstractSqlParameterSource AbstractSqlTypeValue AbstractStatefulSessionBean AbstractStatelessSessionBean AbstractTemplateView AbstractTemplateViewResolver AbstractThemeResolver AbstractTraceInterceptor AbstractTransactionalDataSourceSpringContextTests AbstractTransactionalSpringContextTests AbstractTransactionStatus AbstractUrlBasedView AbstractUrlHandlerMapping AbstractUrlMethodNameResolver AbstractUrlViewController AbstractView AbstractWizardFormController AbstractWizardFormController AbstractXmlApplicationContext AbstractXsltView AcceptHeaderLocaleResolver ActionRequestWrapper ActionServletAwareProcessor ActionSupport AdaptableJobFactory AdviceEntry Advised AdvisedSupport AdvisedSupportListener Advisor AdvisorAdapter AdvisorAdapterRegistrationManager AdvisorAdapterRegistry AdvisorChainFactory AdvisorChainFactoryUtils AdvisorComponentDefinition AdvisorEntry AfterReturningAdvice AfterReturningAdviceAdapter AfterReturningAdviceInterceptor AliasDefinition AnnotationAwareAspectJAutoProxyCreator AnnotationBeanUtils AnnotationBeanWiringInfoResolver AnnotationClassFilter AnnotationDrivenBeanDefinitionParser AnnotationJmxAttributeSource AnnotationMatchingPointcut AnnotationMethodMatcher AnnotationSessionFactoryBean AnnotationTransactionAttributeSource AnnotationUtils AntPathMatcher AopConfigException AopContext AopInvocationException AopNamespaceHandler AopNamespaceUtils AopProxy AopProxyFactory AopProxyUtils AopUtils ApplicationContext ApplicationContextAware ApplicationContextAwareProcessor ApplicationContextException ApplicationEvent ApplicationEventMulticaster ApplicationEventPublisher ApplicationEventPublisherAware ApplicationListener ApplicationObjectSupport ArgPreparedStatementSetter ArgTypePreparedStatementSetter ArgumentConvertingMethodInvoker AspectComponentDefinition AspectEntry AspectInstanceFactory AspectJAdviceParameterNameDiscoverer AspectJAdviceParameterNameDiscoverer.AmbiguousBindingException AspectJAdvisorFactory AspectJAfterAdvice AspectJAfterReturningAdvice AspectJAfterThrowingAdvice AspectJAopUtils AspectJAroundAdvice AspectJAutoProxyBeanDefinitionParser AspectJExpressionPointcut AspectJExpressionPointcutAdvisor AspectJInvocationContextExposingAdvisorAutoProxyCreator AspectJMethodBeforeAdvice AspectJPointcutAdvisor AspectJPrecedenceAwareOrderComparator AspectJPrecedenceInformation AspectJProxyFactory AspectJProxyUtils AspectJWeaverMessageHandler AspectMetadata Assert AssertThrows AttributeAccessor AttributeAccessorSupport Attributes AttributesJmxAttributeSource AttributesTransactionAttributeSource AutodetectCapableMBeanInfoAssembler AutoPopulatingList AutoPopulatingList.ElementFactory AutoPopulatingList.ElementInstantiationException Autowire AutowireCapableBeanFactory AutowireUtils AutowiringRequestProcessor AutowiringTilesRequestProcessor AxisBeanMappingServicePostProcessor BadSqlGrammarException BaseCommandController BaseCommandController BatchPreparedStatementSetter BatchSqlUpdate BeanClassLoaderAware BeanComponentDefinition BeanConfigurerSupport BeanCreationException BeanCreationNotAllowedException BeanCurrentlyInCreationException BeanDefinition BeanDefinitionBuilder BeanDefinitionDecorator BeanDefinitionDocumentReader BeanDefinitionHolder BeanDefinitionParser BeanDefinitionParserDelegate BeanDefinitionParsingException BeanDefinitionReader BeanDefinitionReaderUtils BeanDefinitionRegistry BeanDefinitionStoreException BeanDefinitionValidationException BeanDefinitionValueResolver BeanDefinitionVisitor BeanEntry BeanFactory BeanFactoryAspectInstanceFactory BeanFactoryAspectInstanceFactory BeanFactoryAware BeanFactoryDataSourceLookup BeanFactoryLocator BeanFactoryPostProcessor BeanFactoryReference BeanFactoryRefreshableTargetSource BeanFactoryUtils BeanInitializationException BeanInstantiationException BeanIsAbstractException BeanIsNotAFactoryException BeanMetadataElement BeanNameAutoProxyCreator BeanNameAware BeanNameUrlHandlerMapping BeanNameViewResolver BeanNotOfRequiredTypeException BeanPostProcessor BeanPropertyBindingResult BeanPropertySqlParameterSource BeanReference BeansDtdResolver BeansException BeanUtils BeanWiringInfo BeanWiringInfoResolver BeanWrapper BeanWrapperImpl BeforeAdvice BeforeAdviceAdapter BindErrorsTag BindException BindingErrorProcessor BindingResult BindingResultUtils BindInitializer BindStatus BindTag BindUtils BlobByteArrayType BlobByteArrayType BlobByteArrayTypeHandler BlobSerializableType BlobSerializableType BlobSerializableTypeHandler BlobStringType BlobStringType BooleanComparator BootstrapException BridgeMethodResolver BshScriptFactory BshScriptUtils BshScriptUtils.BshExecutionException BurlapClientInterceptor BurlapProxyFactoryBean BurlapServiceExporter ByteArrayMultipartFileEditor ByteArrayPropertyEditor ByteArrayResource C3P0NativeJdbcExtractor CachedIntrospectionResults CachingDestinationResolver CachingMapDecorator CallableStatementCallback CallableStatementCreator CallableStatementCreatorFactory CallbackPreferringPlatformTransactionManager CancellableFormController CannotAcquireLockException CannotCreateRecordException CannotCreateTransactionException CannotGetCciConnectionException CannotGetJdbcConnectionException CannotLoadBeanClassException CannotSerializeTransactionException CciDaoSupport CciLocalTransactionManager CciOperationNotSupportedException CciOperations CciTemplate Cglib2AopProxy Cglib2AopProxy.SerializableNoOp CglibSubclassingInstantiationStrategy ChainedExceptionListener ChainedPersistenceExceptionTranslator CharacterEditor CharacterEncodingFilter CharArrayPropertyEditor CheckboxTag ChildBeanDefinition ClassArrayEditor ClassEditor ClassFileTransformerAdapter ClassFilter ClassFilters ClassLoaderAnalyzerInterceptor ClassLoaderUtils ClassNameBeanWiringInfoResolver ClassPathResource ClassPathXmlApplicationContext ClassUtils CleanupFailureDataAccessException ClobStringType ClobStringType ClobStringTypeHandler CodebaseAwareObjectInputStream CollectionFactory CollectionUtils ColumnMapRowMapper CommAreaRecord CommonsAttributes CommonsDbcpNativeJdbcExtractor CommonsFileUploadSupport CommonsFileUploadSupport.MultipartParsingResult CommonsHttpInvokerRequestExecutor CommonsLogFactoryBean CommonsLoggingLogSystem CommonsLoggingSessionLog CommonsLoggingSessionLog904 CommonsMultipartFile CommonsMultipartResolver CommonsPathMapHandlerMapping CommonsPoolServerSessionFactory CommonsPoolTargetSource CommonsPortletMultipartResolver CommonsRequestLoggingFilter ComparableComparator ComponentControllerSupport ComponentDefinition ComposablePointcut CompositeTransactionAttributeSource CompoundComparator ConcurrencyFailureException ConcurrencyThrottleInterceptor ConcurrencyThrottleSupport ConcurrentTaskExecutor ConditionalTestCase ConfigBeanDefinitionParser Configurable ConfigurableApplicationContext ConfigurableBeanFactory ConfigurableJasperReportsView ConfigurableListableBeanFactory ConfigurableMimeFileTypeMap ConfigurablePortletApplicationContext ConfigurablePropertyAccessor ConfigurableWebApplicationContext ConnectionCallback ConnectionCallback ConnectionFactoryUtils ConnectionFactoryUtils ConnectionFactoryUtils.ResourceFactory ConnectionHandle ConnectionHolder ConnectionHolder ConnectionProxy ConnectionSpecConnectionFactoryAdapter ConnectorServerFactoryBean ConsoleListener ConstantException Constants ConstructorArgumentEntry ConstructorArgumentValues ConstructorArgumentValues.ValueHolder ConstructorResolver ContextBeanFactoryReference ContextClosedEvent ContextJndiBeanFactoryLocator ContextLoader ContextLoaderListener ContextLoaderPlugIn ContextLoaderServlet ContextRefreshedEvent ContextSingletonBeanFactoryLocator ControlFlow ControlFlowFactory ControlFlowFactory.Jdk13ControlFlow ControlFlowFactory.Jdk14ControlFlow ControlFlowPointcut Controller Controller ControllerClassNameHandlerMapping Conventions CookieGenerator CookieLocaleResolver CookieThemeResolver CosMailSenderImpl CosMultipartHttpServletRequest CosMultipartResolver CronTriggerBean CustomBooleanEditor CustomCollectionEditor CustomDateEditor CustomEditorConfigurer CustomizableTraceInterceptor CustomNumberEditor CustomScopeConfigurer CustomSQLErrorCodesTranslation DaoSupport DataAccessException DataAccessResourceFailureException DataAccessUtils Database DatabaseMetaDataCallback DatabaseStartupValidator DataBinder DataFieldMaxValueIncrementer DataIntegrityViolationException DataRetrievalFailureException DataSourceLookup DataSourceLookupFailureException DataSourceTransactionManager DataSourceUtils DB2SequenceMaxValueIncrementer DeadlockLoserDataAccessException DebugInterceptor DeclareParentsAdvisor DecoratingNavigationHandler DefaultAdvisorAdapterRegistry DefaultAdvisorAutoProxyCreator DefaultAopProxyFactory DefaultBeanDefinitionDocumentReader DefaultBindingErrorProcessor DefaultDocumentLoader DefaultIntroductionAdvisor DefaultJdoDialect DefaultJpaDialect DefaultListableBeanFactory DefaultLobHandler DefaultLocatorFactory DefaultMessageCodesResolver DefaultMessageListenerContainer DefaultMessageListenerContainer102 DefaultMessageSourceResolvable DefaultMultipartActionRequest DefaultMultipartHttpServletRequest DefaultNamespaceHandlerResolver DefaultPersistenceUnitManager DefaultPointcutAdvisor DefaultPropertiesPersister DefaultRemoteInvocationExecutor DefaultRemoteInvocationFactory DefaultRequestToViewNameTranslator DefaultResourceLoader DefaultScopedObject DefaultSingletonBeanRegistry DefaultToStringStyler DefaultTransactionAttribute DefaultTransactionDefinition DefaultTransactionStatus DefaultValueStyler DelegatePerTargetObjectDelegatingIntroductionInterceptor DelegatingActionProxy DelegatingActionUtils DelegatingConnectionFactory DelegatingDataSource DelegatingEntityResolver DelegatingFilterProxy DelegatingIntroductionInterceptor DelegatingJob DelegatingMessageSource DelegatingNavigationHandlerProxy DelegatingPhaseListenerMulticaster DelegatingRequestProcessor DelegatingServletInputStream DelegatingServletOutputStream DelegatingThemeSource DelegatingTilesRequestProcessor DelegatingTimerListener DelegatingTimerTask DelegatingTransactionAttribute DelegatingVariableResolver DelegatingWork DescriptiveResource DestinationResolutionException DestinationResolver DestructionAwareBeanPostProcessor DirectFieldAccessor DirectFieldBindingResult DispatchActionSupport DispatcherPortlet DispatcherServlet DispatcherServletWebRequest DisposableBean DisposableBeanAdapter DisposableSqlTypeValue DocumentLoader DomUtils DriverManagerDataSource DynamicDestinationResolver DynamicIntroductionAdvice DynamicMethodMatcher DynamicMethodMatcherPointcut DynamicMethodMatcherPointcutAdvisor EhCacheFactoryBean EhCacheManagerFactoryBean EisOperation EjbAccessException EmptyReaderEventListener EmptyResultDataAccessException EmptyTargetSource EncodedResource EntityManagerFactoryAccessor EntityManagerFactoryInfo EntityManagerFactoryPlus EntityManagerFactoryPlusOperations EntityManagerFactoryUtils EntityManagerHolder EntityManagerPlus EntityManagerPlusOperations ErrorCoded Errors ErrorsTag EscapeBodyTag EscapedErrors EventPublicationInterceptor ExpectedLookupTemplate ExposeBeanNameAdvisors ExposeInvocationInterceptor ExpressionEvaluationUtils ExpressionPointcut ExtendedEntityManagerCreator FacesContextUtils FactoryBean FactoryBeanNotInitializedException FailFastProblemReporter FatalBeanException FieldError FieldRetrievingFactoryBean FileCopyUtils FileEditor FileSystemResource FileSystemResourceLoader FileSystemXmlApplicationContext FilterDefinitionFactoryBean FixedLocaleResolver FixedThemeResolver FormTag FrameworkPortlet FrameworkServlet FreeMarkerConfig FreeMarkerConfigurationFactory FreeMarkerConfigurationFactoryBean FreeMarkerConfigurer FreeMarkerTemplateUtils FreeMarkerView FreeMarkerViewResolver GeneratedKeyHolder GenericApplicationContext GenericBeanFactoryAccessor GenericCollectionTypeResolver GenericFilterBean GenericPortletBean GenericWebApplicationContext GlobalAdvisorAdapterRegistry GroovyScriptFactory HandlerAdapter HandlerAdapter HandlerExceptionResolver HandlerExceptionResolver HandlerExecutionChain HandlerExecutionChain HandlerInterceptor HandlerInterceptor HandlerInterceptorAdapter HandlerInterceptorAdapter HandlerMapping HandlerMapping HashMapCachingAdvisorChainFactory Hessian1SkeletonInvoker Hessian2SkeletonInvoker HessianClientInterceptor HessianProxyFactoryBean HessianServiceExporter HessianSkeletonInvoker HeuristicCompletionException HibernateAccessor HibernateAccessor HibernateCallback HibernateCallback HibernateDaoSupport HibernateDaoSupport HibernateInterceptor HibernateInterceptor HibernateJdbcException HibernateJdbcException HibernateJpaDialect HibernateJpaVendorAdapter HibernateObjectRetrievalFailureException HibernateObjectRetrievalFailureException HibernateOperations HibernateOperations HibernateOptimisticLockingFailureException HibernateOptimisticLockingFailureException HibernateQueryException HibernateQueryException HibernateSystemException HibernateSystemException HibernateTemplate HibernateTemplate HibernateTransactionManager HibernateTransactionManager HiddenInputTag HierarchicalBeanFactory HierarchicalMessageSource HierarchicalThemeSource HotSwappableTargetSource HsqlMaxValueIncrementer HtmlCharacterEntityDecoder HtmlCharacterEntityReferences HtmlEscapeTag HtmlEscapingAwareTag HtmlUtils HttpInvokerClientConfiguration HttpInvokerClientInterceptor HttpInvokerProxyFactoryBean HttpInvokerRequestExecutor HttpInvokerServiceExporter HttpRequestHandler HttpRequestHandlerAdapter HttpRequestHandlerServlet HttpRequestMethodNotSupportedException HttpServletBean HttpSessionMutexListener HttpSessionRequiredException IdentityNamingStrategy IdTransferringMergeEventListener IllegalStateException IllegalTransactionStateException ImportDefinition IncorrectResultSetColumnCountException IncorrectResultSizeDataAccessException IncorrectUpdateSemanticsDataAccessException InitializingBean InputStreamEditor InputStreamResource InputStreamSource InputTag InstantiationAwareBeanPostProcessor InstantiationAwareBeanPostProcessorAdapter InstantiationModelAwarePointcutAdvisor InstantiationModelAwarePointcutAdvisorImpl InstantiationStrategy InstrumentationLoadTimeWeaver InstrumentationSavingAgent InteractionCallback InterceptorAndDynamicMethodMatcher InterfaceBasedMBeanInfoAssembler InternalPathMethodNameResolver InternalResourceView InternalResourceViewResolver InternetAddressEditor InterruptibleBatchPreparedStatementSetter IntroductionAdvisor IntroductionAwareMethodMatcher IntroductionInfo IntroductionInfoSupport IntroductionInterceptor IntrospectorCleanupListener InvalidClientIDException InvalidDataAccessApiUsageException InvalidDataAccessResourceUsageException InvalidDestinationException InvalidInvocationException InvalidIsolationLevelException InvalidMetadataException InvalidPropertyException InvalidResultSetAccessException InvalidResultSetAccessException InvalidSelectorException InvalidTimeoutException InvertibleComparator InvocationFailureException Isolation JamonPerformanceMonitorInterceptor JasperReportsCsvView JasperReportsHtmlView JasperReportsMultiFormatView JasperReportsPdfView JasperReportsUtils JasperReportsViewResolver JasperReportsXlsView JavaMailSender JavaMailSenderImpl JavaScriptUtils JaxRpcPortClientInterceptor JaxRpcPortProxyFactoryBean JaxRpcServicePostProcessor JBossNativeJdbcExtractor JdbcAccessor JdbcBeanDefinitionReader JdbcDaoSupport JdbcOperations JdbcTemplate JdbcTransactionObjectSupport JdbcUpdateAffectedIncorrectNumberOfRowsException JdbcUtils JdkDynamicAopProxy JdkRegexpMethodPointcut JdkVersion JdoAccessor JdoCallback JdoDaoSupport JdoDialect JdoInterceptor JdoObjectRetrievalFailureException JdoOperations JdoOptimisticLockingFailureException JdoResourceFailureException JdoSystemException JdoTemplate JdoTransactionManager JdoUsageException JeeNamespaceHandler JmsAccessor JmsDestinationAccessor JmsException JmsGatewaySupport JmsInvokerClientInterceptor JmsInvokerProxyFactoryBean JmsInvokerServiceExporter JmsOperations JmsResourceHolder JmsSecurityException JmsTemplate JmsTemplate102 JmsTransactionManager JmsTransactionManager102 JmsUtils JmxAttributeSource JmxException JmxMetadataUtils JmxUtils JndiAccessor JndiCallback JndiDataSourceLookup JndiDestinationResolver JndiLocatorSupport JndiLookupBeanDefinitionParser JndiObjectFactoryBean JndiObjectLocator JndiObjectTargetSource JndiRmiClientInterceptor JndiRmiProxyFactoryBean JndiRmiServiceExporter JndiTemplate JndiTemplateEditor JobDetailAwareTrigger JobDetailBean JotmFactoryBean JpaAccessor JpaCallback JpaDaoSupport JpaDialect JpaInterceptor JpaObjectRetrievalFailureException JpaOperations JpaOptimisticLockingFailureException JpaSystemException JpaTemplate JpaTransactionManager JpaVendorAdapter JRubyScriptFactory JRubyScriptUtils JspAwareRequestContext JstlUtils JstlView JtaAfterCompletionSynchronization JtaLobCreatorSynchronization JtaTransactionManager JtaTransactionObject KeyHolder KeyNamingStrategy LabeledEnum LabeledEnumResolver LabelTag LangNamespaceHandler LastModified LazyConnectionDataSourceProxy LazyInitTargetSource LazyInitTargetSourceCreator LazySingletonMetadataAwareAspectInstanceFactoryDecorator LetterCodedLabeledEnum Lifecycle ListableBeanFactory ListenerExecutionFailedException ListenerSessionManager ListFactoryBean LoadTimeWeaver LobCreator LobCreatorUtils LobHandler LobRetrievalFailureException LocalConnectionFactoryBean LocalContainerEntityManagerFactoryBean LocalDataSourceConnectionProvider LocalDataSourceConnectionProvider LocalDataSourceJobStore LocaleChangeInterceptor LocaleContext LocaleContextHolder LocaleEditor LocalEntityManagerFactoryBean LocaleResolver LocalizedResourceHelper LocalJaxRpcServiceFactory LocalJaxRpcServiceFactoryBean LocalPersistenceManagerFactoryBean LocalSessionFactory LocalSessionFactoryBean LocalSessionFactoryBean LocalSessionFactoryBean LocalSlsbInvokerInterceptor LocalStatelessSessionBeanDefinitionParser LocalStatelessSessionProxyFactoryBean LocalTaskExecutorThreadPool LocalTransactionManagerLookup LocalTransactionManagerLookup LocalVariableTableParameterNameDiscoverer Location Log4jConfigListener Log4jConfigServlet Log4jConfigurer Log4jNestedDiagnosticContextFilter Log4jWebConfigurer LookupDispatchActionSupport LookupOverride MailAuthenticationException MailException MailMessage MailParseException MailPreparationException MailSender MailSendException ManagedAttribute ManagedAttribute ManagedList ManagedMap ManagedNotification ManagedNotification ManagedNotifications ManagedOperation ManagedOperation ManagedOperationParameter ManagedOperationParameter ManagedOperationParameters ManagedProperties ManagedResource ManagedResource ManagedSet MapBindingResult MapDataSourceLookup MapFactoryBean MappingCommAreaOperation MappingDispatchActionSupport MappingRecordOperation MappingSqlQuery MappingSqlQueryWithParameters MapSqlParameterSource MatchAlwaysTransactionAttributeSource MaxUploadSizeExceededException MBeanClientInterceptor MBeanExporter MBeanExporterListener MBeanExportException MBeanExportOperations MBeanInfoAssembler MBeanInfoRetrievalException MBeanProxyFactoryBean MBeanRegistrationSupport MBeanServerConnectionFactoryBean MBeanServerFactoryBean MBeanServerNotFoundException Mergeable MessageCodesResolver MessageConversionException MessageConverter MessageCreator MessageEOFException MessageFormatException MessageListenerAdapter MessageListenerAdapter102 MessageNotReadableException MessageNotWriteableException MessagePostProcessor MessageSource MessageSourceAccessor MessageSourceAware MessageSourceResolvable MessageSourceResourceBundle MessageTag MetaDataAccessException MetadataAwareAspectInstanceFactory MetadataMBeanInfoAssembler MetadataNamingStrategy MethodBeforeAdvice MethodBeforeAdviceInterceptor MethodExclusionMBeanInfoAssembler MethodInvocationException MethodInvocationProceedingJoinPoint MethodInvoker MethodInvokingFactoryBean MethodInvokingJobDetailFactoryBean MethodInvokingJobDetailFactoryBean.MethodInvokingJob MethodInvokingJobDetailFactoryBean.StatefulMethodInvokingJob MethodInvokingRunnable MethodInvokingTimerTaskFactoryBean MethodLocatingFactoryBean MethodMapTransactionAttributeSource MethodMatcher MethodMatchers MethodNameBasedMBeanInfoAssembler MethodNameResolver MethodOverride MethodOverrides MethodParameter MethodReplacer MimeMailMessage MimeMessageHelper MimeMessagePreparator MockActionRequest MockActionResponse MockExpressionEvaluator MockFilterConfig MockHttpServletRequest MockHttpServletResponse MockHttpSession MockMultipartActionRequest MockMultipartFile MockMultipartHttpServletRequest MockPageContext MockPortalContext MockPortletConfig MockPortletContext MockPortletPreferences MockPortletRequest MockPortletRequestDispatcher MockPortletResponse MockPortletSession MockPortletURL MockRenderRequest MockRenderResponse MockRequestDispatcher MockServletConfig MockServletContext ModelAndView ModelAndView ModelAndViewDefiningException ModelAndViewDefiningException ModelMap ModelMBeanNotificationPublisher MultiActionController MultipartActionRequest MultipartException MultipartFile MultipartFilter MultipartHttpServletRequest MultipartResolver MutablePersistenceUnitInfo MutablePropertyValues MutableSortDefinition MySQLMaxValueIncrementer NamedBean NamedParameterJdbcDaoSupport NamedParameterJdbcOperations NamedParameterJdbcTemplate NamedParameterUtils NameMatchMethodPointcut NameMatchMethodPointcutAdvisor NameMatchTransactionAttributeSource NamespaceHandler NamespaceHandlerResolver NamespaceHandlerSupport NativeJdbcExtractor NativeJdbcExtractorAdapter NestedCheckedException NestedExceptionUtils NestedIOException NestedPathTag NestedRuntimeException NestedServletException NestedTransactionNotSupportedException NoRollbackRuleAttribute NoSuchBeanDefinitionException NoSuchMessageException NoSuchRequestHandlingMethodException NotAnAtAspectException NotificationListenerBean NotificationPublisher NotificationPublisherAware NoTransactionException NotReadablePropertyException NotSupportedRecordFactory NotWritablePropertyException NullSafeComparator NullSourceExtractor NullValueInNestedPathException NumberUtils ObjectError ObjectFactory ObjectFactoryCreatingFactoryBean ObjectNameManager ObjectNamingStrategy ObjectOptimisticLockingFailureException ObjectRetrievalFailureException ObjectUtils OC4JClassPreprocessorAdapter OC4JLoadTimeWeaver OncePerRequestFilter OpenEntityManagerInViewFilter OpenEntityManagerInViewInterceptor OpenPersistenceManagerInViewFilter OpenPersistenceManagerInViewInterceptor OpenSessionInViewFilter OpenSessionInViewFilter OpenSessionInViewInterceptor OpenSessionInViewInterceptor OptimisticLockingFailureException OptionsTag OptionTag OptionWriter OracleLobHandler OracleLobHandler.LobCallback OracleSequenceMaxValueIncrementer Order OrderComparator Ordered PagedListHolder PagedListSourceProvider ParameterDisposer ParameterHandlerMapping ParameterizableViewController ParameterizableViewController ParameterizedRowMapper ParameterMapper ParameterMappingInterceptor ParameterMethodNameResolver ParameterNameDiscoverer ParsedSql ParserContext ParseState ParseState.Entry PassThroughSourceExtractor PasswordInputTag PathMap PathMatcher PathMatchingResourcePatternResolver PatternMatchUtils PerformanceMonitorInterceptor PerformanceMonitorListener Perl5RegexpMethodPointcut PermissionDeniedDataAccessException PersistenceAnnotationBeanPostProcessor PersistenceExceptionTranslationAdvisor PersistenceExceptionTranslationInterceptor PersistenceExceptionTranslationPostProcessor PersistenceExceptionTranslator PersistenceManagerFactoryUtils PersistenceManagerHolder PersistenceUnitManager PersistenceUnitPostProcessor PersistenceUnitReader PessimisticLockingFailureException PlatformTransactionManager PluggableSchemaResolver Pointcut PointcutAdvisor PointcutComponentDefinition PointcutEntry Pointcuts PoolingConfig PortletApplicationContextUtils PortletApplicationObjectSupport PortletConfigAware PortletContentGenerator PortletContextAware PortletContextAwareProcessor PortletContextResource PortletContextResourceLoader PortletContextResourcePatternResolver PortletModeHandlerMapping PortletModeNameViewController PortletModeParameterHandlerMapping PortletMultipartResolver PortletRequestAttributes PortletRequestBindingException PortletRequestDataBinder PortletRequestHandledEvent PortletRequestParameterPropertyValues PortletRequestUtils PortletRequestWrapper PortletSessionRequiredException PortletUtils PortletWebRequest PortletWrappingController PostgreSQLSequenceMaxValueIncrementer PreferencesPlaceholderConfigurer PreparedStatementCallback PreparedStatementCreator PreparedStatementCreatorFactory PreparedStatementSetter PrioritizedParameterNameDiscoverer Problem ProblemReporter ProducerCallback Propagation PropertiesBeanDefinitionReader PropertiesEditor PropertiesFactoryBean PropertiesLoaderSupport PropertiesLoaderUtils PropertiesMethodNameResolver PropertiesPersister PropertyAccessException PropertyAccessor PropertyAccessorUtils PropertyBatchUpdateException PropertyComparator PropertyEditorRegistrar PropertyEditorRegistry PropertyEditorRegistrySupport PropertyEntry PropertyMatches PropertyOverrideConfigurer PropertyPathFactoryBean PropertyPlaceholderConfigurer PropertyResourceConfigurer PropertyValue PropertyValues PropertyValuesEditor PrototypeAspectInstanceFactory PrototypeTargetSource ProxyConfig ProxyFactory ProxyFactoryBean ProxyMethodInvocation QuartzJobBean QuickTargetSourceCreator RadioButtonTag RdbmsOperation ReaderContext ReaderEventListener RecordCreator RecordExtractor RecordTypeNotSupportedException RedirectView ReflectionUtils ReflectionUtils.FieldCallback ReflectionUtils.FieldFilter ReflectionUtils.MethodCallback ReflectionUtils.MethodFilter ReflectiveAspectJAdvisorFactory ReflectiveAspectJAdvisorFactory.SyntheticInstantiationAdvisor ReflectiveLoadTimeWeaver ReflectiveMethodInvocation ReflectiveVisitorHelper Refreshable RefreshablePagedListHolder RefreshableScriptTargetSource RegexpMethodPointcutAdvisor ReloadableResourceBundleMessageSource RemoteAccessException RemoteAccessor RemoteConnectFailureException RemoteExporter RemoteInvocation RemoteInvocationBasedAccessor RemoteInvocationBasedExporter RemoteInvocationExecutor RemoteInvocationFactory RemoteInvocationResult RemoteInvocationTraceInterceptor RemoteInvocationUtils RemoteLookupFailureException RemoteProxyFailureException RemoteStatelessSessionBeanDefinitionParser ReplaceOverride Repository RequestAttributes RequestContext RequestContextAwareTag RequestContextFilter RequestContextHolder RequestContextListener RequestContextUtils RequestHandledEvent RequestScope RequestToViewNameTranslator RequestUtils Required RequiredAnnotationBeanPostProcessor Resource ResourceAllocationException ResourceArrayPropertyEditor ResourceBundleEditor ResourceBundleMessageSource ResourceBundleThemeSource ResourceBundleViewResolver ResourceEditor ResourceEditorRegistrar ResourceEntityResolver ResourceFactoryBean ResourceHolderSupport ResourceJobSchedulingDataProcessor ResourceLoader ResourceLoaderAware ResourceMapFactoryBean ResourceOverridingShadowingClassLoader ResourcePatternResolver ResourcePatternUtils ResourceScriptSource ResourceServlet ResourceUtils ResponseTimeMonitor ResponseTimeMonitorImpl ResultSetExtractor ResultSetSupportingSqlParameter ResultSetWrappingSqlRowSet ResultSetWrappingSqlRowSetMetaData RmiBasedExporter RmiClientInterceptor RmiClientInterceptorUtils RmiInvocationHandler RmiInvocationWrapper RmiProxyFactoryBean RmiRegistryFactoryBean RmiServiceExporter RollbackRuleAttribute RootBeanDefinition RootClassFilter RowCallbackHandler RowCountCallbackHandler RowMapper RowMapperResultSetExtractor RuleBasedTransactionAttribute RuntimeBeanNameReference RuntimeBeanReference RuntimeTestWalker SavepointManager ScheduledExecutorFactoryBean ScheduledExecutorTask ScheduledTimerListener ScheduledTimerTask SchedulerContextAware SchedulerFactoryBean SchedulingAwareRunnable SchedulingException SchedulingTaskExecutor Scope ScopedBeanInterceptor ScopedObject ScopedProxyBeanDefinitionDecorator ScopedProxyFactoryBean ScriptBeanDefinitionParser ScriptCompilationException ScriptFactory ScriptFactoryPostProcessor ScriptSource SelectedValueComparator SelectTag SelfNaming ServerSessionFactory ServerSessionFactory ServerSessionMessageListenerContainer ServerSessionMessageListenerContainer102 ServiceLocatorFactoryBean ServletConfigAware ServletContextAttributeExporter ServletContextAttributeFactoryBean ServletContextAware ServletContextAwareProcessor ServletContextFactoryBean ServletContextParameterFactoryBean ServletContextPropertyPlaceholderConfigurer ServletContextRequestLoggingFilter ServletContextResource ServletContextResourceLoader ServletContextResourcePatternResolver ServletEndpointSupport ServletForwardingController ServletRequestAttributes ServletRequestBindingException ServletRequestDataBinder ServletRequestHandledEvent ServletRequestParameterPropertyValues ServletRequestUtils ServletWebRequest ServletWrappingController SessionAwareMessageListener SessionBrokerSessionFactory SessionCallback SessionFactory SessionFactoryUtils SessionFactoryUtils SessionFactoryUtils SessionHolder SessionHolder SessionHolder SessionLocaleResolver SessionReadCallback SessionScope SessionThemeResolver SetFactoryBean ShadowingClassLoader SharedEntityManagerBean SharedEntityManagerCreator ShortCodedLabeledEnum SimpleApplicationEventMulticaster SimpleAsyncTaskExecutor SimpleConnectionHandle SimpleControllerHandlerAdapter SimpleControllerHandlerAdapter SimpleFormController SimpleFormController SimpleHttpInvokerRequestExecutor SimpleInstantiationStrategy SimpleInstrumentableClassLoader SimpleJdbcDaoSupport SimpleJdbcOperations SimpleJdbcTemplate SimpleLoadTimeWeaver SimpleLocaleContext SimpleMailMessage SimpleMappingExceptionResolver SimpleMappingExceptionResolver SimpleMessageConverter SimpleMessageConverter102 SimpleMessageListenerContainer SimpleMessageListenerContainer102 SimpleNamingContext SimpleNamingContextBuilder SimpleNativeJdbcExtractor SimplePortletHandlerAdapter SimplePortletPostProcessor SimplePropertyNamespaceHandler SimpleRecordOperation SimpleReflectiveMBeanInfoAssembler SimpleRemoteSlsbInvokerInterceptor SimpleRemoteStatelessSessionProxyFactoryBean SimpleSaxErrorHandler SimpleServerSessionFactory SimpleServletHandlerAdapter SimpleServletPostProcessor SimpleTheme SimpleThreadPoolTaskExecutor SimpleThrowawayClassLoader SimpleTraceInterceptor SimpleTransactionStatus SimpleTransformErrorListener SimpleTriggerBean SimpleTypeConverter SimpleUrlHandlerMapping SingleColumnRowMapper SingleConnectionDataSource SingleConnectionFactory SingleConnectionFactory SingleConnectionFactory102 SingleDataSourceLookup SingleSessionFactory SingletonAspectInstanceFactory SingletonBeanFactoryLocator SingletonBeanRegistry SingletonMetadataAwareAspectInstanceFactory SingletonTargetSource SmartDataSource SmartMimeMessage SmartSessionBean SmartTransactionObject SortDefinition SourceExtractor SpringBeanJobFactory SpringBindingActionForm SpringConfiguredBeanDefinitionParser SpringJtaSynchronizationAdapter SpringLobCreatorSynchronization SpringModelMBean SpringPersistenceUnitInfo SpringResourceLoader SpringSessionContext SpringSessionSynchronization SpringSessionSynchronization SpringTemplateLoader SpringVersion SqlCall SQLErrorCodes SQLErrorCodesFactory SQLErrorCodeSQLExceptionTranslator SQLExceptionTranslator SqlFunction SqlInOutParameter SqlLobValue SqlMapClientCallback SqlMapClientDaoSupport SqlMapClientFactoryBean SqlMapClientOperations SqlMapClientTemplate SqlOperation SqlOutParameter SqlParameter SqlParameterSource SqlProvider SqlQuery SqlReturnResultSet SqlReturnType SqlRowSet SqlRowSetMetaData SqlRowSetResultSetExtractor SQLStateSQLExceptionTranslator SqlTypeValue SqlUpdate SQLWarningException StatementCallback StatementCreatorUtils StaticApplicationContext StaticLabeledEnum StaticLabeledEnumResolver StaticListableBeanFactory StaticMessageSource StaticMethodMatcher StaticMethodMatcherPointcut StaticMethodMatcherPointcutAdvisor StaticPortletApplicationContext StaticScriptSource StaticWebApplicationContext StopWatch StopWatch.TaskInfo StoredProcedure StringArrayPropertyEditor StringCodedLabeledEnum StringMultipartFileEditor StringTrimmerEditor StringUtils StylerUtils SynchedLocalTransactionFailedException SyncTaskExecutor SystemPropertyUtils TagIdGenerator TagUtils TagWriter TargetSource TargetSourceCreator TaskExecutor TextareaTag Theme ThemeChangeInterceptor ThemeResolver ThemeSource ThemeTag ThreadLocalTargetSource ThreadLocalTargetSourceStats ThreadPoolTaskExecutor ThrowawayController ThrowawayControllerHandlerAdapter ThrowsAdvice ThrowsAdviceAdapter ThrowsAdviceInterceptor TilesConfigurer TilesJstlView TilesView TimerFactoryBean TimerManagerFactoryBean TimerTaskExecutor TomcatInstrumentableClassLoader TopLinkAccessor TopLinkCallback TopLinkDaoSupport TopLinkInterceptor TopLinkJdbcException TopLinkJpaDialect TopLinkJpaVendorAdapter TopLinkOperations TopLinkOptimisticLockingFailureException TopLinkQueryException TopLinkSystemException TopLinkTemplate TopLinkTransactionManager ToStringCreator ToStringStyler Transactional TransactionAspectSupport TransactionAttribute TransactionAttributeEditor TransactionAttributeSource TransactionAttributeSourceAdvisor TransactionAttributeSourceEditor TransactionAwareConnectionFactoryProxy TransactionAwareConnectionFactoryProxy TransactionAwareDataSourceConnectionProvider TransactionAwareDataSourceConnectionProvider TransactionAwareDataSourceProxy TransactionAwarePersistenceManagerFactoryProxy TransactionAwareSessionAdapter TransactionCallback TransactionCallbackWithoutResult TransactionDefinition TransactionException TransactionInProgressException TransactionInterceptor TransactionProxyFactoryBean TransactionRolledBackException TransactionStatus TransactionSuspensionNotSupportedException TransactionSynchronization TransactionSynchronizationAdapter TransactionSynchronizationManager TransactionSynchronizationUtils TransactionSystemException TransactionTemplate TransactionTimedOutException TransactionUsageException TransformerUtils TransformTag TrueClassFilter TrueMethodMatcher TruePointcut TxAdviceBeanDefinitionParser TxNamespaceHandler TxNamespaceUtils TypeConverter TypeConverterDelegate TypeDefinitionBean TypedStringValue TypeMismatchDataAccessException TypeMismatchException TypeMismatchNamingException TypePatternClassFilter UiApplicationContextUtils UnableToRegisterMBeanException UnableToSendNotificationException UncategorizedDataAccessException UncategorizedJmsException UncategorizedSQLException UnexpectedRollbackException UnionPointcut UnitOfWorkCallback UnknownAdviceTypeException UnsatisfiedDependencyException UpdatableSqlQuery UrlBasedRemoteAccessor UrlBasedViewResolver URLEditor UrlFilenameViewController UrlPathHelper UrlResource UserCredentialsConnectionFactoryAdapter UserCredentialsDataSourceAdapter UserRoleAuthorizationInterceptor UserRoleAuthorizationInterceptor UserTransactionAdapter UtilNamespaceHandler ValidationUtils Validator ValueFormatter ValueStyler VelocityConfig VelocityConfigurer VelocityEngineFactory VelocityEngineFactoryBean VelocityEngineUtils VelocityLayoutView VelocityLayoutViewResolver VelocityToolboxView VelocityView VelocityViewResolver View ViewRendererServlet ViewResolver WeakReferenceMonitor WeakReferenceMonitor.ReleaseListener WeavingTransformer WebApplicationContext WebApplicationContextUtils WebApplicationContextVariableResolver WebApplicationObjectSupport WebAppRootListener WebContentGenerator WebContentInterceptor WebDataBinder WebLogicJndiMBeanServerFactoryBean WebLogicJtaTransactionManager WebLogicMBeanServerFactoryBean WebLogicNativeJdbcExtractor WebLogicServerTransactionManagerFactoryBean WebRequest WebRequestHandlerInterceptorAdapter WebRequestHandlerInterceptorAdapter WebRequestInterceptor WebSphereNativeJdbcExtractor WebSphereTransactionManagerFactoryBean WebUtils WorkManagerTaskExecutor XAPoolNativeJdbcExtractor XmlBeanDefinitionParser XmlBeanDefinitionReader XmlBeanFactory XmlPortletApplicationContext XmlReaderContext XmlValidationModeDetector XmlViewResolver XmlWebApplicationContext XsltView XsltViewResolver
META-INF/MANIFEST.MF META-INF/license.txt org.springframework.remoting.caucho.BurlapClientInterceptor.class org.springframework.remoting.caucho.BurlapProxyFactoryBean.class org.springframework.remoting.caucho.BurlapServiceExporter.class org.springframework.remoting.caucho.Hessian1SkeletonInvoker.class org.springframework.remoting.caucho.Hessian2SkeletonInvoker.class org.springframework.remoting.caucho.HessianClientInterceptor.class org.springframework.remoting.caucho.HessianProxyFactoryBean.class org.springframework.remoting.caucho.HessianServiceExporter.class org.springframework.remoting.caucho.HessianSkeletonInvoker.class org.springframework.remoting.httpinvoker.AbstractHttpInvokerRequestExecutor.class org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor.class org.springframework.remoting.httpinvoker.HttpInvokerClientConfiguration.class org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor.class org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean.class org.springframework.remoting.httpinvoker.HttpInvokerRequestExecutor.class org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter.class org.springframework.remoting.httpinvoker.SimpleHttpInvokerRequestExecutor.class org.springframework.remoting.jaxrpc.JaxRpcPortClientInterceptor.class org.springframework.remoting.jaxrpc.JaxRpcPortProxyFactoryBean.class org.springframework.remoting.jaxrpc.JaxRpcServicePostProcessor.class org.springframework.remoting.jaxrpc.JaxRpcSoapFaultException.class org.springframework.remoting.jaxrpc.LocalJaxRpcServiceFactory.class org.springframework.remoting.jaxrpc.LocalJaxRpcServiceFactoryBean.class org.springframework.remoting.jaxrpc.ServletEndpointSupport.class org.springframework.remoting.jaxrpc.support.AxisBeanMappingServicePostProcessor.class org.springframework.remoting.jaxws.JaxWsPortClientInterceptor.class org.springframework.remoting.jaxws.JaxWsPortProxyFactoryBean.class org.springframework.remoting.jaxws.JaxWsSoapFaultException.class org.springframework.remoting.jaxws.LocalJaxWsServiceFactory.class org.springframework.remoting.jaxws.LocalJaxWsServiceFactoryBean.class org.springframework.remoting.jaxws.SimpleJaxWsServiceExporter.class org.springframework.web.HttpRequestHandler.class org.springframework.web.HttpRequestMethodNotSupportedException.class org.springframework.web.HttpSessionRequiredException.class org.springframework.web.bind.EscapedErrors.class org.springframework.web.bind.MissingServletRequestParameterException.class org.springframework.web.bind.RequestUtils.class org.springframework.web.bind.ServletRequestBindingException.class org.springframework.web.bind.ServletRequestDataBinder.class org.springframework.web.bind.ServletRequestParameterPropertyValues.class org.springframework.web.bind.ServletRequestUtils.class org.springframework.web.bind.WebDataBinder.class org.springframework.web.bind.annotation.InitBinder.class org.springframework.web.bind.annotation.ModelAttribute.class org.springframework.web.bind.annotation.RequestMapping.class org.springframework.web.bind.annotation.RequestMethod.class org.springframework.web.bind.annotation.RequestParam.class org.springframework.web.bind.annotation.SessionAttributes.class org.springframework.web.bind.support.ConfigurableWebBindingInitializer.class org.springframework.web.bind.support.DefaultSessionAttributeStore.class org.springframework.web.bind.support.SessionAttributeStore.class org.springframework.web.bind.support.SessionStatus.class org.springframework.web.bind.support.SimpleSessionStatus.class org.springframework.web.bind.support.WebBindingInitializer.class org.springframework.web.context.ConfigurableWebApplicationContext.class org.springframework.web.context.ContextLoader.class org.springframework.web.context.ContextLoaderListener.class org.springframework.web.context.ContextLoaderServlet.class org.springframework.web.context.ServletConfigAware.class org.springframework.web.context.ServletContextAware.class org.springframework.web.context.WebApplicationContext.class org.springframework.web.context.request.AbstractRequestAttributes.class org.springframework.web.context.request.AbstractRequestAttributesScope.class org.springframework.web.context.request.Log4jNestedDiagnosticContextInterceptor.class org.springframework.web.context.request.RequestAttributes.class org.springframework.web.context.request.RequestContextHolder.class org.springframework.web.context.request.RequestContextListener.class org.springframework.web.context.request.RequestScope.class org.springframework.web.context.request.ServletRequestAttributes.class org.springframework.web.context.request.ServletWebRequest.class org.springframework.web.context.request.SessionScope.class org.springframework.web.context.request.WebRequest.class org.springframework.web.context.request.WebRequestInterceptor.class org.springframework.web.context.support.AbstractRefreshableWebApplicationContext.class org.springframework.web.context.support.ContextExposingHttpServletRequest.class org.springframework.web.context.support.GenericWebApplicationContext.class org.springframework.web.context.support.HttpRequestHandlerServlet.class org.springframework.web.context.support.PerformanceMonitorListener.class org.springframework.web.context.support.RequestHandledEvent.class org.springframework.web.context.support.ServletContextAttributeExporter.class org.springframework.web.context.support.ServletContextAttributeFactoryBean.class org.springframework.web.context.support.ServletContextAwareProcessor.class org.springframework.web.context.support.ServletContextFactoryBean.class org.springframework.web.context.support.ServletContextParameterFactoryBean.class org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer.class org.springframework.web.context.support.ServletContextResource.class org.springframework.web.context.support.ServletContextResourceLoader.class org.springframework.web.context.support.ServletContextResourcePatternResolver.class org.springframework.web.context.support.ServletRequestHandledEvent.class org.springframework.web.context.support.StaticWebApplicationContext.class org.springframework.web.context.support.WebApplicationContextUtils.class org.springframework.web.context.support.WebApplicationObjectSupport.class org.springframework.web.context.support.XmlWebApplicationContext.class org.springframework.web.filter.AbstractRequestLoggingFilter.class org.springframework.web.filter.CharacterEncodingFilter.class org.springframework.web.filter.CommonsRequestLoggingFilter.class org.springframework.web.filter.DelegatingFilterProxy.class org.springframework.web.filter.GenericFilterBean.class org.springframework.web.filter.Log4jNestedDiagnosticContextFilter.class org.springframework.web.filter.OncePerRequestFilter.class org.springframework.web.filter.RequestContextFilter.class org.springframework.web.filter.ServletContextRequestLoggingFilter.class org.springframework.web.jsf.DecoratingNavigationHandler.class org.springframework.web.jsf.DelegatingNavigationHandlerProxy.class org.springframework.web.jsf.DelegatingPhaseListenerMulticaster.class org.springframework.web.jsf.DelegatingVariableResolver.class org.springframework.web.jsf.FacesContextUtils.class org.springframework.web.jsf.SpringBeanVariableResolver.class org.springframework.web.jsf.WebApplicationContextVariableResolver.class org.springframework.web.jsf.el.SpringBeanFacesELResolver.class org.springframework.web.jsf.el.WebApplicationContextFacesELResolver.class org.springframework.web.multipart.MaxUploadSizeExceededException.class org.springframework.web.multipart.MultipartException.class org.springframework.web.multipart.MultipartFile.class org.springframework.web.multipart.MultipartHttpServletRequest.class org.springframework.web.multipart.MultipartResolver.class org.springframework.web.multipart.commons.CommonsFileUploadSupport.class org.springframework.web.multipart.commons.CommonsMultipartFile.class org.springframework.web.multipart.commons.CommonsMultipartResolver.class org.springframework.web.multipart.support.AbstractMultipartHttpServletRequest.class org.springframework.web.multipart.support.ByteArrayMultipartFileEditor.class org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest.class org.springframework.web.multipart.support.MultipartFilter.class org.springframework.web.multipart.support.StringMultipartFileEditor.class org.springframework.web.util.CookieGenerator.class org.springframework.web.util.ExpressionEvaluationUtils.class org.springframework.web.util.HtmlCharacterEntityDecoder.class org.springframework.web.util.HtmlCharacterEntityReferences.class org.springframework.web.util.HtmlUtils.class org.springframework.web.util.HttpSessionMutexListener.class org.springframework.web.util.IntrospectorCleanupListener.class org.springframework.web.util.JavaScriptUtils.class org.springframework.web.util.Log4jConfigListener.class org.springframework.web.util.Log4jConfigServlet.class org.springframework.web.util.Log4jWebConfigurer.class org.springframework.web.util.NestedServletException.class org.springframework.web.util.TagUtils.class org.springframework.web.util.UrlPathHelper.class org.springframework.web.util.WebAppRootListener.class org.springframework.web.util.WebUtils.class org/springframework/web/context/ContextLoader.properties org/springframework/web/util/HtmlCharacterEntityReferences.properties

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值