JSP

JSP(Java Server Pages),其根本是一個(gè)簡化的 Servlet 設(shè)計(jì),實(shí)現(xiàn)了在 Java 當(dāng)中使用 HTML 標(biāo)簽。JSP 是一種動(dòng)態(tài)網(wǎng)頁技術(shù)標(biāo)準(zhǔn),也是Java EE的標(biāo)準(zhǔn)。JSP與Servlet一樣,是在服務(wù)器端執(zhí)行的。

常見動(dòng)態(tài)網(wǎng)站開發(fā)技術(shù)對(duì)比

  • JSP:Java平臺(tái),安全性高,適合開發(fā)大型的,企業(yè)級(jí)的Web應(yīng)用程序。
  • Asp.net:.Net平臺(tái),簡單易學(xué)。但是安全性以及跨平臺(tái)型差。
  • Php:簡單,搞笑,成本低,開發(fā)周期短,特別適合中小型企業(yè)的Web應(yīng)用開發(fā)。(LAMP:linux+Apache+MySql+Php)

JSP 基本語法

Jsp頁面元素構(gòu)成

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

指令

  • page 指令。
  • include 指令。將一個(gè)外部文件嵌入到當(dāng)前jsp文件中,同時(shí)解析這個(gè)頁面中的jsp語句。
  • taglib 指令。使用標(biāo)簽庫定義新的自定義標(biāo)簽,在jsp頁面中啟用定制行為。

page

page 指令。通常位于jsp頁面的頂端,同一個(gè)頁面可以有多個(gè)page指令。

語法:

<%@ page 屬性1="屬性值" 屬性2="屬性值1,屬性值2" ... 屬性n="屬性值n" %>

屬性 描述 默認(rèn)值
language 指定jsp頁面使用的腳本語言 java
import 通過該屬性來引用腳本語言中使用到的類文件
contentType 用來指定jsp頁面所采用的編碼格式 IntelliJ IDEA中:text/html;charset=UTF-8<br />Eclipse中:text/html; charset=ISO-8859-1

【Eclipse 新建jsp默認(rèn)代碼如下】

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>

</body>
</html>

【IntelliJ IDEA 新建jsp默認(rèn)代碼如下】

<%--
  Created by IntelliJ IDEA.
  User: zdy
  Date: 2016/12/28 0028
  Time: 11:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

</body>
</html>

include

include 指令。將一個(gè)外部文件嵌入到當(dāng)前jsp文件中,同時(shí)解析這個(gè)頁面中的jsp語句。

語法:

<%@ include file="url" %>

【示例】

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

date.jsp

<body>
<%
    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy年MM月dd日");
    Date date=new Date();
    String s=simpleDateFormat.format(date);
    out.println(s);
%>
</body>

taglib

taglib 指令。使用標(biāo)簽庫定義新的自定義標(biāo)簽,在jsp頁面中啟用定制行為。

注釋

HTML注釋,客戶端源代碼可見

<!--html注釋-->

JSP 注釋,客戶端源代碼不可見

<%--JSP注釋--%>

JSP 腳本注釋,客戶端源代碼不可見。位于<% %>中的注釋。

//單行注釋
/**/多行注釋

腳本

在jsp中執(zhí)行的java代碼。

語法:

<% java 代碼 %>

【示例】

<body>
    你好,JSP!
    <!--我是html注釋-->
    <%--我是jsp注釋--%>
    //我是注釋嗎?我不是注釋
    /*我是注釋嗎?我不是注釋*/
    <%
        //單行注釋
        /*多行注釋*/
        out.println("大家好,我能顯示在頁面上!");
        System.out.println("大家好,我不能顯示在頁面上,我打印在控制臺(tái)上!");
    %>
</body>

聲明

在jsp頁面中定義變量或者方法。

語法:

<%! java 代碼 %> //語句以分號(hào)結(jié)束

表達(dá)式

在jsp頁面中執(zhí)行的表達(dá)式。

語法:

<%= 表達(dá)式 %> //表達(dá)式不以分號(hào)結(jié)束

【示例】

<body>
    <%!
        String s="zdy";//聲明一個(gè)變量
        //聲明一個(gè)函數(shù)
        int add(int x,int y){
            return x+y;
        }
    %>
    你好,<%=s%>,10+5=<%=add(10,5)%>
</body>

【頁面顯示】

你好,zdy,10+5=15

【實(shí)例2】

<%!
  SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  String s=sdf.format(new Date());
%>
今天是:<%=s%>

【頁面顯示】

今天是:2016-12-28    

JSP 頁面生命周期

JSP 頁面生命周期
jspService()

JSP 生命周期 菜鳥教程

JSP 內(nèi)置對(duì)象

JSP內(nèi)置對(duì)象是Web容器創(chuàng)建的一組對(duì)象,不適用new關(guān)鍵字就可以使用的內(nèi)置對(duì)象。

JSP 九大內(nèi)置對(duì)象

  • 常用的:out,request,response,session,application
  • 不常用的:page,pageContext,exception,config

Web 程序的請(qǐng)求響應(yīng)模式

  • 用戶發(fā)送請(qǐng)求(request)
  • 服務(wù)器給用戶響應(yīng)(response)

緩沖區(qū)buffer,內(nèi)存的一塊區(qū)域用來保存臨時(shí)數(shù)據(jù)。

out

JspWriter類的實(shí)例,是向客戶端輸出內(nèi)容常用的對(duì)象。

  • void println() 向客戶端打印字符串
  • void clear() 清除緩沖區(qū)的內(nèi)容,如果在flush之后調(diào)用會(huì)拋出異常
  • void clearBuffer() 清除緩沖區(qū)的內(nèi)容,如果在flush之后調(diào)用不會(huì)拋出異常
  • void flush() 將緩沖區(qū)內(nèi)容輸出到客戶端
  • int getBufferSize() 返回緩沖區(qū)字節(jié)數(shù)的大小,如不設(shè)緩沖區(qū)則為0
  • int getRemaining() 返回緩沖區(qū)還剩余多少可用
  • boolean isAutoFlush() 返回緩沖區(qū)滿時(shí),是自動(dòng)清空還是拋出異常
  • void close() 關(guān)閉輸出流

【示例】

緩沖區(qū)大小:<%=out.getBufferSize()%>Byte<br />
緩沖區(qū)剩余大?。?lt;%=out.getRemaining()%>Byte<br />
是否自動(dòng)清空緩沖區(qū):<%=out.isAutoFlush()%><br />

request

客戶端的請(qǐng)求信息被封裝在 request 對(duì)象中,通過他才能了解到客戶的需求,然后做出響應(yīng)。它是 HttpServletRequset 類的實(shí)例。request 對(duì)象具有請(qǐng)求域,即完成客戶端的請(qǐng)求之前,該對(duì)象一直有效。

常用方法

  • String getParameter(String name) 返回name指定參數(shù)的參數(shù)值
  • String[] getParameterValues(String name) 返回包含參數(shù)name的所有值的數(shù)組
  • void setAttribute(String,Object) 存儲(chǔ)此請(qǐng)求中的屬性
  • object getAttribute(String name) 返回指定屬性的屬性值
  • String getContentType() 得到請(qǐng)求體的MIME類型
  • String getProtocol() 返回請(qǐng)求用的協(xié)議類型及版本號(hào)
  • String getServerName() 返回接收請(qǐng)求的服務(wù)器主機(jī)名
  • int getServerPort() 返回服務(wù)器接受此請(qǐng)求所用的端口號(hào)
  • String getCharacterEncoding() 返回字符編碼方式
  • void setCharacterEncoding(String) 設(shè)置請(qǐng)求的字符編碼方式
  • int getContentLength() 返回請(qǐng)求體的長度(字節(jié))
  • String getRemoteAddr() 返回發(fā)送此請(qǐng)求的客戶端ip地址
  • String getRealPath(String path) 返回一虛擬路徑的真實(shí)路徑【已經(jīng)被棄用deprecated】
  • String request.getContextPath() 返回上下文路徑

解決表單中文亂碼問題:

<%
    request.setCharacterEncoding("utf-8");
%>

解決URL中文亂碼問題:

<Connector port="8888" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="utf-8" />

【示例】

index.jsp

<body>
    <form action="dologin.jsp" name="loginForm" method="post">
    <table>
      <tr>
        <td>用戶名:</td>
        <td><input type="text" name="username"></td>
      </tr>
      <tr>
        <td>密碼:</td>
        <td><input type="password" name="password"></td>
      </tr>
      <tr>
        <td>愛好:</td>
        <td>
          <input type="checkbox" name="f" value="read">讀書
          <input type="checkbox" name="f" value="music">音樂
          <input type="checkbox" name="f" value="movie">電影
          <input type="checkbox" name="f" value="internet">上網(wǎng)
        </td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="login"></td>
      </tr>
    </table>
    </form>
    <a href="dologin.jsp?username=張丹陽">link</a>
</body>

dologin.jsp

<body>
    登錄成功!<br />
    <%
        request.setCharacterEncoding("utf-8");
        request.setAttribute("attr","123456");
    %>
    用戶名:<%=request.getParameter("username")%><br />
    密碼:<%=request.getParameter("password")%><br />
    attr:<%=request.getAttribute("attr")%><br />
    愛好:
    <%
        String[] f=request.getParameterValues("f");
        if (f!=null){
            for (String s:f) {
                out.println(s);
            }
        }
    %><br />
    MIME類型:<%=request.getContentType()%><br />
    協(xié)議類型及版本號(hào):<%=request.getProtocol()%><br />
    服務(wù)器主機(jī)名:<%=request.getServerName()%><br />
    服務(wù)器端口號(hào):<%=request.getServerPort()%><br />
    請(qǐng)求文件的長度:<%=request.getContentLength()%><br />
    請(qǐng)求客戶端的IP地址:<%=request.getRemoteAddr()%><br />
    請(qǐng)求的上下文路徑:<%=request.getContextPath()%>
</body>

【頁面顯示 http://localhost:8888/MyWeb/dologin.jsp

登錄成功!
用戶名:張丹陽
密碼:8888888888
attr:123456
愛好: read music 
MIME類型:application/x-www-form-urlencoded
協(xié)議類型及版本號(hào):HTTP/1.1
服務(wù)器主機(jī)名:localhost
服務(wù)器端口號(hào):8888
請(qǐng)求文件的長度:71
請(qǐng)求客戶端的IP地址:0:0:0:0:0:0:0:1
請(qǐng)求的上下文路徑:/MyWeb

response

response對(duì)象包含了響應(yīng)客戶請(qǐng)求的有關(guān)信息,但在JSP中很少直接用到它。是 HttpServletResponse 類的實(shí)例。response 對(duì)象具有頁面作用域,即訪問一個(gè)頁面時(shí),該頁面內(nèi)的 response 對(duì)象只能對(duì)這次訪問有效,其它頁面的 response 對(duì)象對(duì)當(dāng)前頁面無效。

常用方法

  • String getCharacterEncoding() 返回響應(yīng)用的是何種字符編碼
  • void setContentType(String type) 設(shè)置相應(yīng)的MIME類型
  • PrintWriter getWriter() 返回可以向客戶端輸出字符的一個(gè)對(duì)象(跟out對(duì)象對(duì)比,此對(duì)象輸出總是先于out對(duì)象輸出)
  • sendRedirect(java.lang.String location) 重新定向客戶端的請(qǐng)求

【示例】

<body>
<%
    response.setContentType("text/html;charset=UTF-8");
    out.println("這是out輸出");
    out.flush();
    PrintWriter outer=response.getWriter();
    outer.println("response.getWriter()實(shí)例輸出");
%>
</body>

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

請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向

  • 請(qǐng)求重定向:客戶端行為,response.sendRedirect(),從本質(zhì)上講等同于兩次請(qǐng)求,前一次的請(qǐng)求對(duì)象不會(huì)保存,地址欄的URL地址會(huì)改變。
  • 請(qǐng)求轉(zhuǎn)發(fā):服務(wù)器行為, request.getRequestDispatcher().forward(req,resp) 是一次請(qǐng)求,轉(zhuǎn)發(fā)后請(qǐng)求對(duì)象會(huì)保存,地址欄的URL地址不會(huì)改變。

請(qǐng)求轉(zhuǎn)發(fā)與請(qǐng)求重定向

imooc相關(guān)視頻

【示例】

//請(qǐng)求重定向
response.sendRedirect("request.jsp");
//請(qǐng)求轉(zhuǎn)發(fā)
request.getRequestDispatcher("dologin.jsp").forward(request,response);

session

  • session 表示客戶端與服務(wù)器的一次會(huì)話
  • Web 中的 session 指的是用戶在瀏覽某個(gè)網(wǎng)站時(shí),從進(jìn)入網(wǎng)站到瀏覽器關(guān)閉所經(jīng)過的這段時(shí)間,也就是用戶瀏覽這個(gè)網(wǎng)站所花費(fèi)的時(shí)間
  • session 實(shí)際是一個(gè)特定的時(shí)間概念
  • 在服務(wù)器的內(nèi)存中保存著不同用戶的 session ,與用戶一一對(duì)應(yīng)
  • session 對(duì)象是一個(gè)jsp內(nèi)置對(duì)象
  • session 對(duì)象在第一個(gè)jsp頁面被裝載時(shí)自動(dòng)創(chuàng)建,完成會(huì)話期管理
  • 從一個(gè)客戶打開瀏覽器并連接到服務(wù)器開始,到客戶關(guān)閉瀏覽器離開這個(gè)服務(wù)器結(jié)束,被稱為一個(gè)會(huì)話
  • 當(dāng)一個(gè)客戶訪問一個(gè)服務(wù)器時(shí),可能會(huì)在服務(wù)器的幾個(gè)頁面之間切換,服務(wù)期應(yīng)當(dāng)通過某種方法知道這是一個(gè)客戶,就需要session對(duì)象
  • session 對(duì)象是 HttpSession 類的實(shí)例

常用方法

  • long getCreationTime() 返回session創(chuàng)建時(shí)間
  • public String getId() 返回session創(chuàng)建時(shí)jsp引擎為他設(shè)置的唯一ID號(hào)
  • public Object setAttribute(String name,Object value) 使用指定名稱將對(duì)象綁定到此會(huì)話
  • public Object getAttribute(String) 返回與此會(huì)話中的指定名稱綁定在一起的對(duì)象,如果沒有對(duì)象綁定在該名稱下,則返回null
  • Enumeration getAttributeNames() 返回一個(gè)包含此session中所有可用屬性的數(shù)組
  • int getMaxInactiveInterval() 返回兩次請(qǐng)求間隔多長時(shí)間此session被取消掉(單位秒)

【示例】

session.jsp

<body>
<%
    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=new Date(session.getCreationTime());
    session.setAttribute("username","zdy");
    session.setAttribute("password","pwd");
    session.setAttribute("age",20);
    session.setMaxInactiveInterval(10);//10s
%>
Session創(chuàng)建時(shí)間:<%=simpleDateFormat.format(date)%><br />
Session ID:<%=session.getId()%><br />
從Session中獲取用戶名:<%=session.getAttribute("username")%><br />
Session中保存的屬性有:
<%
    Enumeration<String> m=session.getAttributeNames();
    Enumeration enumeration=session.getAttributeNames();
    while (enumeration.hasMoreElements()){
        Object e=enumeration.nextElement();
        out.println("屬性名:"+ e.toString());
        out.println("屬性值:"+session.getAttribute(e.toString()));
    }
%>
<a href="session2.jsp" target="_blank">跳轉(zhuǎn)</a>
</body>

session2.jsp

<body>
<%
    SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date date=new Date(session.getCreationTime());
%>
Session創(chuàng)建時(shí)間:<%=simpleDateFormat.format(date)%><br />
Session ID:<%=session.getId()%><br />
從Session中獲取用戶名:<%=session.getAttribute("username")%><br />
</body>

session 生命周期

  • 創(chuàng)建:當(dāng)客戶端第一次訪問某個(gè)jsp或者Servlet時(shí),服務(wù)器會(huì)為當(dāng)前會(huì)話創(chuàng)建一個(gè)SessionId,每次客戶端向服務(wù)端發(fā)送請(qǐng)求時(shí),都會(huì)將此SessionId攜帶過去,服務(wù)端會(huì)對(duì)此SessionId進(jìn)行校驗(yàn)。
  • 活動(dòng):
    • 某次會(huì)話當(dāng)中通過超鏈接打開的新頁面屬于同義詞會(huì)話
    • 只要當(dāng)前會(huì)話頁面沒有全部關(guān)閉,重新打開新的瀏覽器窗口訪問同一項(xiàng)目資源時(shí)屬于同一次會(huì)話
    • 除非本次會(huì)話的所有頁面都關(guān)閉后再重新訪問某個(gè)jsp或者Servlet將會(huì)創(chuàng)建新的會(huì)話
      • 注意:原有會(huì)話還在,只是這個(gè)舊的SessionId依然存在于服務(wù)端,只不過再也沒有客戶端會(huì)攜帶它然后交與服務(wù)端校驗(yàn)。
  • 銷毀:
    • 調(diào)用了session.invalidate()方法
    • session過期(超時(shí))
    • 服務(wù)器重新啟動(dòng)

設(shè)置session超時(shí)時(shí)間的方式

方法1:session.setMaxInactiveInterval(10);//單位秒

方法2:web.xml中配置(單位是分鐘):

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

application

  • application對(duì)象實(shí)現(xiàn)了用戶間數(shù)據(jù)的共享,可存放全局變量
  • application開始于服務(wù)器的啟動(dòng),終止于服務(wù)器的關(guān)閉
  • 在用戶的前后連接或不同用戶之間的連接中,可以對(duì)application對(duì)象的同一屬性進(jìn)行操作
  • 在任何地方對(duì)application對(duì)象屬性的操作,都將影響到其他用戶對(duì)此的訪問
  • 服務(wù)器的啟動(dòng)和關(guān)閉決定了application對(duì)象的生命
  • application對(duì)象是ServletContext類的實(shí)例

常用方法

  • public void setAttribute(String name,Object value)使用指定名稱將對(duì)象綁定到此會(huì)話
  • public Object getAttribute(String names) 返回與此會(huì)話中的指定名稱綁定在一起的對(duì)象,如果沒有對(duì)象綁定在該名稱下,則返回null
  • Enumeration getAttributeNames() 返回所有可用屬性名的枚舉
  • String getServerInfo() 返回 JSP (Servlet) 引擎名及版本號(hào)

【示例】

<body>
<%
    application.setAttribute("city","北京");
    application.setAttribute("postcode","100000");
    application.setAttribute("extel","010");
%>
城市:<%=application.getAttribute("city")%><br />
application屬性有:
<%
    Enumeration enumeration=application.getAttributeNames();
    while (enumeration.hasMoreElements()){
        out.println(enumeration.nextElement().toString()+"&nbsp;&nbsp;&nbsp;");
    }
%><br />
JSP(SERVLET)引擎名與版本號(hào):<%=application.getServerInfo()%><br />
</body>

page

page對(duì)象指向當(dāng)前jsp頁面本身(類似類中的this指針),是java.lang.Object類的實(shí)例。

常用方法

  • class getClass() 返回此Object的類
  • int hashCode() 返回此Object的hash碼
  • boolean equals(Object obj) 判斷此 Object 是否與指定的 Object 對(duì)象相等
  • void copy(Object obj) 把此Object拷貝到指定的Object對(duì)象中
  • Object clone() 克隆此 Object 對(duì)象
  • String toString() 把此 Object 對(duì)象轉(zhuǎn)換成 String 類的對(duì)象
  • void notify() 喚醒一個(gè)等待線程
  • void notifyAll() 喚醒所有等待線程
  • void wait(int timeout) 使一個(gè)線程出于等待直到timeout結(jié)束或被喚醒
  • void wait() 使一個(gè)線程出于等待直到被喚醒

pageContext

  • pageContext 對(duì)象提供了對(duì)jsp頁面內(nèi)所有對(duì)象及名字空間的訪問
  • pageContext 對(duì)象可以訪問到本業(yè)所在的session,也可以獲取本頁面所在的application的某一屬性值
  • pageContext 對(duì)象相當(dāng)于頁面中所有功能的集大成者
  • pageContext 對(duì)象的本類名也叫 pageContext

常用方法

  • JspWriter getOut() 返回當(dāng)前客戶端響應(yīng)被使用的 JspWriter 流(out)
  • HttpSession getSession() 返回當(dāng)前頁中的 HttpSession 對(duì)象(session)
  • Object getPage() 返回當(dāng)前頁的 Object 對(duì)象(page)
  • ServletRequest getRequest() 返回當(dāng)前頁的 ServletRequest 對(duì)象(request)
  • ServletResponse getResponse() 返回當(dāng)前頁的 ServletResponse 對(duì)象(response)
  • void setAttribute(String name,Object attribute) 設(shè)置屬性及屬性值
  • Object getAttribute(String name,int scope) 在指定范圍內(nèi)獲取屬性的值
  • int getAttributeScope(String name) 返回某屬性的作用范圍
  • void forward(String relativeUrlPath) 使當(dāng)前頁面重導(dǎo)到另一頁面,url不變
  • void include(String relativeUrlPath) 在當(dāng)前位置包含另一文件

【示例1】

用戶名是:<%=pageContext.getSession().getAttribute("username")%>

【示例2】

<%
    pageContext.forward("index.jsp");
%>

【示例3】

<%
    pageContext.include("index.jsp");
%>

Config

config 是在一個(gè) Servlet 初始化時(shí),jsp引擎向它傳遞信息用的,此信息包括 Servlet 初始化時(shí)所要用到的參數(shù)(通過屬性名和屬性值構(gòu)成)以及服務(wù)器的有關(guān)信息(通過傳遞一個(gè)ServletContext對(duì)象)

常用方法

  • ServletContext getServletContext() 返回含有服務(wù)器相關(guān)信息的 ServletContext 對(duì)象
  • String getInitParameter(String name) 返回初始化參數(shù)的值
  • Enumeration getInitParameterNames() 返回 Servlet 初始化所需所有參數(shù)的枚舉

exception

exception 對(duì)象是一個(gè)異常對(duì)象,當(dāng)一個(gè)頁面中在運(yùn)行過程中發(fā)生了異常,就產(chǎn)生這個(gè)對(duì)象。如果一個(gè)JSP頁面要應(yīng)用此對(duì)象,就必須把 isErrorPage 設(shè)為true(在page指令中設(shè)置),否則無法編譯。他實(shí)際上是java.lang.Throwable 的對(duì)象。

常用方法

  • String getMessage() 返回描述異常的消息
  • String toString() 返回關(guān)于異常的簡短描述信息
  • void printStackTrace() 顯示異常及其棧軌跡
  • Throwable FillStackTrace() 重寫異常的執(zhí)行棧軌跡

【示例】

exception.jsp 在page指令中將錯(cuò)誤頁面定向到error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp" %>
<html>
<head>
    <title>exception</title>
</head>
<body>
<%
    System.out.println(100/0);
%>
</body>
</html>

error.jsp 在page指令中指定 isErrorPage 為true

<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
異常消息是:<%=exception.getMessage()%><br />
異常的字符串描述:<%=exception.toString()%>
</body>
</html>

【運(yùn)行結(jié)果】頁面url未該變,是exception.jsp

異常消息是:/ by zero
異常的字符串描述:java.lang.ArithmeticException: / by zero

關(guān)于登錄的一個(gè)小視頻教程,來自慕課網(wǎng)

JavaBean

JavaBean 就是符合某種特定規(guī)范的java類。使用 JavaBeans 的好處是解決代碼重復(fù)編寫,減少代碼的冗余,功能區(qū)分明確,提高代碼的維護(hù)性。

設(shè)計(jì)原則

  • 公有類
  • 無參的公有構(gòu)造方法
  • getter和setter方法
  • 屬性私有

Jsp動(dòng)作

jsp動(dòng)作元素(action elements)為請(qǐng)求處理階段提供信息。動(dòng)作元素遵循xml元素的語法,有一個(gè)包含元素明德開始標(biāo)簽,可以有屬性、可選的內(nèi)容、與開始標(biāo)簽匹配的結(jié)束標(biāo)簽。

第一類:與存取JavaBean有關(guān)的

<jsp:useBean><jsp:setProperty><jsp:getProperty>

【講解&實(shí)例】見下面的javabean部分

第二類:基本的動(dòng)作元素,6個(gè) (JSP1.2+)

<jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:params><jsp:fallback>

<jsp:include>

語法:

<jsp:include page="url" flush="true|false" />

page 要包含的頁面

flush 被包含的頁面是否從緩沖區(qū)讀取

【示例】

<jsp:include page="date.jsp" flush="false"/>
include 指令 與 include 動(dòng)作比較
- include指令 include動(dòng)作
語法格式 <%@ include file="url" %> <jsp:include page="url">
發(fā)生作用的時(shí)間 頁面轉(zhuǎn)換期間 請(qǐng)求期間
包含的內(nèi)容 文件的實(shí)際內(nèi)容 頁面的輸出
轉(zhuǎn)化成的Servlet 主頁面和包含頁面轉(zhuǎn)換成一個(gè)Servlet 主頁面和包含頁面轉(zhuǎn)換為獨(dú)立的Servlet
編譯時(shí)間 較慢,資源必須被解析 較快
執(zhí)行時(shí)間 較快 較慢,每次資源必須被解析
  • <jsp:include>動(dòng)作在請(qǐng)求期間被執(zhí)行,而include指令在編譯期頁面間被執(zhí)行
  • 頁面內(nèi)容經(jīng)常變化時(shí)更適合使用<jsp:include>動(dòng)作
  • 頁面內(nèi)容不經(jīng)常變化時(shí)更適合使用include指令
  • <jsp:include>動(dòng)作包含的是執(zhí)行結(jié)果,而include指令包含的是文件內(nèi)容

<jsp:forward>

語法:

<jsp:forward page="url" />

等同于轉(zhuǎn)發(fā):

request.getRequestDispatcher("/url").forward(request,response);

【示例】

<jsp:forward page="userinf.jsp" />

等價(jià)于

<%
    request.getRequestDispatcher("userinf.jsp").forward(request,response);
%>

<jsp:param>

語法:

<jsp:param name="參數(shù)名" value="參數(shù)值">

常常與<jsp:forward>一起使用,作為其子標(biāo)簽

【示例】

<jsp:forward page="userinf.jsp" >
    <jsp:param name="email" value="email@gmail.com" />
</jsp:forward>

第三類:主要與JSP document有關(guān)的,6個(gè) (JSP2+)

<jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>

第四類:主要用來動(dòng)態(tài)生成XML元素標(biāo)簽的值,3個(gè)(JSP2+)

<jsp:attribute><jsp:body><jsp:element>

第五類:主要用在Tage File中,2個(gè)(JSP2+)

<jsp:invoke><jsp:dobody>

在jsp頁面中使用javabean

使用普通方式創(chuàng)建javabean實(shí)例

<%
    User u=new User();
    u.setName("zdy");
%>
用戶名:<%=u.getName()%>

使用jsp動(dòng)作標(biāo)簽使用javabean

在jsp頁面中實(shí)例化或者在指定范圍內(nèi)使用javabean。

useBean

在jsp中實(shí)例化或者在指定范圍內(nèi)使用javabean

<jsp:useBean id="標(biāo)識(shí)符" class="java類名" scope="作用域" />

setProperty

給已經(jīng)實(shí)例化的JavaBean對(duì)象的屬性賦值,一共有四種方式:

<jsp:setProperty name="JavaBean 實(shí)例名" property="*" />(跟表單關(guān)聯(lián))

<jsp:setProperty name="JavaBean 實(shí)例名" property="JavaBean屬性名" />(跟表單關(guān)聯(lián))

<jsp:setProperty name="JavaBean 實(shí)例名" property="JavaBean屬性名" value="BeanValue" />(手動(dòng)設(shè)置)


<jsp:setProperty name="JavaBean 實(shí)例名" property="JavaBean屬性名" param
="request對(duì)象中的參數(shù)名" />(跟request參數(shù)關(guān)聯(lián))

【示例】com.po下的User類

public class User {
    private String username;
    private String password;
    public User(){

    }
    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

【頁面1:index.jsp】

  <form action="javabean.jsp" name="loginForm" method="post">
    <table>
      <tr>
        <td>用戶名:</td>
        <td><input type="text" name="username"></td>
      </tr>
      <tr>
        <td>密碼:</td>
        <td><input type="password" name="password"></td>
      </tr>
      <tr>
        <td colspan="2"><input type="submit" value="login"></td>
      </tr>
    </table>
  </form>

【頁面2:javabean.jsp 實(shí)例1】根據(jù)表單自動(dòng)匹配所有的屬性

<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="*"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>

亂碼處理,下同

<%
    request.setCharacterEncoding("utf-8");
%>

【頁面顯示】

用戶名:張丹陽 密碼:123456

【頁面2:javabean.jsp 實(shí)例2】根據(jù)表單匹配部分屬性

<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="username"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>

【頁面顯示】

用戶名:張丹陽 密碼:null

【頁面2:javabean.jsp 實(shí)例3】跟表單無關(guān),手動(dòng)賦值

<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="username" value="張Sir"/>
<jsp:setProperty name="myUser" property="password" value="888888"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>

【頁面顯示】

用戶名:張Sir 密碼:888888

【頁面2:javabean.jsp 實(shí)例3】通過request賦值

<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="username" param="username"/>
<jsp:setProperty name="myUser" property="password" param="password"/>
用戶名:<%=myUser.getUsername()%>
密碼:<%=myUser.getPassword()%>

【頁面顯示】

用戶名:張丹陽 密碼:123456

getProperty

獲取指定JavaBean對(duì)象的屬性值

<jsp:getProperty name="JavaBean 實(shí)例名" property="屬性名" />

【示例】

<jsp:useBean id="myUser" class="com.po.User" scope="page"/>
<jsp:setProperty name="myUser" property="*" />
用戶名:<jsp:getProperty name="myUser" property="username"/>
密碼:<jsp:getProperty name="myUser" property="password"/>

四個(gè)作用域范圍

使用useBean的scope屬性指定javabean的作用范圍。

  • page 僅在當(dāng)前頁面有效
  • request 可以通過 HttpRequest.getAttribute() 取得javabean對(duì)象
  • session 可以通過 HttpSession.getAttribute() 取得javabean對(duì)象
  • application 可以通過 application.getAttribute() 取得javabean對(duì)象

【示例】

javabean.jsp

<jsp:useBean id="myUser" class="com.po.User" scope="application"/>
<jsp:setProperty name="myUser" property="*" />

testScope.jsp

<jsp:useBean id="myUser" class="com.po.User" scope="application"/>
用戶名:<%=((User)application.getAttribute("myUser")).getUsername()%>
密碼:<%=((User)application.getAttribute("myUser")).getPassword()%>

更詳細(xì)的教程,來自慕課網(wǎng)

Model1

Model1

關(guān)于登錄的一個(gè)javabean小視頻教程,來自慕課網(wǎng)

JSP 狀態(tài)管理

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

保存用戶狀態(tài)的兩大機(jī)制

session、cookie

Cookie

Cookie是Web服務(wù)器保存在客戶端的一系列文本信息。

【應(yīng)用】

  • 判斷注冊(cè)用戶是否已經(jīng)登錄網(wǎng)站
  • 購物車

【作用】

  • 對(duì)特定對(duì)象的追蹤
  • 保存用戶網(wǎng)頁瀏覽記錄與習(xí)慣
  • 簡化登錄

【安全風(fēng)險(xiǎn)】

容易泄漏用戶信息

創(chuàng)建與使用Cookie

創(chuàng)建Cookie對(duì)象

Cookie newCookie=new Cookie(String key,Object value);

寫入Cookie對(duì)象

response.addCookie(newCookie);

讀取Cookie對(duì)象

Cookie[] cookies=request.getCookies();

常用方法

  • void setMaxAge(int expiry) 設(shè)置cookie有效期,以秒為單位
  • void setValue(String value) 在cookie創(chuàng)建后,對(duì)cookie進(jìn)行賦值
  • String getName() 獲取cookie的名稱
  • String getValue() 獲取cookie的值
  • int getMaxAge() 獲取cookie的有效時(shí)間,以秒為單位

【實(shí)例:十天內(nèi)記住登錄狀態(tài)】

index.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=c.getValue();
      username= URLDecoder.decode(c.getValue(),"utf-8");
    }else if(c.getName().equals("password")){
      password=c.getValue();
    }
  }
}
%>
<form action="login.jsp" name="loginForm" 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"/>十天內(nèi)記住我的登錄狀態(tài)</td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="login"></td>
  </tr>
</table>
</form>
</body>

login.jsp

<body>
<%
    request.setCharacterEncoding("utf-8");
    //判斷用戶是否選擇記住登錄狀態(tài)
    String[] isUseCookies=request.getParameterValues("isUseCookie");
    if (isUseCookies!=null&&isUseCookies.length>0){
        //把用戶名和密碼保存在Cookie對(duì)象里面
        String username= URLEncoder.encode(request.getParameter("username"),"utf-8");
        //String username=request.getParameter("username");
        String password=request.getParameter("password");
        Cookie usernameCookie=new Cookie("username",username);
        Cookie passwordCookie=new Cookie("password",password);
        usernameCookie.setMaxAge(864000);//設(shè)置最大生存期限為10天
        passwordCookie.setMaxAge(864000);
        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);//設(shè)置cookie失效
                    response.addCookie(c);//重新保存
                }
            }
        }
    }
%>
<a href="userinf.jsp">跳轉(zhuǎn)查看保存在cookie的信息</a>
</body>

userinf.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=c.getValue();
               username= URLDecoder.decode(c.getValue(),"utf-8");
            }else if(c.getName().equals("password")){
                password=c.getValue();
            }
        }
    }
%>
用戶名:<%=username%><br />
密碼:<%=password%><br />
</body>

session 與 cookie 對(duì)比

session cookie
在服務(wù)器端保存用戶信息 在客戶端保存用戶信息
保存的是Object類型 保存的是String類型
隨會(huì)話的結(jié)束而將其存儲(chǔ)的數(shù)據(jù)銷毀 長期保存在客戶端
保存重要的信息 保存不重要的信息

實(shí)例

商品列表、詳情以及最近瀏覽記錄:慕課網(wǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,527評(píng)論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,687評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 178,640評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,957評(píng)論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,682評(píng)論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,011評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,009評(píng)論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,183評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,714評(píng)論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,435評(píng)論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,665評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,148評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,838評(píng)論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,251評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,588評(píng)論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,379評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,627評(píng)論 2 380

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

  • 一、jsp定義及作用 JSP技術(shù)使用Java編程語言編寫類XML的tags和scriptlets,來封裝產(chǎn)生動(dòng)態(tài)網(wǎng)...
    yzw12138閱讀 1,245評(píng)論 0 0
  • 一、表單提交方式之Get和Post的區(qū)別 Get:以明文的方式通過URL提交數(shù)據(jù),數(shù)據(jù)在URL中可以看到。提交的數(shù)...
    潛心之力閱讀 2,245評(píng)論 1 2
  • 什么是jsp? 很久之前,我們的網(wǎng)頁都是靜態(tài)的,就是我們所看到的頁面在編寫好之后總是唯一的。后來有人便提出動(dòng)態(tài)頁面...
    ezsync小智閱讀 1,533評(píng)論 0 13
  • 1.什么是JSP (1)jsp全稱是Java Server Pages,它和Servlet技術(shù)一樣都是sun公司定...
    yjaal閱讀 3,680評(píng)論 5 99
  • 終于見到“他”了,傳說中來自戰(zhàn)斗民族俄羅斯的神車---拉達(dá)。 《老柳說車》的節(jié)目與自媒體矩陣去年就專門介紹過這款車...
    老柳說車閱讀 602評(píng)論 0 0