新建JSP⻚⾯
注释
在 JSP 中⽀持两种注释的语法操作:
⼀种是显示注释,这种注释是允许客户端看⻅的; 另⼀种是隐式注释,此种注释是客户端⽆法看⻅的
① 显示注释语法:从 HTML ⻛格继承⽽来
② 隐式注释语法:从 JAVA ⻛格继承;JSP ⾃⼰的注释
JSP 的三种注释⽅式:
1) // 注释,单⾏注释 /* 多⾏注释*/
2)
3)<%-- JSP注释 --%>
** Scriptlet
在 JSP 中最重要的部分就是 Scriptlet(脚本⼩程序),所有嵌⼊在 HTML 代码中的 Java 程序。 在 JSP 中⼀共有三种 Scriptlet 代码:都必须使⽤ Scriptlet 标记出来**
第⼀种:<% %>: java 脚本段,可以定义局部变量、编写语句
第⼆种:<%! %>:声明,可以定义全局(成员)变量、⽅法、类
第三种:<%= %>:表达式,数据⼀个变量或具体内容
JSP的指令标签
使⽤包含操作,可以将⼀些重复的代码包含进来继续使⽤,从正常的⻚⾯组成来看,有时可能分为⼏
个区域。⽽其中的⼀些区域可能是⼀直不需要改变的,改变的就其中的⼀个具体内容区域。现在有两种
⽅法可以实现上述功能。
⽅法⼀:在每个 JSP ⻚⾯(HTML)都包含⼯具栏、头部信息、尾部信息、具体内容
⽅法⼆:将⼯具栏、头部信息、尾部信息都分成各个独⽴的⽂件,使⽤的时候直接导⼊
很明显,第⼆种⽅法⽐第⼀种更好,第⼀种会存在很多重复的代码,并且修改很不⽅便,在 JSP 中如
果要想实现包含的操作,有两种做法:静态包含、动态包含,静态包含使⽤ include 指令即可,动态包
含则需要使⽤ include 动作标签。
. include 静态包含
<%@ include file=“要包含的⽂件路径” %>
静态包含就是将内容进⾏了直接的替换,就好⽐程序中定义的变量⼀样,是在 servlet 引擎转译时,
就把此⽂件内容包含了进去(两个⽂件的源代码整合到⼀起, 全部放到_jspService ⽅法中),所以只
⽣成了⼀个 servlet,所以两个⻚⾯不能有同名的变量。 运⾏效率⾼⼀点点。耦合性较⾼,不够灵活。
include 动态包含
动态包含在代码的编译阶段,包含和被包含部分是两个独⽴的部分,只有当运⾏时,才会动态包含进来,好⽐⽅法的调⽤。
注意:动态包含,中间不要加任何内容,包括空格,除⾮确认要使⽤参数,否则报错!
<jsp:include page="include.html"></jsp:include>
<%
String a = "hello.jsp";
%>
<jsp:include page="<%=a %>"></jsp:include>
使⽤动态包含还可以通过在⻚⾯之间传参。
接收参数通过 request.getParameter(name);
hello.jsp
<%=request.getParameter(“uname”)%>
四种属性范围
在JSP中提供了四种属性的保存范围,所谓的属性保存范围,指的就是⼀个设置的对象,可以再多少
个⻚⾯中保存并可以继续使⽤
问:使⽤哪个范围呢?
答:在合理范围尽可能⼩
EL表达式的语法
EL(Expression Language) 是为了使 JSP 写起来更加简单。表达式语⾔的灵感来⾃于 ECMAScript
和 XPath 表达式语⾔,它提供了在 JSP 中简化表达式的⽅法,让 Jsp 的代码更加简化。
语法结构⾮常简单: ${expression}
EL 表达式⼀般操作的都是域对象中的数据,操作不了局部变量。
域对象的概念在 JSP 中⼀共有四个:pageContext, request, session, application;范围依次是,
本⻚⾯,⼀次请求, ⼀次会话,整个应⽤程序。
当需要指定从某个特定的域对象中查找数据时可以使⽤四个域对象对应的空间对象,分别是:
pageScope, requestScope, sessionScope, applicationScope。 ⽽ EL 默认的查找⽅式为从⼩到⼤查找,找到即可。当域对象全找完了还未找到则返回空字符串""。
获取数据
设置域对象中的数据
<%
pageContext.setAttribute("uname","zhangsan"); // page作⽤域
request.setAttribute("uname","lisi"); // request作⽤域
session.setAttribute("uname","wangwu"); // session作⽤域
application.setAttribute("uname","zaholiu"); // application
%>
获取域对象的值
<%-- 获取域对象中的数据:默认查找⽅式为从⼩到⼤,找到即⽌。若四个范围都未找到,则返回空字符
串。--%>
${
uname} <!-- 输出结果为:zhangsan -->
获取指定域对象的值
${
pageScope.uname} <!-- page作⽤域 -->
${
requestScope.uname} <!-- request作⽤域 -->
${
sessionScope.uname} <!-- session作⽤域 -->
${
applicationScope.uname} <!-- application作⽤域 -->
获取List
<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
request.setAttribute("list", list);
%>
<%--
获取List中指定下标的数据
${
list[下标] }
获取集合的⻓度
${
list.size()}
注:
list代表的是存在域对象中的变量名(限域变量名)
--%>
${
list[1]}
获取Map
<%
Map map = new HashMap();
map.put("aaa", "111");
map.put("bbb", 2222);
map.put("ccc-a", 333);
request.setAttribute("map", map);
%>
<%--
获取Map中指定值
${
map["key"] } 或 ${
map.key }
注:
map代表的是存在域对象中的变量名(限域变量名)
--%>
${
map.aaa }
${
map["bbb"]}
获取JavaBean对象
User.java
public class User {
private Integer userId;
private String uname;
private String upwd;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return upwd;
}
public void setUpwd(String upwd) {
this.upwd = upwd;
}
}
<%
User user = new User();
user.setUserId(1);
user.setUname("zhangsan");
user.setUpwd("123456");
request.setAttribute("user",user);
%>
<%-- JavBean中的属性字段需要提供get⽅法 --%>
${
user} <%-- 获取对象 --%>
${
user.uname} <%--获取对象中的属性--%>
empty
<%--
empty
判断域对象是否为空。为空,返回true;不为空返回false; ${
empty 限域变量名 }
判断对象是否不为空。
${
!empty 限域变量名 }
--%>
${
empty uname}
${
empty list}
${
empty map}
${
empty user}
EL运算
<%
request.setAttribute("a", 10);
request.setAttribute("b", 2);
request.setAttribute("c", "aa");
request.setAttribute("d", "bb");
%>
等值判断
<%--
⽐较两个值是否相等,返回true或false
== 或 eq
--%>
${
a == b }
${
c == d }
${
c eq d }
${
a == 5 }
${
c == 'aa' }
算术运算
<%--
加法: +
减法: -
乘法: *
除法: / 或 div
--%>
${
a + b }
${
a / b } 或 ${
a div b }
⼤⼩⽐较
<%--
⼤于:>
⼩于:<
⼤于等于:>=
⼩于等于:<=
--%>
${
a > b}
${
a + 1 > 10 }
${
a + b >= 10 }
${
a > b && b > 5 }
${
a + b > 10 || a - b > 5 }
Java Server Pages Standard Tag Libray(JSTL):JSP 标准标签库,是⼀个定制标签类库的集合,⽤于解决⼀些常⻅的问题,例如迭代⼀个映射或者集合、条件测试、XML 处理,甚⾄数据库和访问数据库操作等。
JSTL 中最重要的标签:迭代集合以及格式化数字和⽇期⼏个标签
forEach标签
<c:forEach
items="
begin=""
end=""
step=""
var=""
varStatus="" >
</c:forEach>
属性
forEach varStatus 属性
index: 当前这次迭代从 0 开始的迭代索引
count: 当前这次迭代从 1 开始的迭代计数
first: ⽤来表明当前这轮迭代是否为第⼀次迭代的标志
last: ⽤来表明当前这轮迭代是否为最后⼀次迭代的标志
JSTL 提供了格式化和解析数字和⽇期的标签,我们讨论⾥⾯有:formatNumber、formatDate、parseNumber及parseDate。
formatNumber标签
formatNumber标签⽤于格式化数字,百分⽐,货币。该标签⽤指定的格式或精度来格式化数字。(将数值型数据转换成指定格式的字符串类型。)
语法格式
<fmt:formatNumber
value=""
type=""
var=""
scope="" />
<fmt:formatDate
value=""
type=""
dateStyle=""
timeStyle=""
pattern=""
timeZone=""
var=""
scope="" />
parseNumber标签⽤来解析数字,百分数,货币。(parseNumber 标签可以将数字、货币或百分⽐类型的字符串转换成数值型。)
语法格式
<fmt:parseNumber
value=""
type=""
var=""
scope="" />
parseDate标签⽤于解析⽇期。(将指定格式的字符串转换成Date类型。)
语法格式
<fmt:parseDate
value=""
type=""
dateStyle=""
timeStyle=""
pattern=""
var=""
scope="" />