1、什么是JavaBean
JavaBean是一个
遵循特定写法的Java类,它通常具有如下特点:
属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。
- 这个Java类必须具有一个无参的构造函数
- 属性必须私有化。
- 私有化的属性必须通过public类型的方法暴露给其它程序,并且方法的命名也必须遵守一定的命名规范。
JavaBean的属性可以是任意类型,并且一个JavaBean可以有多个属性。每个属性通常都需要具有相应的setter、 getter方法,setter方法称为属性修改器,getter方法称为属性访问器。
属性修改器必须以小写的set前缀开始,后跟属性名,且属性名的第一个字母要改为大写,例如,name属性的修改器名称为setName,password属性的修改器名称为setPassword。
属性访问器通常以小写的get前缀开始,后跟属性名,且属性名的第一个字母也要改为大写,例如,name属性的访问器名称为getName,password属性的访问器名称为getPassword。
一个JavaBean的某个属性也可以只有set方法或get方法,这样的属性通常也称之为只写、只读属性。
2、在JSP中使用JavaBean
JSP技术提供了三个关于JavaBean组件的动作元素,即JSP标签,它们分别为:
- <jsp:useBean>标签:用于在JSP页面中查找或实例化一个JavaBean组件。
- <jsp:setProperty>标签:用于在JSP页面中设置一个JavaBean组件的属性。
- <jsp:getProperty>标签:用于在JSP页面中获取一个JavaBean组件的属性。
(1)、<jsp:useBean>标签
<jsp:useBean>标签用于在指定的域范围内查找指定名称的JavaBean对象:
<jsp:useBean id="beanName" class="package.class"
scope="page|request|session|application"/>
- 如果存在则直接返回该JavaBean对象的引用。
- 如果不存在则实例化一个新的JavaBean对象并将它以指定的名称存储到指定的域范围中。
<jsp:useBean id="beanName" class="package.class"
scope="page|request|session|application"/>
- id属性用于指定JavaBean实例对象的引用名称和其存储在域范围中的名称。
- class属性用于指定JavaBean的完整类名(即必须带有包名)。
- scope属性用于指定JavaBean实例对象所存储的域范围,其取值只能是page、request、session和application等四个值中的一个,其默认值是page。
执行原理:
<jsp:useBean id="currentDate" class="java.util.Date"/>
翻译成servlet源码:
java.util.Date currentDate = null;
synchronized (_jspx_page_context) {
currentDate = (java.util.Date) _jspx_page_context.getAttribute(
"currentDate", PageContext.PAGE_SCOPE);
if (currentDate == null){
currentDate = new java.util.Date();
_jspx_page_context.setAttribute("currentDate",
currentDate, PageContext.PAGE_SCOPE);
}
}
小注:
<jsp:useBean ...>
Body
</jsp:useBean>
功能:
Body部分的内容只在<jsp:useBean>标签
创建JavaBean的实例对象时才执行。
(2)、<jsp:setProperty>标签
<jsp:setProperty name="beanName"{
property="propertyName" value="{string | <%= expression %>}" |
property="propertyName" [ param="parameterName" ] |
property= "*"
}/>
- name属性用于指定JavaBean对象的名称。
- property属性用于指定JavaBean实例对象的属性名。
- value属性用于指定JavaBean对象的某个属性的值,value的值可以是字符串,也可以是表达式。为字符串时,该值会自动转化为JavaBean属性相应的类型,如果value的值是一个表达式,那么该表达式的计算结果必须与所要设置的JavaBean属性的类型一致。
- param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值同样会自动转换成要设置的JavaBean属性的类型。
- property= "*" 各个属性全部封装
注:
jsp:setProperty标签在工作时,它会自动把字符串转成八种基本数据类型
但是jsp:setProperty标签对于复杂类型无法自动进行转换
但是jsp:setProperty标签对于复杂类型无法自动进行转换
<!-- jsp:setProperty标签用所有的请求参数为bean的属性赋值 -->
<!-- http://localhost:8080/day09/2.jsp?name=flx&password=123&age=34 -->
<jsp:setProperty name="person" property="*"/>
<%
System.out.println(person.getName());
System.out.println(person.getPassword());
System.out.println(person.getAge());
%>
(3)、<jsp:getProperty>标签
<jsp:getProperty>标签用于 读取JavaBean对象的属性,也就是调用JavaBean对象的getter方法,然后将读取的属性值转换成字符串后插入进 输出的响应正文中。语法:
<jsp:getProperty name="beanInstanceName" property="PropertyName" />
- name属性用于指定JavaBean实例对象的名称,其值应与<jsp:useBean>标签的id属性值相同。
- property属性用于指定JavaBean实例对象的属性名。
- 如果一个JavaBean实例对象的某个属性的值为null,那么,使用<jsp:getProperty>标签输出该属性的结果将是一个内容为“null”的字符串。一般需要判断,为null就不输出了。
3、JSP开发模式
SUN公司推出JSP技术后,同时也推荐了
两种web应用程序的
开发模式:
- 一种是JSP+JavaBean模式(不用)
- 一种是Servlet+JSP+JavaBean模式。
(1)、JSP+JavaBean模式适合开发业务逻辑不太复杂的web应用程序,这种模式下,JavaBean用于封装业务数据,JSP即负责处理用户请求,又显示数据。
(2)、Servlet+JSP+JavaBean
(MVC)模式适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp负责数据显示,javabean负责封装数据。 Servlet+JSP、JavaBean模式程序各个模块之间层次清晰,web开发推荐采用此种模式。
servlet->jsp 利用forward技术,数据存在request域中。
第一种开发模式开发计算器:
CalculatorBean:
package seu.xinci.pojo;
import java.math.BigDecimal;
/**
* Created by Administrator on 2016/1/31.
*/
public class CalculatorBean {
private double firstNumber;
private double secondNumber;
private char operator='+';
private double result;
public double getFirstNumber() {
return firstNumber;
}
public void setFirstNumber(double firstNumber) {
this.firstNumber = firstNumber;
}
public double getSecondNumber() {
return secondNumber;
}
public void setSecondNumber(double secondNumber) {
this.secondNumber = secondNumber;
}
public char getOperator() {
return operator;
}
public void setOperator(char operator) {
this.operator = operator;
}
public double getResult() {
return result;
}
public void setResult(double result) {
this.result = result;
}
public void calculate(){
switch (this.operator){
case '+':{
this.result = this.firstNumber + this.secondNumber;
break;
}
case '-':{
this.result = this.firstNumber - this.secondNumber;
break;
}
case '*':{
this.result = this.firstNumber * this.secondNumber;
break;
}
case '/':{
if (this.secondNumber==0)
throw new RuntimeException("被除数不能为0");
this.result = this.firstNumber / this.secondNumber;
this.result = new BigDecimal(this.result).setScale(2,BigDecimal.ROUND_HALF_UP)
.doubleValue();
break;
}
default:
throw new RuntimeException("对不起,传入的运算符非法!!");
}
}
}
calculator.jsp:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>计算器</title>
</head>
<body style="text-align: center;">
<jsp:useBean id="CalculatorBean" class="cn.itcast.CalculatorBean"></jsp:useBean>
<jsp:setProperty name="CalculatorBean" property="*"/>
<%
CalculatorBean.calculate();
%>
<br/><hr> <br/>
计算结果是:
<jsp:getProperty name="CalculatorBean" property="firstNum"/>
<jsp:getProperty name="CalculatorBean" property="operator"/>
<jsp:getProperty name="CalculatorBean" property="secondNum"/>
=
<jsp:getProperty name="CalculatorBean" property="result"/>
<br/><hr> <br/>
<form action="/day09/calculator.jsp" method="post">
<table border="1" width="50%">
<tr>
<td colspan="2">简单的计算器</td>
</tr>
<tr>
<td>第一个参数</td>
<td>
<input type="text" name="firstNum">
</td>
</tr>
<tr>
<td>运算符</td>
<td>
<select name="operator">
<option value="+">+</option>
<option value="-">-</option>
<option value="*">*</option>
<option value="/">/</option>
</select>
</td>
</tr>
<tr>
<td>第二个参数</td>
<td>
<input type="text" name="secondNum">
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="计算">
</td>
</tr>
</table>
</form>
</body>
</html>
注意:
1、处理了/0的情况,在“/”操作的时候,判断被除数是否为0,如果是0则抛出异常(异常处理[ errorPage="relative_url" ] ,其中relative_url为用来处理异常的页面)
2、
四舍五入,保留一定位数的小数
this.result = new BigDecimal(this.result).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
4、EL表达式快速入门
EL表达式用于获取数据,在JSP页面中可使用 ${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个 域对象(page、request、session、application)中获取对象。
如果域对象中不存在标识符所对应的对象,则
返回结果为””(注意,不是null)(不用自己进行判断)。
(1)示例:使用EL表达式获取page、request、session、appliction域中的数据。
<%
request.setAttribute("name","aaa");
%>
<!-- pageContext.findAttribute("name") page request session application-->
${name }
(2)、EL表达式中也可以使用${customerBean.address}的形式来访问JavaBean对象的属性。
示例:使用EL表达式获取Bean属性。
<!-- 在jsp页面中,使用el表达式可以获取bean的属性 -->
<%
Person p = new Person();
p.setAge(12);
request.setAttribute("person",p);
%>
${person.age }
<!-- 在jsp页面中,使用el表达式可以获取bean中的。。。。。。。。。的属性 -->
<%
Person person = new Person();
Address address = new Address();
person.setAddress(address);
request.setAttribute("person",person);
%>
${person.address.name }
<!-- 在jsp页面中,使用el表达式获取list集合中指定位置的数据 -->
<%
Person p1 = new Person();
p1.setName("aa111");
Person p2 = new Person();
p2.setName("bb");
List list = new ArrayList();
list.add(p1);
list.add(p2);
request.setAttribute("list",list);
%>
${list[0].name }
(4)、map集合指定数据
<!-- 在jsp页面中,使用el表达式获取map集合的数据 -->
<%
Map map = new HashMap();
map.put("a","aaaaxxx");
map.put("b","bbbb");
map.put("c","cccc");
map.put("1","aaaa1111");
request.setAttribute("map",map);
%>
${map.a }
${map["1"] }
结合JSTL标签,EL表达式也可轻松获取各种集合中的元素。
EL表达式也可使用类如${1==1}的形式进行简单的逻辑判断。
<!-- 利用el表达式获取web应用的名称 -->
<a href="${pageContext.request.contextPath }/1.jsp">点点</a>
EL表达式也可使用类如${1==1}的形式进行简单的逻辑判断。
<!-- 注意:如果访问bean不存在的属性,会抛 Property 'username' not found on type cn.itcast.Person -->
<%-- ${person.username }--%>
5、JSTL标签快速入门
JSTL是sun公司开发的一套标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的脚本代码。
在页面中使用JSTL标签需完成以下2个步骤:
1、导入jstl.jar和standerd.jar这两个JSTL的jar文件。
2、在JSP页面中使用<%@ tablib url=“” prifix=“” %>元素导入标签库。
1、导入jstl.jar和standerd.jar这两个JSTL的jar文件。
2、在JSP页面中使用<%@ tablib url=“” prifix=“” %>元素导入标签库。
JSTL标签库中常用标签:
<c:foreach var=“” items=“”>
<c:if test=“”>
<c:foreach var=“” items=“”>
<c:if test=“”>
实例:
(1)、list的迭代:
<!-- 使用jstl+el表达式可以迭代list集合 -->
<%
Person p1 = new Person();
p1.setName("aa111");
Person p2 = new Person();
p2.setName("bb");
List list = new ArrayList();
list.add(p1);
list.add(p2);
request.setAttribute("list",list);
%>
<c:forEach var="person" items="${list}">
${person.name }<br/>
</c:forEach>
(2)、map的迭代:
<!-- 使用jstl+el表达式可以迭代map集合 -->
<%
Map map = new HashMap();
map.put("a","aaaaxxx");
map.put("b","bbbb");
map.put("c","cccc");
map.put("1","aaaa1111");
request.setAttribute("map",map);
%>
<br/>
<%-- Set<Map.Entry> set = map.entrySet()--%>
<c:forEach var="me" items="${map}">
${me.key } = ${me.value }<br/>
</c:forEach>
(3)、c:if的使用:
<c:if test="${user!=null}">
欢迎您:${user.uesrname }
</c:if>
<c:if test="${user==null}">
用户名:<input type="text" name="username">
密码:<input type="password" name="password">
<input type="submit" value="登陆">
</c:if>
注意:常犯错误
1、忘记写<%@ tablib url=“” prifix=“” %>元素导入标签库,
不会报错但是会显示不出来!即标签体无效