1.JSP基本概念
**JSP(JavaServer Pages)**是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户的HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。
JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。
JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
JSP,指Java服务器端页面。
可以理解为:一个特殊的页面,其中可以指定HTML便签,又可以定义Java代码。很大程度上简化了代码书写。
2.JSP原理
① 服务器解析客户端的请求消息,寻找index.jsp资源。
② index.jsp资源会转换为index_jsp.java文件,该index_jsp.java文件实际是一个Servlet。所以JSP本质上是一个Servlet。
③ 编译index_jsp.java文件,生成index_jsp.class字节码文件。
④ 由index_jsp.class字节码文件提供访问,将资源返回给浏览器。
3.JSP的脚本
JSP的脚本:JSP定义Java代码的方式。
①<% 代码内容 %>
:定义的Java代码,在service()方法中。
②<%! 代码内容 %>
:定义的Java代码,在Jsp转换后的Java类的成员变量位置。
③<%= 代码内容 %>
:定义的Java代码,会输出到页面上。
4.JSP的9个内置对象
JSP的内置对象指在JSP页面中不需要获取和创建,可以直接使用的对象。
pageContext、request 、session、application为域对象。
内置对象(即可使用的变量) | 真实类型 | 描述 |
---|---|---|
pageContext | PageContext | 当前页面共享数据,还可以获取其他8个内置对象 |
request | HttpServletRequest | 一次请求访问的多个资源(转发) |
session | HttpSession | 一次会话的多个请求间 |
application | ServletContext | Servlet上下文对象,多个用户间共享数据 |
response | HttpServletResponse | 响应对象 |
page | Object | 当前页面(Servlet)的对象 |
out | JspWriter | 字符输出流对象,将数据输出到页面上 |
config | ServletConfig | Servlet的配置对象 |
exception | Throwable | 异常对象,只有在page指令中isErrorPage属性值为true才能使用 |
5.JSP的指令
JSP的指令主要作用适用于配置JSP页面,导入资源文件。
<%@ 指令名称 属性名1=属性值1 属性名2=属性值2 ... %>
指令名称 | 描述 |
---|---|
page | 配置JSP页面 |
include | 导入页面的资源文件, <%@include file=" xxx.jsp "%> |
taglib | 导入资源 |
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
page指令的常见属性 | 描述 |
---|---|
contentType | 等同于response.setContentType(),设置响应体的MIME类型以及字符集 |
import | 导入java的jar包 |
errorPage | 当前页面发生异常后,会自动跳转到指定的错误页面 |
isErrorPage | 标识当前页面是否是错误页面,true值可以使用内置对象Exception |
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
taglib指令的常见属性 | 描述 |
---|---|
prefix | 自定义的前缀名,推荐默认c |
uri | 标签库的uri路径 |
6.JSP页面中的注释
(1)HTML注释:<!-- -->
:只能注释HTML代码片段。
(2)JSP注释:<%-- -->
:可以注释所有代码片段,推荐使用该注释。
7.EL表达式
EL表达式:Expression Language表达式语言, 可以替换和简化JSP页面中java代码的编码。
语法:${表达式}
注意:JSP是默认支持EL表达式。要想忽略EL表达式,则可以再page指令中isELIgnored属性值为true即可。但这种方式会忽略整个页面的EL表达式,因此还有一种方法时忽略单个EL表达式,就是在EL表达式之前加\
即可,例\${ 3 > 4 }
。
7.1.EL表达式的使用
运算符使用
算数运算符 | + - * /(div) %(mod) |
比较运算符 | > < >= <= == != |
逻辑运算符 | &&(and) ||(or) !(not) |
空运算符 | empty |
注意:empty空运算符符用于判断字符串、集合、数组对象等是否为null且长度是否为0。
${empty list}
,判断域对象中list键的值是否为null且长度为0。
${not empty str}
,判断字符串、集合、数组对象是否不为null,且长度大于0。
获取域对象中的值
域对象 | 域对象名称 |
---|---|
pageContext | pageScope |
request | requestScope |
session | sessionScope |
application(ServletContext) | applicationScope |
使用规则:
(1)从指定域中获取指定键的值,${域对象名称.键名}
举例,在request域中存储了
name=Atlantis
,那么可以通过${requestScope.name}
获取到值。
(2)依次从最小的域对象中查找是否有该键对应的值,${键名}
查找顺序(从小到大):pageContext -> request -> session -> application
举例,在request域中存储了
name=Atlantis
,那么${name}
会依次从最小的域对象开始查找name键的值,直到找到位置。
(3)获取对象,${域对象名称.键名.属性名}
。
通过对象的属性来获取值,其本质是调用对象的set和get方法来获取到的值,而不是根据成员变量。
${requestScope.user.name}
,指在requestScope域中查找是否存在user键,若存在该键,则调用name属性值的get方法,即JavaBean中User类的getName()方法。
package com.atlantis.entity;
public class User {
private String name;
private int age;
// 省略构造器和set、get方法
// ...
}
<%@ page import="com.atlantis.entity.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式获取对象的值</title>
</head>
<body>
<%
User user = new User(