Servlet3.0

1:ServletContainerInitializer

ServletContainerInitializer是Servlet3.0提供的用于注册Servlet、Filter、Listener三大组件的控件。在初始化是可以操作感兴趣的类,功能强大。
具体示例如下:
//ServletContainerInitializer注册Servlet、Filter、Listener
@HandlesTypes(value = {HelloService.class})
public class MyServletContainerInitalizer implements ServletContainerInitializer {
@Override
public void onStartup(Set<Class<?>> set, ServletContext servletContext) throws ServletException {
System.out.println("感兴趣的类型。。。");
for(Class<?> cls : set) {
System.out.println(cls);
}

ServletRegistration.Dynamic servlet = servletContext.addServlet("helloServlet", HelloServlet.class);
servlet.addMapping("/user");

servletContext.addListener(HelloListener.class);

FilterRegistration.Dynamic dFilter = servletContext.addFilter("userFilter", EncodingFilter.class);
dFilter.addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST),true,"/*");
}
}
HelloServlet.class、HelloListener.class、EncodingFilter.class分别为简单的示例,就不一一列出。
新建ServletContainerInitializer需要编写META-INF\services\javax.servlet.ServletContainerInitializer文件。
 具体项目目录如下:

├─.idea
│ ├─artifacts
│ └─libraries
├─src
│ └─main
│ ├─java
│ │ └─com
│ │ └─itranswarp
│ │ └─learnjava
│ │ ├─filter
│ │ ├─listener
│ │ ├─service
│ │ └─servlet
│ ├─resources
│ │ └─META-INF
│ │ └─services
│ └─webapp
│ └─WEB-INF

2:ServletContainerInitializer和Spring MVC

通过ServletContainerInitializer可以整合注释的MVC。

主要代码如下:

MyWebAppInitializer 类:
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

//Web容器启动的时候创建对象;调用容器来初始化配置和前端控制器
public class MyWebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
//获取根容器的配置文件(Spring配置文件) 父容器
protected Class<?>[] getRootConfigClasses() {
return new Class[] {RootConfig.class};
}

//获取web容器配置信息,子容器
protected Class<?>[] getServletConfigClasses() {
return new Class[]{AppConfig.class};
}

//获取DispatchServlet的映射信息
// /:拦截所有静态请求,但不包括*.jsp
protected String[] getServletMappings() {
return new String[] {"/"};
}
}

AppConfig类:

//只扫描Controller,子容器
//useDefaultFilters = false
@ComponentScan(value = "com.itranswarp.learnjava.mvc",includeFilters = {
@ComponentScan.Filter(type= FilterType.ANNOTATION,classes={Controller.class})},useDefaultFilters = false)
@EnableWebMvc
public class AppConfig extends WebMvcConfigurerAdapter {
//资源配置器
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/views/",".jsp");
}

//静态资源访问
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}

// //拦截器
// @Override
// public void addInterceptors(InterceptorRegistry registry) {
// //super.addInterceptors(registry);
// registry.addInterceptor(new MyFristInterceptor()).addPathPatterns("/**");
// }
}

RootConfig 类:
//根容器,扫描出Controller外的其他注解,父容器
@ComponentScan(value = "com.itranswarp.learnjava.mvc",excludeFilters = {
@ComponentScan.Filter(type= FilterType.ANNOTATION,classes={Controller.class})
})
public class RootConfig {

}

3:异步操作
Servlet通过asyncSupported = true开始异步操作。
具体测试代码
@WebServlet(value = "/asyc",asyncSupported = true)
public class HelloAsycServlet extends HttpServlet {
protected void doGet(final HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
final AsyncContext asyncContext = request.startAsync();
System.out.println("主线程开始:" + Thread.currentThread());
asyncContext.start(new Runnable() {
public void run() {
System.out.println("副线程开始:" + Thread.currentThread());
try {
sayHello();
asyncContext.complete();
AsyncContext asyncContext1 = request.getAsyncContext();
ServletResponse servletResponse = asyncContext1.getResponse();
PrintWriter pw = servletResponse.getWriter();
pw.write("hello asyc...");
System.out.println("副线程结束:" + Thread.currentThread());
pw.flush();
} catch (Exception e) {

}
}
});

System.out.println("主线程结束:" + Thread.currentThread());
}

private void sayHello() throws InterruptedException {
System.out.println("proceeding...");
Thread.sleep(3000);
}

}

Spring MVC也基于Servlet3.0提供了相关异步操作。
Callable比较简单,具体如下:
@ResponseBody
@RequestMapping("/asyc01")
public Callable<String> asyc01() {
System.out.println("主线程开始:" + Thread.currentThread());
Callable<String> callable = new Callable<String>() {
public String call() throws Exception {
System.out.println("副线程开始:" + Thread.currentThread());
Thread.sleep(2000);
System.out.println("副线程结束:" + Thread.currentThread());
return "allable<String> asyc01()";
}
};

System.out.println("主线程结束:" + Thread.currentThread());
return callable;
}

DeferredResult为另一种方式:

@ResponseBody
@RequestMapping("/createOrder")
public DeferredResult<Object> createOrder() {
    DeferredResult<Object> deferredResult = new DeferredResult<Object>((long)3000,"create fail...");
DeferedResultQueue.save(deferredResult);
return deferredResult;
}

@ResponseBody
@RequestMapping("/create")
public String create() {
String order = UUID.randomUUID().toString();
DeferredResult<Object> deferredResult = DeferedResultQueue.get();
deferredResult.setResult(order);
return "success===>" + order;
}

public class DeferedResultQueue {
private static Queue<DeferredResult<Object>> queue = new ConcurrentLinkedDeque<DeferredResult<Object>>();

public static void save(DeferredResult<Object> deferredResult) {
queue.add(deferredResult);
}

public static DeferredResult<Object> get() {
return queue.poll();
}
}




以上内容来自网上视频教程,再次表示感谢。






 
 


 



 

posted @ 2020-07-25 23:48  清风名曰  阅读(146)  评论(0)    收藏  举报