一、BaseController处理请求路径问题
package com.atguigu.schedule.controller;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.Method;
public class BaseController extends HttpServlet {
/**
* 增加日程的请求 /schedule/add
* 查询日程的请求 /schedule/find
* 修改日程的请求 /schedule/update
* 删除日程的请求 /schedule/remove
* .... ....
*/
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 判断此次请求时 增?删?改?查?
String requestURI = req.getRequestURI();
String[] split = requestURI.split("/");
String methodName = split[split.length-1];
// 通过反射获取要执行的方法
Class clazz = this.getClass();
try {
Method method=clazz.getDeclaredMethod(methodName,HttpServletRequest.class,HttpServletResponse.class);
// 设置方法可以访问
method.setAccessible(true);
// 通过反射执行代码
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
二、多个处理器继承BaseController
虽然使用的技术还是Servlet,但是由于它是属于Controller层代码,所以在定义这一层的处理器的时候,我们往往使用Controller用作类名。
那么controller层也应该有接口和实现类,我们这里实现的接口就是HttpServlet,也就是间接实现了Servlet接口,但是Servlet是技术接口,而我们再说Controller层接口的时候,一般说的都是业务接口。业务接口和技术接口是有区别的,我们所说的业务接口是跟前后端对接的时候所说的一个接口,而Servlet技术本身的技术规范的接口含义还是不一样的。
但是目前在这一层没有必要准备interface了,因为这一层用的是Servlet技术,而Servlet技术有一定的特殊性,你如果在这一层也定义接口,反而可能会干扰我们一些Servlet代码编写。
//----------------------------------------------------------------------------
package com.atguigu.schedule.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/user/*")
public class UserController extends BaseController{
}
//----------------------------------------------------------------------------
package com.atguigu.schedule.controller;
import jakarta.servlet.annotation.WebServlet;
@WebServlet("/schedule/*")
public class SysScheduleController extends BaseController{
}
//----------------------------------------------------------------------------