【JavaWeb】controller包处理

一、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{
}
//----------------------------------------------------------------------------