JSP全名为Java Server Pages,中⽂名叫java服务器页面,其根本是⼀个简化的Servlet设计,它 是由 Sun Microsystems公司倡导、许多公司参与⼀起建⽴的⼀种动态网页技术标准。
JSP技术有点类似ASP技术(加强市场),它是在传统的页面HTML文件(.htm,.html)中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成 JSP文件,后缀名为(*.jsp)。 ⽤JSP开发的Web应用是跨平台的,既能在Linux下运行,也能在其他操作系统上运行。 JSP将网页逻辑与网页设计的显示分离,⽀持可重用的基于组件的设计,使基于Web的应用程序的开发变得迅速和容易。
HTML是静态页面,只给用户提供静态的数据;JSP是动态页面,可以嵌入JAVA代码,为用户提供动态数据。
html注释内容,查看源码时能看到;jsp注释,查看页面源码时看不到。
<%-- jsp注释 --%>
<% java代码%>
声明标签
<%!变量或者⽅法声明%>
表达式标签,在页面上显示的效果
<%= 表达式%>
程序代码标签,页面上动态展示内容
<%java代码%>
服务器启动(以tomcat为例),当浏览器访问页面(例如http://localhost:8080/test/index.jsp),服务器发现后缀为.jsp,它会根据路径(webapps目录下部署的项目)找到 index.jsp文件;
会在work目录对应的项目中,将index.jsp翻译成index_jsp.java文件,将JSP中的所有的HTML代码通过流进行输出;
对这个java文件进行编译,产⽣⼀个 index_jsp.class文件,被虚拟机加载;
jsp本质是servlet,服务器端是把JSP中的HTML代码以流的方式写回浏览器进行响应,用户真正拿到的是服务器处理完毕的class对象(Servlet)。
Servlet的方法(jsp的java文件是继承实现了HttpJspBase这个抽象类,而HttpJspBase又继承了HttpServlet,这也就是Jsp和Servlet的联系)
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPService
public void _jspService(.HttpServletRequest request,HttpServletResponse response){
}
判断请求;
内置一些对象,前端可以拿到
final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.servlet.http.HttpSession session = null; //session
final javax.servlet.ServletContext application; //applicationContext
final javax.servlet.ServletConfig config; //config
javax.servlet.jsp.JspWriter out = null; //out
final java.lang.Object page = this; //page:当前
HttpServletRequest request //请求
HttpServletResponse response //响应
输出页面前增加的代码
response.setContentType("text/html"); //设置响应的页面类型
pageContext = _jspxFactory.getPageContext(this, request, response, null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
在说工作原理的时候其实提到了JSP内部内置了一些预定义对象,分别为:request、response、session、application、out、 pagecontext、config、page、exception,共九个。
request 对象
是 javax.servlet.httpServletRequest类型的对象。 该对象代表了客户端的请求信息,主要用于接受通过HTTP协议传送到服务器的数据。(包括头信息、系统信息、请求方式以及请求参数等)。request对象的作用域为⼀次请求。例如:
<%request.setAttrbute("name","abc");%>
<%=request.getAttrbute("name")%>
response对象
response 代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response 对象也具有作用域,它只在JSP页面内有效。所属类型为HttpServletResponse,例如:
<%response.sendRedirect("/index.jsp")%>
session对象
session 对象是由服务器自动动创建的与用户请求相关的对象。服务器为每个用户都⽣成⼀个 session对象,⽤于保存该⽤户的信息,跟踪用户的操作状态。session对象内部使用Map类来保存数据,因此保存数据的格式为 “Key/value”。 session对象的value可以使复杂的对象类型,而不仅仅局限于字符串类型。所属类型为HttpSession ,例如:
<%session.setAttrbute("name","abc");%>
<%=session.getAttrbute("name")%>
application对象
application 对象可将信息保存在服务器中,直到服务器关闭,application对象中保存的信息会在整个应用中都有效。
<%application.setAttrbute("name","abc");%>
<%=application.getAttrbute("name")%>
与session对象相比,application对象⽣命周期更长,类似于系统的“全局变量”: ServletContext。
区别:
out 对象
out 对象用于在Web浏览器内输出信息,并且管理应用服务器上的输出缓冲区。在使⽤ out 对象输出数据时,可以对数据缓冲区进行操作,及时清除缓冲区中的残余数据(字符输出流),为其他的输出让出缓冲空间。待数据输出完毕后,要及时关闭输出流。 例如:
out.print("");
pageContext 对象
pageContext 对象的作用是取得任何范围的参数(作用域只能在当前页面),通过它可以获取 JSP页面的out、 request、reponse、session、application 等对象。pageContext对象的创建和初始化都是由容器来完成的,在JSP页面中可以直接使用 pageContext对象。
<%pageContext.setAttrbute("name","abc");%>
<%=pageContext.getAttrbute("name")%>
config 对象
config 对象的主要作用是取得服务器的配置信息。通过 pageConext对象的 getServletConfig() ⽅法 可以获取⼀个config对象。当⼀个Servlet 初始化时,容器把某些信息通过config对象传递给这个 Servlet。 开发者可以在web.xml ⽂件中为应⽤程序环境中的Servlet程序和JSP页面提供初始化参数。
String url= config.getServletContext().getRealPath("/image");
url=<%=url %>
page 对象
page 对象代表JSP本身,只有在JSP页面内才是合法的。 page隐含对象本质上包含当前 Servlet 接⼝引用的变量,类似于Java编程中的 this 指针。
exception 对象
exception 对象的作⽤是显示异常信息,只有在包含 isErrorPage=“true” 的页面中才可以被使用, 在⼀般的JS页面中使⽤该对象将⽆法编译JSP⽂件。excepation对象和Java的所有对象⼀样,都具有系统提供的继承结构。exception 对象⼏乎定义了所有异常情况。在Java程序中,可以使⽤try/catch关键 字来处理异常情况; 如果在JSP页面中出现没有捕获到的异常,就会⽣成 exception 对象,并把 exception 对象传送到在page指令中设定的错误页面中,然后在错误页面中处理相应的 exception 对 象。
(1)在error.jsp页面中设置isErrorPage=“true” 的属性 (使⽤exception对象之前,需要先将当前页面设置成错误页面)。
<%@ page language="java" isErrorPage="true" import="java.util.*" pageEncoding="UTF-8"%>
(2) 在可能发⽣错误的页面中添加errorPage属性,指向发生错误时需要跳转的页面。
<%@ page pageEncoding="utf-8" errorPage="error.jsp" contentType="text/html;charset=UTF-8" language="java" %>
JSP指令用来设置整个JSP页面相关的属性,如网页的编码方式和脚本语⾔。
<%@ directive attribute="value" %>
指令名称 | 描述 |
---|---|
page | 定义⽹⻚依赖属性,⽐如脚本语⾔、error⻚⾯、缓存需求等等 |
include | 包含其他⽂件 |
taglib | 引⼊标签库的定义 |
Page指令
Page指令为容器提供当前页面的使用说明,⼀个JSP页面可以包含多个page指令。
属性名 | 属性值 | 描述 |
---|---|---|
language | java | 解释该JSP⽂件时采⽤的语⾔,⼀般为java语⾔,默认为java |
extends | 任何类的全名 | 编译该JSP⽂件时继承哪个类,JSP为Servlet,因此当指明继承普通类时需要实现Servlet的init、destroy等⽅法 |
import | 任何包名、类名 | 引⼊该JSP中⽤到的类、包等,import是唯⼀可以声明多次的page 指令属性,⼀个import可以引⽤多个类,中间⽤英⽂逗号隔开 <%@ page import=包名.类名,包名.类名%> |
session | boolean | 该JSP内是否内置Session对象,如果为true,则内置Session对象,可直接使用,否则反之,默认为true |
autoFlush | boolean | 是否运⾏缓存,如果为true,则使⽤out.println()等⽅法输出的字 符串并不是⽴刻到达客户端服务器的,⽽是暂时存到缓存⾥,缓存 满了或者程序⾏完毕或者执⾏out.flush()操作时才到客户端,默认 为true。 |
buffer | none 或者数字(单位KB) | 指定缓存⼤⼩,当autoFlush设为true时有效,例如<%@ page buffer=10kb%> |
isThreadSafe | boolean | 是否线程安全,如果为true,则运⾏多个线程同时运行该jsp程序,否则只运⾏⼀个线程,其余线程等待,默认为false |
isErrorPage | boolean | 指定该页面是否为错误显示页面,如果为true,则该JSP内置有⼀ 个Exception对象exception,可直接使⽤,否则没有,默认为 false |
errorPage | 某个 JSP页面的相对路径 | 指明⼀个错误⻚⾯,如果该JSP程序抛出⼀个未捕捉的异常,则转 到errorPage指定的⻚⾯,errorPage指定的⻚⾯通常 isErrorPage属性为true,且内置的exception对象为未捕捉的异常 |
contentType | 有效的⽂档类型 | 客户端浏览器根据该属性判断⽂档类型,例如 HTML格式为 text/html、纯⽂本格式为text/plain、JPG图像为image/jpeg、 GIF图像为image/gifWORD⽂档为application/msword,该属性常跟着charset设置编码⼀起,作⽤是通知服务器和浏览器都使用同⼀个码表 |
pageEncoding | UTF8,ISO8859- 1等 | 设置当前页面的编码格式 |
例如jsp的头:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
include指令
JSP可以通过include指令来包含其他文件。被包含的⽂件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP⽂件的⼀部分,会被同时编译执行。例如:
<%@include file="common/header.jsp"%>
Taglib指令
JSP API允许用户⾃定义标签,⼀个⾃定义标签库就是⾃定义标签的集合。 Taglib指令引⼊⼀个⾃定义标签集合的定义,包括库路径、自定义标签。
<%@ taglib uri="uri" prefix="" %>
EL(Expression Language )表达式语⾔最初定义于JSTL1.0部分,在JSP2.0中,EL从JSTL中剥离出来,放置在JSP规范中,称为JSP2.0规范的⼀部分。
在JSP中使用EL表达式,可以简化对象和变量的访问。
${需要展示信息的名字}
${requestScope.key}
如果不同的作用域中有相同的key,当表达式没有指定变量或者对象的范围时, 那么容器会依次从pageContext—>request—>session—>application中(作用范围由小到大)查找该变量或对象。
pageScope对象
用于获取当前页面的属性值。
requestScope对象
用于获取请求范围的属性值。
sessionScope对象
用于获取会话范围的属性值。
applicationScope对象
用于获取程序范围的属性值。
术语 | 定义 |
---|---|
算术操作符 | + 、-、 * 、/(div) 除 、 %(mod) 余数 |
逻辑操作符 | and、&&、or、||、!、not |
关系操作符 | ==、eq、!=、ne、、gt、<=、le、>=、ge。可以与其他值进行比较,或与布尔型、字符串型、整型或浮点型文字进行比较。 |
条件操作符 | A ?B :C。根据 A 赋值的结果来赋值 B 或 C。 |
Empty | Empty操作符是⼀个前缀操作符用于判断⼀个值是否为null或者为empty。如String str = “”; ${empty str} 返回值为true。 |
单个变量:${a+10}
单个变量:${s}
单个对象:${key.属性名}
<%
//对象类型
Users u=new Users();
u.setName("王⽼五");
u.setPass("abc");
pageContext.setAttribute("u1",u);
%>
user.name=${u1.name}
user.pass=${u1.pass}
<%
// list集合对象:
List list=new ArrayList();
list.add("刘能");
list.add(30);
list.add(u);
pageContext.setAttribute("list2",list);
%>
list1=${list2[0]}
list2=${list2[1]}
list3=${list2[2].pass}
<%
// map集合:
Map map = new HashMap();
map.put("k1","key");
pageContext.setAttribute("map1",map);
%>
k1=${map1.k1}
判断变量是否有值或是否存在:${empty key值}
List list2=new ArrayList();
list2.add("aa");
request.setAttribute("list222",list2);
判断list中是否有数据:${empty list222}
JSP标准标签库(JSTL)是⼀个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL⽀持通用的、结构化的任务,⽐如迭代、条件判断、XML文档操作、国际化标签、SQL标签。 除了 这些,它还提供了⼀个框架来使⽤集成JSTL的⾃定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别:
核心标签,前缀为c,功能范围为core;
http://java.sun.com/jsp/jstl/core
格式化标签,前缀为fmt,功能范围为i18n;
http://java.sun.com/jsp/jstl/fmt
sql标签,前缀为sql,功能范围为sql;
http://java.sun.com/jsp/jstl/sql
xml标签,前缀为x,功能范围为xml;
http://java.sun.com/jsp/jstl/xml
jstl函数,前缀为fn,功能范围为functions;
http://java.sun.com/jsp/jstl/function
需要下载 jakarta-taglibs-standard-版本号.zip 包并解压;
将 jakarta-taglibs-standard-版本号/lib/ 下的两个jar文件(standard.jar 和 jstl.jar ⽂件)导入;
在jsp页面中引入。
<%@ taglib prefix=”jstl前缀” uri=”功能范围的路径”%>
核心标签(最常用)
<c:out>主要用来显示数据的内容
名称 | 说明 | 是否必须 | 默认值 |
---|---|---|---|
Value | 需要显示出来的值 | 是 | ⽆ |
default | 如果value的值为null,则显示default的值 | 否 | ⽆ |
escapeXml | 是否转换特殊字符,如:<转换成 & lt; | 否 | True |
例如:
<c:set> 主要用来将变量存储⾄JSP范围中 或是JavaBean的属性或Map对象中
名称 | 说明 | 是否必须 | 默认值 |
---|---|---|---|
Value | 要被存储的值 | 否 | ⽆ |
var | 存⼊的变量名称 | 否 | ⽆ |
scope | var变量的JSP范围 | 否 | Page |
target | JavaBean或Map对象 | 否 | ⽆ |
property | 指定target对象的属性 | 否 | ⽆ |
例如:
<c:remove> 主要负责移除变量
名称 | 说明 | 是否必须 | 默认值 |
---|---|---|---|
Var | 欲移除的变量名称 | 是 | ⽆ |
Scope | var变量的jsp范围 | 否 | Page |
例如:
<c:if> 主要用于进行if判断,如果为true,则输出标签体中的内容
名称 | 说明 | 是否必须 | 默认值 |
---|---|---|---|
test | 表达式的结果为true,则执⾏体内容,false则相反 | 是 | ⽆ |
var | 如果用来存储test运算的结果(true或false) | 否 | ⽆ |
scope | Var变量的JSP范围 | 否 | page |
例如:
是的
<c:choose>,<c:when>,<c:otherwise> 作⽤相当于if-else
名称 | 说明 | 是否必须 | 默认值 |
---|---|---|---|
test | 表达式的结果为true,则执⾏体内容,false则相反 | 是 | 无 |
例如:
是的
不是
<c:forEach> 循环控制,它可以将数组,集合(Collection)中的成员循序浏览⼀遍。
名称 | 说明 | 是否必须 | 默认值 |
---|---|---|---|
var | ⽤来存放现在指定的成员 | 是 | ⽆ |
items | 被迭代的集合对象 | 否 | ⽆ |
varStatus | ⽤来存放现在指的相关成员信息,例如count从1开始计数,index就是下标从0开始。 | 否 | ⽆ |
begin | 开始的位置 | 否 | 0 |
end | 结束的位置 | 否 | 最后⼀个成员 |
step | 每次迭代的间隔数 | 否 | 1 |
例如:
<%
// list集合对象:
List list=new ArrayList();
list.add("刘能");
list.add("a");
list.add("u");
pageContext.setAttribute("list",list);
%>
${sta.count}-${sta.index}-${user}
格式化标签
maxIntegerDigits:整数部分最多的位数
minIntegerDigits:整数部分最少的位数
maxFrctionDigits:小数部分最多的位数
minFrctionDigits:⼩数部分最少的位数
var:存储格式化结果的变量
scope:var属性的作用域
integerOnly:是否只解析整型数true或者浮点数false
var:格式化后的字符串所要存放的变量,若不指定var,则会将格式化的结果直接显示在页面
scope:变量存放的域属性空间,默认page
type:其取值为date、time、both,表示给出的value是日期、时间、还是两者都包含,默认是date