1.1.1. 为什么有JSP规范
Servlet技术产生以后,在使用过程中存在一个很大的问题,即为了表现页面的效果而需要输出大量的HTML标签,这些标签在Servlet中表现为一个个的字符串常量。这种输出页面的方式不仅仅增加了开发时对页面的控制难度,也不利于后期的维护。为了能够将Servlet中用于表现的功能分离出来,提高视图的开发效率,推出了JSP这种技术,主要用于将Servlet中负责显示的语句抽取出来。
1.1.2. 什么是JSP
JSP(Java Server Page)是Sun公司制定的一种服务器端动态页面技术的组件规范,以“.jsp”为后缀的文件中既包含HTML静态标记用于表现页面,也包含特殊的代码,用于生成动态内容。
JSP作为简化Servlet开发的一种技术,实质上最终依然要转变为Servlet才可能运行,只不过这个转变过程由Servlet容器来完成。所以遵循JSP的编写规范才能使得JSP转变为需要的Servlet。
九大内置对象: 作用域
pageContext(页面上下文对象) page(页面执行期)
request(请求对象) 一次请求
response(响应对象) 一次响应
session(会话对象) 会话期
application(应用程序对象) 程序运行状态
out(输出对象) page
config(配置对象) page
exception(异常) page
page(页面对象) page
四大域对象(保存数据,实现传递)
pageContext
request
session
application
jsp中常用的三种指令( <%@指令名 属性=值 % > )
page指令
include指令
taglib指令
jsp中导包( <%--导包--%> )
EL表达式的使用
方式一:${对象名.属性名} 例:${user.name}
执行的过程为:从pageContext、request、session、application中依次查找绑定名为“user”的对象,找到后调用“getName”方法,将返回值输出。
假定在session中绑定了一个对象,如下:
User obj = new User(1,“胡萝卜”);
session.setAttribute(“user”,obj);
那么${user.name}等价于下面代码:
<%
User u = (User)session.getAttribute(“user”);
out.print(u.getName();
%>
方式二:${对象名[“属性名”]}
假定在Servlet中有如下代码:
User obj = new User(1,”胡萝卜”);
session.setAttribute(“user”,obj);
session.setAttribute(“pName”,”id”);
在JSP中编写如下代码会输出“1”:
${sessionScope.user[“id“]}
在JSP中编写如下代码也会输出“1”:
${sessionScope.user[sessionScope.pName]}
如果pName在绑定时不指定id,而是name,那么这个表达式就会输出“胡萝卜“,所以这种写法可以认为是表达式中有一个变量。sessionScope.pName 等价于 session.getAttribute(“pName”)。
那么对于interests这个数组属性的值可以使用如下表达式访问:
${user.interests[0]}
指定对象的查找范围
在书写表达式时,如果没有指定搜索范围,那么系统会依次调用pageContext、request、session、application的getAttribute()方法。这样不限定查找范围的代码不利于排错,
所以这种取值的操作可以限定对象的查找范围。如:
${sessionScope.user.name}
一旦指定了对象所在的范围,那么只会在范围内查找绑定对象,不会在找不到的时候再去其他区域中查找了。
sessionScope的位置还可以填写pageScope、requestScope、applicationScope。
使用EL表达式进行计算
使用EL表达式可以单独进行运算得出结果并直接输出,如下代码所示,EL进行算术运算,逻辑运算,关系运算,及empty运算。空运算主要用于判断字符串,
集合是否为空,是空或为null及找不到值时都会输出true。
${sessionScope.sampleValue + 12} <br> // 显示22
${(sessionScope.sampleValue + 12)/3} <br> // 显示7.3
${(sessionScope.sampleValue + 12) /3==4} <br> // 显示 false
${(sessionScope.sampleValue + 12) /3>=5} <br> // 显示 true
使用EL表达式获取请求参数值
${param.username} 与 request.getParameter(“username”);
${paramValues.city} 与request.getParameterValues("city");
JSTL的使用
如何使用
将标签库对应的jar包拷贝到WEB-INF/lib目录下,以便于系统可以加载所需要的类。使用taglib指令在页面上引入标签的命名空间和前缀,帮助系统定位对应的类。
例: <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
if标签的使用
<%
User user = new User();
user.setName("胡萝卜");
user.setGender("f");
request.setAttribute("user",user);
%>
姓名:${user.name}<br/>
性别:<c:if test="${user.gender =='m'}" var="rs" scope="request">男</c:if>
<c:if test="${!rs}">女</c:if>
choose标签的使用
使用choose标签简化多个if标签的判断。代码如下所示:
<%
User user = new User();
user.setName("胡萝卜");
user.setGender("x");
request.setAttribute("user",user);
%>
性别:
<c:choose>
<c:when test="${user.gender == 'm'}">男</c:when>
<c:when test="${user.gender =='f'}">女</c:when>
<c:otherwise>未知</c:otherwise>
</c:choose>
foreach标签的使用
使用forEach标签完成对集合的遍历输出。
其中items属性为要遍历的集合,var属性为每次取出来的一个对象,varStatus指定当前迭代的状态。代码如下:
<table>
<tr>
<td>序号</td>
<td>姓名</td>
<td>年龄</td>
</tr>
<c:forEach items="${users}" var="u" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${u.name}</td>
<td>${u.age}</td>
</tr>
</c:forEach>
</table>