1.初识JavaBean
1.1什么是JavaBean
JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 通过提供符合一致性设计模式的公共方法将内部域暴露成员属性,set和get方法获取。众所周知,属性名称符合这种模式,其他Java 类可以通过自省机制(反射机制)发现和操作这些JavaBean 的属性。
1.2访问JavaBean的属性
在讲解面向对象时,经常会使用类的属性,类的属性指的是类的成员变量。在JavaBean中同样也有属性,但是它和成员变量不是一个概念,它是以方法定义的形式出现的,这些方法必须遵循一定的命名规范。例如,在JavaBean中包含一个String类型的属性name,那么在JavaBean中必须包含getName()和setName()方法中的一个。
1.3BeanUtils工具
1.3.1什么是BeanUtils
BeanUtils工具是一种方便我们对JavaBean进行操作的工具,是Apache组织下的产品。
用途:
1)beanUtils 可以便于对javaBean的属性进行赋值。
2)beanUtils 可以便于对javaBean的对象进行赋值。
3)beanUtils可以将一个MAP集合的数据拷贝到一个javabean对象中。
1.3.2BeanUtils的使用
前提:约定前提: 参数名称 需要和javabean的属性名称保持一致!!!!
示例:
Person.java
package cn.itcast.chapter008.beanutils;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
BeanUtilsDemo.java
package cn.itcast.chapter008.beanutils;
import java.util.HashMap;
import java.util.Map;
public class BeanUtilsDemo {
public static void main(String[] args) throws Exception{
Person p = new Person();
// p.setName("dashuju2005");
// BeanUtils.setProperty(p,"name","huagong");
// BeanUtils.setProperty(p,"age","20");
// String name=BeanUtils.getProperty(p,"name");
// int age =Interget.parseInt(BeanUtils.getProperty(p,"age"));
// System.out.println(name);
// System.out.println(age);
Map<String,Object> map = new HashMap<String,Object>();
map.put("name", "dashuju2005");
map.put("age", 2);
beanutils.populate(p,map);
String name=beanutils.getProperty(p,"name");
int age=Integer.parseInt(beanutils.getProperty(p,"age"));
System.out.println(name);
System.out.println(age);
}
}
2.EL表达式
2.1初识EL表达式
- Expression Language表达式语言
- 是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据)
- 在JSP2.0开始引入概念
示例:
MyServlet.java
package cn.itcast.chapter008.servlet;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.chapter008.beanutils.Person;
/**
* Servlet implementation class MyServlet
*/
@WebServlet("/myservlet")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Person p = new Person();
p.setName("chengqi");
Map<String,String> map = new HashMap<String,String>();
map.put("my-name", "map的值");
request.setAttribute("user", map);
request.setAttribute("person", p);
request.setAttribute("username", "dashuju");
request.setAttribute("password", "123456");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
myjsp.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
${empty person}<br/>
${empty user}<br/>
1>3?${1>3 }<br/>
--------------------------------------------------<br/>
1+3${1+3 }<br/>
--------------------------------------------------<br/>
${person.name }<br/>
--------------------------------------------------<br/>
${user.my-name }<br/>
${user["my-name"] }<br/>
--------------------------------------------------<br/>
${person.name }<br/>
--------------------------------------------------<br/>
<%=(String)request.getAttribute("username")%><br/>
<%=(String)request.getAttribute("password")%><br/>
--------------------------------------------------<br/>
-----${username}-------<br/>
${password}<br/>
123456cq
</body>
</html>
2.2EL标识符
为了避免出现非法的标识符,在定义标识符时还需要遵循以下规范。
• 不能以数字开头。
• 不能是EL中的保留字,如and、or、gt。
• 不能是EL隐式对象,如pageContext。
• 不能包含单引号(’)、双引号(")、减号(-)和正斜杠(/)等特殊字符。
2.3EL保留字
保留字就是编程语言里事先定义好并赋予了特殊含义的单词。和其他语言一样,EL 表达式中也定义了许多保留字,如false、not等,接下来就列举EL中所有的保留字,具体如下。
and eq gt true instanceofor
or ne le false empty
not lt ge null div mod
需要注意的是,EL表达式中的这些保留字不能被作为标识符,以免在程序编译时发生错误。
2.4EL中的变量
EL表达式中的变量就是一个基本的存储单元,EL表达式可以将变量映射到一个对象上,具体示例如下所示。
${product}
在上述示例中,product就是一个变量。EL表达式中的变量不用事先定义就可以直接使用,例如,表达式${product}就可以访问变量product的值。
2.5EL中的常量
1.布尔常量
true、false
2.整型常量
与 Java 中的十进制的整型常量相同,它的取值范围是 Java 语言中定义的常量Long.MIN_VALUE到Long.MAX_VALUE之间,即(−2)63与263−1之间的整数。
3.浮点数常量
浮点数常量用整数部分加小数部分表示,也可以用指数形式表示,例如,1.2E4和1.2都是合法的浮点数常量。它的取值范围是 Java 语言中定义的常量 Double.MIN_VALUE 到Double.MAX_VALUE之间,即4.9E-324~1.8E308之间的浮点数。
4.字符串常量
字符串常量是用单引号或双引号引起来的一连串字符。由于字符串常量需要用单引号或双引号引起来,所以,字符串本身包含的单引号或双引号需要用反斜杠(\)进行转义,即用“’”表示字面意义上的单引号,用“"”表示字面意义上的双引号。如果字符串本身包含反斜杠(\),也要进行转义,即用“\”表示字面意义上的一个反斜杠。
需要注意的是,只有字符串常量用单引号引起来时,字符串本身包含的单引号才需要进行转义,而双引号不必进行转义;只有字符串常量用双引号引起来时,字符串本身包含的双引号才需要进行转义,而单引号不必转义,例如"ab’4c"d5\e"表示的字符串是ab’4c"d5\e。
5.NUll常量
null常用于表示变量应用的对象为空。
2.6EL中的运算符
EL表达式支持简单的运算,例如,加(+)、减(-)、乘(*)、除(/)等。为此,在EL中提供了多种运算符,根据运算方式的不同,EL中的运算符包括以下几种:
1.点运算符
(.)EL 表达式中的点运算符,用于访问 JSP 页面中某些对象的属性,如 JavaBean 对象、List集合、Array数组等,其语法格式如下。
${customer.name}
在上述语法格式中,表达式${customer.name}中点运算符的作用就是访问customer对象中的name属性。
2.方括号运算符
EL表达式中的方括号运算符与点运算符的功能相同,都用于访问JSP页面中某些对象的属性。当获取的属性名中包含一些特殊符号,如“-”或“?”等并非字母或数字的符号,就只能使用方括号运算符来访问该属性,其语法格式如下。${user[“My-Name”]}
需要注意的是,在访问对象的属性时,通常情况都会使用点运算符作为简单的写法。但实际上,方括号运算符比点运算符应用更广泛。接下来就对比一下这两种运算符在实际开发中的应用,具体如下。
• 点运算符和方括号运算符在某种情况下可以互换,如${student.name}
等价于${student[“name”]}
。
• 方括号运算符还可以访问List集合或数组中指定索引的某个元素,如表达式${users[0]}
用于访问集合或数组中第1个元素。在这种情况下,只能使用方括号运算符,而不能使用点运算符。
• 方括号运算符和点运算符可以相互结合使用,例如,表达式${users[0].userName}可以访问集合或数组中的第1个元素的userName属性。
3.算术运算符
EL 表达式中的算术运算符用于对整数和浮点数的值进行算术运算。使用这些算术运算符可以非常方便地在JSP页面进行算术运算,并且可以简化页面的代码量。
- EL比较运算符
EL表达式中的比较运算符用于比较两个操作数的大小,操作数可以是各种常量、EL变量或EL表达式,所有的运算符执行的结果都是布尔类型。
5.逻辑运算符
EL 表达式中的逻辑运算符用于对结果为布尔类型的表达式进行运算,运算的结果仍为布尔类型。
6.empty运算符
EL表达式中的empty运算符用于判断某个对象是否为null或" ",结果为布尔类型,其基本的语法格式如下所示。
${empty var}
• var变量不存在,即没有定义,例如表达式
e
m
p
t
y
n
a
m
e
,
如
果
不
存
在
n
a
m
e
变
量
,
就
返
回
t
r
u
e
;
•
v
a
r
变
量
的
值
为
n
u
l
l
,
例
如
表
达
式
{empty name},如果不存在name变量,就返回true; • var变量的值为null,例如表达式
emptyname,如果不存在name变量,就返回true;•var变量的值为null,例如表达式{empty customer.name},如果customer.name的值为null,就返回true;
• var变量引用集合(Set、Map和List)类型对象,并且在集合对象中不包含任何元素时,则返回值为true。例如,如果表达式${empty list}中list集合中没有任何元素,就返回true。
7.条件运算符
EL表达式中条件运算符用于执行某种条件判断,它类似于Java语言中的if-else语句,其语法格式如下。
A
?
B
:
C
在
上
述
语
法
格
式
中
,
表
达
式
A
的
计
算
结
果
为
布
尔
类
型
,
如
果
表
达
式
A
的
计
算
结
果
为
t
r
u
e
,
就
执
行
表
达
式
B
,
并
返
回
B
的
值
;
如
果
表
达
式
A
的
计
算
结
果
为
f
a
l
s
e
,
就
执
行
表
达
式
C
,
并
返
回
C
的
值
,
例
如
表
达
式
‘
{A?B:C} 在上述语法格式中,表达式A的计算结果为布尔类型,如果表达式A的计算结果为true,就执行表达式B,并返回B的值;如果表达式A的计算结果为false,就执行表达式C,并返回C的值,例如表达式`
A?B:C在上述语法格式中,表达式A的计算结果为布尔类型,如果表达式A的计算结果为true,就执行表达式B,并返回B的值;如果表达式A的计算结果为false,就执行表达式C,并返回C的值,例如表达式‘{(1==2)?3:4}`的结果就为4。
8.“( ) ”运算符
EL 表达式中的圆括号用于改变其他运算符的优先级,例如表达式
a
∗
b
+
c
,
正
常
情
况
下
会
先
计
算
a
∗
b
的
积
,
然
后
再
将
计
算
的
结
果
与
c
相
加
,
如
果
在
这
个
表
达
式
中
加
一
个
圆
括
号
运
算
符
,
将
表
达
式
修
改
为
‘
{a*b+c},正常情况下会先计算 a*b 的积,然后再将计算的结果与 c 相加,如果在这个表达式中加一个圆括号运算符,将表达式修改为`
a∗b+c,正常情况下会先计算a∗b的积,然后再将计算的结果与c相加,如果在这个表达式中加一个圆括号运算符,将表达式修改为‘{a*(b+c)}`,这样则先计算b与c的和,再将计算的结果与a相乘。需要注意的是,EL表达式中的运算符都有不同的运算优先级,当EL表达式中包含多种运算符时,它们必须按照各自优先级的大小来进行运算。
2.7EL隐式对象
2.7.1pageContext对象
在jsp中通过EL中的pageContext对象得到jsp中的一切内置对象。因此如果要在EL中使用jsp内置对象可以通过pageContext间接获取。pageContext是连接EL和jsp内置对象的桥梁。
${pageContext.page}
${pageContext.request}//取得request对象
${pageContext.resbonse}//取得response对象
${pageContext.exception}//取得exception对象
等等 类似的还可以得到jsp其他内置对象
2.7.2Web域对象
1、PageContext :页面范围的数据
2、ServletRequest:请求范围的数据
3、HttpSession:回话范围的数据
4、ServletContext:应用范围的数据
2.7.3参数访问对象
主要有以下两种方式:
- Param : 获取文本框、密码框、单选框等的值
- paramValues :获取复选框的值
下面是在jsp页面通过EL获取表单信息的代码
-------获取表单数据-----
${param.name}
${paramValues.hobbies[0]}
${paramValues.hobbies[1]}
${paramValues.hobbies[2]}
2.7.4cookie对象
该对象是一个代表所有Cookie信息的Map集合,Map集合中的元素的键为各个Cookie的名称,值则为对应的Cookie对象
格式:
获取cookie对象的信息:${cookie.userName}
获取cookie对象的名称:${cookie.userName.name}
获取cookie对象的值:${cookie.userName.value}