http介紹:http是一套規範,一種網絡數據交互的標準協議,不一樣的語言,不一樣的數據想要實現合理的數據交互(例如:瀏覽器和服務器數據交互),就得按照他所規定的協議來,這樣就會造成標準的(你們都認識的)數據交互。html
http交互流程:前端
1.客戶端和服務器創建起鏈接通道。java
2.客戶端發送請求給服務器。程序員
3.服務器處理請求後將結果響應給客戶端。web
4.客戶端和服務器的鏈接通道關閉。http1.1會等待一段時間若是沒有請求進來就會關閉。json
特色:後端
1.數據結構:他是以鍵值對的形式描述數據結構的。瀏覽器
2.無鏈接:一次請求一次響應,當本次請求獲得響應時即本次數據交互結束(客戶端和服務器斷開鏈接)。在http1.1中請求處理完成響應後,客戶端和服務器不會當即斷開鏈接而是在等待必定時間後再斷開,若是等待期間有請求過來那麼等待時間會從新開始(延長)。tomcat
3.無狀態:第一次請求處理完成後,要發送第二次請求,但即便兩次請求用的是相同的數據,在http中也是沒有任何關係的,因此二次請求任然須要重複第一次的流程,http他是沒有記憶功能的,因此哪怕兩次請求如出一轍,各自的請求仍是要發送所有的請求數據,這就是無狀態。安全
4.http是基於TCP協議發送數據的,所謂TCP大概意思爲:即兩端連通之後再進行數據請求和數據響應。UDP:即鏈接和請求一塊兒發送過去,不會等到雙方鏈接通暢以後再進行,因此UDP協議不會保證數據必定發送到另外一端,但效率比TCP要快。
http請求格式:
1.請求頭內容: 請求方式(get、post...) 請求地址(https://i.cnblogs.com/EditPosts.aspx?opt=1) http協議(1.0/1.1)
2.請求行、消息報頭:這裏面規範了服務器須要額外信息,通常瀏覽器會自動封裝,如:能解析的數據格式等,客戶端須要的Cookie數據。
3.空行
4.請求數據
在實際請求中瀏覽器爲了方便展現觀看:會將上面請求格式中的內容給分開展現,像get請求會將請求數據帶到請求地址後面。
http響應格式:
1.響應行:http版本 狀態碼 狀態消息
2.響應頭:消息報頭:服務器和瀏覽器之間的額外數據,例如:本次響應的消息類型...等等。
3.空行
4.響應實體:具體響應的數據。
額外解釋:
1.消息報頭:消息報頭中的信息和請求頭響應頭中的信息,這些信息中主要說明本次數據交互所採的各個屬性:例如本次數據的格式:xml/json...這些數據都是服務器和瀏覽器自動處理的不須要開發者關心,開發者只管將本身須要的數據添加進去便可:例如Cookie,服務器中對這些經常使用配置已經作了處理,而瀏覽器的各個廠商也對瀏覽器作了處理,因此程序員只須要關心請求數據和響應數據便可。
上面對http的大概介紹就這麼多,下面主要介紹Servlet:
客戶端向瀏覽器請求的流程:前端網頁源碼 -> 瀏覽器請求封裝(主要是消息報頭以及版本信息等) -> 服務器處理 -> 根據請求的不一樣(get post...) -> 分配到後端相應的接口邏輯中
Servlet的請求流程: 網頁請求 -> 服務器收到請求後尋找對應的Servlet -> 而後將請求信息以及要響應的信息封裝成request response對象傳入響應的Servlet對象的Service方法中去調用此方法。
好了,說了這麼多,開始上代碼:
web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <!--配置Servlet --> <!--配置servlet類路徑 --> <servlet> <servlet-name>my</servlet-name> <servlet-class>cn.mr.li.MyServlet</servlet-class> </servlet> <!--配置訪問方式 --> <servlet-mapping> <servlet-name>my</servlet-name> <url-pattern>/my</url-pattern> </servlet-mapping> </web-app>
servlet:
1.request做用域:一次請求一個數據做用域僅限本次請求所用到邏輯範圍,但經過請求轉發的方式可實現多個Servlet之間數據共享,一次請求,一次響應。
2.Cookie:客戶端數據存儲技術,並用於請求自動攜帶,至於帶什麼,請求哪些路徑時帶,生命週期等都是服務器設置的。而後由response對象通知客戶端去執行具體的操做。
3.重定向:response.sendRedirfect(uri),只能防止重複刷新重複請求,可是不能數據共享,若是將全部數據都放在Cookie中將不安全,並且也沒法驗證當前Cookie就是此人。
4.session做用域:同一個對象請求屢次數據共享。
5.sessionContext做用域:不一樣對象請求屢次數據共享。
6.tomcat服務器下的web.xml文件中的全局變量將是全部服務器都共享的數據範圍。
package cn.mr.li;
import java.io.IOException; import javax.servlet.ServletConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class MyServlet extends HttpServlet{ private static final long serialVersionUID = 8834328433966095720L; @Override public void service(HttpServletRequest request, HttpServletResponse response ) throws ServletException, IOException { //編碼,從iso8859-1編碼後再轉換成utf-8,uname字符串是請求的變量名 String uname = new String(request.getParameter("uname").getBytes("iso8859-1"), "utf-8"); //新建Cookie:將Cookie放到客戶端的消息報頭中 Cookie cookie = new Cookie("id", uname); //此Cookie的最大生命週期,設置了客戶端就會存到他本身的硬盤中,生命週期一到就會刪除,默認有效期期是本次會話,會話一旦關閉則失效 cookie.setMaxAge(24 * 3600); //往響應中添加Cookie,這樣纔會通知到客戶端下次請求會帶上本次存放的數據 response.addCookie(cookie); //設置訪問哪些路徑、目錄先時能夠帶cookie cookie.setPath("/端口號後的連接"); /** 請求轉發 一次訪問 後端邏輯跑多個Servlet, 記得要加return*/ //給Requset添加自定義屬性 request.setAttribute("key", "value:給下個流程的參數,此值是本流程產生的,這裏是能夠放一個Object對象的"); //演示請求轉發,意思是本Servlet處理完了本此Servlet管理的業務,將自動轉向下一個Servlet處理後序流程(原子性), //但若是客戶端網頁一刷新就從新開始一次請求,若是是轉錢業務用請求轉發就完犢子了,他會轉了由於頁面刷新再次請求又會轉,因此仍是要看具體業務的。 request.getRequestDispatcher("其餘sevlet的別名url-pattern標籤中的").forward(request, response); /** 重定向 屢次訪問 頭端通知前端,此時前端會自動訪問多個Servlet, * 可是request中若是有屬性值得話request.setAttribute,就沒法在下次請求中帶了,由於是不一樣的requset對象,不過session能夠解決*/ //由於請求轉發用戶一但刷新頁面將會不安全,會重複跑流程,因此有了重定向, //至關於本次Servlet處理業務完成後直接通知客戶端訪問下個Servlet此時客戶端會自動訪問下個Servlet response.sendRedirect("直接傳下次要訪問的uri"); /** Session 一個request在服務器上的對象,一個很全的對象,例如:某個用戶訪問了服務器:服務器將此用戶的User信息 * 查詢出來放到Session中,那麼此用戶下次請求Servlet是甚至只傳不多的參數便可 */ //建立Session此方法會從Requset的Cookie中取出他本身的SessionId,若是沒有或者沒取到則會建立一個新的Session對象 //而且將SessionId從新放到Cookie中,默認SessionId的生命週期30分鐘,一旦斷開鏈接則會銷燬 HttpSession session = request.getSession();//此session是用請求對象的sessionid取出來的。 //給session對象賦值屬性值 session.setAttribute("key", "Object類型"); //設置session的生命週期,時間單位:秒 session.setMaxInactiveInterval(123); //強制讓session過時 session.invalidate(); /** ServletContext對象:此對象的數據整個服務器共享,也就是說存放在此對象中的數據整個服務器上都能拿到,前提是要能獲得此對象 */ ServletContext sc1 = this.getServletContext();//方式1 sc1 = this.getServletConfig().getServletContext();//方式2 sc1 = request.getServletContext();//方式3 //一樣賦值 sc1.setAttribute("key", "Objcet"); //獲取全局配置web.xml sc1.getInitParameter("hahhahah"); //獲取全局配置的全部key名 sc1.getInitParameterNames(); /**ServletConfig專門讀取某個Servlet下的配置的,有次方法後全部的key都將不須要硬編碼*/ ServletConfig config = this.getServletConfig(); //讀取Servlet專屬變量名 String value = config.getInitParameter("key");//web.xml init-param標籤中 //給瀏覽器打印文本 response.getWriter().write("hello world!!!"); } // @Override // protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // resp.getWriter().write("do get!!!"); // } // // @Override // protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // resp.getWriter().write("do post!!!"); // } // // @Override // protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // resp.getWriter().write("do put!!!"); // } }
順帶提一下jsp:jsp的原理就是講html文件中的全部代碼所有讀進Servlet中轉爲輸出語句打印到控制檯上,而其中的java代碼,會讀過來後執行響應的邏輯後再本身的位置打印到瀏覽器。