JavaEE(3)——JavaBean技术

1 实验目的

  • 理解JavaBean概念,掌握JavaBean的工作原理。
  • 重点掌握JavaBean的设计要点
  • 重点掌握表单数据与JavaBean的对应关系

2 实验原理

JavaBean是Java语言写的可重用组件,是符合某种规范的Java类,JavaBean满足下面规范:

  • JavaBean是具体的公共的
  • 必须有一个无参构造方法
  • 必须有 setXx() 方法和 getXxx() 方法。

在JSP页面中访问JavaBean的方法有直接访问JSP标签访问两种。

(1)直接访问JavaBean的方法。在页面导入JavaBean类,在JSP段实例化JavaBean:

<%@ page import="javaBean.userBean" %> <% userBean user = new userBean(); //使用user.setXxx()设置user的属性 //使用user.getXxx()访问user的属性 %> <%@ page import="javaBean.userBean" %> <% userBean user = new userBean(); //使用user.setXxx()设置user的属性 //使用user.getXxx()访问user的属性 %>

(2)在JSP页面使用<jsp:useBean>标签:

<jsp:useBean id="bean对象名称" class="创建bean的类名称" scope="request"/> <!--或者--> <jsp:useBean id="bean对象名称" class="创建bean的类的名称" scope="request"></jsp:useBean> <jsp:useBean id="bean对象名称" class="创建bean的类名称" scope="request"/> <!--或者--> <jsp:useBean id="bean对象名称" class="创建bean的类的名称" scope="request"></jsp:useBean>

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

%PROJECTROOT%/src/exp03/bean/Student.java 的内容如下:

package exp03.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; } } package exp03.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 编写studentForm.jsp

%WEBROOT%/jsp/exp03/content01/studentForm.jsp 的内容如下:

<%-- Document : studentForm Created on : 2018-10-3, 19:48:41 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>JavaBean test</title> </head> <body> <form action="studentRecv.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> <%-- Document : studentForm Created on : 2018-10-3, 19:48:41 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <title>JavaBean test</title> </head> <body> <form action="studentRecv.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 编写studentRecv.jsp

<%-- Document : studentRecv Created on : 2018-10-3, 19:51:50 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <jsp:useBean id="student" class="exp03.bean.Student" scope="request"/> <html> <head> <title>JavaBean test</title> </head> <body> 直接从表单自动获取到的参数如下:<br /> <jsp:setProperty name="student" property="*"/> 学号:<%=student.getXh()%> <br /> 姓名:<%=student.getName()%> <br /> 出生日期:<%=student.getBirthday()%> <br /> <hr /> 通过request.getParameter()获取到的表单参数如下:<br /> 学号:<%=request.getParameter("xh")%> <br /> 姓名:<%=request.getParameter("name")%> <br /> 出生日期:<%=request.getParameter("birthday")%> <br /> </body> </html> <%-- Document : studentRecv Created on : 2018-10-3, 19:51:50 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <jsp:useBean id="student" class="exp03.bean.Student" scope="request"/> <html> <head> <title>JavaBean test</title> </head> <body> 直接从表单自动获取到的参数如下:<br /> <jsp:setProperty name="student" property="*"/> 学号:<%=student.getXh()%> <br /> 姓名:<%=student.getName()%> <br /> 出生日期:<%=student.getBirthday()%> <br /> <hr /> 通过request.getParameter()获取到的表单参数如下:<br /> 学号:<%=request.getParameter("xh")%> <br /> 姓名:<%=request.getParameter("name")%> <br /> 出生日期:<%=request.getParameter("birthday")%> <br /> </body> </html>

3.1.4 运行测试

在浏览器地址栏输入以下URL访问之,如 图1 所示:
http://localhost:8081/Study/jsp/exp03/content01/studentForm.jsp图1 - studentForm.jsp
图1 - studentForm.jsp


单击提交按钮,进入studentRecv.jsp,如 图2 所示:
图2 - studentRecv.jsp
图2 - studentRecv.jsp


3.2 限定JavaBean范围-request

任务描述:

  • 编写JSP程序,使用有效范围是request的JavaBean显示公司员工信息。
  • 编写一个Employee.java的JavaBean,含有员工编号、员工姓名、出生年月等属性,并提供相应的getXxx()和setXxx()方法。
  • 编写inputAndShow.jsp页面,在该页面中创建一个名为employee的JavaBean。
  • inputAndShow.jsp页面提供一个用户输入员工编号、员工姓名和出生年月的表单,该表单的输入的内容提交给当前页面,当前页面使用表单提交的数据设置employee有关属性的值,然后显示employee各个属性的值。

3.2.1 编写Employee.java

%PROJECTROOT%/src/exp03/bean/Employee.java 的内容如下:

package exp03.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; } } package exp03.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; } }

3.2.2 编写inputAndShow.jsp

%WEBROOT%/jsp/exp03/content02/inputAndShow.jsp 的内容如下:

<%-- Document : inputAndShowEnployee Created on : 2018-10-3, 20:10:52 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <jsp:useBean id="employee" class="exp03.bean.Employee" scope="request"/> <html> <body> <% request.setCharacterEncoding("UTF-8");%> <form action="" Method="post"> 职工编号: <input type=text name="empID"><br /> 职工姓名: <input type=text name="empName"><br /> 出生日期: <input type=text name="birthday"><br /> <input type=submit value="提交" /> </form> <jsp:setProperty name="employee" property="*" /> <table> <tr> <th>职工编号</th> <th>职工姓名</th> <th>出生日期</th> </tr> <tr> <td><jsp:getProperty name="employee" property="empID" /></td> <td><jsp:getProperty name="employee" property="empName" /></td> <td><jsp:getProperty name="employee" property="birthday" /> </tr> </table> </body> </html> <%-- Document : inputAndShowEnployee Created on : 2018-10-3, 20:10:52 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <!DOCTYPE html> <jsp:useBean id="employee" class="exp03.bean.Employee" scope="request"/> <html> <body> <% request.setCharacterEncoding("UTF-8");%> <form action="" Method="post"> 职工编号: <input type=text name="empID"><br /> 职工姓名: <input type=text name="empName"><br /> 出生日期: <input type=text name="birthday"><br /> <input type=submit value="提交" /> </form> <jsp:setProperty name="employee" property="*" /> <table> <tr> <th>职工编号</th> <th>职工姓名</th> <th>出生日期</th> </tr> <tr> <td><jsp:getProperty name="employee" property="empID" /></td> <td><jsp:getProperty name="employee" property="empName" /></td> <td><jsp:getProperty name="employee" property="birthday" /> </tr> </table> </body> </html>

3.2.3 运行测试

http://localhost:8081/Study/jsp/exp03/content02/inputAndShowEnployee.jsp

图3 - inputAndShowEnployee.jsp初始界面
图3 - inputAndShowEnployee.jsp初始界面


图4 - inputAndShowEnployee.jsp输入数据
图4 - inputAndShowEnployee.jsp输入数据


图5 - inputAndShowEnployee.jsp提交结果
图5 - inputAndShowEnployee.jsp提交结果


3.3 限定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.jspshow.jsp
  • 编写Employee.java,与上面的相同。
  • inputToShow.jsp页面要求提供输入职工信息的表单,该表单将用户输入信息提交给当前页面,当前页面调用名称为employee的bean,并使用表单提交的数据设置employee的有关属性的值。
  • inputToShow.jsp中提供一个超链接,以便用户单击这个链接访问show.jsp。

相关说明:

  • 如果用户访问某个Web服务的多个页面,每个页面都含有一个useBean标记,而且各个页面的useBean标记中的id的值相同,scope的值都是session,则该用户在这些页面中得到的bean值是相同的。

  • 因为是同一个bean,占相同的内存空间。如果用户在一个页面中修改了bean的属性,其它页面的bean的属性也发生相同的变化。

  • 当session消失后,JSP引擎会释放分配的Bean。

  • 但不同用户的scope取值是session时,bean是不同的(因为bean占据内存空间不同)。

3.3.1 编写inputToShow.jsp

%WEBROOT%/jsp/exp03/content03/inputToShow.jsp 的内容如下:

<%-- Document : inputToShow Created on : 2018-10-3, 21:45:08 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="employee" class="exp03.bean.Employee" scope="session"/> <!DOCTYPE html> <html> <body> <% request.setCharacterEncoding("utf-8"); %> <form action="" method="post"> 职工编号: <input type=text name="empID"><br/> 职工名称: <input type=text name="empName"><br/> 出生日期: <input type=text name="birthday"><br/> <input type=submit value="提交"> </form> <jsp:setProperty name="employee" property="*" /> <a href="show.jsp">访问show.jsp,查看有关信息。</a> </body> </html> <%-- Document : inputToShow Created on : 2018-10-3, 21:45:08 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="employee" class="exp03.bean.Employee" scope="session"/> <!DOCTYPE html> <html> <body> <% request.setCharacterEncoding("utf-8"); %> <form action="" method="post"> 职工编号: <input type=text name="empID"><br/> 职工名称: <input type=text name="empName"><br/> 出生日期: <input type=text name="birthday"><br/> <input type=submit value="提交"> </form> <jsp:setProperty name="employee" property="*" /> <a href="show.jsp">访问show.jsp,查看有关信息。</a> </body> </html>

3.3.2 编写show.jsp

%WEBROOT%/jsp/exp03/content03/show.jsp 的内容如下:

<%-- Document : show Created on : 2018-10-3, 21:48:00 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="employee" class="exp03.bean.Employee" scope="session"/> <!DOCTYPE html> <html> <table> <tr> <th>职工编号</th> <th>职工姓名</th> <th>出生日期</th> </tr> <tr> <td><jsp:getProperty name="employee" property="empID" /></td> <td><jsp:getProperty name="employee" property="empName" /></td> <td><jsp:getProperty name="employee" property="birthday" /></td> </tr> </body> </html> <%-- Document : show Created on : 2018-10-3, 21:48:00 Author : zhaoxuyang --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="employee" class="exp03.bean.Employee" scope="session"/> <!DOCTYPE html> <html> <table> <tr> <th>职工编号</th> <th>职工姓名</th> <th>出生日期</th> </tr> <tr> <td><jsp:getProperty name="employee" property="empID" /></td> <td><jsp:getProperty name="employee" property="empName" /></td> <td><jsp:getProperty name="employee" property="birthday" /></td> </tr> </body> </html>

3.3.3 运行测试

http://localhost:8081/Study/jsp/exp03/content03/inputToShow.jsp

图6 - inputToShow.jsp初始页面
图6 - inputToShow.jsp初始页面


图7 - inputToShow.jsp输入数据
图7 - inputToShow.jsp输入数据


图8 - show.jsp显示session中的数据
图8 - show.jsp显示session中的数据


3.4 限定JavaBean范围-application

  • JSP引擎为Web服务目录下的所有JSP页面分配一个共享的bean。
  • scope取值为application的用户所用的同名bean相同,当一个用户修改自己的bean时,会影响到其他用户的使用。
    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" />

任务描述:

  • 编写JSP程序,使用有效范围是application的JavaBean显示公司员工信息。
  • 编写一个Employee.java的JavaBean,含有员工编号、员工姓名、出生年月等属性,并提供相应的getXxx()和setXxx()方法
  • 编写inputAndShow.jsp页面,在该页面中创建一个名为employee的JavaBean。该页面提供一个用户输入员工编号、员工姓名和出生年月的表单,该表单的输入的内容提交给当前页面,当前页面使用表单提交的数据设置employee有关属性的值,然后显示employee各个属性的值。

3.4.1 编写Notice.java

%PROJECTROOT%/src/exp03/bean/Notice.java 的内容如下:

package exp03.bean; import java.util.*; import java.text.SimpleDateFormat; public class Notice { String name, title, content; StringBuffer allMessage; ArrayList<String> savedName, savedTitle, savedContent, savedTime; public Notice() { savedName = new ArrayList<>(); savedTitle = new ArrayList<>(); savedContent = new ArrayList<>(); savedTime = new ArrayList<>(); } public void setName(String s) { 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("<table border=1>"); allMessage.append("<tr>"); allMessage.append("<th>留言者姓名</th>"); allMessage.append("<th>留言标题</th>"); allMessage.append("<th>留言内容</th>"); allMessage.append("<th>留言时间</th>"); allMessage.append("</tr>"); for (int k = 0; k < savedName.size(); k++) { allMessage.append("<tr>"); allMessage.append("<td>"); allMessage.append(savedName.get(k)); allMessage.append("</td>"); allMessage.append("<td>"); allMessage.append(savedTitle.get(k)); allMessage.append("</td>"); allMessage.append("<td>"); allMessage.append("<textarea>"); allMessage.append(savedContent.get(k)); allMessage.append("</textarea>"); allMessage.append("</td>"); allMessage.append("<td>"); allMessage.append(savedTime.get(k)); allMessage.append("</td>"); allMessage.append("<tr>"); } allMessage.append("</table>"); return allMessage; } } package exp03.bean; import java.util.*; import java.text.SimpleDateFormat; public class Notice { String name, title, content; StringBuffer allMessage; ArrayList<String> savedName, savedTitle, savedContent, savedTime; public Notice() { savedName = new ArrayList<>(); savedTitle = new ArrayList<>(); savedContent = new ArrayList<>(); savedTime = new ArrayList<>(); } public void setName(String s) { 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("<table border=1>"); allMessage.append("<tr>"); allMessage.append("<th>留言者姓名</th>"); allMessage.append("<th>留言标题</th>"); allMessage.append("<th>留言内容</th>"); allMessage.append("<th>留言时间</th>"); allMessage.append("</tr>"); for (int k = 0; k < savedName.size(); k++) { allMessage.append("<tr>"); allMessage.append("<td>"); allMessage.append(savedName.get(k)); allMessage.append("</td>"); allMessage.append("<td>"); allMessage.append(savedTitle.get(k)); allMessage.append("</td>"); allMessage.append("<td>"); allMessage.append("<textarea>"); allMessage.append(savedContent.get(k)); allMessage.append("</textarea>"); allMessage.append("</td>"); allMessage.append("<td>"); allMessage.append(savedTime.get(k)); allMessage.append("</td>"); allMessage.append("<tr>"); } allMessage.append("</table>"); return allMessage; } }

3.4.2 编写inputNotice.jsp

%WEBROOT%/jsp/exp03/content04/inputNotice.jsp 的内容如下:

<%-- Document : inputNotice Created on : 2018-10-3, 22:02:03 Author : Administrator --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="notice" class="exp03.bean.Notice" scope="application"/> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html> <html> <body> <form action="" method="post" name="form"> 输入您的名字:<br /> <input type="text" name="name" /><br /> 输入您的留言标题:<br /> <input type="text" name="title"><br /> 输入您的留言:<br /> <textarea name="content" ROWs="10" COLS=36 WRAP="physical"></textarea><br /> <input type="submit" value="提交信息" name="submit" /> </form> <hr /> <jsp:setProperty name="notice" property="*"/> <a href="showNotice.jsp">查看留言板</a> </body> </html> <%-- Document : inputNotice Created on : 2018-10-3, 22:02:03 Author : Administrator --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="notice" class="exp03.bean.Notice" scope="application"/> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html> <html> <body> <form action="" method="post" name="form"> 输入您的名字:<br /> <input type="text" name="name" /><br /> 输入您的留言标题:<br /> <input type="text" name="title"><br /> 输入您的留言:<br /> <textarea name="content" ROWs="10" COLS=36 WRAP="physical"></textarea><br /> <input type="submit" value="提交信息" name="submit" /> </form> <hr /> <jsp:setProperty name="notice" property="*"/> <a href="showNotice.jsp">查看留言板</a> </body> </html>

3.4.2 编写showNotice.jsp

%WEBROOT%/jsp/exp03/content04/showNotice.jsp 的内容如下:

<%-- Document : showNotice Created on : 2018-10-3, 22:04:21 Author : Administrator --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="notice" class="exp03.bean.Notice" scope="application"/> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html> <html> <body> <jsp:getProperty name="notice" property="allMessage"/> <a href="inputNotice.jsp">我要留言</a> </body> </html> <%-- Document : showNotice Created on : 2018-10-3, 22:04:21 Author : Administrator --%> <%@page contentType="text/html" pageEncoding="UTF-8"%> <jsp:useBean id="notice" class="exp03.bean.Notice" scope="application"/> <% request.setCharacterEncoding("utf-8"); %> <!DOCTYPE html> <html> <body> <jsp:getProperty name="notice" property="allMessage"/> <a href="inputNotice.jsp">我要留言</a> </body> </html>

3.4.3 运行测试

http://localhost:8081/Study/jsp/exp03/content04/inputNotice.jsp
图9 - inputNotice.jsp初始界面
图9 - inputNotice.jsp初始界面


图10 - showNotice.jsp显示application数据
图10 - showNotice.jsp显示application数据


4 思考题

  • 如何获得请求参数?
  • 如何在请求对象中共享数据?

5 实验总结

本实验实现了request对象、session对象、application对象的用法,实现数据的传递和共享。