servlet抽取
在JavaWeb编程的时候,通过servlet进行请求处理的时候,都会继承HttpServlet类重写doGet()或者doPost()方法处理相应的请求,那么就会出现很多的相同部分,如编码集的设置等,那么如何进行这些代码的抽取呢?
Java给我们提供了一个很好的方法,那就是反射。你只需要将要调用的方法指定给BaseServlet,实际处理请求的类继承基础类,进行相应的请求处理。BaseServlet将会通过反射的方式调用该方法。
BaseServlet的抽取
public abstract class BaseServlet extends HttpServlet {
//统一使用doPost()方法进行请求的处理
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//抽取每个servlet中的公共部分
// 解决post请求中文乱码问题
// 一定要在获取请求参数之前调用才有效
req.setCharacterEncoding("UTF-8");
String action = req.getParameter("action");
try {
// 获取action业务鉴别字符串,获取相应的业务 方法反射对象
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// System.out.println(method);
// 调用目标业务 方法
method.invoke(this, req, resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
servlet实际的请求处理
在请求提交的form表单或者参数中,传入action=方法名,此时的方法名就是要调用的具体的servlet中的某个方法。
public class UserServlet extends BaseServlet {
/**
* 处理登录的功能
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//进行具体的业务逻辑处理
}
}
在整个过程中,充分体现了Java继承的特性,也利用了反射提高了代码的复用性。