一、基本含义
1.1 JSP含义
项目 | 含义 |
---|---|
全称 | Java Sever Pages。Java 服务器页面 |
根本 | 简化的Servlet设计。一种编程技术。 |
目的 | 实现了在Java中使用HTML标签。 |
一种标准 | 一种动态网页技术标准,也是JavaEE的标准 |
执行位置 | 与Servlet一样,在服务器端运行。 |
组成元素 | HTML标签 + JSP标签 + Java程序片段(Scriptlet)。 |
1.1.1 特点
(1)构建动态Web应用程序。
(2)独立于平台的服务器端编程技术。
(3)可以访问整个Java API系列。
(4)可以认为它是Servlet的扩展。
1.1.2 使用JSP的目的
(1)可以通过网页表单收集用户的输入。
(2)从数据库或其他来源将数据记录处理。
(3)最后通过动态创建网页呈现。
(4)降低了对客户浏览器的要求。
1.1.3 JSP标签的目的
(1)从数据库检索信息或注册用户信息。
(2)访问JavaBeans组件。
(3)在页面之间传递控制以及在请求。
(4)页面之间共享信息。
1.1.4 优点
(一)平台无关性。
可以应用在不同的系统中。如Windows、Linux、Mac和Solaris。
(二)将内容与表示分离。
(1)业务处理代码全部放到JavaBean中
(2)或者把业务处理代码交给Servlet、Struts等其他业务控制层来处理。实现业务代码从视图层分离。
(3)JSP页面只负责显示数据。
(4)当需要修改业务代码时,不会影响JSP页面的代码。
(三)强调可重用组件。
(1)可以使用JavaBean编写业务组件,也就是使用一个JavaBean类封装业务处理代码或者作为一个数据存储模型
(2)在JSP页面甚至整个项目中都可以重复使用这个JavaBean。
(3)JavaBean也可以应用到其他Java应用程序中,包括桌面应用程序。
简化页面开发-Web 设计人员和 Web 程序员使用 Web 开发工具开发 JSP 页面
(四)高速。
(1)JSP会预编译,就是在用户第一次通过浏览器访问JSP页面时,服务器将对JSP页面代码进行编译,并且仅执行一次编译。
(2)编译好的代码将被保存,在用户下一次访问时,直接执行编译好的代码。这样不仅节约了服务器的CPU资源,还大大提升了客户端的访问速度。
1.2 与Servlet关系
与Servlet的区别:
(1)更容易维护。使用JSP可以分开页面的设计和逻辑代码的开发。
(2)提供了一些额外的功能,如表达式语言,自定义标签等。
(3)JSP组件是一种Java servlet。
1.3 与HTML区别
项目 | JSP | HTML |
---|---|---|
信息 | 动态信息 | 静态信息 |
运行位置 | 服务器端 | 客户端 |
1.4 JSP执行原理
1.4.1 顺序
(1)服务器先执行程序片段代码。
(2)再将结果和HTML代码返回给客户端。
1.4.2 为什么可以在jsp中嵌入java代码?
(1)因为jsp在执行需要先转译成为java代码。
(2)然后在编译成为class文件,也就是jsp的实质就是一个java文件。
(3)因此,jsp页面在第一次访问时,速度会比较慢。需要转译和编译两个步骤,以后就会非常快,因为可直接访问已经编译好的class文件了。
二、JSP页面组成元素
指令 + 表达式 + 小脚本+ 声明 + 注释 + 静态内容
2.1 指令
2.1.1 page
作用:定义页面依赖属性,例如脚本语言,错误页面和缓冲的要求
语法:<%@ page 属性1=“属性值” 属性2=“属性值” 属性3=“属性值” %>
位置:jsp页面顶端,可有多个page指令。
属性 | 含义 | 默认值 |
---|---|---|
language | 指定JSP页面使用的脚本语言 | Java |
import | 引用脚本语言中使用到的类文件 | 无 |
contentType | 指定JSP页面的编码方式 | text/html,ISO-8859-1 |
<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" %>
2.1.2 include
<%@include file="date.jsp" %>
参见《JavaWeb-请求重定向、请求转发和包含》
2.1.3 taglib
作用:标签库 。使用标签库定义新的自定义标签,在JSP页面中启用定制行为。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
<%@ taglib prefix="x" uri="http://java.sun.com/jsp/jstl/xml" %>
2.2 注释
JSP页面注释:HTML注释 + 脚本注释 + JSP注释
2.2.1 HTML注释——<!-- -->
语法:<!-- html注释 -->
特点:客户端也可见。
<!-- html注释 -->
<%-- jsp注释 --%>
<%
// 单行注释
/* 多行注释 */
%>
2.2.2 JSP注释——<%-- --%>
语法:<%-- jsp注释 --%>
特点:客户端不可见。
<%-- jsp注释 --%>
<%
// 单行注释
/* 多行注释 */
%>
2.2.3 脚本注释
语法:// 单行注释
语法:/* 多行注释 */
特点:客户端不可见。
<%
// 单行注释
/* 多行注释 */
out.println("Java语言书写,展示在页面上!");
%>
2.3 脚本——<% 脚本代码 %>
含义:在JSP页面中执行的Java代码。
语法:<% Java代码 %>
<%
// 单行注释
/* 多行注释 */
out.println("Java语言书写,展示在页面上!");
%>
2.4 声明——<%! 变量或函数 %>
含义:在JSP页面中定义变量或者方法。
语法:<%! Java代码 %>
<% int a = 3; %>
<%! int b = 4; %>
<%-- 注意:a是局部变量。b是全局变量 %>
<%-- 声明:变量 --%>
<%! String str = "张三"; // 字符串变量。 %>
<%-- 声明:函数 --%>
<%!
int add(int x, int y) {// 声明了一个返回值为整型的函数。
return x + y;
}
%>
<%-- 调用 %>
你好,<%=str /* 调用变量 */> !<br />
x + y = <%=add(10,5) /* 调用声明的函数 */ %>
2.5 表达式——<%=表达式 %>
含义:在JSP页面中执行的表达式。
语法:<%=表达式 %>
注意:表达式后无“;”。
你好,<%=str /* 调用变量 */> !<br />
x + y = <%=add(10,5) /* 调用声明的函数 */ %>
三、JSP页面的生命周期
jspService():处理客户端请求。每一个请求,JSP引擎创建一个新的线程来处理请求。多客户端请求,形成多线程。采用多线程方式处理,可以降低对系统资源的需求,提高系统的并发量和响应时间。多线程会带来同步问题,但由于该Servlet始终驻于内存,所以响应快。
JSP处理:
(1)浏览器→发送HTTP请求→Web服务器。
(2)Web服务器→识别HTTP请求是一个JSP页面(.jsp)→JSP引擎
(3)JSP引擎从磁盘加载JSP页面,并将其转换成servlet的内容。所有的模板文本被转换给println()语句,所有JSP元素被转换为实现该页面相应动态行为的Java代码。
(4)JSP引擎编译成servlet的一个可执行类并转发原始请求到servlet引擎。
(5)一部分Web服务器调用servlet引擎加载Servlet类并执行它。在执行期间,Servlet产生HTML的格式输出,其servlet引擎传递到web服务器响应HTTP请求。
(6)Web服务器响应HTTP转发静态的HTML内容到浏览器。
(7)最后的 web 浏览器处理HTTP响应动态生成的HTML页面完全就像一个静态页面内容
四、案例——九九乘法表
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>九九乘法表</title>
</head>
<body>
<h1>九九乘法表</h1>
<%!
// 返回九九乘法表对应的HTML代码。通过表达式来调用,在页面上显示。
String printMultiTable(){
String str = "";
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= i; j++){
str += i + " × " + j + " = " + (i * j) + " ";// 空格转义字符。
}
str += "<br/>"; // 追加换行标签。
}
return str;
}
// JSP内置out对象,使用脚本方式调用,打印九九乘法表。
void printMultiTable2(JspWriter out) {
for(int i = 1; i <= 9; i++){
for(int j = 1; j <= i; j++){
try{
out.println( i + " × " + j + " = " + (i * j) + " ");// 空格转义字符。
}catch(Exception e){
e.printStackTrace();
}
}
try{
out.println("<br/>"); // 追加换行标签。
}catch(Exception e){
e.printStackTrace();
}
}
}
%>
<hr />
<p>通过JSP表达式创建九九乘法表</p>
<%=printMultiTable() %>
<hr />
<p>通过JSP内置对象out创建九九乘法表</p>
<% printMultiTable2(out); %>
</body>
</html>
五、Web程序的请求响应模式
请求模式:指用户(客户端)的请求(request)。
响应模式:指Web服务器给用户的响应(response)。
示例:QQ登录。
用户:点击“登录”,向服务器发送请求。在请求对象中封装了用户名和密码。
Web服务器:接收请求。判断用户名和密码后,给用户响应页面。
六、缓冲区——Buffer
含义:就是内存的一块区域,用来保存临时数据。
目的:IO输出最原始的是一个字节一个字节输出,效率太低。提高数据的输出效率。
示例:网页(一碗米饭),一个字节(一个米粒),缓冲区(勺子),输出数据(吃饭)。一个米粒一个米粒吃,结果会怎么样?
七、JSP状态管理
7.1 http协议无状态性
含义:当浏览器发送请求给服务器时,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器时,服务器不知道是同一个浏览器。即服务器无法记住你。
7.2 保存用户状态的两大机制
session:参见《JSP-内置对象》
cookie:参见《JSP-cookie》