JSP全名为Java Server Pages(Java服务器页面),本质上是一个简化的Servlet,它是由Sun公司建立的一种动态网页技术标准。JSP技术是在传统的网页HTML文件中插入Java程序段(Scriptlet)和JSP标记(tag),从而形成JSP文件(.jsp)。
JSP实现了HTML语法中的Java扩展(以 <%, %>形式)。JSP与Servlet一样,是在服务器端执行的。通常返回给客户端一个HTML文本。
JSP文件在执行时,首先由JSP引擎(即服务器,如Tomcat)解析生成.java文件,然后再由JVM执行。所以,JSP文件是由JVM间接执行的,而JVM是跨平台的,因此JSP文件就也可以跨平台执行。
负责页面显示的Java代码直接写在JSP文件中,业务代码则写在Servlet中,实现了不同功能的代码分离
用户访问第一次JSP页面,服务器对JSP页面代码进行一次编译,编译后的文件(.class)文件会在用户下次访问时继续使用,节约CPU资源
JSP的工作模式是请求/响应模式,客户端首先发出HTTP请求,JSP程序收到请求后进行处理并返回结果
1.客户端发出请求,访问JSP文件
2.JSP容器将JSP文件转换为一个Java源文件(Java Servlet源程序)
3.Java源文件被编译执行生成相应字节码文件(.class),Servlet容器执行该字节码文件
index.jsp文件内容:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>跳转到主页title>
head>
<body>
<jsp:forward page="/page_common_index.action">jsp:forward>
body>
html>
经Tomcat转换生成的index_jsp.java文件内容:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
//继承了HttpJspBase类(HttpServlet类的一个子类),所以index_jsp是一个Servlet
public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
private static java.util.Map.lang.String,java.lang.Long> _jspx_dependants;
private volatile javax.el.ExpressionFactory _el_expressionfactory;
private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;
public java.util.Map.lang.String,java.lang.Long> getDependants() {
return _jspx_dependants;
}
public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
if (_el_expressionfactory == null) {
synchronized (this) {
if (_el_expressionfactory == null) {
_el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
}
}
}
return _el_expressionfactory;
}
public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
if (_jsp_instancemanager == null) {
synchronized (this) {
if (_jsp_instancemanager == null) {
_jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
}
}
}
return _jsp_instancemanager;
}
public void _jspInit() {
}
public void _jspDestroy() {
}
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
throws java.io.IOException, javax.servlet.ServletException {
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;
try {
response.setContentType("text/html; charset=UTF-8");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.write("\n");
out.write("\n");
out.write("\n");
out.write("\n");
out.write("\n");
out.write("跳转到主页 \n");
out.write("\n");
out.write("\n");
if (true) {
_jspx_page_context.forward("/page_common_index.action");
return;
}
out.write("\n");
out.write("\n");
out.write("");
} catch (java.lang.Throwable t) {
if (!(t instanceof javax.servlet.jsp.SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
try {
if (response.isCommitted()) {
out.flush();
} else {
out.clearBuffer();
}
} catch (java.io.IOException e) {}
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
else throw new ServletException(t);
}
} finally {
_jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
<% java代码 %>
一段代码段,内部写java的变量,方法,语句用来实现一些复杂操作,JSP Scriptlets中声明的变量是JSP页面的局部变量,调用JSP Scriptlets时,会为局部变量分配内存空间,调用结束后,释放局部变量占有的内存空间。
<%= java变量或表达式 >
用于将程序数据输出到客户端,标签内部的内容实际上是被System.out.println( )输出语句直接输出。如:jsp文件中的<%= a+b >标签在被Tomcat转换后在Java文件中的形式是System.out.println( a+b )
<%! 声明变量(java代码) %>
被声明的Java代码将被编译到JSPServelt的_jspService( )方法之外,即在JSP声明语句中定义的都是成员方法,成员变量,静态方法,静态变量,静态代码块等。在JSP声明语句中声明的方法和变量在整个JSP页面内有效。可以被多次访问。
不同的注释可见范围是不同(即JSP文件执行过程中经过多步编译,每次编译后生成的文件中显示的注释是不同的)
注释类别 | 注释形式 | 可见范围 |
---|---|---|
HTML注释 | < ! - -注释内容 - - > | JSP源码,封装成Servlet的Java文件中,页面显示的HTML源码 |
Java注释 | //单行注释 /多行注释/ | JSP源码,封装成Servlet的Java文件中 |
JSP注释 | <%– 注释内容 –%> | JSP源码 |
JSP的指令是指导JSP翻译和运行的命令,JSP包括三大指令:
属性最多的一个指令,根据不同的属性,设置整个页面的特性,例如,页面的编码方式,JSP页面采用的语言
格式:
<%@ page 属性名1="属性值1" 属性名2="属性值2" ...%>
常用属性如下:
属性 | 属性对应的功能 |
---|---|
language | 指明解释该JSP文件时应采用的语言,默认为Java。JSP脚本中还可以嵌入的多种语言 |
pageEncoding | JSP文件的编码格式 |
contentType | 客户端浏览器根据该属性判断文档类型,HTML文档格式为 text/html,纯文本格式为text/plain |
session | 指明该JSP内是否内置Session对象,如果有,则应设置值为true。默认值是true |
import | 设置导入那些jar包,page指令中唯一可以声明多次的指令属性。 |
errorPage | 指定一个错误页面,如果JSP抛出为捕捉的异常,则转到该指令指向的页面(错误处理页面,isErrorPage属性为true) |
isErrorPage | 指定该页面是否为错误处理页面,如果为true,则该JSP内置有一个Exception类的对象,可以直接使用,默认值为false |
页面包含(静态包含)指令,可以将一个jsp页面包含到另一个jsp页面中
格式:<%@ include file=”被包含的文件地址”%>
注:使用JSP的动作元素< jsp:include >可以进行动态包含,静态包含是在生成java文件前将两个JSP文件合为一个JSP文件,而动态包含则是在最终编译成二进制文件后,将两个二进制文件的内容显示在了一个页面中
在jsp页面中引入标签库(JSTL标签库、struts2标签库)
格式:<%@ taglib uri=”标签库地址” prefix=”前缀”%>