课程回顾:JSP技术、JavaBean技术和EL表达式
JSP的概述
1.JSP的概述
2.JSP的执行的原理
3.JSP的脚本元素
* <%! %>
* <%= %>
* <% %>
4.JSP的注释
*
* Java
* <%– –%>
JSP的指令
1.作用:设置JSP的属性,决定JSP执行的。
2.page指令:设置属性 <%@ page 属性名称=属性值 %>
3.include指令:包含页面。执行原理:静态包含:一起翻译,一起编译。执行。
4.taglib指令:引入标签库
JSP的内置对象
1.9个内置对象。request response session application config out page pageContext exception
2.out对象:输出内容。和PrintWriter有关系?JspWriter把缓冲区的内容先输出到response的PrintWriter缓冲区中,由response一起对外响应。
3.pageContext对象
* 域对象 存值和取值
* 一个顶9个 可以获取其他的8个内置对象 getRequest request response
* 向其他3个域对象中存取值
* findAttribute(“xxx”) 获取域对象中的值,默认从最小的域中取。
JSP的动作标签
1.转发
2.参数
3.动态包含:原理:自己翻译,自己编译,自己执行。另外一个的文件翻译,自己编译。执行。把执行的结果复制到一起,显示。
JavaBean的知识
1.JavaBean的规范
* 无参数的构造方法
* 属性私有
* 提供public 的get或者set方法
* 属性:由get或者set方法来决定的。
* 作用:封装数据。
2.JSP中封装数据
*
3.在Servlet中封装数据
* 内省的技术来封装
4.需要使用BeanUtils的工具类来完成数据的封装。导入jar包。导入2个jar包。
5.使用BeanUtils开发的步骤
* 接收数据
* 创建对象
* 使用BeanUtils.populate(user,map)
6.如果有特殊的数据类型(Date)
* BeanUtils默认不能转换该类型,需要自己编写转换的代码。
* 编写一个类实现Converter接口,重写方法。
* 在封装数据之前,注册的代码编写。
EL表达式
1.概述和语法
2.获取域对象中的值。
* 在域对象中存入字符串
msg∗在域对象中存入数组或者List集合
{arrs[0]}
* 在域对象中存入Map集合
map.aaa∗在域对象中存入List
{uList[0].username}
今天内容:EL表达式、JSTL标签库、EL函数库、自定义EL函数和自定义标签
EL表达式支持运算
1.EL表达式获取域对象中的值(重点掌握)
2.EL表达式支持运算(EL提供关键字,需要掌握)
* == eq 判断值是否相等
* != ne 判断值不相等
* < lt 小于
* > gt 大于
* <= le 小于等于
* >+ ge 大于等于
* && and 与
* || or 或
* ! not 非
* null empty 判断对象是否为null或者空
EL表达式获取WEB常用的对象
1.EL可以获取哪些WEB常用的对象?
2.这些对象有什么作用?
3.常见的WEB的对象
* pageScope – 从pageContext域中取值
* requestScope – 从request域中取值
* sessionScope – 从session域中取值
* applicationScope – 从application域中取值
* param – 可以获取请求的参数的值。相当于request.getParameter(“name”)
* paramValues – 可以获取请求参数的值。相当于request.getParameterValues(“checkbox”),返回是数组
* header – 获取请求头信息(获取的一个key对应一个value)
* headerValues – 获取请求头信息(获取的一个key对应多个value)
* initParam – 获取全局的初始化参数
* cookie – 获取cookie对象的名称和值
* EL表达式中cookie代表是所有的cookie的对象。想获取到cookie的名称为last的cookie。
* 正确的写法:
cookie.last.name−−名称为last的cookie的名称(last)
{cookie.last.value} – 或者值
* pageContext -- 获取的是JSP页面上pageContext对象的引用。
* <a href="${ pageContext.request.contextPath }/cookie1">cookie1</a>
JSTL的标签库(重点)
1.概述:在JSP中可以直接使用的JSTL的标签。
2.HTML的标签和JSTL的标签,HTML的标签使用浏览器打开。JSP的JSTL的标签必须先翻译,再编译,再执行。
3.目的:把JSP页面上的Java代码替代。
4.JSTL标签库的版本
* JSTL1.0的版本(不用),因为它不支持EL表达式。
* JSTL1.1和JSTL1.2版本,这两个版本没什么区别。支持EL表达式。\
5.下载响应的jar包,导入jar包。
* jstl.jar
* standard.jar
6.JSTL标签库的快速入门
* 导入jar包。
* 编写JSP文件,但是需要在JSP的文件中先引入标签库。
* 使用<%@ taglib %>指令引入标签库。
out标签(重点)
1.作用:输出常量或者输出域对象中值。
2.语法:
3.属性:
* value – 输出的内容(常量或者域对象中值)。
* default – 如果输出域对象中的属性不存在,输出默认值。
* escapeXml – 决定输出的内容是否转义。设置成false,不进行转义。
set标签(重点)
1.作用:向域对象中存入值。
2.语法:
3.属性:
* var – 域对象的key值
* value – 域对象中的value值
* scope – 域对象的范围(值:page request session application)
* target – 目标(规定只能是JavaBean或者Map集合),可以修改JavaBean或者Map集合中的值
* property – 属性
4.代码
${ msg }
<h3>修改JavaBean的属性的值</h3>
${ user.username }
<c:set target="${ user }" property="username" value="小凤"></c:set>
${ user.username }
remove标签
1.作用:删除域对象的属性和值。
2.语法:
3.属性:
* var – 要删除属性的名称
* scope – 域的范围
4.代码
${ username }
<h3>删除该属性</h3>
<c:remove var="username" scope="page" />
<!-- 显示的是"" 传统方式:null -->
${ username }
catch标签
1.作用:捕获异常的信息
2.语法:
3.属性:
* var – 如果发生了异常,把异常的信息保存到该变量中。
4.代码:
<%
int a = 10 / 0;
%>
${ e.message }
if标签(重点)
1.作用:判断的作用。
2.语法:
3.属性:
* test – 必须出现的。作用if标签执行的时候的判断条件
* var – test执行的结果会保存到该变量中(test执行true或者false)
* scope – 域的范围
4.代码:
num=10
flag = true
choose标签(复合标签)(重点)
1.作用:进行判断的作用
2.语法:
3.属性
* test – 进行判断使用,返回值是true或者false
4.代码:
num >10
num <= 10
num是啥?
foreach标签(重点)
1.作用:用来迭代数据。
2.语法:
3.属性: 增强for循环 for(String str : list){ } for(User user : list){ }
* var – 相当于str(变量)
* items – 相当于list(要遍历的集合)
* for(int i=0;i<=10;i++){ }
* var -- 定义int i
* begin -- 从哪开始(0,从0开始)
* end -- 到哪结束(10,到10结束)
* step -- 步长(i++ step=1)
* varStatus -- 记载迭代产生的信息
* index -- 小标值
* count -- 计数
* first -- 判断第一个位置是否有元素
* last -- 判断最后的位置是否有元素
4.代码一
<h3>遍历数组或者List和Set集合</h3>
<%
List<String> sList = new ArrayList<String>();
sList.add("美美");
sList.add("尹相杰");
sList.add("王学兵");
pageContext.setAttribute("sList", sList);
%>
<c:forEach var="str" items="${ sList }">
${ str }
</c:forEach>
<h4>遍历Map集合</h4>
<%
Map<String,String> map = new HashMap<String,String>();
map.put("aaa", "美美");
map.put("bbb", "小凤");
map.put("ccc", "如花");
pageContext.setAttribute("map", map);
%>
<c:forEach var="entry" items="${ map }">
${ entry.key } -- ${ entry.value }
</c:forEach>
<h4>使用table迭代数据</h4>
<table border="1" width="50%" cellpadding="10">
<tr>
<th>序号</th>
<th>姓名</th>
<th>密码</th>
<th>操作</th>
</tr>
<c:forEach var="user" items="${ requestScope.uList }" varStatus="status">
<tr align="center">
<td>${ status.count }</td>
<td>${ user.username }</td>
<td>${ user.password }</td>
<td><a href="${ pageContext.request.contextPath }/deleteUser?username=${user.username}">删除</a></td>
</tr>
</c:forEach>
</table>
<h4>从1遍历到10</h4>
<c:forEach var="i" begin="1" end="10" step="1">
${ i }
</c:forEach>
<h4>计算从1加到10的和</h4>
<c:set var="sum" value="0"></c:set>
<c:forEach var="i" begin="1" end="10" step="1">
<c:set var="sum" value="${ sum + i }" ></c:set>
</c:forEach>
${ sum }
<h4>测试varStatus属性</h4>
<c:forEach var="i" begin="1" end="10" step="2" varStatus="s">
${ i } -- ${ s.count }
</c:forEach>
<h4>遍历10到100的偶数,每到第3个数,显示红色</h4>
<c:forEach var="i" begin="10" end="100" step="2" varStatus="s">
<c:choose>
<c:when test="${ s.first }">
<font size="5">${ i }</font>
</c:when>
<c:when test="${ s.count % 3 eq 0 }">
<font color="red">${ i }</font>
</c:when>
<c:otherwise>
${ i }
</c:otherwise>
</c:choose>
</c:forEach>
url标签(重点)
1.作用:前台页面编写超链接,或者表单.img的src属性,可以使用c:url 标签来编写地址链接。好处:可以省略项目名称不写。
2.好处:学session的追踪。如果使用从标签,默认帮你进行重写jsessionid
import标签
1.作用:使用import标签可以包含页面。
redirect标签
1.作用:重定向的功能
param标签
1.作用:传递参数
forTokens标签(循环标签)
1.作用:按着指定的符号切割。
EL函数库
1.也是JSTL标签库提供了一组函数,EL函数库。使用EL函数可以很方便操作字符串。
2.使用EL函数
* 先导入EL函数库<%@ taglib prefix=”fn” uri=”http://java.sun.com/jsp/jstl/functions” %>
* 使用EL函数,语法:${fn:xxx}
自定义EL函数
1.需求:传入字符串,输出hello xxx
2.开发EL函数的步骤:
* 编写Java类,提供一个方法,必须是静态的。必须要有返回值。
package cn.itcast.el;
public class Eldemo {
/**
* sayHello
* @param str
* @return
*/
public static String sayHello(String str){
// 编码的问题
return “hello “+str;
}
}
* 需要提供配置文件(以.tld结尾的XML的文件)
* 注意:不能在lib和classes目录下编写配置文件
* 注意:创建配置文件的时候,最低选择2.0以上版本。
* xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
<!-- 配置自定义的EL函数 -->
<function>
<!-- 配置JSP页面上使用函数的名称 -->
<name>sayHi</name>
<!-- 配置Eldemo的全路径 -->
<function-class>cn.itcast.el.Eldemo</function-class>
<!-- 配置方法的签名 -->
<function-signature>java.lang.String sayHello(java.lang.String)</function-signature>
</function>
* 在JSP的页面上引入自己编写的EL函数。<%@ taglib prefix="myfn" uri="" %>
${ myfn:sayHi("小凤") }
自定义标签
1.自定义标签:把逻辑编写后台的Java代码中,给客户提供的标签。
2.自定义标签的执行顺序。看图。
自定义标签的入门(没有标签主体)
1.开发的步骤:
* 编写Java的类,实现SimpleTag接口,重写5个方法。SUN公司提供了实现类,继承该实现类。重写需要方法。
* 在.tld的文件上编写配置文件。
print
cn.itcast.jstl.JstlDemo1
empty
3.在JSP页面上,引入自定义标签。
<%@ taglib prefix=”myc” uri=”http://www.itcast.cn/0302/myc” %>
2.代码:
public class JstlDemo1 extends SimpleTagSupport{
private PageContext pc;
private JspFragment jspBody;
/**
* 服务器会默认调用该方法,把PageContext对象传入进来
*/
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
/**
* 把标签的主体传入进来
*/
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
/**
* 必须执行该方法
*/
public void doTag() throws JspException, IOException {
pc.getOut().print(“hello”);
}
}
自定义标签(包含标签主体)
1.需求:哈哈,把哈哈输出到客户端。
2.编写代码(注意:输出标签主体)
public class JstlDemo2 extends SimpleTagSupport{
private PageContext pc;
private JspFragment jspBody;
/**
* 最终执行
*/
public void doTag() throws JspException, IOException {
// 输出标签主体内容
jspBody.invoke(pc.getOut());
}
/**
* JspFragment对象传入来(JspFragment对象代表就是标签主体对象)
*/
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
/**
* 把PageContext对象传入来
*/
public void setJspContext(JspContext pc) {
this.pc = (PageContext)pc;
}
}
3.配置文件
out
cn.itcast.jstl.JstlDemo2
scriptless
4.在JSP页面使用
自定义标签(带有标签主体和属性)
1.需求:模拟
2.编写代码:
public class JstlDemo3 extends SimpleTagSupport{
private PageContext pc;
private JspFragment jspBody;
// 必须和页面上属性test的名称必须相同
// 必须该属性的set方法
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
/**
* 输出标签主体是有条件的?
*/
public void doTag() throws JspException, IOException {
if(test){
// 输出标签主体
jspBody.invoke(pc.getOut());
}
}
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
public void setJspContext(JspContext pc) {
this.pc = (PageContext)pc;
}
}
******* 注意事项:编写属性(和页面标签的属性名称必须相同),提供该属性的set方法。
3.编写配置文件
if
cn.itcast.jstl.JstlDemo3
scriptless
test
true
true
boolean
4.在JSP的页面上使用标签
<%
request.setAttribute(“num”, 10);
%>
num=10
明天的内容
1.JSP的开发的模式
2.完成注册和登陆功能。
* 没有数据库,使用XML (Dom4j技术)
* 表单的校验 onsubmit事件(讲) ,表单的校验。
* JSP (EL + JSTL)
* Servlet(request response session cookie(记住用户名))
* BeanUtils工具类