0%

JavaWeb书城项目(四)———代码优化

整个项目源代码可以到我的github上下载。前三部分我们已经完成了书城项目的登录与注册功能,第四部分我们对之前的代码进行优化。

合并Servlet

在实际的开发中,一个模块,一般只使用一个 Servlet 程序,用户的注册与登录都属于用户模块,因此只需要一个 Servlet 程序即可,所以我们将 LoginServlet 与 RegistSerlet 程序合并为一个 UserServlet 程序。
那么一个请求过来,如何知道他是注册还是登录呢?

这时我们就要用到表单项的隐藏域来解决。
登录表单隐藏域
注册表单隐藏域
这样,我们在用 Servlet 程序接收请求时,就能根据 name 的 value 项来判断其是注册还是登录。


反射优化

用户模块不止有登录和注册功能,还会有注销,修改密码等其它功能,如果这时都放在一个 Servlet 里,那么代码必定有很多 if...else...,这样代码就会显得很冗杂。我们可以使用反射优化 if...else...。
反射优化
这样两行代码就能代替繁琐的 if...else,,,。


抽取BaseServlet程序

抽取BaseServlet
因为我们不止一个模块,除了用户模块,还会有图书模块等,这样其反射优化都是一样的,那么我们可以抽取出父类 BaseServlet 程序,那么其它模块就可以继承这个模块,达到复用代码的目的。
BaseServlet程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.atguigu.web;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;

public abstract class BaseServlet extends HttpServlet {

@Override
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);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}

}

}

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

我们一般会将数据封装进JavaBean里,但如果通过调用 Set 方法会使代码很冗余,这时我们可以使用第三方工具类 BeanUtils ,它可以用于把 Map 中的值注入到 JavaBean 中。

  1. 导入需要的 jar 包:
    commons-beanutils-1.8.0.jar
    commons-logging-1.1.1.jar
  2. 编写 WebUtils 工具类使用
    WebUtils工具类:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package com.atguigu.utils;

import org.apache.commons.beanutils.BeanUtils;

import java.lang.reflect.InvocationTargetException;
import java.util.Map;

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

  1. 在程序中加入如下代码即可调用方法将请求参数注入到JavaBean中
    调用方法

使用EL表达式修改表单回显

我们可以使用EL表达式来修改表单回显,这样能使代码更简洁。
修改login,jsp
修改regist.jsp

-------------本文结束感谢您的阅读-------------