一、JSP 是什么?
Java Server Page: Java 服务器端页面。 在 HTML页面 中编写 Java 代码。
JSP 是简化 Servlet 编写的一种技术,它将 Java 代码和 HTML 语句混合在同一个文件中编写,
Java 代码:网页中的要动态产生的内容,
HTML 语句: 固定不变的静态内容。
JSP 页面是由 HTML 语句和嵌套在其中的 Java 代码组成的一个普通文本文件,JSP 页面的文件扩展名必须为.jsp。
在 JSP 页面中编写的 Java 代码需要嵌套在 <% %> 中,
脚本片段(Scriptlets):嵌套在 <% %> 之间的 Java 代码,
模版元素: 没有嵌套在 <% %> 之间的内容 。
JSP 中的 Java 代码
结果字符串输出给客户端: out.println,
打印到命令行窗口: System.out.println。
JSP 文件就像普通的 HTML 文件一样,它们可以放置在
WEB 应用程序中的除了 WEB-INF 及其子目录外的其他任何目录中,
JSP 表达式,只需将要输出的变量或表达式直接封装在 <%= %> 之中,就可以向客户端输出这个变量或表达式的运算结果。
在 JSP 表达式中嵌套的变量或表达式后面不能有分号。
二、JSP 的运行原理
WEB 容器(Servlet引擎)接收到以 .jsp 为扩展名的 URL 的访问请求时,它将把该访问请求交给 JSP 引擎去处理。
每个 JSP 页面在第一次被访问时, JSP 引擎将它翻译成一个 Servlet 源程序,接着再把这个 Servlet 源程序编译成 Servlet 的 class 类文件,
然后再由 WEB 容器 (Servlet引擎) 像调用普通 Servlet 程序一样的方式来装载和解释执行这个由 JSP 页面翻译成的 Servlet 程序。
JSP 规范也没有明确要求 JSP 中的脚本程序代码必须采用 Java 语言, JSP 中的脚本程序代码可以采用 Java 语言之外的其他脚本语言来编写,
但是,JSP 页面最终必须转换成 Java Servlet 程序。
可以在 WEB 应用程序正式发布之前,将其中的所有 JSP 页面预先编译成 Servlet 程序。
想找到 JSP 生成的字节码文件还是 Java 文件,这得看你加载 Web 应用是自己配置的 Tomcat 还是加载到 Eclipse 默认路径下:
先说 Eclipse 默认路径下的吧,其路径为:
你的 eclipse 存放工程的文件夹 \.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\要找的JSP页面对应工程名\org\apache\jsp
如果是加载的 Web 应用就在 Tomcat 下,其路径为:
磁盘: \apache-tomcat-7.0.56\work\Catalina\localhost\ 要找的 JSP 页面对应工程名 \org\apache\jsp
更改 JSP 默认编码格式: Window--> Preferences --> JSP--> UTF-8
三、JSP 隐含对象
public void _jspService(final HttpServletRequest request, final HttpServletResponse response) {
final javax.servlet.jsp.PageContext pageContext;
javax.servlet.http.HttpSession session = null;
final javax.servlet.ServletContext application;
final javax.servlet.ServletConfig config;
javax.servlet.jsp.JspWriter out = null;
final java.lang.Object page = this;
javax.servlet.jsp.JspWriter _jspx_out = null;
javax.servlet.jsp.PageContext _jspx_page_context = null;
//...
//使用 <% %> 编写的代码在此位置, 可以用到pageContext, request, session, application (对属性的作用域:小-->大)
//response, config, out, page 这8个隐式对象。
//(实际上还可以使用一个叫 exception 的隐式对象)
* a、pageContext 页面的上下文,是PageContext 的一个对象,可用它拿到其他八个内置对象,
也可以用它获取当前页面的其他信息。
pageContext.getRequest();
* b、request 直接在浏览器 URL 地址后加 ?name=zhanxiage
request.getParameter("name");
* c、session:代表浏览器和服务器的一次会话, 是 HttpSesion 的一个对象。
* d、application: 代表当前 WEB 应用, 是 ServletContext 对象
application.getInitParameter("user");
e、response :HttpServletResponse 的一个对象(在 JSP 页面几乎不会使用response 的任何方法)
response instanceof HttpServletResponse;
f、config: 当前 JSP 对应的 Servlet 的 ServletConfig 对象(几乎不用)。
若需要访问当前 JSP 配置的初始化参数,需要通过映射的地址才可以。
例:
注册与配置JSP页面的访问路径
<servlet>
<servlet-name>NewFile</servlet-name>
<jsp-file>/NewFile.jsp</jsp-file>
<init-param>
<param-name>user</param-name>
<param-value>1230</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>NewFile</servlet-name>
<url-pattern>/NewFile</url-pattern>
</servlet-mapping>
* h、out: JspWriter 对象。 调用out.println() 可以直接把字符串打印到浏览器上。
换行:
<% out.print("adc");out.print("<br>");out.print("辅助"); %>
<% out.print("adc"); %> <br> <% out.print("辅助"); %>
I: page: 指向当前 JSP 对应的 Servlet 对象的引用, 但为 Object 类型,只能调用
Object 方法, 开发几乎不用。
* J: exception:
<%@ page isErrorPage = "true" %>,只有在声明该 JSP 页面是一个错误页面后
才可以使用。
}
四、 JSP 与 Servlet 的应用比较
JSP 是一种以产生网页显示内容为中心的 WEB 开发技术,它可以直接使用模版元素来产生网页文档的内容。
JSP 页面的源文件要比 Servlet 源文件简单,并且 JSP 页面的开发过程要比 Servlet 的开发过程简单得多。
JSP 引擎可以对 JSP 页面的修改进行检测,并自动重新翻译和编译修改过的 JSP 文件。
JSP 技术是建立在 Servlet 技术基础之上的,所有的 JSP 页面最终都要被转换成 Servlet 来运行。
在大型 WEB 应用程序的开发中,Servlet 与 JSP 经常要混合使用,各司其职,
Servlet 通常用作控制组件,并处理一些复杂的后台业务,JSP 则作为显示组件。
一次响应过程可以划分成几个功能模块来协同完成,首先由 Servlet 完成流程控制和业务处理,
并将结果数据存储在 request 或 session 域中,然后将请求转发(forward)到 JSP 页面,
再由 JSP 页面从 request 或 session 域中取出结果数据并完成响应内容的输出。
通过这种方式实现业务逻辑与显示内容的分离,从而将应用程序开发者和网页作者的工作分离。
五、JSP模版元素
JSP 页面中的静态 HTML 内容称之为 JSP 模版元素,在静态的 HTML 内容之中可以嵌套 JSP 的其他各种元素来产生动态内容和执行业务逻辑。
JSP 模版元素定义了网页的基本骨架,即定义了页面的结构和外观。
六、JSP表达式 <%= %>
JSP 表达式(expression)提供了将一个 java 变量或表达式的计算结果输出到客户端的简化方式。
(被翻译成 Servlet 程序中的一条 out.print(…) 语句。)
<%= %> 中的结果将被转换成一个字符串,然后被插入进整个 JSP 页面输出结果的相应位置处。
<%= %> 中的变量或表达式后面不能有分号(;)。
七、JSP脚本片断
JSP 脚本片断(scriptlet)是指嵌套在 <% %> 之中的 Java 程序代码。
可以定义变量、执行基本的程序运算、调用其他 Java 类、访问数据库、访问文件系统等普通 Java 程序所能实现的功能。
可以直接使用 JSP 提供的隐式对象来完成 WEB 应用程序特有的功能。
其中的 Java 代码将被原封不动地搬移进由 JSP 页面所翻译成的 Servlet 的 _jspService 方法中。
所以,JSP 脚本片断之中只能是符合 Java 语法要求的程序代码,必须严格遵循 Java 语法。
JSP 脚本片断可以有多个,其中代码可以相互访问。(每个脚本片断代码嵌套在各自独立的一对 <% %> 之间)。
多个脚本片断组合后的结果必须是完整的 Java 语句。
在两个或多个脚本片断之间可以嵌入文本、HTML标记和其他 JSP 元素。
例:
<%
String ageStr = request.getParameter("age");
Integer age = Integer.parseInt(ageStr);
if(age >= 18){
%>
成人。。。
<%
}else{
%>
未成年人。。。
<%
}
%>
由于脚本片断中的 Java 代码将被原封不动地搬移进由 JSP 页面所翻译成的 Servlet 的 _jspService 方法中,
脚本片断之外的任何文本、 HTML 标记以及其他 JSP 元素也都会被转换成相应的 Java 程序代码插入进 _jspService 方法中,
且脚本片断和其他 JSP 元素的插入位置与它们在 JSP 页面中的原始位置相对应。
在脚本片断中可以使用条件、循环、选择等流程控制语句来创建其周围的其他元素的执行逻辑,
因此,在编写 JSP 页面时应考虑各个元素之间的先后顺序和相互关系,
特别是将循环、条件判断等语句分布在若干个脚本片断中编写时对其邻近的其他 JSP 元素产生的影响。
八、JSP声明 (在 JSP 页面中几乎从不使用)
JSP 声明将 Java 代码封装在 <%! %> 之中,它里面的代码将被插入进 Servlet 的 _jspService 方法的外面,
所以,JSP 声明可用于定义 JSP 页面转换成的 Servlet 程序的静态代码块、成员变量和方法 。
多个静态代码块、变量和函数可以定义在一个 JSP 声明中,也可以分别单独定义在多个 JSP 声明中。
JSP 隐式对象的作用范围仅限于 Servlet 的 _jspService 方法,所以在JSP声明中不能使用这些隐式对象。
例:
<%!
static { System.out.println("loading Servlet!"); }
private int globalVar = 0;
public void jspInit(){
System.out.println("initializing jsp!");
}
%>
<%!
public void jspDestroy(){
System.out.println("destroying jsp!");
}
%>
<%
int localVar = 0;
%>
globalVar:<%= ++globalVar %><br>
localVar:<%= ++localVar %>
九、JSP 注释
<%-- --%>
JSP 引擎在将 JSP 页面翻译成 Servlet 程序时,忽略 JSP 页面中被注释的内容。
例:
<%-- <% out.print("不被执行") %> --%>
<!-- <% out.print("HTML 注释中的 JSP 代码被执行") %> -->
十、如何查找 JSP 页面中的错误
1、JSP 页面中的 JSP 语法格式有问题,导致其不能被翻译成 Servlet 源文件;
2、JSP 页面中的 JSP 语法格式没有问题,但被翻译成的 Servlet 源文件中出现了 Java 语法问题,
导致 JSP 页面翻译成的 Servlet 源文件不能通过编译
JSP 引擎将提示这类错误发生在 JSP 页面中的位置(行和列)以及相关信息。
3、JSP 页面翻译成的 Servlet 程序在运行时出现异常,这与普通 Java 程序的运行时错误完全一样,
Java 虚拟机将提示错误发生在 Servlet 源文件中的位置(行和列)以及相关信息。