一、JavaBean的概念(*****)
1、JavaBean就是一个遵循特殊写法的普通类
2、特殊写法
a、必须有默认的构造方法
b、所有字段定位私有的
c、提供公有的getter或setter方法,属性
d、一般实现java.io.Serializable (session的持久化需要)
3、一定要符合Java的命名规范。
4、应用场景:(***)
在企业级开发中,JavaBean是用来传递数据的。
二、JavaWeb的开发模型(*****)
开发原则:JSP页面中不能出现一行Java脚本<%%>和Java表达式<%=%>
Java脚本:替代方案,自定义标签。
Java表达式:替代方案,EL表达式。 Struts2框架:OGNL表达式。
模型一:了解:JSP+JavaBean : 易造成业务逻辑混乱,只适合业务逻辑简单的小程序;
模型二:开发实际应用: MVC+三层架构(Servlet+JSP+JavaBean)
程序中
M:厨师 JavaBean:模型
V:上的菜 JSP:显示页面
C: 服务台 Servlet:控制器
三、JSP中操作JavaBean的动作元素(***)
jsp:useBean
作用:用于在指定域范围内查找指定名称的JavaBean对象,找到了就直接使用;
没有找到,创建一个,并放到指定的域范围内。
属性:
id:必须的。JavaBean的名称
class:JavaBean的完整类名
scope:域范围。默认是page范围。可选值:page request session application
注意:如果该标签有主体内容,只在创建新对象时才会执行。
当scope为page或request时,每次都执行主体内容 ;
为session或appli时,只第一次执行主体内容
例:
----------------------------------------------------------------------------------------
<jsp:useBean id="p" class="cn.itcast.domain.Person" scope="page">凤姐</jsp:useBean>
<%=p.getName() %>
原理:
cn.itcast.domain.Person p = null;
synchronized{
p = (cn.itcast.domain.Person)pageContext.getAttribute("p",PageContext.PAGE_SCOPE);
if(p == null){
p = new cn.itcast.domain.Person();
pageContext.setAttribute("p",p,PageContext.PAGE_SCOPE);
}
}
----------------------------------------------------------------------------------------
jsp:setProperty(必须先使用useBean)
作用:调用JavaBean的setter方法。还能自动类型转换,仅限基本类型
属性:
property:必须的。属性名称。比如setName,名称是name。可以使用通配符*。
使用前提是请求参数的名称与属性的名称完全一致。
name:必须的。哪个对象的,即jsp:useBean中的id的取值。
value:属性的取值。支持直接量;支持表达式(<%=表达式%>)。
param:请求参数名
例:
----------------------------------------------------------------------------------------
<!-- 利用value属性设置JavaBean的各种属性 -->
<% String s = "fuck"; %>
<jsp:useBean class="cn.itcast.domain.Person" scope="page" ></jsp:useBean>
<jsp:setProperty property="name" name="p" value="<%=s %>" />
<jsp:setProperty property="gender" name="p" value="male" />
<%=p.getName() %> <br/>
<%=p.getGender() %> <br/>
----------------------------------------------------------------------------------------
<!-- 利用请求参数名设置JavaBean的各种属性 -->
<!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
<jsp:setProperty property="name" name="p" param="name"/>
<jsp:setProperty property="gender" name="p" param="gender"/>
<%=p.getName() %> <br/>
<%=p.getGender() %> <br/>
原理:
String name = request.getParameter("name");
p.setName(name);
----------------------------------------------------------------------------------------
<!-- 请求参数的名称和属性的名称一致时,可以使用通配符* -->
<!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
<jsp:setProperty property="*" name="p"/>
<%=p.getName() %> <br/>
<%=p.getGender() %> <br/>
----------------------------------------------------------------------------------------
jsp:getProperty
作用:调用JavaBean的getter方法。
属性:
property:必须的。属性的名称。比如getName,名称是name。
name:必须的。哪个对象的, 即jsp:useBean中的id的取值。
例:
----------------------------------------------------------------------------------------
<!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
<jsp:setProperty property="*" name="p"/>
<jsp:getProperty property="gender" name="p"/>
----------------------------------------------------------------------------------------
四、EL表达式(*****)
它只是JSP中的表达式,不是一种开发语言,为了替代JSP中的java表达式。
基本语法:${EL表达式}
4.1获取数据
EL表达式只能获取四大域中的数据(*****)。
EL表达式获取的对象如果是null,页面不会显示数据。因此,EL表达式中永远不会出现空指针异常
p.name:调用域中名称为p对象的getName方法,点运算符是用于获取属性的取值的。
原理: 调用pageContext.findAttribute("p")方法
依次从page request session(注意缓存) application域范围内找名称p对应的对象
例:
----------------------------------------------------------------------------------------------------------
<!-- 获取域中JavaBean的普通属性的方式 -->
<jsp:useBean id="p" class="cn.itcast.domain.Person" ></jsp:useBean>
法1: <%=p.getName() %><br/>
法2: <jsp:getProperty property="name" name="p"/><br/>
法3: ${p.name} (选该方式)
${p['name']}
----------------------------------------------------------------------------------------------------------
<!-- 获取域中JavaBean的类属性的方式 -->
public class Person implements Serializable {
private Address address = new Address();
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
}
public class Address {
private String city = "上海";
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
}
<jsp:useBean id="p" class="cn.itcast.domain.Person" ></jsp:useBean>
${p.address.city}
注: 要考虑清楚.后为什么元素 p.address == new Address(); p.address.city == 上海;
----------------------------------------------------------------------------------------------------------
<!-- 获取数组中指定的元素 -->
String[] str = {"a","b","c"};
// 注意:要将数组弄到域对象中才能被EL表达式操作
pageContext.setAttribute("str",str);
${str[1]}
----------------------------------------------------------------------------------------------------------
<!-- 获取List集合中指定的元素 -->
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
pageContext.setAttribute("list",list);
${list[2]}
----------------------------------------------------------------------------------------------------------
<!-- 获取Map集合中指定的元素 -->
Map map1 = new LinkedHashMap();
map1.put("a","aaa");
map1.put("b","bbb");
map1.put("c","ccc");
pageContext.setAttribute("mm1",map1);
${mm1.b}
----------------------------------------------------------------------------------------------------------
Map map2 = new LinkedHashMap();
// 注: 若键为数字,必须换为字符串 因为JSP没有自动装/拆箱
map2.put("1","aaa");
map2.put("2","bbb");
map2.put("3","ccc");
pageContext.setAttribute("mm2",map2);
${mm2["3"]}
----------------------------------------------------------------------------------------------------------
Map map3 = new LinkedHashMap();
map3.put("a", new Person("谢霆锋","男", true));
map3.put("b",new Person("张卫健","男", true));
map3.put("c",new Person("刘德华","男", false));
pageContext.setAttribute("mm3",map3);
${mm3["a"].name }<br/>
${mm3.c.name}
----------------------------------------------------------------------------------------------------------
4.2数学逻辑运算:
运算符:
empty运算符:如果判断的对象是null或者空字符串,都返回true。
对于集合,即使集合对象本身不是null,没有任何元素,也返回true。
.运算符 和 []运算符:
.运算符能做的,[]也能做。[]能做的,.不一定能做。
如${p.name}===${p['name']}==${p["name"]}
[]运算符优秀在可以取不符合Java命名规范的东东。
如: ${headerValues["accept-encoding"][0]}
注: EL表达式不支持字符串连接操作。
例:
----------------------------------------------------------------------------------------------------------
${s}<br/> // 什么都没有
${empty ""}<br/> // true
${empty s}<br/> // true
----------------------------------------------------------------------------------------------------------
List list = new ArrayList();
// list.add("aaa");
pageContext.setAttribute("list",list);
${empty list} // true 若加入元素后,为false
----------------------------------------------------------------------------------------------------------
//session.setAttribute("user","谢霆锋");
${empty user?"请登录":"欢迎您:"}${user}
----------------------------------------------------------------------------------------------------------
// 0 女 1 男
pageContext.setAttribute("gender","1");
${gender=="0"?"女":"男"}
----------------------------------------------------------------------------------------------------------
4.3获取JSP的内置对象(11大EL内置对象):
难点,不要与JSP的内置对象和范围名称搞混
11大EL隐式对象中,其中pageContext是表示自身对象外,其余都是表示的Map结构
例:
------------------------------------------------------------------------------------------------------------------------------
PageContext内置对象
${pageContext}<br/>
<!-- 在EL中得到HttpServletRequest对象 -->
${pageContext.request }<br/>
<!-- 在EL中获取当前应用的名称 -->
${pageContext.request.contextPath}<br/>
<!-- 获取HttpServletResponse采用的编码 -->
${pageContext.response.characterEncoding}<br/>
------------------------------------------------------------------------------------------------------------------------------
PageScope内置对象
<%
pageContext.setAttribute("a","aa");
pageContext.setAttribute("p1",new Person("刘谦","男",false));
${pageScope.a}<br/>
%>
${pageScope.p1.name}<br/>
------------------------------------------------------------------------------------------------------------------------------
RequestScope内置对象
<%
pageContext.setAttribute("p2",new Person("刘非","女",false),PageContext.REQUEST_SCOPE);
%>
${requestScope.p2.gender}
------------------------------------------------------------------------------------------------------------------------------
sessionScope内置对象
<%
pageContext.setAttribute("user","abc");
Person person = new Person("刘亦菲","女",true);
session.setAttribute("user",person);
%>
${empty sessionScope.user?"请登录":"欢迎您:"}${sessionScope.user.name} // 注: 要指定user的查找范围
------------------------------------------------------------------------------------------------------------------------------
applicationScope内置对象如上
------------------------------------------------------------------------------------------------------------------------------
param内置对象 注: 参数重名,则值显示第一个参数和值;
// 获取get方式提交的参数值
<!-- 访问: http://localhost:8080/day10/4.jsp?username=aaa&username=bbb&password=123 -->
${param}<br/> // {username=aaa password=123}
${param.username}<br/> // aaa
${param.username} == ${param.password}<br/> // aaa=123
// 获取post方式提交的参数值
<form action="2.jsp" method="post">
<textarea rows="6" cols="8" name="tt">/<textarea><br/><br/>
<input type="submit" value="提交">
</form>
${param.tt}
------------------------------------------------------------------------------------------------------------------------------
paramValues内置对象
<!-- 访问: http://localhost:8080/day10/4.jsp?username=aaa&username=bbb&password=123 -->
${paramValues}<br/> // {username=Java.lang.String@ab56bc,password=Java.lang.String@ab56bc}
${paramValues.username[0]}<br/> // aaa
${paramValues.username[1]}<br/> // bbb
${paramValues.password[0]}<br/> // 123
------------------------------------------------------------------------------------------------------------------------------
header内置对象
${header["accept-encoding"]} // 注: 必须用【】运算符
------------------------------------------------------------------------------------------------------------------------------
headerValues内置对象
${headerValues["accept-encoding"][0]}
------------------------------------------------------------------------------------------------------------------------------
cookie内置对象
<!-- 取JSESSIONID这个cookie的名称 -->
${cookie["JSESSIONID"].name}<br/>
<!-- 取JSESSIONID这个cookie的值 -->
${cookie.JSESSIONID.value}<br/>
// 注: cookie.JSESSIONID为cookie对象本身,为一个map, cookie.JSESSIONID.value为map的值
------------------------------------------------------------------------------------------------------------------------------
initParam内置对象
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
${initParam.encoding}
------------------------------------------------------------------------------------------------------------------------------
4.4调用普通类的静态方法(自定义EL函数) (有问题???)
编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤):
a、编写一个普通的java类,提供一个静态方法
public class FunctionDemo {
public static String toUpperCase(String str){
return str.toUpperCase();
}
}
b、在JavaWeb应用的WEB-INF目录下建立一个扩展名是tld(taglib definition)的XML文件(参考Tomcat中的示例)。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>myfn</short-name>
<uri>http://www.itcast.cn/myfn</uri>
<function><!-- 定义函数 -->
<name>toUppercase</name>
<function-class>cn.itcast.el.FunctionDemo</function-class>
<function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature>
</function>
</taglib>
c、(可选步骤)前提是把tld文件放到了WEB-INF目录下。
告知应用,tld文件和tld中的uri的对应。修改web.xml,增加以下内容:
<jsp-config>
<taglib>
<taglib-uri>http://www.itcast.cn/myfn</taglib-uri>
<taglib-location>/WEB-INF/myfn.tld</taglib-location>
</taglib>
</jsp-config>
d、在JSP中使用
用taglib指令,引入自定义的EL函数库
<%@ taglib uri="http://www.itcast.cn/myfn" prefix="myfn"%>
<%
pageContext.setAttribute("p","abcdefg");
%>
${myfn:toUppercase(p)} // 为何不管用???
五、SUN提供的标准EL函数库
JSTL标准标签:(Jsp Standard Tag Libary)
Core: 核心
Fmt: 国际化
SQL: 数据库操作
XML: xml操作
fn: EL函数库
需要导入JSTL的jar包:standard.jar和jstl.jar
参考 第18章 JSTL Functions标签库
注: 没有提示,需要使用某个函数时要参考文档;若没有,则自定义函数
例:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
${fn:contains("asdf","asd") }
<%
// html标签的转义 直接输出纯文本
pageContext.setAttribute("h","<h1>haha</h1>");
%>
${fn:escapeXml(h) }<br/><br/>
六、JSTL中的核心标签库(替换掉JSP中的Java脚本)
需要导入JSTL的jar包:standard.jar和jstl.jar
需要引入:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
c:if
作用:判断是否为true,如果为true,那么标签的主体内容就会显示。
属性:
test:必须的。要求必须是boolean的。支持表达式(EL或Java表达式)
var:保存test运算结果的变量
scope: 保存的域范围。默认是page
例:
-----------------------------------------------------------------------------
<%
session.setAttribute("user","谢霆锋");
%>
<c:if test="${sessionScope.user == null}">
对不起!请登录
</c:if>
<c:if test="${sessionScope.user != null}">
欢迎您:${sessionScope.user }
</c:if>
-----------------------------------------------------------------------------
c:forEach
遍历:数组、List、Set、Map
属性:
items:要遍历的目标对象。支持表达式
var: 变量名。指向当前遍历的集合中的一个元素
begin:开始的索引(含),从0开始
end: 结束的索引(含)
step: 步长。默认是1
varStatus:取一个名字,引用了一个对象。
varStatus对象有以下方法:
int getIndex():当前记录的索引号。从0开始
int getCount():当前记录的顺序。从1开始
boolean isFirst():是否是第一条记录
boolean isLast():是否是最后一条记录
例:
-----------------------------------------------------------------------------
遍历数组
<%
String str[] = {"a","b","c"};
pageContext.setAttribute("str",str);
%>
<c:forEach items="${str}" var="s">
${s}<br/>
</c:forEach>
-----------------------------------------------------------------------------
遍历list集合
List list = new ArrayList();
list.add("aa");
list.add("bb");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list}" var="e">
${e}<br/>
</c:forEach>
-----------------------------------------------------------------------------
遍历set集合
<%
Set set = new HashSet();
set.add("aaa");
set.add("bbb");
set.add("ccc");
pageContext.setAttribute("set",set);
%>
<c:forEach items="${set}" var="e">
${e}<br/>
</c:forEach>
-----------------------------------------------------------------------------
遍历map集合
<%
Map map = new LinkedHashMap();
map.put("a","aaaa");
map.put("b","bbbb");
map.put("1","1111");
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="me">
${me.key} = ${me.value }<br/>
</c:forEach>
-----------------------------------------------------------------------------
<c:forEach begin="1" end="5" var="s">
${s}<br/> // 1,2,3,4,5
</c:forEach>
<%
String s1[] = {"a","b","c","d","e","f"};
pageContext.setAttribute("s1",s1);
%>
<c:forEach items="${s1}" var="s" begin="1" end="4" >
${s}<br/> // b,c,d,e
</c:forEach>
<c:forEach items="${s1}" step="2" >
${s}<br/> // a,c,e
</c:forEach>
<c:forEach items="${s1}" var="s" begin="1" end="4" step="2">
${s}<br/> // b,d,e
</c:forEach>
-----------------------------------------------------------------------------
应用:
<%
List<Person> ps = new ArrayList<Person>();
ps.add(new Person("谢霆锋","1",true));
ps.add(new Person("张卫健","1",true));
ps.add(new Person("刘德华","1",true));
ps.add(new Person("高圆圆","0",false));
ps.add(new Person("baby","0",false));
pageContext.setAttribute("ps",ps);
%>
<table border="1" width="60%">
<tr>
<th>索引</th>
<th>顺序</th>
<th>第一个</th>
<th>最后一个</th>
<th>姓名</th>
<th>性别</th>
<th>婚姻</th>
</tr>
<c:forEach items="${ps}" var="p" varStatus="vs">
<tr bgcolor="${vs.index%2==0?'#CFCFCF':'#4D88A6' }">
<td>${vs.index}</td>
<td>${vs.count}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${p.name}</td>
<td>${p.gender=="1"?"男":"女"}</td>
<td>${p.married?"已婚":"未婚"}</td>
</tr>
</c:forEach>
</table>
-----------------------------------------------------------------------------
1、JavaBean就是一个遵循特殊写法的普通类
2、特殊写法
a、必须有默认的构造方法
b、所有字段定位私有的
c、提供公有的getter或setter方法,属性
d、一般实现java.io.Serializable (session的持久化需要)
3、一定要符合Java的命名规范。
4、应用场景:(***)
在企业级开发中,JavaBean是用来传递数据的。
二、JavaWeb的开发模型(*****)
开发原则:JSP页面中不能出现一行Java脚本<%%>和Java表达式<%=%>
Java脚本:替代方案,自定义标签。
Java表达式:替代方案,EL表达式。 Struts2框架:OGNL表达式。
模型一:了解:JSP+JavaBean : 易造成业务逻辑混乱,只适合业务逻辑简单的小程序;
模型二:开发实际应用: MVC+三层架构(Servlet+JSP+JavaBean)
程序中
M:厨师 JavaBean:模型
V:上的菜 JSP:显示页面
C: 服务台 Servlet:控制器
三、JSP中操作JavaBean的动作元素(***)
jsp:useBean
作用:用于在指定域范围内查找指定名称的JavaBean对象,找到了就直接使用;
没有找到,创建一个,并放到指定的域范围内。
属性:
id:必须的。JavaBean的名称
class:JavaBean的完整类名
scope:域范围。默认是page范围。可选值:page request session application
注意:如果该标签有主体内容,只在创建新对象时才会执行。
当scope为page或request时,每次都执行主体内容 ;
为session或appli时,只第一次执行主体内容
例:
----------------------------------------------------------------------------------------
<jsp:useBean id="p" class="cn.itcast.domain.Person" scope="page">凤姐</jsp:useBean>
<%=p.getName() %>
原理:
cn.itcast.domain.Person p = null;
synchronized{
p = (cn.itcast.domain.Person)pageContext.getAttribute("p",PageContext.PAGE_SCOPE);
if(p == null){
p = new cn.itcast.domain.Person();
pageContext.setAttribute("p",p,PageContext.PAGE_SCOPE);
}
}
----------------------------------------------------------------------------------------
jsp:setProperty(必须先使用useBean)
作用:调用JavaBean的setter方法。还能自动类型转换,仅限基本类型
属性:
property:必须的。属性名称。比如setName,名称是name。可以使用通配符*。
使用前提是请求参数的名称与属性的名称完全一致。
name:必须的。哪个对象的,即jsp:useBean中的id的取值。
value:属性的取值。支持直接量;支持表达式(<%=表达式%>)。
param:请求参数名
例:
----------------------------------------------------------------------------------------
<!-- 利用value属性设置JavaBean的各种属性 -->
<% String s = "fuck"; %>
<jsp:useBean class="cn.itcast.domain.Person" scope="page" ></jsp:useBean>
<jsp:setProperty property="name" name="p" value="<%=s %>" />
<jsp:setProperty property="gender" name="p" value="male" />
<%=p.getName() %> <br/>
<%=p.getGender() %> <br/>
----------------------------------------------------------------------------------------
<!-- 利用请求参数名设置JavaBean的各种属性 -->
<!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
<jsp:setProperty property="name" name="p" param="name"/>
<jsp:setProperty property="gender" name="p" param="gender"/>
<%=p.getName() %> <br/>
<%=p.getGender() %> <br/>
原理:
String name = request.getParameter("name");
p.setName(name);
----------------------------------------------------------------------------------------
<!-- 请求参数的名称和属性的名称一致时,可以使用通配符* -->
<!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
<jsp:setProperty property="*" name="p"/>
<%=p.getName() %> <br/>
<%=p.getGender() %> <br/>
----------------------------------------------------------------------------------------
jsp:getProperty
作用:调用JavaBean的getter方法。
属性:
property:必须的。属性的名称。比如getName,名称是name。
name:必须的。哪个对象的, 即jsp:useBean中的id的取值。
例:
----------------------------------------------------------------------------------------
<!-- http://localhost:8080/day10/1.jsp?name=asb&gender=male -->
<jsp:setProperty property="*" name="p"/>
<jsp:getProperty property="gender" name="p"/>
----------------------------------------------------------------------------------------
四、EL表达式(*****)
它只是JSP中的表达式,不是一种开发语言,为了替代JSP中的java表达式。
基本语法:${EL表达式}
4.1获取数据
EL表达式只能获取四大域中的数据(*****)。
EL表达式获取的对象如果是null,页面不会显示数据。因此,EL表达式中永远不会出现空指针异常
p.name:调用域中名称为p对象的getName方法,点运算符是用于获取属性的取值的。
原理: 调用pageContext.findAttribute("p")方法
依次从page request session(注意缓存) application域范围内找名称p对应的对象
例:
----------------------------------------------------------------------------------------------------------
<!-- 获取域中JavaBean的普通属性的方式 -->
<jsp:useBean id="p" class="cn.itcast.domain.Person" ></jsp:useBean>
法1: <%=p.getName() %><br/>
法2: <jsp:getProperty property="name" name="p"/><br/>
法3: ${p.name} (选该方式)
${p['name']}
----------------------------------------------------------------------------------------------------------
<!-- 获取域中JavaBean的类属性的方式 -->
public class Person implements Serializable {
private Address address = new Address();
public Address getAddress() { return address; }
public void setAddress(Address address) { this.address = address; }
}
public class Address {
private String city = "上海";
public String getCity() { return city; }
public void setCity(String city) { this.city = city; }
}
<jsp:useBean id="p" class="cn.itcast.domain.Person" ></jsp:useBean>
${p.address.city}
注: 要考虑清楚.后为什么元素 p.address == new Address(); p.address.city == 上海;
----------------------------------------------------------------------------------------------------------
<!-- 获取数组中指定的元素 -->
String[] str = {"a","b","c"};
// 注意:要将数组弄到域对象中才能被EL表达式操作
pageContext.setAttribute("str",str);
${str[1]}
----------------------------------------------------------------------------------------------------------
<!-- 获取List集合中指定的元素 -->
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
pageContext.setAttribute("list",list);
${list[2]}
----------------------------------------------------------------------------------------------------------
<!-- 获取Map集合中指定的元素 -->
Map map1 = new LinkedHashMap();
map1.put("a","aaa");
map1.put("b","bbb");
map1.put("c","ccc");
pageContext.setAttribute("mm1",map1);
${mm1.b}
----------------------------------------------------------------------------------------------------------
Map map2 = new LinkedHashMap();
// 注: 若键为数字,必须换为字符串 因为JSP没有自动装/拆箱
map2.put("1","aaa");
map2.put("2","bbb");
map2.put("3","ccc");
pageContext.setAttribute("mm2",map2);
${mm2["3"]}
----------------------------------------------------------------------------------------------------------
Map map3 = new LinkedHashMap();
map3.put("a", new Person("谢霆锋","男", true));
map3.put("b",new Person("张卫健","男", true));
map3.put("c",new Person("刘德华","男", false));
pageContext.setAttribute("mm3",map3);
${mm3["a"].name }<br/>
${mm3.c.name}
----------------------------------------------------------------------------------------------------------
4.2数学逻辑运算:
运算符:
empty运算符:如果判断的对象是null或者空字符串,都返回true。
对于集合,即使集合对象本身不是null,没有任何元素,也返回true。
.运算符 和 []运算符:
.运算符能做的,[]也能做。[]能做的,.不一定能做。
如${p.name}===${p['name']}==${p["name"]}
[]运算符优秀在可以取不符合Java命名规范的东东。
如: ${headerValues["accept-encoding"][0]}
注: EL表达式不支持字符串连接操作。
例:
----------------------------------------------------------------------------------------------------------
${s}<br/> // 什么都没有
${empty ""}<br/> // true
${empty s}<br/> // true
----------------------------------------------------------------------------------------------------------
List list = new ArrayList();
// list.add("aaa");
pageContext.setAttribute("list",list);
${empty list} // true 若加入元素后,为false
----------------------------------------------------------------------------------------------------------
//session.setAttribute("user","谢霆锋");
${empty user?"请登录":"欢迎您:"}${user}
----------------------------------------------------------------------------------------------------------
// 0 女 1 男
pageContext.setAttribute("gender","1");
${gender=="0"?"女":"男"}
----------------------------------------------------------------------------------------------------------
4.3获取JSP的内置对象(11大EL内置对象):
难点,不要与JSP的内置对象和范围名称搞混
11大EL隐式对象中,其中pageContext是表示自身对象外,其余都是表示的Map结构
例:
------------------------------------------------------------------------------------------------------------------------------
PageContext内置对象
${pageContext}<br/>
<!-- 在EL中得到HttpServletRequest对象 -->
${pageContext.request }<br/>
<!-- 在EL中获取当前应用的名称 -->
${pageContext.request.contextPath}<br/>
<!-- 获取HttpServletResponse采用的编码 -->
${pageContext.response.characterEncoding}<br/>
------------------------------------------------------------------------------------------------------------------------------
PageScope内置对象
<%
pageContext.setAttribute("a","aa");
pageContext.setAttribute("p1",new Person("刘谦","男",false));
${pageScope.a}<br/>
%>
${pageScope.p1.name}<br/>
------------------------------------------------------------------------------------------------------------------------------
RequestScope内置对象
<%
pageContext.setAttribute("p2",new Person("刘非","女",false),PageContext.REQUEST_SCOPE);
%>
${requestScope.p2.gender}
------------------------------------------------------------------------------------------------------------------------------
sessionScope内置对象
<%
pageContext.setAttribute("user","abc");
Person person = new Person("刘亦菲","女",true);
session.setAttribute("user",person);
%>
${empty sessionScope.user?"请登录":"欢迎您:"}${sessionScope.user.name} // 注: 要指定user的查找范围
------------------------------------------------------------------------------------------------------------------------------
applicationScope内置对象如上
------------------------------------------------------------------------------------------------------------------------------
param内置对象 注: 参数重名,则值显示第一个参数和值;
// 获取get方式提交的参数值
<!-- 访问: http://localhost:8080/day10/4.jsp?username=aaa&username=bbb&password=123 -->
${param}<br/> // {username=aaa password=123}
${param.username}<br/> // aaa
${param.username} == ${param.password}<br/> // aaa=123
// 获取post方式提交的参数值
<form action="2.jsp" method="post">
<textarea rows="6" cols="8" name="tt">/<textarea><br/><br/>
<input type="submit" value="提交">
</form>
${param.tt}
------------------------------------------------------------------------------------------------------------------------------
paramValues内置对象
<!-- 访问: http://localhost:8080/day10/4.jsp?username=aaa&username=bbb&password=123 -->
${paramValues}<br/> // {username=Java.lang.String@ab56bc,password=Java.lang.String@ab56bc}
${paramValues.username[0]}<br/> // aaa
${paramValues.username[1]}<br/> // bbb
${paramValues.password[0]}<br/> // 123
------------------------------------------------------------------------------------------------------------------------------
header内置对象
${header["accept-encoding"]} // 注: 必须用【】运算符
------------------------------------------------------------------------------------------------------------------------------
headerValues内置对象
${headerValues["accept-encoding"][0]}
------------------------------------------------------------------------------------------------------------------------------
cookie内置对象
<!-- 取JSESSIONID这个cookie的名称 -->
${cookie["JSESSIONID"].name}<br/>
<!-- 取JSESSIONID这个cookie的值 -->
${cookie.JSESSIONID.value}<br/>
// 注: cookie.JSESSIONID为cookie对象本身,为一个map, cookie.JSESSIONID.value为map的值
------------------------------------------------------------------------------------------------------------------------------
initParam内置对象
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
${initParam.encoding}
------------------------------------------------------------------------------------------------------------------------------
4.4调用普通类的静态方法(自定义EL函数) (有问题???)
编写步骤(自定义EL函数的编写步骤即自定义标签的编写步骤):
a、编写一个普通的java类,提供一个静态方法
public class FunctionDemo {
public static String toUpperCase(String str){
return str.toUpperCase();
}
}
b、在JavaWeb应用的WEB-INF目录下建立一个扩展名是tld(taglib definition)的XML文件(参考Tomcat中的示例)。内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>myfn</short-name>
<uri>http://www.itcast.cn/myfn</uri>
<function><!-- 定义函数 -->
<name>toUppercase</name>
<function-class>cn.itcast.el.FunctionDemo</function-class>
<function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature>
</function>
</taglib>
c、(可选步骤)前提是把tld文件放到了WEB-INF目录下。
告知应用,tld文件和tld中的uri的对应。修改web.xml,增加以下内容:
<jsp-config>
<taglib>
<taglib-uri>http://www.itcast.cn/myfn</taglib-uri>
<taglib-location>/WEB-INF/myfn.tld</taglib-location>
</taglib>
</jsp-config>
d、在JSP中使用
用taglib指令,引入自定义的EL函数库
<%@ taglib uri="http://www.itcast.cn/myfn" prefix="myfn"%>
<%
pageContext.setAttribute("p","abcdefg");
%>
${myfn:toUppercase(p)} // 为何不管用???
五、SUN提供的标准EL函数库
JSTL标准标签:(Jsp Standard Tag Libary)
Core: 核心
Fmt: 国际化
SQL: 数据库操作
XML: xml操作
fn: EL函数库
需要导入JSTL的jar包:standard.jar和jstl.jar
参考 第18章 JSTL Functions标签库
注: 没有提示,需要使用某个函数时要参考文档;若没有,则自定义函数
例:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
${fn:contains("asdf","asd") }
<%
// html标签的转义 直接输出纯文本
pageContext.setAttribute("h","<h1>haha</h1>");
%>
${fn:escapeXml(h) }<br/><br/>
六、JSTL中的核心标签库(替换掉JSP中的Java脚本)
需要导入JSTL的jar包:standard.jar和jstl.jar
需要引入:<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
c:if
作用:判断是否为true,如果为true,那么标签的主体内容就会显示。
属性:
test:必须的。要求必须是boolean的。支持表达式(EL或Java表达式)
var:保存test运算结果的变量
scope: 保存的域范围。默认是page
例:
-----------------------------------------------------------------------------
<%
session.setAttribute("user","谢霆锋");
%>
<c:if test="${sessionScope.user == null}">
对不起!请登录
</c:if>
<c:if test="${sessionScope.user != null}">
欢迎您:${sessionScope.user }
</c:if>
-----------------------------------------------------------------------------
c:forEach
遍历:数组、List、Set、Map
属性:
items:要遍历的目标对象。支持表达式
var: 变量名。指向当前遍历的集合中的一个元素
begin:开始的索引(含),从0开始
end: 结束的索引(含)
step: 步长。默认是1
varStatus:取一个名字,引用了一个对象。
varStatus对象有以下方法:
int getIndex():当前记录的索引号。从0开始
int getCount():当前记录的顺序。从1开始
boolean isFirst():是否是第一条记录
boolean isLast():是否是最后一条记录
例:
-----------------------------------------------------------------------------
遍历数组
<%
String str[] = {"a","b","c"};
pageContext.setAttribute("str",str);
%>
<c:forEach items="${str}" var="s">
${s}<br/>
</c:forEach>
-----------------------------------------------------------------------------
遍历list集合
List list = new ArrayList();
list.add("aa");
list.add("bb");
pageContext.setAttribute("list",list);
%>
<c:forEach items="${list}" var="e">
${e}<br/>
</c:forEach>
-----------------------------------------------------------------------------
遍历set集合
<%
Set set = new HashSet();
set.add("aaa");
set.add("bbb");
set.add("ccc");
pageContext.setAttribute("set",set);
%>
<c:forEach items="${set}" var="e">
${e}<br/>
</c:forEach>
-----------------------------------------------------------------------------
遍历map集合
<%
Map map = new LinkedHashMap();
map.put("a","aaaa");
map.put("b","bbbb");
map.put("1","1111");
pageContext.setAttribute("map",map);
%>
<c:forEach items="${map}" var="me">
${me.key} = ${me.value }<br/>
</c:forEach>
-----------------------------------------------------------------------------
<c:forEach begin="1" end="5" var="s">
${s}<br/> // 1,2,3,4,5
</c:forEach>
<%
String s1[] = {"a","b","c","d","e","f"};
pageContext.setAttribute("s1",s1);
%>
<c:forEach items="${s1}" var="s" begin="1" end="4" >
${s}<br/> // b,c,d,e
</c:forEach>
<c:forEach items="${s1}" step="2" >
${s}<br/> // a,c,e
</c:forEach>
<c:forEach items="${s1}" var="s" begin="1" end="4" step="2">
${s}<br/> // b,d,e
</c:forEach>
-----------------------------------------------------------------------------
应用:
<%
List<Person> ps = new ArrayList<Person>();
ps.add(new Person("谢霆锋","1",true));
ps.add(new Person("张卫健","1",true));
ps.add(new Person("刘德华","1",true));
ps.add(new Person("高圆圆","0",false));
ps.add(new Person("baby","0",false));
pageContext.setAttribute("ps",ps);
%>
<table border="1" width="60%">
<tr>
<th>索引</th>
<th>顺序</th>
<th>第一个</th>
<th>最后一个</th>
<th>姓名</th>
<th>性别</th>
<th>婚姻</th>
</tr>
<c:forEach items="${ps}" var="p" varStatus="vs">
<tr bgcolor="${vs.index%2==0?'#CFCFCF':'#4D88A6' }">
<td>${vs.index}</td>
<td>${vs.count}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${p.name}</td>
<td>${p.gender=="1"?"男":"女"}</td>
<td>${p.married?"已婚":"未婚"}</td>
</tr>
</c:forEach>
</table>
-----------------------------------------------------------------------------