## EL表达式 JSTL的标签库 EL的函数 自定义EL函数 自定义标签 JSP的开发模式 注册登陆案例 ##
**EL表达式**
1.获取域对象中的值
2.EL表达式支持运算 ${ num1 + num2 }
**EL获取常用的WEB对象**
1.pageScope 获取page域对象的值
2.requestScope 获取request域对象的值
3.sessionScope 获取session域对象的值
4.applicationScope 获取application域对象的值
* 例子:向某个域中来存入值 request.setAttribute("xx",yy)
* 取值:${xx} 正规写法:${requestScope.xx}
5.param 获取表单提交过来的参数。(相当于 request.getParameter())
6.paramValues 获取表单提交过来的参数。(相当于 Map<String,String[]> map = request.getParameterMap())
7.header 获取请求头信息
8.headerValues 获取请求头信息
9.initParam 获取全局的初始化参数
10.cookie 获取cookie对象的引用,可以使用cookie对象的引用获取cookie的名称和cookie的值。
* 前提条件:是在Servlet程序中创建一个Cookie对象Cookie cookie = new Cookie("last","2015-01-27");
* ${cookie.last } -- 获取cookie的名称为last的对象
* ${cookie.last.name} -- 获取cookie对象的名称就是last
* ${cookie.last.value} -- 获取cookie对象的值就是2015-01-27
11.pageContext
* 获取项目的虚拟路径(项目名称)
* ${ pageContext.request.contextPath } 获取项目的名称
**JSTL的标签库简介**
1.JSP的内置的标签。
2.JSP的标签运行在服务器中。和HTML标签分开。
3.JSP标签的出现为了简化编程。目的:去除掉<% %>方式。其实JSP的标签也是有Java代码来编写的。
4.JSTL的版本
* JSTL的1.0版本(不用) 不支持EL表达式
* JSTL的1.1和1.2的版本(差别不大) 支持EL表达式
5.下载jar包。导入到工程中
* 两个jar包 jstl.jar standard.jar
6.JSTL使用标签的快速入门步骤
* 引入jstl的标签库 使用taglib指令
* <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
* 直接在JSP页面使用jstl的标签
* 使用必须先前缀 <c:标签名 属性> 输出内容(直接在里面HTML的标签) </c:标签名>
7.JSTL提供的核心标签
* 核心标签库 (core) --- c(重点)
* fn.tld --- EL函数库
8.注意注意注意注意注意注意:EL表达式和JSTL标签库,记住一点,操作都是域对象中的属性和属性的值。
- out标签(重点)
1.语法:<c:out value="" />
2.作用:输出域对象的值或者常量
3.属性
* value -- 输出的内容
* default -- 默认值(如果输出没找到值,输出默认值)
* escapeXml -- 设置默认转义。默认是true,转义。设置成false,不进行转义
例:<c:out value="${ num }"></c:out>
<c:out value="${ num2 }" default="北京"></c:out>
<c:out value="<a href='http://www.baidu.com'>百度</a>" escapeXml="false"/>
- set标签(重点)
1.作用:向域中存入值
2.语法:<c:set >
3.属性:
* var -- 属性名称
* value -- 属性值
* scope -- 域范围(page,request,session,application)
* target -- 目标(目标必须是JavaBean对象或者Map集合)
* property -- 属性(JavaBean属性或者Map属性)
* 使用target和property修改JavaBean或者Map集合属性的值
例:<c:set var="username" value="meimei" scope="page"></c:set>
- remove标签
1.作用:删除域对象中的属性 (request.removeAttribute("xx"))
2.语法:<c:remove >
3.属性:
* var -- 要删除属性名称
* scope -- 域的范围
例:<c:remove var="username" scope="page" />
- catch标签
1.作用:捕获异常的
2.语法:<c:catch >
3.属性:
* var -- 如果发生了异常,把异常的信息保存到var的变量中。
例:
<c:catch var="e">
<%
int a = 10/0;
%>
</c:catch>
${ e } <!-- java.lang.ArithmeticException: / by zero -->
${ e.message } <!-- / by zero -->
- if标签(重点)
1.if标签就可以判断。只有c:if标签,没有c:else标签
2.作用:判断用
3.属性
* test -- 判断条件返回true或者false
* var -- test返回的结果保存到var声明的变量中
* scope -- 域的范围
例:
<c:set var="num" value="10" scope="page"></c:set>
<c:if test="${ num eq 10 }" var="i" scope="page" >
num=10
</c:if>
- choose标签(重点)
1.作用:判断数据
2.语法(注意):
<c:choose>
<c:when>
如果满足条件,输出内容
</c:when>
<c:when>
如果满足条件,输出内容
</c:when>
<c:otherwise>
上面都不满足,最后输出
</c:otherwise>
</c:choose>
例:
<c:set var="num" value="10" scope="page"></c:set>
<c:choose>
<c:when test="${ num ge 10 }">
num>=10
</c:when>
<c:when test="${ num lt 10 }">
num<10
</c:when>
<c:otherwise>
其他
</c:otherwise>
</c:choose>
- forEach标签(重点)
1.作用:迭代数据。request域中,list集合。使用foreach标签循环遍历list结合。
2.语法:
* <c:foreach>
3.属性
* 例子:先想增强for循环 for(String str : 集合){ }
* var -- 循环遍历的数据保存到var声明变量中(相当于 str)
* items -- 要遍历的集合,注意:从域对象中取值。(相当于集合)
* 例子:模拟的是普通for循环 for(int i=0;i<10;i++){ }
* begin -- 从哪开始
* end -- 到哪结束
* step -- 步长
* varStatus -- 循环遍历的过程,产生信息。
* index -- 下标值
* count -- 计数器
* first -- 判断是否有第一个
* last -- 判断是否有最后一个
4.迭代数组、list集合、set集合、Map集合(entry.key)、List<User>
5.从1循环到10 从1加到100 遍历10到100的偶数,每到第3个数,显示红色
例:
<h4>遍历list集合</h4>
<c:forEach var="str" items="${ list }">
${ str }
</c:forEach>
<h4>从1循环10</h4>
<c:forEach var="i" begin="1" end="10" step="1">
${ i }
</c:forEach>
- url标签(重点)(可带param参数)
1.作用:有提交的地址相关。(超链接 form表单 img的src属性)
2.好处:假如你使用form的action的编写地址
<form action="${pageContext.request.contextPath}/xxx">
如果使用<c:url的标签> <form action="<c:url value='/xxx' >">
3.特点:如果不写项目名,默认给你加上项目名称。
4.好处:使用<c:url>,默认给你拼接jsessionid session的追踪(在请求的地址默认给你jsessionid=XCSDFSDFSD)
- import标签(可带param参数)
1.作用:引入一个文件,并且可以传参数。
2.属性
* url -- 引入文件的地址
* var -- 把文件内容保存到变量中
* context -- 虚拟路径(项目名称)
例:
<c:import url="/jstl/success.jsp" var="i" context="/test">
<c:param name="username" value="zhangsan"></c:param>
</c:import>
${ i }
success.jsp的内容:
<h4>success.jsp -- 我是被包含的页面</h4>
<%= request.getParameter("username") %>
<h4>使用EL表达式</h4>
${ param.username }
- redirect标签重定向(可带param参数)
1.属性
* url -- 重定向的路径
* context -- 虚拟路径(项目名称)
例:
<c:redirect url="/jstl/success.jsp" context="/test">
<c:param name="username" value="meimei"></c:param>
</c:redirect>
- param参数标签
1.属性
* name -- 参数名称
* value -- 参数值
注:和url,import,redirect一起来用
例:
<c:param name="username" value="meimei"></c:param>
- forTokens切分字符串
1.它也是一个循环
2.属性
* items -- 要切分的集合
* delims -- 切分的规则
例:
<c:forTokens var="i" items="aa,bb,cc" delims="," >
${ i }
</c:forTokens>
**EL函数和自定义EL函数**
1.EL函数作用:这些方法都是来操作字符串的。
2.在JSP的页面上引入EL函数库。
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
3.怎么编写EL函数
${ fn:xxx() }
4.操作域对象中的值,不用加双引号。(*****)
例:
<c:set var="username" value="abcdefg" scope="page"></c:set>
<h4>EL函数来操作page域内容</h4>
${ fn:indexOf(username,"de") } <!-- 输出: 3 -->
**自定义EL函数**
1.开发EL函数的步骤
* 编写一个Java类,提供一个方法,方法必须静态方法。方法必须有返回值。
package cn.itcast.el;
public class ElDemo {
/**
* say hello方法
* @param str
* @return
*/
public static String sayHello(String str){
return "hello "+str;
}
}
* 在WEB-INF目录下,编写.tld结尾的文件(xml文件),进行配置。
* 在WEB-INF的目录下,不要在lib或者classes目录下
* 创建.tld的文件(XML的文件,XML的约束的)(软件自动生成的路径有缺失,我们在使用的时候需要自己补上,具体操作是将前面的路径复制粘贴和后面的文件名称拼接)
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
* 编写配置文件
<!-- 配置自定义EL函数 -->
<function>
<!-- 配置方法的名称 -->
<name>sayHi</name>
<!-- 配置方法所在的类 -->
<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="http://www.itcast.cn/0108/myfn" %>
2.作用:如果你编写一个EL的函数,JSP页面上处理不了的逻辑,你把它扔到后台使用java代码进行处理。对外提供就是一个EL函数。
例:
${ myfn:sayHi("小凤") }
**自定义标签**
1.去除掉JSP页面上的Java代码。
2.所以给大家提供一套规范(一套接口或者抽象类)
3.提供了一个接口tag,就可以编写自定义标签。sun公司提供了接口simpleTag。
4.大家现在来开发自定义标签,实现simpleTag接口。重写一些方法。(如果提供了实现类,编写一个类,继承实现类)
5.自定义标签的开发步骤
* 编写一个类,继承simpleTagSupport类,重写3个方法。
* 在tld的文件中,编写配置文件
* 在JSP的页面引入自定义的标签库
6.方法被服务器默认(有顺序)调用。
void setJspContext(JspContext pc) --> void setJspBody(JspFragment jspBody) -->void doTag()
把PageContext对象传入进来 把标签主体对象传入进来 执行标签
**自定义标签(没有标签主体)**
1.编写类
public class JstlDemo1 extends SimpleTagSupport{
private PageContext pc;
private JspFragment body;
/**
* 标签执行了,默认调用该方法
*/
public void doTag() throws JspException, IOException {
// 向页面输出一句hello
// 获取out对象
pc.getOut().write("hello");
}
/**
* Tomcat服务器默认先调用该方法
*/
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
/**
* 服务器默认调用该方法,把JspFragment(代表标签主体对象)传入进来
*/
public void setJspBody(JspFragment jspBody) {
this.body = jspBody;
}
}
2.编写配置文件
<!-- 配置自定义标签 -->
<tag>
<!-- 配置标签名称 -->
<name>print</name>
<!-- 标签使用的类 -->
<tag-class>cn.itcast.jstl.JstlDemo1</tag-class>
<!-- 配置标签主体 -->
<body-content>empty</body-content>
</tag>
3.在JSP文件直接使用
<%@ taglib prefix="myc" uri="http://www.itcast.cn/0108/myc" %>
<myc:print/>
**自定义标签(带有标签主体)**
1.编写代码
public class JstlDemo2 extends SimpleTagSupport{
private PageContext pc;
// 代表标签主体
private JspFragment jspBody;
/**
* 最后调用该方法,目的:输出标签主体
*/
public void doTag() throws JspException, IOException {
// 直接调用JspFragment的invoke(Writer out) ,标签主体向外输出
jspBody.invoke(pc.getOut());
}
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
}
2.编写配置文件
<!-- 配置自定义标签 -->
<tag>
<!-- 配置标签名称 -->
<name>out</name>
<!-- 标签使用的类 -->
<tag-class>cn.itcast.jstl.JstlDemo2</tag-class>
<!-- 配置标签主体 -->
<body-content>scriptless</body-content>
</tag>
3.在JSP使用
<h4>带有标签主体内容的标签</h4>
<myc:out>
美美
</myc:out>
4.注意(标签主体的配置)
* empty:不能有标签体内容。
* scriptless:标签体内容不能是Java代码段,但可以是EL、JSTL等;
**带有属性的自定义标签**
1.编写类
public class JstlDemo3 extends SimpleTagSupport{
private PageContext pc;
// 代表标签主体
private JspFragment jspBody;
// test和JSP页面上的if test属性名称必须是相同的
// 你必须给我提供test属性的set方法
private boolean test;
public void setTest(boolean test) {
this.test = test;
}
/**
* 最后调用该方法,目的:输出标签主体,由于属性决定
*/
public void doTag() throws JspException, IOException {
// 直接调用JspFragment的invoke(Writer out) ,标签主体向外输出
if(test){
jspBody.invoke(pc.getOut());
}
}
public void setJspContext(JspContext pc) {
this.pc = (PageContext) pc;
}
public void setJspBody(JspFragment jspBody) {
this.jspBody = jspBody;
}
}
2.配置(包含配置属性)
<!-- 配置自定义标签 -->
<tag>
<!-- 配置标签名称 -->
<name>if</name>
<!-- 标签使用的类 -->
<tag-class>cn.itcast.jstl.JstlDemo3</tag-class>
<!-- 配置标签主体 -->
<body-content>scriptless</body-content>
<!-- 配置属性 -->
<attribute>
<!-- 配置数据名称 -->
<name>test</name>
<!-- 属性是否是必须出现的 -->
<required>true</required>
<!-- 支持EL表达式 -->
<rtexprvalue>true</rtexprvalue>
<!-- 属性的类型 -->
<type>boolean</type>
</attribute>
</tag>
3.使用标签
<myc:if test="${ requestScope.num eq 10 }">
小凤
</myc:if>
**注册登陆的功能** (请看下一篇)
1.创建一个数据库(使用XML来代替) DOM4J的解析
2.编写表单的(form) 前台表单校验 onsubmit事件
3.编写Servlet程序 -- 接收数据(request和response对象) -- 封装数据(BeanUtils工具类)
4.保存到XML数据库中。
5.验证码程序(验证码生成,前台页面使用验证码) -- 验证码只能在后台校验(session来校验)
6.登陆功能(记住用户名 cookie的技术 (记住用户名cookie默认不支持中文的,记住中文用户名怎么办呢?)) -- 登陆成功了(保存到session中)
7.HTML的全局函数(全局函数可以解决 可以写java代码也可以解决 自定义EL函数也可以解决 )