文章目录
1、什么是JSP
JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以 <% 开头以 %> 结束。
JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。
JSP标签有多种功能:
- 访问数据库
- 记录用户选择信息
- 访问JavaBeans组件等
- 在不同的网页中传递控制信息和共享信息。
2、JSP原理
WEB容器(Servlet引擎)接收到以.jsp为扩展名的URL的访问请求时,它将把该访问请求交给JSP引擎去处理。Tomcat中的JSP引擎就是一个Servlet程序,它负责解释和执行JSP页面。
每个JSP 页面在第一次被访问时,JSP引擎将它翻译成一个Servlet源程序,接着再把这个Servlet源程序编译成Servlet的class类文件,然后再由WEB容器(Servlet引擎)像调用普通Servlet程序一样的方式来装载和解释执行这个由JSP页面翻译成的Servlet程序。
Tomcat 5.x把为JSP页面创建的Servlet源文件和class类文件放置在“<TOMCAT_HOME>\work\Catalina<主机名><应用程序名>\”目录中,Tomcat将JSP页面翻译成的Servlet的包名为org.apache.jsp.<JSP页面在WEB应用程序内的目录名> 。
分析JSP所生成的Servlet代码:
-
原jsp文件:
-
JSP页面翻译成的Servlet继承了org.apache.jasper.runtime.HttpJspBase类,HttpJspBase类是HttpServlet的一个子类,因此JSP页面翻译成的Servlet是HttpServlet的一个孙子类。HttpJspBase类实现了javax.servlet.jsp.HttpJspPage接口中的部分方法,因此,HttpJspBase类是抽象的。
翻译后的jsp文件:
-
JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,JSP脚本片断(位于<%%>内的一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,JSP表达式(位于<%=和%>之中的内容)则是被转换成以其中的变量或表达式作为参数的out.print语句。
JSP本质上是一个Servlet程序,这是jsp被编译为java文件后的内容:
//初始化
public void _jspInit() {
}
//销毁
public void _jspDestroy() {
}
//JSPService
public void _jspService(HttpServletRequest request, HttpServletResponse response)
3、JSP的执行过程
JSP的执行过程主要可以分为以下几点:
客户端发出请求。
Web容器将JSP转译成Servlet源代码。
Web容器将产生的源代码进行编译。
Web容器加载编译后的代码并执行。
把执行结果响应至客户端。
4、JSP语法
脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:
<% 代码片段 %>
4.1、JSP表达式
一个JSP表达式中包含的脚本语言表达式,先被转化成String,然后插入到表达式出现的地方。
由于表达式的值会被转化成String,所以您可以在一个文本行中使用表达式而不用去管它是否是HTML标签。
表达式元素中可以包含任何符合Java语言规范的表达式,但是不能使用分号来结束表达式。
作用:用来将程序的输出,输出到客户端
JSP表达式的语法格式:
<%= 表达式 %>
例如:
<html>
<head>
<title>$Title$</title>
</head>
<body>
今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
</body>
</html>
输出:
今天的日期是: 2016-6-25 13:40:07
4.2、JSP脚本片段
在JSP里编写java程序
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
int sum =0;
for (int i = 0; i <=100 ; i++) {
sum +=i;
}
out.println("<h1>Sum="+sum+"</h1>");
%>
</body>
</html>
输出:
Sum=5050
4.3、JSP注释
语法 | 描述 |
---|---|
<%-- 注释 --%> | JSP注释,注释内容不会被发送至浏览器甚至不会被编译 |
<!-- 注释 --> | HTML注释,通过浏览器查看网页源代码时可以看见注释内容 |
<% | 代表静态 <%常量 |
%> | 代表静态 %> 常量 |
4.4、JSP声明
一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。JSP声明的会被编译到java类中,其他的就会编译到_jspService方法中。
JSP声明的语法格式:
<%! declaration; [ declaration; ]+ … %>
4.5、JSP中EL表达式
EL 语法很简单,它最大的特点就是使用上很方便。接下来介绍EL主要的语法结构:
${sessionScope.user.sex}
作用:
- 获取数据
- 执行运算
- 获取web开发的常用对象
4.6、JSP指令
JSP指令用来设置与整个JSP页面相关的属性。
JSP指令语法格式:
<%@ directive attribute=“value” %>
三种常用指令标签:
指令 | 描述 |
---|---|
<%@ page … %> | 定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等 |
<%@ include … %> | 包含其他文件 |
<%@ taglib … %> | 引入标签库的定义,可以是自定义标签 |
4.6.1、Page指令
下表列出与Page指令相关的属性:
属性 | 描述 |
---|---|
buffer | 指定out对象使用缓冲区的大小 |
autoFlush | 控制out对象的 缓存区 |
contentType | 指定当前JSP页面的MIME类型和字符编码 |
errorPage | 指定当JSP页面发生异常时需要转向的错误处理页面 |
isErrorPage | 指定当前页面是否可以作为另一个JSP页面的错误处理页面 |
extends | 指定servlet从哪一个类继承 |
import | 导入要使用的Java类 |
info | 定义JSP页面的描述信息 |
isThreadSafe | 指定对JSP页面的访问是否为线程安全 |
language | 定义JSP页面所用的脚本语言,默认是Java |
session | 指定JSP页面是否使用session |
isELIgnored | 指定是否执行EL表达式 |
isScriptingEnabled | 确定脚本元素能否被使用 |
举一个错误页面的设置:
index.jsp页面:
500.jsp页面:
输出页面:
修改错误页面,也可在web.xml中进行操作:
4.6.2、Include指令
JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。
Include指令的语法格式如下:
<%@ include file=“文件相对 url 地址” %>
5、JSP 标准标签库(JSTL)
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
- 核心标签
- 格式化标签
- SQL 标签
- XML 标签
- JSTL 函数
这就说一个核心标签和JSTL标签,其它的课参考菜鸟教程。
5.1、JSTL 库添加
在 web.xml 文件中添加 jstl表达式依赖 和standard标签库
<!-- jstl表达式依赖 -->
<dependency>
<groupId>javax.servlet.jsp.jstl</groupId>
<artifactId>jstl-api</artifactId>
<version>1.2</version>
</dependency>
<!-- standard标签库 -->
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
5.2、JSP标签
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%-- 转发到jspatag页面,并携带两个参数 --%>
<jsp:forward page="jsptag.jsp">
<jsp:param name="name" value="Jick"/>
<jsp:param name="age" value="20"/>
</jsp:forward>
</body>
</html>
获取转发的参数信息
<body>
名字:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
</body>
5.3、核心标签
核心标签是最常用的 JSTL标签。引用核心标签库的语法如下:
<%@ taglib prefix=“c” uri=“http://java.sun.com/jsp/jstl/core” %>
标签 | 描述 |
---|---|
<c:out> | 用于在JSP中显示数据,就像<%= … > |
<c:set> | 用于保存数据 |
<c:remove> | 用于删除数据 |
<c:catch> | 用来处理产生错误的异常状况,并且将错误信息储存起来 |
<c:if> | 与我们在一般程序中用的if一样 |
<c:choose> | 本身只当做<c:when>和<c:otherwise>的父标签 |
<c:when> | <c:choose>的子标签,用来判断条件是否成立 |
<c:otherwise> | <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行 |
<c:import> | 检索一个绝对或相对 URL,然后将其内容暴露给页面 |
<c:forEach> | 基础迭代标签,接受多种集合类型 |
<c:forTokens> | 根据指定的分隔符来分隔内容并迭代输出 |
<c:param> | 用来给包含或重定向的页面传递参数 |
<c:redirect> | 重定向至一个新的URL. |
<c:url> | 使用可选的查询参数来创造一个URL |
5.4、JSTL表达式
JSTL标签库就是为了弥补HTML的不足;它自定义了很多标签,可以供我们使用,标签的功能和java代码一样。
jstl标签使用步骤:
- 引入对应的taglib
- 使用其中的方法
- 在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误
这个例子用了<c:if>和<c:out>标签:
<%--引入jstl核心标签,才能使用JSTL标签--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h4>if测试</h4>
<form action="jsptag.jsp" method="get">
<%--
EL表达式获取表单中的数据
${param.参数名}
--%>
<input type="text" name="username" value="${param.username}">
<input type="submit" value="登录">
</form>
<%--判断提交的是否是管理员,如果是就登录成功--%>
<%--test:判断条件 var:返回判断结果的变量名(结果是true还是false)--%>
<c:if test="${param.username == 'admin'}" var="isAdmin">
<c:out value="管理员欢迎您!"/>
</c:if>
<br/>
<c:out value="${isAdmin}"/>
</body>
</html>
6、JSP JavaBean
JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。
特定写法:
- 可能有一系列可读写属性。
- 必须有一个无参构造
- 属性必须私有化
- 必须有对应的get、set方法
6.1、JavaBean 属性
方法 | 描述 |
---|---|
getPropertyName() | 如果属性的名称为 myName,那么这个方法的名字就要写成 getMyName() 来读取这个属性。这个方法也称为访问器。 |
setPropertyName() | 如果属性的名称为 myName,那么这个方法的名字就要写成 setMyName()来写入这个属性。这个方法也称为写入器。 |
一个只读的属性只提供 getPropertyName() 方法,一个只写的属性只提供 setPropertyName() 方法。
6.2、访问JavaBean
<jsp:useBean> 标签可以在 JSP 中声明一个 JavaBean,然后使用。声明后,JavaBean 对象就成了脚本变量,可以通过脚本元素或其他自定义标签来访问。
<jsp:useBean> 标签的语法格式如下:
<jsp:useBean id=“bean 的名字” scope=“bean 的作用域” typeSpec/>
其中,根据具体情况,scope 的值可以是 page,request,session 或 application(page < request < session < application )。
id值可任意只要不和同一 JSP 文件中其它 <jsp:useBean> 中 id 值一样就行了。
6.3、访问 JavaBean 对象的属性
在 <jsp:useBean> 标签主体中使用 <jsp:getProperty/> 标签来调用 getter 方法,
使用 <jsp:setProperty/> 标签来调用 setter 方法,语法格式如下:
<jsp:useBean id=“id” class=“bean 编译的类” scope=“bean 作用域”>
<jsp:setProperty name=“bean 的 id” property=“属性名” value=“value”/>
<jsp:getProperty name=“bean 的 id” property=“属性名”/>
…
</jsp:useBean>
name属性指的是Bean的id属性。property属性指的是想要调用的getter或setter方法。
javaBean一般用来和数据库的字段做映射 ORM;
ORM:对象关系映射
- 表 --> 类
- 字段 --> 属性
- 行记录 --> 对象
数据库表(people表):
id | name | age | address |
---|---|---|---|
1 | 小明1 | 19 | 北京 |
2 | 小明2 | 25 | 北京 |
3 | 小明3 | 42 | 北京 |
java对应的实体类(people类):
package com.sdablog.pojo;
//实体类,一般都是和数据库中的表结构一一对应
public class People {
private int id;
private String name;
private int age;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "People{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", address='" + address + '\'' +
'}';
}
}
JSP访问实体类people:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:useBean id="People" class="com.sdablog.pojo.People" scope="page"/>
<jsp:setProperty name="People" property="id" value="1"/>
<jsp:setProperty name="People" property="name" value="王五"/>
<jsp:setProperty name="People" property="age" value="18"/>
<jsp:setProperty name="People" property="address" value="上海"/>
id:<jsp:getProperty name="People" property="id"/>
姓名:<jsp:getProperty name="People" property="name"/>
年龄:<jsp:getProperty name="People" property="age"/>
地址:<jsp:getProperty name="People" property="address"/>
</body>
</html>
输出: