一、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运行时的临时文件!!
问题: 访问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就是servlet。
1.jsp翻译成java文件。jsp类继承HttpJspBase类,而HttpJspBase类又继承
了HttpServlet类。所以jsp就是Servlet.
2.servlet的技术可以用在jsp程序中
3.jsp的技术并不是全部适用于servlet程序!
(Servlet是原理基础,jsp在Servlet基础上扩展了一些技术。所以Servlet可以说是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.5 jsp的生命周期
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方法。
1.6 jsp和servlet的区别
>>>>>> jsp和servlet的区别和联系
1.jsp经编译后就变成了Servlet. (JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)
2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.
3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.
4.jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。
>>>>>> 不同之处在哪?
Servlet在Java代码中通过HttpServletResponse对象动态输出HTML内容
JSP在静态HTML内容中嵌入Java代码,Java代码被动态执行后生成HTML内容
>>>>>> 各自的特点
Servlet能够很好地组织业务逻辑代码,但是在Java源文件中通过字符串拼接的方式生成动态HTML内容会导致代码维护困难、可读性差
JSP虽然规避了Servlet在生成HTML内容方面的劣势,但是在HTML中混入大量、复杂的业务逻辑同样也是不可取的
二、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的表达式
2.2.1 jsp的表达式
语法:<%=变量或表达式%>
作用: 向浏览器输出变量的值或表达式计算的结果
注意:
1)表达式的原理就是翻译成out.print(“变量” );通过该方法向浏览器写出内容
2)表达式后面不需要带分号结束。
原理:
jsp表达式会被服务器翻译成 out.write(表达式)。
如 <%=a+b> 会被翻译成 out.write(a+b)
<%=name> 会被翻译成 out.write(name)
2.2.2 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)变量翻译成成员变量,
方法翻译成成员方法。
例子:
<!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的三大指令
指令类型 | 说明 |
---|---|
page | 设置当前jsp文件的一些属性 |
include | 指定包含页面的方式(静态包含和动态包含详解) |
taglib | 用于定义和访问自定义标签 |
3.1 include指令(静态包含)
语法: <%@include file="common/header.jsp"%>
作用: JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML
文件或文本文件。包含的文件就好像是该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" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ page
language="java" --告诉服务器使用什么动态语言来翻译jsp文件
import="java.util.*, java.net.*" --告诉服务器java文件使用什么包
导入包,多个包之间用逗号分割
pageEncoding="utf-8" --告诉服务器使用什么编码表翻译jsp文件(翻译成java文件使用什么码表)
contentType="text/html; charset=utf-8" 服务器发送浏览器的数据类型和内容编码
注意:在开发工具中,以后只需要设置pageEncoding即可解决中文乱码问题
errorPage="error.jsp"
isErrorPage="false"
buffer="8kb" 手动指定缓冲区大小
session="true"
isELIgnored="false"
%>
pageEncoding:指定当前页面的编码
如果pageEncoding没有指定,那么默认为contentType的值;
如果pageEncoding和contentType都没有指定,那么默认值为iso-8859-1
contentType:等同与调用response.setContentType(“text/html;charset=xxx”);
如果没有指定contentType属性,那么默认为pageEncoding的值;
如果contentType和pageEncoding都没有指定,那么默认值为iso-8859-1
errorPage:如果当前页面出现异常,那么跳转到errorPage指定的jsp页面。
例如:<%@ page errorPage=”b.jsp” %>
isErrorPage:上面示例中指定b.jsp为错误页面,但在b.jsp中不能使用内置对象
exception,保有b.jsp中使用<%@page isErrorPage=”true”%>时,才能在b.jsp中使用错误页面。
autoFlush:当autoFlush为true时,表示out流缓冲区满时会自动刷新。默认为true
buffer:指定out流的缓冲区大小,默认为8KB
isELIgnored:当前JSP页面是否忽略EL表达式,默认为false,表示不忽略,即支持EL表达式
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="前缀"%>
taglib指令是用来在当前jsp页面中导入第三方的标签库
prefix:标签的标识
uri:标签资源
注意:需要先把第三方标签库所需jar包放到类路径中
四、jsp的七大动作
标签名 | 说明 |
---|---|
jsp:forward | 执行页面的转向,将请求处理转发到下一个页面 |
jsp:param | 传递参数, 到达跳转页面可以通过 request.getParameter(“参数名”)方式取出参数值 |
jsp:include | 包含动态页面 |
jsp:useBean | Jsp中使用JavaBean的一种方式,作用域默认为page |
jsp:setProperty | 为对象设置属性值 |
jsp:getProperty | 获取对象的属性值 |
jsp:plugin | 在jsp中引入插件 |
4.1 常用动作
JSP的动作有很多,其中两个最常见,分别是forward和include
1、forward
跳转页面
<jsp:forward page="/index.jsp"></jsp:forward>
2、include
包含页面
<jsp:include page="./index2.jsp"></jsp:include>
传参
<jsp:include page=“a.jsp”>
<jsp:param name=“” value=“”>
<jsp:param name=“” value=“”>
</ jsp:include >
4.2 静态包含和动态包含的区别
jsp指令: <%@include file="common/header.jsp"%>
jsp动作:<jsp:include page="./index2.jsp"></jsp:include>
指令inludce又叫静态包含,动作include又叫动态包含。
1、二者区别
第一点:生成的文件不同。
静态的包含是将两个jsp文件二合一,生成一个以包含页面命名的servlet和class文件
动态包含的两个jsp文件各自生成自己的servlet和class文件。
第二点:动态包含先运行再包含,静态包含是先包含再运行。
第三点:动态包含总会检查被包含文件是否发生修改,能保证每次都是最新的。
静态包含不会检查被包含文件是否发生修改,不能保证每次都是最新的。
2、优缺点
动态包含优点是能保证页面最新,缺点是占用资源大。经常用于包含动态页面。
静态包含优点资源小,不一定能保证页面最新。经常适用于静态页面。
五、动态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表达式。