一、jsp的基础
1.1 jsp的引入
Servlet的作用: 用java语言开发动态资源的技术!!!
Jsp的作用:用java语言(+html语言)开发动态资源的技术!!!
1.Jsp就是servlet!!!
2.JSP本身就是简化的Servlet的设计。它是由sun公司倡导,许多
公司参与一起建立的一种动态页面技术标准。
3.由于html只能写静态资源,而Servlet可以写动态资源,但是与
浏览器客户端交互太过复杂。所以引入了JSP。既可以写JAVA代码
,也可以写Html。
1.2 jsp的特点
1)jsp的运行必须交给tomcat服务器!!!!
tomcat的work目录: tomcat服务器存放jsp运行时的临时文件
2)jsp页面既可以写 html 代码,也可以写java代码。
(html页面不能写java代码 。而jsp页面可以写java代码)
1.3 jsp的执行过程
tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法
tomcat的work目录下存放jsp运行时的临时文件!!
4.4 Jsp的执行过程
问题: 访问http://localhost:8080/day12/01.hello.jsp 如何显示效果?
1)访问到01.hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
(01.hello.jsp -> _01_hello_jsp.java) (翻译)
2)tomcat服务器把java源文件编译成class字节码文件 (编译)
(_01_hello_jsp.java -> _01_hello_jsp.class)
3)tomcat服务器构造_01_hello_jsp类对象
4)tomcat服务器调用_01_hello_jsp类里面方法,返回内容显示到浏览器。
第一次访问jsp:
走(1)(2)(3)(4)
第n次访问jsp:
走(4)
注意:
1)第一次访问jsp要走翻译和编译的过程,第二次访问jsp,直接调用方法。
2)jsp文件修改了或jsp的临时文件被删除了,要重新走翻译(1)和编译(2)的过程
1.4 jsp的实质
## jsp翻译的java文件:
public final class _01_hello_jsp
extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
....
}
HttpJspBase类:
public abstract class org.apache.jasper.runtime.HttpJspBase
extends javax.servlet.http.HttpServlet
implements javax.servlet.jsp.HttpJspPage {
...
}
结论:
1.jsp翻译成java文件。jsp类继承HttpJspBase类,而HttpJspBase类又继承
了HttpServlet类。所以jsp就是Servlet.
2.servlet的技术可以用在jsp程序中
3.jsp的技术并不是全部适用于servlet程序!
(Servlet是原理基础,jsp在Servlet基础上扩展了一些技术。所以Servlet可以说是jsp的子集)
1.5 jsp的生命周期
jsp就是servlet。
servlet生命周期
1.构造方法(第一次访问)
2.有参的init方法(第一次访问)
3.service方法
4.destory方法
Jsp的生命周期
1)翻译: jsp->java文件
2)编译: java文件->class文件(servlet程序)
3)构造方法(第1次访问)
4)init方法(第1次访问):_jspInit()
5)service方法:_jspService()
6)destroy方法:_jspDestroy()
Jsp的生命周期详解
1.用户第一访问jsp,tomcat首先会把jsp翻译成java文件。
2.将java文件编译成字节码文件
3.调用构造方法创建jsp对象。
4.调用_jspInit方法,初始化jsp对象、
5.调用_jspService方法。
二、jsp的语法
1)jsp表达式:<%=变量或表达式%> 向浏览器输出变量或表达式计算的结果
2)jsp脚本: <% java代码 %> 执行java代码 原理:翻译到_jspService()方法中
3)jsp声明: <%! 变量或方法 %> 声明jsp的成员变量或成员方法
4)jsp注释: <%!-- jsp注释 --%> 用于注释jsp代码,不会翻译到java文件中,也不会执行。
2.1 jsp的模板
jsp页面中的html代码就是jsp的模板
2.2 jsp的表达式
jsp的表达式
语法:<%=变量或表达式%>
作用: 向浏览器输出变量的值或表达式计算的结果
注意:
1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
2)表达式后面不需要带分号结束。
原理:
jsp表达式会被服务器翻译成 out.write(表达式)。
如 <%=a+b> 会被翻译成 out.write(a+b)
<%=name> 会被翻译成 out.write(name)
jsp的表达式的原理
jsp的部分代码:
<body>
<%
String name="12";
int i=12;
int b=12;
%>
<%=name %>
<%=i+b %>
</body>
上述jsp代码会被翻译成一下代码:
public void _jspService(final javax.servlet.http.HttpServletRequest request, final
javax.servlet.http.HttpServletResponse response)
{
try {
response.setContentType("text/html; charset=ISO-8859-1");
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("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd
\">\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">\r\n");
out.write("<title>Insert title here</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("\r\n");
String name="12";
int i=12;
int b=12;
out.write("\r\n");
out.write("\r\n");
out.print(i+b );
out.write("\r\n");
out.write("</body>\r\n");
out.write("</html>");
} 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);
}
}
例子:
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String name="12";
int i=12;
int b=12;
%>
<%=name %>
<%=i+b %>
</body>
</html>
2.3 jsp的脚本
语法:<%java代码 %>
作用: 执行java代码
原理:
1)脚本中java代码会被原封不动拷贝到_jspService方法中执行。
例子:
打印九九乘法表
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
String str="";
for(int i=1;i<10;i++){
for(int j=1;j<=i;j++){
%>
<%=i%>*<%=j%>=<%=i*j %>
<%
}
%>
<br/>
<%
}
%>
</body>
</html>
2.4 jsp的声明
语法:<%! 变量或方法 %>
作用: 声明jsp的变量或方法
注意:
1)变量翻译成成员变量,
方法翻译成成员方法。
例子:
扫描二维码关注公众号,回复:
9248967 查看本文章
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%! int a=12 ;%>
<%!
public void read(){
System.out.println("fuck");
}
%>
</body>
翻译后的部分java文件
public final class NewFile_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
int a=12 ;
public void read(){
System.out.println("fuck");
}
private static final javax.servlet.jsp.JspFactory _jspxFactory =
javax.servlet.jsp.JspFactory.getDefaultFactory();
...
2.5 jsp的注释
语法: <%!-- jsp注释 --%>
注意;
1)html的注释会被翻译和执行。而jsp的注释不能被翻译和执行。
三、jsp的三大指令
3.1 include指令(静态包含)
语法: <%@include file="common/header.jsp"%>
作用: 在当前页面用于包含其他页面
注意:
1)静态包含:被包含页面的内容加入到包含的页面中,合并翻
译成一个java源文件,然后编译执行。
原理是把被包含的页面(header.jsp)的内容翻译到包含
页面(index.jsp)中,合并成翻译成一个java源文件,再编
译运行!!这种包含叫静态包含(源码包含)
2)如果使用静态包含,被包含页面中不需要出现全局的html标签了!!!(如html、head、body)
例子:
NewFile.jsp包含了top.jsp
NewFile.jsp
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
test
<%@include file="top.jsp"%>
</body>
</html>
top.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<h1>top</h1>
<hr/>
</body>
</html>
3.2 page指令
<%@ page
language="java" --告诉服务器使用什么动态语言来翻译jsp文件
import="java.util.*" --告诉服务器java文件使用什么包
导入包,多个包之间用逗号分割
pageEncoding="utf-8" --告诉服务器使用什么编码表翻译jsp文件(翻译成java文件使用什么码表)
contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
errorPage="error.jsp"
isErrorPage="false"
buffer="8kb" 手动指定缓冲区大小
session="true"
isELIgnored="false"
%>
常用:
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
3.2.1 jsp的乱码问题解决方式
<%@ page language="java"
contentType="text/html; charset=utf-8"
pageEncoding="utf-8" %>
解析:
1.jsp保存到硬盘时,按照默认编辑器默认编码表进行编码。
2.jsp翻译成java文件,按照 pageEncoding="utf-8"指定的码表进行编码。
3.java文件编译成class字节码文件。
4.浏览器获取jsp资源文件,按照contentType="text/html; charset=utf-8"指定的码表解析资源。
注意:
1.contentType="text/html; charset=utf-8" 属性可以省略不写。会直接参考pageEncoding="utf-8" 的值。
可以只设置pageEncoding="utf-8"属性,不设置contentType="text/html; charset=utf-8" 属性。
原因:如果设置了pageEncoding="utf-8"属性,jsp在翻译java文件时,会自动设置 contentType="text/html; charset=utf-8" 属性。
2.在eclipse中,直接修改jsp中pageEncoding="utf-8"的值,保存jsp。此时会按照pageEncoding="utf-8"指定的码表进行保存jsp。
3.pageEncoding="utf-8"
可以指定保存jsp文件的编码表(在eclispe工具中)
可以指定浏览器解析jsp资源时使用的码表。
设置jsp编码
====》<%@ page language="java"
pageEncoding="utf-8" %>
3.2.2 设置错误页面
由于jsp中可以写java程序,所以有可能出现异常。如果任由jsp爆出异常,则界面不太友好。所以才有了异常页面设置。jsp的错误页面跳转有两种方式,一种是局部设置,另一种是全局设置。
方式一:局部设置
errorPage: 指定当前jsp页面的错误处理页面。
isErorrPage: 指定当前页面是否为错误处理页面。
false,不是错误处理页面,则不能使用 exception内置对象;
true,是错误处理页面,可以使用exception内置对象。
例子:
NewFile.jsp:
设置jsp发生异常跳转到的错误页面:
<%@ page language="java" errorPage="error.jsp"%>
<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
errorPage="error.jsp"
%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%
Integer name=12;
out.print(name/0);
%>
</body>
</html>
error.jsp
设置错误页面
<%@ page language="java"
pageEncoding="utf-8"
isErrorPage="true"
%>
isErrorPage="true",可以使用内置对象exception对象
isErrorPage="false",不可以使用内置对象exception对象
<%@ page language="java"
pageEncoding="utf-8"
isErrorPage="true"
%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
错误处理页面
<%=exception.getMessage() %>
</body>
</html>
访问NewFile.jsp,发生异常,就会自动跳转到error.jsp页面。
方式二:全局设置
在web.xml设置jsp异常跳转页面
<!-- 全局错误处理页面配置 -->
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>
3.3 taglib指令
引入标签
<%@taglib uri="标签库声明文件tld文件的标记" prefix="前缀"%>
prefix:标签的标识
uri:标签资源
四、jsp的动作
JSP的动作有很多,其中两个最常见,分别是forward和include
1、forward
跳转页面
<jsp:forward page="/index.jsp"></jsp:forward>
2、include
包含页面
<jsp:include page="./index2.jsp"></jsp:include>
指令include和动作include的区别?
jsp指令: <%@include file="common/header.jsp"%>
jsp动作:<jsp:include page="./index2.jsp"></jsp:include>
1、静态包含和动态包含
指令inludce又叫静态包含,动作include又叫动态包含。
2、二者区别
第一点:动态包含生成两个Java文件,静态包含生成一个Java文件。
第二点:动态包含先运行再包含,静态包含是先包含再运行。
第三点:动态包含总会检查被包含文件是否发生修改,能保证每次都是最新的。
静态包含不会检查被包含文件是否发生修改,不能保证每次都是最新的。
3、优缺点
动态包含优点是能保证页面最新,缺点是占用资源大。经常用于包含动态页面。
静态包含优点资源小,不一定能保证页面最新。经常适用于静态页面。
五、动态web项目的WEB-INF目录
|--Web项目的根目录
|------index.jsp
|------NewFile.jsp
|------WEB-INF (安全目录)
|---------classes目录(字节码)
|---------lib(jar包)
|---------web.xml
WEB-INF目录是项目的安全目录,浏览器不能直接访问该目录下的资源。
1.如果访问Servlet,只能通过web.xml配置的资源进行访问。
2.如果是访问 WebRoot\index.jsp, 则浏览器可以直接访问。
3.如果是访问WebRoot\WEB-INF\index.jap,则浏览器不能直接访问。
如果想访问该资源,则只能通过Servlet转发,进行访问。
总结
Jsp基础
1)Jsp的执行过程
tomcat服务器完成:jsp文件->翻译成java文件->编译成class字节码文件-> 构造类对象-> 调用方法
tomcat的work目录下存放jsp运行时的临时文件!!
2)Jsp语法:
1)jsp表达式:<%=变量或表达式%> 向浏览器输出变量或表达式计算的结果
2)jsp脚本: <% java代码 %> 执行java代码 原理:翻译到_jspService()方法中
3)jsp声明: <%! 变量或方法 %> 声明jsp的成员变量或成员方法
4)jsp注释: <%!-- jsp注释 --%> 用于注释jsp代码,不会翻译到java文件中,也不会执行。
3)jsp的三大指令
3.1 include指令:用于包含其他页面。原理:先合并再翻译,叫静态包含
3.2 page指令:告诉tomcat服务器如何把jsp文件翻译成java文件
language: 翻译的动态语言。
import: 类导入
jsp文件编码问题:
pageEncoding: 告诉tomcat服务器使用什么编码翻译jsp文件(jsp->java文件)
contentType: tomcat服务器发送给浏览器的数据编码(tomcat服务器->浏览器)
异常错误相关的:
errorPage: 指定当前jsp页面的错误处理页面。
isErorrPage: 指定当前页面是否为错误处理页面。false,不是错误处理页面,则不能使用 exception内置对象;true,是错误处理页面,可以使用exception内置对象。
配置全局的错误处理页面:
<!-- 全局错误处理页面配置 -->
<error-page>
<error-code>500</error-code>
<location>/common/500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/common/404.html</location>
</error-page>
session: 是否开启session功能。false,不能用session内置对象;true,可以使用session内 置对象。
buffer: jsp页面的缓存区大小。
isELIgnore: 是否忽略EL表达式。