说说Javaweb 服务器与Tomcat源代码解析
Javaweb 服務(wù)器機制:
servlet 是javaweb的請求和響應(yīng)的出入口,所以javaweb開發(fā)必定基于支持servlet,或者有servlet容器,如jetty,tomcat,weblogic服務(wù)器。
servlet運行起來就是web applicaiton,其在容器中就是一個個對象,當(dāng)然web 服務(wù)器中的servlet容器在創(chuàng)建一個個servlet對象的時候,也會創(chuàng)建相應(yīng)的其他對象,這些對象就是servlet環(huán)境對象(如上圖所示)。如同你創(chuàng)建一個window,那么系統(tǒng)也會創(chuàng)建服務(wù)于這個window的事件監(jiān)聽的對象,繪制對象等。這對象里面的數(shù)據(jù)包含servlet上下文,狀態(tài),請求參數(shù)等。
servlet啟動過程總創(chuàng)建這些對象,一個請求過來首先從web.xml中依據(jù)反射創(chuàng)建servlet對象,先是init() 創(chuàng)建 application對象,context對象,request,response對象,然后就是init(Config config)創(chuàng)建config對象和。接著就是創(chuàng)建session,out對象等。請求具體調(diào)用對象的get()或者post方法。
請求參數(shù)可以存儲在request對象中,或者servlet執(zhí)行的數(shù)據(jù)結(jié)果也可以放入在request對象中,當(dāng)然也可以放入在config對象中。然后在頁面中可以通過<%request.get(key,value)%>拿到處理后的數(shù)據(jù)。
jsp與servlet的關(guān)系:
使用Servlet產(chǎn)生動態(tài)網(wǎng)頁,需要在代碼中打印輸出很多HTML的標(biāo)簽,此外,在Servlet中,我們不得不將靜態(tài)現(xiàn)實的內(nèi)容和動態(tài)產(chǎn)生內(nèi)容的代碼混合在一起。使用Servlet開發(fā)動態(tài)網(wǎng)頁,程序員和網(wǎng)頁編輯人員將無法一起工作,因為網(wǎng)頁編輯人員不了解Java語言,無法修改Servlet代碼,而Java程序員可能也不是很了解網(wǎng)頁編輯人員的意圖,以至于無法修改和實現(xiàn)網(wǎng)頁功能。為了解決這些問題,Sun公司就推出了JSP技術(shù)。
如:
//用于響應(yīng)用戶的方法 public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response) throws java.io.IOException, javax.servlet.ServletException { final javax.servlet.jsp.PageContext pageContext; javax.servlet.http.HttpSession session = null; final javax.servlet.ServletContext application; final javax.servlet.ServletConfig config; //獲得頁面輸出流 javax.servlet.jsp.JspWriter out = null; final java.lang.Object page = this; javax.servlet.jsp.JspWriter _jspx_out = null; javax.servlet.jsp.PageContext _jspx_page_context = null; //開始生成響應(yīng) try { //設(shè)置輸出的頁面格式 response.setContentType("text/html"); pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true); _jspx_page_context = pageContext; application = pageContext.getServletContext(); config = pageContext.getServletConfig(); session = pageContext.getSession(); //頁面輸出流 out = pageContext.getOut(); _jspx_out = out; //輸出流,開始輸出頁面文檔 out.write("<html>\r\n"); out.write("<body>\r\n"); out.write("<center> \r\n"); out.write("Now time is: "); out.print(new java.util.Date()); out.write(" \r\n"); out.write("</center>\r\n"); out.write("</body>\r\n"); out.write("</html>"); } catch (java.lang.Throwable t) { if (!(t instanceof javax.servlet.jsp.SkipPageException)){ out = _jspx_out; if (out != null && out.getBufferSize() != 0) try { out.clearBuffer(); } catch (java.io.IOException e) {} if (_jspx_page_context != null) _jspx_page_context.handlePageException(t); else throw new ServletException(t); } } finally { _jspxFactory.releasePageContext(_jspx_page_context); } }JSP文件必須在JSP服務(wù)器內(nèi)運行。JSP文件必須生成Servlet才能執(zhí)行。每個JSP頁面的第一個訪問者速度很慢,因為必須等待JSP編譯成Servlet。JSP頁面的訪問者無須安裝任何客戶端,甚至不需要可以運行Java的運行環(huán)境,因為JSP頁面輸送到客戶端的是標(biāo)準HTML頁面。index.jsp頁面中的每個字符都由index.java文件的輸出流生成。servlet是在web服務(wù)器上的java程序,它提供服務(wù),由它來傳遞給你html的格式。Servlet API為Servlet提供了統(tǒng)一的編程接口,Servlet必須部署在Servlet容器,才能響應(yīng)客戶端的請求 ?對外提供服務(wù)。要對外統(tǒng)一接口,由容器來調(diào)用。jsp側(cè)重顯示,servlet側(cè)重控制邏輯。
事實上,JSP是Servlet的一種特殊形式,每個JSP頁面就是一個Servlet實例——JSP頁面由系統(tǒng)編譯成Servlet,Servlet再負責(zé)響應(yīng)用戶請求。JSP其實也是Servlet的一種簡化,使用JSP時,其實還是使用Servlet,因為Web應(yīng)用中的每個JSP頁面都會由Servlet容器生成對應(yīng)的Servlet。對于Tomcat而言,JSP頁面生成的Servlet放在work路徑對應(yīng)的Web應(yīng)用下。
Tomcat 代碼框架:
總結(jié)
以上是生活随笔為你收集整理的说说Javaweb 服务器与Tomcat源代码解析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360 将推千亿级大语言模型 360GL
- 下一篇: android 获得手机外插SD卡 存储