0%

SpringMVC和servlet3-0

文章字数:325,阅读全文大约需要1分钟

web三大组件

  • Servlet
  • Filter
  • ``

Servlet运行时插件

  • META-INF/services/javax.servlet.ServletContaonerInitializer创建这个文件

  • 继承ServletContainerInitializer

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @HandlesTypes(value = {MyService.class}) // 指定需要加载的父类
    public class MyServletContainerInitializer implements ServletContainerInitializer {
    @Override
    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
    @WebServlet("/order", asyncSupported = true)// 开启异步
    public class MyServlet extend HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException{
    AsyncContext startAsync = req.startAsync(); // 打开一个异步执行
    startAsync.start(new Runnable(){
    @Override
    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

    @RestController
    public class AsyncOrderController {
    @RequestMapping("/order1")
    public Callable<String> order1() {
    Callable<String> callable = new Callable<String>() {
    @Override
    public String call() throws Exception {
    return "success";
    }
    };
    return callable;
    }
    }
    1
    2
    3
    4
    5
    6
    7
    @RequestMapping("/doOrder")
    public DeferredResult<Object> doOrder() {
    DeferredResult<Object> deferredResult = new DeferredResult<> ((long) 5000, "fail..."); // 设置超时时间以及超时返回的值
    new Thread(()->{
    deferredResult.setResult("success"); // 调用这个就可以异步返回执行结果
    }).run();
    }