MVC框架封装笔记DispacherServlet(12.29)

1.在web项目web.xml配置核心Servlet

<!-- 这儿配置核心的Servlet -->
  <servlet>
    <servlet-name>dispacher</servlet-name>
    <servlet-class>com.qfedu.mvc.framwork.servlet.DispacherServlet</servlet-class>
  </servlet>

2.拦截Controller请求

<!-- 做开发的时候不会拦截所有请求,只会拦截Controller中的请求,Controller中的请求
  一般都使用 .action后缀,表示的是一个动作 -->
  <servlet-mapping>
    <servlet-name>dispacher</servlet-name>
    <url-pattern>*.action</url-pattern>
  </servlet-mapping>

3.访问请求地址时就会被拦截下来,获取到中间的请求地址

 //获取请求的URI地址
 //端口之后 问号之前的那一部分
// http://127.0.0.1:8080    /users/test1.action      ?username=admin&password=123
String requestURI = req.getRequestURI();

4.再去容器中拿取

 //容器中找beanDefinition对象
ConcurrentHashMap<String, Beandefinition> container = RquestMappingContainer.getContainer();
Beandefinition beandefinition = container.get(requestURI);

5.没有拿取到值就报异常,有值就执行目标对象的method.invoke(类对象,参数)

没拿到抛异常
 if(beandefinition==null){
            throw new MvcException("no mapping......");
        }
取到值
//        //有值执行
//        //执行目标类的对象,method.invoke(类对象,参数)
        Object obj = beandefinition.getObj();
        Method method = beandefinition.getBeanMethodDefinition().getMethod();
        //TODO 这里之前需要处理参数问题
        Object[] args = handlerReqParameters(req,beandefinition);	
handlerReqParameters方法
  /**
     * 用来处理请求参数的自动封装
     * @param req
     * @param beandefinition
     * @return
     */
    private Object[] handlerReqParameters(HttpServletRequest req, Beandefinition beandefinition) {
        //首先获取到当前请求的方法参数的描述
        List<BeanParameterDefinition> beanParameterDefinitions = beandefinition.getBeanMethodDefinition().getBeanParameterDefinitions();
        //定义一个数组专门用来存储数据
        Object[] args = new Object[beanParameterDefinitions.size()];
        //声明一个存储数据的下标
        int index=0;
        //接下来遍历这个集合获取每一个参数的名字,以及参数的类型
        for (BeanParameterDefinition beanParameterDefinition:beanParameterDefinitions){
            //获取参数的名字
            String name = beanParameterDefinition.getName();
            //获取参数的类型
            String type = beanParameterDefinition.getType();
            //根据不同的类型处理参数
            if (jugmentTypeIsJavaTypeOrNot(type)){
                //进行处理
                handlerJavaTypeParameter(type,name,req,args,index);
            }
            index++;
        }
        return args;
    }
handlerJavaTypeParameter方法
 /**
     * c处理参数中Java的数据类型
     * @param type
     * @param name
     * @param req
     * @param args
     */
    private void handlerJavaTypeParameter(String type, String name, HttpServletRequest req, Object[] args,int index) {
        System.out.println("name:"+name);
        //通过名字去req中获取值
        String parameter = req.getParameter(name);
        if(StringUtils.isEmpty(parameter)){
            throw new MvcException("参数"+name+"未传递值");
        }
        //传递值执行
        //进行类型的转化
        switch (type){
            case "java.lang.Integer":
            case "int":
                int val = Integer.parseInt(parameter);
                //设置值
                args[index]=val;
                break;
            case "java.lang.String":
            case "String":
                args[index]=parameter;
                break;
            case "java.lang.Float":
            case "float":
                float val1 = Float.parseFloat(parameter);
                args[index]=val1;
                break;
            case "java.lang.Double":
            case "double":
                double v = Double.parseDouble(parameter);
                args[index]=v;
                break;
        }
    }
jugmentTypeIsJavaTypeOrNot方法
 /**
     * 判断是Java中的类型还是自定义的类型,还是集合类型,还是数组类型
     * @param type
     * @return
     */
    private boolean jugmentTypeIsJavaTypeOrNot(String type) {
        String[] javaTypes = JavaTypeConstance.getJavaType();
        for (String javaType:javaTypes){
            if(StringUtils.equals(type,javaType)){
                return true;
            }
        }
        return false;
    }

JavaTypeConstance常量类

/**
 * java类型的常量类型
 */
public class JavaTypeConstance {
    //定义的是Java中的数据类型
    private static final String[] JAVA_TYPE={
            "int", "java.lang.Integer","String","java.lang.String","float","java.lang.Float",
            "double","java.lang.Double","long","java.lang.Long","boolean","java.lang.Boolean"
    };
    public static String[] getJavaType(){
        return JAVA_TYPE;
    }
}
最后通过method.invoke()执行到目标方法去
Object returnVal = method.invoke(obj,args);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值