web结构图如下
第一步搭建一个普通的web项目
第二步写一个注解
package cn.zzj.anno;
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.RUNTIME;
@Target({METHOD,TYPE,FIELD})//类,方法对象
@Retention(RUNTIME) // 表示注解在字节码文件(硬盘,内存)都存在
@Documented//一直保留到 运行期间
public @interface ReqMapping {
String value();//参数,并不是方法
}
第三步创建一个Servlet
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>cn.zzj.servlet.MyServlet</servlet-class>
<init-param>
<param-name>namespace</param-name>
<param-value>cn.zzj.controller</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
MyServlet
1.在inti初始化方法里面操作包扫描
2..反射获取类对象,方法,实例化
3.存放到HashMap里面
package cn.zzj.servlet;
import cn.zzj.anno.ReqMapping;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
public class MyServlet extends HttpServlet {
Map<String, Method> mapUrlMethod = new HashMap<>();//用来存放注解,方法
Map<String, Object> mapUrlObject = new HashMap<>();//用来存放方法,实例化的对象
public MyServlet(){
System.out.println("调用了一次");
}
@Override //初始化,只会执行一次
public void init(ServletConfig config) throws ServletException {
//super.init(config);
String path = config.getInitParameter("namespace");//cn.zzj.controller
System.out.println("init=" + path);//打印一下是不是拿到了
String path2 = path.replace(".","/");//把路径替换成计算机能读懂的路径
System.out.println("计算机能读懂的包:"+ path2);//打印看看
File f2 = new File(MyServlet.class.getResource("/").getPath());//拿到当前的电脑路径
System.out.println("电脑路径为:" + f2);
path2 = f2.toString() + "/" + path2;//把字节路径跟已经转成计算机能读懂的扫描的包路径加起来
//根据包名称,可以找到字节码所在的位置
System.out.println("总路径:"+path2);
File f = new File(path2);//拿到文件所有列表
String [] list = f.list();
//打印
for (String s : list){
System.out.println("拿到文件中的各个包:" + s);
}
String[] list2 = new String[list.length];//获取当前扫描包的配置文件
for (int i = 0;i<list.length;i++){
list2[i] = path + "." + list[i].replace(".class","");//进行拼接拿到路径,替换掉class
}
//打印
for (String s : list2){
System.out.println("打印新的数组" + s);
}
for (int i = 0; i < list2.length; i++) {
try {
Class<?> c = Class.forName(list2[i]);//获取类对象
Method[] mm = c.getDeclaredMethods();//获取方法
Object obj = c.newInstance();//类对象实例化对象
System.out.println(obj);
for (Method m : mm) {
System.out.println(m);//获取方法对象
ReqMapping an = m.getAnnotation(ReqMapping.class);//获取方法的注解
ReqMapping cn = c.getAnnotation(ReqMapping.class);//获取类对象的注解
if (an == null) continue;//没有注解的方法就跳过
System.out.println(cn.value() + an.value());//类对象注解和方法注解合并
mapUrlMethod.put(cn.value() + an.value(), m);//用 HashMap 方法存放起来注解队形的方法
mapUrlObject.put(cn.value() + an.value(), obj);//用 HashMap 方法存放方法,对象
}
} catch (Exception e) {
System.out.println(e);
}
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String action = request.getServletPath();
System.out.println("请求动作:" + request.getServletPath());
Method m = mapUrlMethod.get(action);//根据注解的名称,获取方法对象
System.out.println(m);
if (m == null) {
response.getWriter().println(request.getServletPath()+"404。。。");
// System.out.println("404");
return;
}
//获取方法实例的对象
Object obj = mapUrlObject.get(action);
if (obj == null) {
response.getWriter().println(request.getServletPath()+"404。。。");
// System.out.println("404");
return;
}
try {
m.invoke(obj,request,response);
} catch (Exception e) {
System.out.println(e);
}
}
}
第四步编写一个控制类
package cn.zzj.controller;
import cn.zzj.anno.ReqMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@ReqMapping("/book")
public class BookController {
@ReqMapping("/add.do")
public void add(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("我是Book add="+request);
System.out.println("我是Book add="+response);
//页面输出
response.getWriter().write("Book add这是书本的添加");
}
@ReqMapping("/del.do")
public void del(HttpServletRequest request,HttpServletResponse response) throws Exception{
System.out.println("Book del="+request);
System.out.println("Book del="+response);
response.getWriter().write("Book del");
}
}