整个项目源代码可以到我的github上下载。前三部分我们已经完成了书城项目的登录与注册功能,第四部分我们对之前的代码进行优化。
合并Servlet
在实际的开发中,一个模块,一般只使用一个 Servlet
程序,用户的注册与登录都属于用户模块,因此只需要一个 Servlet
程序即可,所以我们将 LoginServlet
与 RegistSerlet
程序合并为一个 UserServlet
程序。
那么一个请求过来,如何知道他是注册还是登录呢?
这时我们就要用到表单项的隐藏域来解决。
这样,我们在用 Servlet
程序接收请求时,就能根据 name
的 value
项来判断其是注册还是登录。
反射优化
用户模块不止有登录和注册功能,还会有注销,修改密码等其它功能,如果这时都放在一个 Servlet
里,那么代码必定有很多 if...else...
,这样代码就会显得很冗杂。我们可以使用反射优化 if...else...
。
这样两行代码就能代替繁琐的 if...else,,,
。
抽取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 { 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
中。
- 导入需要的
jar
包:
commons-beanutils-1.8.0.jar
commons-logging-1.1.1.jar
- 编写
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 {
public static <T> T copyParamToBean(Map value , T bean ){ try { System.out.println("注入之前:" + bean);
BeanUtils.populate(bean, value); System.out.println("注入之后:" + bean); } catch (Exception e) { e.printStackTrace(); } return bean; } }
|
- 在程序中加入如下代码即可调用方法将请求参数注入到
JavaBean
中
使用EL表达式修改表单回显
我们可以使用EL
表达式来修改表单回显,这样能使代码更简洁。