普通的Servlet一个Servlet只能处理一个请求,可以仿Struts1中的DispatchAction让一个Servlet处理多个请求。
做法是:
让普通处理请求的Servlet继承父类的BaseServlet,然后让父类单独继承HttpServlet.然后再在处理请求的servlet中定义自己的处理请求的方法,但方法中必须包HttpServletRequest,
HttpServletResponse对象参数(方法名可以随意)。
如:
public void login(HttpServletRequest request,HttpServletResponse response) throws ServletException , IOException
{
....
}
servlet的生命周期是:
调用构造方法实例化该servlet----------调用有参的init()方法(会默认调用无参的init()方法)---------将请求交给无Http协议的service()方法----------将请求交给有Http协议的service()方法--------根据提交数据的方式的不同(post/get等)调用相应的doGet()/doPost()方法---------当重新加载此servlet实例(当servlet中的内容发生改变时,就会自动加载重新部署)时调用destory()方法 或者重新发生请求时又会重新调用对应的doGet()/doPost()方法。
根据servlet的生命周期,加上继承的关系,处理请求的serlvet会先调用父类BaseServlet的init()方法,再调用service()方法。
然后我们只需重写父类BaseServlet中的service()方法,在service方法中根据参数名的不同利用反射机制调用请求servlet中的不同方法。
package com.xuzengqiang.tour.common.web.servlet;
import java.io.IOException;
import java.lang.reflect.Method;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xuzengqiang.tour.common.utils.StringUtils;
import com.xuzengqiang.tour.common.web.framework.BeanFactory;
import com.xuzengqiang.tour.service.user.UserService;
@SuppressWarnings("all")
public class BaseServlet extends HttpServlet
{
@Override
public void init() throws ServletException
{
//可以做一些初始化的工作
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//获取参数方法名
String action = request.getParameter("action");
try
{
if (StringUtils.isNotBlank(action))
{
//通过参数名获取对应请求servlet中的方法
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, request, response);
}
else
{
// 否则默认查所有
unspecified(request, response);
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
private void unspecified(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
try
{
Method method = this.getClass().getDeclaredMethod("list", HttpServletRequest.class, HttpServletResponse.class);
method.invoke(this, request, response);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}