什麼是Tomcat?
Tomcat簡單的說就是一個運行JAVA的網絡伺服器,底層是Socket的一個程序,它也是JSP和Serlvet的一個容器。
tomcat結構目錄有哪些?bin:啟動和關閉tomcat的bat文件
conf:配置文件server.xml該文件用於配置server相關的信息,比如tomcat啟動的埠號,配置主機(Host)web.xml文件配置與web應用(web應用相當於一個web站點)tomcat-user.xml配置用戶名密碼和相關權限.lib:該目錄放置運行tomcat運行需要的jar包logs:存放日誌,當我們需要查看日誌的時候,可以查詢信息webapps:放置我們的web應用work工作目錄:該目錄用於存放jsp被訪問後生成對應的server文件和.class文件
如何配置Tomcat虛擬目錄?
1. 在server.xml中的節點下添加如下代碼。path表示的是訪問時輸入的web項目名,docBase表示的是站點目錄的絕對路徑2. 進入到confCatalinalocalhost文件下,創建一個xml文件,該文件的名字就是站點的名字。
Tomcat體系結構是怎樣的?
瀏覽器 -> tomcat server-> service ->connector -> engine(引擎) -> host(主機) -> web應用
Web請求在Tomcat請求中的請求流程是怎麼樣的?
1.瀏覽器輸入URL地址2.查詢本機hosts文件尋找IP3.查詢DNS伺服器尋找IP4.向該IP發送Http請求5.Tomcat容器解析主機名6.Tomcat容器解析Web應用7.Tomcat容器解析資源名稱8.Tomcat容器獲取資源9.Tomcat響應瀏覽器
什麼是Servlet?
Servlet其實就是一個遵循Servlet開發的java類。Servlet是由伺服器調用的,運行在伺服器端。
HttpServlet類有哪些方法?
有init【初始化】,destroy【銷毀】,service【服務】,ServletConfig【Servlet配置】,getServletInfo【Servlet信息】。
Servlet生命周期?
加載Servlet : 當Tomcat第一次訪問Servlet的時候,Tomcat會負責創建Servlet的實例初始化 : 當Servlet被實例化後,Tomcat會調用init()方法初始化這個對象處理服務 : 當瀏覽器訪問Servlet的時候,Servlet 會調用service()方法處理請求銷毀 : 當Tomcat關閉時或者檢測到Servlet要從Tomcat刪除的時候會自動調用destroy()方法,讓該實例釋放掉所佔的資源。一個Servlet如果長時間不被使用的話,也會被Tomcat自動銷毀卸載 : 當Servlet調用完destroy()方法後,等待垃圾回收。如果有需要再次使用這個Servlet,會重新調用init()方法進行初始化操作。簡單總結:只要訪問Servlet,service()就會被調用。init()只有第一次訪問Servlet的時候才會被調用。destroy()只有在Tomcat關閉的時候才會被調用。
Servlet是單例的嗎?
瀏覽器多次對Servlet的請求,一般情況下,伺服器只創建一個Servlet對象,也就是說,Servlet對象一旦創建了,就會駐留在內存中,為後續的請求做服務,直到伺服器關閉。
Servlet是如何實現請求和響應的?
對於每次訪問請求,Servlet引擎都會創建一個新的HttpServletRequest請求對象和一個新的HttpServletResponse響應對象,然後將這兩個對象作為參數傳遞給它調用的Servlet的service()方法,service方法再根據請求方式分別調用doXXX方法。
Servlet存在線程安全的問題嗎?
當多個用戶訪問Servlet的時候,伺服器會為每個用戶創建一個線程。當多個用戶並發訪問Servlet共享資源的時候就會出現線程安全問題。如果一個變量需要多個用戶共享,則應當在訪問該變量的時候,加同步機制synchronized (對象){}如果一個變量不需要共享,則直接在 doGet() 或者 doPost()定義.這樣不會存在線程安全問題
Servlet的加載時機是在什麼時候?
在servlet的配置當中,可以使用<load-on-startup>5</load-on-startup>標籤進行配置標記容器是否在啟動的時候就加載這個servlet。當值為0或者大於0時,表示容器在應用啟動時就加載這個servlet;當是一個負數時或者沒有指定時,則指示容器在該servlet被選擇時才加載。正數的值越小,啟動該servlet的優先級越高。
為什麼我沒有配置關於圖片的Servlet我缺可以訪問這個靜態圖片?
在web訪問任何資源都是在訪問Servlet,這是由預設Servlet為你服務的!什麼叫做預設Servlet?凡是在web.xml文件中找不到匹配的元素的URL,它們的訪問請求都將交給預設Servlet處理,也就是說,預設Servlet用於處理所有其他Servlet都不處理的訪問請求既然我說了在web訪問任何資源都是在訪問Servlet,那麼我訪問靜態資源【本地圖片,本地HTML文件】也是在訪問這個預設Servlet【DefaultServlet】總結:無論在web中訪問什麼資源【包括JSP】,都是在訪問Servlet。沒有手工配置預設Servlet的時候,你訪問靜態圖片,靜態網頁,預設Servlet會在你web站點中尋找該圖片或網頁,如果有就返回給瀏覽器,沒有就報404錯誤
ServletConfig對象有什麼用?
ServletConfig獲取的是配置的是單個Servlet的參數信息,ServletContext可以獲取的是配置整個web站點的參數信息通過此對象可以讀取web.xml中配置的初始化參數。能夠讓你的程序更加靈活【更換需求,更改配置文件web.xml即可,程序代碼不用改】
什麼是ServletContext對象?
當Tomcat啟動的時候,就會創建一個ServletContext對象。它代表著當前web站點ServletContext既然代表著當前web站點,那麼所有Servlet都共享著一個ServletContext對象,所以Servlet之間可以通過ServletContext實現通訊。ServletConfig獲取的是配置的是單個Servlet的參數信息,ServletContext可以獲取的是配置整個web站點的參數信息可以利用ServletContext讀取web站點的資源文件實現Servlet的轉發【用ServletContext轉發不多,主要用request轉發】
通過Servlet讀取一個文件有哪些方式?
文件在class路徑下(使用絕對路徑)ServletContext servletContext = this.getServletContext();InputStream inputStream = servletContext.getResourceAsStream("/WEB-INF/classes/test/web/1.png")
文件在class路徑下(使用類加載器)ClassLoader classLoader = Servlet111.class.getClassLoader();InputStream inputStream = classLoader.getResourceAsStream("3.png");
文件在Web路徑下(相對路徑名)ServletContext servletContext = this.getServletContext();InputStream inputStream = servletContext.getResourceAsStream("2.png");
什麼是HttpServletRequest和HttpServletResponse對象?
Tomcat收到客戶端的http請求,會針對每一次請求,分別創建一個代表請求的request對象、和代表響應的response對象。HttpServletRequest和HttpServletResponse就是針對請求和響應進行封裝的對象。
HttpServletResponse向頁面輸出內容的方式有哪些?
調用getOutputStream()方法向瀏覽器輸出數據response.getOutputStream().write("aaa".getBytes());
調用getWriter()方法向瀏覽器輸出數據PrintWriter printWriter = response.getWriter(); printWriter.write("哈哈!");
解決輸出中文亂碼response.setContentType("text/html;charset=UTF-8");
Tomcat的預設埠是多少,怎麼修改
8080
找到Tomcat目錄下的conf文件夾進入conf文件夾裡面找到server.xml文件打開server.xml文件在server.xml文件裡面找到下列信息<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
Tomcat 有哪幾種Connector 運行模式(優化)?
bio(blocking I/O)nio(non-blocking I/O)apr(Apache Portable Runtime/Apache可移植運行庫)bio: 傳統的Java I/O操作,同步且阻塞IO。nio: JDK1.4開始支持,同步阻塞或同步非阻塞IOaio(nio.2): JDK7開始支持,異步非阻塞IO
Tomcat有幾種部署方式?
直接把Web項目放在webapps下,Tomcat會自動將其部署在server.xml文件上配置節點,設置相關的屬性即可通過Catalina來進行配置:進入到confCatalinalocalhost文件下,創建一個xml文件,該文件的名字就是站點的名字。編寫XML的方式來進行設置。get方式和post方式有何區別
數據攜帶上GET方式:在URL地址後附帶的參數是有限制的,其數據容量通常不能超過1K。POST方式:可以在請求的實體內容中向伺服器發送數據,傳送的數據量無限制。
請求參數的位置上GET方式:請求參數放在URL地址後面,以?的方式來進行拼接POST方式:請求參數放在HTTP請求包中
用途上GET方式一般用來獲取數據POST方式一般用來提交數據
HttpServlet的 doGet與doPost方法的兩個參數是什麼
HttpServletRequest:封裝了與請求相關的信息HttpServletResponse:封裝了與響應相關的信息
Servlet獲取頁面的元素的值有幾種方式,分別說一下
request.getParameter() 返回客戶端的請求參數的值request.getParameterNames() 返回所有可用屬性名的枚舉request.getParameterValues() 返回包含參數的所有值的數組
request.getAttribute()和request.getParameter()區別
用途上request.getAttribute(), 一般用於獲取request域對象的數據(在跳轉之前把數據使用setAttribute來放到request對象上)。request.getParameter(), 一般用於獲取客戶端提交的參數。
存儲數據上request.getAttribute()可以獲取Objcet對象request.getParameter()只能獲取字符串(這也是為什麼它一般用於獲取客戶端提交的參數)
forward和redirect的區別?
發生位置不同轉發是發生在伺服器的,重定向是發生在瀏覽器的(二次請求,丟失第一次請求的數據)。
傳遞數據的類型不同轉發的request對象可以傳遞各種類型的數據,包括對象,重定向只能傳遞字符串。
跳轉的時間不同轉發時:執行到跳轉語句時就會立刻跳轉。重定向:整個頁面執行完之後才執行跳轉。
能夠去往的URL的範圍不一樣:轉發是伺服器跳轉只能去往當前web應用的資源。重定向是伺服器跳轉,可以去往任何的資源。
典型的應用場景:轉發: 訪問 Servlet 處理業務邏輯,然後 forward 到 jsp 顯示處理結果,瀏覽器裡 URL 不變重定向: 提交表單,處理成功後 redirect 到另一個 jsp,防止表單重複提交,瀏覽器裡 URL 變了
tomcat容器是如何創建servlet類實例?用到了什麼原理?
當容器啟動時,會讀取在webapps目錄下所有的web應用中的web.xml文件,然後對 xml文件進行解析,並讀取servlet註冊信息。然後,將每個應用中註冊的servlet類都進行加載,並通過 反射的方式實例化。(有時候也是在第一次請求時實例化)。在servlet註冊時加上1如果為正數,則在一開始就實例化,如果不寫或為負數,則第一次請求實例化。