文章字数:325,阅读全文大约需要1分钟
web三大组件
Servlet
Filter
- ``
Servlet运行时插件
META-INF/services/javax.servlet.ServletContaonerInitializer
创建这个文件继承
ServletContainerInitializer
类1
2
3
4
5
6
7
8
9
10
11.class}) // 指定需要加载的父类 (value = {MyService
public class MyServletContainerInitializer implements ServletContainerInitializer {
public void onStartup(Set<Class<?>> arg0, ServletContext arg1) throws ServletException {
// arg0: 上面指定的父类的子类会全部传过来
// arg1: 应用上下文,可以注册Servlet、Listener、Filter
arg1.addServlet("servletName", new xxxServlet()).addMapping("/myServlet");
arg1.addListener(OrderListener.class);
// filter比较麻烦。。。
}
}将类的位置写入
META-INF/services/javax.servlet.ServletContaonerInitializer
SpringMVC
中也实现了一个,需要运行前加载的类继承AbstractAnnotationConfigDospatcherServletInitializer
WEB
容器加载之前会创建此对象,调用其中方法初始化容器以前的一个控制器getRootConfigClasses
根容器(Spring的Config文件,注入bean和指定扫描位置的)getServletConfigClasses
子容器(Spring的Config文件,注入bean和指定扫描位置的)
``
SpringMVC
核心类是
DispatcherServlet
SpringMvcConfigurer
可以进行代替xml的配置,例如jsp根目录,静态资源目录,拦截器等
servlet3.0
异步执行业务,链接池线程直接返回。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19"/order", asyncSupported = true)// 开启异步 (
public class MyServlet extend HttpServlet {
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException{
AsyncContext startAsync = req.startAsync(); // 打开一个异步执行
startAsync.start(new Runnable(){
public void run() {
try {
//...业务逻辑
startAsync.complete();// 通知容器,执行结束
AsyncContext asyncContext = req.getAsyncContext();
ServletResponse response = asyncContext .getReponse();
response.getWriter().write("res.....success");// 返回结果
} catch (Exception e){}
}
});
}
}SpringMVC
实现1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class AsyncOrderController {
"/order1") (
public Callable<String> order1() {
Callable<String> callable = new Callable<String>() {
public String call() throws Exception {
return "success";
}
};
return callable;
}
}1
2
3
4
5
6
7"/doOrder") (
public DeferredResult<Object> doOrder() {
DeferredResult<Object> deferredResult = new DeferredResult<> ((long) 5000, "fail..."); // 设置超时时间以及超时返回的值
new Thread(()->{
deferredResult.setResult("success"); // 调用这个就可以异步返回执行结果
}).run();
}