1. 程式人生 > >JavaEE(3)——JSP亂碼問題

JavaEE(3)——JSP亂碼問題

1 實驗目的

  1. 理解JavaBean概念,掌握JavaBean的工作原理;
  2. 重點掌握JavaBean的設計要點;
  3. 重點掌握表單資料與JavaBean的對應關係。

2 實驗原理

JavaBean是Java語言寫的可重用元件,是符合某種規範的Java類,JavaBean滿足下面規範:。

  1. JavaBean是具體的和公共的;
  2. 必須有一個無參構造方法;。
  3. 必須有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。

  1. 實驗任務:編寫JSP程式,使用有效範圍是request的JavaBean顯示公司員工資訊。 編寫一個Employee.java的JavaBean,含有員工編號、員工姓名、出生年月等屬性,並提供相應的getXxx()和setXxx()方法。 編寫inputAndShow.jsp頁面,在該頁面中建立一個名為employee的JavaBean。該頁面提供一個使用者輸入員工編號、員工姓名和出生年月的表單,該表單的輸入的內容提交給當前頁面,當前頁面使用表單提交的資料設定employee有關屬性的值,然後顯示employee各個屬性的值。

  2. 實驗步驟。 【步驟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"); %> 職工編號: 職工姓名: 出生日期:
職工編號 職工姓名 出生日期
分析inputAndShow.jsp中紅色程式碼的功能? 【步驟2】使用下面的URL訪問之。 http://localhost:8080/prac03_JavaBean_scope/inputAndShow.jsp,將出現如圖3-3所示表單介面。

圖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>

  1. 實驗任務:編寫兩個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佔據記憶體空間不同)。
  2. 實驗步驟。 【步驟1】編寫input2show.jsp,參考程式碼如下: <%@ page contentType=“text/html;charset=UTF-8” %> <%@ page import=“bean.*”%> <jsp:useBean id=“employee” class=“bean.Employee” scope=“session”/>
<% request.setCharacterEncoding("utf-8"); %> 職工編號: 職工名稱: 出生日期: 訪問show.jsp,檢視有關資訊。 編寫show.jsp參考程式碼如下: <%@ page contentType="text/html;charset=UTF-8" %> <%@ page import="bean.Employee"%>
職工編號 職工姓名 出生日期
【步驟2】使用下面的URL訪問之。 http://localhost:8080/prac03_JavaBean_scope/input2show.jsp,將出現如圖3-5所示表單介面,書如內容並單擊提交,彈出圖3-6所示介面。

圖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時,會影響到其他使用者的使用。

  1. 實驗任務:編寫JSP程式,使用有效範圍是application的JavaBean顯示公司員工資訊。 編寫一個Employee.java的JavaBean,含有員工編號、員工姓名、出生年月等屬性,並提供相應的getXxx()和setXxx()方法。 編寫inputAndShow.jsp頁面,在該頁面中建立一個名為employee的JavaBean。該頁面提供一個使用者輸入員工編號、員工姓名和出生年月的表單,該表單的輸入的內容提交給當前頁面,當前頁面使用表單提交的資料設定employee有關屬性的值,然後顯示employee各個屬性的值。
  2. 實驗步驟。 【步驟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("
"); return allMessage; } } inputNotice.jsp參考程式碼如下: <%@ page contentType=“text/html;charset=utf-8” %> <jsp:useBean id=“notice” class=“bean.Notice” scope=“application”/> 輸入您的名字: 輸入您的留言標題: 輸入您的留言: <%request.setCharacterEncoding("utf-8");%> 檢視留言板 showNotice .jsp參考程式碼如下: <%@ page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> <%request.setCharacterEncoding("utf-8");%> 我要留言 【步驟2】使用下面的URL訪問之。 http://localhost:8080/prac03_JavaBean_scope/inputNotice.jsp,將出現如圖3-7所示表單介面,輸入內容並單擊“提交資訊”按鈕,彈出圖3-8所示介面。

圖3-6

圖3-8 四、思考題

  1. 如何獲得請求引數?
  2. 如何在請求物件中共享資料? 五、實驗總結 本實驗實現了request物件、session物件、application物件的用法,實現資料的傳遞和共享。