JSP總結二(動作元素)
- 2019 年 12 月 31 日
- 筆記
文章目錄
JSP總結二(動作元素)
<jsp:include>
前面介紹了一種指令元素
include
,那是一種靜態包含JSP
文件,這個標籤是動態包含一個JSP
頁面,也就是被包含的JSP
頁面和原JSP將合併在一起,轉譯為一個Servlet
類。這是有一定的局限性的,如變數的定義不能重複。 動態的包含JSP文件即是被包含的JSP和原JSP分別轉譯為一個Servlet類,這就保證了其中的變數可以重複定義了,因為並不是在一個類中了<jsp:include page="相對的文件路徑"></jsp:include>
這種標籤轉譯為Servlet和指令元素include
是一樣的
<%--動態導入在編譯的時候是兩個jsp文件各自編譯成一個Servlet文件,因此其中的變數是不可以共享的,在當前頁面中還是可以定義導入頁面定義的變數 --%> <jsp:include page="form.jsp"> //定義的param可以在form.jsp中使用request.getParameter(String name)取得其中的值 <jsp:param value="陳加兵" name="username"/> <jsp:param value="123456" name="password"/> </jsp:include>
<jsp:forward>
這是將請求轉發給另外一個JSP或者Servlet文件處理,這個和
RequestDispatcher
是一樣的原理,就是Servlet中轉發 //綁定屬性,在login.jsp中可以獲取 request.setAttribute("username","陳加兵"); //當前頁面的請求將會交給login.jsp文件處理 <jsp:forward page='login.jsp'></jsp:forward>
<jsp:useBean>
這個動作元素是用來搭配
JavaBean
組件的標準標籤。JavaBean
必須滿足下面的條件:
- 必須實現
Java.io.Serializable
介面 - 沒有公開的(
public
)類變數 - 具有無參構造函數(默認的都有)
- 具有公開的設置方法(
setter
)與取值方法(getter
)
下面就是一個JavaBean
組件
package com; import java.io.Serializable; public class Person implements Serializable { //這裡的變數的值一定要和表單的中的name屬性的值一樣,否則不能獲取 private String username; private String password; private int age; public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Boolean Checkout(){ return "陳加兵".equals(username)&&"123456".equals(password); } }
使用
JavaBean
的目的是減少Scriptlet
的使用。其中搭配<jsp:useBean>
來使用這個JavaBean
,並且使用<jsp:setProperty>
與<jsp:getProperty>
對javaBean
進行設值與取值 注意javaBean
一定要搭配表單使用,因為設值的值其實是隱式的調用request.getParameter(String name)
來獲取表單的值 下面是一個登錄的表單(注意這裡的input
中的name
屬性的值一定要和JavaBean
組件類的成員變數的名字一樣)
<%@ 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>Insert title here</title> </head> <body> <!--提交給Demo1.jsp處理,下面就實現Demo1.jsp--> <form action="Demo1.jsp"> <label>姓名:</label> <input type="text" name="username"> <label>密碼:</label> <input type="password" name="password"> <input type="submit" value="提交"> </form> </body> </html>
下面我們寫一個
JSP
文件設置JavaBean
<%@ 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>Insert title here</title> </head> <body> <%--使用JavaBean person是Person創建的對象,相當於 Person person=new Person() 其中class是JavaBean的類所在的路徑(在com包下的Person文件中) id就是相當於創建的對象 --%> <jsp:useBean id="person" class="com.Person"></jsp:useBean> <%--為username和password設置值,相當於下面的語句 person.setUsername(request.getParameter("username")); person.setPassword(request.getParameter("password")); JavaBean中的變數一定要和表單中的值一樣,否則就不能對應,出現錯誤 其中name就是指定上面的id,即是使用的對象,property就是指定變數 --%> <jsp:setProperty property="uesrname" name="person"/> <jsp:setProperty property="password" name="person"/> <%--age是另外的變數,並沒有對應著表單的name屬性,因此我們可以單獨的為其設置值,使用value實行即可設置,這裡不必考慮類型,因為在內部會自動轉換成JavaBean中的類型 --%> <jsp:setProperty property="age" name="person" value="20"/> <%--獲取設置的值,相當於下面的語句: person.getUsername(); person.getPassword(); person.getAge(); --%> <h1><jsp:getProperty property="username" name="person" /></h1> <h1><jsp:getProperty property="password" name="person" /></h1> <h1><jsp:getProperty property="age" name="person" /></h1> </body> </html>
其實我們還可以不但可以將表單中的值賦值給變數,還可以使用
value
和param
自己設置
<%-- 將請求的url中的password的值賦值給username,注意這裡的使用的get的請求的話,提交的時候url會有請求值的 http://localhost:8080/web2/JSP/Demo1.jsp?username=%E9%99%88%E5%8A%A0%E5%85%B5&password=123456 --%> <jsp:setProperty property="username" name="person" param="password"/> <%--age是另外的變數,並沒有對應著表單的name屬性,因此我們可以單獨的為其設置值,使用value實行即可設置,這裡不必考慮類型,因為在內部會自動轉換成JavaBean中的類型 --%> <jsp:setProperty property="age" name="person" value="20"/>
JavaBean的存活範圍
Scope
屬性決定了javabean對象的存在的範圍。可選值有:
page
(默認值)request
session
application
<jsp:useBean id="person" class="com.anllin.bean.Person" scope="page"></jsp:useBean>
在page範圍
客戶每次請求訪問
jsp
頁面時,都會創建一個javabean
對象。JavaBean對象的有效範圍就是當前的jsp
文件中,如果不在當前Jsp中,那麼就不可以使用該JavaBean
對象中設置的值 比如使用forward
轉發給另外一個JSP文件,那麼此時就會再創建一個JavaBean
對象,原來頁面的JavaBean對象並沒有傳過來,也就不能使用其中的值,這個和變數的共享是一個道理的,這個JavaBean對象只能在當前的Jsp文件中調用,不能實現共享
在request範圍
客戶每次請求訪問jsp頁面時,都會創建新的javabean對象。有效範圍為:
- 客戶請求訪問的當前jsp網頁。
- 和當前網頁共享一個客戶請求的網頁,即當前jsp網頁中
<%@include %>
指令以及<forward>
標記包含的其他jsp文件,也就是轉發和包含的Jsp文件也是可以共享這個JavaBean
對象的,這個和Servlet中的request
是一樣的,一旦轉發了,就可以通過setAttribute()
設置屬性,那麼在轉發的頁面中就可以訪問這個屬性 - 當所有共享同一個客戶請求的jsp頁面執行完畢並向客戶端發加響應時,javabean對象結束生命周期。
javabean
對象作為屬性保存在httpServletRequest
對象中,屬性名javabean的id
,屬性值為javabean
對象,因此可以通過HttpRequest.getAttribute()
方法取得javabean
對象
//Demo1.jsp文件 表單請求提交的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>Insert title here</title> </head> <body> <%--設置scope屬性為request,這個是必須的,這裡的JavaBean對象為person--%> <jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean> <jsp:setProperty property="uesrname" name="person"/> <jsp:setProperty property="password" name="person"/> <jsp:setProperty property="age" name="person" value="20"/> > e <%--轉發請求到Demo2.jsp文件中,那麼就可以在Demo.jsp中共享person對象了--%> <jsp:forward page="Demo2.jsp"></jsp:forward> </body> </html> //Demo2.jsp <%@page import="com.Person"%> <%@ 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>Insert title here</title> </head> <body> <%-- 使用JavaBean,這裡的scope是必須的,一定要和Demo1.jsp一樣,id也要一樣 --%> <jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean> <%--獲取username的值 --%> <jsp:getProperty property="username" name="person"/> <% //使用HttpServletRequest獲取對象person Person p=(Person)request.getAttribute("person"); out.println(p.getUsername()); //獲取username的值 %> </body> </html>
在session範圍內
- 我們知道
HttpSession
是可以在會話期間實現數據共享的,只要是同一個項目中的Jsp
文件都是可以共享這個JavaBean對象,但是並不是永久的,因為會話也是有時間限制的, javabean
對象作為屬性保存在HttpSession對象中,屬性名為javabean的id,屬性值為javabean對象。除了可以通過javabean的id直接引用javabean對象外,也可以通過HttpSession.getAttribute()
方法取得javabean
對象- 一定要注意在每一個
<jsp:useBean>
中都要寫上scope="session"
在application範圍內
- 我們知道
ServletContext
存在於整個web應用的生命周期,這個不像session
,一旦設置的會話時間結束,那麼就不存在了,這個是永遠存在的,只要web程式在繼續 javabean
對象作為屬性保存在application
對象中,屬性名為javabean
的id,屬性值為javabean對象,除了可以通過javabean的id
直接引用對象外,也可以通過javabean的application.getAttribute()
方法取得javabean對象
重要的屬性
其實不僅僅可以對於表單中請求可以轉換為對象的值,上面我們說過了存活範圍,其實只要在這個請求範圍內,並且將對象綁定到響應的屬性上面,那麼就可以在jsp文件中使用改標籤接收其值。 其實一般在表單提交之後,我們會使用Sevlet文件驗證是否密碼和用戶名正確,那麼就不是直接提交給jsp文件,此時就像上面說過的,不影響標籤的使用,只要將JavaBean對象綁定到響應範圍的屬性上,便是可以實現對象的共享,程式碼如下: ServletDemo文件
package com; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //創建對象,並且設置值 Person person=new Person(); person.setUsername("陳加兵"); person.setPassword("123456"); //將JavaBean對象綁定到request上,相當於存活範圍為request //注意這裡的鍵值一定要是和對象的名稱一樣,否則不行 request.setAttribute("person", person); //轉發請求到jsp文件,下面我們就將在jsp文件中使用JavaBean標籤接收 RequestDispatcher dispatcher=request.getRequestDispatcher("JSP/demo1.jsp"); dispatcher.forward(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
demo1.jsp:上面文件轉發過來的,接收JavaBean對象
<%@ 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>Insert title here</title> </head> <body> <%-- 使用標籤接收轉發過來的JavaBean對象,scope一定要設置為request,id就是傳過來的對象,一定要和前面的名稱一樣,下面的語句相當於: Person person=(Person)request.getAttribute("person"); --%> <jsp:useBean id="person" class="com.Person" scope="request"></jsp:useBean> <h1><jsp:getProperty property="username" name="person"/></h1> </body> </html>
參考文章
http://www.cnblogs.com/zfc2201/archive/2011/08/17/2143615.html