生命周期:init() , service() 和 destroy()
https://blog.youkuaiyun.com/u010900754/article/details/79998379
所以这里一共有四个优先级:
精确》路径》后缀》default。后缀内部又分为两个优先级。其次搞清楚各自的格式。
只要搞清楚了优先级,那么/*和/的区别不是很简单吗。
不想走已配置的springMVC的controller时或图片被拦截时可在web.xml中配置:
<servlet>
<servlet-name>default</servlet-name>
<servlet-class>
org.apache.catalina.servlets.DefaultServlet
</servlet-class>
<init-param>
<param-name>debug</param-name>
<param-value>0</param-value>
</init-param>
<init-param>
<param-name>listings</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/busiLicense.html</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>*.jpg</url-pattern>
</servlet-mapping>
服务器上需要一些程序,常常是根据用户输入访问数据库的程序。这些通常是使用公共网关接口(Common Gateway Interface,CGI)应用程序完成的。
在传统的 CGI中,每个请求都要启动一个新的进程,如果 CGI 程序本身的执行时间较短,启动进程所需要的开销很可能反而超过实际执行时间。而在 Servlet 中,每个请求由一个轻量级的 Java 线程处理(而不是重量级的操作系统进程)。
在传统 CGI 中,如果有 N 个并发的对同一 CGI程序的请求,则该CGI程序的代码在内存中重复装载了 N 次;而对于 Servlet,处理请求的是 N 个线程,只需要一份 Servlet 类代码。在性能优化方面,Servlet 也比 CGI 有着更多的选择。
Tomcat便是为了支持servlet而发展出来的servlet容器
HttpServlet和HttpServletRequest的区别联系?
一个是对参数的处理逻辑,一个是参数,其实没有任何逻辑关系。。
HttpServlet(转处理http协议请求的servlet)继承了GenericServlet(通用的无关协议的servlet)(对GenericServlet的service方法重写以调用自己增加的doGet和doPost方法),GenericServlet实现了Servlet接口(但service方法可以不实现?)
DispatcherServlet(springMVC的处理请求映射到控制器及处理控制器返回的数据模型和视图名的servlet)通过继承HttpServlet实现了Servlet的方法doService还有自己的一个方法doDispatch()
关于servlet参数:
FacadeRequest是对Request的封装,是对HttpServletRequest接口的实现(为什么要实现及封装?)。
HttpServletRequest接口继承了ServletRequest接口
https://blog.youkuaiyun.com/aesop_wubo/article/details/7630440#
tomcat入口:org.apache.catalina.startup.Bootstrap的main方法
https://blog.youkuaiyun.com/jiaomingliang/article/details/47401275 tomcat的启动
tomcat-coyote.jar下的JIoEndpoint类:run方法中调用下面方法处理socket
protected boolean processSocket(Socket socket)
{
try
{
SocketWrapper<Socket> wrapper = new SocketWrapper(socket);
wrapper.setKeepAliveLeft(getMaxKeepAliveRequests());
wrapper.setSecure(isSSLEnabled());
if (!this.running) {
return false;
}
getExecutor().execute(new SocketProcessor(wrapper));
}
catch (RejectedExecutionException x)
{
log.warn("Socket processing request was rejected for:" + socket, x);
return false;
}
catch (Throwable t)
{
ExceptionUtils.handleThrowable(t);
log.error(sm.getString("endpoint.process.fail"), t);
return false;
}
return true;
}
SocketWrapper的构造方法:
private volatile E socket;
public SocketWrapper(E socket)
{
this.socket = socket;
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
this.blockingStatusReadLock = lock.readLock();
this.blockingStatusWriteLock = lock.writeLock();
}
at com.xx.meituanhotel.pc.webapp.controller.MainController.exception(MainController.java:197) ~[classes/:na]
at sun.reflect.GeneratedMethodAccessor725.invoke(Unknown Source) ~[na:na]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.7.0_79]
at java.lang.reflect.Method.invoke(Method.java:606) ~[na:1.7.0_79]
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) ~[spring-web-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:832) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:743) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:961) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:895) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:858) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:624) [servlet-api.jar:na]
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843) ~[spring-webmvc-4.2.7.RELEASE.jar:4.2.7.RELEASE]
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) [servlet-api.jar:na]
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) [catalina.jar:7.0.70]
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) [catalina.jar:7.0.70]
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:747) [catalina.jar:7.0.70]
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:487) [catalina.jar:7.0.70]
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:410) [catalina.jar:7.0.70]
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:337) [catalina.jar:7.0.70]
at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:479) [catalina.jar:7.0.70]
at org.apache.catalina.core.StandardHostValve.status(StandardHostValve.java:341) [catalina.jar:7.0.70]
at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:434) [catalina.jar:7.0.70]
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:204) [catalina.jar:7.0.70]
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) [catalina.jar:7.0.70]
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) [catalina.jar:7.0.70]
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:442) [catalina.jar:7.0.70]
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1082) [tomcat-coyote.jar:7.0.70]
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:623) [tomcat-coyote.jar:7.0.70]
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) [tomcat-coyote.jar:7.0.70]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) [na:1.7.0_79]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) [na:1.7.0_79]
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-coyote.jar:7.0.70]
at java.lang.Thread.run(Thread.java:745) [na:1.7.0_79]