建立表单参数和Bean属性之间的关联。
1)通过param指定表单元素的名称,通过property指定对应的Bean属性名称,由此建立这两个变量的关联。
举例:
首先完成一个Bean(SaleEntry.java):
再完成SaleEntry.jsp:
访问: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中的对应代码如下:
可以看到get方法名中itemCost的首字母是大写的,说明jsp:getProperty是通过把property属性的值的首字母大写,然后去Bean中找相对应的get方法,所以Bean中的方法名一定要记得get后的第一个字母要大写。
2)通过*来设置所有属性和输入参数之间的关联:
举例JavaBean(SayHelloBean.java)如下:
SayHelloBean.html如下:
数据会被提交到SayHelloBean.jsp,jsp内容如下,负责使用jsp:setProperty把表单数据设到Bean的成员属性里,但也得先用jsp:useBean来创建一个Bean实例:
该Bean实例被setAttribute到了request对象中了,也就是说请求转发后的页面也可以使用该Bean实例,但这不是重点,只是顺带一提稍作温习。
可以看到下面这行:
这样看似简便很多,却也封装了细节,有些错误就不容易及时发现,如果成员变量和表单参数两边名字不能一一对应,就会导致表单这边的数据没有办法传递到成员变量中,如Bean实例中有一个成员变量叫"userName",而表单那边叫做"UserName",那表单数据"UserName"就不能被保存在"userName"中,"userName"就依然是NULL,而如果用以前的写法则可以根据实际情况灵活读取表单数据:
注意:
上面说<jsp:setProperty name="hello" property="*" />的写法相当于下面这样:
访问:http://localhost:8080/TestJSP/SayHelloBean.html,填好信息并提交:
页面效果:
页面跳转到SayHelloBean.jsp,看到页面中的中文出现了乱码:
如何解决中文乱码问题,下一篇博客再分析。
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,看到页面中的中文出现了乱码:
如何解决中文乱码问题,下一篇博客再分析。