JavaEE(3)——JSP亂碼問題
1 實驗目的
- 理解JavaBean概念,掌握JavaBean的工作原理;
- 重點掌握JavaBean的設計要點;
- 重點掌握表單資料與JavaBean的對應關係。
2 實驗原理
JavaBean是Java語言寫的可重用元件,是符合某種規範的Java類,JavaBean滿足下面規範:。
- JavaBean是具體的和公共的;
- 必須有一個無參構造方法;。
- 必須有setXx()方法和getXxx()方法,類的欄位是通過set和get方法訪問的。
在JSP頁面中訪問JavaBean的方法有直接訪問
和JSP標籤訪問
兩種。
(1)直接訪問JavaBean的方法:
首先在頁面匯入JavaBean類:
< %@ page import="javaBean.userBean" %>
在JSP段例項化JavaBean:
<% userBean user = new userBean(); %>
使用<% user.setXxx(); %>
和<% user.getXxx(); %>訪問JavaBean屬性。
(2)直接訪問JavaBean的方法:
在JSP頁面使用useBean標籤:
<jsp:useBean id=“bean物件名稱” class=“建立bean的類名稱” scope=“request”/> 或 <jsp:useBean id=“bean物件名稱” class=“建立bean的類的名稱” scope=“request”></jsp:useBean>
通過<jsp:setProperty name=“user” property=“name” param=“mUserName” />和<jsp:getProperty name=“user” property=“name” />設定或獲取bean的屬性。
3 實驗任務與步驟
3.1 使用JavaBean獲取表單引數
- 設計一個JavaBean類Student.java,該JavaBean包含學號、姓名屬性及各屬性對應的getter和setter方法;
- 設計表單頁面input.jsp,提供學號、姓名等引數,提交給receive.jsp進行處理;
- 設計接收引數的頁面receive.jsp,例項化JavaBean物件,自動獲取input.jsp提交的學號和姓名資訊;
- 使用JavaBean自動獲取表單傳來的引數。
3.1.1 編寫Student.java
package bean;
public class Student {
private String xh;
private String name;
private String birthday;
public String getXh() {
return xh;
}
public void setXh(String xh) {
this.xh = xh;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
}
3.1.2 編寫input.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
<head>
<title>JavaBean test</title>
</head>
<body>
<form action=" receive.jsp" mathod="post">
學號:<input type="text" name="xh"><br>
姓名:<input type="text" name="name"><br>
出生日期:<input type="text" name="birthday"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
3.1.3 編寫receive.jsp
<%@ page language="java" import="java.util.*,bean.Student" pageEncoding="utf-8"%>
<jsp:useBean id="st" class="bean.Student" scope="request"/>
<html>
<head>
<title>JavaBean test</title>
</head>
<body>
直接從表單自動獲取到的引數如下:<br>
<jsp:setProperty name="st" property="*"/>
學號:<%=st.getXh() %> <br>
姓名:<%=st.getName()%> <br>
出生日期:<%=st.getBirthday()%> <br><br>
通過request.getParameter()獲取到的表單引數如下:<br>
學號:<%=request.getParameter("xh")%> <br>
姓名:<%=request.getParameter("name")%> <br>
出生日期:<%=request.getParameter("birthday")%> <br>
</body>
</html>
將出現如圖2-1所示表單介面。
圖3-1 單擊提交按鈕,彈出圖2 -2所示介面。
圖3-2
3.2 限定JavaBean範圍
設計一個JavaBean,其有效範圍為request。 JSP頁面使用useBean標記呼叫一個有效範圍是request的JavaBean的語法如下: <jsp:useBean id=“bean物件名稱” class=“建立bean的類名稱” scope=“request”/> 或 <jsp:useBean id=“bean物件名稱” class=“建立bean的類的名稱” scope=“request”></jsp:useBean> 通過<jsp:setProperty name=“user” property=“name” param=“mUserName” />和<jsp:getProperty name=“user” property=“name” />設定或獲取bean的屬性。 該Bean的有效範圍是當前請求(request),當本次請求生命週期結束後,JSP引擎取消分配給該使用者的bean。
-
實驗任務:編寫JSP程式,使用有效範圍是request的JavaBean顯示公司員工資訊。 編寫一個Employee.java的JavaBean,含有員工編號、員工姓名、出生年月等屬性,並提供相應的getXxx()和setXxx()方法。 編寫inputAndShow.jsp頁面,在該頁面中建立一個名為employee的JavaBean。該頁面提供一個使用者輸入員工編號、員工姓名和出生年月的表單,該表單的輸入的內容提交給當前頁面,當前頁面使用表單提交的資料設定employee有關屬性的值,然後顯示employee各個屬性的值。
-
實驗步驟。 【步驟1】編寫一個JavaBean檔案Employee.java和一個頁面檔案inputAndShow.jsp。 Employee.java參考程式碼如下: package bean;
public class Employee { private String empID; private String empName; private String birthday; public String getEmpID() { return empID; } public void setEmpID(String empID) { this.empID = empID; } public String getEmpName() { return empName; } public void setEmpName(String empName) { this.empName = empName; } public String getBirthday() { return birthday; } public void setBirthday(String birthday) { this.birthday = birthday; } } inputAndShow.jsp參考程式碼如下: <%@ page contentType=“text/html;charset=UTF-8” pageEncoding=“UTF-8” %> <jsp:useBean id=“employee” class=“bean.Employee” scope=“request”/>
<% request.setCharacterEncoding("UTF-8"); %> 職工編號: 職工姓名: 出生日期:職工編號 | 職工姓名 | 出生日期 |
---|
圖3-3 單擊提交,彈出如圖3-4所示介面。
圖3-4 (三)設計一個JavaBean,其有效範圍為session。 JSP頁面使用useBean標記呼叫一個有效範圍是session的JavaBean的語法如下: <jsp:useBean id=“bean物件名稱” class=“建立bean的類名稱” scope=“session”/> 或 <jsp:useBean id=“bean物件名稱” class=“建立bean的類的名稱” scope=“session”></jsp:useBean>
- 實驗任務:編寫兩個JSP頁面:inputtoshow.jsp和show.jsp。Employee.java原始檔與(二)相同。 Input2show.jsp的具體要求:頁面要求提供輸入職工資訊的表單,該表單將使用者輸入資訊提交給當前頁面,當前頁面呼叫名稱為employee的bean,並使用表單提交的資料設定employee的有關屬性的值。並要求在input2Show.jsp中提供一個超連結,以便使用者單擊這個連結訪問show.jsp。 如果使用者訪問某個Web服務的多個頁面,每個頁面都含有一個useBean標記,而且各個頁面的useBean標記中的id的值相同,scope的值都是session,則該使用者在這些頁面中得到的bean值是相同的,因為是同一個bean,佔相同的記憶體空間。如果使用者在一個頁面中修改了bean的屬性,其它頁面的bean的屬性也發生相同的變化。當session消失後,JSP引擎會釋放分配的Bean。 但不同使用者的scope取值是session時,bean是不同的(因為bean佔據記憶體空間不同)。
- 實驗步驟。 【步驟1】編寫input2show.jsp,參考程式碼如下: <%@ page contentType=“text/html;charset=UTF-8” %> <%@ page import=“bean.*”%> <jsp:useBean id=“employee” class=“bean.Employee” scope=“session”/>
職工編號 | 職工姓名 | 出生日期 |
---|
圖3-5
圖3-6 (四)設計一個JavaBean,其有效範圍為application。 JSP頁面使用useBean標記呼叫一個有效範圍是application的JavaBean的語法如下: <jsp:useBean id=“bean物件名稱” class=“建立bean的類名稱” scope=“application”/> 或 <jsp:useBean id=“bean物件名稱” class=“建立bean的類的名稱” scope=“application”></jsp:useBean> 通過<jsp:setProperty name=“user” property=“name” param=“mUserName” />和<jsp:getProperty name=“user” property=“name” />設定或獲取bean的屬性。 JSP引擎為Web服務目錄下的所有JSP頁面分配一個共享的bean,scope取值為application的使用者所用的同名bean相同,當一個使用者修改自己的bean時,會影響到其他使用者的使用。
- 實驗任務:編寫JSP程式,使用有效範圍是application的JavaBean顯示公司員工資訊。 編寫一個Employee.java的JavaBean,含有員工編號、員工姓名、出生年月等屬性,並提供相應的getXxx()和setXxx()方法。 編寫inputAndShow.jsp頁面,在該頁面中建立一個名為employee的JavaBean。該頁面提供一個使用者輸入員工編號、員工姓名和出生年月的表單,該表單的輸入的內容提交給當前頁面,當前頁面使用表單提交的資料設定employee有關屬性的值,然後顯示employee各個屬性的值。
- 實驗步驟。 【步驟1】編寫一個JavaBean檔案Notice.java和一個頁面檔案inputNotice.jsp和showNotice.jsp。 Notice.java參考程式碼如下: package bean;
import java.util.*; import java.text.SimpleDateFormat; public class Notice { String name,title,content; StringBuffer allMessage; ArrayList savedName,savedTitle,savedContent,savedTime; public Notice() { savedName=new ArrayList(); savedTitle=new ArrayList(); savedContent=new ArrayList(); savedTime=new ArrayList(); } public void setName(String s) { /try{ System.out.print(“s1=”+s+"/n"); byte bb[]=s.getBytes(“iso-8859-1”); s=new String(bb,“UTF-8”); System.out.print(“s2=”+s); } catch(Exception exp){}/ name=s; savedName.add(name); Date time=new Date(); SimpleDateFormat matter=new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”); String messTime=matter.format(time); savedTime.add(messTime); } public void setTitle(String t) { title=t; savedTitle.add(title); } public void setContent(String c) { content=c; savedContent.add(content); } public StringBuffer getAllMessage() { allMessage=new StringBuffer(); allMessage.append("
"); allMessage.append(""); allMessage.append(“”); allMessage.append(“”); allMessage.append(“”); allMessage.append(“”); allMessage.append(""); for(int k=0;k<savedName.size();k++) { allMessage.append(""); allMessage.append(""); allMessage.append(""); allMessage.append(""); allMessage.append(""); allMessage.append(""); } allMessage.append("留言者姓名 | 留言標題 | 留言內容 | 留言時間 |
---|---|---|---|
"); allMessage.append(savedName.get(k)); allMessage.append(" | "); allMessage.append(savedTitle.get(k)); allMessage.append(" | "); allMessage.append(""); allMessage.append(savedContent.get(k)); allMessage.append(""); allMessage.append(" | "); allMessage.append(savedTime.get(k)); allMessage.append(" |
圖3-6
圖3-8 四、思考題
- 如何獲得請求引數?
- 如何在請求物件中共享資料? 五、實驗總結 本實驗實現了request物件、session物件、application物件的用法,實現資料的傳遞和共享。