Servlet均继承HttpServlet,所以可以加层,BaseServlet通过反射来执行子类Servlet的对应方法,可以减少文件(Servlet)数量或者重复代码(if(method==???))。
public class BaseServlet extends HttpServlet {
@SneakyThrows
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取方法字符串,字符串和servlet中的方法名称保持一致
String method = req.getParameter("method");
/*此处this是指子类对象,因为是子类没有service()才来调用父类的service()
由于BaseServlet的子类Servlet可能不止一个,所以用通配符限定上界。
*/
Class<? extends BaseServlet> c = this.getClass();
//使用 方法名 和 参数列表 获取对应方法
Method declaredMethod = c.getDeclaredMethod(method, HttpServletRequest.class, HttpServletResponse.class);
//暴力反射
declaredMethod.setAccessible(true);
//用this执行方法
declaredMethod.invoke(this,req,resp);
}
}
@WebServlet("/student")
public class StudentServlet extends BaseServlet {
private static StudentServiceImpl studentService;
static {
studentService = new StudentServiceImpl();
}
private static void findAll(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//用json字符串接收再吧结果封装成json字符串返回
List<Student> all = studentService.findAll();
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(all);
//System.out.println(json);
//返回
resp.getWriter().write(json);
}
private static void update(HttpServletRequest req, HttpServletResponse resp) throws InvocationTargetException, IllegalAccessException, IOException {
//获取输入流,将输入流转为字符串,将其中的Json字符串封装student对象
ServletInputStream inputStream = req.getInputStream();
String read = IoUtil.read(inputStream, "UTF-8");
Student student = new ObjectMapper().readValue(read,Student.class);
studentService.update(student);
//关流,返回结果
inputStream.close();;
resp.getWriter().write("ok");
}
}