JSP
JSP
JSP基础
JSP是什么?
sun公司制定的一种服务器端的动态页面技术规范.
如何写一个jsp?
- step1: 写一个
.jsp
的文件 -
step2: 在该文件中,可以使用以下元素
1)html(css,js):直接写-------out.write 2)Java代码: <% Java代码 %> java代码片段 ----- 照搬 <%=java表达式 %> jsp表达式 ------ out.print <%! 声明一些变量和方法 %> jsp声明() (a1.jsp) ------ 给servlet添加新的属性和方法
-
3)隐含对象: a:什么是隐含对象?---可以直接使用的对象 b:为什么可以直接使用这些隐含对象?----容器会自动添加获得这些对象的方法 c:有哪些隐含对象----- `out`、`request`、`response`、 `Session`、 `application`上下文、 `pageContext`(a2.jsp,s3.jsp;页面上下文,容器会为每一个jsp实例创建唯一的一 个符合PageContex接口要求的对象,该对象会一直存在,除非jsp实例被删除. 1:绑定数据:绑定到pageContext上的数据,只有对应的jsp实例才能够访问到 2:获得其他所有的隐含对象):
-
`page`(jsp实例本身--jsp对应的servlet对象)、 `exception`、(a4.jsp,a5.jsp)---a4发生用户输入异常,通过<%@ page errorPage="a5.jsp"%>跳转到a5.jsp(该页面中<%@ page isErrorPage="true"%> 必须设置为true,才可以使用exception对象)
`config`、(a6.jsp)ServletConfig
4)指令
a:什么是指令?-----可以通过指令在将jsp转换成servlet得时候做一些额外得处理
b:指令的语法
<%@ 指令名 属性=值 %>
page指令:
导包import,设置响应编码contentType,设置页面编码pageEncoding,设置指定错误
面errorPage(当jsp运行发生了异常,容器会调用异常处理页面),isErrorPage属性(
必须设置为true才可使用exception隐含对象),session属性(a7.jsp,如果为false则不能
使用session隐含对象)
include指令:
file属性:通知容器在将jsp转换成servlet时将file属性指定的文件的内容插入到该指令所在的位置
<%@ include file="header.jsp"%>//只负责提供内容,不执行,所以文件不一定是.jsp
taglib指令:与jap标签技术相关,用来导入jsp标签
5)注释(a8.jsp)
a:<!-- 注释内容 -->:注释的内容如果是Java代码,则Java代码会执行,
b:<%-- 注释内容 -->:注释的内容如果是java代码,则不会执行
jsp如何运行
-
step1: 容器将jsp转化为一个对应的servlet
-
step2: 容器再调用该servlet
jsp标签和El表达式
jsp标签(jstl)是什么?
-
sun公司用来推出的一种代替jsp中Java代码的技术,语法类似于html标签(有开始标记,结束标记,有相应的属性,标签提等的),如果容器遇到jsp标签之后,会找到该标签对应的标签类,然后执行标签类中的代码.
注:因为直接再jsp中写Java代码,不利于jsp的文件维护。
el表达式
- el表达式是一套简单的运算规则,用于给jsp标签的属性赋值,也可以脱离jsp标签,直接启动
-
1:读取bean的属性值
注: javabean指的是符合如下要求的Java类: public class public 构造器 最好实现Serializable接口 有一些属性及对应的get/set方法
-
方式一 ${user.字段名}
注:依次从pageContext-->request-->session--》application中查找绑定名为·user·< 的对象。调用该对象的该 对象 “getXxx”方法,输出该方法的结果. EL表达式会将null转换成""输出; EL如果找不到对应的对象,不会报空指针异常 可以使用pageScope,requestScope,sessionScope,applicationScope指定查找范围,比如:${sessionScope.user.username}
-
方式二 ${user['username'] }
注: []里面允许使用绑定名,绑定名也可以限制查找范围 []里面允许使用从0开始的下边(整数)--用来读取数组中的某个元素
-
-
2:做一些简单的运算(e2.jsp)
-
算术运算 + - * / %
-
+
只能求和
-
-
关系运算 > < >= <= == !=
-
逻辑运算 && || !
-
empty运算 empty
- ${empty list1 }
-
-
3:读取请求参数值(基本不用)
-
request.getParameter(String name); =====>
${pram.属性名 }
-
request.getParameterValues(String name); =====>
${paramValues.属性名 }
-
jsp标签 (jstl:Java standard tag lib)
什么是jstl?
- apache开发的一套jsp标签,后来捐献给sun,sun将其命名为jstl
如何使用jstl?
-
step1: 导包:jstl-1.2.jar
-
step2: 使用taglib指令导入要使用的标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> uri属性:用来指令要导入的标签的命名空间(为了区分同名元素,再元素前添加一段说明,通常是一个域名) perfix属性:指定命名空间的别名
核心标签
-
if
标签-
语法
<c:if test="" var="" scope=""> </c:if>
-
当test的属性值为true时,执行标签替的内容,test的属性值可以使用el表达式来赋值
- var:指定绑定名,scope指定绑定范围(可以时page,request,session,application),其属性值为test的值
-
-
choose
标签-
语法
<c:choose> <c:when test=""></c:when> <c:when test=""></c:when> ... <c:otherwise></c:otherwise> </c:choose>
-
when:可以出现一次或者多次,表示一个分支,相当于一个if语句,当test属性值为true时,执行标签体的内容.
- otherwise:可以出现0次或者1次,表示例外
-
-
forEach
标签 (forEach.jsp)-
语法:
-
<c:forEach items="" var="" varStatus=""> </c:forEach>
-
items指定要遍历的集合或者数组,可以使用el表达式来赋值。
-
var属性指定绑订名,绑订范围固定是pageContext。
注: 该标签每次从集合或者数组中取一个元素,然后将该元素 绑订到pageContext上。
-
d. varStatus属性指定绑订名,绑订范围固定是pageContext。
注: 绑订值是一个特殊的对象,该对象提供了一些方法,可以 通过这些方法来获得当前遍历的状态: getIndex():用来获得当前正在被遍历的元素的下标,下标 从0开始。 getCount():用来获得当前是第几次遍历。 .index|||||||||||||.count
-
自定义标签
(1)编程步骤
-
step1. 写一个类,继承SimpleTagSupport类。
注(了解): jsp标签技术有两个版本,即复杂标签技术(old)和简单标签 技术(new)。
-
step2. override SimpleTagUpport类的doTag方法,在该方法里面 添加相应的处理逻辑。
/** * 标签类要求如下: * a.继承SimpleTagSupport类。 * b.标签有哪些属性,标签类也必须有对应的属性,并且 * 属性名要一样,类型要匹配。 * c.属性要提供相应的set方法。 * d.override doTag方法,在该方法里添加相应的处理逻辑。 */ public class HelloTag extends SimpleTagSupport{ private String info; private int qty; public HelloTag(){ System.out.println("HelloTag的构造器"); } public void setInfo(String info) { System.out.println("HelloTag的setInfo方法"); this.info = info; } public void setQty(int qty) { System.out.println("HelloTag的setQty方法"); this.qty = qty; } @Override public void doTag() throws JspException, IOException { System.out.println("HelloTag的doTag方法"); /* * 通过继承自SimpleTagSupport类的方法 * 来获得PageContext。 * PageContext提供了一些方法,用来获得 * 其它所有的隐含对象。 */ PageContext pageContext = (PageContext)getJspContext(); JspWriter out = pageContext.getOut(); for(int i = 0; i < qty; i ++){ out.println(info + "<br/>"); } } }
-
step3. 在标签的描述文件(.tld文件)添加该标签的说明。
<!-- 标签的版本 --> <tlib-version>1.1</tlib-version> <!-- 标签的命名空间的别名 --> <short-name>d</short-name> <!-- 标签的命名空间 --> <uri>http://tedu.cn/mytag</uri> <tag> <!-- 标签名 --> <name>hello</name> <tag-class>tag.HelloTag</tag-class> <!-- body-content元素用来告诉容器,该标签 有没有标签体,如果有,标签体里面可不可以 使用java代码。 可以设置三个值: empty: 该标签没有标签体。 scriptless:该标签有标签体,但是,标签体的 内容不能够出现java代码(<% %>, <%= %>,<%! %>)。 JSP:该标签有标签体,并且,标签体的内容可以 有java代码。但是,只有复杂标签技术才支持 该值,简单标签技术只支持empty和 scriptless。 --> <body-content>empty</body-content> <attribute> <name>info</name> <!-- 值为false,表示该属性是可选的, 否则,是必须的(即使用时该属性必须赋值)。 --> <required>true</required> <!-- 值为true,表示该属性可以动态赋值( 可以使用el表达式来赋值)。 --> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <name>qty</name> <required>true</required> <rtexprvalue>true</rtexprvalue> </attribute>
标签的执行过程:
容器依据标签的命名空间找到标签的描述文件(.tld文件),然后依据标签名找到对应的标签类。
接下来,容器将该标签类实例化、将标签的属性值赋给该实例对应的属性(通过调用对应的set方法),最后,调用标签实例的doTag方法。