WebUtil —— 便捷的 Servlet 开发接收客户端参数小工具

257 阅读2分钟

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 内置了参数解析器
}

这样即可