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);