JSP初學(xué)者教程

1. 簡介

需要準(zhǔn)備以下軟件工具:

  • Eclipse 4.6(NEON)
  • Tomcat Web Server 9.x

在開始學(xué)習(xí)JSP之前结笨,建議你了解Servlet包晰。可以通過以下鏈接訪問學(xué)習(xí):

2. 安裝Tomcat Web服務(wù)器

要編寫和運(yùn)行JSP程序炕吸,需要下載Tomcat Web Server并在Eclipse中對它進(jìn)行配置聲明伐憾。可以在此處查看說明:

3. 創(chuàng)建JSP項(xiàng)目

在Eclipse中赫模,選擇:

創(chuàng)建JSP項(xiàng)目

然后輸入項(xiàng)目名稱:JspTutorial树肃,如下所示:

JSP教程
JSP教程-2
JSP教程-3

創(chuàng)建項(xiàng)目成功后,目錄結(jié)構(gòu)如下所示:

JSP教程-4

接下來瀑罗,創(chuàng)建一個(gè)簡單的JSP文件胸嘴,選擇File/New/Other...

JSP教程-5

填寫新創(chuàng)建的JSP文件名稱:index.jsp斩祭,如下所示:

image

可以選擇一個(gè)模板劣像,這里按默認(rèn)選擇,如下所示:

選擇JSP模板

文件:index.jsp 已創(chuàng)建摧玫,但是可能有錯(cuò)誤通知耳奕。不用擔(dān)心 這是未聲明Servlet庫的結(jié)果。接下來使用Tomcat的Servlet庫以及Web服務(wù)器的配置來運(yùn)行此項(xiàng)目就可以了诬像。

JSP教程-6

接下來簡單的修改這個(gè)JSP文件屋群,以打印當(dāng)前系統(tǒng)時(shí)間。修改后的代碼如下所示:

文件:index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>第一個(gè)JSP程序</title>
</head>
<body>
<h1>Hello JSP</h1>
 
  <%
      java.util.Date date = new java.util.Date();
  %>
 
  <h2>
      當(dāng)前時(shí)間: <%=date.toString()%>
  </h2>
</body>
</html>

4. 配置Tomcat Web服務(wù)器并運(yùn)行WebApp

右鍵單擊“JspTutorial”項(xiàng)目坏挠,然后選擇“屬性(Properties)”芍躏,選擇Project Facets,如下圖所示:

配置Tomcat Web服務(wù)器

然后點(diǎn)擊:Apply and Close癞揉,就可以了纸肉。

現(xiàn)在溺欧,“JspTutorial”項(xiàng)目應(yīng)該沒有錯(cuò)誤提示通知了。如下圖所示:


image

右鍵單擊項(xiàng)目柏肪,然后選擇“Run As/Run on Server”姐刁。

image
選擇服務(wù)器
選擇項(xiàng)目

運(yùn)行應(yīng)用程序得到結(jié)果如下:

運(yùn)行應(yīng)用程序

以下是程序的執(zhí)行流程:

執(zhí)行流程

訪問以下URL => http://localhost:8080/JspTutorial/index.jsp ,得到同樣的結(jié)果:

同樣的結(jié)果

5. JSP和Servlet的關(guān)系

JSP和Servlet的關(guān)系

當(dāng)用戶向JSP頁面發(fā)送請求時(shí)烦味,例如hello.jsp頁面:

第一次聂使,Web Server將hello.jsp頁更改為hello_jsp.java文件,并將其編譯為hello_java.class谬俄。 這是一個(gè)Servlet柏靶,它將創(chuàng)建HTML以響應(yīng)用戶的請求。

從第二次請求開始溃论,它將檢查hello.jsp文件是否有任何更改屎蜓。 如果沒有更改,它將調(diào)用servlet(hello_jsp.class)并將HTML數(shù)據(jù)回復(fù)給用戶钥勋。 如果有更改炬转,它將重新創(chuàng)建hello_jsp.java并將其重新編譯為hello_jsp.class文件。
因此算灸,當(dāng)更改jsp文件時(shí)扼劈,不需要重新運(yùn)行Web服務(wù)器。

6. JSP示例

6.1. JSP中的預(yù)定義變量

導(dǎo)入聲明 -

<!-- Import declaration -->
<%@ page import="java.util.*, java.text.*"  %>  
 
<%@ page import="java.util.List, java.text.*" %>

在JSP中的預(yù)定義變量菲驴,可以使用:

  • equest: javax.servlet.http.HttpServletRequest
  • response: javax.servlet.http.HttpServletResponse
  • out: javax.servlet.jsp.JspWriter

如下示例:

<%
// Using out variable:
out.println("<h1>Now is "+ new Date()+"</h1>");
 
// Using request variable:
String serverName= request.getServerName();
 
 
// Using response variable:
response.sendRedirect("http://eclipse.org");
 
%>

6.2. HTML(JSP)中的Java代碼

創(chuàng)建一個(gè)新的jsp文件:demo/javaInHtml.jsp荐吵,代碼如下:

JavaInHtml.jsp

<%@ page import="java.util.Random,java.text.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>返回隨機(jī)數(shù)</title>
</head>
<body>
    <%
        Random random = new Random();
        // 返回隨機(jī)數(shù): (0, 1 or 2)
        int randomInt = random.nextInt(3);     
        if (randomInt == 0) {
    %>

    <h1>0.隨機(jī)數(shù)是:<%=randomInt%></h1>
    <%
        } else if (randomInt == 1) {
    %>
    <h2>1.隨機(jī)數(shù)是:<%=randomInt%></h2>
    <%
        } else {
    %>
    <h3>2.隨機(jī)數(shù)是:<%=randomInt%></h3>
    <%
        }
    %>
    <a href="<%= request.getRequestURI() %>">重新試一下</a>
</body>
</html>

訪問以下URL: http://localhost:8080/JspTutorial/demo/javaInHtml.jsp ,得到以下結(jié)果:

image

如果在瀏覽器中查看生成的HTML代碼赊瞬,應(yīng)該會(huì)發(fā)現(xiàn)生成的代碼有變化先煎。

6.3. 在JSP定義方法

本質(zhì)上,JSP最終被編譯為Servlet(一個(gè)類)森逮。 因此榨婆,JSP還允許在其中創(chuàng)建方法,就和Java中的方法一樣褒侧。方法在標(biāo)記<%!!%>內(nèi)部聲明良风。

<%!
// 定義一個(gè)方法
public int sum(int a, int b)  {
 return a + b;
}
 
public void exampleMethod()  {
  // Code here
}
%>

在JSP定義方法的示例文件:methodInJsp.jsp

<%!
  public int sum(int a, int b) {
      return a + b;
  }
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>在JSP定義方法</title>
</head>
<body>
  <h1>
      1 + 2 =    <%=sum(1, 2)%>
  </h1>
</body>
</html>

7. JSP指令

JSP指令為容器提供了指導(dǎo)和說明,告訴容器如何處理JSP的某些方面闷供。以下是JSP中的指令和說明:

指令 說明
<%@ page ... %> 定義與頁面有關(guān)的屬性烟央,例如腳本語言,錯(cuò)誤頁面和緩沖要求歪脏。
<%@ include ... %> 在編譯階段包含文件疑俭。
<%@ taglib ... %> 聲明在頁面中使用的包含自定義操作的標(biāo)記庫。

7.1. JSP指令page

page指令用于提供與容器當(dāng)前JSP頁面相關(guān)的指令婿失〕В可以在JSP頁面中的任何位置使用page指令代碼啄寡。 按照慣例,page指令位于JSP頁面的頂部哩照。

屬性 目的 描述
buffer 指定輸出流的緩沖模型挺物。
autoFlush 控制Servlet輸出緩沖區(qū)的行為。
contentType 定義字符編碼方案飘弧。 contentType="text/html;charset=UTF8"
errorPage 定義另一個(gè)報(bào)告Java未經(jīng)檢查的運(yùn)行時(shí)異常的JSP的URL识藤。 errorPage="error.jsp"
isErrorPage 指示此JSP頁面是否是另一個(gè)JSP頁面的errorPage屬性指定的URL。
extends 指定生成的servlet必須擴(kuò)展的超類 extends="com.Xntutor.MyServlet"
import 指定要在JSP中使用的軟件包或類的列表次伶,就像Java import語句對Java類所做的那樣痴昧。 import="java.io.*, java.utils.List"
info 定義一個(gè)可以使用servlet的getServletInfo()方法訪問的字符串。 info="Login Page"
isThreadSafe 為生成的servlet定義線程模型冠王。
language 定義JSP頁面中使用的編程語言赶撰。 language = "java"
session 指定JSP頁面是否參與HTTP會(huì)話
isELIgnored 指定是否將忽略JSP頁面內(nèi)的EL表達(dá)式。
isScriptingEnabled 確定是否允許使用腳本元素柱彻。 -

例如扣囊,在指令<%@ page ... %>中使用errorPage屬性。創(chuàng)建兩個(gè)新文件:

創(chuàng)建兩個(gè)文件

文件:pageHasError.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
  pageEncoding="UTF-8" errorPage ="error.jsp"%>
<%@ page errorPage ="error.jsp"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>有錯(cuò)誤頁面</title>
</head>
<body>
  <h2>有錯(cuò)誤頁面</h2>
  <%
      // Error divided by 0
      int i = 10 / 0;
  %>
 
</body>
</html>

文件:error.jsp

<%@ page isErrorPage="true" import="java.io.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>錯(cuò)誤</title>
</head>
<body>

    <h2>頁面中有些錯(cuò)誤</h2>
    錯(cuò)誤信息如下:
    <%=exception.getMessage()%>
    <h3>StackTrace:</h3>
    <%
  StringWriter stringWriter = new StringWriter();
  PrintWriter printWriter = new PrintWriter(stringWriter);
  exception.printStackTrace(printWriter);
  out.println("<pre>");
  out.println(stringWriter);
  out.println("</pre>");
  printWriter.close();
  stringWriter.close();
%>
</body>
</html>

運(yùn)行并訪問頁面:pageHasError.jsp

訪問頁面

7.2. JSP指令include

JSP允許在JSP頁面編譯變成Servlet時(shí)將文件內(nèi)容嵌入到JSP中绒疗。示例:

<!-- Syntax -->
<%@ include file="url" %>
 
<!-- Example -->
<%@ include file = "header.html" %>
 
<%@ include file = "footer.html" %>
 
<!-- You can also embed a different JSP page -->
<%@ include file = "fragment.jsp" %>

在下面示例中,將創(chuàng)建幾個(gè)文件 -

創(chuàng)建文件

文件:header.html

<div style="background: #E0E0E0; height: 80px; padding: 5px;">
  <div style="float: left">
      <h1>我的頁面</h1>
  </div>
  <div style="float: right; padding: 10px;">
      搜索:<input name="search">
  </div>
</div>

文件:footer.html

<div
  style="background: #E0E0E0; text-align: center; padding: 5px; margin-top: 10px;">
  @Copyright xntutor.com
</div>

文件:includeDemo.jsp

<%@ page import="java.util.Random,java.text.*"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Jsp Include指令示例</title>
</head>
<body>
  <%@ include file="../fragment/header.html"%>
  <h2>Jsp初學(xué)教程</h2>
  Hi! This is Jsp Tutorial...
  <%@ include file="../fragment/footer.html"%>
</body>
</html>

8. JSP標(biāo)準(zhǔn)動(dòng)作

標(biāo)準(zhǔn)動(dòng)作是在JSP本身中定義的動(dòng)作骂澄,不需要使用taglib指令進(jìn)行聲明吓蘑。JSP中的所有標(biāo)準(zhǔn)動(dòng)作都有一個(gè)默認(rèn)前綴jsp

因此坟冲,從本質(zhì)上講磨镶,JSP標(biāo)準(zhǔn)動(dòng)作是JSP的大量可用標(biāo)記。 按照慣例健提,它們集成在JSP頁面中琳猫,無需通過聲明指令<%@ taglib ... %>來聲明。

以下是JSP中的標(biāo)準(zhǔn)動(dòng)作列表:

語法 目的
jsp:include 在請求頁面時(shí)包含一個(gè)文件私痹。
jsp:useBean 查找或?qū)嵗疛avaBean
jsp:setProperty 設(shè)置JavaBean的屬性
jsp:getProperty 將JavaBean的屬性插入輸出到頁面
jsp:forward 將請求者轉(zhuǎn)發(fā)到新頁面
jsp:plugin 生成特定于瀏覽器的代碼脐嫂,為Java插件創(chuàng)建OBJECTEMBED標(biāo)簽
jsp:element 動(dòng)態(tài)定義XML元素。
jsp:attribute 使用jsp:attribute元素紊遵,可以在XML元素的主體中而不是XML屬性的值中定義標(biāo)記屬性的值账千。
jsp:body 定義動(dòng)態(tài)定義的XML元素的主體。
jsp:text 用于在JSP頁面和文檔中編寫模板文本暗膜。

8.1. JSP動(dòng)作jsp:include

<jsp:include ..>用于在請求時(shí)將頁面嵌入JSP匀奏。相反,指令<%@ include %>在將JSP解析為Servlet時(shí)將文件嵌入JSP学搜。
參見示例:

JSP動(dòng)作jsp:include

文件:fragment/dateTime.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.Date,java.text.*"%>
<!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=UTF-8">
<title>當(dāng)前時(shí)間</title>
</head>
<body>
    <%
        Date now = new Date();
        DateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss SSS");
    %>
    <h4>當(dāng)前時(shí)間:</h4>
    <%=df.format(now)%>
</body>
</html>

文件:demo/jspIncludeDemo.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>JSP Action jsp:include</title>
</head>
<body>
<h2>JSP動(dòng)作jsp:include示例:</h2>
<jsp:include page="../fragment/dateTime.jsp"></jsp:include>
</body>
</html>

jspIncludeDemo.jsp的運(yùn)行結(jié)果如下:

運(yùn)行結(jié)果

8.2. JSP動(dòng)作jsp:useBean

jsp:useBean動(dòng)作用于操作Java類娃善,首先創(chuàng)建一個(gè)類和一個(gè)JSP文件论衍,如下圖所示:

JSP:useBean

文件:HelloBean.java

package com.xntutor.beans;

public class HelloBean {

    private String name;

    // Class is required default constructor.
    public HelloBean() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHello() {
        if (name == null) {
            return "Hello,大家好";
        }
        return "Hello " + name;
    }
}

文件:usebean.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>使用Bean</title>
</head>
<body>
  <jsp:useBean id="helloBean"
      class="com.xntutor.beans.HelloBean"></jsp:useBean>      
  <h3>調(diào)用HelloBean類的getName()方法:</h3>
  <jsp:getProperty name="helloBean" property="hello" />    
  <!-- Set property name for helloBean -->
  <jsp:setProperty  name="helloBean" property="name" value="JSP"/>
  <h3>調(diào)用HelloBean類的setName()方法</h3>
  <jsp:getProperty name="helloBean" property="hello" />
</body>
</html>

運(yùn)行usebean.jsp聚磺,得到以下結(jié)果:

usebean.jsp

8.3. JSP動(dòng)作 jsp:element坯台,jsp:attribute和jsp:body

在某些情況下,我們可能想用xml數(shù)據(jù)回復(fù)用戶咧最,以換取HTML數(shù)據(jù)捂人。 結(jié)合使用<jsp:element><jsp:attribute><jsp:body>可使代碼易于閱讀矢沿。 讓我們來看看下面這些組合的例子滥搭。

JSP本質(zhì)上是帶有HTML標(biāo)記的文件。 因此捣鲸,最好使用HTML標(biāo)記或JSP定制標(biāo)記瑟匆,而不是在JSP中插入Java代碼。 這使代碼易于閱讀和理解栽惶。創(chuàng)建一個(gè)Java類文件和一個(gè)JSP文件愁溜,如下所示:

文件:Employee.java

package com.xntutor.beans;

public class Employee {

    private String empNo;
    private String empName;

    public Employee() {

    }

    public String getEmpNo() {
        return empNo;
    }

    public void setEmpNo(String empNo) {
        this.empNo = empNo;
    }

    public String getEmpName() {
        return empName;
    }

    public void setEmpName(String empName) {
        this.empName = empName;
    }

}

文件:jspelement.jsp

<?xml version="1.0" ?>
<%@ page pageEncoding="UTF-8"%>

<jsp:element name="data">
 
    <h3>請查看此頁面的源代碼</h3>     
    <%--  Create Employee object and setting value for its fields --%>     
    <jsp:useBean id="emp"
        class="com.xntutor.beans.Employee">
     
        <jsp:setProperty name="emp" property="empNo" value="E01" />
        <jsp:setProperty name="emp" property="empName" value="XiaoNiu" />
     
    </jsp:useBean>
     
     
    <jsp:element name="employee">
        <jsp:attribute name="empNo" trim="true">
            <jsp:getProperty name="emp" property="empNo" />        
        </jsp:attribute>
        <jsp:body>
            <jsp:getProperty name="emp" property="empName" />        
        </jsp:body>    
    </jsp:element>     
     
     
</jsp:element>

運(yùn)行上面代碼外厂,得到以下結(jié)果:

JSP動(dòng)作 jsp:element

讓我們看看在不使用jsp:element/attribute/body標(biāo)記的情況下的JSP代碼冕象。

<?xml version="1.0" ?>
<%@ page pageEncoding="UTF-8"%>
<data>
  <h3>Please view source of this page</h3>
  <%--  Create Employee and set value for its fields --%>
  <jsp:useBean id="emp"
      class="com.xntutor.beans.Employee">
      <jsp:setProperty name="emp" property="empNo" value="E01" />
      <jsp:setProperty name="emp" property="empName" value="XiaoNiu" />
  </jsp:useBean>    
  <employee empNo="<%=emp.getEmpNo()%>">
      <%=emp.getEmpName()%>    
  </employee>
</data>

9. JSP表達(dá)語言

通過JSP表達(dá)式語言(EL),可以輕松訪問存儲(chǔ)在JavaBeans組件中的應(yīng)用程序數(shù)據(jù)汁蝶。 JSP EL允許創(chuàng)建算術(shù)表達(dá)式和邏輯表達(dá)式渐扮。 在JSP EL表達(dá)式中,可以使用整數(shù)掖棉,浮點(diǎn)數(shù)墓律,字符串,布爾值的內(nèi)置常量truefalse以及null幔亥。
JSP EL已從2.0版添加到JSP耻讽。 這是一種替換表達(dá)式標(biāo)記<%=expression%>的用法。應(yīng)該在JSP頁面上的任何地方使用JSP EL代替使用JSP 表達(dá)式標(biāo)簽帕棉。

語法:

${expression}

下面來看看一個(gè)例子 -

文件:jspel.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>JSP表達(dá)式語言</title>
</head>
<body>
    <jsp:useBean id="emp" class="com.xntutor.beans.Employee">
        <jsp:setProperty name="emp" property="empNo" value="E1001" />
        <jsp:setProperty name="emp" property="empName" value="XNiu" />
    </jsp:useBean>
    <br> 員工:
    <input type="text" value="${emp.empNo}">
    <br> 員工姓名:
    <input type="text" value="${emp.empName}">
</body>
</html>

運(yùn)行上面示例代碼针肥,得到以下結(jié)果:

JSP表達(dá)式

10. 表單處理

在Web應(yīng)用程序中,處理表單是最重要的功能之一笤昨。下面是表單處理示例中涉及的兩個(gè)文件:

  • form.html
  • formProcessing.jsp

注意:這只是一個(gè)示例祖驱,我們應(yīng)該通過Servlet而不是JSP來處理表單數(shù)據(jù)。JSP應(yīng)該僅用于顯示內(nèi)容瞒窒。

用戶將在form.html上的表單上輸入信息捺僻,并將該信息發(fā)送到formProcessing.jsp,由formProcessing.jsp負(fù)責(zé)接收和處理。

表單處理

文件:form.html

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP表單處理(xntutor.com)</title>
</head>
<body>
    <h3>用戶注冊表單</h3>
    <div style="border: 1px solid #D0D0D0; width: 400px; padding: 10px;">

        <form method="GET" action="formProcessing.jsp">
            用戶名: <input type="text" name="userName" value=""> <br>
            密碼 : <input type="password" name="password" value="">

            <hr>

            性別: <input type="radio" name="gender" value="男"> 男 <input
                type="radio" name="gender" value="女"> 女
            <hr>
            地址: <br> <input type="text" name="address" size="50"> <input
                type="text" name="address" size="50"> <input type="text"
                name="address" size="50">
            <hr>
            <input type="submit" value="提交注冊">
        </form>

    </div>
</body>
</html>

文件:formProccess.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!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=UTF-8">
<title>表單處理結(jié)果</title>
</head>
<body>
    <h3>你提交的注冊信息:</h3>
    <%
        String userName = request.getParameter("userName");
        String password = request.getParameter("password");
        String gender = request.getParameter("gender");
        String[] addresses = request.getParameterValues("address");
    %>
    用戶名:<%=userName%><br>
    密碼:<%=password%><br>
    性別: <%=gender%><br>
    <%
        if (addresses != null) {
            for (String address : addresses) {
    %>

    地址:
    <%=address%><br>
    

    <%
        }
        }
    %>
</body>
</html>

運(yùn)行上面示例代碼匕坯,得到以下結(jié)果:

運(yùn)行結(jié)果

10.1. GET方法

form.html文件的代碼中表單使用GET方法提交:<form method="GET" action="...">束昵。運(yùn)行上面代碼

GET方法

填寫表單后提交。瀏覽器將地址欄更改為formProcessing.jsp頁面葛峻,并帶有用參數(shù)括起來的URL地址锹雏。這是由于使用表格的GET方法所致。

10.2. POST方法

如果在<form>上更改屬性method="POST"术奖,如下所示:

<!-- Form using POST method -->
<form method="POST" action="formProcessing.jsp">
 
.....
<!-- When you click Submit, the data will be send to the formProcessing.jsp -->
 
<input type="submit" value="Submit">
 
</form>

輸入數(shù)據(jù)礁遵,然后單擊提交。瀏覽器將地址欄更改為formProcessing.jsp頁面采记,URL中不包括附帶的參數(shù)和值佣耐,而數(shù)據(jù)則隱藏地發(fā)送到formProcessing.jsp中。

提交結(jié)果

10.3. 表單處理

formProcessing.jsp將獲取通過getParameter()發(fā)送給它的數(shù)據(jù)唧龄,數(shù)據(jù)可以附加在URL上(GET方法)兼砖,或包含在請求的正文中(POST方法)。

// 獲取參數(shù) 'userName' 值
String userName = request.getParameter("userName");
 
// 獲取參數(shù) 'address' 值列表
String[] addresses = request.getParameterValues("address");

用戶輸入多個(gè)地址信息既棺,并單擊提交后得到以下結(jié)果:


結(jié)果

11. Cookie處理

Cookies是存儲(chǔ)在客戶端計(jì)算機(jī)上的文本文件讽挟,保留它們用于各種信息跟蹤目的。 JSP使用基礎(chǔ)的servlet技術(shù)透明地支持HTTP cookie丸冕。

為了方便演示耽梅,下面創(chuàng)建兩個(gè)文件:CookieUtils.javademo/cookie.jsp

文件:CookieUtils.java

package com.xntutor.utils;

import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.JspWriter;

public class CookieUtils {

    public static void demoUserCookie(HttpServletRequest request, HttpServletResponse response, JspWriter out)
            throws IOException {
        boolean found = false;

        // Get an array of Cookies associated with this domain
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            String userName = null;
            String lastLoginDatetime = null;
            out.println("<h3>Cookies:</h3>");

            for (int i = 0; i < cookies.length; i++) {
                out.println(cookies[i].getName() + " : " + cookies[i].getValue() + "<br>");

                if (cookies[i].getName().equals("userName")) {
                    userName = cookies[i].getValue();
                } else if (cookies[i].getName().equals("lastLoginDatetime")) {
                    lastLoginDatetime = cookies[i].getValue();
                }
            }
            if (userName != null) {
                found = true;
                out.println("<h4>Last login info:</h4>");
                out.println("User Name: " + userName + "<br>");
                out.println("Last Login Datetime: " + lastLoginDatetime + "<br>");
            }
        }

        if (!found) {
            out.println("<h3>No cookies founds!, write some cookies into client computer</h3>");

            // Storing user information in cookies
            // for example userName.
            // Simulation Cookie stored on a user's computer, as soon as the user login is
            // successful
            String userName = "Xntutor.com";

            Cookie cookieUserName = new Cookie("userName", userName);
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            String lastLoginDatetime=df.format(new Date());
            //String lastLoginDatetime = df.format(now);
            out.println(lastLoginDatetime);
            Cookie cookieLoginDatetime = new Cookie("lastLoginDatetime", lastLoginDatetime);
            // Sets the maximum age in seconds for this Cookie. (24h)
            cookieUserName.setMaxAge(24 * 60 * 60);

            // Sets the maximum age in seconds for this Cookie. (24h)
            cookieLoginDatetime.setMaxAge(24 * 60 * 60);

            // Store in the user's computer.
            response.addCookie(cookieUserName);

            // Store in the user's computer.
            response.addCookie(cookieLoginDatetime);
        }
    }
}

文件:cookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="com.xntutor.utils.CookieUtils" %>    
<!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=UTF-8">
<title>Cookie示例(xntutor.com)</title>
</head>
<body>
<%
   CookieUtils.demoUserCookie(request,response, out);
 %>
 
 <a href ="cookie.jsp">重試一下</a>
</body>
</html>

運(yùn)行上面示例代碼胖烛,得到以下結(jié)果:

Cookies
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褐墅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子洪己,更是在濱河造成了極大的恐慌,老刑警劉巖竟贯,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件答捕,死亡現(xiàn)場離奇詭異,居然都是意外死亡屑那,警方通過查閱死者的電腦和手機(jī)拱镐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來持际,“玉大人沃琅,你說我怎么就攤上這事≈┯” “怎么了益眉?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我郭脂,道長年碘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任展鸡,我火速辦了婚禮屿衅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莹弊。我一直安慰自己涤久,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布忍弛。 她就那樣靜靜地躺著响迂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪剧罩。 梳的紋絲不亂的頭發(fā)上栓拜,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音惠昔,去河邊找鬼幕与。 笑死,一個(gè)胖子當(dāng)著我的面吹牛镇防,可吹牛的內(nèi)容都是我干的啦鸣。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼来氧,長吁一口氣:“原來是場噩夢啊……” “哼诫给!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起啦扬,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤中狂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扑毡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胃榕,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年瞄摊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勋又。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡换帜,死狀恐怖楔壤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情惯驼,我是刑警寧澤蹲嚣,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布递瑰,位于F島的核電站,受9級特大地震影響端铛,放射性物質(zhì)發(fā)生泄漏泣矛。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一禾蚕、第九天 我趴在偏房一處隱蔽的房頂上張望吴超。 院中可真熱鬧形耗,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽逗爹。三九已至绑蔫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間县习,已是汗流浹背涮母。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留躁愿,地道東北人叛本。 一個(gè)月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像彤钟,于是被迫代替她去往敵國和親来候。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評論 2 361

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

  • JSP總結(jié)(經(jīng)典) day1 JSP 定義: 1)Java Server Page, Java EE 組件逸雹,本...
    java日記閱讀 3,461評論 0 13
  • Part 1 @Description:Report of Servlet Basic, Part 1 @Date...
    susu2016閱讀 645評論 0 3
  • 1.學(xué)習(xí)內(nèi)容 JSP技術(shù)入門和常用指令 JSP的內(nèi)置對象&標(biāo)簽介紹 EL表達(dá)式&EL的內(nèi)置對象 2.JSP技術(shù)入門...
    WendyVIV閱讀 2,144評論 1 18
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,815評論 0 11
  • 前面講了servlet入門實(shí)踐現(xiàn)在開始介紹jsp入門實(shí)踐营搅,開發(fā)環(huán)境的搭建請參考我前面的tomcat的文章,jsp入...
    伊豚wall閱讀 3,371評論 2 56