聊一下我为什么会写这个功能:之前我一直都是在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输入的值生成新增语句: