1. JSP基础理论
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的
一种用于开发动态web资源的技术。
JSP技术的特点:
- JSP是一种服务器端脚本语言,其出现降低了Servlet编写页面的难度。JSP本质上就是Servlet,实际上JSP是首先被翻译成Servlet后才编译运行的,因此JSP能够实现Servlet所能够实现的所有功能。
- 相比html而言,html只能为用户提供静态数据,而Jsp技术允许在页面中嵌套java代码,为用户提供动态数据。
第一次访问JSP

后续访问JSP

2. JSP的组成元素
2.1 DHTML静态内容
包含HTML静态网页,CSS样式表,Javascript客户端脚本等静态资源
2.2 JSP脚本
2.2.1 Java脚本
在JSP页面上以<% %>
表现,在其中编写Java代码,实现动态效果。其中包含了9个隐式对象,不用声明即可直接使用
<%
Object o = request.getAttribute("key");
%>
9个隐式对象分别如下:
- pageContext
page作用域
- request
request作用域和请求对象
- session
session作用域
- application
application作用域
- response
响应对象
- page
相当于JSP翻译成Java文件中的this
- config
web服务器配置对象
- out
Java文件中输出动态网页的out对象
- exception
JSP中的异常对象,仅限于JSP定义为isErrorPage=true时使用
2.2.2 输出脚本
在JSP页面上以<%= %>
表现,用于将变量或者表达式的值显示在网页上
<%
int a = 3;
int b = 4;
%>
值:<%= a+b %>
2.2.3 声明脚本
在JSP页面上以<%! %>
表现,用于声明类级别的属性或者方法
<%
x = 3;
int x = 5; //jsp_service方法中声明的局部变量
%>
<%!
int x = 10; //JSP翻译成Java文件中声明属性变量
%>
<%= x %> //5
<%= this.x %> //3
翻译成Java代码
public class XXX_jsp{
int x = 10;
public void jsp_service(){
x = 3; //相当于this.x = 3;
int x = 5; //局部变量
out.println(x); //局部变量的优先级高 5
out.println(this.x); //属性变量 3
}
}
2.2.4 注释脚本
在JSP页面上以<%-- --%>
表现为JSP的注释。
在JSP页面上,常见有3中注释方式
- <%-- --%> JSP注释
JSP注释在JSP翻译成Java过程中被忽略 - <% // %> Java注释
Java注释在Java文件编译成class文件过程中被忽略 - <!-- -- > HTML注释
始终不会被忽略,会被响应给客户端
在实际工作中尽量不要使用HTML注释,这部分实际上会响应给客户端,它会占用网络资源,同时如果客户端的使用者了解原理,可以通过“查看源”方式获取这部分被注释掉的代码,如果其中包含了敏感链接信息等内容,可能会造成一些商业风险。
2.3 JSP指令
在JSP页面上以<%@ %>
表现。
2.3.1 page指令
page指令可以出现多次(仅限在引入Java文件时),用于表示JSP页面的一些基本设置信息,
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
常用的属性
常用属性 | 用途 | 取值 | 必要项 |
---|---|---|---|
language | 服务器脚本语言的类型 | 只能是java | 是 |
contentType | 静态资源的响应类型 | text/html; charset=UTF-8 | 是 |
pageEncoding | JSP的字符集 | 各种字符集,比如UTF-8 | 是 |
import | Java语言的引包 | 相当于Java代码中的import,可以出现多次 | 否 |
errorPage | JSP的错误页指向 | 其他JSP页面(必须是isErrorPage=true) | 否 |
isErrorPage | 声明JSP自身是否为一个错误页,允许该JSP使用exception隐式对象 | true或false | 否 |
2.3.2 taglib指令
taglib指令可以出现多次,用于引入第三方的标签库,比如JSTL标签库和自定义标签库
<%@ taglib prefix="" uri="" %>
常用的属性
常用属性 | 用途 | 取值 | 必要项 |
---|---|---|---|
prefix | 被引入标签库在JSP页面上使用的前缀名 | 字符串 | 是 |
uri | 被引入标签库声明的uri | 表示url的字符串 | 是 |
tagdir | 用于指定tag文件目录 | 绝对路径 | 否 |
2.3.3 include指令
include指令可以出现多次,在页面上引入另一个JSP的内容。比如菜单这种在很多JSP页面都出现的内容就可以使用include指令来引入,一次修改处处生效。
<%@ include file="" %>
常用属性 | 用途 | 取值 | 必要项 |
---|---|---|---|
file | 引入JSP文件的站内地址 | 表示站内地址的url的字符串 | 是 |
2.4 JSP动作
2.4.1 include动作
与JSP指令的功能实际效果是一致的,在页面上引入另一个JSP的内容。
<jsp:include page="/x.jsp"></jsp:include>
include指令与include动作的区别
include指令:将两个JSP的代码融合至一起。
include动作:两个JSP有各自独立的编译和输出
2.4.2 forward动作
相当于在JSP页面上进行请求转发,当JSP执行到这句代码时,立即进行请求转发
<jsp:forward page="站内路径"></jsp:forward>
2.4.3 param动作
在请求转发的过程中传递数据,通过getParameter可以取得这些数据
<jsp:forward page="站内路径">
<jsp:param value="abc" name="haha"/>
<jsp:param value="123" name="xixi"/>
</jsp:forward>
2.4.4 useBean动作
从某个作用域中取得数据
<jsp:useBean id="online" class="com.neuedu.po.EmployeesPO" scope="session"></jsp:useBean>
常用属性 | 用途 | 取值 | 必要项 |
---|---|---|---|
id | 作用域中的key和变量名 | 字符串 | 是 |
class | 取出变量的类型 | 表示类路径的字符串 | 是 |
scope | 作用域 | page,request,session,application | 否 |
在JSP页面中声明某个变量
3. EL表达式
3.1 在作用域中取值
取得的是某个属性的值,要求该属性必须有相应的set和get方法
${sessionScope.online} //取得session作用域中key是online的对象的值
${sessionScope.online.ename} //取得session作用域中key是online的对象的ename属性的值
${haha} //取得request作用域中key是haha的对象的值
${requestScope.haha} //取得request作用域中key是haha的对象的值
EL表达式中作用域的隐式对象
EL表达式隐式对象 | 作用域 |
---|---|
pageScope | page作用域 |
requestScope(默认) | request作用域 |
sessionScope | session作用域 |
applicationScope | application作用域 |
3.2 基础的运算
EL表达式可以进行基础的运算,比如:四则运算和比较运算
${sessionScope.online.sex == 1} //显示sex属性的值是否为1
${2+3} //计算2+3的结果并显示
${2+3 > 4} //显示2+3>4的比较结果
3.3 web的基础信息
${pageContext.request.contextPath} //系统的root的名字
4. JSTL标签
在工程中导入jstl的jar包,在JSP页面上使用taglib指令引入标签库
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
着重介绍下面三种常用的标签,其他的略过
4.1 迭代标签(core库)
for...each
<c:forEach var="po" items="${elist}">
</c:forEach>
相当于
for(EmployeesPO po : (List<EmployeesPO>)request.getAttribute("elist")){
}
for
<c:forEach begin="0" end="5" step="1">
</c:forEach>
相当于
for(int i = 0; i < 5; i++){
}
4.2 条件标签(core库)
单独if
<c:if test="${5 > 2}">
</c:if>
相当于
if(5 > 2){
}
多重分支
<c:choose>
<c:when test="${po.sex == 1}">
男
</c:when>
<c:when test="${po.sex == 2}">
女
</c:when>
<c:otherwise>
保密
</c:otherwise>
</c:choose>
相当于
if(po.getSex() == 1){
男
}else if(po.getSex() == 2){
女
}else{
保密
}
4.3 日期格式标签(fmt库)
用于日期格式化的显示
将po.getBirthday()表示的date对象,按照yyyy年MM月dd日
的格式进行显示
<fmt:formatDate value="${po.birthday}" pattern="yyyy年MM月dd日"/>
网友评论