JSP--慕課網筆記
第1章 JAVA WEB簡介
1-1 什麼是WEB應用程式
JavaWeb簡介
- 什麼是Web應用程式
- 靜態頁面與動態頁面
- 搭建Java Web開發環境
- 手工編寫第一個Web應用程式
- MyEclipse配置
- 使用MyEclipse編寫第一個Web應用程式
- 修改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程式
- 在WebApps建立專案目錄
- 編寫index.jsp
- 建立WEB-INF目錄
- 測試執行
<html>
<head>
<title>第一個web應用</title>
</head>
<body>
第一個web應用
</body>
</html>
1-7 WEB-INF目錄詳解
WEB-INF目錄結構
- WEB-INF是Java的WEB應用的安全目錄。所謂安全就是客戶端無法訪問,只有服務端可以訪問的目錄。
- web.xml,專案部署檔案。
- classess資料夾,用於存放*.classess檔案。
- 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簡介
- Jsp簡介
- 常用動態網站開發技術
- Jsp頁面構成元素
- Jsp的生命週期
- 階段專案
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頁面生命週期
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)+" ";
}
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)+" ");
}
out.println("<br>");
}
}
%>
<h1>九九乘法表</h1>
<hr>
<%= printMultiTable1() %>
<br>
<% printMultiTable2(out); %>
</body>
</html>
第3章 JSP內建物件(上)
3-1 JSP內建物件簡介
- 內建物件簡介
- 四種作用域範圍
- out
- request/response
- session
- application
- 其他內建物件
- 專案案例
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]+" ");
}
}
%> <br>
密碼:<%=request.getAttribute("password") %><br>
請求體的MIME型別:<%=request.getContentType() %><br>
協議型別及版本號: <%=request.getProtocol() %><br>
伺服器主機名 :<%=request.getServerName() %><br>
伺服器埠號:<%=request.getServerPort() %><BR>