JSP技术
jsp概述
JSP 全名是 Java Server Pages,它是建立在 Servlet 规范之上的动态网页开发技术。在 JSP文件中,HTML 代码与 Java 代码共同存在,其中,HTML代码用来实现网页中静态内容的显示,Java 代码用来实现网页中动态内容的显示。为了与传统 HTML 有所区别,JSP 文件的扩展名为jisp。
JSP 技术所开发的 Web 应用程序是基于 Java 的,它可以用一种简捷而快速的方法从 Java程序生成 Web 页面,其使用上具有如下几点特征。
•跨平台:由于 JSP 是基于 Java i语言的,它可以使用 Java API,所以它也是跨平台的,可以应用于不同的系统中,如 Windows、Linux 等。当从一个平台移植到另一个平台时,JSP和JavaBean 的代码并不需要重新编译,这是因为 Java 的字节码是与平台无关的,这也应验了 Java语言“一次编译,到处运行”的特点。
•业务代码相分离:在使用 JSP 技术开发 Web 应用时,可以将界面的开发与应用程序的开发分离开。开发人员使用 HTML 来设计界面,使用 JSP 标签和脚本来动态生成页面上的内容。在服务器端,JSP 引擎(或容器,本书中指 Tomcat )负责解析 JSP 标签和脚本程序,生成所请求的内容,并将执行结果以 HTML 页面的形式返回到浏览器。
•组件重用:JSP 中可以使用 JavaBean 编写业务组件,也就是使用一个JavaBean 类封装业务处理代码或者作为一个数据存储模型,在 JSP 页面中,甚至在整个项目中,都可以重复使用这个 JavaBean。同时,JavaBean 也可以应用到其他 Java 应用程序中。
•预编译:预编译就是在用户第 1 次通过浏览器访问 JSP 页面时,服务器将对 JSP 页面代码进行编译,并且仅执行一次编译。编译好的代码将被保存,在用户下一次访问时,会直接执行编译好的代码。这样不仅节约了服务器的 CPU 资源,还大大地提升了客户端的访问速度。
jsp运行原理
jsp的运行过程
(1)客户端发出请求,请求访问JSP 文件。
(2 )JSP客器先将 JSP 文件转换成一个 Java 源文件( Java Serylet源程序),在转换过程中。如果发现JSP 文件中存在任何语法错误,则中断转换过程,并向服务端和客户端返回出错信息。
(3)如果转换成功,则JSP 容器将生成的 Java 源文件编译成相应的字节码文件*.class。该class 文件就是一个 Servlet,Servlet 容器会像处理其他 Servlet 一样来处理它。
(4)由 Servlet 容器加载转换后的 Servlet 类(.class 文件)创建一个该 Servlet(JSP 页面的转换结果)实例,并执行 Servlet 的 jisplnit()方法。jspInit()方法在 Servlet 的整个生命周期中只
会执行一次。
(5)执行 jspService()方法来处理客户端的请求。对于每一个请求,JSP 容器都会创建一个新的线程来处理它。如果多个客户端同时请求该 JSP 文件,则 JSP,容器也会创建多个线程,使得每一个客户端请求都对应一个线程。JSP 运行过程中采用的这种多线程的执行方式可以极大地
成的 Servlet 是常驻内存的,所以响应速度非常快。降低对系统资源的需求,提高系统的并发量并缩短响应时间。需要注意的是,由于第(4)步生成的servlet是常驻内存的,所以响应速度非常快。
(6)如果 JSP 文件被修改了,则服务器将根据设置决定是否对该文件重新编译。如果需要重新编译,则使用重新编译后的结果取代内存中常驻的 Servet,并继续上述处理过程。
(7)虽然 JSP 效率很高,但在第 1 次调用的时候往往由于需要转换和编译,所以会产生—些轻微的延迟。此外,由于系统资源不足等原因,JSP 容器可能会以某种不确定的方式将 Servet从内存中移除,发生这种情况时首先会调用 jspDestroy()方法,然后 Serviet 实例会被加入“垃圾收集”处理。
(8)当请求处理完成后,响应对象由 JSP 容器接收,并将 HTML 格式的响应信息发送回客户端。
jsp基本语法
jsp脚本元素
JSP 脚本元素是指嵌套在<%和%>之中的一条或多条 Java 程序代码。通过 JSP 脚本元素可以将 Java 代码嵌入 HTML 页面中,所有可执行的 Java 代码,都可以通过 JSP 脚本来执行。
JSP 脚本元素主要如下 3 种类型。
• JSP Scriptlets
• JSP 声明语句
. jsp 表达式
jsp声明语句
jsp表达式
jsp注释
jsp指令
设置jsp页面中的一些信息,sun公司提供了jsp指令,jsp2.0中定义了page、include等指令,每种指令都定义了各自的属性。
page指令
在jsp页面中,经常需要对页面的某些特性进行描述。例如页面的编码方式,jsp页面采用的语言等,这时可以通过page指令来实现。
include指令
incloud指令只有一个file属性,该属性用来指定插入到jsp页面目标位置的文件与资源。
在实际开发时,有时需要在jsp页面静态包含一个文件,例如html文件,文本文件等。这时可以通过include指令来实现。
jsp隐式对象
隐式对象的概述
在jsp页面中,有一些对象需要频繁使用,如果每次都重新创建这些对象,则会非常麻烦,为了简化web应用程序的开发,jsp2.0规范的提供了九个隐式对象,他们是jsp默认创建的,可以直接在jsp页面中使用。
out对象
在 JSP 页面中,经常需要向客户端发送文本内容,这时,可以使用 out 对象来实现。out对象是 javax.servlet.jisp.JspWriter 类的实例对象,它的作用与ServletResponse.getWriter()方法返
回的 PrintWriter 对象非常相似,都是用来向客户端发送文本形式的实体内容。不同的是,out 对象的类型为 JspWriter,它相当于一种带缓存功能的 PrintWriter。接下来,通过一张图来描述 JSP页面的 out 对象与 Servlet 引擎提供的缓冲区之间的工作关系。
page Context对象
• pageContext.PAGE_SCOPE:表示页面范围
• pageContext.REQUEST_SCOPE:表示请求范围
• pageContext.SESSION_SCOPE:表示会话范围
•pageContext.APPLICATION_SCOPE:表示 Web 应用程序范围
exception对象
在jsp页面中经常需要处理一些异常信息,这时可以通过exception对象来实现。
代码及成果展示
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Date" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
date.jsp页面用来输出当前时间:
<% out.print(new Date().toLocaleString()); %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
用来显示错误信息:
<%=exception.getMessage()%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
int a=1;
int b=2;
%>
<%!
public String dashuju(){
String str="dashuju";
return str;
}
%>
<% out.print(a+b); %>
<br/>
<% response.getWriter().print("dashuju"); %>
<br/>
<% out.print(dashuju()); %>
<br/>
<br/><br/><br/>
<%=a+b %>
<br/>
<%=dashuju() %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" session="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
html内容
<!-- html注释 -->
<%
//java注释
System.out.print("java注释");
new Date();
%>
<%--jsp注释 --%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" errorPage="error.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int a=3;
int b=2;
%>
输出<%=(a/b)%>>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
大数据2005
<% response.getWriter().print("2020080605045+袁雪华"); %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
我是include页面,下面是我包含进来的页面:
<%@ include file="date.jsp"%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
response.getWriter().print("2020080605045袁雪华first line <br/>");
out.print("second line <br/>");
%>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
HttpServletRequest req=(HttpServletRequest) pageContext.getRequest();
//req.setAttribute("yuanxuehua","dashuju");
pageContext.setAttribute("yuanxuehua", "pagecontext", PageContext.PAGE_SCOPE);
pageContext.setAttribute("yuanxuehua", "REQUEST", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("yuanxuehua", "SESSION", PageContext.SESSION_SCOPE);
pageContext.setAttribute("yuanxuehua", "APPLICATION", PageContext.APPLICATION_SCOPE);
%>
<%=pageContext.findAttribute("yuanxuehua")%>
<hr/>
<%=(String) req.getAttribute("yuanxuehua")%>
</body>
</html>