jsp獲取上傳文件名:jsp上傳文件如何實現

本書簡介

書名為《輕量級JavaEE企業應用實戰》,是本人在學習JavaEE框架的時候閱讀的第一本書,本書對於框架及相關基礎知識講述的比較詳細和淺顯,適合初學者和需要全面了解JavaEE知識的人群。

本文內容為第二章的第1部分內容

JSP/Servlet相關技術詳解--那些已經模糊的基礎知識

WEB應用和web.xml

1.構建WEB應用

使用IDE創建項目?當然可以。但我們今天來學學不用IDE如何創建一個WEB應用。步驟如下:

(1)在任意目錄下新建一個文件夾作為應用根目錄,筆者以webDemo文件夾建立一個web應用

(2)在應用根目錄下創建一個WEB-INF文件夾(區分大小寫)

(3)進入Tomcat中找到任何一個默認WEB應用,將其WEB-INF下的web.xml文件複製到自己所創建的對應文件夾下

(4)配置web.xml文件(PS:相關配置我會另寫文章講解)

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
  version="3.1" metadata-complete="true">
</web-app> 

(5)在WEB-INF目錄下,新建兩個文件夾:classes和lib,這兩個文件夾都是用於保存WEB應用所需的Java類文件,區別是classes保存單個class文件;lib保存打包後的JAR文件

(6)現已建立了一個空WEB應用。將該應用複製到Tomcat的webapps路徑下

(7)將JSP文件放在WEB應用的根路徑下,就可以通過瀏覽器來訪問這些頁面了,URL路徑:
http://localhost:port/webDemo/*.jsp

如上所述,WEB應用的目錄結構如下:
<webDemo>
|--WEB-INF
|			|--classes
|			|--lib
|			|--web.xml
|--*.jsp

2.配置描述符web.xml

web.xml文件被稱為配置描述符,在Servlet2.5之前,WEB應用必須包含一個web.xml文件,且必須放在WEB-INF路徑下。WEB-INF是個特殊的文件夾,WEB容器會包含該文件夾下的內容,但瀏覽器無法訪問WEB-INF下的任何內容。

PS:對於Servlet3.0規範而言,web.xml不再是必須的,但通常還是建議保留

web.xml可以實現如下的所有配置功能

(1)配置JSP

(2)配置Servlet

(3)配置Listener

(4)配置Filter

(5)配置標籤庫

(6)配置JSP屬性

(7)配置JAAS授權認證

(8)配置資源引用

(9)配置WEB應用首頁

JSP基本原理

JSP/Servlet相關技術詳解--那些已經模糊的基礎知識

JSP文件必須在JSP伺服器內運行JSP文件必須生成Servlet才能執行每個JSP頁面的第一個訪問者速度很慢,因為必須等待JSP編譯成ServletJSP頁面的訪問者無須安裝任何客戶端,甚至不需要可以運行Java的運行環境,因為JSP頁面輸送到客戶端的是標準HTML頁面JSP頁面內容包含兩個部分:靜態部分(HTML標籤及靜態內容)、動態部分(受Java程序控制的內容)JSP頁面會被Tomcat在work編譯成兩個文件:*_jsp.java,*_jsp.class。此文件是一個標準Servlet類

JSP注釋

JSP注釋不會輸出到客戶端,格式如下:

<%-- 注釋內容 --%>

JSP聲明

JSP聲明用於聲明變數和方法

<%! 聲明部分 %>

JSP輸出

<%=表達式%>

PS: 表達式後不能有分號,效果等同於out.println

JSP腳本

<% 代碼 %>

PS:JSP腳本中的內容,將作為Servlet中service方法的方法體。因此在其中聲明的變數為局部變數,並且不可以在腳本中定義方法

JSP的編譯指令(3個)

編譯指令格式如下

<%@ 編譯指令 屬性名="屬性值"...%>

1.page:是針對當前頁面的指令,位於頁面頂端

JSP/Servlet相關技術詳解--那些已經模糊的基礎知識

屬性說明:

language:聲明JSP頁面使用的腳本語言,默認java
extends:指定JSP編譯後的類所繼承的父類或介面
import:用來導入包,默認導入的包有:java.lang.*,javax.servlet.*,javax.servlet.jsp.*,javax.serlvet.http.*
session:設置當前頁面是否需要session
buffer:指定輸出緩衝區大小。輸出緩衝區用於JSP內部對象out,默認8KB
autoFlush:當輸出緩衝區即將溢出時,是否需要強制輸出緩衝區的內容。true正常輸出,false產生異常
info:設置JSP程序說明,通過Servlet.getServletInfo()獲取該值
errorPage:指定錯誤處理頁面。如果頁面報錯,且未做異常處理,則跳轉錯誤處理頁面
isErrorPage:設置本JSP頁面是否為錯誤處理頁面
contentType:用於設置頁面的文件格式和編碼字符集。默認MIME類型為text/html;默認字符集為:ISO-8859-1
pageEncoding:設置頁面的編碼字符集

2.include:指定包含另一個頁面

語法如下:

<%@include file="相對路徑"%>

include指令可以將外部文件嵌入當前頁面,這是靜態include語句,它會把目標頁面的其他編譯指令也包含進來。即先把目標頁面的代碼融入當前頁面後再編譯。

PS:如果被包含的頁面需要經常改變,建議使用<jsp:include>,它是動態include語句

3.taglib:用戶定義和訪問自定義標籤

JSP的動作指令(7個)

jsp:forward:執行頁面轉向,將請求轉發到下一個頁面
jsp:param:用於傳遞參數,必須與其他支持參數的標籤一起使用
jsp:include:動態導入JSP頁面
jsp:plugin:用於下載JavaBean或Applet到客戶端執行
jsp:userBean:創建JavaBean實例
jsp:setProperty:設置JavaBean實例的屬性值
jsp:getProperty:獲取JavaBean實例的屬性值

1.forward指令

用於頁面轉發,可轉發到靜態頁面、動態頁面或Servlet。轉發後的請求參數不會丟失。

語法如下:

<jsp:forward page="相對路徑">
    <jsp:param name="key" value="value"/>
</jsp:forward>

轉發時可通過param指令傳遞參數,並通過如下方式獲取值:

<%=request.getParameter("key")%>

2.include指令

動態的頁面導入命令,它不會導入被包含頁面的編譯指令,僅將被導入頁面的body內容插入本頁。

語法如下:

<jsp:include page="相對路徑" flush="true">
    <jsp:param name="key" value="value"/>
</jsp:include> 

flush屬性設置輸出緩存是否轉移到被導入文件中,true則包含在被導入文件中,false則包含在原文件中。

動態導入和靜態導入的區別
(1)靜態導入是將被導入頁面的代碼完全融入,兩個頁面融合成一個Servlet;而動態導入則在Servlet中使用include方法來引入被導入頁面的內容
(2)靜態導入時被導入頁面的編譯指令會起作用;而動態導入時被導入頁面的編譯指令則失去作用
(3)動態導入可以傳遞額外的參數

3.useBean、setProperty、getProperty指令

這三個指令都是JavaBean相關指令。在我們將重複代碼定義成Java類的方法後,這三個指令可用於調用。

useBean語法如下:

<jsp:userBean id="name" class="classname" scope="page|request|session|application"/>
id:是JavaBean的實例名
class:指定JavaBean的實現類
scope:指定JavaBean實例的作用範圍,page(當前頁面有效)、request(本次請求有效)、session(本次會話有效)、application(當前應用一直有效)

setProperty語法如下:

<jsp:setProperty name="BeanName" property="propertyName" value="value"/>

getProperty語法如下:

<jsp:getProperty name="BeanName" property="propertyName"/>

舉個例子,如下圖:

JSP/Servlet相關技術詳解--那些已經模糊的基礎知識

4.param指令

param指令無法單獨使用,可以與如下指令結合使用:

(1)jsp:include

(2)jsp:forward

(3)jsp:plugin

JSP內置對象(9個)

application:ServletContext實例,代表所屬WEB應用本身
config:ServletConfig實例,代表應用配置信息
exception:Throwable實例,代表其他頁面的異常,只有當前頁面是錯誤處理頁面時可用
out:JspWriter實例,代表頁面輸出流,用於輸出內容
page:代表頁面本身,及生成的Servlet類
pageContext:PageContext實例,代表頁面上下文,可訪問頁面的共享數據
request:HttpServletRequest實例,該對象封裝了一次請求和請求參數
response:HttpServletResponse實例,代表伺服器響應
session:HttpSession實例,代表一次會話。當瀏覽器與站點建立連接時,會話開始;關閉瀏覽器時會話結束

PS:JSP內置對象要麼是Servlet方法的局部變數,要麼是方法的形參,所以我們可以直接在腳本中調用他們。

1.application對象

application兩個作用

  • 在整個WEB應用中讓多個JSP、Servlet之間共享數據(使用setAttribute,getAttribute)
  • 訪問WEB應用的配置參數(使用getInitParameter)

2.config對象

用於Servlet獲取配置參數(使用getInitParameter)

3.exception對象

exception對象僅在異常處理頁面有效

4.pageContext對象

使用pageContext可以訪問page、request、session、application範圍的變數

getAttribute(String name):取得page範圍內的屬性
getAttribute(String name, int scope):取得指定範圍內的屬性,
scope包含PageContext.PAGE_SCOPE、PageContext.REQUEST_SCOPE、PageContext.SESSION_SCOPE、PageContext.APPLICATION_SCOPE
setAttribute(String name, String value):設置page範圍內的屬性
setAttribute(String name, String value, int scope):取得制定範圍內的屬性

使用pageContext可以獲取其他內置對象

getRequest():獲取request對象
getResponse():獲取response對象
getServletConfig():獲取config對象
getServletContext():獲取application對象
getSession():獲取session對象

5.request對象

(1)獲取請求頭/請求參數

getParameter(String paramName):獲取請求參數的值
getParameterMap():獲取所有請求參數名和值組成的Map對象
getparameterValues(String name):獲取請求參數多個值時所組成的數組
getHeader(String name):獲取指定的請求頭的值

GET與POST

GET方式的請求:GET請求會將請求參數的名和值轉換成字元串,並附加在原URL之後,URL和參數之間以”?”分隔,多個參數之間以”&”分隔,且請求傳送的數據量較小,一般不大於2KB

POST方式的請求:POST請求參數的大小不受限制,往往取決於伺服器的限制,POST傳輸的數據量比GET傳輸的數據量大,且請求參數放在HTTP HEADER中傳輸,安全性相對較高

PS:

(1)不是每個表單域都會生成請求參數,只有帶有name屬性的表單域才行

(2)每個有name屬性的表單域對應一個請求參數

(3)如果有對個表單域有相同的name屬性,則多個表單域只生成一個請求參數,且該參數有多個值

(4)表單域的name屬性為請求參數名,value屬性為請求參數值

如果表單域設置了disabled=”disabled”屬性,則不會生成請求參數

(2)操作request範圍的屬性

setAttribute(String name, Object value):設置request範圍屬性
getAttribute(String name):獲取request範圍屬性

(3)執行forward或include

getRequestDispatcher(String path).forward(request, response):跳轉頁面
getRequestDispatcher(String path).include(request, response):包含頁面

6.response對象

(1)response響應生成非字元響應

getOutputStream():獲取輸出流

(2)重定向

sendRedirect("path"):重定向,重定向會丟失所有請求參數

forward與redirect對比

JSP/Servlet相關技術詳解--那些已經模糊的基礎知識

(3)增加cookie

addCookie(Cookie cookie):增加cookie
getCookies():獲取cookie數組

7.session對象

seesion代表一次用戶會話,即客戶端瀏覽器連接伺服器開始,到關閉瀏覽器結束。session屬性可在一次會話內在多個頁面間共享數據。session屬性值必須是可序列化的Java對象。

setAttribute(String attName, Object attValue):設置session屬性值
getAttribute(String attName):獲取session屬性值

爭議與思考

我們日常開發經常使用瀏覽器來訪問WEB應用,IE、360、火狐、谷歌你覺得哪個瀏覽器最好用?為什麼呢?評論區留言吧!

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/225895.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
投稿專員的頭像投稿專員
上一篇 2024-12-09 14:47
下一篇 2024-12-09 14:47

相關推薦

發表回復

登錄後才能評論