WebUtil
原理:利用反射机制,根据参数名构造对象,完成属性赋值与对象创建
项目地址
欢迎去我的 Github 下载 servlet 包的代码
这个是在 javax-servlet 的基础上新增了一个 WebUtil 工具类
servlet-api_spec (点此跳转)
案例分析
在传统的 JavaWeb 开发中,会有很多类似这样子的前端请求,<form/> 表单会携带很多参数,然后要通过后端的服务器来逐一接收,这样子会很麻烦
<tr>
<td width="120" class="STYLE1">投资人登记编号:</td>
<td width="140" class="STYLE1"><input type="text" name="invrenum" value="" </td>
<td width="90" class="STYLE1">投资人名称:</td>
<td width="130" class="STYLE1" ><input type="text" name="invname" value="" </td>
<td width="60" nowrap class="STYLE1">登记日期:</td>
<td class="class1_td alignleft" nowrap>
<input type="text" name="startdate" value=""/>
<input onclick="setday(document.all.startdate);" type="image" value=" 选择日期 " name="button004" src="" align=""/>
~
<input type="text" name="enddate" value="" >
<input onclick="setday(document.all.enddate);" type="image" value=" 选择日期 " name="button004" src="" align=""/>
</td>
</tr>
到了后端就要逐一接收
到了后端,就会变成这样子
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String pageno = request.getParameter("pageno");
String xxxx1 = request.getParameter("xxxx");
String xxxx2 = request.getParameter("xxxx");
String xxxx3 = request.getParameter("xxxx");
String xxxx4 = request.getParameter("xxxx");
String xxxx5 = request.getParameter("xxxx");
String xxxx6 = request.getParameter("xxxx");
Enterprise enterprise = new Enterprise();
enterprise.setXxx1(xxx1);
enterprise.setXxx2(xxx2);
enterprise.setXxx3(xxx3);
enterprise.setXxx4(xxx4);
enterprise.setXxx5(xxx5);
}
一个对象中的属性要从 HttpServletRequest 中反复 getParameter("xxx"),代码就会显得非常多余和繁琐沉重
如何解决?
利用 WebUtil 实现对参数的自动封装,返回所需的对象即可
代码如下(可复制即用)
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Enumeration;
/**
* 原理:通过反射机制来实现对象的生成
* Author: chenjjia
* Date: 2021/11/11 13:05
* WeChat: China_JoJo_
*/
public class WebUtil {
/**
* 将前端传入的参数封装成一个对象然后返回到 Controller
* @param request:HttpServletRequest,内部包含了请求头带来的所有信息、参数等
* @param object 要返回的对象类型,通过反射构造此对象的属性
* @return
*/
public static Object makeRequestToObject(HttpServletRequest request,
Object object) {
Enumeration fieldNames = request.getParameterNames();
while (fieldNames.hasMoreElements()) {
Class c = object.getClass(); // 获取类
String fieldName = (String) fieldNames.nextElement(); // 获取属性名
String setMethodName = "set" + fieldName.toUpperCase().charAt(0) + fieldName.substring(1); // 得到方法名
try {
Method setMethod = c.getDeclaredMethod(setMethodName, String.class);
setMethod.invoke(object,request.getParameter(fieldName)); // 调用方法,实现对象属性赋值
} catch (Exception e) {
// 有些对象没有某些参数,就不必理会 不用抛出异常
}
}
return object;
}
}
WebUtil 使用方法
public class PageQueryEnterpriseServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Enterprise enterprise = new Enterprise();
enterprise = (Enterprise) WebUtil.makeRequestToObject(request,enterprise); // 这样使用即可得到整个 Enterprise 对象
}
}
什么场景不必使用此工具?
Spring、SpringBoot中 可以直接在 Controller 直接设置对象入参,则不需要此工具
原理是因为框架自带了参数解析器,挖个坑后面说
@GetMapping("/xxx")
public void doSome(Enterprise enterprise) {
// 这样直接得到 enterprise 对象,因为 SpringBoot 内置了参数解析器
}
这样即可