1. 程式人生 > >JSP--慕課網筆記

JSP--慕課網筆記

第1章 JAVA WEB簡介
1-1 什麼是WEB應用程式

JavaWeb簡介

  1. 什麼是Web應用程式
  2. 靜態頁面與動態頁面
  3. 搭建Java Web開發環境
  4. 手工編寫第一個Web應用程式
  5. MyEclipse配置
  6. 使用MyEclipse編寫第一個Web應用程式
  7. 修改Tomcat預設埠

什麼是Web應用程式
Web應用程式是一種可以通過Web訪問的應用程式。Web應用程式的一個最大好處是使用者
很容易訪問應用程式。使用者只需要有瀏覽器即可,不需要在安裝其他軟體。

為什麼要學習Web應用程式
我們說Web應用程式開發,是目前軟體開發領域的三大方向之一。
JAVAEE方向需求一直是很大的,也是就業比較容易和穩定的。

軟體領域三大方向

  • 桌面應用程式
  • Web應用程式
  • 嵌入式應用程式
1-2 靜態網頁與動態網頁

靜態網頁與動態網頁

  • 靜態網頁
    表現形式:網頁中的內容是固定,不會更新
    所需技術:HTML、CSS
  • 動態網頁
    表現形式:網頁中的內容通過程式動態顯示,自動更新。學習製作動態網頁。
    所需技術:HTML、CSS,資料庫技術,至少一門高階語言(Java、C#、Php),
    Javascript,XML等。主流的動態網頁尾本技術(Jsp/Asp.net/Php)
1-3 練習題

關於靜態網頁與動態網頁下說法錯誤的是( )。
動態網頁上可以顯示動態元素比如:動畫,視訊等,而靜態網頁無法顯示動態元素

動態網頁的內容一般是從資料庫裡面讀取出來的
動態網頁的內容的顯示是通過程式來實現的
學習動態網頁開發至少要掌握一門高階語言

動態網頁的動態指的是能與使用者進行互動,比如登入時輸入正確的使用者名稱和密碼,系統會提示登入成功。

1-4 搭建JAVA WEB開發環境

工欲善其事必先利其器。學會搭建Java Web學習JSP動態網站開發的最基本技能之一。

  • JDK
  • Tomcat
  • MyEclipse

Tomcat伺服器簡介

  • Apache Jakarta的開源專案
  • JSP/Servlet容器

Tomcat安裝與配置
安裝Tomcat–>配置環境變數–>測試首頁

CATALINA_HOME:Tomcat根目錄

1-5 Tomcat目錄結構

Tomcat伺服器的目錄結構

目錄 說明
/bin 存放各種平臺下用於啟動和停止Tomcat的命令檔案
/conf 存放Tomcat伺服器的各種配置檔案
/lib 存放Tomcat伺服器所需的各種JAR檔案
/logs 存放Tomcat的日誌檔案
/temp Tomcat執行時用於存放臨時檔案
webapps 當釋出web應用時,預設會將web應用的檔案釋出到此目錄
/work Tomcat把有JSP生成的Servlet放於此目錄下
1-6 手工編寫第一個Java Web程式

手工編寫第一個Web程式

  1. 在WebApps建立專案目錄
  2. 編寫index.jsp
  3. 建立WEB-INF目錄
  4. 測試執行
<html>
<head>
    <title>第一個web應用</title>
</head>
<body>
    第一個web應用
</body>
</html>
1-7 WEB-INF目錄詳解

WEB-INF目錄結構

  1. WEB-INF是Java的WEB應用的安全目錄。所謂安全就是客戶端無法訪問,只有服務端可以訪問的目錄。
  2. web.xml,專案部署檔案。
  3. classess資料夾,用於存放*.classess檔案。
  4. lib資料夾,用於存放需要的jar包。
1-8 MyEclipse開發Java Web程式

MyEclipse
MyEclipse,是在eclipse基礎上加上自己的外掛開發而成的功能
強大的企業級整合開發環境,主要用於Java、Java EE以及移動應用
的開發。MyEclipse的功能非常強大,支援也十分廣泛,尤其是對各種
開源產品的支援相當不錯。

MyEclipse與Eclipse的區別

  • MyEclipse:收費,集成了很多收費的外掛。比如:SSH,安卓等。
  • Eclipse:免費開源,不包含任何附加功能的外掛。

MyEclipse配置JRE
windows->Preference->Java->Installed JREs

MyEclipse整合Tomcat伺服器
windows->Preference->MyEclipse->Server->Tomcat

MyEclipse Web專案目錄結構
專案名稱
java源程式
類庫
專案根目錄
資原始檔

1-9 理解Web專案虛擬路徑

理解專案的虛擬路徑
選擇專案->屬性->MyEclipse->Web->檢視專案虛擬路徑

1-10 Eclipse開發Java Web程式

Dynamic Web Project

<%@ page language="java" contentType="text/html; charset=utf-8"
    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=utf-8">
<title>Insert title here</title>
</head>
<body>
hello world !
</body>
</html>
1-11 修改Tomcat伺服器預設埠號

修改conf/server.xml

<Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
1-12 練習題

修改Tomcat伺服器預設埠號需要修改的配置檔案是( )
server.xml

第2章 JSP基礎語法
2-1 JSP簡介
  1. Jsp簡介
  2. 常用動態網站開發技術
  3. Jsp頁面構成元素
  4. Jsp的生命週期
  5. 階段專案

JSP全名為Java Server Pages,其根本是一個簡化的Servlet設計,
他實現了在Java當中使用HTML標籤。Jsp是一種動態網頁技術標準也是
JAVAEE的標準。JSP與Servlet一樣,是在伺服器端執行的。

2-2 常見動態網站開發技術對比

常見動態網站開發技術對比

  • Jsp:Java平臺,安全性高,適合開發大型的,企業級的Web應用程式
  • Asp.net:.Net平臺,簡單易學。但是安全性及跨平臺性差。
  • Php:簡單,高效,成本低開發週期短,特別適合中小型企業的Web應用開發。
    (LAMP:Linux+Apache+MySql+PHP)
2-3 JSP頁面元素簡介及page指令

JSP頁面組成部分

  • 指令
  • 表示式
  • 小指令碼
  • 宣告
  • 註釋
  • 靜態內容

Jsp指令

  • page指令:通常位於jsp頁面的頂端,同一個頁面可以有多個page指令。
  • include指令:將一個外部檔案嵌入到JSP檔案中,同時解析這個頁面中的JSP語句。
  • taglib指令:使用標籤庫定義新的自定義標籤,在JSP頁面中啟用定製行為。

page指令語法
<%@ page 屬性1=”屬性值” 屬性2=”屬性值1,屬性值2”…
屬性n=”屬性值n”%>

屬性 描述 預設值
language 指定JSP頁面使用的指令碼語言 java
import 通過該屬性來引用指令碼語言中使用到的類檔案
contentType 用來指定JSP頁面所採用的編碼方式 text/html,ISO-8859-1
2-4 練習題

以下哪個不屬於JSP的三大指令元素( )
import

include
page
taglib

2-5 JSP註釋

在JSP頁面的註釋

  • HTML的註釋: 客戶端可見
  • JSP的註釋:<%– html註釋 –> 客戶端不可見
  • JSP指令碼註釋://當行註釋 /**/多行註釋 客戶端不可見
2-6 練習題

以下哪個註釋是客戶端無法檢視到的註釋( )
<%– 這裡是註釋–%>

2-7 JSP指令碼

在JSP頁面中執行的java程式碼
語法:
<% Java程式碼 %>

<%

    out.println("大家好!");

%>
2-8 JSP宣告

在JSP頁面中定義變數或者方法。
語法:
<%! Java程式碼 %>

<%! 
    String s = "張三";
    int add(int a,int b){
        return a+b;
    }
%>
2-9 JSP表示式

在JSP頁面中執行的表示式。
語法:
<%= 表示式 %> //注意:表示式不以分號結尾

<p>你好,<%= s %></p>
<p>1+1= <%= add(1,1) %></p>
2-10 JSP頁面生命週期
Created with Raphaël 2.1.0使用者發出請求index.jsp是否是第一次請求?JSP引擎把該JSP檔案轉換成為一個Servlet,生成位元組碼檔案,並執行jspInit()生成的位元組碼檔案解析執行,jspService()yesno

jspservice()方法被呼叫來處理客戶端的請求。對每一個請求,JSP引擎建立
一個新的執行緒來處理該請求。如果有多個客戶端同時請求該JSP檔案,則JSP
引擎會建立多個執行緒。每個客戶端請求對應一個執行緒。以多執行緒方式執行可以
大大降低對系統資源的需求,提高系統的併發量及響應時間。但是也要注意多線
程的程式設計帶來的同步問題,由於該Servlet始終駐留在記憶體,所以相應是非常快的。

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%@ page import="java.text.*" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <h1>JSP生命週期</h1>
    <hr>
    <%
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String s = sdf.format(new Date());
    %>
    今天是:<%= s %>
  </body>
</html>
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private javax.el.ExpressionFactory _el_expressionfactory;
  private org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public void _jspInit() {
    _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
        throws java.io.IOException, javax.servlet.ServletException {

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html; charset=utf-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("\r\n");

String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

      out.write("\r\n");
      out.write("\r\n");
      out.write("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\r\n");
      out.write("<html>\r\n");
      out.write("  <head>\r\n");
      out.write("    <base href=\"");
      out.print(basePath);
      out.write("\">\r\n");
      out.write("    \r\n");
      out.write("    <title>My JSP 'index.jsp' starting page</title>\r\n");
      out.write("\t<meta http-equiv=\"pragma\" content=\"no-cache\">\r\n");
      out.write("\t<meta http-equiv=\"cache-control\" content=\"no-cache\">\r\n");
      out.write("\t<meta http-equiv=\"expires\" content=\"0\">    \r\n");
      out.write("\t<meta http-equiv=\"keywords\" content=\"keyword1,keyword2,keyword3\">\r\n");
      out.write("\t<meta http-equiv=\"description\" content=\"This is my page\">\r\n");
      out.write("\t<!--\r\n");
      out.write("\t<link rel=\"stylesheet\" type=\"text/css\" href=\"styles.css\">\r\n");
      out.write("\t-->\r\n");
      out.write("  </head>\r\n");
      out.write("  \r\n");
      out.write("  <body>\r\n");
      out.write("   \t<h1>JSP生命週期</h1>\r\n");
      out.write("   \t<hr>\r\n");
      out.write("   \t");

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
        String s = sdf.format(new Date());

      out.write("\r\n");
      out.write("   \t今天是:");
      out.print( s );
      out.write("\r\n");
      out.write("  </body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}
2-11 練習題

當用戶第一次請求一個jsp頁面時,首先被執行的方法是( )
構造方法

jspInit()
jspService()
jspDestroy()

第一次請求一個jsp頁面時,首先被執行的方法是構造方法

2-12 階段專案
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
   <%!
        String printMultiTable1()
        {
            String s = "";
            for(int i=1;i<=9;i++){
                for(int j=1;j<=i;j++){
                    s += i + "*" + j + "=" +(i*j)+"&nbsp;&nbsp;&nbsp;&nbsp;";
                }
                s += "<br>";
            }
            return s;
        }

        void printMultiTable2(JspWriter out) throws Exception
        {
            for(int i=1;i<=9;i++){
                for(int j=1;j<=i;j++){
                    out.println( i + "*" + j + "=" +(i*j)+"&nbsp;&nbsp;&nbsp;&nbsp;");
                }
                out.println("<br>");
            }
        }
   %>



    <h1>九九乘法表</h1>
    <hr>
    <%= printMultiTable1() %>
    <br>
    <% printMultiTable2(out); %>
  </body>
</html>
第3章 JSP內建物件(上)
3-1 JSP內建物件簡介
  1. 內建物件簡介
  2. 四種作用域範圍
  3. out
  4. request/response
  5. session
  6. application
  7. 其他內建物件
  8. 專案案例

JSP內建物件是Web容器建立的一組物件,不使用new關鍵字就可以使用的內建物件。

int[] value = {60,70,80};
  for(int i:value){
      out.println(i);
  }

九大內建物件

  • out
  • request
  • response
  • session
  • application
  • Page
  • pageContext
  • exception
  • config
3-2 練習題

以下哪個不屬於jsp九大內建物件( )
pageConfig

exception
page
pageContext

3-3 web程式的請求與響應模式

Web程式的請求響應模式
使用者傳送請求(request)
伺服器給使用者相應(response)

3-4 out物件

什麼是緩衝區
緩衝區:Buffer,所謂緩衝區就是記憶體中的一塊區域用來儲存臨時資料。

IO輸出最原始的就是一個位元組一個位元組輸出,就像一粒一粒吃一樣,但效率太差。

剛煮好的米飯一粒一粒吃不知道要猴年馬月。。。把米飯放到碗裡,一碗一碗吃豈不痛快!

out物件是JspWriter類的例項,是向客戶端輸出內容的常用物件。
常用方法如下:

  • void println() 向客戶端列印字串
  • void clear() 清除緩衝區的內容,如果在flush之後呼叫會丟擲異常
  • void clearBuffer() 清除緩衝區的內容,如果在flush之後調不用會丟擲異常
  • void flush() 將緩衝區內容輸出到客戶端
  • int getBufferSize() 返回快取區以位元組數的大小,如不設緩衝區則為0
  • int getRemaining() 返回緩衝區還剩餘多少可用
  • boolean isAutoFlush() 返回緩衝區滿時,是自動清空還是丟擲異常
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <h1>out內建物件</h1>
    <% 
       out.println("<h2>靜夜思</h2>");
       out.println("床前明月光<br>");
       out.println("疑是地上霜<br>");
       out.flush();
       //out.clear();//這裡會丟擲異常。
       out.clearBuffer();//這裡不會丟擲異常。
       out.println("舉頭望明月<br>");
       out.println("低頭思故鄉<br>");

    %>
        緩衝區大小:<%=out.getBufferSize() %>byte<br>
        緩衝區剩餘大小:<%=out.getRemaining() %>byte<br>
       是否自動清空緩衝區:<%=out.isAutoFlush() %><BR>    
  </body>
</html>
3-5 練習題

執行以下jsp指令碼輸出效果是( )

<%
 out.println("床前明月光");
 out.flush();
 out.clear();
 out.println("疑是地上霜");
%>

在瀏覽器中只輸出床前明月光

在瀏覽器中輸出“床前明月光”,控制檯會輸出異常資訊。

3-6 get與post提交方式的區別

get與post區別

表單有兩種提交方式:get與post

  • get:以明文的方式通過URL提交資料,資料在URL中可以看到。提交資料
    量最多不超過2KB。安全性較低但效率比post方式高。適合提交資料量不大,
    安全性不高的資料。比如:搜尋、查詢等功能。
  • post:將使用者提交的資訊封裝在HTML HEADER內。適合提交資料量大,安全
    性高的使用者資訊。比如:註冊、修改、上傳等功能。
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'login.jsp' starting page</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
    <h1>使用者登入</h1>
    <hr>
    <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 colspan="2"><input  type="submit" value="登入"></td>
       </tr>
     </table>
    </form>
  </body>
</html>
3-7 request物件(上)

request物件
客戶端的請求資訊被封裝在request物件中,通過它才能瞭解到客戶的請求,然後
響應。它是HttpServletRequest類的例項。request物件具有請求域,即完成客戶端
請求之前,該物件一直有效。常用方法如下:

  • String getParameter(String name) 返回name指定引數的引數值
  • String[] getParameterValues(String name) 返回包含引數name的所有值的陣列
  • void setAttribute(String,Object) 儲存此請求中的屬性
  • object getAttribute(String name) 返回指定屬性的屬性值
  • String getContentType() 得到請求體的MIME型別
  • String getProtocol() 返回請求用的協議型別及版本號
  • String getServerName() 返回接受請求的伺服器主機名
3-8 request物件(下)
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <h1>使用者註冊</h1>
    <hr>
    <% 
       int number=-1;
       //說明使用者第一次訪問頁面,計數器物件還未建立
       if(application.getAttribute("counter")==null)
       {
           application.setAttribute("counter", 0);
       }
       number = Integer.parseInt(application.getAttribute("counter").toString());
       number++;
       application.setAttribute("counter", number);
    %>
    <!-- <form name="regForm" action="request.jsp" method="post"> -->
    <form name="regForm" action="response.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>
    <br>
    <br>
    <a href="request.jsp?username=李四">測試URL傳引數</a>

    <br>
    <br>
    <center>
             您是第<%=number %>位訪問本頁面的使用者。
    </center>
  </body>
</html>
<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>My JSP 'index.jsp' starting page</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->
  </head>

  <body>
    <h1>request內建物件</h1>
    <% 
       request.setCharacterEncoding("utf-8"); //解決中文亂碼問題,無法解決URL傳遞中文出現的亂碼問題。
       request.setAttribute("password", "123456");

    %>
        使用者名稱:<%=request.getParameter("username") %><br>   
        愛好 :<% 
           if(request.getParameterValues("favorite")!=null)
           {
               String[] favorites = request.getParameterValues("favorite");
               for(int i=0;i<favorites.length;i++)
               {
                  out.println(favorites[i]+"&nbsp;&nbsp;");
               }
            }
        %> <br>
         密碼:<%=request.getAttribute("password") %><br> 
         請求體的MIME型別:<%=request.getContentType() %><br>
         協議型別及版本號:  <%=request.getProtocol() %><br>
         伺服器主機名 :<%=request.getServerName() %><br>
         伺服器埠號:<%=request.getServerPort() %><BR>