在刚学习Servlet时,是一个功能对应这一个Servlet,一个对象有(addServlet,UpdateServlet,SelectServlet…)如果一个对象有哦一百个功能,我们就需要创建100个servlet这在MVC中有着很高的冗余,因此,将这些Servlet整合成一个对象的Servlet,将User对应的方法封装到该对象的Servlet中,在BaseServlet中重写service()方法,通过Method传递参数的方式,判断使用Servlet中的哪个方法。
此外,BaseServlet中还简化了转发和重定向。
BaseServlet.java
package Base;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public abstract class BaseServlet extends HttpServlet {
@Override
public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 获取参数,用来识别用户想使用的方法。
* 这个参数用method表示。
* Servlet通过request获取到method 然后判断调用哪一个方法 。
*/
String methodName=req.getParameter( "method" );
if(methodName ==null||methodName.isEmpty()){
throw new RuntimeException("没有参数!!!");
}
Class c=this.getClass();
Method method=null;
try {
method=c.getMethod( methodName,HttpServletRequest.class,HttpServletResponse.class );
} catch (Exception e) {
throw new RuntimeException("您调用的"+methodName+"方法不存在!");
}
try {
method.invoke( this,req,resp );
} catch (Exception e) {
System.out.println("您调用的方法内部异常!");
throw new RuntimeException( e );
}
try {
/**
* 获取返回的字符串,判断是转发还是重定向
* 确定后帮助他完成转发或重定向
*/
String result =(String)method.invoke( this,req,resp );
if(result==null||result.trim().isEmpty()){
return;
}
if(result.contains( ":" )){
int index=result.indexOf( ":" );
String s=result.substring( 0,index );
String path=result.substring( index+1);
if(s.equalsIgnoreCase( "r" )){
resp.sendRedirect(req.getContextPath()+ path );
}else if(s.equalsIgnoreCase( "f" )){
req.getRequestDispatcher( path).forward( req,resp );
}else{
throw new RuntimeException( "指定的操作不正常!" );
}
}else{
req.getRequestDispatcher( result ).forward( req,resp );
}
/**
* 判断是
*/
}catch (Exception e){
}
}
}
UserServlet.java
package Servlet;
import Base.BaseServlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class UserServlet extends BaseServlet {
/**
* 在这里给出多个请求的处理方法。
* 请求处理方法:除了名字之外,都与Service方法相同。
*/
public String addUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这是添加的方法!");
return "r:/login.jsp";
}
public String deleteUser(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("这是删除的方法!");
return null;
}
}