tsx81428 发表于 2024-5-18 06:00:18

手写SpringMVC底层机制

手写 SpringMVC 底层机制


[*]前景提要:实现的是SpringMVC焦点机制
[*]对一些细枝末节的代码做了简化,好比字符串的处置惩罚...
[*]完成哪些机制

[*]机制一: 通过@RequestMapping ,可以标记一个方法,编写路径url,浏览器就能通过url完成调用
[*]机制二: 举行依赖注入,使之不须要传统的new 一个对象,而是直接从IOC容器中获得
[*]机制三:通过@RequestParam,如果浏览器转达的参数名和目标方法的形参不一致,可以通过value设置举行匹配
[*]机制四:在目标方法完成后,跳转到相关页面 请求转发/重定向
[*]机制五:在目标方法完成后,通过@Response注解,向浏览器发送JSON格式数据

手写添加配置

思绪


[*]须要配置pom.xml的依赖
[*]须要写一个Servlet 作为前端控制器
[*]须要配置Web.xml 中的前端控制器 1).url 2)配置spring容器配置文件的classpath:3)跟随Tomcat 自启动
[*]须要配置spring容器配置文件
[*]须要配置spring容器配置文件 扫描的路径
实现


[*]须要配置pom.xml的依赖
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
   
    </dependency>


    <dependency>
      <groupId>dom4j</groupId>
      <artifactId>dom4j</artifactId>
      <version>1.1</version>
    </dependency>


    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-lang3</artifactId>
      <version>3.12.0</version>
    </dependency>

[*]须要写一个Servlet 作为前端控制器
public class ZyDispatcherServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("ZyDispatcherServlet-doPost--");
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("ZyDispatcherServlet-doGet--");
    }
}

[*]须要配置Web.xml 中的前端控制器 1).url 2)配置spring容器配置文件的classpath:3)跟随Tomcat 自启动
[*]须要配置spring容器配置文件 扫描的路径
<servlet>
    <servlet-name>ZyDispatcherServlet</servlet-name>
    <servlet-class>com.code_study.zyspringmvc.servlet.ZyDispatcherServlet</servlet-class>
   
   
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:zyspringmvc.xml</param-value>
    </init-param>

   
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>ZyDispatcherServlet</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

[*]须要配置spring容器配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>完成浏览器可以请求控制层

思绪


[*]创建@Controller和本身的Controller
[*]编写工具类XMLParser,解析spring容器配置文件
[*]开发本身的 Spring容器,得到扫描类的全路径列表
[*]开发本身的 前端控制器,实例化对象到容器中
[*]完成请求的URL和控制器方法的映射关系
[*]完成前端控制器分发请求到对应控制器

[*]自定义注解@Controller
[*]创建Controller
[*]须要写一个工具类XMLParser来解析在spring容器配置文件 扫描的路径的包 返回所有的路径
[*]这个所有的路径 一个split(",")分隔,都举行扫描
[*]须要写本身的 前端控制器
[*]须要写本身的 Spring容器
[*]在前端控制器中 须要添加方法 scanPackage() 扫描 XMLParser 解析出来的路径
[*]在Spring容器中 须要添加一个属性 classFullPathList 来保存扫描出来的类的全路径
[*]须要添加一个属性 ioc 来存放反射生成的bean对象 也就是过滤classFullPathList中没有@Controller注解的一些路径 并实例化
[*]须要添加类Handler 这个类要保存 一个url 对应的 一个控制器的方法的 映射 ,也就是说,根据这个url,可以找到对应控制器的对应方法
[*]须要添加一个属性 HandlerList 用于 保存Handler 【url 和 控制器的映射】
[*]须要添加三个方法 一个是initHandlerMapping(),完成 url 对应的 一个控制器的方法的 映射,即 将ioc 中bean 中的 方法举行反射,获取url,将 url,method,bean 封装成Handler放入HandlerList保存
[*]添加第二个方法 getHandler(),须要将浏览器发送的request请求中的 uri拿出来,遍历HandlerList举行配对,如果有 就返回对应的Handler
[*]添加第三个方法 executeDispatch(),举行分发处置惩罚,须要 调用getHandler() 获取浏览器发送的request请求 对应的 Handler,获取Handler中的method 举行反射调用,method .invoke() 实现分发请求。
实现


[*]自定义注解@Controller
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Controller {
    String value() default "";
}
[*]创建Controller
@Controller
public class MonsterController {
}
[*]须要写一个工具类XMLParser来解析在spring容器配置文件 扫描的路径的包 返回所有的路径
public class XMLParser {    public static String getBasePackage(String xmlFile){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>SAXReader saxReader = new SAXReader();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ClassLoader classLoader = XMLParser.class.getClassLoader();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>InputStream resourceAsStream = classLoader.getResourceAsStream(xmlFile);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Document document = saxReader.read(resourceAsStream);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Element rootElement = document.getRootElement();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Element element = rootElement.element("component-scan");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String basePackage = element.attribute("base-package").getText();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    return basePackage;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} catch (DocumentException e) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}    }}
[*]这个所有的路径 一个split(",")分隔,都举行扫描
[*]须要写本身的 前端控制器
[*]须要写本身的 Spring容器
[*]在前端控制器中 须要添加方法 scanPackage() 扫描 XMLParser 解析出来的路径
public void scanPackage(String pack) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//获得包所在的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>URL url =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.getClass().getClassLoader().//获取类的加载器<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//得到指定包对应的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>getResource("/" + pack.replaceAll("\\.", "/"));<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>// System.out.println("url= "+url);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//根据得到的路径,对其举行扫描,把类的全路径 保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String path = url.getFile();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//在io中 把目录也是为一个文件<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>File file = new File(path);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历file 【遍历出文件和子目录】<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (File f : file.listFiles()) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (f.isDirectory()) {//如果是目录<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//须要递归扫描 找子目录<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>scanPackage(pack + "." + f.getName());<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//的确是个文件<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//扫描到的文件大概是 .class 文件 也大概是其他文件<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//就算是.class 文件 也须要判定是否须要注入容器 有无加 @Controller注解<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//现在无法拿到注解 由于没法反射 以是先把文件的全路径都保存到 classFullPathList 之后在注入对象到容器时再处置惩罚<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String classFullPath =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//类的全路径不须要.class 去掉.class<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>pack + "." + f.getName().replaceAll(".class", "");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>classFullPathList.add(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}    }
[*]在Spring容器中 须要添加一个属性 classFullPathList 来保存扫描出来的类的全路径
//保存扫描的包/子包类的全路径    private List classFullPathList =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    new ArrayList();
[*]须要添加一个属性 ioc 来存放反射生成的bean对象 也就是过滤classFullPathList中没有@Controller注解的一些路径 并实例化
//定义属性 ioc -> 存放反射生成的bean对象 好比Controller / Service /Daopublic ConcurrentHashMap ioc =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>new ConcurrentHashMap();
[*]编写方法,将扫描到的类,在满意情况下 反射到ioc容器
//编写方法,将扫描到的类,在满意情况下 反射到ioc容器    public void executeInstance() {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (classFullPathList.size() == 0) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //说明没有扫描到类<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    return;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历classFullList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (String classFullPath : classFullPathList) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Class clazz = Class.forName(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (clazz.isAnnotationPresent(Controller.class)) {//处置惩罚@Controller<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String className = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String value = clazz.getAnnotation(Controller.class).value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = StringUtils.uncapitalize(className);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    ioc.put(className, instance);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>else if (clazz.isAnnotationPresent(Service.class)) {//处置惩罚@Service<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String className = clazz.getSimpleName();//类名<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Service serviceAnnotation = clazz.getAnnotation(Service.class);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String value = serviceAnnotation.value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ioc.put(className, instance);                                }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}    }
[*]须要添加类Handler 这个类要保存 一个url 对应的 一个控制器的方法的 映射 ,也就是说,根据这个url,可以找到对应控制器的对应方法
ZyHandler {    private String url;    private Method method;    private Object controller;    public ZyHandler() {    }    public ZyHandler(String url, Method method, Object controller) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.url = url;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.method = method;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.controller = controller;    }//须要提供getter和setter方法...
[*]须要添加一个属性 HandlerList 用于 保存Handler 【url 和 控制器的映射】
//定义属性 HandlerList -> 保存ZyHandler 【url 和 控制器的映射】    private List HandlerList =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    new ArrayList();
[*]须要添加三个方法 一个是initHandlerMapping(),完成 url 对应的 一个控制器的方法的 映射,即 将ioc 中bean 中的 方法举行反射,获取url,将 url,method,bean 封装成Handler放入HandlerList保存
private void initHandlerMapping(){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历 ioc<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Map.Entry entry:zyWebApplicationContext.ioc.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (zyWebApplicationContext.ioc.isEmpty()){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Object bean = entry.getValue();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Class clazz = bean.getClass();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (clazz.isAnnotationPresent(Controller.class)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Method[] declaredMethods = clazz.getDeclaredMethods();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Method declaredMethod : declaredMethods) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (declaredMethod.isAnnotationPresent(RequestMapping.class)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String url = declaredMethod.getAnnotation(RequestMapping.class).value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ZyHandler zyHandler = new ZyHandler(url, declaredMethod, bean);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>HandlerList.add(zyHandler);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}    }
[*]添加第二个方法 getHandler(),须要将浏览器发送的request请求中的 uri拿出来,遍历HandlerList举行配对,如果有 就返回对应的Handler
//编写方法,通过request对象 返回ZyHandler对象 ,如果没有返回null    private ZyHandler getZyHandler(HttpServletRequest request) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String requestURI = request.getRequestURI();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历HandlerList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (ZyHandler zyHandler : HandlerList) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (requestURI.equals(zyHandler.getUrl())){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return zyHandler;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return null;    }
[*]添加第三个方法 executeDispatch(),举行分发处置惩罚,须要 调用getHandler() 获取浏览器发送的request请求 对应的 Handler,获取Handler中的method 举行反射调用,method .invoke() 实现分发请求。
   public void executeDispatch(HttpServletRequest request,HttpServletResponse response){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ZyHandler zyHandler = getZyHandler(request);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (null == zyHandler){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>       response.getWriter().write("404 NOT FOUND

");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Method method = zyHandler.getMethod();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    method.invoke(zyHandler.getController(),request,response);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}    }从web.xml文件中动态获取spring配置文件

思绪


[*]首先,我们本身写的前端控制器是一个Servlet,它有 servletConfig,可以servletConfig.getInitParameter("xxx") 来获取之前在web.xml配置的classpath:
[*]工具类XMLParser 是在spring容器中解析的 ,web.xml配置的classpath: 是在前端控制器中获取的,因此须要spring容器提供有参构造器,在前端控制器添加参数 spring容器,将classpath 传到spring容器中举行解析。
实现


[*]首先,我们本身写的前端控制器是一个Servlet,它有 servletConfig,可以servletConfig.getInitParameter("xxx") 来获取之前在web.xml配置的classpath:
[*]工具类XMLParser 是在spring容器中解析的 ,web.xml配置的classpath: 是在前端控制器中获取的,因此须要spring容器提供有参构造器,在前端控制器添加参数 spring容器,将classpath 传到spring容器中举行解析。
@Override    public void init() throws ServletException {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String configLocation = getServletConfig().getInitParameter("contextConfigLocation");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("ZyDispatcherServlet 初始化---");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>zyWebApplicationContext = new ZyWebApplicationContext(configLocation);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>zyWebApplicationContext.init();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>initHandlerMapping();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("HandlerList= "+HandlerList);    } privateString configLocation;    public ZyWebApplicationContext(String configLocation) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.configLocation = configLocation;    } public void init(){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("ZyWebApplicationContext 初始化---");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String basePackage = XMLParser.getBasePackage(configLocation.split(":"));<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String[] basePackages = basePackage.split(",");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (basePackages.length >0) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    for (Stringpack : basePackages) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>scanPackage(pack);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} }@Service注解

思绪


[*]@Service注解是写在类上的 即@Target(ElementType.TYPE)
[*]这个注解标识的类就是一个Service,那么同样是在executeInstance()方法中判定是否有注解@Service,有的话就保存到ioc容器中
[*]由于是Service,那么保存进ioc 的 k-v 中的 k 就有三种。第一种,就是默认值,用接口的范例的名字首字母小写;第二种,在@Service注解种设置了value属性,那么 k = value;第三章,须要用类名首字母小写也可以获取bean
实现


[*]@Service注解是写在类上的 即@Target(ElementType.TYPE)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Service {
    String value() default "";
}
[*]这个注解标识的类就是一个Service,那么同样是在executeInstance()方法中判定是否有注解@Service,有的话就保存到ioc容器中
[*]由于是Service,那么保存进ioc 的 k-v 中的 k 就有三种。第一种,就是默认值,用接口的范例的名字首字母小写;第二种,在@Service注解种设置了value属性,那么 k = value;第三章,须要用类名首字母小写也可以获取bean
public void executeInstance() {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (classFullPathList.size() == 0){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    return;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (String classFullPath : classFullPathList) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Class clazz = Class.forName(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (clazz.isAnnotationPresent(Controller.class)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Controller controller = clazz.getAnnotation(Controller.class);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String value = controller.value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String className = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if ("".equals(value)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = StringUtils.uncapitalize(className);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    ioc.put(className,instance);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} else if (clazz.isAnnotationPresent(Service.class)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Service serviceAnnotation = clazz.getAnnotation(Service.class);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String annoattionValue = serviceAnnotation.value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if ("".equals(annoattionValue)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Class[] interfaces = clazz.getInterfaces();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Class anInterface : interfaces) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String simpleName = anInterface.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    simpleName = StringUtils.uncapitalize(simpleName);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    ioc.put(simpleName,instance);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//可以通过类名首字母小写<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String simpleName = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>simpleName = StringUtils.uncapitalize(simpleName);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ioc.put(simpleName,instance);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ioc.put(annoattionValue,instance);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}    }@Autowried 依赖注入

思绪


[*]@Autowried注解是用在字段上,通过ioc容器自动装配,因此 @Target(ElementType.FIELD)
[*]须要遍历ioc中所有的 bean 中的所有字段,来举行判定是否须要自动装配
[*]通过反射获取字段,判定该字段是否带有@Autowried 注解,有的话就判定value值
[*]value为"",说明按默认规则 用字段范例首字母小写 去ioc容器举行查找,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");
[*]如果有值,去ioc容器举行查找该值对应的bean,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");如果有该bean,就用该字段的set()方法将本身的bean 和 查找ioc获取的bean举行装配
[*]即 declaredField.set(bean, beanInIOC);
[*]由于字段是私有属性private,须要暴力破解declaredField.setAccessible(true);
实现


[*]@Autowried注解是用在字段上,通过ioc容器自动装配,因此 @Target(ElementType.FIELD)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    String value() default "";
}
[*]须要遍历ioc中所有的 bean 中的所有字段,来举行判定是否须要自动装配
[*]通过反射获取字段,判定该字段是否带有@Autowried 注解,有的话就判定value值
[*]value为"",说明按默认规则 用字段范例首字母小写 去ioc容器举行查找,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");
[*]如果有值,去ioc容器举行查找该值对应的bean,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");如果有该bean,就用该字段的set()方法将本身的bean 和 查找ioc获取的bean举行装配
[*]即 declaredField.set(bean, beanInIOC);
[*]由于字段是私有属性private,须要暴力破解declaredField.setAccessible(true);
public voidexecuteAutoWired(){    //遍历ioc    if (ioc.isEmpty()){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return;    }    //获取容器里的所有bean 以及 bean对应的字段    for (Map.Entry entry : ioc.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Object bean = entry.getValue();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Class clazz = bean.getClass();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Field[] declaredFields = clazz.getDeclaredFields();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Field declaredField : declaredFields) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //通过反射获取字段,判定该字段是否带有@Autowried 注解,有的话就判定value值<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (declaredField.isAnnotationPresent(Autowired.class)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Autowired annotation =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>declaredField.getAnnotation(Autowired.class);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String beanName = annotation.value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //value为"",说明按默认规则 用字段范例首字母小写 去ioc容器举行查找,<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if ("".equals(beanName)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>beanName = declaredField.getType().getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>beanName = StringUtils.uncapitalize(beanName);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Object iocBean = ioc.get(beanName);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //如果没有抛出空指针异常<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (null == iocBean){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    throw new NullPointerException("ioc 没有该Bean");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>declaredField.setAccessible(true);//暴力破解<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>declaredField.set(bean,iocBean);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} catch (IllegalAccessException e) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}    }}@RequestParam

思绪


[*]@RequestParam 是写在PARAMETER上的 也就是说 @Target(ElementType.PARAMETER)
[*]这个注解实现的功能 大方向是 分发请求 也就是说 写在 executeDispatch()方法中的
[*]要实现 @RequestParam 须要将形参列表封装到一个数组中 , 由于反射 invoke 可以传入一个数组作为可变参数解析
[*]那么就须要两个数组 一个数组是新创建的数组(大小应与,目标数组的形参个数一致) 将实参放入进去 ;另一个是 反射拿到的目标方法的形参的数组
[*]这两个数组的内容须要一一对应,由于反射须要顺序一致
[*]须要获取到request 中请求的参数Map 获取参数名和参数值
[*]可以将功能具体化到 完成这个新数组的实参填写 【完成新数组之后放入invoke方法举行反射就行】
[*]将步调拆解成 1)完成HttpServletRequest 和 HttpServletResponse 的填写 ;2)完成带有@RequestParam注解的形参的填写;3)完成平凡的方法参数没有@RequestParam注解的形参的填写
[*]完成HttpServletRequest 和 HttpServletResponse 的填写:就须要先拿到目标方法的所有参数。根据范例的名称 和 形参列表举行匹配 填写
[*]完成带有@RequestParam注解的形参的填写:须要添加方法,获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返回int 代表第几个参数,如果有@RequestParam注解,就会返回相应的索引,如果没有就会返回-1 举行平凡方法参数的填写 处置惩罚
[*]平凡方法参数的 填写:须要添加方法,将目标方法的所有的形参的名称 反射保存到 List 返回,再通过遍历判定 请求的参数名和 List中一致的 填写到 数组中
[*]平凡方法参数的 填写 须要插件,使用java8的特性 解决在默认情况下 parameter.getName() 获取的名字不是形参真正的名字,而是的问题
实现


[*]@RequestParam 是写在PARAMETER上的 也就是说 @Target(ElementType.PARAMETER)
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestParam {
    String value() default "";
}
[*]这个注解实现的功能 大方向是 分发请求 也就是说 写在 executeDispatch()方法中的
[*]要实现 @RequestParam 须要将形参列表封装到一个数组中 , 由于反射 invoke 可以传入一个数组作为可变参数解析
Method method = zyHandler.getMethod();
Class<?>[] parameterTypes = method.getParameterTypes();//形参数组
Object[] params = new Object;
[*]那么就须要两个数组 一个数组是新创建的数组(大小应与,目标数组的形参个数一致) 将实参放入进去 ;另一个是 反射拿到的目标方法的形参的数组
[*]这两个数组的内容须要一一对应,由于反射须要顺序一致
[*]须要获取到request 中请求的参数Map 获取参数名和参数值
request.setCharacterEncoding("utf-8");
Map<String, String[]> parameterMap = request.getParameterMap();
for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
    String name = entry.getKey();//参数 键
    String value = entry.getValue();//参数 值
[*]可以将功能具体化到 完成这个新数组的实参填写 【完成新数组之后放入invoke方法举行反射就行】
[*]将步调拆解成 1)完成HttpServletRequest 和 HttpServletResponse 的填写 ;2)完成带有@RequestParam注解的形参的填写;3)完成平凡的方法参数没有@RequestParam注解的形参的填写
[*]完成HttpServletRequest 和 HttpServletResponse 的填写:就须要先拿到目标方法的所有参数。根据范例的名称 和 形参列表举行匹配 填写
for (int i = 0; i < parameterTypes.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Class parameterType = parameterTypes;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if ("HttpServletRequest".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = request;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } else if ("HttpServletResponse".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = response;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}
[*]完成带有@RequestParam注解的形参的填写:须要添加方法,获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返回int 代表第几个参数,如果有@RequestParam注解,就会返回相应的索引,如果没有就会返回-1 举行平凡方法参数的填写 处置惩罚
//获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返 private int getRequestParamterIndex(Method method,String name){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Parameter[] parameters = method.getParameters();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    for (int i = 0; i < parameters.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Parameter parameter = parameters;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (parameter.isAnnotationPresent(RequestParam.class)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String value = parameter.getAnnotation(RequestParam.class).value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (name.equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return i;//返回int 代表第几个参数<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return -1;    }int requestParamterIndex = getRequestParamterIndex(zyHandler.getMethod(), name);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (requestParamterIndex != -1) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }
[*]平凡方法参数的 填写:须要添加方法,将目标方法的所有的形参的名称 反射保存到 List 返回,再通过遍历判定 请求的参数名和 List中一致的 填写到 数组中
        //将目标方法的所有的形参的名称 反射保存到 List 返回    private List getParameterNames(Method method){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>List parameterList = new ArrayList();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//获取到所有的参数名称<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Parameter[] parameters = method.getParameters();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Parameter parameter : parameters) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //在默认情况下 parameter.getName() 获取的名字不是形参真正的名字<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //而是<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //须要插件,使用java8的特性 解决<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String name = parameter.getName();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    parameterList.add(name);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("目标方法的形参列表=" + parameterList);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return parameterList;    }else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//没找到@RequestParam 对应参数--使用默认机制<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//1. 得到目标方法的所有形参名<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//2. 对得到目标方法的所有形参名举行遍历,<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//如果匹配就把当前请求的参数值放入params<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>List parameterNames = getParameterNames(zyHandler.getMethod());<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (int i = 0; i < parameterNames.size(); i++) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (name.equals(parameterNames.get(i))) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>break;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }
[*]平凡方法参数的 填写 须要插件,使用java8的特性 解决在默认情况下 parameter.getName() 获取的名字不是形参真正的名字,而是的问题
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    com.fasterxml.jackson.core      jackson-databind      2.14.0   

[*]完备代码
public void executeDispatch(HttpServletRequest request, HttpServletResponse response) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ZyHandler zyHandler = getZyHandler(request);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (null == zyHandler) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>response.getWriter().write("404 NOT FOUND!

");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Method method = zyHandler.getMethod();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Class[] parameterTypes = method.getParameterTypes();//形参数组<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Object[] params = new Object;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历 parameterTypes<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//获取 HttpServletRequest , HttpServletResponse 在形参数组中的位置<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//将request 和 response 保存到params相应的位置上<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (int i = 0; i < parameterTypes.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    Class parameterType = parameterTypes;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if ("HttpServletRequest".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = request;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } else if ("HttpServletResponse".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = response;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//获取request中的<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>request.setCharacterEncoding("utf-8");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Map parameterMap = request.getParameterMap();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Map.Entry entry : parameterMap.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String name = entry.getKey();//参数 键<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    String value = entry.getValue();//参数 值<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //获取形参数组中 带有@RequestParam 的形参 的位置<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    //将带有@RequestParam 保存到params相应的位置上<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    int requestParamterIndex = getRequestParamterIndex(zyHandler.getMethod(), name);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (requestParamterIndex != -1) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//没找到@RequestParam 对应参数--使用默认机制<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//1. 得到目标方法的所有形参名<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//2. 对得到目标方法的所有形参名举行遍历,<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//如果匹配就把当前请求的参数值放入params<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>List parameterNames = getParameterNames(zyHandler.getMethod());<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (int i = 0; i < parameterNames.size(); i++) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (name.equals(parameterNames.get(i))) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>params = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>break;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}视图解析

思绪


[*]首先 视图解析 它是在分发请求后 在目标方法中举行视图的跳转 forward 大概 redirect,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
[*]在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
[*]当返回的是String范例后 我们就可以根据 splic(":")举行分隔
[*]splic(":") 就是举行跳转的方式 forward 大概 redirect
[*]splic(":") 就是举行跳转的页面
[*]如果没有":" ,就说明是默认情况,forward 处置惩罚即可
实现


[*]首先 视图解析 它是在分发请求后 在目标方法中举行视图的跳转 forward 大概 redirect,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
[*]在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
Object result = zyHandler.getMethod().invoke(zyHandler.getController(), params);
[*]当返回的是String范例后 我们就可以根据 splic(":")举行分隔
[*]splic(":") 就是举行跳转的方式 forward 大概 redirect
[*]splic(":") 就是举行跳转的页面
[*]如果没有":" ,就说明是默认情况,forward 处置惩罚即可
if (result instanceof String){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>   String viewName =(String) result;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    if (viewName.contains(":")) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String viewType = viewName.split(":");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String viewPage = viewName.split(":");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if ("forward".equals(viewType)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    request.getRequestDispatcher(viewPage).forward(request,response);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}else if (("redirect".equals(viewType))){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    response.sendRedirect(viewPage);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>request.getRequestDispatcher(viewName).forward(request,response);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>    }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}@ResponseBody 返回JSON数据

实现


[*]首先@ResponseBody是写在方法上的 因此 @Target(ElementType.METHOD)
[*]没有默认值 @ResponseBody仅仅作为一个标识
[*]@ResponseBody它是在分发请求后 在目标方法中标识该方法返回JSON格式的数据给浏览器,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
[*]在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
[*]当返回的是一个聚集范例,并且判定该方法有注解@ResponseBody ,就说明是须要向浏览器返回JSON格式数据
[*]用jackson 包下的 objectWriter对象的 objectMapper.writeValueAsString()方法 ,可以很轻松的将聚集转化为JSON举行返回
[*]不要忘了设置response格式,防止乱码,response.setContentType("text/html;charset=utf-8");
[*]直接用response.getWriter.writer()将转化后的结果返回给浏览器即可
思绪


[*]首先@ResponseBody是写在方法上的 因此 @Target(ElementType.METHOD)
[*]没有默认值 @ResponseBody仅仅作为一个标识
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ResponseBody {
}
[*]@ResponseBody它是在分发请求后 在目标方法中标识该方法返回JSON格式的数据给浏览器,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
[*]在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
[*]当返回的是一个聚集范例,并且判定该方法有注解@ResponseBody ,就说明是须要向浏览器返回JSON格式数据
[*]用jackson 包下的 objectWriter对象的 objectMapper.writeValueAsString()方法 ,可以很轻松的将聚集转化为JSON举行返回
else if (result instanceof ArrayList) {    if (zyHandler.getMethod().isAnnotationPresent(ResponseBody.class)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ObjectMapper objectMapper = new ObjectMapper();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String json = objectMapper.writeValueAsString(result);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>response.setContentType("text/html;charset=utf-8");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>PrintWriter writer = response.getWriter();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>writer.write(json);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>writer.flush();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
   
    <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>writer.close();    }}
[*]不要忘了设置response格式,防止乱码,response.setContentType("text/html;charset=utf-8");
[*]直接用response.getWriter.writer()将转化后的结果返回给浏览器即可

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 手写SpringMVC底层机制