最开始我们要实现处理一个表单时就需要一个Servlet,这样如果需要提交的表单越多,我们就需要创建越多的Servlet类 实在是非常不方便,后来我们发现可以通过隐藏域传值的方法实现一个Servlet实现多个功能的实现 但是这样其实也不是特别方便 因为当功能多的时候 写的switch case语句就很多 非常的繁琐 因此我们就萌生出一个想法: 能不能封装一个工具类 实现一个Servlet类实现多个功能并且构建起来很方便 , 之后通过努力 封装出了BaseServlet工具类 具体代码如下
public class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取需要执行的方法名称
String methodName = req.getParameter("method");
//根据方法名获得需要执行的方法对象
try {
Method method = this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
//执行servlet的目标方法 并且获取方法返回值
Object obj = method.invoke(this,req,resp);
System.out.println("返回值:"+obj);
//当返回值不为null时才处理跳转
if (Objects.nonNull(obj)){
String target = obj.toString();
if(target.startsWith("redirect:")){
//重定向
target = target.substring("redirect:".length());
resp.sendRedirect(target);
}else{
//
req.getRequestDispatcher(target).forward(req,resp);
}
}
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
首先通过反射原理 得到隐藏域method参数的在值(即方法的名字) 加上方法参数的类对象 获得方法本身 调用此方法 得到该方法的返回值
之后进行判断 : 如果返回的字符串是以"redirect:"开头 那么就是重定向 否则就是请求转发 这样我们就能实现基本的多表单的请求响应和
response响应
}