1.如何写一个jsp文件?
step1.添加一个以.jsp为后缀的文件。
step2.在该文件里面,可以添加如下内容:
(1)html(css,js)
直接写即可。
(2)java代码
第一种: java代码片断
<% java代码 %>
第二种: jsp表达式
<%= java表达式 %>
第三种. jsp声明 (a1.jsp)
<%! 声明一个变量或者方法 %>
(3)隐含对象
a.什么是隐含对象?
在jsp文件里面,可以直接使用的对象,比如out、request、response。
b.为什么可以直接使用这些隐含对象?
因为容器会自动添加获得这些对象的代码。
c.有哪些隐含对象?
out,
request,
response,
session,
application
pageContext:页面上下文 (a2.jsp,a3.jsp)
容器会为每一个jsp实例创建唯一的一个符合PageContext
接口要求的对象,该对象会一直存在,除非jsp实例被容器
删除。
该对象的作用主要有两个:
作用1:绑订数据。
绑订到pageContext上的数据,只有对应的
jsp实例能够访问到。
作用2:提供了一些方法,用来获得其它所有的隐含对象。
config: ServletConfig (a4.jsp)
可以为jsp配置初始化参数,然后通过config去读取。
<servlet>
<servlet-name>a4</servlet-name>
<jsp-file>/a4.jsp</jsp-file>
<init-param>
<param-name>company</param-name>
<param-value>IBM</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>a4</servlet-name>
<url-pattern>/abc.html</url-pattern>
</servlet-mapping>
exception: (a5.jsp,a6.jsp)
当page指令的isErrorPage属性值设置为true时,
可以使用该隐含对象,该隐含对象可以用来获得
jsp运行时产生的一些异常的简短的描述。
page(了解): jsp实例本身(jsp对应的servlet实例)。
(4)指令
什么是指令?
可以通过指令告诉容器,在将jsp转换成servlet时,做一些额外的
处理,比如导包。
指令语法
<%@ 指令名 属性=值 属性=值 %>
注:
如果有多个属性,使用空格隔开。
page指令
import属性:指定要导的包名,如果有多个包,用","号隔开。
pageEncoding属性:指定jsp文件的编码。
contentType属性:response.setContenType方法的内容。
errorPage属性:指定一个异常处理页面。当jsp运行发生异常,容器会调用该异常处理页面。
isErrorPage属性:缺省值是false,如果值为true,就可以使用exception隐含对象。
session属性 (a7.jsp):缺省值是true,如果值为false,则不能够使用session隐含对象。
比如: <%@ page import="java.util.*,java.text.*"%>
include指令
<%@ include file="" %>
注:
file属性用于指定被包含的文件名。
该指令用来告诉容器,在将jsp转换成servlet时,将file
属性指定的文件的内容插入到该指令所在的位置。
被包含的文件可以是任何文件,包括html,如果是jsp,
该jsp并不会执行!
taglib指令
导入要使用的jsp标签
<%@ taglib uri="" prefix=""%>
uri是要导入的jsp标签的命名空间。
注:
命名空间是为了区分同名的元素而在元素前添加的一段说明,
通常是一个域名(为了避免命名空间也冲突)。
prefix是命名空间的别名。
2、注释
a. <!-- 注释内容 -->
如果注释的内容是java代码,java代码
会执行。
b. <%-- 注释内容 --%>
如果注释的内容是java代码,java代码
不会执行。。
3. jsp是如何执行的?
阶段一 容器将jsp转换成一个servlet。
html(css,js) ---> 在service方法里面,使用out.write输出。
<% %> -----> 照搬到service方法里面。
<%= %> -----> 在service方法里面,使用out.print输出。
<%! %> -----> 为servlet增加新的属性或者新的方法。
阶段二 容器调用该servlet。
4.jsp标签和el表达式
(1)jsp标签是什么?
jsp标签是sun公司推出的一个规范,目的是为了替换jsp中的java代码。
jsp标签语法类似于html标签(比如说,有开始标记、结束标记、有一
一些属性、有标签体)。
容器遇到jsp标签之后,会调用jsp标签对应的
jsp标签类中的java代码。
使用jsp标签,好处是,jsp文件便于美工去修改,另外,也便于
代码的复用(jsp标签可以重用)。
(2)el表达式是什么?
一套简单的运算规则,用于给jsp标签的属性赋值,也可以脱离jsp标签,
直接使用。
(3)el表达式的使用
1)读取bean的属性值
注(了解):
javabean是一个规范,满足如下几个条件,就可以称之为一个
javabean。
public 类
public 构造器
实现Serializable接口
有一些属性及对应的get/set方法
a.方式一 (e1.jsp)
${user.username}
a1.执行过程: 容器依次从pageContext-->request
-->session-->application中查找绑订
名为"user"的对象(getAttribute),找到
之后,调用该对象的"getUsername"方法,
然后输出。
a2.优点:
会将null转换成""输出。
如果依据绑订名找不到对应的对象,不会报
空指针异常。
a3.指定查找范围:
可以使用pageScope、requestScope、sessionScope、applicationScope来指
定查找范围。
b.方式二 (e1.jsp)
${user['username']}
a1. 执行过程同上。
a2. []里面可以出现绑订名。
a3. []里面可以出现从0开始的下标,用来访问
数组中的某个元素。
2)进行一些简单的运算。(e2.jsp)
a.算术运算:
+,-,*,/,%
注意,"+"只能求和。
b.关系运算:
>,>=,<,<=,==,!=
c.逻辑运算:
&&,||,!
d.empty运算:
empty
3)读取请求参数值 (e3.jsp)
${param.username}等价于
request.getParameter("username");
${paramValues.city}等价于
request.getParameterValues("city");
(4)jstl标签的使用
1)jstl是什么? (jsp standard tag lib)
注:
apache开发的一套jsp标签,后来捐献给了sun,sun
将其命名为jstl。
2)jstl如何使用?
step1.导包。
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
step2.使用taglib指令导入要使用的jsp标签。
<%@ taglib uri="" prefix=""%>
uri是要导入的jsp标签的命名空间。
注:
命名空间是为了区分同名的元素而在元素前添加的一段说明,
通常是一个域名(为了避免命名空间也冲突)。
prefix是命名空间的别名。
3)if标签
a.用法
<c:if test="" var="" scope="">
标签体
</c:if>
b.当test属性值为true时,容器执行标签体的内容。
c.test属性值可以使用el表达式进行计算。
d.var属性指定绑订名。
e.scope属性指定绑订范围。
4)choose标签 (choose.jsp)
a.用法
<c:choose>
<c:when test="">
标签体
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
b. when可以出现1次或者多次,表示一个分支(相当于一个if语句),
当test属性值为true时,执行标签体的内容。test属性值可以
使用el表达式来进行计算。
c. otherise可以出现0次或者1次,表示例外(相当于最后那个else
语句)。
5)forEach标签 (forEach.jsp)
a.用法
<c:forEach items="" var="" varStatus="">
</c:forEach>
b.items属性用来指定要遍历的集合或者数组,可以使用el
表达式来赋值。
c.var属性用来指定绑订名。
注:
绑订范围固定是pageContext,该标签每次从集合或者数组
中取一个元素,然后将其绑订到pageContext上。
d.varStatus属性用来指定绑订名。
注:
绑订范围固定是pageContext,绑订值是一个特殊的对象,
该对象由该标签创建,用来获得当前遍历的状态。
该对象提供了以下方法,用来获得当前遍历的状态:
getIndex(): 获得当前正在被遍历的元素的下标(从
0开始)。
getCount(): 获得当前正在被遍历的元素的序号(从
1开始)。
5.自定义标签
step1. 写一个java类,继承SimpleTagSupport类。
注:
继承SimpleTagSupport类开发的标签属于
简单标签技术。
step2. override doTag方法,在该方法里面,编写处理逻辑。
/**
* 标签类的要求:
* a.继承SimpleTagSupport类。
* b.override doTag方法(实现处理逻辑)。
* c.标签有哪些属性,标签类也得有对应的属性,
* 属性名要相同,类型要匹配,并且有对应的set方法。
*
* 标签的执行过程:
* step1.容器依据标签的命名空间找到标签的描述文件(.tld文件),
* 然后依据标签名找到标签类,接下来将标签类实例化。
* step2.容器将标签的属性值赋给标签对象(通过调用标签
* 对象的set方法,如果标签的属性值需要计算,容器会事先计算)。
* step3.容器调用标签对象的doTag方法。
*
*/
public class HelloTag extends SimpleTagSupport{
private String msg;
private int qty;
public HelloTag(){
System.out.println("HelloTag's constructor...");
}
public void setMsg(String msg) {
System.out.println("HelloTag's setMsg...");
this.msg = msg;
}
public void setQty(int qty) {
System.out.println("HelloTag's setQty...");
this.qty = qty;
}
@Override
public void doTag() throws JspException, IOException {
System.out.println("HelloTag's dotag...");
/*
* 通过继承自SimpleTagSupport类的方法来
* 获得pageContext。该对象提供了获得其它所有
* 隐含对象的方法。
*/
PageContext pctx =
(PageContext)getJspContext();
JspWriter out = pctx.getOut();
for(int i = 0; i < qty; i ++){
out.println(msg + "<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用来设置该标签是否有标签体,
如果有,标签体的内容允许出现哪些内容。
empty: 该标签没有标签体。
scriptless:该标签有标签体,但是标签体的内容
不能够出现java代码(<% %>,<%= %>,<%! %>)。
JSP:该标签有标签体,并且标签体的内容可以是java代码。
但是,只有复杂标签技术才支持该值。
-->
<body-content>empty</body-content>
<attribute>
<name>msg</name>
<!--
如果值为true,表示该属性是必须的。
-->
<required>true</required>
<!--
如果值为true,表示该属性值可以动态赋值
(可以使用el表达式赋值)
-->
<rtexprvalue>false</rtexprvalue>
</attribute>
<attribute>
<name>qty</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>