JavaWEB06--book02--利用反射合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序

项目源码

合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序

优化一:使用if-else

JavaWEB06--book02--利用反射合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序_第1张图片

优化代码二: 使用反射优化大量 else if 代码:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
IOException {
     
    String action = req.getParameter("action");
    try {
     
        // 获取action 业务鉴别字符串,获取相应的业务方法反射对象
        Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class,HttpServletResponse.class);
        //          System.out.println(method);
        // 调用目标业务 方法
        method.invoke(this, req, resp);
    } catch (Exception e) {
     
  		  e.printStackTrace();
    }
}

代码优化三: 抽取 BaseServlet 程序。

JavaWEB06--book02--利用反射合并 LoginServlet 和 RegistServlet 程序为 UserServlet 程序_第2张图片

BaseServlet 程序代码:

public abstract class BaseServlet extends HttpServlet {
     


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        doPost(req, resp);
    }

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        //解决post请求中文乱码问题
        //一定要在获取请求参数之前调用有效
        req.setCharacterEncoding("UTF-8");
        //解决响应的中文乱码
        resp.setContentType("text/html; charset=UTF-8");


        String action = req.getParameter("action");
        try {
     
            // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
            Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
//            System.out.println(method);
            // 调用目标业务 方法
            method.invoke(this, req, resp);
        } catch (Exception e) {
     
            e.printStackTrace();
            throw new RuntimeException(e);// 把异常抛给Filter过滤器
        }
    }

}

修改 UserServlet 程序继承 BaseServlet 程序。

数据的封装和抽取 BeanUtils 的使用

BeanUtils 工具类,它可以一次性的把所有请求的参数注入到 JavaBean 中。
BeanUtils 工具类,经常用于把 Map 中的值注入到 JavaBean 中,或者是对象属性值的拷贝操作。

BeanUtils 它不是 Jdk 的类。而是第三方的工具类。所以需要导包。

1、导入需要的 jar 包:
commons-beanutils-1.8.0.jar
commons-logging-1.1.1.jar

2、编写 WebUtils 工具类使用

package com.nie.utils;/*
 *
 *@auth  wenzhao
 *@date 2021/2/3  1:28
 */

import org.apache.commons.beanutils.BeanUtils;


import java.util.Map;

public class WebUtils {
     
    /**
     * 把Map中的值注入到对应的JavaBean属性中。
     * @param value
     * @param bean
     */
    public static <T> T copyParamToBean( Map value , T bean ){
     
        try {
     
            System.out.println("注入之前:" + bean);
            /**
             * 把所有请求的参数都注入到user对象中
             */
            BeanUtils.populate(bean, value);
            System.out.println("注入之后:" + bean);
        } catch (Exception e) {
     
            e.printStackTrace();
        }
        return bean;
    }


    /**
     * 将字符串转换成为int类型的数据
     * @param strInt
     * @param defaultValue
     * @return
     */
    public static int parseInt(String strInt,int defaultValue) {
     
        try {
     
            return Integer.parseInt(strInt);
        } catch (Exception e) {
     
//            e.printStackTrace();
        }
        return defaultValue;
    }

}

你可能感兴趣的:(JavaWeb,java,反射,web)