javaweb项目中随着功能的增加servlet文件的数目也随着增加,如果每个功能都写一个servlet最后文件量是相当大的。
有效的解决方法是从前端链接传来方法名,在servlet中获得方法名并执行,但这样有一点繁琐的事需要在doget或dopost方法中做判断。
还有一种方法就是抽取公共的servlet继承HttpServlet重写service方法,利用反射技术执行继承了该公共类的子类中相应的方法。
每个子类返回一个字符串来表明需要转发的地址,重定向的直接在子类中执行就可以。如无需跳转返回null。
index方法类似一个通用方法,这里用来执行空参数跳转主页。
代码如下:
package com.store.web.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BaseServlet extends HttpServlet {
/**
* 通过页面传来的method值来判断方法名,执行继承此类对象的该方法。
*/
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
//获得页面传来的方法
String methodName = request.getParameter("method");
//如果为空执行跳转到主页方法
if(methodName==null) {
methodName = "index";
}
//通过反射获得对象,并执行该方法
Class clazz = this.getClass();//获得子类的对象
//获得方法
Method method = clazz.getMethod(methodName, HttpServletRequest.class, HttpServletResponse.class);
//执行方法
String path = (String) method.invoke(this, request, response);
if(path!=null) {
//规定path是方法invoke方法返回需要转发的地址
request.getRequestDispatcher(path).forward(request, response);
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* servlet通用方法每个继承此类的子类可以重写这个方法
* @param request
* @param response
* @return
* @throws ServletException
* @throws IOException
*/
public String index(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
return null;
}
}