生活随笔
收集整理的這篇文章主要介紹了
jsp
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
jsp概念
JSP全稱Java Server Pages
簡化的servlet設計,在html標簽中嵌套Java代碼,用以高效開發web應用的動態標簽。
替換顯示頁面部分的servlet(使用*.jsp文件替換XXXJSP.java)
jsp結構
- 網絡服務器需要一個 JSP 引擎,也就是一個容器來處理 JSP 頁面。容器負責截獲對 JSP 頁面的請求
- JSP 容器與 Web 服務器協同合作,為JSP的正常運行提供必要的運行環境和其他服務,并且能夠正確識別專屬于 JSP 網頁的特殊元素。
詳細解析圖
大體圖(概括)
jsp的生命周期
-
以下是JSP生命周期中所走過的幾個階段:
編譯階段:servlet容器編譯servlet源文件,生成servlet類,分為三個步驟---------------------------------------------------* 解析JSP文件。* 將JSP文件轉為servlet。* 編譯servlet。初始化階段:加載與JSP對應的servlet類,創建其實例,并調用它的初始化方法---------------------------------------------------* 容器載入JSP文件后,它會在為請求提供任何服務前調用jspInit()方法。* 如果您需要執行自定義的JSP初始化任務,復寫jspInit()方法就行了執行階段:調用與JSP對應的servlet實例的服務方法---------------------------------------------------* 當JSP網頁完成初始化后,JSP引擎將會調用_jspService()方法。銷毀階段:調用與JSP對應的servlet實例的銷毀方法,然后銷毀servlet實例---------------------------------------------------* jspDestroy()方法在JSP中等價于servlet中的銷毀方法
-
生命周期的代碼練習
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>life
</title
>
</head
>
<body>
<%!private int initVar
=0;private int serviceVar
=0;private int destoryVar
=0;
%>
<%!public void jspInit(){initVar
++;System
.out
.println("jspInit(): JSP被初始化了"+initVar
+"次");}public void jspDestory(){destoryVar
++;System
.out
.println("jspDestroy(): JSP被銷毀了"+destoryVar
+"次");}
%>
<%serviceVar
++;System
.out
.println("_jspService(): JSP共響應了"+serviceVar
+"次請求");String content1
="初始化次數 : "+initVar
;String content2
="響應客戶請求次數 : "+serviceVar
;String content3
="銷毀次數 : "+destoryVar
;
%>
<h1>菜鳥教程jsp測試實例
</h1
>
<p><%=content1
%></p
>
<p><%=content2
%></p
>
<p><%=content3
%></p
>
</body
>
</html
>
jsp的語法
腳本程序可以包含任意量的Java語句、變量、方法或表達式,只要它們在腳本語言中是有效的。
<% 代碼片段
%>
<jsp
:scriptlet
>代碼片段
</jsp
:scriptlet
>
任何文本、HTML標簽、JSP元素必須寫在腳本程序的外面。
- 中文編碼問題
- 如果我們要在頁面正常顯示中文,我們需要在 JSP 文件頭部添加以下代碼:
<%@ page language
="java" contentType
="text/html; charset=UTF-8"pageEncoding
="UTF-8"%>
- <%-- 該部分注釋在網頁中不會被顯示–%>
- 快捷鍵:單行注釋 Ctrl+/
- 多行注釋: Shift+Ctrl+/
<jsp
:action_name attribute
="value" />
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>Title
</title
><%int day
=3;%>
</head
>
<body>
<h3>IF
...ELSE 實例
</h3
><%if(day
> 1& day
<7){%><h4>今天是周內
</h4
><%}else {%><h4>今天不是周內
</h4
><%}%></body
>
</html
>
<%@ page language
="java" contentType
="text/html; charset=UTF-8"pageEncoding
="UTF-8"%>
<%! int day
= 3; %>
<!DOCTYPE html
>
<html>
<head><meta charset
="utf-8"><title>菜鳥教程
(runoob
.com
)</title
><%int day
=3;%>
</head
>
<body>
<h3>SWITCH
...CASE 實例
</h3
>
<%switch(day
) {case 0:out
.println("星期天");break;case 1:out
.println("星期一");break;case 2:out
.println("星期二");break;case 3:out
.println("星期三");break;case 4:out
.println("星期四");break;case 5:out
.println("星期五");break;default:out
.println("星期六");}
%>
</body
>
</html
>
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>for循壞練習
</title
><%int a
;%>
</head
>
<body><h3>for循環的練習
</h3
><%for (a
=1;a
<=5;a
++){out
.println(a
);}%>
</body
>
</html
>
<%@ page language
="java" contentType
="text/html; charset=UTF-8"pageEncoding
="UTF-8"%>
<%! int fontSize
=0; %>
<!DOCTYPE html
>
<html>
<head><meta charset
="utf-8"><title>菜鳥教程
(runoob
.com
)</title
>
</head
>
<body>
<h3>While 循環實例
</h3
>
<%while ( fontSize
<= 3){ %>
<font color
="green" size
="<%= fontSize %>">菜鳥教程
</font
><br
/>
<%fontSize
++;%>
<%}%>
</body
>
</html
>
jsp 的隱式對象
JSP隱式對象是JSP容器為每個頁面提供的Java對象,開發者可以直接使用它們而不用顯式聲明。
JSP隱式對象也被稱為預定義變量。
-
request對象
每當客戶端請求一個JSP頁面時,JSP引擎就會制造一個新的request對象來代表這個請求。
-
response對象
當服務器創建request對象時會同時創建用于響應這個客戶端的response對象。response對象也定義了處理HTTP頭模塊的接口。通過這個對象,開發者們可以添加新的cookies,時間戳,HTTP狀態碼等等。
-
out對象
用來在response對象中寫入內容。是一個輸出流
-
session對象
和Java Servlets中的session對象有一樣的行為。session對象用來跟蹤在各個客戶端請求間的會話。
-
application對象
這個對象在JSP頁面的整個生命周期中都代表著這個JSP頁面。這個對象在JSP頁面初始化時被 創建,隨著jspDestroy()方法的調用而被移除。通過向application中添加屬性,則所有組成您web應用的JSP文件都能訪問到這些屬性。
-
config對象
這個對象允許開發者訪問Servlet或者JSP引擎的初始化參數,比如文件路徑等。
-
pageContext 對象
pageContext對象是javax.servlet.jsp.PageContext 類的實例,用來代表整個JSP頁面。這個對象主要用來訪問頁面信息,同時過濾掉大部分實現細節。這個對象存儲了request對象和response對象的引用。application對象,config對象,session對象,out對象可以通過訪問這個對象的屬性來導出。pageContext對象也包含了傳給JSP頁面的指令信息,包括緩存信息,ErrorPage URL,頁面scope等。PageContext類定義了一些字段,包括PAGE_SCOPE,REQUEST_SCOPE,SESSION_SCOPE, APPLICATION_SCOPE。它也提供了40余種方法,有一半繼承自javax.servlet.jsp.JspContext 類。其中一個重要的方法就是 removeAttribute(),它可接受一個或兩個參數。比如,pageContext.removeAttribute("attrName") 移除四個scope中相關屬性,但是下面這種方法只移除特定 scope 中的相關屬性:
-
page 對象
這個對象就是頁面實例的引用。它可以被看做是整個JSP頁面的代表。page 對象就是this對象的同義詞。
-
exception 對象
exception 對象包裝了從先前頁面中拋出的異常信息。它通常被用來產生對出錯條件的適當響應。
-
jsp動作屬性
jsp:include動作元素
jsp:include動作元素用來包含靜態和動態的文件。該動作把指定文件插入正在生成的頁面
而這里的jsp:include動作不同,插入文件的時間是在頁面被請求的時候。
<jsp
:include page
="相對 URL 地址" flush
="true" />
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>date
</title
>
</head
>
<body><p>今天是你的生日:
<%= (new java.util.Date()).toLocaleString() %></p
>
</body
>
</html
>
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>main
</title
>
</head
>
<body><h2>include實例
</h2
><jsp
:include page
="07-date.jsp" flush
="true"/>
</body
>
</html
>
2. jsp:useBean動作元素
用來加載一個將在JSP頁面中使用的JavaBean
在類載入后,我們既可以通過 jsp:setProperty 和 jsp:getProperty 動作來修改和檢索bean的屬性。
<jsp
:useBean id
="name" class="package.class" />
jsp:setProperty動作元素
jsp:setProperty用來設置已經實例化的Bean對象的屬性,
jsp:getProperty動作元素
jsp:getProperty動作提取指定Bean屬性的值,轉換成字符串,然后輸出
package com
.lty
.pojo
;
public class Student {private String name
;public String
getName() {return name
;}public void setName(String name
) {this.name
= name
;}
}
<%@ page language
="java" contentType
="text/html; charset=UTF-8"pageEncoding
="UTF-8"%>
<!DOCTYPE html
>
<html>
<head><meta charset
="utf-8"><title>Title
</title
>
</head
>
<body><h3>jsp
:useBean動作元素案例
</h3
><jsp
:useBean id
="student" class="com.lty.pojo.Student"/><%--設置學生的姓名
--%><jsp
:setProperty name
="student" property
="name" value
="lty"/><p>輸出學生的信息
</p
><%--獲取學生的姓名
--%><jsp
:getProperty name
="student" property
="name"/></body
>
</html
>
5. jsp:forward 動作元素
jsp:forward動作把請求轉到另外的頁面。jsp:forward標記只有一個屬性page。
page屬性包含的是一個相對URL。page的值既可以直接給出,也可以在請求的時候動態計算,可以是一個JSP頁面或者一個 Java Servlet.
<jsp
:forward page
="相對 URL 地址" />
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>date
</title
>
</head
>
<body><p>今天是你的生日:
<%= (new java.util.Date()).toLocaleString() %></p
>
</body
>
</html
>
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>main
</title
>
</head
>
<body><%--<h2>include實例
</h2
><jsp
:include page
="07-date.jsp" flush
="true"/>--%><h2>forward動作實例
</h2
><jsp
:forward page
="07-date.jsp"/>
</body
>
</html
>
訪問的是main頁面,因為有<jsp:forward page=“07-date.jsp”/>,
所以最后我們看到的是date頁面
如下圖所示
jsp:plugin動作元素
jsp:plugin動作用來根據瀏覽器的類型,插入通過Java插件 運行Java Applet所必需的OBJECT或EMBED元素。如果需要的插件不存在,它會下載插件,然后執行Java組件。 Java組件可以是一個applet或一個JavaBean。plugin動作有多個對應HTML元素的屬性用于格式化Java 組件。param元素可用于向Applet 或 Bean 傳遞參數。
<jsp
:plugin type
="applet" codebase
="dirname" code
="MyApplet.class"width
="60" height
="80"><jsp
:param name
="fontcolor" value
="red" /><jsp
:param name
="background" value
="black" /><jsp
:fallback
>Unable to initialize Java Plugin
</jsp
:fallback
></jsp
:plugin
>
jsp:element 、 jsp:attribute、 jsp:body動作元素
jsp:element 、 jsp:attribute、 jsp:body動作元素動態定義XML元素。動態是非常重要的,這就意味著XML元素在編譯時是動態生成的而非靜態。
<%@ page language
="java" contentType
="text/html; charset=UTF-8"pageEncoding
="UTF-8"%>
<!DOCTYPE html
>
<html>
<head><meta charset
="utf-8"><title>菜鳥教程
(runoob
.com
)</title
>
</head
>
<body>
<jsp
:element name
="xmlElement">
<jsp
:attribute name
="xmlElementAttr">屬性值
</jsp
:attribute
><jsp
:body
>XML 元素的主體
</jsp
:body
>
</jsp
:element
>
</body
>
</html
>
jsp:text動作元素
元素允許在JSP頁面和文檔中使用寫入文本的模板,語法格式如下:
<jsp
:text
>模板數據
</jsp
:text
>
jsp客戶端請求
https://www.runoob.com/jsp/jsp-client-request.html
jsp服務器響應
https://www.runoob.com/jsp/jsp-server-response.html
jsp的表單處理
我們在瀏覽網頁的時候,經常需要向服務器提交信息,并讓后臺程序處理。瀏覽器中使用 GET 和 POST 方法向服務器提交數據。
GET方法將請求的編碼信息添加在網址后面,網址與編碼信息通過"?"號分隔。如下所示:
http
://www
.runoob
.com
/hello
?key1
=value1
&key2
=value2
GET方法是瀏覽器默認傳遞參數的方法,一些敏感信息,如密碼等建議不使用GET方法。
用get時,傳輸數據的大小有限制 (注意不是參數的個數有限制),最大為1024字節。
一些敏感信息,如密碼等我們可以通過POST方法傳遞,POST提交數據是隱式的。
POST提交數據是不可見的,GET是通過在url里面傳遞的(可以看一下你瀏覽器的地址欄)。
JSP使用getParameter()來獲得傳遞的參數,getInputStream()方法用來處理客戶端的二進制數據流的請求。
- getParameter(): 使用 request.getParameter() 方法來獲取表單參數的值。
- getParameterValues(): 獲得如checkbox類(名字相同,但值有多個)的數據。 接收數組變量 ,如checkbox類型
- getParameterNames():該方法可以取得所有變量的名稱,該方法返回一個 Enumeration。
- getInputStream():調用此方法來讀取來自客戶端的二進制數據流。
<%@ page language
="java" contentType
="text/html; charset=UTF-8"pageEncoding
="UTF-8"%>
<%@ page
import="java.io.*,java.util.*" %>
<html>
<head><title>表單接受信息
</title
>
</head
>
<body>
<h3>使用get方法讀取表單的信息
</h3
><ul><li><p><b>站點名:
</b
><%= request
.getParameter("name")%></p
></li
><li><p><b>網址:
</b
><%= request
.getParameter("url")%></p
></li
></ul
></body
>
</html
>
- 當訪問如下路徑的時候。會出現下以效果
http://localhost:8080/web_jsp/11-get.jsp?name=%E8%8F%9C%E9%B8%9F%E6%95%99%E7%A8%8B&url=http://ww.runoob.com
- 編寫一個html頁面來傳入訪問參數
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title
</title>
</head>
<body><form action="11-get.jsp" method="get">站點名:
<input type="text" name="name">網址名:
<input type="text" name="url"><input type="submit" value="提交"></form>
</body>
</html>
- 當訪問http://localhost:8080/web_jsp/mian%E8%AE%BF%E9%97%AEget%E9%A1%B5%E9%9D%A2.html
時,界面如下
- 當輸入參數之后提交表單結果如下
- 使用表單的 POST 方法實例
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>Title
</title
><meta charset
="utf-8">
</head
>
<body>
<h1>使用 POST 方法讀取數據
</h1
>
<ul><li><p><b>站點名
:</b
><%String name
= new String((request
.getParameter("name")).getBytes("ISO-8859-1"),"UTF-8");%><%=name
%></p
></li
><li><p><b>網址
:</b
><%= request
.getParameter("url")%></p
></li
>
</ul
></body
>
</html
>
<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>測試post
</title>
</head>
<body><form action="12-post.jsp" method="POST">站點名:
<input type="text" name="name"><br />網址:
<input type="text" name="url" /><input type="submit" value="提交" />
</form></body>
</html>
- 傳遞 Checkbox 數據到JSP程序
- html頁面
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title
</title>
</head>
<body><form action="13-checkedPost.jsp" method="post"><input type="checkbox" name="google" checked="checked">google
<input type="checkbox" name="lty">lty
<input type="checkbox" name="zly" checked="checked">zly
<input type="submit" value="選擇"></form>
</body>
</html>
<%--Created by IntelliJ IDEA
.User
: adminDate
: 2020/12/22Time
: 14:52To change
this template use File
| Settings
| File Templates
.
--%>
<%@ page contentType
="text/html;charset=UTF-8" language
="java" %>
<html>
<head><title>Title
</title
>
</head
>
<body><h3>從復選框中選擇數據
</h3
><ul><li><p><b>google是否選中
</b
><%=request
.getParameter("google")%></p
></li
><li><p><b>lty是否選中
</b
><%=request
.getParameter("lty")%></p
></li
><li><p><b>zly是否選中
</b
><%=request
.getParameter("zly")%></p
></li
></ul
></body
>
</html
>
運行結果
<%Enumeration paramNames
= request
.getParameterNames();while(paramNames
.hasMoreElements()) {String paramName
= (String
)paramNames
.nextElement();out
.print("<tr><td>" + paramName
+ "</td>\n");String paramValue
= request
.getParameter(paramName
);out
.println("<td> " + paramValue
+ "</td></tr>\n");}
%>
jsp過濾器[存在疑難問題]
JSP Cookie 處理
Cookie 是存儲在客戶機的文本文件,它們保存了大量軌跡信息。在 Servlet 技術基礎上,JSP 顯然能夠提供對 HTTP cookie 的支持
- JSP Cookie 處理需要對中文進行編碼與解碼,方法如下:
String str = java.net.URLEncoder.encode(“中文”, “UTF-8”); //編碼
String str = java.net.URLDecoder.decode(“編碼后的字符串”,“UTF-8”); // 解碼
Cookie 通常在 HTTP 信息頭中設置(雖然 JavaScript 能夠直接在瀏覽器中設置 cookie)。在 JSP 中,設置一個 cookie 需要發送如下的信息頭給服務器:
HTTP/1.1 200 OKDate: Fri, 04 Feb 2015 21:03:38 GMTServer: Apache/1.3.9 (UNIX) PHP/4.0b3Set-Cookie: name=runoob; expires=Friday, 04-Feb-17 22:03:38 GMT; path=/; domain=runoob.comConnection: closeContent-Type: text/html
(1)創建一個 cookie 對象: 調用 cookie 的構造函數,使用一個 cookie 名稱和值做參數,它們都是字符串。
Cookie cookie
= new Cookie("key","value");
設置有效期:調用 setMaxAge() 函數表明 cookie 在多長時間(以秒為單位)內有效。下面的操作將有效期設為了 24 小時。
cookie
.setMaxAge(60*60*24);
(3) 將 cookie 發送至 HTTP 響應頭中:調用 response.addCookie() 函數來向 HTTP 響應頭中添加 cookie。
response
.addCookie(cookie
);
<%String str
= URLEncoder
.encode(request
.getParameter("name"),"utf-8"); Cookie name
= new Cookie("name",str
);Cookie url
= new Cookie("url",request
.getParameter("url"));name
.setMaxAge(60*60*24); url
.setMaxAge(60*60*24); response
.addCookie( name
);response
.addCookie( url
);
%>
調用 request.getCookies() 方法來獲得一個 javax.servlet.http.Cookie 對象的數組,然后遍歷這個數組,使用 getName() 方法和 getValue() 方法來獲取每一個 cookie 的名稱和值。
<%Cookie cookie
= null
;Cookie
[] cookies
= null
;cookies
= request
.getCookies();if( cookies
!= null
){out
.println("<h2> 查找 Cookie 名與值</h2>");for (int i
= 0; i
< cookies
.length
; i
++){cookie
= cookies
[i
];out
.print("參數名 : " + cookie
.getName());out
.print("<br>");out
.print("參數值: " + URLDecoder
.decode(cookie
.getValue(), "utf-8") +" <br>");out
.print("------------------------------------<br>");}}else{out
.println("<h2>沒有發現 Cookie</h2>");}
%>
- 獲取一個已經存在的 cookie 然后存儲在 Cookie 對象中。
- 將 cookie 的有效期設置為 0。
- 將這個 cookie 重新添加進響應頭中。
JSP Session
HttpSession接口來識別一個用戶,存儲這個用戶的所有訪問信息。
<%Date createTime
= new Date(session
.getCreationTime());Date lastAccessTime
= new Date(session
.getLastAccessedTime());String title
= "再次訪問菜鳥教程實例";Integer visitCount
= new Integer(0);String visitCountKey
= new String("visitCount");String userIDKey
= new String("userID");String userID
= new String("ABCD");if (session
.isNew()){title
= "訪問菜鳥教程實例";session
.setAttribute(userIDKey
, userID
);session
.setAttribute(visitCountKey
, visitCount
);} else {visitCount
= (Integer
)session
.getAttribute(visitCountKey
);visitCount
+= 1;userID
= (String
)session
.getAttribute(userIDKey
);session
.setAttribute(visitCountKey
, visitCount
);}
%>
-
刪除Session數據
移除一個特定的屬性:調用public void removeAttribute(String name) 方法來移除指定的屬性。刪除整個會話:調用public void invalidate() 方法來使整個session無效。
JSP 連接數據庫
<sql
:setDataSource var
="snapshot" driver
="com.mysql.cj.jdbc.Driver"url
="jdbc
:mysql
://localhost
:3306/RUNOOB
?useSSL
=false&serverTimezone
=UTC
&useUnicode
=true&characterEncoding
=utf
-8user
="root" password
="12345"/>
<sql
:setDataSource var
="snapshot" driver
="com.mysql.jdbc.Driver"url
="jdbc:mysql://localhost:3306/RUNOOB?useUnicode=true&characterEncoding=utf-8"user
="root" password
="123456"/><sql
:query dataSource
="${snapshot}" var
="result">
SELECT
* from websites
;
</sql
:query
>
總結
以上是生活随笔為你收集整理的jsp的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。