c罩到底多大(C罩有多大?)
2024-05-07
更新時間:2024-05-08 00:04:33作者:未知
Java Web是指用Java語言來解決相關(guān)Web領(lǐng)域的技術(shù)總和,一個Web應(yīng)用程序包括Web客戶端和Web服務(wù)器兩個部分,即基于B/S(瀏覽器/服務(wù)器)架構(gòu)的應(yīng)用程序。
Web客戶端通常是指用戶機上的瀏覽器,如微軟的IE瀏覽器或火狐瀏覽器等??蛻舳瞬恍枰_發(fā)任何用戶界面,而統(tǒng)一采用瀏覽器即可。
Web服務(wù)器是一臺或多臺可運行Web應(yīng)用程序的計算機,通常我們在瀏覽器中輸入的網(wǎng)站地址,即Web服務(wù)器的地址。當(dāng)用戶在瀏覽器的地址欄中輸入網(wǎng)站地址并按回車鍵后,請求即被發(fā)送到 Web服務(wù)器。服務(wù)器接收到請求后,會返回給用戶帶有請求資源的響應(yīng)消息。Java在服務(wù)器端的應(yīng)用非常豐富,如Servlet、JSP和第三方框架等。
早期的Web應(yīng)用主要是靜態(tài)頁面的瀏覽,即靜態(tài)網(wǎng)站。 這些網(wǎng)站使用HTML語言來編寫,放在Web服務(wù)器上。 用戶使用瀏覽器通過HTTP協(xié)議請求服務(wù)器上的Web頁面,Web服務(wù)器處理接收到的用戶請求后發(fā)送給客戶端瀏覽器顯示給用戶。工作原理如圖:
用戶所訪問的資源已不局限于服務(wù)器中保存的靜態(tài)網(wǎng)頁。更多的內(nèi)容需要根據(jù)用戶的請求動態(tài)生成頁面信息,即動態(tài)網(wǎng)站。 這些網(wǎng)站通常使用HTML語言和動態(tài)腳本語言(如JSP、ASP或PHP等)編寫,并將編寫后的程序部署到Web服務(wù)器中。 由Web服務(wù)器處理動態(tài)腳本代碼并將其轉(zhuǎn)換為瀏覽器可以解析的HTML代碼,最后返回客戶端瀏覽器顯示給用戶,其工作流程如圖:
客戶端則需要安裝專用的客戶端軟件。如圖所示:
在B/S結(jié)構(gòu)中客戶端不需要開發(fā)任何用戶界面,而統(tǒng)一采用IE或火狐等瀏覽器。通過Web瀏覽器向Web服務(wù)器發(fā)送請求,由Web服務(wù)器處理并將處理結(jié)果逐級傳回客戶端,如圖所示。
內(nèi)置對象
1.Request對象Request對象是javax.servlet.http.HttpServletRequest類的實例。代表請求對象,主要用于接受客戶端通過HTTP協(xié)議連接傳輸?shù)椒?wù)器端的數(shù)據(jù)。比如表單中的數(shù)據(jù)、網(wǎng)頁地址后帶的參數(shù)等。2.Response對象Response對象是javax.servlet.http.HttpServletResponse類的實例。代表響應(yīng)對象,主要用于向客戶端發(fā)送數(shù)據(jù)。3.Out對象Out對象是javax.servlet.jsp.JspWriter類的實例。主要用于向客戶端瀏覽器輸出數(shù)據(jù)。4.session對象Session 對象是javax.servlet.http.HttpSession類的實例。主要用來保持在服務(wù)器與一個客戶端之間需要保留的數(shù)據(jù),比如在會話期間保持用戶的登錄信息等,會話狀態(tài)維持是Web應(yīng)用開發(fā)者必須面對的問題。當(dāng)客戶端關(guān)閉網(wǎng)站的所有網(wǎng)頁或關(guān)閉瀏覽器時,session對象中保存的數(shù)據(jù)會自動清除。由于Htp協(xié)議是一個無狀態(tài)協(xié)議,不保留會話間的數(shù)據(jù),因此通過session對象擴展了htp的功能。比如用戶登錄一個網(wǎng)站之后,登錄信息會暫時保存在session對象中,打開不同的頁面時,登錄信息是可以共享的,一旦用戶關(guān)閉瀏覽器或退出登錄,就會清除session對象中保存的登錄信息。5.Application對象Application對象是javax.servlet.ServletContext類的實例。主要用于保存用戶信息,代碼片段的運行環(huán)境;它是一個共享的內(nèi)置對象,即一個容器中的多個用戶共享一個application對象,故其保存的信息被所有用戶所共享。6.PageContext對象PageContext對象是javax.servlet.jsp.PageContext類的實例。用來管理網(wǎng)頁屬性,為JSP頁面包裝頁面的上下文,管理對屬于JSP中特殊可見部分中已命名對象的訪問,它的創(chuàng)建和初始化都是由JSP容器來完成的。7.Config對象Config對象是javax.servlet.ServletConfig類的實例。是代碼片段配置對象,表示Servlet的配置。8.Page(相當(dāng)于this)對象Page對象是javax.servlet.jsp.HttpJspPage類的實例。用來處理JSP網(wǎng)頁,它指的是JSP頁面對象本身,或者說代表編譯后的servlet對象,只有在JSP頁面范圍之內(nèi)才是合法的。9.Exception對象Exception對象是java.lang.Throwable類的實例。處理JSP文件執(zhí)行時發(fā)生的錯誤和異常只有在JSP頁面的page指令中指定isErrorPage=“true”后,才可以在本頁面使用exception對象。復(fù)制代碼
在JSP網(wǎng)頁開發(fā)的初級階段并沒有框架與邏輯分層概念,需要將Java代碼嵌入到網(wǎng)頁中處理JSP頁面中的一些業(yè)務(wù)邏輯,如字符串處理和數(shù)據(jù)庫操作等,其開發(fā)流程如圖所示。
如果使HTML與Java代碼相分離,將Java代碼單獨封裝成為一個處理某種業(yè)務(wù)邏輯的類。然后在JSP頁面中調(diào)用此類,則可以降低HTML與Java代碼之間的耦合度,并且簡化JSP頁面,提高Java程序代碼的重用性及靈活性。這種與HTML代碼相分離,而使用Java代碼封裝的類就是一個JavaBean組件。 在Java Web開發(fā)可以使用該組件來完成業(yè)務(wù)邏輯的處理,應(yīng)用JavaBean與JSP組合的開發(fā)模式如圖所示。
JavaBean是用Java語言所寫成的可重用組件,其應(yīng)用十分廣泛,可以應(yīng)用于系統(tǒng)的很多層中,如PO、VO、DTO和POJO等。
用戶通過單擊某個鏈接或者直接在瀏覽器的地址欄中輸入URL來訪問Servlet,Web服務(wù)器接收到請求后,并不是將請求直接交給Servlet容器。Servlet容器實例化Servlet,調(diào)用Servlet的一個特定方法( service() ),并產(chǎn)生一個響應(yīng)。這個響應(yīng)由Servlet容器返回給Web服務(wù)器,Web服務(wù)器包裝這個響應(yīng),以HTTP響應(yīng)的形式發(fā)送給Web瀏覽器。整個過程如圖:
Cookie的作用:通俗地說就是當(dāng)一個用戶通過HTTP協(xié)議訪問一個服務(wù)器的時候,這個服務(wù)器會將一些Key/Value鍵值對返回給客戶端瀏覽器,并給這些數(shù)據(jù)加上一些限制條件,在條件符合時這個用戶下次訪問這個服務(wù)器的時候,數(shù)據(jù)又被完整地帶回給服務(wù)器。 這個作用就像你去超市購物時,第一次給你辦張購物卡,這個購物卡里存放了一些你的個人信息,下次你再來這個連鎖超市時,超市會識別你的購物卡,下次直接購物就好了。當(dāng)初W3C在設(shè)計Cookie時實際上考慮的是為了記錄用戶在一段時間內(nèi)訪問Web應(yīng)用的行為路徑。由于HTTP協(xié)議是一種無狀態(tài)協(xié)議,當(dāng)用戶的一次訪問請求結(jié)束后,后端服務(wù)器就無法知道下一次來訪問的還是不是上次訪問的用戶,在設(shè)計應(yīng)用程序時,我們很容易想到兩次訪問是同一人訪問與不同的兩個人訪問對程序設(shè)計和性能來說有網(wǎng)很大的不同。例如,在一個很短的時間內(nèi),如果與用戶相關(guān)的數(shù)據(jù)被頻繁訪問,可以針對這個數(shù)據(jù)做緩存,這樣可以大大提高數(shù)據(jù)的訪問性能。Cookie的作用正是在此,由于是同一個客戶端發(fā)出的請求,每次發(fā)出的請求都會帶有第一次訪問時服務(wù)端設(shè)置的信息,這樣服務(wù)端就可以根據(jù)Cookie值來劃分訪問的用戶了。
@WebServlet("/CookieTest")public class CookieTest extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");Cookie[] cookies = request.getCookies();PrintWriter out = response.getWriter();if(cookies!=null){out.println("上次訪問的時間是:");for (Cookie cookie : cookies) {if("lastTime".equals(cookie.getName())){long lastTime = Long.parseLong(cookie.getValue());Date date = new Date(lastTime);out.println(date.toLocaleString());}}}else{out.println("你是第一來");}Cookie cookie = new Cookie("lastTime", String.valueOf(System.currentTimeMillis()));//給cookie設(shè)置一些信息//cookie.setMaxAge(500); //有效期//cookie.setPath(uri);//服務(wù)器端給客戶端一個Cookieresponse.addCookie(cookie);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}復(fù)制代碼
解碼與編碼(與Cookie無關(guān),只是解決亂碼的一種方式)
//傳中文,避免亂碼。可以進行編碼Cookie cookie = new Cookie("lastTime",URLEncoder.encode("尚", "utf-8"));//取出Cookie值,需要解碼URLDecoder.decode(cookie.getValue(),"utf-8");復(fù)制代碼
為什么需要Session?前面已經(jīng)介紹了Cookie可以讓服務(wù)端程序跟蹤每個客戶端的訪問,但是每次客戶端的訪問都必須傳回這些Cookie,如果Cookie很多,這無形地增加了客戶端與服務(wù)端的數(shù)據(jù)傳輸量,而Session的出現(xiàn)正是為了解決這個問題。 同一個客戶端每次和服務(wù)端交互時,不需要每次都傳回所有的Cookie值,而是只要傳回一個ID,這個ID是客戶端第一次訪問服務(wù)器的時候生成的,而且每個客戶端是唯一的。這樣每個客戶端就有了一個唯一的ID,客戶端只要傳回這個ID就行了,這個ID通常是NANE為JSESIONID的一個Cookie。
一個瀏覽器去服務(wù)器租房子,服務(wù)器記錄一下瀏覽器的行為和數(shù)據(jù),然后給了瀏覽器一把房間的鑰匙 然后,每次瀏覽器可以使用自己的鑰匙去打開自己的房間,使用房間的所有東西。(當(dāng)然,你不能去開別人的房間,何況也打不開)
瀏覽器想鍛煉身體,愉悅心情。服務(wù)器心想我不能給你們網(wǎng)每一個人的房間增加一套體育設(shè)備吧,那我的經(jīng)濟壓力多大。服務(wù)器想了想,決定建設(shè)一個公開場所,體育館,所有瀏覽器都可以使用這些共享資源。
@WebServlet("/SessionTest1")public class SessionTest extends HttpServlet {private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");PrintWriter out = response.getWriter();out.write("Session的ID為:");// 獲取 Session HttpSession session = request.getSession();out.write(session.getId());session.setAttribute("name", "shang");//設(shè)置當(dāng)前會話多久結(jié)束,單位秒。如果設(shè)置的值為零或負數(shù),則表示會話將永遠不會超時。常用于設(shè)置當(dāng)前會話時間。//session.setMaxInactiveInterval(1);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}復(fù)制代碼
@WebServlet("/SessionTest2")public class SessionTest2 extends HttpServlet {private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {request.setCharacterEncoding("utf-8");response.setContentType("text/html;charset=utf-8");HttpSession session = request.getSession();//移除session的數(shù)據(jù)session.removeAttribute("name");//手動注銷當(dāng)前會話session.invalidate();}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}}復(fù)制代碼
運行在Java虛擬機中的每一個Web應(yīng)用程序都有一個與之相關(guān)的Servlet上下文。Java Servlet API提供了一個ServletContext接口用來表示上下文。在這個接口中定義了一組方法,Servlet可以使用這些方法與它的Servlet容器進行通信,例如,得到文件的MIME類型,轉(zhuǎn)發(fā)請求,或者向日志文件中寫入日志消息。 ServletContext對象是Web服務(wù)器中的一個已知路徑的根。 比如,Servlet上下文被定位于http://localhost:8080/ch02。以/ch02請求路徑(稱為上下文路徑)開始的所有請求被發(fā)送到與此ServletContext關(guān)聯(lián)的Web應(yīng)用程序。再比如,我們平常使用的http://localhost:8080/。以/請求路徑(稱為上下文路徑)開始的所有請求被發(fā)送到與此ServletContext關(guān)聯(lián)的Web應(yīng)用程序。
ServletContext: 這個是來自于servlet規(guī)范里的概念,它是servlet用來與容器間進行交互的接口的組合,也就是說,這個接口定義了一系列的方法,servlet通過這些方法可以很方便地與自己所在的容器進行一些交互。在一個應(yīng)用中(一個JVM),servlet容器可以有多個,而所有的servlet容器共享一個ServletContext。
最初的JSP開發(fā)模式為Model 1模式:JSP JavaBean
慢慢演變成了Model 2模式:JSP Servlet JavaBean
模型2符合MVC架構(gòu)模式,MVC即模型-視圖-控制器(Model-View-Controller)。
模型代表應(yīng)用程序的數(shù)據(jù)以及用于訪問控制和修改這些數(shù)據(jù)的業(yè)務(wù)規(guī)則。當(dāng)模型發(fā)生改變時,它會通知視圖,并為視圖提供查詢模型相關(guān)狀態(tài)的能力。同時,它也為控制器提供訪問封裝在模型內(nèi)部的應(yīng)用程序功能的能力。視圖用來組織模型的內(nèi)容。它從模型那里獲得數(shù)據(jù)并指定這些數(shù)據(jù)如何表現(xiàn)。當(dāng)模型變化時,視圖負責(zé)維護數(shù)據(jù)表現(xiàn)的一致性。視圖同時將用戶的請求通知控制器。控制器定義了應(yīng)用程序的行為。它負責(zé)對來自視圖的用戶請求進行解釋,并把這網(wǎng)些請求映射成相應(yīng)的行為,這些行為由模型負責(zé)實現(xiàn)。在獨立運行的GUI客戶端,用戶的請求可能是一些鼠標(biāo)單擊或是菜單選擇操作。在一個Web應(yīng)用程序中,它們的表現(xiàn)形式可能是一些來自客戶端的GET或POST的HTTP請求。模型所實現(xiàn)的行為包括處理業(yè)務(wù)和修改模型的狀態(tài)。根據(jù)用戶請求和模型行為的結(jié)果,控制器選擇一個視圖作為對用戶請求的響應(yīng)。如圖所示: