前言
在面对同一模块不同的功能请求时,我们可以使用 反射 在 Servlet程序中优化 if else 代码结构,从而让注意力集中在功能上的开发。步骤如下:
Form表单
在同一功能模板的不同的 Form表单中添加隐藏域。如User模块,如下:
// 添加隐藏域,value=login
<form action="servlet" method="post">
<input type="hidden" name="action" value="login" />
用户名称:<input type="text" name="name" />
用户密码: <input type="password" name="password" />
<input type="submit" value="登录" id="sub_btn" />
</form>
// 添加隐藏域,value=regist
<form action="servlet" method="post">
<input type="hidden" name="action" value="regist" />
用户名称:<input type="text" name="name" />
用户密码: <input type="password" name="password" />
邮箱:<input type="text" name="email" />
<input type="submit" value="登录" id="sub_btn" />
</form>
抽象类BaseServlet
在该类中完成请求的分发:
该抽象类重写的 Post方法中通过 HttpServletRequest req,获取name=action中的 value值,再使用反射调用为 value的方法,从而完成请求的分发
login和regist都为 post请求,都提交到同一 Servlet程序: UserServlet,而UserServlet继承于 BaseServlet,BaseServlet完成了请求的分发。因此 UserServlet只需要完成提供相应功能的方法就可以了
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) {
String action = req.getParameter("action");
try {
// 通过反射获取当前类为 action的方法结构
Method declaredMethod = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// 调用相应的方法
declaredMethod.invoke(this,req,resp);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
}
// 继承 BaseServlet类,该类中只需要实现相应的方法即可
public class UserServlet extends BaseServlet {
UserService userService = new UserServiceImpl();
public void login(HttpServletRequest req, HttpServletResponse resp){
// ...处理login业务的逻辑
}
public void regist(HttpServletRequest req, HttpServletResponse resp){
// ...处理regist业务的逻辑
}
}