一、Web页面

1. 通过request获取URL:

    1. request.getScheme(); // 获取协议: http
    1. request.getServerName(); //获取输入的IP, eg;输入的是localhost,则值就是:127.1.1.0
    1. request.getServerPort(); // 获取端口号
    1. request.getContextPath(); // 获取工程名路径

2. 使用反射机制,简化servlet.java

  1. <div class="form">
  2. <form action="userServlet" method="post">
  3. <input type="hidden" name="action" value="regist"> --------------------->action参数的value="regist",表明是注册功能
  4. <label>用户名称:</label>
  5. <input class="itxt" type="text" placeholder="请输入用户名"
  6. value="${requestScope.username}"
  7. autocomplete="off" tabindex="1" name="username" id="username" />
  8. <br />
  • 通过反射机制,在获取xml中action对象后,调用响应的功能 ```java import java.lang.reflect.Method;

public class UserServletTest { public void login() { System.out.println(“这是login()方法调用了”); }

public void regist() {
    System.out.println("这是regist()方法调用了");
}

public void updateUser() {
    System.out.println("这是updateUser()方法调用了");
}

public void updateUserPassword() {
    System.out.println("这是updateUserPassword()方法调用了");
}

public static void main(String[] args) {
    String action = "regist";
    try {
        // 获取action业务鉴别字符串,获取相应的业务 方法反射对象
        Method method = UserServletTest.class.getDeclaredMethod(action);    // *********************

// System.out.println(method); // 调用目标业务 方法 method.invoke(new UserServletTest() ); } catch (Exception e) { e.printStackTrace(); } } }


<a name="fL596"></a>
### 3. 抽取BaseServlet.java

- 逻辑示意图:

![image.png](https://cdn.nlark.com/yuque/0/2021/png/22435741/1629969636027-01af779a-b546-4c4b-bdeb-23351b99a872.png#crop=0&crop=0&crop=1&crop=1&height=427&id=F3UKN&margin=%5Bobject%20Object%5D&name=image.png&originHeight=427&originWidth=746&originalType=binary&ratio=1&rotation=0&showTitle=false&size=78410&status=done&style=none&title=&width=746)

- java代码实现:
```java
public abstract class BaseServlet extends HttpServlet {

    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);  // <form action="userServlet" method="post">
//            System.out.println(method);
            // 调用目标业务 方法
            method.invoke(this, req, resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

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

1. 概念及作用

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

2. BeanUtils是第三方包

  • 1、 导入需要的 jar 包:
             - commons-beanutils-1.8.0.jar
             - commons-logging-1.1.1.jar
    
  • 2、 编写 WebUtils 工具类使用:

把所有数据都封装到User对象中
User user = new User();
BeanUtils.populate(user, request.getParameterMap());