JSP_9th_读写JavaBean

建立表单参数和Bean属性之间的关联。
1)通过param指定表单元素的名称,通过property指定对应的Bean属性名称,由此建立这两个变量的关联。

举例:
首先完成一个Bean(SaleEntry.java):
package com.hpe.bean;

public class SaleEntry {
	private String itemID = "unknown";
	
	private double discountCode = 1.0;
	
	private int numItems = 0;
	
	public String getItemID() {
		return itemID;
	}
	
	public void setItemID(String itemID) {
		if(itemID != null) {
			this.itemID = itemID;
		} else {
			this.itemID = "unknown";
		}
	}
	
	public double getDiscountCode() {
		return discountCode;
	}
	
	public void setDiscountCode(double discountCode) {
		this.discountCode = discountCode;
	}

	public int getNumItems() {
		return numItems;
	}

	public void setNumItems(int numItems) {
		this.numItems = numItems;
	}
	
	public double getItemCost() {
		double cost;
		if(itemID.equals("a1234")) {
			cost = 12.99 * getDiscountCode();
		} else {
			cost = -9999;
		}
		return roundToPennies(cost);
	}
	
	public double roundToPennies(double cost) {
		return Math.floor(cost * 100) / 100.0;
	}
	
	public double getTotalCost() {
		return getItemCost() * getNumItems();
	}
}

再完成SaleEntry.jsp:
<!doctype html>
<html>
<head>
	<meta charset="UTF-8" />
	<title>Using jsp:setProperty</title>
</head>
<body>
	<table border="5" align="center">
		<tr><th>Using jsp:setProperty</th></tr>
	</table><br />
	
	<jsp:useBean id="saleEntry" class="com.hpe.bean.SaleEntry" />
	<jsp:setProperty name="saleEntry"
					 property="itemID" 
					 value="<%= request.getParameter(\"itemID\") %>" />
					 
	<jsp:setProperty name="saleEntry"
					 property="numItems" 
					 param="numItems" />
					 
	<jsp:setProperty name="saleEntry"
					 property="discountCode" 
					 param="discountCode"/>
	
	<table border="1" align="center">
		<tr>
			<th>Item ID</th>
			<th>Unit Price</th>
			<th>Number Ordered</th>
			<th>Total Price</th>
		</tr>
	
		<tr align="right">
			<td><jsp:getProperty name="saleEntry" property="itemID" /></td>
			<td><jsp:getProperty name="saleEntry" property="itemCost" /></td>
			<td><jsp:getProperty name="saleEntry" property="numItems" /></td>
			<td><jsp:getProperty name="saleEntry" property="totalCost" /></td>
		</tr>
	</table>
</body>
</html>

访问:http://localhost:8080/TestJSP/SaleEntry.jsp,首先不在URL后跟参数,页面效果:

总结:
①通过jsp:setProperty往指定name的对象中设置指定property。
②所设置的值由value决定,可以用<%= 表达式 %>的形式来给value赋值。
③指定property是什么类型,该表达式的返回值就该是什么类型。
④param后直接跟参数名,而不需要考虑类型问题,jsp会自动转换好。

这次在URL后面跟上参数,访问:http://localhost:8080/TestJSP/SaleEntry.jsp?itemID=a1234&numItems=2&discountCode=0.85,页面效果:

关于jsp:getProperty的总结:
从指定name中拿出指定property的值,这里可以发现在Bean中并没有itemCost和totalCost两个成员属性,但从页面效果来看却调用了getItemCost和getTotalCost方法,说明jsp:getProperty是根据property去Bean中找到有没有这样的方法。

以<jsp:getProperty name="saleEntry" property="itemCost" />为例,其在servlet中的对应代码如下:

out.write(org.apache.jasper.runtime.JspRuntimeLibrary.toString
((((com.hpe.bean.SaleEntry)_jspx_page_context.findAttribute("saleEntry")).getItemCost())));

可以看到get方法名中itemCost的首字母是大写的,说明jsp:getProperty是通过把property属性的值的首字母大写,然后去Bean中找相对应的get方法,所以Bean中的方法名一定要记得get后的第一个字母要大写。

2)通过*来设置所有属性和输入参数之间的关联:

举例JavaBean(SayHelloBean.java)如下:
package com.hpe.bean;

public class SayHelloBean {
	
	private String name;
	private String sex;
	
	public SayHelloBean() {
		
	}
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
}

SayHelloBean.html如下:
<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title>数据输入</title>
	</head>

	<body>
		<div align="center">
			<p>请输入数据</p>
			<form action="SayHelloBean.jsp" method="post">
				<p>姓名:
					<input type="text" name="name" /> 性别:
					<select name="sex">
						<option value="先生">先生</option>
						<option value="女士">女士</option>
					</select>
				</p>
				<p>
					<input type="submit" name="Submit" value="提交" />
				</p>
			</form>
		</div>
	</body>

</html>

数据会被提交到SayHelloBean.jsp,jsp内容如下,负责使用jsp:setProperty把表单数据设到Bean的成员属性里,但也得先用jsp:useBean来创建一个Bean实例:

<%@ page import="com.hpe.bean.SayHelloBean" %>
<%@ page contentType="text/html; charset=UTF-8" %>

<jsp:useBean id="hello" class="com.hpe.bean.SayHelloBean" scope="request">
	<jsp:setProperty name="hello" property="*" />
</jsp:useBean>

<!doctype html>
<html>

<head>
	<meta charset="UTF-8" />
	<title>SayHelloBean</title>
</head>

<body>
	<p>欢迎</p>
	<jsp:getProperty name="hello" property="name" />
	<jsp:getProperty name="hello" property="sex" />
</body>

</html>

该Bean实例被setAttribute到了request对象中了,也就是说请求转发后的页面也可以使用该Bean实例,但这不是重点,只是顺带一提稍作温习。
可以看到下面这行:
<jsp:setProperty name="hello" property="*" />
property属性的值为*,而且还省略了value属性,这种写法相当于下面这样:
<jsp:setProperty name="hello" property="name" value="<%= request.getParameter(\"name\") %>" />
<jsp:setProperty name="hello" property="sex" value="<%= request.getParameter(\"sex\") %>" /> 
也就是说,*号表示Bean实例所有的成员属性,会去request对象中找和这些成员属性名相同的表单参数值,并且把值放到该成员属性中。
这样看似简便很多,却也封装了细节,有些错误就不容易及时发现,如果成员变量和表单参数两边名字不能一一对应,就会导致表单这边的数据没有办法传递到成员变量中,如Bean实例中有一个成员变量叫"userName",而表单那边叫做"UserName",那表单数据"UserName"就不能被保存在"userName"中,"userName"就依然是NULL,而如果用以前的写法则可以根据实际情况灵活读取表单数据:
<jsp:setProperty name="hello" property="userName" value="<%= request.getParameter(\"UserName\") %>" />
如果两边数据真的名字都一致,并且要设值的成员属性比较多,property="*"是一种不错的考虑,但一般情况下,建议写全。

注意:
上面说<jsp:setProperty name="hello" property="*" />的写法相当于下面这样:
<jsp:setProperty name="hello" property="name" value="<%= request.getParameter(\"name\") %>" />
<jsp:setProperty name="hello" property="sex" value="<%= request.getParameter(\"sex\") %>" /> 
会调用request.getParameter()并不是因为useBean中我们让scope="request",不论scope是page、session还是application,这里都是调用request.getParameter()。

访问:http://localhost:8080/TestJSP/SayHelloBean.html,填好信息并提交:
页面效果:


页面跳转到SayHelloBean.jsp,看到页面中的中文出现了乱码:


如何解决中文乱码问题,下一篇博客再分析。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值