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