获取from表单的name值生成新增语句

本文介绍了一种利用反射机制简化Servlet中参数处理的方法,通过映射方式直接将请求参数与对象属性对应,避免了繁琐的getParameter调用,提高了代码的可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

聊一下我为什么会写这个功能:之前我一直都是在servlet用request.getParameter()获取值页面传过来的name值,导致代码形成很长很长,我同学就跟我说:为什么不用反射去做这一部分的工作,当时我在想用反射去做,反射怎么做?我很懵,然后我就去问了下怎么个反射法,结果没听懂(可能我还是太年轻了),回到位置上,继续思考,想着想着就想到了在学C#好像用到过这种操作(就是在控制层接收浏览器请求时获取传过来的参数时,直接用一个对象来接收传过来name值,是通过映射的方式(前提是对象的属性要和name的名称一致)),然后就用着C#的这种方式去写了以下(这就是所谓的换汤不换药),然后就可以了。
接下来就是代码部分。
Jsp代码部分:

<body>  
	    <form action="/20190622/servlet/logintest?type=longin" method="post">  
	        <table>  
            <tr>  
                <td>用户名:</td>  
	                <td><input type="text" name="staffCode"/></td>  
            </tr>  
            <tr>  
	                <td>密码:</td>  
                <td><input type="password" name="password"/></td>  
	            </tr>  
	            <tr>  
	                <td>  
	                    <input type="submit" value="登录"/>  
	                </td>  
	            </tr>  
        </table>  
	  </form>  
</body>  

servlet代码部分:

public void doPost(HttpServletRequest request, HttpServletResponse response)  
          throws ServletException, IOException {  
        try {  
            response.setCharacterEncoding("utf-8");  
	            request.setCharacterEncoding("utf-8");  
        } catch (UnsupportedEncodingException e) {  
	            // TODO Auto-generated catch block  
            e.printStackTrace();  
	        }  
	        String type=request.getParameter("type");  
	        if(type.equals("longin")){  
	            longin(request,response);  
        }  
	    }  
	public void longin(HttpServletRequest request, HttpServletResponse response){  
	        //reful(类对象,请求,响应):获取from表单的name值  
        Map<String,String> map=reful(SYS_Staff.class,request,response);  
	        //generateSql(类对象,Map集合):生成新增语句  
	        String sql=generateSql(SYS_Staff.class,map);  
	        //打印结果  
	        System.out.println("Sql语句:"+sql);  
	    }  
	    //获取form表单传过来的值  
	public <T> Map<String,String> reful(Class<T> t,HttpServletRequest request, HttpServletResponse response){  
	        Map<String,String> map=new HashMap<String, String>();  
	        Class<?> clazz=t;  
	        Field[] aa=t.getDeclaredFields();  
	        for (Field field : aa) {  
	            String name=request.getParameter(field.getName());  
	            if(name!=null){  
	                map.put(field.getName(),name);  
	            }  
	        }  
	        return map;  
	    }  
	    //生成新增语句  
	public <T> String generateSql(Class<T> t,Map<String,String> map){  
	        if(map.isEmpty()){  
	            return null;  
	        }else{  
	            StringBuilder sql=new StringBuilder();  
	            sql.append("Insert into ").append(t.getSimpleName()).append('(');  
	            Set<String> set=map.keySet();  
	            //存储键的名字  
	            List<String> list=new ArrayList<String>();  
            //存储键的值  
	            List<String> list2=new ArrayList<String>();  
	            Iterator iter=set.iterator();  
	            //获取键拼接到sql语句中  
	            while (iter.hasNext()) {  
	                String str = (String) iter.next();  
	                sql.append(str).append(',');  
	                //保存键的值  
	                list2.add(map.get(str));  
	                list.add(str);  
            }  
	            sql.setCharAt(sql.length()-1, ')');  
	            sql.append(" values(");  
	            for (int i = 0; i < list.size(); i++) {  
	                String name=list.get(i);  
	                try {  
	                    Class<?> type=t.getDeclaredField(name).getType();  
	                    if(type.isAssignableFrom(int.class)||type.isAssignableFrom(Integer.class)){  
                        sql.append(list2.get(i)).append(',');  
	                    }else{  
	                        sql.append("'").append(list2.get(i)).append("',");  
                    }  
                } catch (NoSuchFieldException e) {  
	                    // TODO Auto-generated catch block  
	                    e.printStackTrace();  
	                } catch (SecurityException e) {  
	                    // TODO Auto-generated catch block  
	                    e.printStackTrace();  
                }  
	                  
	            }  
	            sql.setCharAt(sql.length()-1, ')');  
            return sql.toString();  
        }     
    }  

效果图:jsp页面输入的值
在这里插入图片描述
获取jsp输入的值生成新增语句:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值