JavaWeb-不得不學習的Jsp

0. 引言

  • 學習Jsp的目的是為了解技術從前后端強耦合到前后端分離的過程,增加自己的技術積淀。了解并且體會這個過程胃榕,非常有利于后臺知識的學習和后臺相關技術的開發(fā)。

1. 安裝Tomacat

  • 官網下載Tomcat 7.0僚楞,下載到本地勤晚,然后解壓即可。

  • 配置環(huán)境變量:

    我的電腦-屬性-高級-環(huán)境變量-高級環(huán)境變量-新建-變量名:CATALINA_HOME-變量值:Tomcat路徑(bin的上一個目錄級)

  • 驗證:輸入ip+端口號泉褐,出現Tomcat的頁面,表示配置成功

2. Tomcat閃退

  • 配置JAVA環(huán)境變量即可

3. Tomcat目錄結構

Tomcat目錄結構.png

4. 編寫第一個java web程序

  • Tomcat-webapps下創(chuàng)建index.jsp文件
<HTML>

<head> 
<title>我的第一個jsp頁面</title>
</head>

<body>

<h1>歡迎大家訪問我的個人主頁</h1>

</body>

</HTML>

  • Tomcat-webapps下創(chuàng)建WEB-INF文件夾
  • WEB-INF文件夾下面創(chuàng)建名為classes和lib的文件夾和web.xml文件鸟蜡,web.xml內容如下:
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

</web-app>
1. 在webapps下創(chuàng)建項目目錄
2. 編寫index.jsp
3. 創(chuàng)建WEB-INF目錄
4. 測試運行

5. WEB-INF目錄結構詳解

  • WEB-INF是Java的Web應用的安全目錄膜赃。所謂安全就是客戶端無法訪問,只有服務端才可以訪問揉忘。
1. 在WEB-INF里面創(chuàng)建test.html文件
2. 訪問http://172.25.164.79:8080/myhome/WEB-INF/test.html
HTTP Status 404 -
type Status report

message

description The requested resource is not available.

Apache Tomcat/7.0.85
  • web.xml :項目部署文件跳座,項目的配置信息
1. 訪問:http://172.25.164.79:8080/myhome/ 會默認訪問項目myhome文件夾下面的index.jsp
2. 修改index.jsp名字為abc.jsp 訪問:http://172.25.164.79:8080/myhome/
HTTP Status 404 - /myhome/
type Status report

message /myhome/

description The requested resource is not available.

Apache Tomcat/7.0.85
3. 在web.xml中配置歡迎頁面后,即可訪問abc.jsp:
<?xml version="1.0" encoding="ISO-8859-1"?>

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                      http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  version="3.0"
  metadata-complete="true">

    <welcome-file-list>
        <welcome-file>/abc.jsp</welcome-file>
    </welcome-file-list>

</web-app>

  • class文件夾泣矛,用以放置.class文件
  • lib文件夾疲眷,用以存放需要的jar包

6. IDEA 配置服務器并關聯(lián)項目(創(chuàng)建了第一個jsp項目)

7. JSP簡介

  • JSP全名是Java Server Pages
  • 其根本是一個簡化的Servlet設計
  • 實現了在Java當中使用HTML標簽
  • Jsp是一種動態(tài)網頁技術標準,也是JAVAEE的標準
  • JSP與Servlet一樣您朽,是在服務器端執(zhí)行的狂丝。

8. JSP特點

  • Java平臺,安全性高哗总,適合開發(fā)大型的几颜,企業(yè)級的Web應用程序。

9. JSP頁面元素構成

  • 靜態(tài)內容
  • 指令
  • 表達式
  • 小腳本
  • 聲明
  • 注釋

10. 指令分類

  • page指令:

    通常位于jsp頁面的頂端讯屈,同一個頁面可以有多個page指令蛋哭。

  • include指令:

    將一個外部文件嵌入到當前JSP文件中,同時解析這個頁面中的JSP語句涮母。

  • taglib指令:

    使用標簽庫定義新的自定義標簽谆趾,在JSP頁面中啟用定制行為。

11. page指令:

<%@ page contentType="text/html;charset=UTF-8" language="java"  %>

1. language:制定JSP頁面使用的腳本語言叛本。默認值:java
2. import:通過該屬性來引用腳本語言中使用到的類文件沪蓬。默認值:無
3. contentType:用來指定JSP頁面所采用的編碼方式。默認值:text/html炮赦,ISO-8859-1

12. JSP注釋

  • JSP注釋:
    <%--這是title標簽--%> //客戶端不可見的
  • HTML注釋:
    <!--html注釋--> //客戶端可見
  • JSP腳本注釋:
    //單行注釋
   /*
   多行注釋
    */

13. JSP腳本

在JSP頁面中執(zhí)行的java代碼
<%
   out.println("我只不過想做一個好人");
%>

這句代碼在idea里面不會自動提示生成怜跑,而eclispe會。

14. JSP聲明

在JSP頁面中定義變量和方法
<%!
    String s = "張三豐"; //聲明了一個字符串變量

    int add(int x, int y) { //聲明了一個返回整形的函數,實現兩個整數的求和
        return x + y;
    }
%>

15. JSP表達式

在JSP表達式中可以用到聲明中聲明的變量和函數
你好<%=s %>
<br>
5+6 = <%=add(5, 6)%>

16. JSP的生命周期

JSP頁面的聲明周期.png

JSP生命周期詳述.png

17. 用腳本打印九九乘法表

  • 表達式
<%! String printForm99() {
    String s = "";
    for (int i = 1; i <= 9; i++) {
        for (int j = 1; j <= i; j++) {
            s += i + "*" + j + "=" + i * j + "&nbsp;";
        }
        s += "<br>";
    }
    return s;
}
%>
<%=printForm99() %>
1*1=1 
2*1=2 2*2=4 
3*1=3 3*2=6 3*3=9 
4*1=4 4*2=8 4*3=12 4*4=16 
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 

18. JSP的內置對象簡介

  • JSP內置對象是Web容器創(chuàng)建的一組對象性芬,不適用new關鍵字就可以使用的內置對象

19.JSP九大內置對象

  • out對象
比如out對象:
<%
    int[] value = {1, 2, 3};
    for (int i : value) {
        out.print(i);
    }
%>
  • request對象
  • response對象
  • session對象
  • application對象
  • Page峡眶、pageContext、exception植锉、application對象

20. Web程序的請求響應模式

  • 用戶發(fā)送請求(request)
  • 服務器給用戶響應(response)
登錄:
輸入賬號和密碼辫樱,登錄:相當于請求
服務器接收賬號和密碼后判斷是否合法,跳轉到響應頁面:相當于reponse

21. 什么是緩沖區(qū)

  • 緩沖區(qū):Butter俊庇,所謂緩沖區(qū)就是內存的一塊區(qū)域狮暑,用來保存臨時數據。
一鍋米飯一粒一粒吃——米飯一碗一碗吃——這個碗就是緩沖區(qū)

22. out對象

  • out對象是JspWriter類的實例辉饱,是向客戶端輸出內容常用的對象搬男。
1. void println 向客戶端打印字符串
2. void clear 清除換成從去的內容,如果在flust之后調用會拋出異常
3. void clearBuffer();清除緩沖區(qū)的內容彭沼,如果在flush之后調用不會拋出異常
4. void flush() 將緩沖區(qū)內容輸出到客戶端
5. int getBufferSize() 返回緩沖區(qū)以字節(jié)數的大小缔逛,如不設緩沖區(qū)則為0
6. int getRemaining()返回緩沖區(qū)還剩余多少可用
7. boolean isAutoFulsh() 返回緩沖區(qū)滿時,時自動清空還是拋出異常
8. void close() 關閉輸出流
<%
    int[] value = {1, 2, 3};
    for (int i : value) {
        out.print(i);
    }
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>

緩沖區(qū)大小:8192byte
緩沖區(qū)剩余大小:8101byte
是否自動清空緩沖區(qū):true
<%
    out.println("<h2>靜夜思</h2>");
    out.println("窗前明月光<br>");
    out.println("疑是地上霜<br>");
    out.println("舉頭望明月<br>");
    out.println("低頭思故鄉(xiāng)<br>");
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>
靜夜思
窗前明月光
疑是地上霜
舉頭望明月
低頭思故鄉(xiāng)
緩沖區(qū)大小:8192byte
緩沖區(qū)剩余大小:8046byte
是否自動清空緩沖區(qū):true
<%
    out.println("<h2>靜夜思</h2>");
    out.println("窗前明月光<br>");
    out.println("疑是地上霜<br>");
    out.flush();
    out.println("舉頭望明月<br>");
    out.println("低頭思故鄉(xiāng)<br>");
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>
靜夜思
窗前明月光
疑是地上霜
舉頭望明月
低頭思故鄉(xiāng)
緩沖區(qū)大小:8192byte
緩沖區(qū)剩余大小:8142byte
是否自動清空緩沖區(qū):true

說明:因為執(zhí)行了flush姓惑,所以緩沖區(qū)變大了
<%
    out.println("<h2>靜夜思</h2>");
    out.println("窗前明月光<br>");
    out.println("疑是地上霜<br>");
    out.flush();
    out.clear();
    out.println("舉頭望明月<br>");
    out.println("低頭思故鄉(xiāng)<br>");
%>
緩沖區(qū)大小:<%=out.getBufferSize()%>byte<br>
緩沖區(qū)剩余大小:<%=out.getRemaining()%>byte<br>
是否自動清空緩沖區(qū):<%=out.isAutoFlush()%><br>
靜夜思
窗前明月光
疑是地上霜

說明:out.clear()不能在out.flush()之后調用否則會拋出異常褐奴,后面的代碼不會執(zhí)行,但是out.clearBuffer()不會拋出異常于毙。

23. 表單提交方式get和post的區(qū)別

表單提交方式get和post的區(qū)別.png

24. request對象(上)

  • 客戶端的請求信息被封裝在request對象中敦冬,通過它我們可以獲取用戶輸入的信息。
  • request對象是HttpServletRequest類的實例唯沮。
  • request對象具有請求域脖旱,即完成客戶端的請求之前,該對象一直有效烂翰。
1. String getParameter(String name):返回name指定參數的參數值(返回單個值)
2. String[] getParameterValues(String name):返回包含參數name的所有值的數組(返回集合)
3. void setAttribute(String夯缺,Object):存儲此請求中的屬性。
4. object getAttribute(String name):返回指定屬性的屬性值甘耿。
5. String getContentType():得到請求體的MIME類型
6. String getProtocol():返回請求用的協(xié)議類型和版本號
7. String getSeverName():返回接受請求的服務器主機名
  • 示例:通過表單傳遞參數:
index.jsp文件:

<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: fukq
  Date: 2018/3/7
  Time: 14:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<HTML>

<head>
    <title>我的個人主頁</title>
</head>

<body>
<h1>用戶注冊</h1>
<form name="reqForm" action="request.jsp" method="post">
    <table>
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username"/></td>
        </tr>
        <tr>
            <td>愛好:</td>
            <td>
                <input type="checkbox" name="favorite" value="read">讀書
                <input type="checkbox" name="favorite" value="music">音樂
                <input type="checkbox" name="favorite" value="movie">電影
                <input type="checkbox" name="favorite" value="internet">上網
            </td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit" value="提交"/></td>
        </tr>
    </table>
</form>
</body>

</HTML>
request.jsp文件:

<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: fukq
  Date: 2018/3/7
  Time: 14:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

<HTML>

<head>
    <title>我的個人主頁</title>
</head>

<body>
<h1>request內置對象</h1>
用戶名:
<%=request.getParameter("username")%><br>
愛好:
<%
    String[] favorites = request.getParameterValues("favorite");
    if (favorites != null) {
        for (int i = 0; i < favorites.length; i++) {
            out.println(favorites[i] + "&nbsp;&nbsp;");
        }
    }
%>
</body>

</HTML>
request內置對象
用戶名: ?????ˉ??o
愛好: read   music   movie   internet  
獲取表單數據出現中文亂碼的解決辦法是在體交表單的時候:
<%
    request.setCharacterEncoding("utf-8");
%>
request內置對象
用戶名: 付凱強
愛好: read   music  
  • 通過URL傳遞參數:
<a href="request.jsp?username= lisi">測試URL傳遞參數</a>
用戶名: lisi
<a href="request.jsp?username= 中文">測試URL傳遞參數</a>
用戶名: ??-???
但是通過request設置參數無法解決URL傳遞中文出現的亂碼問題
但是通過配置Tomcat服務器里面conf-server.xml文件可以解決
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="utf-8"/>

25. request對象(下)

  • setAttribute和getAttribute
<%
    request.setCharacterEncoding("utf-8");
    request.setAttribute("password","123456");
%>
密碼:<%=request.getAttribute("password")%>
密碼:<%=request.getAttribute("password")%> <br>
請求的MIME類型:<%=request.getContentType()%><br>
協(xié)議類型及版本號:<%=request.getProtocol()%><br>
服務器主機名:<%=request.getServerName()%><br>
服務器端口號:<%=request.getServerPort()%><br>
請求文件的長度:<%=request.getContentLength()%><br>
請求文件的ip地址:<%=request.getRemoteAddr()%><br>
請求的真實路徑:<%=request.getRealPath("request.jsp")%><br>
請求的上下文路徑:<%=request.getContextPath()%><br>
request內置對象
用戶名: 您好好
愛好: music   movie   internet   密碼:123456 
請求的MIME類型:application/x-www-form-urlencoded
協(xié)議類型及版本號:HTTP/1.1
服務器主機名:localhost
服務器端口號:8888
請求文件的長度:84
請求文件的ip地址:127.0.0.1
請求的真實路徑:G:\javaSpace\webDemo\out\artifacts\firstweb_war_exploded\request.jsp
請求的上下文路徑:/fkq

26. response對象簡介

  • response對象包含了響應客戶請求的有關信息踊兜,但是JSP中很少直接用到它。
  • 它是HttpServletResponse類的實例佳恬。
  • response對象具有頁面作用域捏境,即訪問一個頁面時,該頁面內的response對象只能對這次訪問有效毁葱,其他頁面的response對象對當前頁面無效垫言。

27. response對象常用方法如下:

  • String getCharacterEncoding()返回響應用的是何種字符編碼
  • void setContentType(String Type)設置響應的MIME類型
  • PrintWriter getWriter() 返回可以向客戶端輸出字符的一個對象(也稱為輸出流對象)(注意比較:PrintWriter與內置out對象的區(qū)別)
  • sendRedirect(java.lang.String.location)重新定向客戶端的請求
<%@ page import="java.util.List" %>
<%@ page import="java.io.PrintWriter" %><%--
  Created by IntelliJ IDEA.
  User: fukq
  Date: 2018/3/7
  Time: 14:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    response.setContentType("text/html;charset=UTF-8"); //設置響應的MIMI類型

    out.println("<h1>reponse對象</h1>");
    out.println("<hr>");

    PrintWriter outer  = response.getWriter();
    outer.println("大家好,我是response對象生成的輸出流outer對象");
%>
PrintWriter對象總是提前于內置的out對象打印
<%@ page import="java.util.List" %>
<%@ page import="java.io.PrintWriter" %><%--
  Created by IntelliJ IDEA.
  User: fukq
  Date: 2018/3/7
  Time: 14:47
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
    response.setContentType("text/html;charset=UTF-8"); //設置響應的MIMI類型

    out.println("<h1>reponse對象</h1>");
    out.println("<hr>");
    out.flush();
    PrintWriter outer  = response.getWriter();
    outer.println("大家好倾剿,我是response對象生成的輸出流outer對象");
%>
out.flush();刷新緩沖區(qū)筷频,刷新的時候會把數據刷新到瀏覽器上蚌成。
<%
    response.setContentType("text/html;charset=UTF-8"); //設置響應的MIMI類型

    out.println("<h1>reponse對象</h1>");
    out.println("<hr>");

    PrintWriter outer  = response.getWriter(); //獲得輸出流對象
    outer.println("大家好,我是response對象生成的輸出流outer對象");

    response.sendRedirect("index.jsp"); //請求重定向
%>

28. 請求重定向與請求轉發(fā)

  • 請求重定向:客戶端行為凛捏,response.sendRedirect(),從本質上講等同于兩次請求担忧,前一次的請求對象不會保存,地址欄的URL地址會改變坯癣。
  • 請求轉發(fā):服務器行為瓶盛,request.getRequestDispatcher().forward(req,resp);是一次請求,轉發(fā)后請求對象會保存示罗,地址藍的URL地址不會改變惩猫。

29. session簡介

  • session表示客戶端與服務器的一次會話
  • Web中的session指的是用戶在瀏覽某個網站時,從進入網站到瀏覽器關閉這個網頁所經過的這段時間蚜点,也就是用戶瀏覽這個網站所花費的時間
  • 從上述定義中可以看到轧房,session實際上時一個特定的時間概念
  • session的中文意思就是一段時間
  • 在服務器的內存中保存著不同用戶的session。

30. session詳細介紹

  • session對象是一個JSP內置對象绍绘。
  • session對象在第一個JSP頁面被裝載時自動創(chuàng)建锯厢,完成會話期管理。
  • 從一個客戶打開瀏覽器并連接到服務器開始脯倒,到客戶關閉瀏覽器離開這個服務器結束,被稱為一個會話捺氢。
  • 當一個客戶打開瀏覽器并連接到服務器開始藻丢,到客戶關閉瀏覽器離開這個服務器結束被成為一個會話。
  • 當一個客戶訪問一個服務器時摄乒,可能會在服務器的幾個頁面之間切換悠反,服務器應當通過某種辦法知道這是一個客戶,就需要session對象馍佑。
  • session對象是HttpSession類的實例斋否。

31. session常用方法

  • long getCreationTime():返回session創(chuàng)建時間
Session創(chuàng)建時間:<%=session.getCreationTime()%><br>
Session創(chuàng)建時間:1520565423914
<%!
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
%>
Session創(chuàng)建時間:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
Session創(chuàng)建時間:2018年03月09日 11:17:03
  • public String getId():返回session創(chuàng)建時JSP引擎為它設的唯一ID號
  • public Object setAttribute(String name,Object value):使用指定名稱將對象綁定到此會話
session.setAttribute("username","admin");
  • public Object getAttribute(String name):返回此會話中的指定名稱綁定在一起的對象拭荤,如果沒有對象綁定在該名稱下茵臭,則返回null
從Session中獲取用戶名:<%=session.getAttribute("username")%>
從Session中獲取用戶名:admin
session_page1: 

<%!
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
%>
<%
    session.setAttribute("username", "admin");
%>
Session創(chuàng)建時間:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
Session的ID編號:<%=session.getId()%><br>
從Session中獲取用戶名:<%=session.getAttribute("username")%>

<a href="session_page2.jsp" target="_blank">跳轉到Session_page2.jsp</a>
session_page2:

<body>
<h1>session內置對象</h1>
<hr>
Session的ID編號:<%=session.getId()%><br>
從Session中獲取用戶名:<%=session.getAttribute("username")%>
</body>
session_page1: 

Session的ID編號:866631F646E26184FB1F4FCC3AAB4AE6
session_page2:

Session的ID編號:866631F646E26184FB1F4FCC3AAB4AE6
從Session中獲取用戶名:admin

page1跳轉到page2,id編號一致舅世;只有關閉相關的兩個頁面旦委,才表示會話結束。
  • String[] getValueNames():返回一個包含此SESSION中所有可用屬性的數組
<%
    session.setAttribute("username", "admin");
    session.setAttribute("password","123456");
    session.setAttribute("age","5");
%>
Session中保存的屬性有:
<%
    String[] names = session.getValueNames();
    for (int i = 0; i < names.length; i++) {
        out.println(names[i] + "&nbsp;&nbsp;");
    }
%>
Session的ID編號:9E503181AE514CD3C56EDD9289DCE286
從Session中獲取用戶名:admin Session中保存的屬性有: password   age   username  
  • int setMaxInactiveInterval():設置兩次請求間隔多長時間此SESSION被取消(單位秒)
session.setMaxInactiveInterval(10);

32. session的生命周期

  • 訪問階段: 當客戶但第一次訪問某個jsp或者Servlet的時候雏亚,服務器會為當前會話創(chuàng)建一個SessionId缨硝,每次客戶端向服務端發(fā)送請求時,都會將此SessionId攜帶過去罢低,服務器端會對此SessionId及進行校驗查辩。

  • 會話階段:

    1. 以下情況屬于同一個會話:

      1. 某次會話當中通過超鏈接打開的新頁面屬于同一次會話。
      2. 只要當前會話頁面沒有全部關閉,重新打開新的瀏覽器窗口訪問同一項目資源時屬于同一次會話宜岛。
      3. 除非本次會話的所有頁面都關閉后再重新訪問某個Jsp或者Servlet將會創(chuàng)建新的會話长踊。
    2. 注意事項: 注意原有會話還存在,只是這個舊的SessionId仍然存在與服務端谬返,只不過再也沒有客戶端會攜帶它然后交予服務端校驗之斯。

  • 銷毀階段:
    Session的銷毀只有三種方式:
    1. 調用了session.invalidate()方法
    2. Session過期(超時)
    3. 服務器重新啟動

33. Session對象的超時

  • Tomcat默認session超時時間為30分鐘。
  • 設置session超時有兩種方式:
    1. session.setMaxInactiveInterval(時間)://單位是秒
    2. 在web.xml配置
<session-config>
<session-timeout>
10
</session-timeout>
</session-config> //單位是分

34. application對象

  • application對象實現了用戶間數據的共享遣铝,可存放全局變量佑刷。
  • application開始于服務器的啟動,終止與服務器的關閉酿炸。
  • 在用戶的前后連接或不同用戶之間的連接中瘫絮,可以對application對象的同一屬性進行操作。
  • 在任何地方對application對象屬性的操作填硕,都將影響到其他用戶對此的訪問麦萤。
  • 服務器的啟動和關閉決定了application對象的生命。
  • application對象是ServletContext類的實例扁眯。

35. application對象的常用方法

  • public void setAttribute(String name壮莹,Object value):使用指定名稱將對象綁定到此對話。
  • public Object getAttribute(String name)返回與此會話中的指定名稱綁定在一起的對象姻檀,如果沒有對象綁定在該名稱下命满,則返回null。
  • Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
  • String getServerInfo() 返回JSP(SERVLET)引擎名及版本號
<%
    application.setAttribute("username", "fukq");
    application.setAttribute("age", "123");
    application.setAttribute("sex", "男");
%>
名字是:<%=application.getAttribute("username")%>
application中的屬性有:
<%
    Enumeration enumeration = application.getAttributeNames();
    while (enumeration.hasMoreElements()) {
        out.println(enumeration.nextElement() + "&nbsp;&nbsp");
    }
%><br>
JSP(SERVLET)引擎名及版本號:    <%=application.getServerInfo()%><br>
名字是:fukq 
application中的屬性有: javax.servlet.context.tempdir   org.apache.catalina.resources   org.apache.tomcat.util.scan.MergedWebXml   org.apache.tomcat.InstanceManager   sex   org.apache.catalina.jsp_classpath   org.apache.jasper.compiler.ELInterpreter   org.apache.jasper.compiler.TldLocationsCache   org.apache.tomcat.JarScanner   javax.websocket.server.ServerContainer   age   org.apache.jasper.runtime.JspApplicationContextImpl   username   
JSP(SERVLET)引擎名及版本號Apache Tomcat/7.0.85

36. page對象

page對象.png

page對象的常用方法與object對象的常用方法是基本一致的:

  • 舉例:
當前page頁面對象的字符串描述:   <%=page.toString()%>
當前page頁面對象的字符串描述: org.apache.jsp.page_jsp@7c5d9ae
toString 打印的實際是對象的hashcode值

37. pageContext對象

  • pageContext對象提供了對JSP頁面內所有得對象及名字空間得訪問绣版。
  • pageContext對象可以訪問到本頁所在得session胶台,也可以取本頁面所在的application的某一個屬性值。
  • pageContext對象相當于頁面中所有功能的集大成者杂抽。
  • pageContext對象的本類名也叫pageContext诈唬。

38. pageContext對象常用方法

  • JspWriter getOut():返回當前客戶端響應被使用的JspWriter流(out)
  • HttpSession getSession():返回當前頁中的HttpSession對象(session)
  • Object getPage()返回當前頁的Object對象(page)
  • ServletRequest getRequest()返回當前頁的ServletRequest對象(request)
  • ServletResponse getResponse()返回當前頁的ServletResponse對象(response)
  • void setAttribute(String name,Object attribute)設置屬性及屬性值
  • Object getAttribute(String name缩麸,int scope)在指定范圍內取屬性的值
  • int getAttributeScope(String name)返回某屬性的作用范圍
  • void forward(String relativeUrlPath)使當前頁面重導到另一頁面
  • void include(String relativeUrlPath)在當前位置包含另一文件
    session.setAttribute("username", "admin");
    session.setAttribute("password", "123456");
    session.setAttribute("age", "5");
用戶名是:<%=pageContext.getSession().getAttribute("username")%><br>
用戶名是:admin
//包含這個頁面
    pageContext.include("index.jsp");
//跳轉到其他頁面
//    pageContext.forward("index.jsp");

39. Config對象

  • 簡介:config對象是在一個Servlet初始化時铸磅,Jsp引擎向它傳遞信息用的,此信息包括Servlet初始化時所要用到的參數(通過屬性名和屬性值構成)以及服務器的有關信息(通過傳遞一個ServetConext對象)匙睹。
  • 常用方法:
    1. ServletContext getServletContext 返回含有服務器相關信息的ServletContext對象
    2. String getInitParameter(String name)返回初始化參數的值
    3. Enumeration getInitParameterNames()返回Servlet初始化所需所有參數的枚舉

40. exception對象

  • exception對象時一個異常對象愚屁,當一個頁面在運行過程中發(fā)生了異常,就產生這個對象痕檬。如果一個JSP頁面要應用此對象霎槐,就必須把isErrorPage設為true,否則無法編譯梦谜。它實際上時java.lang.Throwable的對象丘跌。

41. exception常用方法

  • String getMessage()返回描述異常的消息
  • String toString()返回關于異常的簡短描述信息
  • void printStackTrace()顯示異常及其棧軌跡
  • Throwable FillInStackTrace 重寫異常的執(zhí)行棧軌跡
errorPage="exception.jsp"

<% System.out.print(1 / 0);%>
 isErrorPage="true"
 
 異常的消息是: <%=exception.getMessage()%> <br>
異常的字符串描述是:<%=exception.toString()%><br>

42. 用戶登錄小栗子

  • 用戶名admin袭景,密碼admin,登錄成功使用服務器內部轉發(fā)到login_success.jsp頁面闭树,并且提示登錄成功的用戶名耸棒。如果登錄失敗則請求重定向到login_failure.jsp頁面。
login.jsp頁面:

<h1>登錄小案例</h1>
<form action="dologin.jsp" method="post">
    <p class="main">
        <label>用戶名: </label>
        <input name="username" value=""/>
        <label>密碼: </label>
        <input type="password" name="password" value="">
    </p>
    <p class="space">
        <input type="submit" value="登錄"/>
    </p>
</form>
dologin.jsp頁面
<%
    String username = "";
    String password = "";
    request.setCharacterEncoding("utf-8"); //防止中文亂碼

    username = request.getParameter("username");
    password = request.getParameter("password");

    //如果用戶和密碼都等于admin,則登錄成功
    if ("admin".equals(username) && "admin".equals(password)) {
        session.setAttribute("loginUser", username);
        request.getRequestDispatcher("login_success.jsp").forward(request, response);
    } else {
        response.sendRedirect("login_failure.jsp");
    }
%>
login_success頁面
    <%
        String loginUser = "";
        if (session.getAttribute("loginUser") != null) {
            loginUser = session.getAttribute("loginUser").toString();
        }
    %>

login_failure頁面
    歡迎<%=loginUser%>登錄成功!
<div>登錄失敗,請檢查用戶名或密碼<br>
    <a href="login.jsp">返回登錄</a>
</div>

43. Javabean簡介

  • javabean就是符合某種特定規(guī)范的java類.
  • 使用javabean可以減少代碼冗余,功能區(qū)分明確,提高了代碼的維護性.

44. Javabean設計原則

  • 公有類
  • 無參的公有構造方法
  • 屬性私有
  • 提供geter和setter方法

45. Jsp動作元素

  • 動作元素為請求處理階段提供信息.
  • 遵循XML元素的語法:有一個包含元素名的開始標簽,可以有屬性\可選的內容\與開始標簽匹配的結束標簽.

46. Jsp動作分類

  • 第一類:與存取JavaBean有關的:
<jsp:useBean><jsp:setProperty><jsp:getProperty>
  • 第二類:JSP1.2就開始有的基本元素,包括6個動作元素
<jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:params><jsp:fallback>
  • 第三類:JSP2.0新增加的元素,主要與JSP Document有關,包括6個元素
<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>
  • 第四類:JSP2.0新增的動作元素,主要是用來動態(tài)生成XML元素標簽的值,包括3個動作
<jsp:attribute><jsp:body><jsp:element>
  • 第五類:JSP2.0新增的動作元素,主要是用在Tag FIle中,有2個元素
<jsp:invoke><jsp:dobody>

47. 普通方式創(chuàng)建JavaBean

<%@ page import="com.test.User" %> 
<%
    User user = new User();
    user.setmUserName("admin"); //設置用戶名
    user.setmPassword("123456");//設置密碼
%>
賬戶名是: <%=user.getmUserName()%>
密碼是:<%=user.getmPassword()%>

48. Jsp頁面中使用jsp動作標簽使用javabean

  • jsp:useBeans : 在jsp頁面中實例化或者在指定范圍內使用javabean
<jsp:userBean id="標識符" class = "java類名" scope = "作用范圍"/>
<jsp:useBean id="myUser" class="com.test.User" scope="page"></jsp:useBean>
<h1>使用javabean動作創(chuàng)建javabean實例</h1>
賬戶名是: <%=myUser.getmUserName()%>
密碼是:<%=myUser.getmPassword()%>
賬戶名是: null 密碼是:null
  • jsp:setProperty:給已經實例化的javabean對象的屬性賦值,一共有四種形式
<jsp:setProperty name ="javaBean實例名" property = "*"/>(跟表單關聯(lián))
<jsp:setProperty name = "javabean實例名" property = "javabean屬性名"/>(跟表單關聯(lián))
<jsp:setProperty name = "javabean實例名" property = "javabean屬性名" value = "beanvalue"/>(手工設置)
<jsp:setProperty name = "javabean實例名" property = "propertyName" param = "request對象中的參數名"/>(跟request參數關聯(lián))
第一種:備注:根據表單自動匹配所有的屬性

<html>
<head>
    <title></title>
</head>
<body>
<h1>系統(tǒng)登錄</h1>
<hr>
<form name="loginForm" action="dologin.jsp" method="post">
    <table>
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username" value=""/></td>
        </tr>
        <tr>
            <td>密碼:</td>
            <td><input type="password" name="password" value=""></td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="登錄"></td>
            <td></td>
        </tr>
    </table>
</form>
</body>
</html>

<html>
<head>
    <title>我的個人主頁</title>
</head>
<body>
<jsp:useBean id="myUsers" class="com.test.User" scope="page"/>
<h1>setProperty動作元素</h1>
<hr>

<jsp:setProperty name="myUsers" property="*"></jsp:setProperty>
用戶名:<%=myUsers.getUsername()%><br>
密碼:<%=myUsers.getPassword()%>
</body>
</html>

用戶名:fukaiqiang
密碼:123456
第二種:備注:根據表單匹配部分的屬性

<jsp:setProperty name="myUsers" property="username"></jsp:setProperty>

用戶名:fukaiqiang
密碼:null
第三種:備注:和表單無關,通過手工賦值給屬性

<jsp:setProperty name="myUsers" property="username" value="Lisi"></jsp:setProperty>
<jsp:setProperty name="myUsers" property="password" value="654321"></jsp:setProperty>

用戶名:Lisi
密碼:654321
第四種:通過Url傳參數給屬性賦值

<jsp:setProperty name="myUsers" property="username"></jsp:setProperty>
<jsp:setProperty name="myUsers" property="password" param="myPass"></jsp:setProperty>
用戶名:<%=myUsers.getUsername()%><br>
密碼:<%=myUsers.getPassword()%>

<form name="loginForm" action="dologin.jsp?myPass=789456123 " method="post">

用戶名:fukaiqiang
密碼:789456123
  • jsp:getProperty
<!--使用傳統(tǒng)的表達式方式來獲取用戶名和密碼-->
用戶名:<%=myUsers.getUsername()%><br>
密碼:<%=myUsers.getPassword()%>
<!--使用getProperty方式來獲取用戶名和密碼-->
用戶名:<jsp:getProperty name="myUsers" property="username"></jsp:getProperty>
用戶名:<jsp:getProperty name="myUsers" property="password"></jsp:getProperty>

49. Javabean四個作用域范圍

  • 使用usebeans的scope屬性可以用來指定javabean的作用范圍.
 1. page:盡在當前頁面有效.
 2. request:可以用過HttpRequest.getAttribute()方法取得javabean對象.
 3. session:可以通過HttpSession.getAttribute()方法取得javabean對象.
 4.application:可以通過applicaion.getAttribute()方法取得javabean對象.
  • application:
<h1>javabean的四個作用域范圍</h1>
<hr>
<jsp:useBean id="myUsers" class="com.test.User" scope="application"/>
用戶名:
<jsp:getProperty name="myUsers" property="username"/>
<br>
密碼:
<jsp:getProperty name="myUsers" property="password"/>
<br>
<!--使用內置對象獲取用戶名和密碼-->
<hr>
用戶名:<%=((User) application.getAttribute("myUsers")).getUsername()%><br>
密碼:<%=((User) application.getAttribute("myUsers")).getPassword()%>
  • session:
用戶名:<%=((User) session.getAttribute("myUsers")).getUsername()%><br>
密碼:<%=((User) session.getAttribute("myUsers")).getPassword()%>
  • request:
<jsp:useBean id="myUsers" class="com.test.User" scope="request"/>
<%
 request.getRequestDispatcher("testscope.jsp").forward(request,response);
%>
用戶名:<%=((User) request.getAttribute("myUsers")).getUsername()%><br>
密碼:<%=((User) request.getAttribute("myUsers")).getPassword()%>
  • page:
<jsp:useBean id="myUsers" class="com.test.User" scope="page"/>

<%
    String username = "";
    String password = "";
    if (pageContext.getAttribute("myUsers") != null) {
        username = ((User) pageContext.getAttribute("myUsers")).getUsername();
        password = ((User) pageContext.getAttribute("myUsers")).getPassword();
    }
%>
用戶名:<%=username%>
密碼:<%=password%>

50. Model1簡介

  • Model1模型出現前,整個Web應用的情況:幾乎全部由Jsp頁面組成,Jsp頁面接受處理客戶端的請求,對請求處理后直接做出響應.
  • 弊端:在界面層充斥著大量的業(yè)務邏輯的代碼和數據訪問層的代碼,Web程序的可擴展性和可維護性非常差.
  • Javabean的出現可以使jsp頁面中使用javabean封裝的數據或者調用javabean的業(yè)務邏輯代碼,這樣大大提升了程序的可維護性.
  • Model1模型:Jsp:頁面;JavaBean:邏輯;javabean:數據:


    Model1簡介.png

51. jsp+javabean完成用戶登錄功能

login: 
<form name="loginForm" action="dologin.jsp" method="post">
    <table>
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username" value=""/></td>
        </tr>
        <tr>
            <td>密碼:</td>
            <td><input type="password" name="password" value=""></td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="登錄"></td>
            <td></td>
        </tr>
    </table>
</form>
dologin:
<jsp:useBean id="loginUser" class="com.test.User" scope="page"/>
<jsp:useBean id="userdao" class="com.test.UserDao" scope="page"/>
<jsp:setProperty name="loginUser" property="*"/>
<%
    //如果用戶和密碼都等于admin,則登錄成功
    if (UserDao.userLogin(loginUser)) {
        session.setAttribute("loginUser", loginUser.getUsername());
        request.getRequestDispatcher("login_success.jsp").forward(request, response);
    } else {
        response.sendRedirect("login_failure.jsp");
    }
%>

<html>
<head>
    <title>Title</title>
</head>
<body>
    我是登錄失敗頁面
</body>
</html>

<html>
<head>
    <title>Title</title>
</head>
<body>
    我是成功登錄頁面
</body>
</html>

52. http協(xié)議的無狀態(tài)性

  • 無狀態(tài)是指:當瀏覽器發(fā)送請求給服務器的時候,服務器響應客戶端請求.但是當同一個瀏覽器再次發(fā)送請求給服務器的時候,服務器并不知道它是剛才那個瀏覽器.簡單地說:就是服務器不會去記得你,所以就是無狀態(tài)協(xié)議.

53. Cookie概述

  • 保存用戶的狀態(tài)的兩大機制
    1. Session
    2. Cookie
  • Cookie是web服務器保存在客戶端的一些列文本信息.
  • 典型應用一:判定注冊用戶是否已經登錄網站.
  • 典型應用二:"購物車"的處理.

54. Cookie的作用

  • 對特定對象的追蹤.
  • 保存用戶網頁瀏覽記錄與習慣
  • 簡化登錄

55. Jsp頁面中創(chuàng)建與使用Cookie

  • 創(chuàng)建Cookie對象
Cookie newCookie = new Cookie(String key,Object value);
  • 寫入Cookie對象
response.addCookie(new Cookie);
  • 讀取Cookie對象
Cookie[] cookies = request.getCookies();
  • 與Cookie有關的常用方法
1. void setMaxAge(int expiry):設置cookie的有效期,以秒為單位.
2. void setValue(String value):在cookie創(chuàng)建后,對cookie進行賦值.
3. String getName():獲取cookie的名稱.
4. String getValue():獲取cookie的值.
5. int getMaxAge():獲取cookie的有效時間,以秒為單位.

56. Cookie在登錄中的應用

  • 實現記憶用戶名和密碼功能
login.jsp

<body>

<%
    request.setCharacterEncoding("utf-8");
    String username = "";
    String password = "";
    Cookie[] cookies = request.getCookies();
    if (cookies != null && cookies.length > 0) {
        for (Cookie c : cookies) {
            if (c.getName().equals("username")) {
                username = URLDecoder.decode(c.getValue(), "utf-8");
            }
            if (c.getName().equals("password")) {
                password = URLDecoder.decode(c.getValue(), "utf-8");
            }
        }
    }
%>
<form name="loginForm" action="dologin.jsp" method="post">
    <table>
        <tr>
            <td>用戶名:</td>
            <td><input type="text" name="username" value="<%=username%>"/></td>
        </tr>
        <tr>
            <td>密碼:</td>
            <td><input type="password" name="password" value="<%=password%>"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天內記住我的登錄狀態(tài)</td>
        </tr>
        <tr>
            <td colspan="2" align="center"><input type="submit" value="登錄"/><input type="reset" value="取消"/></td>
        </tr>
    </table>
</form>
dologin.jsp

<body>

<%
    request.setCharacterEncoding("utf-8");
    //首先判斷用戶是否選擇了記住登錄狀態(tài)
    String[] isUseCookies = request.getParameterValues("isUseCookie");
    if (isUseCookies != null && isUseCookies.length > 0) {
        //把用戶名和密碼保存在Cookie對象里面
        String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
        //使用URLEncoder解決無法在Cookie當中保存中文字符串問題
        String password = URLEncoder.encode(request.getParameter("password"), "utf-8");

        Cookie usernameCookie = new Cookie("username", username);
        Cookie passwordCookie = new Cookie("password", password);
        usernameCookie.setMaxAge(864000);
        passwordCookie.setMaxAge(864000);//設置最大生存期限為10天
        response.addCookie(usernameCookie);
        response.addCookie(passwordCookie);
    } else {
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                if (c.getName().equals("username") || c.getName().equals("password")) {
                    c.setMaxAge(0); //設置Cookie失效
                    response.addCookie(c); //重新保存报辱。
                }
            }
        }
    }
%>
<a href="user.jsp" target="_blank">查看用戶信息</a>
</body>
user.jsp

<body>
<h1>用戶信息</h1>
<%
    request.setCharacterEncoding("utf-8");
    String username="";
    String password = "";
    Cookie[] cookies = request.getCookies();
    if(cookies!=null&&cookies.length>0) {
        for(Cookie c:cookies) {
            if(c.getName().equals("username")) {
                username = URLDecoder.decode(c.getValue(),"utf-8");
            }
            if(c.getName().equals("password")) {
                password = URLDecoder.decode(c.getValue(),"utf-8");
            }
        }
    }
%>
<br>
用戶名:<%=username %><br>
密碼:<%=password %><br>
</body>
解決Cookie中文亂碼的問題:
1. request.setCharacterEncoding("utf-8");
2. URLEncoder 編碼
3. URLDecoder 解碼

57. Session與Cookie的對比

  • session
    1. 在服務器端保存用戶信息
    2. session中保存的是Object類
    3. 隨會話的結束而將其存儲的數據銷毀
    4. 保存重要的信息
    5. 保存對象的大小沒有限制
  • cookie
    1. 在客戶端保存用戶信息
    2. cookie保存的是String類型
    3. cookie可以長期保存在客戶端
    4. 保存不重要的用戶信息
    5. 保存對象的大小有限制

58. include指令

<%@ include file = "URL"%>
<%@ include file = "date.jsp"%>

59. include動作

<jsp:include page = "URL" flush = "true|false"/>
page:要包含的頁面
flush:被包含的頁面是否從緩沖區(qū)讀取

60. include指令與include動作的區(qū)別

指令與動作.png

61. forward動作

<jsp:forward page="user.jsp"></jsp:forward>
相當于轉發(fā):
request.getRequestDispatcher("user.jsp").forward(request,response);

62. param動作

jsp:param :用于增加一個參數
<jsp:forward page="user.jsp">
    <jsp:param name="email" value="123@163.com"></jsp:param>
</jsp:forward>
jsp:param :用于修改一個參數的參數值
<jsp:forward page="user.jsp">
    <jsp:param name="password" value="88888"></jsp:param>
</jsp:forward>

63. 支持

希望閱讀本篇能夠讓你對Jsp有更全面的理解,還請多多支持,多多關注,多多點贊,多多收藏.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末与殃,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子碍现,更是在濱河造成了極大的恐慌幅疼,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件昼接,死亡現場離奇詭異爽篷,居然都是意外死亡,警方通過查閱死者的電腦和手機慢睡,發(fā)現死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門逐工,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人漂辐,你說我怎么就攤上這事泪喊。” “怎么了髓涯?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵窘俺,是天一觀的道長。 經常有香客問我复凳,道長,這世上最難降的妖魔是什么灶泵? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任育八,我火速辦了婚禮,結果婚禮上赦邻,老公的妹妹穿的比我還像新娘髓棋。我一直安慰自己侠草,他們只是感情好隧期,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著终蒂,像睡著了一般恬吕。 火紅的嫁衣襯著肌膚如雪签则。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天铐料,我揣著相機與錄音渐裂,去河邊找鬼豺旬。 笑死,一個胖子當著我的面吹牛柒凉,可吹牛的內容都是我干的族阅。 我是一名探鬼主播,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼膝捞,長吁一口氣:“原來是場噩夢啊……” “哼坦刀!你這毒婦竟也來了?” 一聲冷哼從身側響起蔬咬,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鲤遥,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后计盒,有當地人在樹林里發(fā)現了一具尸體渴频,經...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年北启,在試婚紗的時候發(fā)現自己被綠了卜朗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡咕村,死狀恐怖场钉,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情懈涛,我是刑警寧澤逛万,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站批钠,受9級特大地震影響宇植,放射性物質發(fā)生泄漏。R本人自食惡果不足惜埋心,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一指郁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧拷呆,春花似錦闲坎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至项秉,卻和暖如春绣溜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背娄蔼。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工涮毫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞬欧,地道東北人。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓罢防,卻偏偏與公主長得像艘虎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咒吐,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法野建,類相關的語法,內部類的語法恬叹,繼承相關的語法候生,異常的語法,線程的語...
    子非魚_t_閱讀 31,602評論 18 399
  • JSP(Java Server Pages)绽昼,其根本是一個簡化的 Servlet 設計唯鸭,實現了在 Java 當中使...
    靜候那一米陽光閱讀 465評論 0 1
  • 一、jsp定義及作用 JSP技術使用Java編程語言編寫類XML的tags和scriptlets硅确,來封裝產生動態(tài)網...
    yzw12138閱讀 1,228評論 0 0
  • 注意: 本文主要介紹了AngularJS中$scope的作用與生命周期,包括在DOM中添加controller對象...
    LabRaDor2079閱讀 396評論 0 1
  • 只分享一首詩目溉,取自周夢蝶的第一本詩集《孤獨國》。 今夜靜心讀詩菱农,不作感受缭付。 《讓》讓軟香輕紅嫁與春水讓蝴蝶死吻夏日...
    799c93c9a673閱讀 276評論 0 0