我们知道在web开发中配置Servlet有2种方式,一种是xml,另外一种是注解开发,前面我们已经使用java读取过xml文件,xml配置方式的原理比较清晰了,但是注解一直比较模糊,下面我们就使用java程序来读取Servlet的注解,然后输出注解配置的相关信息。
我们首先创建一个简单的Servlet,使用注解进行配置。代码如下
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet(urlPatterns = {"/ok1","/ok2"})
public class OkServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("注解get");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("注解post");
}
}
这个Servlet配置了个url,分别是“/ok1”和“/ok2”,我们首先简单说一下Servlet注解配置的流程,tomcat在运行时会扫描所有包里面的类,看是否有注解配置,是不是应该Servlet,并且根据注解来进行不同操作。下面我们就使用程序来模拟tomcat扫描包并读取注解的过程。代码如下
import javax.servlet.annotation.WebServlet;
import java.util.HashMap;
public class TestAnnotationServlet {
private final static HashMap<String, Object> HASH_MAP = new HashMap<>();
public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
//首先得到扫描包 路径,进而得到类的全路径
String classAllPath = "com.clucky.servlet.annotation.OkServlet";
//通过反射得到类的实例对象
Class<?> aClass = Class.forName(classAllPath);
//得到注解
WebServlet annotation = aClass.getAnnotation(WebServlet.class);
String[] urlPatterns = annotation.urlPatterns();
//输出配置的url
for (String urlPattern : urlPatterns) {
System.out.println("urlPattern = " + urlPattern);
}
//如果匹配urlPattern 如果是第一次,tomcat就会创建一个该实列,放入hashmap,
if (!HASH_MAP.containsKey("okServlet")) {
Object newInstance = aClass.newInstance();
HASH_MAP.put("okServlet", newInstance);
}
}
}
我们运行这个测试,发现输出了我们OkServlet配置的url
tomcat注解配置的原理大概就是这样,运行时扫描包,然后得到每个类的注解,根据注解来进行不同的操作,使用注解简化了开发,使得我们不再依赖于web.xml文件进行配置