-c rect redirect tex doc red form else jsp
需求:根据表单的字段名,如果和参数的变量名一致,并且类型兼容,那么将数据自动封装到对应的自动上。
包括的支持的数据类型有:
1.基础数据类型:long、int、double、float、char、byte、boolean、short
2.基础数据类型的包装类:Long、Integer、Double、Float、Character、Byte、Boolean、Short
3.字符串类型:String
这里有一个难点,由于低于JDK1.8的JDK是不支持直接获得参数名的。即使高于JDK1.8.也需要在编译时,添加`-parameters`参数或者启用调试模式`-g`。(麻烦)
JDK不支持,只能通过读取class 字节码来获得参数名。有兴趣的朋友自己看看asm 这个框架。
- package ioc.webmvc.annotation;
- import java.lang.annotation.Documented;
- import java.lang.annotation.ElementType;
- import java.lang.annotation.Retention;
- import java.lang.annotation.RetentionPolicy;
- import java.lang.annotation.Target;
- /**
- *
- * @author ranger
- * @date 2017-11-09
- *
- */
- @Retention(RetentionPolicy.RUNTIME)@Target(value = {
- ElementType.METHOD,
- ElementType.PARAMETER
- })@Documented public@interface Param {
- /**
- * 指定表单参数的对应的字段名
- * @return
- */
- String value()
- default "";
- }
- 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个作用是否是父子类关系。如果是就赋值
- //---判断ServletAPI的对象request,reponse,session,application
- if (ServletRequest.class.isAssignableFrom(typeClass)) {
- parameterObjects[i] = this.request;
- } else if (ServletResponse.class.isAssignableFrom(typeClass)) {
- parameterObjects[i] = this.response;
- } else if (HttpSession.class.isAssignableFrom(typeClass)) {
- parameterObjects[i] = this.session;
- } else if (ServletContext.class.isAssignableFrom(typeClass)) {
- parameterObjects[i] = this.application;
- }
- //-----增加对象基础数据类型已经包装类的判断-------
- else if (String.class.isAssignableFrom(typeClass)) {
- //4.判断基础数据类型的String类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- parameterObjects[i] = request.getParameter(param.value());
- } else if (Long.class.isAssignableFrom(typeClass)) {
- //5.判断基础数据类型的Long类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Long.valueOf(parameter);
- } else {
- parameterObjects[i] = null;
- }
- } else if (Integer.class.isAssignableFrom(typeClass)) {
- //6.判断基础数据类型的Integer类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Integer.valueOf(parameter);
- } else {
- parameterObjects[i] = null;
- }
- } else if (Double.class.isAssignableFrom(typeClass)) {
- //7.判断基础数据类型的Double类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Double.valueOf(parameter);
- } else {
- parameterObjects[i] = null;
- }
- } else if (Float.class.isAssignableFrom(typeClass)) {
- //8.判断基础数据类型的Float类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Float.valueOf(parameter);
- } else {
- parameterObjects[i] = null;
- }
- } else if (Boolean.class.isAssignableFrom(typeClass)) {
- //9.判断基础数据类型的Boolean类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Boolean.valueOf(parameter);
- } else {
- parameterObjects[i] = null;
- }
- } else if (Character.class.isAssignableFrom(typeClass)) {
- //10.判断基础数据类型的Character类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- String s = new String(parameter);
- parameterObjects[i] = s.toCharArray()[0];
- } else {
- parameterObjects[i] = null;
- }
- } else if (Short.class.isAssignableFrom(typeClass)) {
- //11.判断基础数据类型的Short类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Short.valueOf(parameter);
- } else {
- parameterObjects[i] = null;
- }
- } else if (Byte.class.isAssignableFrom(typeClass)) {
- //12.判断基础数据类型的Byte类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Byte.valueOf(parameter);
- } else {
- parameterObjects[i] = null;
- }
- } else if (long.class.isAssignableFrom(typeClass)) {
- //5.判断基础数据类型的long类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Long.valueOf(parameter);
- } else {
- parameterObjects[i] = 0;
- }
- } else if (int.class.isAssignableFrom(typeClass)) {
- //6.判断基础数据类型的int类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Integer.valueOf(parameter);
- } else {
- parameterObjects[i] = 0;
- }
- } else if (double.class.isAssignableFrom(typeClass)) {
- //7.判断基础数据类型的double类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Double.valueOf(parameter);
- } else {
- parameterObjects[i] = 0.0;
- }
- } else if (float.class.isAssignableFrom(typeClass)) {
- //8.判断基础数据类型的float类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Float.valueOf(parameter);
- } else {
- parameterObjects[i] = 0.0f;
- }
- } else if (boolean.class.isAssignableFrom(typeClass)) {
- //9.判断基础数据类型的boolean类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Boolean.valueOf(parameter);
- } else {
- parameterObjects[i] = true;
- }
- } else if (char.class.isAssignableFrom(typeClass)) {
- //10.判断基础数据类型的char类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- String s = new String(parameter);
- parameterObjects[i] = s.toCharArray()[0];
- } else {
- parameterObjects[i] = ‘‘;
- }
- } else if (short.class.isAssignableFrom(typeClass)) {
- //11.判断基础数据类型的short类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Short.valueOf(parameter);
- } else {
- parameterObjects[i] = 0;
- }
- } else if (byte.class.isAssignableFrom(typeClass)) {
- //12.判断基础数据类型的byte类型
- Param param = parameters[i].getAnnotation(Param.class);
- System.out.println(param.value());
- String parameter = request.getParameter(param.value());
- if (parameter != null && !"".equals(parameter)) {
- parameterObjects[i] = Byte.valueOf(parameter);
- } else {
- parameterObjects[i] = 0;
- }
- }
- }
- return parameterObjects;
- }
1.测试代码目录
2.测试页面
- <%@ 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 type="submit" value="注册">
- </form>
- </body>
- </html>
3UserController修改
- /**
- * 注册页面
- * @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) {
- System.out.println("用户名:" + username + ",密码:" + password + ",年龄" + age);
- System.out.println(request.getRequestURI());
- return "redirect:/register.jsp";
- }
4.测试结果
一起写框架-MVC框架-基础功能-简单数据类型参数绑定(六)
-c rect redirect tex doc red form else jsp
原文:http://www.cnblogs.com/zhuyuejiu/p/7820481.html
来源: http://www.bubuko.com/infodetail-2391552.html