ToB企服应用市场:ToB评测及商务社交产业平台
标题:
手写SpringMVC底层机制
[打印本页]
作者:
tsx81428
时间:
2024-5-18 06:00
标题:
手写SpringMVC底层机制
手写 SpringMVC 底层机制
前景提要:实现的是SpringMVC焦点机制
对一些细枝末节的代码做了简化,好比字符串的处置惩罚...
完成哪些机制
机制一: 通过@RequestMapping ,可以标记一个方法,编写路径url,浏览器就能通过url完成调用
机制二: 举行依赖注入,使之不须要传统的new 一个对象,而是直接从IOC容器中获得
机制三:通过@RequestParam,如果浏览器转达的参数名和目标方法的形参不一致,可以通过value设置举行匹配
机制四:在目标方法完成后,跳转到相关页面 请求转发/重定向
机制五:在目标方法完成后,通过@Response注解,向浏览器发送JSON格式数据
手写添加配置
思绪
须要配置pom.xml的依赖
须要写一个Servlet 作为前端控制器
须要配置Web.xml 中的前端控制器 1).url 2)配置spring容器配置文件的classpath: 3)跟随Tomcat 自启动
须要配置spring容器配置文件
须要配置spring容器配置文件 扫描的路径
实现
须要配置pom.xml的依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
复制代码
须要写一个Servlet 作为前端控制器
public class ZyDispatcherServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("ZyDispatcherServlet-doPost--");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>System.out.println("ZyDispatcherServlet-doGet--");
}
}
复制代码
须要配置Web.xml 中的前端控制器 1).url 2)配置spring容器配置文件的classpath: 3)跟随Tomcat 自启动
须要配置spring容器配置文件 扫描的路径
<servlet>
<servlet-name>ZyDispatcherServlet</servlet-name>
<servlet-class>com.code_study.zyspringmvc.servlet.ZyDispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:zyspringmvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ZyDispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
复制代码
须要配置spring容器配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>
复制代码
完成浏览器可以请求控制层
思绪
创建@Controller和本身的Controller
编写工具类XMLParser,解析spring容器配置文件
开发本身的 Spring容器,得到扫描类的全路径列表
开发本身的 前端控制器,实例化对象到容器中
完成请求的URL和控制器方法的映射关系
完成前端控制器分发请求到对应控制器
自定义注解@Controller
创建Controller
须要写一个工具类XMLParser来解析在spring容器配置文件 扫描的路径 的包 返回所有的路径
这个所有的路径 一个split(",")分隔,都举行扫描
须要写本身的 前端控制器
须要写本身的 Spring容器
在前端控制器中 须要添加方法 scanPackage() 扫描 XMLParser 解析出来的路径
在Spring容器中 须要添加一个属性 classFullPathList 来保存扫描出来的类的全路径
须要添加一个属性 ioc 来存放反射生成的bean对象 也就是过滤classFullPathList 中没有@Controller注解的一些路径 并实例化
须要添加类Handler 这个类要保存 一个url 对应的 一个控制器的方法的 映射 ,也就是说,根据这个url,可以找到对应控制器的对应方法
须要添加一个属性 HandlerList 用于 保存Handler 【url 和 控制器的映射】
须要添加三个方法 一个是initHandlerMapping(),完成 url 对应的 一个控制器的方法的 映射,即 将ioc 中bean 中的 方法举行反射,获取url,将 url,method,bean 封装成Handler 放入HandlerList 保存
添加第二个方法 getHandler(),须要将浏览器发送的request请求中的 uri拿出来,遍历HandlerList 举行配对,如果有 就返回对应的Handler
添加第三个方法 executeDispatch(),举行分发处置惩罚,须要 调用getHandler() 获取浏览器发送的request请求 对应的 Handler ,获取Handler 中的method 举行反射调用,method .invoke() 实现分发请求。
实现
自定义注解@Controller
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Controller {
String value() default "";
}
复制代码
创建Controller
@Controller
public class MonsterController {
}
复制代码
须要写一个工具类XMLParser来解析在spring容器配置文件 扫描的路径 的包 返回所有的路径
public class XMLParser { public static String getBasePackage(String xmlFile){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>SAXReader saxReader = new SAXReader();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ClassLoader classLoader = XMLParser.class.getClassLoader();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>InputStream resourceAsStream = classLoader.getResourceAsStream(xmlFile);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> Document document = saxReader.read(resourceAsStream);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> Element rootElement = document.getRootElement();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> Element element = rootElement.element("component-scan");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> String basePackage = element.attribute("base-package").getText();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> return basePackage;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} catch (DocumentException e) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} }}
复制代码
这个所有的路径 一个split(",")分隔,都举行扫描
须要写本身的 前端控制器
须要写本身的 Spring容器
在前端控制器中 须要添加方法 scanPackage() 扫描 XMLParser 解析出来的路径
public void scanPackage(String pack) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//获得包所在的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>URL url =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.getClass().getClassLoader().//获取类的加载器<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//得到指定包对应的工作路径 [绝对路径]<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>getResource("/" + pack.replaceAll("\\.", "/"));<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>// System.out.println("url= "+url);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//根据得到的路径,对其举行扫描,把类的全路径 保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String path = url.getFile();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//在io中 把目录也是为一个文件<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>File file = new File(path);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历file 【遍历出文件和子目录】<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (File f : file.listFiles()) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (f.isDirectory()) {//如果是目录<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//须要递归扫描 找子目录<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>scanPackage(pack + "." + f.getName());<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> } else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//的确是个文件<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//扫描到的文件大概是 .class 文件 也大概是其他文件<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//就算是.class 文件 也须要判定是否须要注入容器 有无加 @Controller注解<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//现在无法拿到注解 由于没法反射 以是先把文件的全路径都保存到 classFullPathList 之后在注入对象到容器时再处置惩罚<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String classFullPath =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//类的全路径不须要.class 去掉.class<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>pack + "." + f.getName().replaceAll(".class", "");<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//保存到 classFullPathList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>classFullPathList.add(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} }
复制代码
在Spring容器中 须要添加一个属性 classFullPathList 来保存扫描出来的类的全路径
//保存扫描的包/子包类的全路径 private List classFullPathList =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> new ArrayList();
复制代码
须要添加一个属性 ioc 来存放反射生成的bean对象 也就是过滤classFullPathList 中没有@Controller注解的一些路径 并实例化
//定义属性 ioc -> 存放反射生成的bean对象 好比Controller / Service /Daopublic ConcurrentHashMap ioc =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>new ConcurrentHashMap();
复制代码
编写方法,将扫描到的类,在满意情况下 反射到ioc容器
//编写方法,将扫描到的类,在满意情况下 反射到ioc容器 public void executeInstance() {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (classFullPathList.size() == 0) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> //说明没有扫描到类<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> return;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历classFullList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (String classFullPath : classFullPathList) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Class clazz = Class.forName(classFullPath);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>if (clazz.isAnnotationPresent(Controller.class)) {//处置惩罚@Controller<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> String className = clazz.getSimpleName();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> String value = clazz.getAnnotation(Controller.class).value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> } else {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = StringUtils.uncapitalize(className);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> ioc.put(className, instance);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>else if (clazz.isAnnotationPresent(Service.class)) {//处置惩罚@Service<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> String className = clazz.getSimpleName();//类名<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> Service serviceAnnotation = clazz.getAnnotation(Service.class);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> String value = serviceAnnotation.value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (!"".equals(value)) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>className = value;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Object instance = clazz.newInstance();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ioc.put(className, instance); }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> } catch (Exception e) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>throw new RuntimeException(e);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} }
复制代码
须要添加类Handler 这个类要保存 一个url 对应的 一个控制器的方法的 映射 ,也就是说,根据这个url,可以找到对应控制器的对应方法
ZyHandler { private String url; private Method method; private Object controller; public ZyHandler() { } public ZyHandler(String url, Method method, Object controller) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.url = url;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.method = method;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>this.controller = controller; }//须要提供getter和setter方法...
复制代码
须要添加一个属性 HandlerList 用于 保存Handler 【url 和 控制器的映射】
//定义属性 HandlerList -> 保存ZyHandler 【url 和 控制器的映射】 private List HandlerList =<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> new ArrayList();
复制代码
须要添加三个方法 一个是initHandlerMapping(),完成 url 对应的 一个控制器的方法的 映射,即 将ioc 中bean 中的 方法举行反射,获取url,将 url,method,bean 封装成Handler 放入HandlerList 保存
private void initHandlerMapping(){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历 ioc<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Map.Entry entry: zyWebApplicationContext.ioc.entrySet()) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (zyWebApplicationContext.ioc.isEmpty()){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> Object bean = entry.getValue();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> Class clazz = bean.getClass();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (clazz.isAnnotationPresent(Controller.class)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>Method[] declaredMethods = clazz.getDeclaredMethods();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (Method declaredMethod : declaredMethods) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (declaredMethod.isAnnotationPresent(RequestMapping.class)){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String url = declaredMethod.getAnnotation(RequestMapping.class).value();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ZyHandler zyHandler = new ZyHandler(url, declaredMethod, bean);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>HandlerList.add(zyHandler);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>} }
复制代码
添加第二个方法 getHandler(),须要将浏览器发送的request请求中的 uri拿出来,遍历HandlerList 举行配对,如果有 就返回对应的Handler
//编写方法,通过request对象 返回ZyHandler对象 ,如果没有返回null private ZyHandler getZyHandler(HttpServletRequest request) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>String requestURI = request.getRequestURI();<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>//遍历HandlerList<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>for (ZyHandler zyHandler : HandlerList) {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (requestURI.equals(zyHandler.getUrl())){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans><?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return zyHandler;<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> }<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>}<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>return null; }
复制代码
添加第三个方法 executeDispatch(),举行分发处置惩罚,须要 调用getHandler() 获取浏览器发送的request请求 对应的 Handler ,获取Handler 中的method 举行反射调用,method .invoke() 实现分发请求。
public void executeDispatch(HttpServletRequest request,HttpServletResponse response){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>ZyHandler zyHandler = getZyHandler(request);<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans>try {<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> if (null == zyHandler){<?xml version="1.0" encoding="UTF-8" ?>
<beans>
<component-scan base-package="com.code_study.controller,com.code_study.service"></component-scan>
</beans> response.getWriter().write("[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企服之家,中国第一个企服评测及商务社交产业平台。
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4