对于URLhttp://localhost/user/addUser ,在BaseServlet中进行解析获取到方法名,通过反射拿到对应的方法对象再invoke,从而进行方法分发。
//BaseServlet.class
package com.supersql.servlet;
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 class BaseServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取方法名
String uri = req.getRequestURI();
int index = uri.lastIndexOf('/');
String methodName = uri.substring(index + 1);
//通过反射获取对应的Method对象,并执行
try {
Method method = this.getClass().getMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
//UserServlet.class
package com.supersql.servlet;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/user/*")
public class UserServlet extends BaseServlet {
public void addUser(HttpServletRequest req, HttpServletResponse resp){
System.out.println("addUser");
}
public void select(HttpServletRequest req, HttpServletResponse resp){
System.out.println("select");
}
public void delete(HttpServletRequest req, HttpServletResponse resp){
System.out.println("delete");
}
}