您的位置:首页 > 其它

一起写框架-MVC框架-基础功能-Date类型数据绑定(七)

2017-11-16 14:44 344 查看

实现功能

表单请求传递的数据,格式为以下格式的日期时间数据。

(1):yyyy-MM-dd hh:mm:ss

(2):yyyy-MM-dd

执行方法可以使用Date类型接收。

实现思路

1.获得表单字符串。判断是否符合Date的格式。使用DataFormat转成成Date。

实现代码

1.原来数据绑定的代码都堆在ControllerRelolver,这样导致ControllerRelolver臃肿了。所以创建一个DataBind数据绑定类,将数据绑定的代码移进里面。

package ioc.webmvc.impl;

import java.lang.reflect.Parameter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import ioc.webmvc.annotation.Param;

public class DataBind {
/**
* 绑定作用域对象
* @param typeClass
* @param request
* @param response
* @param session
* @param application
* @return
*/
public static Object bindScope(Class<?> typeClass, HttpServletRequest request, HttpServletResponse response,
HttpSession session, ServletContext application) {
if (ServletRequest.class.isAssignableFrom(typeClass)) {
return request;
} else if (ServletResponse.class.isAssignableFrom(typeClass)) {
return response;
} else if (HttpSession.class.isAssignableFrom(typeClass)) {
return session;
} else if (ServletContext.class.isAssignableFrom(typeClass)) {
return application;
}
return null;
}

/**
* 绑定基础数据类型
*
* @param typeClass
* @param parameter
* @param request
* @return
*/
public static Object bindBasicData(Class<?> typeClass, Parameter parameter, HttpServletRequest request) {
Param param = parameter.getAnnotation(Param.class);
if (param == null) {
throw new RuntimeException("自定义参数没有使用@Param注解绑定");
}
System.out.println(param.value());
// 获得参数值
String parameterValue = request.getParameter(param.value());

if (String.class.isAssignableFrom(typeClass)) {
// 4.判断基础数据类型的String类型
return request.getParameter(param.value());
} else if (Long.class.isAssignableFrom(typeClass)) {
// 5.判断基础数据类型的Long类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Long.valueOf(parameterValue);
}

} else if (Integer.class.isAssignableFrom(typeClass)) {
// 6.判断基础数据类型的Integer类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Integer.valueOf(parameterValue);
}

} else if (Double.class.isAssignableFrom(typeClass)) {
// 7.判断基础数据类型的Double类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Double.valueOf(parameterValue);
}

} else if (Float.class.isAssignableFrom(typeClass)) {
// 8.判断基础数据类型的Float类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Float.valueOf(parameterValue);
}

} else if (Boolean.class.isAssignableFrom(typeClass)) {
// 9.判断基础数据类型的Boolean类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Boolean.valueOf(parameterValue);
}

} else if (Character.class.isAssignableFrom(typeClass)) {
// 10.判断基础数据类型的Character类型
if (parameterValue != null && !"".equals(parameterValue)) {
String s = new String(parameterValue);
return s.toCharArray()[0];
}

} else if (Short.class.isAssignableFrom(typeClass)) {
// 11.判断基础数据类型的Short类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Short.valueOf(parameterValue);
}

} else if (Byte.class.isAssignableFrom(typeClass)) {
// 12.判断基础数据类型的Byte类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Byte.valueOf(parameterValue);
}
} else if (long.class.isAssignableFrom(typeClass)) {
// 5.判断基础数据类型的long类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Long.valueOf(parameterValue);
} else {
return 0;
}

} else if (int.class.isAssignableFrom(typeClass)) {
// 6.判断基础数据类型的int类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Integer.valueOf(parameterValue);
} else {
return 0;
}

} else if (double.class.isAssignableFrom(typeClass)) {
// 7.判断基础数据类型的double类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Double.valueOf(parameterValue);
} else {
return 0.0;
}

} else if (float.class.isAssignableFrom(typeClass)) {
// 8.判断基础数据类型的float类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Float.valueOf(parameterValue);
} else {
return 0.0f;
}

} else if (boolean.class.isAssignableFrom(typeClass)) {
// 9.判断基础数据类型的boolean类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Boolean.valueOf(parameterValue);
} else {
return true;
}

} else if (char.class.isAssignableFrom(typeClass)) {

// 10.判断基础数据类型的char类型
if (parameterValue != null && !"".equals(parameterValue)) {
String s = new String(parameterValue);
return s.toCharArray()[0];
} else {
return ' ';
}

} else if (short.class.isAssignableFrom(typeClass)) {
// 11.判断基础数据类型的short类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Short.valueOf(parameterValue);
} else {
return 0;
}

} else if (byte.class.isAssignableFrom(typeClass)) {

// 12.判断基础数据类型的byte类型
if (parameterValue != null && !"".equals(parameterValue)) {
return Byte.valueOf(parameterValue);
} else {
return 0;
}

}
return null;

}

/**
* 绑定日期类型,默认支持的格式为: 1.yyyy-mm-dd hh:mm:ss 2.yyyy-mm-dd
*
* @param typeClass
* @param parameter
* @param request
* @return
*/
public static Object bindDate(Class<?> typeClass, Parameter parameter, HttpServletRequest request) {
if (Date.class.isAssignableFrom(typeClass)) {

// 10.判断基础数据类型的char类型
Param param = parameter.getAnnotation(Param.class);
System.out.println("--绑定字段名 :" + param.value());
String parameterValue = request.getParameter(param.value());
String pattern = null;

if (parameterValue != null && !"".equals(parameterValue)) {
if (parameterValue.lastIndexOf(":") > 0) {
pattern = "yyyy-MM-dd hh:mm:ss";
} else {
pattern = "yyyy-MM-dd";
}
SimpleDateFormat format = new SimpleDateFormat(pattern);

try {
return format.parse(parameterValue);
} catch (ParseException e) {
e.printStackTrace();
}
}

}
return null;
}

}


2.修改ControllerRelolver类的绑定参数的方法getparameterObjects

private Object[] getparameterObjects(Parameter[] parameters) {
// 1.创建设置一个参数对象的数组,参数的格式和参数类型的个一致
Object[] parameterObjects = new Object[parameters.length];
//2.根据参数的类型,将对于的对象填在对象数组中
for(int i=0;i<parameters.length;i++){

Class<?> typeClass = parameters[i].getType();
//3.根据判断方法参数的类型和我们制定的4个作用是否是父子类关系。如果是就赋值
//---绑定域对象request,reponse,session,application
Object scopeData = DataBind.bindScope(typeClass, request, response, session, application);
//---绑定基础数据类型------------------------------
if(scopeData!=null){
parameterObjects[i]=scopeData;
continue;
}
Object basicData = DataBind.bindBasicData(typeClass, parameters[i], request);
if(basicData!=null){
parameterObjects[i]=basicData;
continue;
}
//---绑定日期格式-------
Object dateData =DataBind.bindDate(typeClass, parameters[i], request);
if(dateData!=null){
parameterObjects[i]=dateData;
continue;
}
//---绑定数组数据
Object arrayData = DataBind.bindArray(typeClass, parameters[i], request);
if(arrayData!=null){
parameterObjects[i]=arrayData;
continue;
}

}
return parameterObjects;
}


测试代码

1.测试目录



1.测试页面代码

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
用户注册
<form action="${pageContext.request.contextPath }/register.do" method="post">
用户名:<input name="username" type="text" /><br/>
密码:  <input name="password" type="text" /><br/>
年龄:    <input name="age" type="text" /><br/>
出生日期:   <input name="date" type="date"><br/>
<input type="submit" value="注册">
</form>
</body>
</html>


2.测试的Controller代码

/**
* 注册页面
* @param username
* @param password
* @return
*/
@RequestMapping(value = "/register")
public String register(@Param("username") String username,@Param("password") String password ,@Param("age") long age,HttpServletRequest request,@Param("date") Date date){
System.out.println("用户名:"+username+",密码:"+password+",年龄"+age);
System.out.println(request.getRequestURI());
System.out.println(date);
return "redirect:/register.jsp";
}


3.测试结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: