手写SpringMVC底层机制

打印 上一主题 下一主题

主题 853|帖子 853|积分 2561

手写 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的依赖
  1.     <dependency>
  2.       <groupId>javax.servlet</groupId>
  3.       <artifactId>javax.servlet-api</artifactId>
  4.       <version>3.1.0</version>
  5.       <scope>provided</scope>
  6.    
  7.     </dependency>
  8.   
  9.     <dependency>
  10.       <groupId>dom4j</groupId>
  11.       <artifactId>dom4j</artifactId>
  12.       <version>1.1</version>
  13.     </dependency>
  14.   
  15.     <dependency>
  16.       <groupId>org.apache.commons</groupId>
  17.       <artifactId>commons-lang3</artifactId>
  18.       <version>3.12.0</version>
  19.     </dependency>
复制代码

  • 须要写一个Servlet 作为前端控制器
  1. public class ZyDispatcherServlet extends HttpServlet {
  2.     @Override
  3.     protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  4. <?xml version="1.0" encoding="UTF-8" ?>
  5. <beans>
  6.    
  7.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  8. </beans>System.out.println("ZyDispatcherServlet-doPost--");
  9.     }
  10.     @Override
  11.     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  12. <?xml version="1.0" encoding="UTF-8" ?>
  13. <beans>
  14.    
  15.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  16. </beans>System.out.println("ZyDispatcherServlet-doGet--");
  17.     }
  18. }
复制代码

  • 须要配置Web.xml 中的前端控制器 1).url 2)配置spring容器配置文件的classpath:  3)跟随Tomcat 自启动
  • 须要配置spring容器配置文件 扫描的路径
  1. <servlet>
  2.     <servlet-name>ZyDispatcherServlet</servlet-name>
  3.     <servlet-class>com.code_study.zyspringmvc.servlet.ZyDispatcherServlet</servlet-class>
  4.    
  5.    
  6.     <init-param>
  7.       <param-name>contextConfigLocation</param-name>
  8.       <param-value>classpath:zyspringmvc.xml</param-value>
  9.     </init-param>
  10.    
  11.     <load-on-startup>1</load-on-startup>
  12.   </servlet>
  13.   <servlet-mapping>
  14.     <servlet-name>ZyDispatcherServlet</servlet-name>
  15.     <url-pattern>/</url-pattern>
  16.   </servlet-mapping>
复制代码

  • 须要配置spring容器配置文件
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </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
  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Controller {
  5.     String value() default "";
  6. }
复制代码

  • 创建Controller
  1. @Controller
  2. public class MonsterController {
  3. }
复制代码

  • 须要写一个工具类XMLParser来解析在spring容器配置文件 扫描的路径  的包 返回所有的路径
  1. public class XMLParser {    public static String getBasePackage(String xmlFile){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>SAXReader saxReader = new SAXReader();<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>ClassLoader classLoader = XMLParser.class.getClassLoader();<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>InputStream resourceAsStream = classLoader.getResourceAsStream(xmlFile);<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>    Document document = saxReader.read(resourceAsStream);<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>    Element rootElement = document.getRootElement();<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>    Element element = rootElement.element("component-scan");<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans>    String basePackage = element.attribute("base-package").getText();<?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>    return basePackage;<?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans>} catch (DocumentException e) {<?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans>    throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans>}    }}
复制代码

  • 这个所有的路径 一个split(",")分隔,都举行扫描
  • 须要写本身的 前端控制器
  • 须要写本身的 Spring容器
  • 在前端控制器中 须要添加方法 scanPackage() 扫描 XMLParser 解析出来的路径
  1. public void scanPackage(String pack) {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>//获得包所在的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>URL url =<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans><?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>this.getClass().getClassLoader().//获取类的加载器<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans><?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans><?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>//得到指定包对应的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans><?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans><?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans><?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans>getResource("/" + pack.replaceAll("\\.", "/"));<?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans>// System.out.println("url= "+url);<?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans>//根据得到的路径,对其举行扫描,把类的全路径 保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans>String path = url.getFile();<?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans>//在io中 把目录也是为一个文件<?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans>File file = new File(path);<?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans>//遍历file 【遍历出文件和子目录】<?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans>for (File f : file.listFiles()) {<?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans>    if (f.isDirectory()) {//如果是目录<?xml version="1.0" encoding="UTF-8" ?>
  78. <beans>
  79.    
  80.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  81. </beans><?xml version="1.0" encoding="UTF-8" ?>
  82. <beans>
  83.    
  84.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  85. </beans>//须要递归扫描 找子目录<?xml version="1.0" encoding="UTF-8" ?>
  86. <beans>
  87.    
  88.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  89. </beans><?xml version="1.0" encoding="UTF-8" ?>
  90. <beans>
  91.    
  92.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  93. </beans>scanPackage(pack + "." + f.getName());<?xml version="1.0" encoding="UTF-8" ?>
  94. <beans>
  95.    
  96.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  97. </beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
  98. <beans>
  99.    
  100.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  101. </beans><?xml version="1.0" encoding="UTF-8" ?>
  102. <beans>
  103.    
  104.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  105. </beans>//的确是个文件<?xml version="1.0" encoding="UTF-8" ?>
  106. <beans>
  107.    
  108.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  109. </beans><?xml version="1.0" encoding="UTF-8" ?>
  110. <beans>
  111.    
  112.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  113. </beans>//扫描到的文件大概是 .class 文件 也大概是其他文件<?xml version="1.0" encoding="UTF-8" ?>
  114. <beans>
  115.    
  116.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  117. </beans><?xml version="1.0" encoding="UTF-8" ?>
  118. <beans>
  119.    
  120.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  121. </beans>//就算是.class 文件 也须要判定是否须要注入容器 有无加 @Controller注解<?xml version="1.0" encoding="UTF-8" ?>
  122. <beans>
  123.    
  124.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  125. </beans><?xml version="1.0" encoding="UTF-8" ?>
  126. <beans>
  127.    
  128.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  129. </beans>//现在无法拿到注解 由于没法反射 以是先把文件的全路径都保存到 classFullPathList 之后在注入对象到容器时再处置惩罚<?xml version="1.0" encoding="UTF-8" ?>
  130. <beans>
  131.    
  132.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  133. </beans><?xml version="1.0" encoding="UTF-8" ?>
  134. <beans>
  135.    
  136.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  137. </beans>String classFullPath =<?xml version="1.0" encoding="UTF-8" ?>
  138. <beans>
  139.    
  140.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  141. </beans><?xml version="1.0" encoding="UTF-8" ?>
  142. <beans>
  143.    
  144.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  145. </beans><?xml version="1.0" encoding="UTF-8" ?>
  146. <beans>
  147.    
  148.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  149. </beans>//类的全路径不须要.class 去掉.class<?xml version="1.0" encoding="UTF-8" ?>
  150. <beans>
  151.    
  152.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  153. </beans><?xml version="1.0" encoding="UTF-8" ?>
  154. <beans>
  155.    
  156.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  157. </beans><?xml version="1.0" encoding="UTF-8" ?>
  158. <beans>
  159.    
  160.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  161. </beans>pack + "." + f.getName().replaceAll(".class", "");<?xml version="1.0" encoding="UTF-8" ?>
  162. <beans>
  163.    
  164.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  165. </beans><?xml version="1.0" encoding="UTF-8" ?>
  166. <beans>
  167.    
  168.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  169. </beans>//保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
  170. <beans>
  171.    
  172.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  173. </beans><?xml version="1.0" encoding="UTF-8" ?>
  174. <beans>
  175.    
  176.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  177. </beans>classFullPathList.add(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
  178. <beans>
  179.    
  180.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  181. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  182. <beans>
  183.    
  184.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  185. </beans>}    }
复制代码

  • 在Spring容器中 须要添加一个属性 classFullPathList 来保存扫描出来的类的全路径
  1. //保存扫描的包/子包类的全路径    private List classFullPathList =<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>    new ArrayList();
复制代码

  • 须要添加一个属性 ioc 来存放反射生成的bean对象 也就是过滤classFullPathList  中没有@Controller注解的一些路径 并实例化
  1. //定义属性 ioc -> 存放反射生成的bean对象 好比Controller / Service /Daopublic ConcurrentHashMap ioc =<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>new ConcurrentHashMap();
复制代码

  • 编写方法,将扫描到的类,在满意情况下 反射到ioc容器
  1. //编写方法,将扫描到的类,在满意情况下 反射到ioc容器    public void executeInstance() {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>if (classFullPathList.size() == 0) {<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>    //说明没有扫描到类<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>    return;<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>//遍历classFullList<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>for (String classFullPath : classFullPathList) {<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>    try {<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans><?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>Class clazz = Class.forName(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans><?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans>if (clazz.isAnnotationPresent(Controller.class)) {//处置惩罚@Controller<?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans><?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans>    String className = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans><?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans>    Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans><?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans>    String value = clazz.getAnnotation(Controller.class).value();<?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans><?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans>    if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
  78. <beans>
  79.    
  80.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  81. </beans><?xml version="1.0" encoding="UTF-8" ?>
  82. <beans>
  83.    
  84.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  85. </beans><?xml version="1.0" encoding="UTF-8" ?>
  86. <beans>
  87.    
  88.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  89. </beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
  90. <beans>
  91.    
  92.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  93. </beans><?xml version="1.0" encoding="UTF-8" ?>
  94. <beans>
  95.    
  96.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  97. </beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
  98. <beans>
  99.    
  100.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  101. </beans><?xml version="1.0" encoding="UTF-8" ?>
  102. <beans>
  103.    
  104.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  105. </beans><?xml version="1.0" encoding="UTF-8" ?>
  106. <beans>
  107.    
  108.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  109. </beans>className = StringUtils.uncapitalize(className);<?xml version="1.0" encoding="UTF-8" ?>
  110. <beans>
  111.    
  112.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  113. </beans><?xml version="1.0" encoding="UTF-8" ?>
  114. <beans>
  115.    
  116.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  117. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  118. <beans>
  119.    
  120.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  121. </beans><?xml version="1.0" encoding="UTF-8" ?>
  122. <beans>
  123.    
  124.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  125. </beans>    ioc.put(className, instance);<?xml version="1.0" encoding="UTF-8" ?>
  126. <beans>
  127.    
  128.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  129. </beans><?xml version="1.0" encoding="UTF-8" ?>
  130. <beans>
  131.    
  132.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  133. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  134. <beans>
  135.    
  136.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  137. </beans><?xml version="1.0" encoding="UTF-8" ?>
  138. <beans>
  139.    
  140.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  141. </beans>else if (clazz.isAnnotationPresent(Service.class)) {//处置惩罚@Service<?xml version="1.0" encoding="UTF-8" ?>
  142. <beans>
  143.    
  144.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  145. </beans><?xml version="1.0" encoding="UTF-8" ?>
  146. <beans>
  147.    
  148.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  149. </beans>    String className = clazz.getSimpleName();//类名<?xml version="1.0" encoding="UTF-8" ?>
  150. <beans>
  151.    
  152.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  153. </beans><?xml version="1.0" encoding="UTF-8" ?>
  154. <beans>
  155.    
  156.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  157. </beans>    Service serviceAnnotation = clazz.getAnnotation(Service.class);<?xml version="1.0" encoding="UTF-8" ?>
  158. <beans>
  159.    
  160.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  161. </beans><?xml version="1.0" encoding="UTF-8" ?>
  162. <beans>
  163.    
  164.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  165. </beans>    String value = serviceAnnotation.value();<?xml version="1.0" encoding="UTF-8" ?>
  166. <beans>
  167.    
  168.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  169. </beans><?xml version="1.0" encoding="UTF-8" ?>
  170. <beans>
  171.    
  172.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  173. </beans>    if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
  174. <beans>
  175.    
  176.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  177. </beans><?xml version="1.0" encoding="UTF-8" ?>
  178. <beans>
  179.    
  180.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  181. </beans><?xml version="1.0" encoding="UTF-8" ?>
  182. <beans>
  183.    
  184.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  185. </beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
  186. <beans>
  187.    
  188.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  189. </beans><?xml version="1.0" encoding="UTF-8" ?>
  190. <beans>
  191.    
  192.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  193. </beans><?xml version="1.0" encoding="UTF-8" ?>
  194. <beans>
  195.    
  196.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  197. </beans>Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
  198. <beans>
  199.    
  200.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  201. </beans><?xml version="1.0" encoding="UTF-8" ?>
  202. <beans>
  203.    
  204.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  205. </beans><?xml version="1.0" encoding="UTF-8" ?>
  206. <beans>
  207.    
  208.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  209. </beans>ioc.put(className, instance);                                }<?xml version="1.0" encoding="UTF-8" ?>
  210. <beans>
  211.    
  212.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  213. </beans>    } catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
  214. <beans>
  215.    
  216.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  217. </beans><?xml version="1.0" encoding="UTF-8" ?>
  218. <beans>
  219.    
  220.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  221. </beans>throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
  222. <beans>
  223.    
  224.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  225. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  226. <beans>
  227.    
  228.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  229. </beans>}    }
复制代码

  • 须要添加类Handler 这个类要保存 一个url 对应的 一个控制器的方法的 映射 ,也就是说,根据这个url,可以找到对应控制器的对应方法
  1. 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" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>this.url = url;<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>this.method = method;<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>this.controller = controller;    }//须要提供getter和setter方法...
复制代码

  • 须要添加一个属性 HandlerList 用于 保存Handler 【url 和 控制器的映射】
  1. //定义属性 HandlerList -> 保存ZyHandler 【url 和 控制器的映射】    private List HandlerList =<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>    new ArrayList();
复制代码

  • 须要添加三个方法 一个是initHandlerMapping(),完成 url 对应的 一个控制器的方法的 映射,即 将ioc 中bean 中的 方法举行反射,获取url,将 url,method,bean 封装成Handler  放入HandlerList  保存
  1. private void initHandlerMapping(){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>//遍历 ioc<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>for (Map.Entry entry:  zyWebApplicationContext.ioc.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>    if (zyWebApplicationContext.ioc.isEmpty()){<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans><?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>return;<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>    Object bean = entry.getValue();<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans>    Class clazz = bean.getClass();<?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>    if (clazz.isAnnotationPresent(Controller.class)){<?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans><?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans>Method[] declaredMethods = clazz.getDeclaredMethods();<?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans><?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans>for (Method declaredMethod : declaredMethods) {<?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans><?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans>    if (declaredMethod.isAnnotationPresent(RequestMapping.class)){<?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans><?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans><?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans>String url = declaredMethod.getAnnotation(RequestMapping.class).value();<?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans><?xml version="1.0" encoding="UTF-8" ?>
  78. <beans>
  79.    
  80.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  81. </beans><?xml version="1.0" encoding="UTF-8" ?>
  82. <beans>
  83.    
  84.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  85. </beans>ZyHandler zyHandler = new ZyHandler(url, declaredMethod, bean);<?xml version="1.0" encoding="UTF-8" ?>
  86. <beans>
  87.    
  88.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  89. </beans><?xml version="1.0" encoding="UTF-8" ?>
  90. <beans>
  91.    
  92.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  93. </beans><?xml version="1.0" encoding="UTF-8" ?>
  94. <beans>
  95.    
  96.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  97. </beans>HandlerList.add(zyHandler);<?xml version="1.0" encoding="UTF-8" ?>
  98. <beans>
  99.    
  100.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  101. </beans><?xml version="1.0" encoding="UTF-8" ?>
  102. <beans>
  103.    
  104.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  105. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  106. <beans>
  107.    
  108.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  109. </beans><?xml version="1.0" encoding="UTF-8" ?>
  110. <beans>
  111.    
  112.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  113. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  114. <beans>
  115.    
  116.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  117. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  118. <beans>
  119.    
  120.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  121. </beans>}    }
复制代码

  • 添加第二个方法 getHandler(),须要将浏览器发送的request请求中的 uri拿出来,遍历HandlerList  举行配对,如果有 就返回对应的Handler
  1. //编写方法,通过request对象 返回ZyHandler对象 ,如果没有返回null    private ZyHandler getZyHandler(HttpServletRequest request) {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>String requestURI = request.getRequestURI();<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>//遍历HandlerList<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>for (ZyHandler zyHandler : HandlerList) {<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>    if (requestURI.equals(zyHandler.getUrl())){<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans><?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>return zyHandler;<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>return null;    }
复制代码

  • 添加第三个方法 executeDispatch(),举行分发处置惩罚,须要 调用getHandler() 获取浏览器发送的request请求 对应的 Handler  ,获取Handler  中的method 举行反射调用,method .invoke() 实现分发请求。
  1.    public void executeDispatch(HttpServletRequest request,HttpServletResponse response){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>ZyHandler zyHandler = getZyHandler(request);<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>    if (null == zyHandler){<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>       response.getWriter().write("[size=6]404 NOT FOUND[/size]
  18. ");<?xml version="1.0" encoding="UTF-8" ?>
  19. <beans>
  20.    
  21.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  22. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  23. <beans>
  24.    
  25.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  26. </beans>    Method method = zyHandler.getMethod();<?xml version="1.0" encoding="UTF-8" ?>
  27. <beans>
  28.    
  29.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  30. </beans>    method.invoke(zyHandler.getController(),request,response);<?xml version="1.0" encoding="UTF-8" ?>
  31. <beans>
  32.    
  33.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  34. </beans>} catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
  35. <beans>
  36.    
  37.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  38. </beans>    throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
  39. <beans>
  40.    
  41.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  42. </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容器中举行解析。
  1. @Override    public void init() throws ServletException {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>String configLocation = getServletConfig().getInitParameter("contextConfigLocation");<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>System.out.println("ZyDispatcherServlet 初始化---");<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>zyWebApplicationContext = new ZyWebApplicationContext(configLocation);<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>zyWebApplicationContext.init();<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>initHandlerMapping();<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>System.out.println("HandlerList= "+HandlerList);    }
复制代码
  1. private  String configLocation;    public ZyWebApplicationContext(String configLocation) {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>this.configLocation = configLocation;    }
复制代码
  1. public void init(){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>System.out.println("ZyWebApplicationContext 初始化---");<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>String basePackage = XMLParser.getBasePackage(configLocation.split(":")[1]);<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>String[] basePackages = basePackage.split(",");<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>if (basePackages.length >0) {<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>    for (String  pack : basePackages) {<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans><?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>scanPackage(pack);<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>} }
复制代码
@Service注解

思绪


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


  • @Service注解是写在类上的 即@Target(ElementType.TYPE)
  1. @Target(ElementType.TYPE)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Service {
  5.     String value() default "";
  6. }
复制代码

  • 这个注解标识的类就是一个Service,那么同样是在executeInstance()方法中判定是否有注解@Service,有的话就保存到ioc容器中
  • 由于是Service,那么保存进ioc 的 k-v 中的 k 就有三种。第一种,就是默认值,用接口的范例的名字首字母小写;第二种,在@Service注解种设置了value属性,那么 k = value;第三章,须要用类名首字母小写也可以获取bean
  1. public void executeInstance() {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>if (classFullPathList.size() == 0){<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>    return;<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>//遍历 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>for (String classFullPath : classFullPathList) {<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>    try {<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans><?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans>Class clazz = Class.forName(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans><?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans>if (clazz.isAnnotationPresent(Controller.class)){<?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans><?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans>    Controller controller = clazz.getAnnotation(Controller.class);<?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans><?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans>    String value = controller.value();<?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans><?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans>    String className = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans><?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans>    Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans><?xml version="1.0" encoding="UTF-8" ?>
  78. <beans>
  79.    
  80.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  81. </beans>    if ("".equals(value)){<?xml version="1.0" encoding="UTF-8" ?>
  82. <beans>
  83.    
  84.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  85. </beans><?xml version="1.0" encoding="UTF-8" ?>
  86. <beans>
  87.    
  88.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  89. </beans><?xml version="1.0" encoding="UTF-8" ?>
  90. <beans>
  91.    
  92.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  93. </beans>className = StringUtils.uncapitalize(className);<?xml version="1.0" encoding="UTF-8" ?>
  94. <beans>
  95.    
  96.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  97. </beans><?xml version="1.0" encoding="UTF-8" ?>
  98. <beans>
  99.    
  100.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  101. </beans>    }else {<?xml version="1.0" encoding="UTF-8" ?>
  102. <beans>
  103.    
  104.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  105. </beans><?xml version="1.0" encoding="UTF-8" ?>
  106. <beans>
  107.    
  108.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  109. </beans><?xml version="1.0" encoding="UTF-8" ?>
  110. <beans>
  111.    
  112.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  113. </beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
  114. <beans>
  115.    
  116.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  117. </beans><?xml version="1.0" encoding="UTF-8" ?>
  118. <beans>
  119.    
  120.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  121. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  122. <beans>
  123.    
  124.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  125. </beans><?xml version="1.0" encoding="UTF-8" ?>
  126. <beans>
  127.    
  128.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  129. </beans>    ioc.put(className,instance);<?xml version="1.0" encoding="UTF-8" ?>
  130. <beans>
  131.    
  132.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  133. </beans><?xml version="1.0" encoding="UTF-8" ?>
  134. <beans>
  135.    
  136.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  137. </beans>} else if (clazz.isAnnotationPresent(Service.class)) {<?xml version="1.0" encoding="UTF-8" ?>
  138. <beans>
  139.    
  140.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  141. </beans><?xml version="1.0" encoding="UTF-8" ?>
  142. <beans>
  143.    
  144.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  145. </beans>    Service serviceAnnotation = clazz.getAnnotation(Service.class);<?xml version="1.0" encoding="UTF-8" ?>
  146. <beans>
  147.    
  148.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  149. </beans><?xml version="1.0" encoding="UTF-8" ?>
  150. <beans>
  151.    
  152.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  153. </beans>    String annoattionValue = serviceAnnotation.value();<?xml version="1.0" encoding="UTF-8" ?>
  154. <beans>
  155.    
  156.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  157. </beans><?xml version="1.0" encoding="UTF-8" ?>
  158. <beans>
  159.    
  160.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  161. </beans>    Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
  162. <beans>
  163.    
  164.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  165. </beans><?xml version="1.0" encoding="UTF-8" ?>
  166. <beans>
  167.    
  168.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  169. </beans>    if ("".equals(annoattionValue)){<?xml version="1.0" encoding="UTF-8" ?>
  170. <beans>
  171.    
  172.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  173. </beans><?xml version="1.0" encoding="UTF-8" ?>
  174. <beans>
  175.    
  176.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  177. </beans><?xml version="1.0" encoding="UTF-8" ?>
  178. <beans>
  179.    
  180.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  181. </beans>Class[] interfaces = clazz.getInterfaces();<?xml version="1.0" encoding="UTF-8" ?>
  182. <beans>
  183.    
  184.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  185. </beans><?xml version="1.0" encoding="UTF-8" ?>
  186. <beans>
  187.    
  188.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  189. </beans><?xml version="1.0" encoding="UTF-8" ?>
  190. <beans>
  191.    
  192.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  193. </beans>for (Class anInterface : interfaces) {<?xml version="1.0" encoding="UTF-8" ?>
  194. <beans>
  195.    
  196.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  197. </beans><?xml version="1.0" encoding="UTF-8" ?>
  198. <beans>
  199.    
  200.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  201. </beans><?xml version="1.0" encoding="UTF-8" ?>
  202. <beans>
  203.    
  204.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  205. </beans>    String simpleName = anInterface.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
  206. <beans>
  207.    
  208.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  209. </beans><?xml version="1.0" encoding="UTF-8" ?>
  210. <beans>
  211.    
  212.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  213. </beans><?xml version="1.0" encoding="UTF-8" ?>
  214. <beans>
  215.    
  216.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  217. </beans>    simpleName = StringUtils.uncapitalize(simpleName);<?xml version="1.0" encoding="UTF-8" ?>
  218. <beans>
  219.    
  220.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  221. </beans><?xml version="1.0" encoding="UTF-8" ?>
  222. <beans>
  223.    
  224.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  225. </beans><?xml version="1.0" encoding="UTF-8" ?>
  226. <beans>
  227.    
  228.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  229. </beans>    ioc.put(simpleName,instance);<?xml version="1.0" encoding="UTF-8" ?>
  230. <beans>
  231.    
  232.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  233. </beans><?xml version="1.0" encoding="UTF-8" ?>
  234. <beans>
  235.    
  236.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  237. </beans><?xml version="1.0" encoding="UTF-8" ?>
  238. <beans>
  239.    
  240.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  241. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  242. <beans>
  243.    
  244.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  245. </beans><?xml version="1.0" encoding="UTF-8" ?>
  246. <beans>
  247.    
  248.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  249. </beans><?xml version="1.0" encoding="UTF-8" ?>
  250. <beans>
  251.    
  252.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  253. </beans>//可以通过类名首字母小写<?xml version="1.0" encoding="UTF-8" ?>
  254. <beans>
  255.    
  256.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  257. </beans><?xml version="1.0" encoding="UTF-8" ?>
  258. <beans>
  259.    
  260.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  261. </beans><?xml version="1.0" encoding="UTF-8" ?>
  262. <beans>
  263.    
  264.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  265. </beans>String simpleName = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
  266. <beans>
  267.    
  268.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  269. </beans><?xml version="1.0" encoding="UTF-8" ?>
  270. <beans>
  271.    
  272.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  273. </beans><?xml version="1.0" encoding="UTF-8" ?>
  274. <beans>
  275.    
  276.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  277. </beans>simpleName = StringUtils.uncapitalize(simpleName);<?xml version="1.0" encoding="UTF-8" ?>
  278. <beans>
  279.    
  280.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  281. </beans><?xml version="1.0" encoding="UTF-8" ?>
  282. <beans>
  283.    
  284.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  285. </beans><?xml version="1.0" encoding="UTF-8" ?>
  286. <beans>
  287.    
  288.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  289. </beans>ioc.put(simpleName,instance);<?xml version="1.0" encoding="UTF-8" ?>
  290. <beans>
  291.    
  292.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  293. </beans><?xml version="1.0" encoding="UTF-8" ?>
  294. <beans>
  295.    
  296.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  297. </beans>    }else {<?xml version="1.0" encoding="UTF-8" ?>
  298. <beans>
  299.    
  300.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  301. </beans><?xml version="1.0" encoding="UTF-8" ?>
  302. <beans>
  303.    
  304.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  305. </beans><?xml version="1.0" encoding="UTF-8" ?>
  306. <beans>
  307.    
  308.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  309. </beans>ioc.put(annoattionValue,instance);<?xml version="1.0" encoding="UTF-8" ?>
  310. <beans>
  311.    
  312.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  313. </beans><?xml version="1.0" encoding="UTF-8" ?>
  314. <beans>
  315.    
  316.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  317. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  318. <beans>
  319.    
  320.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  321. </beans><?xml version="1.0" encoding="UTF-8" ?>
  322. <beans>
  323.    
  324.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  325. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  326. <beans>
  327.    
  328.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  329. </beans>    } catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
  330. <beans>
  331.    
  332.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  333. </beans><?xml version="1.0" encoding="UTF-8" ?>
  334. <beans>
  335.    
  336.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  337. </beans>throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
  338. <beans>
  339.    
  340.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  341. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  342. <beans>
  343.    
  344.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  345. </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)
  1. @Target(ElementType.FIELD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface Autowired {
  5.     String value() default "";
  6. }
复制代码

  • 须要遍历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);
  1. public void  executeAutoWired(){    //遍历ioc    if (ioc.isEmpty()){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>return;    }    //获取容器里的所有bean 以及 bean对应的字段    for (Map.Entry entry : ioc.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>Object bean = entry.getValue();<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>Class clazz = bean.getClass();<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>Field[] declaredFields = clazz.getDeclaredFields();<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>for (Field declaredField : declaredFields) {<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>    //通过反射获取字段,判定该字段是否带有@Autowried 注解,有的话就判定value值<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>    if (declaredField.isAnnotationPresent(Autowired.class)){<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans><?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>Autowired annotation =<?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans><?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans><?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans>declaredField.getAnnotation(Autowired.class);<?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans><?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans>String beanName = annotation.value();<?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans><?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans><?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans>    //value为"",说明按默认规则 用字段范例首字母小写 去ioc容器举行查找,<?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans><?xml version="1.0" encoding="UTF-8" ?>
  78. <beans>
  79.    
  80.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  81. </beans>    if ("".equals(beanName)){<?xml version="1.0" encoding="UTF-8" ?>
  82. <beans>
  83.    
  84.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  85. </beans><?xml version="1.0" encoding="UTF-8" ?>
  86. <beans>
  87.    
  88.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  89. </beans><?xml version="1.0" encoding="UTF-8" ?>
  90. <beans>
  91.    
  92.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  93. </beans>beanName = declaredField.getType().getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
  94. <beans>
  95.    
  96.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  97. </beans><?xml version="1.0" encoding="UTF-8" ?>
  98. <beans>
  99.    
  100.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  101. </beans><?xml version="1.0" encoding="UTF-8" ?>
  102. <beans>
  103.    
  104.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  105. </beans>beanName = StringUtils.uncapitalize(beanName);<?xml version="1.0" encoding="UTF-8" ?>
  106. <beans>
  107.    
  108.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  109. </beans><?xml version="1.0" encoding="UTF-8" ?>
  110. <beans>
  111.    
  112.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  113. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  114. <beans>
  115.    
  116.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  117. </beans><?xml version="1.0" encoding="UTF-8" ?>
  118. <beans>
  119.    
  120.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  121. </beans><?xml version="1.0" encoding="UTF-8" ?>
  122. <beans>
  123.    
  124.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  125. </beans>Object iocBean = ioc.get(beanName);<?xml version="1.0" encoding="UTF-8" ?>
  126. <beans>
  127.    
  128.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  129. </beans><?xml version="1.0" encoding="UTF-8" ?>
  130. <beans>
  131.    
  132.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  133. </beans>    //如果没有抛出空指针异常<?xml version="1.0" encoding="UTF-8" ?>
  134. <beans>
  135.    
  136.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  137. </beans><?xml version="1.0" encoding="UTF-8" ?>
  138. <beans>
  139.    
  140.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  141. </beans><?xml version="1.0" encoding="UTF-8" ?>
  142. <beans>
  143.    
  144.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  145. </beans>if (null == iocBean){<?xml version="1.0" encoding="UTF-8" ?>
  146. <beans>
  147.    
  148.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  149. </beans><?xml version="1.0" encoding="UTF-8" ?>
  150. <beans>
  151.    
  152.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  153. </beans><?xml version="1.0" encoding="UTF-8" ?>
  154. <beans>
  155.    
  156.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  157. </beans>    throw new NullPointerException("ioc 没有该Bean");<?xml version="1.0" encoding="UTF-8" ?>
  158. <beans>
  159.    
  160.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  161. </beans><?xml version="1.0" encoding="UTF-8" ?>
  162. <beans>
  163.    
  164.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  165. </beans><?xml version="1.0" encoding="UTF-8" ?>
  166. <beans>
  167.    
  168.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  169. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  170. <beans>
  171.    
  172.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  173. </beans><?xml version="1.0" encoding="UTF-8" ?>
  174. <beans>
  175.    
  176.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  177. </beans><?xml version="1.0" encoding="UTF-8" ?>
  178. <beans>
  179.    
  180.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  181. </beans>declaredField.setAccessible(true);//暴力破解<?xml version="1.0" encoding="UTF-8" ?>
  182. <beans>
  183.    
  184.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  185. </beans><?xml version="1.0" encoding="UTF-8" ?>
  186. <beans>
  187.    
  188.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  189. </beans><?xml version="1.0" encoding="UTF-8" ?>
  190. <beans>
  191.    
  192.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  193. </beans>declaredField.set(bean,iocBean);<?xml version="1.0" encoding="UTF-8" ?>
  194. <beans>
  195.    
  196.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  197. </beans><?xml version="1.0" encoding="UTF-8" ?>
  198. <beans>
  199.    
  200.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  201. </beans>} catch (IllegalAccessException e) {<?xml version="1.0" encoding="UTF-8" ?>
  202. <beans>
  203.    
  204.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  205. </beans><?xml version="1.0" encoding="UTF-8" ?>
  206. <beans>
  207.    
  208.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  209. </beans>    throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
  210. <beans>
  211.    
  212.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  213. </beans><?xml version="1.0" encoding="UTF-8" ?>
  214. <beans>
  215.    
  216.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  217. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  218. <beans>
  219.    
  220.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  221. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  222. <beans>
  223.    
  224.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  225. </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() 获取的名字不是形参真正的名字,而是[arg0,arg1,arg2...]的问题
实现


  • @RequestParam 是写在PARAMETER上的 也就是说 @Target(ElementType.PARAMETER)
  1. @Target(ElementType.PARAMETER)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface RequestParam {
  5.     String value() default "";
  6. }
复制代码

  • 这个注解实现的功能 大方向是 分发请求 也就是说 写在 executeDispatch()方法中的
  • 要实现 @RequestParam 须要将形参列表封装到一个数组中 , 由于反射 invoke 可以传入一个数组作为可变参数解析
  1. Method method = zyHandler.getMethod();
  2. Class<?>[] parameterTypes = method.getParameterTypes();//形参数组
  3. Object[] params = new Object[parameterTypes.length];
复制代码

  • 那么就须要两个数组 一个数组是新创建的数组(大小应与,目标数组的形参个数一致) 将实参放入进去 ;另一个是 反射拿到的目标方法的形参的数组
  • 这两个数组的内容须要一一对应,由于反射须要顺序一致
  • 须要获取到request 中请求的参数Map 获取参数名和参数值
  1. request.setCharacterEncoding("utf-8");
  2. Map<String, String[]> parameterMap = request.getParameterMap();
  3. for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
  4.     String name = entry.getKey();//参数 键
  5.     String value = entry.getValue()[0];//参数 值
复制代码

  • 可以将功能具体化到 完成这个新数组的实参填写 【完成新数组之后放入invoke方法举行反射就行】
  • 将步调拆解成 1)完成HttpServletRequest 和 HttpServletResponse 的填写 ;2)完成带有@RequestParam注解的形参的填写;3)完成平凡的方法参数没有@RequestParam注解的形参的填写
  • 完成HttpServletRequest 和 HttpServletResponse 的填写:就须要先拿到目标方法的所有参数。根据范例的名称 和 形参列表举行匹配 填写
  1. for (int i = 0; i < parameterTypes.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans><?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>    Class parameterType = parameterTypes[i];<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans><?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>    if ("HttpServletRequest".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans><?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans><?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>params[i] = request;<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans><?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>    } else if ("HttpServletResponse".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans><?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans><?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans>params[i] = response;<?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans><?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans><?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans>}
复制代码

  • 完成带有@RequestParam注解的形参的填写:须要添加方法,获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返回int 代表第几个参数,如果有@RequestParam注解,就会返回相应的索引,如果没有就会返回-1 举行平凡方法参数的填写 处置惩罚
  1. //获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返 private int getRequestParamterIndex(Method method,String name){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>    Parameter[] parameters = method.getParameters();<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>    for (int i = 0; i < parameters.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans><?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>Parameter parameter = parameters[i];<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans><?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>if (parameter.isAnnotationPresent(RequestParam.class)) {<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans><?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans>    String value = parameter.getAnnotation(RequestParam.class).value();<?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans><?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans>    if (name.equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans><?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans><?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans>return i;//返回int 代表第几个参数<?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans><?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans><?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans>return -1;    }
复制代码
  1. int requestParamterIndex = getRequestParamterIndex(zyHandler.getMethod(), name);<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans><?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>    if (requestParamterIndex != -1) {<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans><?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans><?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>params[requestParamterIndex] = value;<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans><?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>    }
复制代码

  • 平凡方法参数的 填写:须要添加方法,将目标方法的所有的形参的名称 反射保存到 List 返回,再通过遍历判定 请求的参数名  和 List中一致的 填写到 数组中
  1.         //将目标方法的所有的形参的名称 反射保存到 List 返回    private List getParameterNames(Method method){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>List parameterList = new ArrayList();<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>//获取到所有的参数名称<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>Parameter[] parameters = method.getParameters();<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>for (Parameter parameter : parameters) {<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>    //在默认情况下 parameter.getName() 获取的名字不是形参真正的名字<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>    //而是[arg0,arg1,arg2...]<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>    //须要插件,使用java8的特性 解决<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans>    String name = parameter.getName();<?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>    parameterList.add(name);<?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans>System.out.println("目标方法的形参列表=" + parameterList);<?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans>return parameterList;    }
复制代码
  1. else {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans><?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans><?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>//没找到@RequestParam 对应参数--使用默认机制<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans><?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans><?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>//1. 得到目标方法的所有形参名<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans><?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans><?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans>//2. 对得到目标方法的所有形参名举行遍历,<?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans><?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans><?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans>//如果匹配就把当前请求的参数值放入params<?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans><?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans><?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans>List parameterNames = getParameterNames(zyHandler.getMethod());<?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans><?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans><?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans>for (int i = 0; i < parameterNames.size(); i++) {<?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans><?xml version="1.0" encoding="UTF-8" ?>
  78. <beans>
  79.    
  80.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  81. </beans><?xml version="1.0" encoding="UTF-8" ?>
  82. <beans>
  83.    
  84.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  85. </beans>    if (name.equals(parameterNames.get(i))) {<?xml version="1.0" encoding="UTF-8" ?>
  86. <beans>
  87.    
  88.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  89. </beans><?xml version="1.0" encoding="UTF-8" ?>
  90. <beans>
  91.    
  92.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  93. </beans><?xml version="1.0" encoding="UTF-8" ?>
  94. <beans>
  95.    
  96.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  97. </beans><?xml version="1.0" encoding="UTF-8" ?>
  98. <beans>
  99.    
  100.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  101. </beans>params[i] = value;<?xml version="1.0" encoding="UTF-8" ?>
  102. <beans>
  103.    
  104.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  105. </beans><?xml version="1.0" encoding="UTF-8" ?>
  106. <beans>
  107.    
  108.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  109. </beans><?xml version="1.0" encoding="UTF-8" ?>
  110. <beans>
  111.    
  112.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  113. </beans><?xml version="1.0" encoding="UTF-8" ?>
  114. <beans>
  115.    
  116.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  117. </beans>break;<?xml version="1.0" encoding="UTF-8" ?>
  118. <beans>
  119.    
  120.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  121. </beans><?xml version="1.0" encoding="UTF-8" ?>
  122. <beans>
  123.    
  124.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  125. </beans><?xml version="1.0" encoding="UTF-8" ?>
  126. <beans>
  127.    
  128.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  129. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  130. <beans>
  131.    
  132.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  133. </beans><?xml version="1.0" encoding="UTF-8" ?>
  134. <beans>
  135.    
  136.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  137. </beans><?xml version="1.0" encoding="UTF-8" ?>
  138. <beans>
  139.    
  140.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  141. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  142. <beans>
  143.    
  144.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  145. </beans><?xml version="1.0" encoding="UTF-8" ?>
  146. <beans>
  147.    
  148.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  149. </beans>    }
复制代码

  • 平凡方法参数的 填写 须要插件,使用java8的特性 解决在默认情况下 parameter.getName() 获取的名字不是形参真正的名字,而是[arg0,arg1,arg2...]的问题
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>    com.fasterxml.jackson.core      jackson-databind      2.14.0   
复制代码

  • 完备代码
  1. public void executeDispatch(HttpServletRequest request, HttpServletResponse response) {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>ZyHandler zyHandler = getZyHandler(request);<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>    if (null == zyHandler) {<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans><?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>response.getWriter().write("[size=6]404 NOT FOUND![/size]
  22. ");<?xml version="1.0" encoding="UTF-8" ?>
  23. <beans>
  24.    
  25.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  26. </beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
  27. <beans>
  28.    
  29.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  30. </beans><?xml version="1.0" encoding="UTF-8" ?>
  31. <beans>
  32.    
  33.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  34. </beans>Method method = zyHandler.getMethod();<?xml version="1.0" encoding="UTF-8" ?>
  35. <beans>
  36.    
  37.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  38. </beans><?xml version="1.0" encoding="UTF-8" ?>
  39. <beans>
  40.    
  41.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  42. </beans>Class[] parameterTypes = method.getParameterTypes();//形参数组<?xml version="1.0" encoding="UTF-8" ?>
  43. <beans>
  44.    
  45.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  46. </beans><?xml version="1.0" encoding="UTF-8" ?>
  47. <beans>
  48.    
  49.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  50. </beans>Object[] params = new Object[parameterTypes.length];<?xml version="1.0" encoding="UTF-8" ?>
  51. <beans>
  52.    
  53.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  54. </beans><?xml version="1.0" encoding="UTF-8" ?>
  55. <beans>
  56.    
  57.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  58. </beans>//遍历 parameterTypes<?xml version="1.0" encoding="UTF-8" ?>
  59. <beans>
  60.    
  61.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  62. </beans><?xml version="1.0" encoding="UTF-8" ?>
  63. <beans>
  64.    
  65.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  66. </beans>//获取 HttpServletRequest , HttpServletResponse 在形参数组中的位置<?xml version="1.0" encoding="UTF-8" ?>
  67. <beans>
  68.    
  69.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  70. </beans><?xml version="1.0" encoding="UTF-8" ?>
  71. <beans>
  72.    
  73.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  74. </beans>//将request 和 response 保存到  params相应的位置上<?xml version="1.0" encoding="UTF-8" ?>
  75. <beans>
  76.    
  77.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  78. </beans><?xml version="1.0" encoding="UTF-8" ?>
  79. <beans>
  80.    
  81.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  82. </beans>for (int i = 0; i < parameterTypes.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
  83. <beans>
  84.    
  85.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  86. </beans><?xml version="1.0" encoding="UTF-8" ?>
  87. <beans>
  88.    
  89.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  90. </beans>    Class parameterType = parameterTypes[i];<?xml version="1.0" encoding="UTF-8" ?>
  91. <beans>
  92.    
  93.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  94. </beans><?xml version="1.0" encoding="UTF-8" ?>
  95. <beans>
  96.    
  97.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  98. </beans>    if ("HttpServletRequest".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
  99. <beans>
  100.    
  101.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  102. </beans><?xml version="1.0" encoding="UTF-8" ?>
  103. <beans>
  104.    
  105.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  106. </beans><?xml version="1.0" encoding="UTF-8" ?>
  107. <beans>
  108.    
  109.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  110. </beans>params[i] = request;<?xml version="1.0" encoding="UTF-8" ?>
  111. <beans>
  112.    
  113.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  114. </beans><?xml version="1.0" encoding="UTF-8" ?>
  115. <beans>
  116.    
  117.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  118. </beans>    } else if ("HttpServletResponse".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
  119. <beans>
  120.    
  121.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  122. </beans><?xml version="1.0" encoding="UTF-8" ?>
  123. <beans>
  124.    
  125.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  126. </beans><?xml version="1.0" encoding="UTF-8" ?>
  127. <beans>
  128.    
  129.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  130. </beans>params[i] = response;<?xml version="1.0" encoding="UTF-8" ?>
  131. <beans>
  132.    
  133.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  134. </beans><?xml version="1.0" encoding="UTF-8" ?>
  135. <beans>
  136.    
  137.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  138. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  139. <beans>
  140.    
  141.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  142. </beans><?xml version="1.0" encoding="UTF-8" ?>
  143. <beans>
  144.    
  145.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  146. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  147. <beans>
  148.    
  149.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  150. </beans><?xml version="1.0" encoding="UTF-8" ?>
  151. <beans>
  152.    
  153.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  154. </beans>//获取request中的<?xml version="1.0" encoding="UTF-8" ?>
  155. <beans>
  156.    
  157.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  158. </beans><?xml version="1.0" encoding="UTF-8" ?>
  159. <beans>
  160.    
  161.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  162. </beans>request.setCharacterEncoding("utf-8");<?xml version="1.0" encoding="UTF-8" ?>
  163. <beans>
  164.    
  165.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  166. </beans><?xml version="1.0" encoding="UTF-8" ?>
  167. <beans>
  168.    
  169.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  170. </beans>Map parameterMap = request.getParameterMap();<?xml version="1.0" encoding="UTF-8" ?>
  171. <beans>
  172.    
  173.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  174. </beans><?xml version="1.0" encoding="UTF-8" ?>
  175. <beans>
  176.    
  177.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  178. </beans>for (Map.Entry entry : parameterMap.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
  179. <beans>
  180.    
  181.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  182. </beans><?xml version="1.0" encoding="UTF-8" ?>
  183. <beans>
  184.    
  185.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  186. </beans>    String name = entry.getKey();//参数 键<?xml version="1.0" encoding="UTF-8" ?>
  187. <beans>
  188.    
  189.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  190. </beans><?xml version="1.0" encoding="UTF-8" ?>
  191. <beans>
  192.    
  193.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  194. </beans>    String value = entry.getValue()[0];//参数 值<?xml version="1.0" encoding="UTF-8" ?>
  195. <beans>
  196.    
  197.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  198. </beans><?xml version="1.0" encoding="UTF-8" ?>
  199. <beans>
  200.    
  201.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  202. </beans>    //获取形参数组中 带有@RequestParam 的形参 的位置<?xml version="1.0" encoding="UTF-8" ?>
  203. <beans>
  204.    
  205.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  206. </beans><?xml version="1.0" encoding="UTF-8" ?>
  207. <beans>
  208.    
  209.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  210. </beans>    //将带有@RequestParam 保存到  params相应的位置上<?xml version="1.0" encoding="UTF-8" ?>
  211. <beans>
  212.    
  213.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  214. </beans><?xml version="1.0" encoding="UTF-8" ?>
  215. <beans>
  216.    
  217.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  218. </beans>    int requestParamterIndex = getRequestParamterIndex(zyHandler.getMethod(), name);<?xml version="1.0" encoding="UTF-8" ?>
  219. <beans>
  220.    
  221.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  222. </beans><?xml version="1.0" encoding="UTF-8" ?>
  223. <beans>
  224.    
  225.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  226. </beans>    if (requestParamterIndex != -1) {<?xml version="1.0" encoding="UTF-8" ?>
  227. <beans>
  228.    
  229.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  230. </beans><?xml version="1.0" encoding="UTF-8" ?>
  231. <beans>
  232.    
  233.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  234. </beans><?xml version="1.0" encoding="UTF-8" ?>
  235. <beans>
  236.    
  237.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  238. </beans>params[requestParamterIndex] = value;<?xml version="1.0" encoding="UTF-8" ?>
  239. <beans>
  240.    
  241.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  242. </beans><?xml version="1.0" encoding="UTF-8" ?>
  243. <beans>
  244.    
  245.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  246. </beans>    } else {<?xml version="1.0" encoding="UTF-8" ?>
  247. <beans>
  248.    
  249.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  250. </beans><?xml version="1.0" encoding="UTF-8" ?>
  251. <beans>
  252.    
  253.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  254. </beans><?xml version="1.0" encoding="UTF-8" ?>
  255. <beans>
  256.    
  257.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  258. </beans>//没找到@RequestParam 对应参数--使用默认机制<?xml version="1.0" encoding="UTF-8" ?>
  259. <beans>
  260.    
  261.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  262. </beans><?xml version="1.0" encoding="UTF-8" ?>
  263. <beans>
  264.    
  265.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  266. </beans><?xml version="1.0" encoding="UTF-8" ?>
  267. <beans>
  268.    
  269.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  270. </beans>//1. 得到目标方法的所有形参名<?xml version="1.0" encoding="UTF-8" ?>
  271. <beans>
  272.    
  273.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  274. </beans><?xml version="1.0" encoding="UTF-8" ?>
  275. <beans>
  276.    
  277.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  278. </beans><?xml version="1.0" encoding="UTF-8" ?>
  279. <beans>
  280.    
  281.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  282. </beans>//2. 对得到目标方法的所有形参名举行遍历,<?xml version="1.0" encoding="UTF-8" ?>
  283. <beans>
  284.    
  285.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  286. </beans><?xml version="1.0" encoding="UTF-8" ?>
  287. <beans>
  288.    
  289.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  290. </beans><?xml version="1.0" encoding="UTF-8" ?>
  291. <beans>
  292.    
  293.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  294. </beans>//如果匹配就把当前请求的参数值放入params<?xml version="1.0" encoding="UTF-8" ?>
  295. <beans>
  296.    
  297.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  298. </beans><?xml version="1.0" encoding="UTF-8" ?>
  299. <beans>
  300.    
  301.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  302. </beans><?xml version="1.0" encoding="UTF-8" ?>
  303. <beans>
  304.    
  305.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  306. </beans>List parameterNames = getParameterNames(zyHandler.getMethod());<?xml version="1.0" encoding="UTF-8" ?>
  307. <beans>
  308.    
  309.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  310. </beans><?xml version="1.0" encoding="UTF-8" ?>
  311. <beans>
  312.    
  313.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  314. </beans><?xml version="1.0" encoding="UTF-8" ?>
  315. <beans>
  316.    
  317.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  318. </beans>for (int i = 0; i < parameterNames.size(); i++) {<?xml version="1.0" encoding="UTF-8" ?>
  319. <beans>
  320.    
  321.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  322. </beans><?xml version="1.0" encoding="UTF-8" ?>
  323. <beans>
  324.    
  325.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  326. </beans><?xml version="1.0" encoding="UTF-8" ?>
  327. <beans>
  328.    
  329.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  330. </beans>    if (name.equals(parameterNames.get(i))) {<?xml version="1.0" encoding="UTF-8" ?>
  331. <beans>
  332.    
  333.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  334. </beans><?xml version="1.0" encoding="UTF-8" ?>
  335. <beans>
  336.    
  337.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  338. </beans><?xml version="1.0" encoding="UTF-8" ?>
  339. <beans>
  340.    
  341.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  342. </beans><?xml version="1.0" encoding="UTF-8" ?>
  343. <beans>
  344.    
  345.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  346. </beans>params[i] = value;<?xml version="1.0" encoding="UTF-8" ?>
  347. <beans>
  348.    
  349.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  350. </beans><?xml version="1.0" encoding="UTF-8" ?>
  351. <beans>
  352.    
  353.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  354. </beans><?xml version="1.0" encoding="UTF-8" ?>
  355. <beans>
  356.    
  357.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  358. </beans><?xml version="1.0" encoding="UTF-8" ?>
  359. <beans>
  360.    
  361.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  362. </beans>break;<?xml version="1.0" encoding="UTF-8" ?>
  363. <beans>
  364.    
  365.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  366. </beans><?xml version="1.0" encoding="UTF-8" ?>
  367. <beans>
  368.    
  369.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  370. </beans><?xml version="1.0" encoding="UTF-8" ?>
  371. <beans>
  372.    
  373.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  374. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  375. <beans>
  376.    
  377.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  378. </beans><?xml version="1.0" encoding="UTF-8" ?>
  379. <beans>
  380.    
  381.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  382. </beans><?xml version="1.0" encoding="UTF-8" ?>
  383. <beans>
  384.    
  385.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  386. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  387. <beans>
  388.    
  389.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  390. </beans><?xml version="1.0" encoding="UTF-8" ?>
  391. <beans>
  392.    
  393.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  394. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  395. <beans>
  396.    
  397.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  398. </beans><?xml version="1.0" encoding="UTF-8" ?>
  399. <beans>
  400.    
  401.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  402. </beans>}
复制代码
视图解析

思绪


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


  • 首先 视图解析 它是在分发请求后 在目标方法中举行视图的跳转 forward 大概 redirect,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
  • 在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
    1. Object result = zyHandler.getMethod().invoke(zyHandler.getController(), params);
    复制代码
  • 当返回的是String范例后 我们就可以根据 splic(":")举行分隔
  • splic(":")[0] 就是举行跳转的方式 forward 大概 redirect
  • splic(":")[1] 就是举行跳转的页面
  • 如果没有":" ,就说明是默认情况,forward 处置惩罚即可
  1. if (result instanceof String){<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans><?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>   String viewName =  (String) result;<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans><?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>    if (viewName.contains(":")) {<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans><?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans><?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>String viewType = viewName.split(":")[0];<?xml version="1.0" encoding="UTF-8" ?>
  30. <beans>
  31.    
  32.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  33. </beans><?xml version="1.0" encoding="UTF-8" ?>
  34. <beans>
  35.    
  36.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  37. </beans><?xml version="1.0" encoding="UTF-8" ?>
  38. <beans>
  39.    
  40.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  41. </beans>String viewPage = viewName.split(":")[1];<?xml version="1.0" encoding="UTF-8" ?>
  42. <beans>
  43.    
  44.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  45. </beans><?xml version="1.0" encoding="UTF-8" ?>
  46. <beans>
  47.    
  48.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  49. </beans><?xml version="1.0" encoding="UTF-8" ?>
  50. <beans>
  51.    
  52.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  53. </beans>if ("forward".equals(viewType)){<?xml version="1.0" encoding="UTF-8" ?>
  54. <beans>
  55.    
  56.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  57. </beans><?xml version="1.0" encoding="UTF-8" ?>
  58. <beans>
  59.    
  60.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  61. </beans><?xml version="1.0" encoding="UTF-8" ?>
  62. <beans>
  63.    
  64.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  65. </beans>    request.getRequestDispatcher(viewPage).forward(request,response);<?xml version="1.0" encoding="UTF-8" ?>
  66. <beans>
  67.    
  68.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  69. </beans><?xml version="1.0" encoding="UTF-8" ?>
  70. <beans>
  71.    
  72.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  73. </beans><?xml version="1.0" encoding="UTF-8" ?>
  74. <beans>
  75.    
  76.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  77. </beans>}else if (("redirect".equals(viewType))){<?xml version="1.0" encoding="UTF-8" ?>
  78. <beans>
  79.    
  80.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  81. </beans><?xml version="1.0" encoding="UTF-8" ?>
  82. <beans>
  83.    
  84.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  85. </beans><?xml version="1.0" encoding="UTF-8" ?>
  86. <beans>
  87.    
  88.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  89. </beans>    response.sendRedirect(viewPage);<?xml version="1.0" encoding="UTF-8" ?>
  90. <beans>
  91.    
  92.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  93. </beans><?xml version="1.0" encoding="UTF-8" ?>
  94. <beans>
  95.    
  96.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  97. </beans><?xml version="1.0" encoding="UTF-8" ?>
  98. <beans>
  99.    
  100.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  101. </beans>}<?xml version="1.0" encoding="UTF-8" ?>
  102. <beans>
  103.    
  104.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  105. </beans><?xml version="1.0" encoding="UTF-8" ?>
  106. <beans>
  107.    
  108.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  109. </beans>    }else {<?xml version="1.0" encoding="UTF-8" ?>
  110. <beans>
  111.    
  112.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  113. </beans><?xml version="1.0" encoding="UTF-8" ?>
  114. <beans>
  115.    
  116.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  117. </beans><?xml version="1.0" encoding="UTF-8" ?>
  118. <beans>
  119.    
  120.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  121. </beans>request.getRequestDispatcher(viewName).forward(request,response);<?xml version="1.0" encoding="UTF-8" ?>
  122. <beans>
  123.    
  124.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  125. </beans><?xml version="1.0" encoding="UTF-8" ?>
  126. <beans>
  127.    
  128.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  129. </beans>    }<?xml version="1.0" encoding="UTF-8" ?>
  130. <beans>
  131.    
  132.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  133. </beans><?xml version="1.0" encoding="UTF-8" ?>
  134. <beans>
  135.    
  136.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  137. </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仅仅作为一个标识
  1. @Target(ElementType.METHOD)
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface ResponseBody {
  5. }
复制代码

  • @ResponseBody它是在分发请求后 在目标方法中标识该方法返回JSON格式的数据给浏览器,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
  • 在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
  • 当返回的是一个聚集范例,并且判定该方法有注解@ResponseBody ,就说明是须要向浏览器返回JSON格式数据
  • 用jackson 包下的 objectWriter对象的 objectMapper.writeValueAsString()方法 ,可以很轻松的将聚集转化为JSON举行返回
  1. else if (result instanceof ArrayList) {    if (zyHandler.getMethod().isAnnotationPresent(ResponseBody.class)) {<?xml version="1.0" encoding="UTF-8" ?>
  2. <beans>
  3.    
  4.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  5. </beans>ObjectMapper objectMapper = new ObjectMapper();<?xml version="1.0" encoding="UTF-8" ?>
  6. <beans>
  7.    
  8.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  9. </beans>String json = objectMapper.writeValueAsString(result);<?xml version="1.0" encoding="UTF-8" ?>
  10. <beans>
  11.    
  12.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  13. </beans>response.setContentType("text/html;charset=utf-8");<?xml version="1.0" encoding="UTF-8" ?>
  14. <beans>
  15.    
  16.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  17. </beans>PrintWriter writer = response.getWriter();<?xml version="1.0" encoding="UTF-8" ?>
  18. <beans>
  19.    
  20.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  21. </beans>writer.write(json);<?xml version="1.0" encoding="UTF-8" ?>
  22. <beans>
  23.    
  24.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  25. </beans>writer.flush();<?xml version="1.0" encoding="UTF-8" ?>
  26. <beans>
  27.    
  28.     <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
  29. </beans>writer.close();    }}
复制代码

  • 不要忘了设置response格式,防止乱码,response.setContentType("text/html;charset=utf-8");
  • 直接用response.getWriter.writer()将转化后的结果返回给浏览器即可

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

tsx81428

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表