spring参数绑定源码(spring源码讲解)
本文目录一览:
- 1、springmvc可以绑定哪些参数
- 2、spring中配置MySql数据源,怎样配置数据库信息
- 3、springmvc Date类型数据绑定
- 4、springmvc参数绑定是怎么实现的
- 5、springmvc是怎么将页面参数去绑定模型层的自定义类的
- 6、请问springMVC中,自定义参数绑定,怎么确定那个参数要转换的
springmvc可以绑定哪些参数
(1)请求spring参数绑定源码的参数按名称匹配spring参数绑定源码的方式绑定到入参中,返回字符串代表逻辑视图名
@RequestParam 用来请求request中spring参数绑定源码的参数,相当于request.getParameter() 其中有三个属性spring参数绑定源码:
value用来指定要取得参数的key;required 所取的参数是否必须存在,如果true表示必须存在,若不存在则抛出异常;default 指定该value的默认值
这一种方式说明参数是URL的一部分,此时也可以去掉@RequestParam,直接写参数就可以了
public String handle1(String userName, String password, String realName)
(2)将cookie的值及报文头部属性绑定到入参,方法返回ModelAndView
(3)请求的参数按名称匹配的方式绑定到 user 属性中,返回字符串代表逻辑视图名
按“HTTP请求参数名= 命令/表单对象的属性名”的规则,自动绑定请求数据,自动进行基本类型数据转换
(4) 直接使用Servlet API 对象作为处理方法的入参,返回字符串代表逻辑视图名
(5)以REST技术向springMVC传递参数使用占位符
用@PathVariable来把占位符参数绑定到控制器处理方法的入参中
注意:占位符中的{xxx}要和@PathVariable("xxx")的名字一样
(6)还可以使用一些其他的参数,如IO流等
spring中配置MySql数据源,怎样配置数据库信息
spring中配置数据源的几种常见方式:
#mysql 数据库配置(jdbc.properties)
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/databaseName?useUnicode=truecharacterEncoding=UTF-8
jdbc.username=root
jdbc.password=root
1.使用spring自带的数据源org.springframework.jdbc.datasource.DriverManagerDataSource;
方式一:
bean id="propertyConfigurer" class="194a-f433-08ea-e3f6 org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="/WEB-INF/jdbc.properties" /
bean id="dataSource" class="f433-08ea-e3f6-ad96 org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" /
p标记需要:xmlns:p=""
DriverManagerDataSource源码实现:
public class DriverManagerDataSource extends AbstractDriverBasedDataSource {
public DriverManagerDataSource() {
}
public DriverManagerDataSource(String url) {
}
public DriverManagerDataSource(String url, String username, String password) {
}
public DriverManagerDataSource(String url, Properties conProps) {
}
public void setDriverClassName(String driverClassName) {
}
protected Connection getConnectionFromDriver(Properties props) throws SQLException {
}
protected Connection getConnectionFromDriverManager(String url, Properties props) throws SQLException {
}
}
方式二:
bean id="dataSource" class="08ea-e3f6-ad96-ef7a org.springframework.jdbc.datasource.DriverManagerDataSource"
property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /
property name="url" value="jdbc:oracle:thin:@127.0.0.1:1521:ORCL" /
property name="username" value="root" /
property name="password" value="root" /
/bean
2.DBCP数据源;
DBCP(DataBase connection pool)。是 apache 上的一个 java 连接池项目,也是 tomcat 使用的连接池组件。单独使用dbcp需要2个包:commons-dbcp.jar,commons-pool.jar由于建立数据库连接是一个非常耗时耗资源的行为,所以通过连接池预先同数据库建立一些连接,放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完后再放回去。
bean id="dataSource" destroy-method="close" class="e3f6-ad96-ef7a-ef55 org.apache.commons.dbcp.BasicDataSource"
property name="driverClassName" value="${jdbc.driverClassName}" /
property name="url" value="${jdbc.url}" /
property name="username" value="${jdbc.username}" /
property name="password" value="${jdbc.password}" /
/bean
DBCP实现:
class JdbcUtil
{
private static BasicDataSource bds;
static
{
if(bds==null)
{
bds= new BasicDataSource();
}
//分别设置数据库的连接参数
bds.setDriverClassName();
bds.setUrl();
bds.setUsername();
bds.setPassword();
}
public static Connection getConnection()
{
return bds.getConnection();
}
3.C3P0数据源;
C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的有Hibernate,Spring等。
依赖jar包:c3p0-0.9.1.jar、c3p0-0.9.1.2.jar、c3p0-0.9.1-pre6.jar
c3p0与dbcp区别:
dbcp没有自动回收空闲连接的功能
c3p0有自动回收空闲连接功能
bean id="dataSource" class="ad96-ef7a-ef55-a548 com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"
property name="driverClass"valueoracle.jdbc.driver.OracleDriver/value/property
property name="jdbcUrl"valuejdbc:oracle:thin:@localhost:1521:Test/value/property
property name="user"valueroot/value/property
property name="password"valueroot/value/property
!--连接池中保留的最小连接数。--
property name="minPoolSize" value="10" /
!--连接池中保留的最大连接数。Default: 15 --
property name="maxPoolSize" value="100" /
!--最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --
property name="maxIdleTime" value="1800" /
!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --
property name="acquireIncrement" value="3" /
property name="maxStatements" value="1000" /
property name="initialPoolSize" value="10" /
!--每60秒检查所有连接池中的空闲连接。Default: 0 --
property name="idleConnectionTestPeriod" value="60" /
!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --
property name="acquireRetryAttempts" value="30" /
property name="breakAfterAcquireFailure" value="true" /
property name="testConnectionOnCheckout" value="false" /
/bean
4.JNDI数据源;
如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身
提供的数据源。应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的
JndiObjectFactoryBean类。下面是一个简单的配置:
方式一:
bean id="dataSource" class="ef7a-ef55-a548-8ca6 org.springframework.jndi.JndiObjectFactoryBean"
property name="jndiName" value="java:comp/env/jdbc/bbt"/
/bean
value值即JNDI的名称
方式二:
bean id="queueTarget" class="ef55-a548-8ca6-d4a6 org.springframework.jndi.JndiObjectTargetSource"
property name="jndiName"
valuequeue/testQueue/value
/property
/bean
方式三:
如果不使用JndiTemplate实现InitialContext环境变量的配置,则需要jndi.properties文件(放在classpath中,一般放在src下面),内容如下
java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
方式四:
使用JndiTemplate实现InitialContext环境变量的配置,例如
bean id="queueTarget" class="a548-8ca6-d4a6-16b0 org.springframework.jndi.JndiObjectTargetSource"
property name="jndiName"
valuequeue/testQueue/value
/property
property name="jndiTemplate"
ref local="jndiTemplate"/
/property
/bean
bean id="jndiTemplate" class="8ca6-d4a6-16b0-c9e8 org.springframework.jndi.JndiTemplate"
property name="environment"
props
prop key="java.naming.factory.initial"org.jnp.interfaces.NamingContextFactory/prop
prop key="java.naming.provider.url"jnp://localhost:1099/prop
prop key="java.naming.factory.url.pkgs"org.jboss.naming:org.jnp.interfaces/prop
/props
/property
/bean
springmvc Date类型数据绑定
在Spring MVC中,我们可以通过WebDataBinder来注册自定义的PropertyEditor,从而添加对应的请求参数绑定。有两种方式:
1、使用@InitBinder注解@Controller中的方法 2、自定义WebBindingInitializer来提供一个全局的数据绑定规则。
1、使用@InitBinder注解
[java] view plain copy 在CODE上查看代码片派生到我的代码片
@InitBinder
public void initBinder(WebDataBinder binder){
binder.registerCustomEditor(Date.class, new DateEditor());
}
[java] view plain copy 在CODE上查看代码片派生到我的代码片
public class DateEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = null;
try {
date = format.parse(text);
} catch (ParseException e) {
format = new SimpleDateFormat("yyyy-MM-dd");
try {
date = format.parse(text);
} catch (ParseException e1) {
e1.printStackTrace();
}
}
setValue(date);
}
}
这里我们将DateEditor提出来封装成一个类方便重用。
另外这里有个try...catch的小妙用,就是首先以"yyyy-MM-dd HH:mm:ss"的形式来解析用户输入的参数,若解析失败则转以"yyyy-MM-dd"的形式来解析。这样的逻辑就可以同时处理"yyyy-MM-dd HH:mm:ss"和"yyyy-MM-dd"形式的日期数据,我想在一般的中文系统中,这两种形式应该是最常用的了吧。
添加如上代码之后,@InitBinder所在的Controller就可以自动绑定日期类型的数据了,不过这仅仅是在该Controller中生效,若想在全局范围内生效的话,可以将@InitBinder注解所在的Controller定义为一个BaseController,其余Controller都继承这个Controller。当然还有另外的方法,若你有兴趣的话,请看2。
2、自定义WebBindingInitializer
[java] view plain copy 在CODE上查看代码片派生到我的代码片
public class MyWebBindingInitializer implements WebBindingInitializer {
@Override
public void initBinder(WebDataBinder binder, WebRequest request) {
binder.registerCustomEditor(Date.class, new DateEditor());
}
}
还是前面写的DateEditor,这么快又见面了,只不过注册的位置改变了,在WebBindingInitializer中注册的PropertyEditor是在全局范围内共享的。
不过光这样还不够,还要将WebBindingInitializer注入到AnnotationMethodHandlerAdapter中。
[html] view plain copy 在CODE上查看代码片派生到我的代码片
bean
class="d4a6-16b0-c9e8-113d org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"
property name="webBindingInitializer"
bean
class="16b0-c9e8-113d-3643 org.springframework.sam ples.petclinic.web.ClinicBindingInitializer" /
/property
/bean
如果是用mvc:annotation-driven /的童鞋,上面的配置就没效果了,而mvc命名空间也没提供如此细粒度的配置,怎么办呢?
别怕,方法还是有的,我们可以通过一个自定义PostBeanProcessor来处理:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if (bean instanceof RequestMappingHandlerAdapter) {
RequestMappingHandlerAdapter adapter = (RequestMappingHandlerAdapter) bean;
adapter.setWebBindingInitializer(new MyWebBindingInitializer());
}
return bean;
}
不过实际上mvc:annotation-driven /默认就为我们提供了一个WebBindingInitializer——ConfigurableWebBindingInitializer
而上面的方法则会覆盖默认的ConfigurableWebBindingInitializer,其实我们可以直接使用这个Bean来注册我们的PropertyEditor:
[java] view plain copy 在CODE上查看代码片派生到我的代码片
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
if(bean instanceof ConfigurableWebBindingInitializer){
ConfigurableWebBindingInitializer initializer = (ConfigurableWebBindingInitializer) bean;
initializer.setPropertyEditorRegistrar(new PropertyEditorRegistrar() {
@Override
public void registerCustomEditors(PropertyEditorRegistry registry) {
registry.registerCustomEditor(Date.class, new DateEditor());
}
});
}
return bean;
}
springmvc参数绑定是怎么实现的
在 SpringMVC 中,提交请求的数据是通过方法形参来接收的。从客户端请求的 key/value 数据,经过参数绑定,将 key/value 数据绑定到 Controller 的形参上,然后在 Controller 就可以直接使用该形参。
这里涉及到参数绑定组件,那么什么是参数组件,这里可以先理解为将请求的数据转换为我们需要的数据称为参数绑定组件,也就是参数绑定转换器。SpringMVC 内置了很多参数转换器,只有在极少数情况下需要我们自定义参数转换器。
springmvc是怎么将页面参数去绑定模型层的自定义类的
你可以在原码上打断点看一下,如下图,最终spring会调用“1.”处的方法进行参数解析与绑定。
然后,再调用“2.”处的方法反射调用controller中的方法
请问springMVC中,自定义参数绑定,怎么确定那个参数要转换的
public ModelAndView login (String userName) {
system.out.println(userName);
}
少量参数可以这么使用spring参数绑定源码,如果参数较多spring参数绑定源码,请使用对象。
如定义个User对象spring参数绑定源码,包含userNamespring参数绑定源码,password等spring参数绑定源码的get set方法。