JSP简介
JSP本质是一个servlet,它是简化Servlet编写的一种技术,它将Java代码和HTML语句混合在同一个文件中编写,只对网页中要动态产生的内容采用Java代码来编写,而对固定不变的静态内容采用普通静态HTML页面的方式编写。
运行原理和九大隐式对象
jsp运行主要是由tomcat服务器完成(tomcat的work目录下存放jsp运行时的临时文件)。
(1)每个JSP在第一次被访问时,JSP引擎将它翻译成一个_jspServlet(实质上也是一个servlet);
(2)接着再把servlet源程序翻译成servlet的class类文件;
(3)然后由web容器(Servlet引擎)像调用普通Servlet一样来装载和解释执行这个由JSP页面翻译成的Servlet程序。
注意:
- 由于JSP第一次访问时会翻译成servlet,所以第一次访问通常会比较慢,但第二次访问,JSP引擎如果发现JSP没有变化,就不再翻译,而是直接调用,所以程序的执行效率不会受到影响。
- JSP引擎在调用JSP对应的_jspServlet时,会传递或创建9个与web开发相关的对象供_jspServlet使用。JSP技术的设计者为便于开发人员在编写JSP页面时获得
这些web对象的引用,特意定义了9个相应的变量,开发人员在JSP页面中通过这些变量就可以快速获得这9大对象的引用。
九大隐式对象及其对应关系:
request —> HttpServletRequest
response —> HttpServletResponse
session —> HttpSession
application —> servletContext
config —> servletConfig
out JspWriter —–> PrintWriter
exception
page this
pageContext
简单示例
工程目录:
JSP代码:
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>这是我的第一个JSP页面</title>
</head>
<body>
<%
/*
* 对网页中要动态产生的内容采用Java代码来编写
*/
//获取当前时间
SimpleDateFormat sdf = new SimpleDateFormat();
String currDate = sdf.format(new Date());
//输出内容到浏览器
out.write("当前的时间为:" + currDate);
%>
</body>
</html>
打开浏览器输入URL(http://localhost:8080/JSPstudy/hello.jsp)后,浏览器动态地显示当前时间:
JSP语法
jsp脚本
1)jsp脚本表达式:<%=变量或表达式%> 向浏览器输出变量或表达式计算的结果
2)jsp脚本: <% java代码 %> 执行java代码
3)jsp声明: <%! 变量或方法 %> 声明jsp的成员变量或成员方法
4)jsp注释: <%!– jsp注释 –%> 用于注释jsp代码,不会翻译到java文件中,也不会执行。
jsp指令
1)include指令:
include指令用于引入其它JSP页面,如果使用include指令引入了其它JSP页面,那么JSP引擎将把这两个JSP翻译成一个servlet。所以include指令引入通常也称之为静态引入。
语法:
<%@ include file=”relativeURL”%>
其中的file属性用于指定被引入文件的相对路径。
file属性的设置值必须使用相对路径,如果以“/”开头,表示相对于当前WEB应用程序的根目录(注意不是站点根目录),否则,表示相对于当前文件。
细节:
1. 被引入的文件必须遵循JSP语法。
2. 被引入的文件可以使用任意的扩展名,即使其扩展名是html,JSP引擎也会按照处理jsp页面的方式处理它里面的内容,为了见明知意,JSP规范建议使用.jspf(JSP fragments)作为静态引入文件的扩展名。
3. 由于使用include指令将会涉及到2个JSP页面,并会把2个JSP翻译成一个servlet,所以这2个JSP页面的指令不能冲突(除了pageEncoding和导包除外)。
2) page指令:
告诉tomcat服务器如何把jsp文件翻译成java文件
language: 翻译的动态语言。
import: 类导入
<%@ page
[ language="java" ]
[ extends="package.class" ]
[ import="{package.class | package.*}, ..." ]
[ session="true | false" ]
[ buffer="none | 8kb | sizekb" ]
[ autoFlush="true | false" ]
[ isThreadSafe="true | false" ]
[ info="text" ]
[ errorPage="relative_url" ] 当出现错误时会跳到指定的errorPage
[ isErrorPage="true | false" ]
[ contentType="mimeType [ ;charset=characterSet ]" | "text/html ; charset=ISO-8859-1" ]
[ pageEncoding="characterSet | ISO-8859-1" ]
[ isELIgnored="true | false" ]
%>