Servlet原理分析,並手動實現自己的Servlet接口攔截強求
當前都是使用springMVC框架,導致對於底層的東西一知半解
web瀏覽器 ,tomcat , servlet之間的關係
簡單來講:程序間通信可以通過socket來實現,而tomcat就相當於一個socket的client,和web瀏覽器建立連接
那麼tomcat是怎麼調用 我們的後臺Java程序:servlet作爲tomcat調用後臺程序的入口,有servlet的Java項目才能算做一個web程序
1.訪問servlet 必要配置
第一種:在web.xml中配置servlet的信息
<!---servlet 1-->
<servlet>
<servlet-name>TestMyServlet</servlet-name>
<servlet-class>/test</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Myservlet</servlet-name>
<url-pattern>/test</url-pattern>
</servlet-mapping>
第二種 : 通過註解@webServlet("/test")
@WebServlet("/test")
public class TestMyServlet implements Servlet, Serializable {
}
2. 自己實現攔截請求的Servlet實現類
通常我們寫servlet都是繼承HttpServlet,那麼Servlet是怎樣實現攔截請求的,或者說Tomcat是怎麼調用Servlet的,通過自己實現Servlet,能夠體會到Servlet的作用。
具體的實現類如下:
@WebServlet("/test")
public class test implements Servlet, Serializable {
//這個和HttpServlet中的doGet()一樣
public void doGetGetGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("hello word");
Writer wirter = resp.getWriter();
wirter.write("hello ");
}
//初始化方法,這個會被tomcat調用
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init");
}
//這個是處理請求的方法
@Override
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
System.out.println("getServletConfig()");
String method = request.getMethod();
if(method.equalsIgnoreCase("get")){
doGetGetGet(request, response);
}
}
/*以下方法不是非必須要實現的*/
public ServletConfig getServletConfig() {
return null;
}
public String getServletInfo() {
return null;
}
public void destroy() {
}
}
如上所示,重點在於三個方法:
tomcat接收到請求,初始化該請求對應web.xml中配置的servlet或者@webservlet註解的類。
init(): 必須實現的方法,該方法是被tomcat下的 StandardWapper.loadServlet 顯式的調用,
作用,加載,初始化請求對應的Servlet。
相關類tomcat的lib目錄下位於catalina.jar org.apache.catalina.core.StandardWrapper
service(): 必須實現的方法, 這個方法是被tomcat 的ApplicationFilterChain顯式的調用。
作用: 處理請求,並且返回響應;
相關類tomcat的lib目錄下catalina.jar org.apache.catalina.core.ApplicationFilterChain
doGetGetGet() : 自定義的處理get請求的方法,被service()調用。這之後,就可以調用我們後臺程序了