1、RequestHeader
package com.csdn.mymvc.annotation;
import java.lang.annotation.*;
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestHeader {
2、DispatcherServlet
package com.csdn.mymvc.core;
import com.csdn.mymvc.annotation.RequestBody;
import com.csdn.mymvc.annotation.RequestHeader;
import com.csdn.mymvc.util.RequestUtil;
import com.csdn.mymvc.util.ResponseUtil;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.ServletContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import com.csdn.headline.common.Result;
import java.io.IOException;
import java.lang.annotation.Annotation;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
public class DispatcherServlet extends HttpServlet {
private final String BEAN_FACTORY = "beanFactory" ;
private final String CONTROLLER_BEAN_MAP = "controllerBeanMap" ;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String[] staticResourceSuffixes={".html",".jsp",".jpg",".png",".gif",".css",".js",".ico"};
String uri = request.getRequestURI();
if(Arrays.stream(staticResourceSuffixes).anyMatch(uri::endsWith)){
RequestDispatcher defaultDispatcher = request.getServletContext().getNamedDispatcher("default");
defaultDispatcher.forward(request,response);
String[] arr = uri.split("/") ;
if(arr==null || arr.length!=3){
throw new RuntimeException(uri+"非法!");
String requestMapping = "/"+arr[1] ;
String methodMapping = "/"+arr[2];
ServletContext application = getServletContext();
ControllerDefinition controllerDefinition = ((Map)application.getAttribute(CONTROLLER_BEAN_MAP)).get(requestMapping);
if(controllerDefinition==null){
throw new RuntimeException(requestMapping+"对应的controller组件不存在!");
String requestMethodStr = request.getMethod().toLowerCase();
Method method = controllerDefinition.getMethodMappingMap().get(requestMethodStr+"_"+methodMapping) ;
Object controllerBean = controllerDefinition.getControllerBean();
Parameter[] parameters = method.getParameters();
Object[] parameterValues = new Object[parameters.length];
for(int i = 0 ; i< parameters.length;i++){
Parameter parameter = parameters[i];
String paramName = parameter.getName();
Object parameterValue = null ;
Annotation[] annotations = parameter.getDeclaredAnnotations();
if (Arrays.stream(annotations).anyMatch(annotation -> annotation instanceof RequestBody)) {
parameterValue = RequestUtil.readObject(request,parameter.getType());
} else if (Arrays.stream(annotations).anyMatch(annotation -> annotation instanceof RequestHeader)) {
parameterValue = request.getHeader(paramName);
String paramValueStr = request.getParameter(paramName);
String parameterTypeName = parameter.getType().getName();
parameterValue = switch (parameterTypeName){
case "java.lang.String"->paramValueStr;
case "java.lang.Integer"->Integer.parseInt(paramValueStr);
parameterValues[i]=parameterValue;
method.setAccessible(true);
Object returnObj = method.invoke(controllerBean,parameterValues);
if(returnObj!=null && returnObj instanceof Result){
Result result = (Result) returnObj ;
ResponseUtil.print(response,result);
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
} catch (InvocationTargetException e) {
throw new RuntimeException(e);