javaweb技術(shù)小結(jié)

1. HTML

HTML指的超文本標(biāo)記語言(Hyper Text Markup Language), 是一種用來描述網(wǎng)頁的語言.
HTML: 結(jié)構(gòu), 決定網(wǎng)頁的結(jié)構(gòu)和內(nèi)容
CSS: 表現(xiàn), 設(shè)定網(wǎng)頁的表現(xiàn)樣式
JavaScript: 行為, 控制網(wǎng)頁的行為

2. servlet

Servlet是Sun公司制定的一套技術(shù)標(biāo)準(zhǔn), 包含與Web應(yīng)用相關(guān)的一系列接口, 是Web應(yīng)用實現(xiàn)方式的宏觀解決方案. 而具體的Servlet容器負(fù)責(zé)提供標(biāo)準(zhǔn)的實現(xiàn).
可以簡單的理解servlet就是用來處理客戶端請求的.

請求與servlet的對應(yīng), 是通過在web.xml配置中servlet-mapping生效, 詳見文章最后.

一次請求經(jīng)過的流程:
一次請求request ==>
過濾器(如果有)==>
到對應(yīng)的servlet中根據(jù)發(fā)送的get或者post請求然后執(zhí)行相應(yīng)的doGet或者doPost方法(此處可以可以編碼繼承HttpServlet, 重寫相應(yīng)的方法來實現(xiàn), 也可以直接重寫service方法) ==>
根據(jù)Servlet具體的行為, 執(zhí)行響應(yīng)的動作, 例如可能返回response, 可能轉(zhuǎn)發(fā), 可能重定向等 ==> end

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 處理get請求
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 處理post請求
    }
    @Override
    public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
        // 也可以同時在這里處理request 和 response
    }
}

關(guān)于請求參數(shù)HttpServletRequest其功能是:

  • 可以從該對象獲取請求參數(shù)
  • 在請求域中綁定數(shù)據(jù)
  • 將請求轉(zhuǎn)發(fā)給另外一個URL地址

響應(yīng)結(jié)果HttpServletResponse其功能是:

  • 使用PrintWriter對象向瀏覽器輸出數(shù)據(jù)
  • 實現(xiàn)請求的重定向

設(shè)置重定向:

response.sendRedirect("重定向的地址");

servlet收到瀏覽器請求后, 可以進(jìn)行一定處理后, 交給服務(wù)器內(nèi)部的別的servlet進(jìn)行處理, 即轉(zhuǎn)發(fā)請求:
因為轉(zhuǎn)發(fā)是在服務(wù)器內(nèi)部進(jìn)行的, 所以用戶是無感知的.

RequestDispatcher rd = req.getRequestDispatcher("轉(zhuǎn)發(fā)的地址");
// req還是用的原來的req, 所以在req到達(dá)下一個servlet后, 其中綁定的數(shù)據(jù)依然可以使用
rd.forward(req, resp);

JSP技術(shù)

其本質(zhì)是一種servlet技術(shù), 主要用于頁面顯示

JSP全稱Java Server Pages, 顧名思義就是運行在java服務(wù)器中的頁面, 也就是在我們JavaWeb中的動態(tài)頁面, 其本質(zhì)就是一個Servlet.(經(jīng)過轉(zhuǎn)化后就是一個java文件, 其中的網(wǎng)頁源代碼文件就是java程序通過不斷的打印輸出 HTML 的代碼實現(xiàn))

一般情況下, 都是Servlet處理完的數(shù)據(jù), 轉(zhuǎn)發(fā)到JSP, JSP負(fù)責(zé)顯示數(shù)據(jù)的工作(因為其擅長顯示的工作)
我們可以在jsp頁面匯總寫java代碼:

<%
// java代碼
System.out.println("Hello JSP");
String str = "content";
%>
<%-- 可以通過以下的jsp表達(dá)式竞滓,使用java變量 --%>
<%=str%>

jsp中隱含的對象有以下幾個,可以直接使用:
① out(JspWriter):相當(dāng)于response.getWriter()獲取的對象吹缔,用于在頁面中顯示信息商佑。
② config(ServletConfig):對應(yīng)Servlet中的ServletConfig對象。
③ page(Object):對應(yīng)當(dāng)前Servlet對象厢塘,實際上就是this莉御。
④ pageContext(PageContext):當(dāng)前頁面的上下文,也是一個域?qū)ο蟆?br> ⑤ exception(Throwable):錯誤頁面中異常對象
⑥ request(HttpServletRequest):HttpServletRequest對象
⑦ response(HttpServletResponse):HttpServletResponse對象
⑧ application(ServletContext):ServletContext對象
⑨ session(HttpSession):HttpSession對象

JSP之EL表達(dá)式

EL是JSP內(nèi)置的表達(dá)式語言, 用以訪問頁面的上下文以及不同作用域中的對象, 取得對象屬性的值, 或執(zhí)行簡單的運算或判斷操作. EL在得到某個數(shù)據(jù)時, 會自動進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)換

EL表達(dá)式用于代替JSP表達(dá)式(<%= %>)在頁面中做輸出操作, 其作用就是讀取數(shù)據(jù). 輸出數(shù)據(jù), 如果數(shù)據(jù)為null, 則不輸出.

$(EL表達(dá)式(可完成取值, 簡單判斷, 簡單的運算等)) 例如:
${emp.email}
${emp.gender==0 ? "女": "男"}

EL取值的四個域:
pageScope: 當(dāng)前頁面有效
requestScope: 一次請求有效
sessionScope: 一次會話有效
applicationScope: 應(yīng)用的全局變量(服務(wù)器不炸, 一直都有, 一般是環(huán)境變量等全局的信息)

JSTL

JSTL(JavaServer Pages Standard Tag Library俗冻,JSP標(biāo)準(zhǔn)標(biāo)簽庫)
提供一些標(biāo)簽, 讓我們少寫java代碼. 頁面更加簡潔.
常用的標(biāo)簽:

<!-- if使用示例 --> 
<c:if test="${! empty employeeList}"></c:if>

<!-- for使用示例 --> 
<c:forEach items="${employeeList}" var="emp">
            <tr align="center">
                <td>${emp.id}</td>
                <td>${emp.lastName}</td>
                <td>${emp.department.deptName}</td>
                <td>
                    <a href="#">Edit</a>
                    &nbsp;&nbsp;
                    <a href="#">Delete</a>
                </td>
            </tr>
</c:forEach>

3. JavaScript

一種腳本語言, 在僅僅需要瀏覽器的支持即可運行(現(xiàn)在瀏覽器應(yīng)該沒有不支持的...), 負(fù)責(zé)網(wǎng)頁的動態(tài)內(nèi)容或者邏輯處理等等.

使用:

<script type="text/javascript">
// 具體代碼
</script>

JavaScript的事件驅(qū)動:
用戶事件: 點擊, 鼠標(biāo)移入, 鼠標(biāo)移出等
系統(tǒng)事件: 由系統(tǒng)觸發(fā)的事件, 如文檔加載完成等

BOM: Borwser Object Model 瀏覽器對象模型, 提供了獨立于內(nèi)容的礁叔、可以與瀏覽器窗口進(jìn)行互動的對象結(jié)構(gòu). Window對象是BOM的頂層對象,其他對象都是該對象的子對象.

DOM: Document Object Model 文檔對象模型, document對象代表當(dāng)前的HTML文檔(可以把HTML文檔看成一個樹狀模型). 獲取document對象的本質(zhì)方法是:window.document迄薄,而“window.”可以省略. (也就是說BOM包含了DOM)

DOM描述了處理網(wǎng)頁內(nèi)容的方法和接口, BOM描述了與瀏覽器進(jìn)行交互的方法和接口.

元素查詢:

// 通過id查詢, 返回一個具體的節(jié)點(id是唯一的)
document.getElementById("id值")
// 通過標(biāo)簽名查詢, 返回元素節(jié)點數(shù)組
document.getElementsByTagName("標(biāo)簽名")
// 根據(jù)name屬性值查詢, 返回元素節(jié)點數(shù)組
document.getElementsByName("name值")

AJAX

AJAX 是 Asynchronous JavaScript And XML 的簡稱. 直譯為, 異步的JS和XML.
AJAX 是一門技術(shù), 它提供了異步更新的機制, 使用客戶端與服務(wù)器間交換數(shù)據(jù)而非整個頁面文檔琅关,實現(xiàn)頁面的局部更新。

異步請求對象: XMLHttpRequest, 用來封裝請求報文. 現(xiàn)在有些瀏覽器已經(jīng)不支持了.

JQuery

jQuery是一個框架, 它對JS進(jìn)行了封裝, 使其更易于使用.
JQuery對同樣提供了對Ajax的支持, 更易于的進(jìn)行Ajax的開發(fā), 提供的相關(guān)方法有$.get, $.post, $.ajax等

JQuery的對象的本質(zhì)就是dom對象的數(shù)組/集合
JS轉(zhuǎn)JQuery: var jObj = $(dObj)
JQuery轉(zhuǎn)JS: var dObj = jObj[0] 或者 var dObj = jObj.get(0)

jQuery 庫包含以下特性:

  • HTML 元素選取
  • HTML 元素操作
  • CSS 操作
  • HTML 事件函數(shù)
  • JavaScript 特效和動畫
  • HTML DOM 遍歷和修改
  • AJAX
  • Utilities

一個登陸注冊頁面的例子如下:

$(function () {  // 頁面加載完成會執(zhí)行該函數(shù)內(nèi)容
            // 是否通過密碼測試標(biāo)志
            var passwordFlag = false
            // 是否通過用戶名合法測試標(biāo)志
            var usernameFlag = false

            $("#form").submit(function () {
                return usernameFlag && passwordFlag
            })

            $("#username").focus(function () {
                // alert("聚焦")
                $("#regist_msg").html("")
            })

            $("#re_password").blur(function () {
                // 離開
                var password = $("#password").val()
                var re_password = $("#re_password").val()
                if (password != null && password != "" && password == re_password) {
                    // 可以注冊
                    $("#repassord_msg").html("√")
                    passwordFlag = true
                } else {
                    // 不能注冊
                    $("#repassord_msg").html("X")
                    passwordFlag = false
                }
            })

            $("#username").blur(function () {
                // 離開
                var username = $("#username").val();
                // 發(fā)送異步請求
                $.ajax({
                    url: "checkUsername",
                    type: "POST",
                    data: "username=" + username,
                    success: function (data) {  // 會將服務(wù)器返回的數(shù)據(jù)保存到data中
                        // 設(shè)置到span 元素 的內(nèi)容為data
                        if (data == 0) {
                            // alert("用戶已存在")
                            $("#regist_msg").html("用戶已存在")
                            usernameFlag = false
                        } else {
                            // alert("用戶不存在")
                            $("#regist_msg").html("可以使用")
                            usernameFlag = true
                        }
                    }
                })
            })
        })

4. 一些技術(shù)

Cookie

HTTP是無狀態(tài)協(xié)議, 服務(wù)器不能記錄瀏覽器的訪問狀態(tài), 也就是說服務(wù)器不能區(qū)分中兩次請求是否由一個客戶端發(fā)出.
Cookie就是服務(wù)器在瀏覽器保存的一段信息. 有了Cookie就可以讓瀏覽器每次帶著Cookie進(jìn)行訪問, 瀏覽器就可以根據(jù)其中的內(nèi)容, 判斷是哪個瀏覽器在訪問了.

Cookie的使用

// 設(shè)置cookie, 要返回給瀏覽器
Cookie cookie = new Cookie("id","123321123321");
cookie.setPath("設(shè)置cookie的路徑");
cookie.setMaxAge("設(shè)置cookie保留的時間");
response.addCookie(cookie);

// 讀取cookie, 瀏覽器帶著cookie來訪問
Cookie [] cookies = request.getCookies();

Seesion

Cookie有局限性, 不能太大(否則網(wǎng)絡(luò)傳輸會浪費大量時間), 而且瀏覽器一般會對cookie的大小做出限制.
于是Session出現(xiàn)了, 可以有效的解決這個問題.

Session的用法
就是在服務(wù)器端保存一些用戶的數(shù)據(jù), 然后傳遞給用戶一個名字為 JSESSIONID 的Cookie, 其對應(yīng)服務(wù)器的一個Session對象, 通過它就可以獲取保存用戶信息的Session.

Session的創(chuàng)建時機是在request.getSession()方法第一次被調(diào)用時.
Session創(chuàng)建后, 同時又一個名為JSESSIONID 的Cookie被創(chuàng)建, 這個Cookie的默認(rèn)時效就是當(dāng)前的會話.
Session的機制也是依賴于Cookie來實現(xiàn)的.

Session默認(rèn)有效時間為30分鐘讥蔽,可以在服務(wù)器的web.xml配置中修改.

關(guān)于URL重寫

有時候Cookie會被瀏覽器禁用, 這時可以使用URL重寫. 把會話的JSESSIONID 寫在URL后面.

服務(wù)器的過濾器

WEB資源可能Servlet涣易、JSP、HTML頁面等. 過濾器可以截取客戶端和WEB資源之間的request和response信息.
一個WEB應(yīng)用中可以部署多個過濾器, 多個過濾器就組成了一個過濾器鏈, 請求和響應(yīng)必須在經(jīng)過多個過濾器后才能到達(dá)目標(biāo).

示意圖

過濾器的使用, 通過Filter接口完成過濾器的開發(fā)

public class LoginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LoginFilter 初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, 
                        ServletResponse servletResponse, 
                        FilterChain filterChain) throws IOException, ServletException {
    }

    @Override
    public void destroy() {
        System.out.println("LoginFilter 銷毀方法");
    }
}

同時在web.xml中配置生效.

在線人數(shù)統(tǒng)計

監(jiān)聽到session創(chuàng)建了, 就認(rèn)為一個用戶在線
編寫一個監(jiān)聽器

public class MySessionListener implements HttpSessionListener {
    /**
     * 監(jiān)聽到session創(chuàng)建了, 就認(rèn)為一個用戶在線.
      ServletContext: 很強大, 引用服務(wù)器被創(chuàng)建, 服務(wù)器銷毀此對象才會被銷毀, 聲明周期與服務(wù)器相同, 相當(dāng)于全局變量
     */
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        /* Session is created. */
        ServletContext servletContext = se.getSession().getServletContext();
        // 獲取人數(shù)
        Object count = servletContext.getAttribute("count");
        if(count == null){
            // 沒有則創(chuàng)建
            servletContext.setAttribute("count", 1);
        }else {
            servletContext.setAttribute("count", (Integer)count + 1);
        }
    }
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        /* Session is destroyed. */
    }
}

同時在web.xml中添加一個listener即可.

Json

AJAX一開始使用的時XML的數(shù)據(jù)格式, XML的數(shù)據(jù)格式非常簡單清晰, 容易編寫, 但是由于XML中包含了過多的標(biāo)簽, 以及十分復(fù)雜的結(jié)構(gòu), 解析起來也相對復(fù)雜. 所以目前來講, AJAX中已經(jīng)幾乎不使用XML來發(fā)送數(shù)據(jù)了, 取而代之的是一項JSON.

JSON是JavaScript Object Notation 的縮寫冶伞,是JS提供的一種數(shù)據(jù)交換格式.

在服務(wù)器與瀏覽器之間通過JSON字符串傳遞數(shù)據(jù).

JSON字符串轉(zhuǎn)化為Java對象, 常用的工具大概有三種, json-lib, jackson, gson.
而java對象通過json字符串傳送給瀏覽器, js在接受的時候會默認(rèn)直接轉(zhuǎn)化為JSON對象.

web.xml的配置文件

<servlet-mapping> 中的 <servlet-name> 和 <servlet> 中的 <servlet-name> 相同的時候, 二者就關(guān)聯(lián)起來了, 就能通過<servlet-class> 找到對應(yīng)的servlet.
<url-pattern> 則是瀏覽器訪問服務(wù)端匹配的模式, 只要匹配就可以通過<servlet-name>找到<servlet-class>

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- 過濾器的使用 -->
    <filter>
        <filter-name>LoginFilter</filter-name>
        <filter-class>com.jia.login.filter.LoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>LoginFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <!-- 監(jiān)聽器的配置 -->
    <listener>
        <listener-class>com.jia.login.listener.MySessionListener</listener-class>
    </listener>

    <!-- servlet的配置 -->
    <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>com.jia.login.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <!-- 客戶端的登錄請求: http://localhost:8888/web01/login -->
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

    <!-- servlet的配置 -->
    <servlet>
        <servlet-name>checkUsername</servlet-name>
        <servlet-class>com.jia.login.servlet.CheckUsername</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>checkUsername</servlet-name>
        <url-pattern>/checkUsername</url-pattern>
    </servlet-mapping>
</web-app>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末荚醒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子隆嗅,更是在濱河造成了極大的恐慌界阁,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胖喳,死亡現(xiàn)場離奇詭異泡躯,居然都是意外死亡,警方通過查閱死者的電腦和手機丽焊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進(jìn)店門较剃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來重付,“玉大人,你說我怎么就攤上這事凫乖。” “怎么了弓颈?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵帽芽,是天一觀的道長。 經(jīng)常有香客問我纤子,道長搬瑰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任控硼,我火速辦了婚禮泽论,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卡乾。我一直安慰自己翼悴,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布幔妨。 她就那樣靜靜地躺著鹦赎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪误堡。 梳的紋絲不亂的頭發(fā)上古话,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天,我揣著相機與錄音锁施,去河邊找鬼陪踩。 笑死杖们,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的膊毁。 我是一名探鬼主播胀莹,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼婚温!你這毒婦竟也來了描焰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤栅螟,失蹤者是張志新(化名)和其女友劉穎荆秦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體力图,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡步绸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吃媒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瓤介。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖赘那,靈堂內(nèi)的尸體忽然破棺而出刑桑,到底是詐尸還是另有隱情,我是刑警寧澤募舟,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布祠斧,位于F島的核電站,受9級特大地震影響拱礁,放射性物質(zhì)發(fā)生泄漏琢锋。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一呢灶、第九天 我趴在偏房一處隱蔽的房頂上張望吴超。 院中可真熱鬧,春花似錦鸯乃、人聲如沸烛芬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽赘娄。三九已至,卻和暖如春宏蛉,著一層夾襖步出監(jiān)牢的瞬間遣臼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工拾并, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揍堰,地道東北人鹏浅。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像屏歹,于是被迫代替她去往敵國和親隐砸。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架蝙眶,建立于...
    Hsinwong閱讀 22,366評論 1 92
  • 目錄Cookie機制什么是CookieCookie的不可跨域名性Unicode編碼:保存中文BASE64編碼:保存...
    Tomatoro閱讀 16,940評論 7 186
  • Web應(yīng)用程序 WEB季希,在英語中web即表示網(wǎng)頁的意思,它用于表示Internet主機上供外界訪問的資源幽纷。Inte...
    陳先森mansplain閱讀 2,362評論 1 4
  • IOC 控制反轉(zhuǎn)容器控制程序?qū)ο笾g的關(guān)系式塌,而不是傳統(tǒng)實現(xiàn)中,有程序代碼之間控制友浸,又名依賴注入峰尝。All 類的創(chuàng)建,...
    irckwk1閱讀 936評論 0 0
  • “自尊=成功/抱負(fù)”收恢,詹姆士自尊經(jīng)典公式武学。雖然成功并非易事,但是我們可以適當(dāng)?shù)呐囵B(yǎng)自己的高自尊伦意。
    湫女子閱讀 106評論 0 1