手写 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容器配置文件 扫描的路径
实现
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>javax.servlet-api</artifactId>
- <version>3.1.0</version>
- <scope>provided</scope>
-
- </dependency>
-
- <dependency>
- <groupId>dom4j</groupId>
- <artifactId>dom4j</artifactId>
- <version>1.1</version>
- </dependency>
-
- <dependency>
- <groupId>org.apache.commons</groupId>
- <artifactId>commons-lang3</artifactId>
- <version>3.12.0</version>
- </dependency>
复制代码- public class ZyDispatcherServlet extends HttpServlet {
- @Override
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>System.out.println("ZyDispatcherServlet-doPost--");
- }
- @Override
- protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>System.out.println("ZyDispatcherServlet-doGet--");
- }
- }
复制代码
- 须要配置Web.xml 中的前端控制器 1).url 2)配置spring容器配置文件的classpath: 3)跟随Tomcat 自启动
- 须要配置spring容器配置文件 扫描的路径
- <servlet>
- <servlet-name>ZyDispatcherServlet</servlet-name>
- <servlet-class>com.code_study.zyspringmvc.servlet.ZyDispatcherServlet</servlet-class>
-
-
- <init-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:zyspringmvc.xml</param-value>
- </init-param>
-
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>ZyDispatcherServlet</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
复制代码- <?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>
复制代码 完成浏览器可以请求控制层
思绪
- 创建@Controller和本身的Controller
- 编写工具类XMLParser,解析spring容器配置文件
- 开发本身的 Spring容器,得到扫描类的全路径列表
- 开发本身的 前端控制器,实例化对象到容器中
- 完成请求的URL和控制器方法的映射关系
- 完成前端控制器分发请求到对应控制器
- 自定义注解@Controller
- 创建Controller
- 须要写一个工具类XMLParser来解析在spring容器配置文件 扫描的路径 的包 返回所有的路径
- 这个所有的路径 一个split(",")分隔,都举行扫描
- 须要写本身的 前端控制器
- 须要写本身的 Spring容器
- 在前端控制器中 须要添加方法 scanPackage() 扫描 XMLParser 解析出来的路径
- 在Spring容器中 须要添加一个属性 classFullPathList 来保存扫描出来的类的全路径
- 须要添加一个属性 ioc 来存放反射生成的bean对象 也就是过滤classFullPathList 中没有@Controller注解的一些路径 并实例化
- 须要添加类Handler 这个类要保存 一个url 对应的 一个控制器的方法的 映射 ,也就是说,根据这个url,可以找到对应控制器的对应方法
- 须要添加一个属性 HandlerList 用于 保存Handler 【url 和 控制器的映射】
- 须要添加三个方法 一个是initHandlerMapping(),完成 url 对应的 一个控制器的方法的 映射,即 将ioc 中bean 中的 方法举行反射,获取url,将 url,method,bean 封装成Handler 放入HandlerList 保存
- 添加第二个方法 getHandler(),须要将浏览器发送的request请求中的 uri拿出来,遍历HandlerList 举行配对,如果有 就返回对应的Handler
- 添加第三个方法 executeDispatch(),举行分发处置惩罚,须要 调用getHandler() 获取浏览器发送的request请求 对应的 Handler ,获取Handler 中的method 举行反射调用,method .invoke() 实现分发请求。
实现
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface Controller {
- String value() default "";
- }
复制代码- @Controller
- public class MonsterController {
- }
复制代码
- 须要写一个工具类XMLParser来解析在spring容器配置文件 扫描的路径 的包 返回所有的路径
- public class XMLParser { public static String getBasePackage(String xmlFile){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>SAXReader saxReader = new SAXReader();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ClassLoader classLoader = XMLParser.class.getClassLoader();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>InputStream resourceAsStream = classLoader.getResourceAsStream(xmlFile);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Document document = saxReader.read(resourceAsStream);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Element rootElement = document.getRootElement();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Element element = rootElement.element("component-scan");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String basePackage = element.attribute("base-package").getText();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> return basePackage;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} catch (DocumentException e) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }}
复制代码
- 这个所有的路径 一个split(",")分隔,都举行扫描
- 须要写本身的 前端控制器
- 须要写本身的 Spring容器
- 在前端控制器中 须要添加方法 scanPackage() 扫描 XMLParser 解析出来的路径
- public void scanPackage(String pack) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//获得包所在的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>URL url =<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>this.getClass().getClassLoader().//获取类的加载器<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//得到指定包对应的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>getResource("/" + pack.replaceAll("\\.", "/"));<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>// System.out.println("url= "+url);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//根据得到的路径,对其举行扫描,把类的全路径 保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String path = url.getFile();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//在io中 把目录也是为一个文件<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>File file = new File(path);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//遍历file 【遍历出文件和子目录】<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (File f : file.listFiles()) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (f.isDirectory()) {//如果是目录<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//须要递归扫描 找子目录<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>scanPackage(pack + "." + f.getName());<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//的确是个文件<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//扫描到的文件大概是 .class 文件 也大概是其他文件<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//就算是.class 文件 也须要判定是否须要注入容器 有无加 @Controller注解<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//现在无法拿到注解 由于没法反射 以是先把文件的全路径都保存到 classFullPathList 之后在注入对象到容器时再处置惩罚<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String classFullPath =<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//类的全路径不须要.class 去掉.class<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>pack + "." + f.getName().replaceAll(".class", "");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>classFullPathList.add(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }
复制代码
- 在Spring容器中 须要添加一个属性 classFullPathList 来保存扫描出来的类的全路径
- //保存扫描的包/子包类的全路径 private List classFullPathList =<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> new ArrayList();
复制代码
- 须要添加一个属性 ioc 来存放反射生成的bean对象 也就是过滤classFullPathList 中没有@Controller注解的一些路径 并实例化
- //定义属性 ioc -> 存放反射生成的bean对象 好比Controller / Service /Daopublic ConcurrentHashMap ioc =<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>new ConcurrentHashMap();
复制代码
- 编写方法,将扫描到的类,在满意情况下 反射到ioc容器
- //编写方法,将扫描到的类,在满意情况下 反射到ioc容器 public void executeInstance() {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if (classFullPathList.size() == 0) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //说明没有扫描到类<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> return;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//遍历classFullList<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (String classFullPath : classFullPathList) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> try {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Class clazz = Class.forName(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if (clazz.isAnnotationPresent(Controller.class)) {//处置惩罚@Controller<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String className = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String value = clazz.getAnnotation(Controller.class).value();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>className = StringUtils.uncapitalize(className);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> ioc.put(className, instance);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>else if (clazz.isAnnotationPresent(Service.class)) {//处置惩罚@Service<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String className = clazz.getSimpleName();//类名<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Service serviceAnnotation = clazz.getAnnotation(Service.class);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String value = serviceAnnotation.value();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ioc.put(className, instance); }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }
复制代码
- 须要添加类Handler 这个类要保存 一个url 对应的 一个控制器的方法的 映射 ,也就是说,根据这个url,可以找到对应控制器的对应方法
- ZyHandler { private String url; private Method method; private Object controller; public ZyHandler() { } public ZyHandler(String url, Method method, Object controller) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>this.url = url;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>this.method = method;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>this.controller = controller; }//须要提供getter和setter方法...
复制代码
- 须要添加一个属性 HandlerList 用于 保存Handler 【url 和 控制器的映射】
- //定义属性 HandlerList -> 保存ZyHandler 【url 和 控制器的映射】 private List HandlerList =<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> new ArrayList();
复制代码
- 须要添加三个方法 一个是initHandlerMapping(),完成 url 对应的 一个控制器的方法的 映射,即 将ioc 中bean 中的 方法举行反射,获取url,将 url,method,bean 封装成Handler 放入HandlerList 保存
- private void initHandlerMapping(){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//遍历 ioc<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (Map.Entry entry: zyWebApplicationContext.ioc.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (zyWebApplicationContext.ioc.isEmpty()){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>return;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Object bean = entry.getValue();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Class clazz = bean.getClass();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (clazz.isAnnotationPresent(Controller.class)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Method[] declaredMethods = clazz.getDeclaredMethods();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (Method declaredMethod : declaredMethods) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (declaredMethod.isAnnotationPresent(RequestMapping.class)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String url = declaredMethod.getAnnotation(RequestMapping.class).value();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ZyHandler zyHandler = new ZyHandler(url, declaredMethod, bean);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>HandlerList.add(zyHandler);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }
复制代码
- 添加第二个方法 getHandler(),须要将浏览器发送的request请求中的 uri拿出来,遍历HandlerList 举行配对,如果有 就返回对应的Handler
- //编写方法,通过request对象 返回ZyHandler对象 ,如果没有返回null private ZyHandler getZyHandler(HttpServletRequest request) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String requestURI = request.getRequestURI();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//遍历HandlerList<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (ZyHandler zyHandler : HandlerList) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (requestURI.equals(zyHandler.getUrl())){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>return zyHandler;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>return null; }
复制代码
- 添加第三个方法 executeDispatch(),举行分发处置惩罚,须要 调用getHandler() 获取浏览器发送的request请求 对应的 Handler ,获取Handler 中的method 举行反射调用,method .invoke() 实现分发请求。
- public void executeDispatch(HttpServletRequest request,HttpServletResponse response){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ZyHandler zyHandler = getZyHandler(request);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (null == zyHandler){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> response.getWriter().write("[size=6]404 NOT FOUND[/size]
- ");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Method method = zyHandler.getMethod();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> method.invoke(zyHandler.getController(),request,response);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }
复制代码 从web.xml文件中动态获取spring配置文件
思绪
- 首先,我们本身写的前端控制器是一个Servlet,它有 servletConfig,可以servletConfig.getInitParameter("xxx") 来获取之前在web.xml配置的classpath:
- 工具类XMLParser 是在spring容器中解析的 ,web.xml配置的classpath: 是在前端控制器中获取的,因此须要spring容器提供有参构造器,在前端控制器添加参数 spring容器,将classpath 传到spring容器中举行解析。
实现
- 首先,我们本身写的前端控制器是一个Servlet,它有 servletConfig,可以servletConfig.getInitParameter("xxx") 来获取之前在web.xml配置的classpath:
- 工具类XMLParser 是在spring容器中解析的 ,web.xml配置的classpath: 是在前端控制器中获取的,因此须要spring容器提供有参构造器,在前端控制器添加参数 spring容器,将classpath 传到spring容器中举行解析。
- @Override public void init() throws ServletException {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String configLocation = getServletConfig().getInitParameter("contextConfigLocation");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>System.out.println("ZyDispatcherServlet 初始化---");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>zyWebApplicationContext = new ZyWebApplicationContext(configLocation);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>zyWebApplicationContext.init();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>initHandlerMapping();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>System.out.println("HandlerList= "+HandlerList); }
复制代码- private String configLocation; public ZyWebApplicationContext(String configLocation) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>this.configLocation = configLocation; }
复制代码- public void init(){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>System.out.println("ZyWebApplicationContext 初始化---");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String basePackage = XMLParser.getBasePackage(configLocation.split(":")[1]);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String[] basePackages = basePackage.split(",");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if (basePackages.length >0) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> for (String pack : basePackages) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>scanPackage(pack);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }
复制代码 @Service注解
思绪
- @Service注解是写在类上的 即@Target(ElementType.TYPE)
- 这个注解标识的类就是一个Service,那么同样是在executeInstance()方法中判定是否有注解@Service,有的话就保存到ioc容器中
- 由于是Service,那么保存进ioc 的 k-v 中的 k 就有三种。第一种,就是默认值,用接口的范例的名字首字母小写;第二种,在@Service注解种设置了value属性,那么 k = value;第三章,须要用类名首字母小写也可以获取bean
实现
- @Service注解是写在类上的 即@Target(ElementType.TYPE)
- @Target(ElementType.TYPE)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface Service {
- String value() default "";
- }
复制代码
- 这个注解标识的类就是一个Service,那么同样是在executeInstance()方法中判定是否有注解@Service,有的话就保存到ioc容器中
- 由于是Service,那么保存进ioc 的 k-v 中的 k 就有三种。第一种,就是默认值,用接口的范例的名字首字母小写;第二种,在@Service注解种设置了value属性,那么 k = value;第三章,须要用类名首字母小写也可以获取bean
- public void executeInstance() {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if (classFullPathList.size() == 0){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> return;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//遍历 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (String classFullPath : classFullPathList) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> try {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Class clazz = Class.forName(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if (clazz.isAnnotationPresent(Controller.class)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Controller controller = clazz.getAnnotation(Controller.class);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String value = controller.value();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String className = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if ("".equals(value)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>className = StringUtils.uncapitalize(className);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> ioc.put(className,instance);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} else if (clazz.isAnnotationPresent(Service.class)) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Service serviceAnnotation = clazz.getAnnotation(Service.class);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String annoattionValue = serviceAnnotation.value();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if ("".equals(annoattionValue)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Class[] interfaces = clazz.getInterfaces();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (Class anInterface : interfaces) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String simpleName = anInterface.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> simpleName = StringUtils.uncapitalize(simpleName);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> ioc.put(simpleName,instance);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//可以通过类名首字母小写<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String simpleName = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>simpleName = StringUtils.uncapitalize(simpleName);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ioc.put(simpleName,instance);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ioc.put(annoattionValue,instance);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }
复制代码 @Autowried 依赖注入
思绪
- @Autowried注解是用在字段上,通过ioc容器自动装配,因此 @Target(ElementType.FIELD)
- 须要遍历ioc中所有的 bean 中的所有字段,来举行判定是否须要自动装配
- 通过反射获取字段,判定该字段是否带有@Autowried 注解,有的话就判定value值
- value为"",说明按默认规则 用字段范例首字母小写 去ioc容器举行查找,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");
- 如果有值,去ioc容器举行查找该值对应的bean,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");如果有该bean,就用该字段的set()方法将本身的bean 和 查找ioc获取的bean举行装配
- 即 declaredField.set(bean, beanInIOC);
- 由于字段是私有属性private,须要暴力破解declaredField.setAccessible(true);
实现
- @Autowried注解是用在字段上,通过ioc容器自动装配,因此 @Target(ElementType.FIELD)
- @Target(ElementType.FIELD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface Autowired {
- String value() default "";
- }
复制代码
- 须要遍历ioc中所有的 bean 中的所有字段,来举行判定是否须要自动装配
- 通过反射获取字段,判定该字段是否带有@Autowried 注解,有的话就判定value值
- value为"",说明按默认规则 用字段范例首字母小写 去ioc容器举行查找,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");
- 如果有值,去ioc容器举行查找该值对应的bean,如果没有抛出空指针异常throw new NullPointerException("ioc 没有该bean");如果有该bean,就用该字段的set()方法将本身的bean 和 查找ioc获取的bean举行装配
- 即 declaredField.set(bean, beanInIOC);
- 由于字段是私有属性private,须要暴力破解declaredField.setAccessible(true);
- public void executeAutoWired(){ //遍历ioc if (ioc.isEmpty()){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>return; } //获取容器里的所有bean 以及 bean对应的字段 for (Map.Entry entry : ioc.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Object bean = entry.getValue();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Class clazz = bean.getClass();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Field[] declaredFields = clazz.getDeclaredFields();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (Field declaredField : declaredFields) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //通过反射获取字段,判定该字段是否带有@Autowried 注解,有的话就判定value值<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (declaredField.isAnnotationPresent(Autowired.class)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Autowired annotation =<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>declaredField.getAnnotation(Autowired.class);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String beanName = annotation.value();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //value为"",说明按默认规则 用字段范例首字母小写 去ioc容器举行查找,<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if ("".equals(beanName)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>beanName = declaredField.getType().getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>beanName = StringUtils.uncapitalize(beanName);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Object iocBean = ioc.get(beanName);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //如果没有抛出空指针异常<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if (null == iocBean){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> throw new NullPointerException("ioc 没有该Bean");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>declaredField.setAccessible(true);//暴力破解<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>declaredField.set(bean,iocBean);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} catch (IllegalAccessException e) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>} }}
复制代码 @RequestParam
思绪
- @RequestParam 是写在PARAMETER上的 也就是说 @Target(ElementType.PARAMETER)
- 这个注解实现的功能 大方向是 分发请求 也就是说 写在 executeDispatch()方法中的
- 要实现 @RequestParam 须要将形参列表封装到一个数组中 , 由于反射 invoke 可以传入一个数组作为可变参数解析
- 那么就须要两个数组 一个数组是新创建的数组(大小应与,目标数组的形参个数一致) 将实参放入进去 ;另一个是 反射拿到的目标方法的形参的数组
- 这两个数组的内容须要一一对应,由于反射须要顺序一致
- 须要获取到request 中请求的参数Map 获取参数名和参数值
- 可以将功能具体化到 完成这个新数组的实参填写 【完成新数组之后放入invoke方法举行反射就行】
- 将步调拆解成 1)完成HttpServletRequest 和 HttpServletResponse 的填写 ;2)完成带有@RequestParam注解的形参的填写;3)完成平凡的方法参数没有@RequestParam注解的形参的填写
- 完成HttpServletRequest 和 HttpServletResponse 的填写:就须要先拿到目标方法的所有参数。根据范例的名称 和 形参列表举行匹配 填写
- 完成带有@RequestParam注解的形参的填写:须要添加方法,获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返回int 代表第几个参数,如果有@RequestParam注解,就会返回相应的索引,如果没有就会返回-1 举行平凡方法参数的填写 处置惩罚
- 平凡方法参数的 填写:须要添加方法,将目标方法的所有的形参的名称 反射保存到 List 返回,再通过遍历判定 请求的参数名 和 List中一致的 填写到 数组中
- 平凡方法参数的 填写 须要插件,使用java8的特性 解决在默认情况下 parameter.getName() 获取的名字不是形参真正的名字,而是[arg0,arg1,arg2...]的问题
实现
- @RequestParam 是写在PARAMETER上的 也就是说 @Target(ElementType.PARAMETER)
- @Target(ElementType.PARAMETER)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface RequestParam {
- String value() default "";
- }
复制代码
- 这个注解实现的功能 大方向是 分发请求 也就是说 写在 executeDispatch()方法中的
- 要实现 @RequestParam 须要将形参列表封装到一个数组中 , 由于反射 invoke 可以传入一个数组作为可变参数解析
- Method method = zyHandler.getMethod();
- Class<?>[] parameterTypes = method.getParameterTypes();//形参数组
- Object[] params = new Object[parameterTypes.length];
复制代码
- 那么就须要两个数组 一个数组是新创建的数组(大小应与,目标数组的形参个数一致) 将实参放入进去 ;另一个是 反射拿到的目标方法的形参的数组
- 这两个数组的内容须要一一对应,由于反射须要顺序一致
- 须要获取到request 中请求的参数Map 获取参数名和参数值
- request.setCharacterEncoding("utf-8");
- Map<String, String[]> parameterMap = request.getParameterMap();
- for (Map.Entry<String, String[]> entry : parameterMap.entrySet()) {
- String name = entry.getKey();//参数 键
- String value = entry.getValue()[0];//参数 值
复制代码
- 可以将功能具体化到 完成这个新数组的实参填写 【完成新数组之后放入invoke方法举行反射就行】
- 将步调拆解成 1)完成HttpServletRequest 和 HttpServletResponse 的填写 ;2)完成带有@RequestParam注解的形参的填写;3)完成平凡的方法参数没有@RequestParam注解的形参的填写
- 完成HttpServletRequest 和 HttpServletResponse 的填写:就须要先拿到目标方法的所有参数。根据范例的名称 和 形参列表举行匹配 填写
- for (int i = 0; i < parameterTypes.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Class parameterType = parameterTypes[i];<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if ("HttpServletRequest".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[i] = request;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } else if ("HttpServletResponse".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[i] = response;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}
复制代码
- 完成带有@RequestParam注解的形参的填写:须要添加方法,获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返回int 代表第几个参数,如果有@RequestParam注解,就会返回相应的索引,如果没有就会返回-1 举行平凡方法参数的填写 处置惩罚
- //获取目标方法中 带有@RequestParam注解的形参是属于第几个参数的,返 private int getRequestParamterIndex(Method method,String name){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Parameter[] parameters = method.getParameters();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> for (int i = 0; i < parameters.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Parameter parameter = parameters[i];<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if (parameter.isAnnotationPresent(RequestParam.class)) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String value = parameter.getAnnotation(RequestParam.class).value();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (name.equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>return i;//返回int 代表第几个参数<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>return -1; }
复制代码- int requestParamterIndex = getRequestParamterIndex(zyHandler.getMethod(), name);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (requestParamterIndex != -1) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[requestParamterIndex] = value;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }
复制代码
- 平凡方法参数的 填写:须要添加方法,将目标方法的所有的形参的名称 反射保存到 List 返回,再通过遍历判定 请求的参数名 和 List中一致的 填写到 数组中
- //将目标方法的所有的形参的名称 反射保存到 List 返回 private List getParameterNames(Method method){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>List parameterList = new ArrayList();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//获取到所有的参数名称<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Parameter[] parameters = method.getParameters();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (Parameter parameter : parameters) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //在默认情况下 parameter.getName() 获取的名字不是形参真正的名字<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //而是[arg0,arg1,arg2...]<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //须要插件,使用java8的特性 解决<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String name = parameter.getName();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> parameterList.add(name);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>System.out.println("目标方法的形参列表=" + parameterList);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>return parameterList; }
复制代码- else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//没找到@RequestParam 对应参数--使用默认机制<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//1. 得到目标方法的所有形参名<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//2. 对得到目标方法的所有形参名举行遍历,<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//如果匹配就把当前请求的参数值放入params<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>List parameterNames = getParameterNames(zyHandler.getMethod());<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (int i = 0; i < parameterNames.size(); i++) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (name.equals(parameterNames.get(i))) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[i] = value;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>break;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }
复制代码
- 平凡方法参数的 填写 须要插件,使用java8的特性 解决在默认情况下 parameter.getName() 获取的名字不是形参真正的名字,而是[arg0,arg1,arg2...]的问题
- <?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> com.fasterxml.jackson.core jackson-databind 2.14.0
复制代码- public void executeDispatch(HttpServletRequest request, HttpServletResponse response) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ZyHandler zyHandler = getZyHandler(request);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>try {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (null == zyHandler) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>response.getWriter().write("[size=6]404 NOT FOUND![/size]
- ");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Method method = zyHandler.getMethod();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Class[] parameterTypes = method.getParameterTypes();//形参数组<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Object[] params = new Object[parameterTypes.length];<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//遍历 parameterTypes<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//获取 HttpServletRequest , HttpServletResponse 在形参数组中的位置<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//将request 和 response 保存到 params相应的位置上<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (int i = 0; i < parameterTypes.length; i++) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> Class parameterType = parameterTypes[i];<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if ("HttpServletRequest".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[i] = request;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } else if ("HttpServletResponse".equals(parameterType.getSimpleName())) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[i] = response;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//获取request中的<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>request.setCharacterEncoding("utf-8");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>Map parameterMap = request.getParameterMap();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (Map.Entry entry : parameterMap.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String name = entry.getKey();//参数 键<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String value = entry.getValue()[0];//参数 值<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //获取形参数组中 带有@RequestParam 的形参 的位置<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> //将带有@RequestParam 保存到 params相应的位置上<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> int requestParamterIndex = getRequestParamterIndex(zyHandler.getMethod(), name);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (requestParamterIndex != -1) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[requestParamterIndex] = value;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> } else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//没找到@RequestParam 对应参数--使用默认机制<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//1. 得到目标方法的所有形参名<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//2. 对得到目标方法的所有形参名举行遍历,<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>//如果匹配就把当前请求的参数值放入params<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>List parameterNames = getParameterNames(zyHandler.getMethod());<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>for (int i = 0; i < parameterNames.size(); i++) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (name.equals(parameterNames.get(i))) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>params[i] = value;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>break;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}
复制代码 视图解析
思绪
- 首先 视图解析 它是在分发请求后 在目标方法中举行视图的跳转 forward 大概 redirect,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
- 在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
- 当返回的是String范例后 我们就可以根据 splic(":")举行分隔
- splic(":")[0] 就是举行跳转的方式 forward 大概 redirect
- splic(":")[1] 就是举行跳转的页面
- 如果没有":" ,就说明是默认情况,forward 处置惩罚即可
实现
- 首先 视图解析 它是在分发请求后 在目标方法中举行视图的跳转 forward 大概 redirect,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
- 在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
- Object result = zyHandler.getMethod().invoke(zyHandler.getController(), params);
复制代码 - 当返回的是String范例后 我们就可以根据 splic(":")举行分隔
- splic(":")[0] 就是举行跳转的方式 forward 大概 redirect
- splic(":")[1] 就是举行跳转的页面
- 如果没有":" ,就说明是默认情况,forward 处置惩罚即可
- if (result instanceof String){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> String viewName = (String) result;<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> if (viewName.contains(":")) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String viewType = viewName.split(":")[0];<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String viewPage = viewName.split(":")[1];<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>if ("forward".equals(viewType)){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> request.getRequestDispatcher(viewPage).forward(request,response);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}else if (("redirect".equals(viewType))){<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> response.sendRedirect(viewPage);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }else {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>request.getRequestDispatcher(viewName).forward(request,response);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans> }<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans><?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>}
复制代码 @ResponseBody 返回JSON数据
实现
- 首先@ResponseBody 是写在方法上的 因此 @Target(ElementType.METHOD)
- 没有默认值 @ResponseBody仅仅作为一个标识
- @ResponseBody它是在分发请求后 在目标方法中标识该方法返回JSON格式的数据给浏览器,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
- 在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
- 当返回的是一个聚集范例,并且判定该方法有注解@ResponseBody ,就说明是须要向浏览器返回JSON格式数据
- 用jackson 包下的 objectWriter对象的 objectMapper.writeValueAsString()方法 ,可以很轻松的将聚集转化为JSON举行返回
- 不要忘了设置response格式,防止乱码,response.setContentType("text/html;charset=utf-8");
- 直接用response.getWriter.writer()将转化后的结果返回给浏览器即可
思绪
- 首先@ResponseBody 是写在方法上的 因此 @Target(ElementType.METHOD)
- 没有默认值 @ResponseBody仅仅作为一个标识
- @Target(ElementType.METHOD)
- @Retention(RetentionPolicy.RUNTIME)
- @Documented
- public @interface ResponseBody {
- }
复制代码
- @ResponseBody它是在分发请求后 在目标方法中标识该方法返回JSON格式的数据给浏览器,以是这部分的代码应该在 前端处置惩罚器的executeDispatch 中 对目标方法举行反射后调用
- 在对目标方法举行反射 method.invoke() 就会有返回值,根据返回值的范例举行相应业务处置惩罚
- 当返回的是一个聚集范例,并且判定该方法有注解@ResponseBody ,就说明是须要向浏览器返回JSON格式数据
- 用jackson 包下的 objectWriter对象的 objectMapper.writeValueAsString()方法 ,可以很轻松的将聚集转化为JSON举行返回
- else if (result instanceof ArrayList) { if (zyHandler.getMethod().isAnnotationPresent(ResponseBody.class)) {<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>ObjectMapper objectMapper = new ObjectMapper();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>String json = objectMapper.writeValueAsString(result);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>response.setContentType("text/html;charset=utf-8");<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>PrintWriter writer = response.getWriter();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>writer.write(json);<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>writer.flush();<?xml version="1.0" encoding="UTF-8" ?>
- <beans>
-
- <component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
- </beans>writer.close(); }}
复制代码
- 不要忘了设置response格式,防止乱码,response.setContentType("text/html;charset=utf-8");
- 直接用response.getWriter.writer()将转化后的结果返回给浏览器即可
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |