1、JSP简介
Servlet的缺点
- 生成网页的时候,开发不方便
- 不利于页面的调试和维护
- 无法使用开发工具对页面代码进行调试
JSP : Java Server Page
- Sun公司参考ASP推出的开发语言
- 和Servlet一样,都是动态网页开发技术
- JSP在运行时,必须翻译成Servlet,然后才能运行
-
JSP页面的书写基本和HTML页面的书写一样
-
可以在其中通过<%%>嵌入Java代码
Servlet : 嵌入HTML的Java文件
JSP : 嵌入Java的HTML文件
2、JSP运行原理
-
JSP翻译成Servlet时有固定的包名: org.apache.jsp
-
JSP翻译成Servlet时生成的文件名固定的格式 : 文件名_jsp.java, 例如hello.jsp生成的Servlet名字是hello_jsp.java
-
什么时候使用JSP什么时候使用Servlet
-
Java代码多时使用Servlet
-
HTML代码多时使用JSP
-
-
JSP效率会很低吗?
-
只有第一次访问JSP时会被翻译,以后访问如果没有更改过JSP的代码,是不会被再次翻译的
-
3、JSP的脚本
声明
- 代码 : <%! %>
- 作用 : 声明的内容会被翻译成Servlet的成员变量, 成员方法和内部类
- 翻译规则 : 原样翻译到Servlet文件顶部,成为成员变量,成员方法和内部类
- 示例代码 :
<%! // 声明一个成员变量 int i = 0; // 声明一个内部类 class InnerClass { } // 声明一个成员方法 public void innerMethod() { } %>
输出表达式
- 代码 : <%= %>
- 作用 : 用于向页面输出内容,等价于out.print(). 不能在内容后面添加";"分号
- 翻译规则 : 内容会被翻译到_jspService方法中,通过out.print()方法输出到页面
示例代码 :
<!-- 正确写法 -->
<%="hello" %>
<!-- 错误写法 -->
<%="hello"; %>
代码块
- 代码 : <% %>
- 作用 : 在其中书写任意Java代码.代码块可以和html嵌套使用
- 翻译规则 : 原样翻译到Servlet文件的_jspService方法中
- 示例代码 :
<!-- 用Java代码完成for循环 -->
<%
for (int i = 0; i < 10; i++) {
out.print("<h1>hello</h1>");
}
%>
<!-- Java代码和HTML标签嵌套使用完成for循环 -->
<%
for (int i = 0; i < 10; i++) {
%>
<h1>hello</h1>
<%
}
%>
4、JSP的注释
语法格式 | JSP源文件中是否存在 | Servlet源文件中是否存在 | HTML源文件中是否存在 |
JSP注释 <%-- --%> | 是 | 否 | 否 |
Java注释 文档注释 : /** */ 多行注释 : /* */ 单行注释 : // | 是 | 是 | 否 |
HTML注释 <!-- --> | 是 | 是 | 是 |
5、JSP的指令
作用 : 声明当前页面的一些属性和行为的
格式 : <%@指令名称 属性=值 属性=值%>
注意 : 指令可以出现多次.指令的位置随意,一般放在jsp最上面
分类 :
-
page : 声明当前页面的一些属性和行为
-
include : 包含(静态包含)
-
taglib : 导入标签库
page指令的属性:
import : 完成 JSP翻译后 Servlet 导包
-
jsp在翻译为Servlet 默认导入以下四个包
import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.jsp.*; jre默认导入 java.lang
在jsp中如果使用的类不属于以上四个包,需要导包
pageEncoding : JSP文件源代码在硬盘上的编码集
contentType : 在Servlet生成HTML传递给浏览器时采用的编码</font>
pageEncoding 和 contentType 的关系
-
两个属性如果都指定了,就各自使用各自的值
-
两个属性如果都不指定,就是用ISO-8859-1
-
如果只指定一个,两个属性都使用指定的这个值
language : 只能为java
extends : JSP翻译后Servlet后要继承的父类,这个属性一般不设置,如果非要设置,继承类必须是Servlet的实现类
session : 定义JSP中是否可以直接使用Session隐含对象
-
如果属性设置为true在JSP翻译Servlet时生成以下两句代码:
HttpSession session = null; session = pageContext.getSession();
-
如果jsp中想使用HttpSession对象,session属性默认值必须为true
buffer : 设置缓冲区大小
autoFlush : 设置当缓冲区满后,是否自动刷出
isELIgnored : 设置JSP是否执行EL表达式
-
isELIgnored="false" 不忽略---执行解析
-
isELIgnored="true" 忽略 ---- 不解析
-
一般就是默认值false
errorPage : 当前页面发生错误时转发到哪个页面
-
IE 浏览器有一个默认的错误友好页面 ,如果想看到自己编写的友好页面,必须关闭IE默认友好页面 : IE 工具栏 --- Internet选项 ----- 高级 -----显示友好HTTP错误信息,将勾去掉
isErrorPage : 设置该属性后,可以使用exception内置对象,获取错误相关信息
include指令
-
用于静态包含页面.可以将页面公共部分提取出来,通过include完成页面布局
-
语法:<%@ include file="文件路径" %>
-
include指令会将整个目标页面包含进来.所以被包含页面,不需要是一个完整HTML,只要编写HTML片段就可以了
-
如果被包含页面存在错误,只要包含后的Servlet没有错误,就可以执行
6、JSP的九大内置对象
内置对象 | 类型 | 作用 |
request | HttpServletRequest | 请求对象 |
response | HttpServletResponse | 响应对象 |
session | HttpSession | 会话对象 |
application | ServletContext | web应用全局唯一对象 |
config | ServletConfig | 初始化数据 |
page | Object | 当前JSP |
pageContext | PageContext | 当前JSP的上下文 |
exception | Throwable | 当页面是一个错误页面,用exception获得异常信息 |
out | JspWriter | 向输出流输出内容 |
7、JSP的四个域对象
数据域 | 作用范围 | 操作数据时使用的对象 |
page | 当前页面 | pageContext |
request | 当前请求 | request |
session | 当前会话 | session |
application | HttpSession | application |
8、pageContex对象简介
代表当前页面上下文
作用
-
操作其他三个域对象中的数据
-
API : pageContex.xxxAttribute(String name, Object value, int scope)
-
-
可以获得其它八个隐含对象
-
例如pageContext.getRequest()可以获取内置的Request对象.
-
-
快速获取四个数据域中的数据
-
findAttribute方法会依次在page 、request 、session 、 application 四个数据范围进行数据查找.如果找到了就不会往下查找
-
如果在EL表达式中直接使用 ${name}会调用findAttribute方法在四个范围中依次查找数据
-
9、JSP_动作标签
JSP指令和JSP标签区分?
- JSP 指令 Directive
- JSP 标签 Action
JSP中六个动作标签
-
<jsp:useBean>
-
<jsp:setProperty>
-
<jsp:getProperty>
-
<jsp:include>
-
<jsp:forward>
-
<jsp:param >
-
<jsp:include> 等价于 request.getRequestDispatcher().include
-
<jsp:forward> 等价于 request.getRequestDispatcher().forward
-
<jsp:include>标签
-
功能上等价于<%@ include %>
-
语法:<jsp:include page="文件路径" />
-
被包含页面不需要完整html,只需要编写html片段
-
jsp:include和@include的区别
-
@include是JSP指令,属于静态包含.在jsp翻译为Servlet时完成包含动作,包含的内容是目标页面翻译为Servlet时的源代码,最终只会生成一个Servlet
-
jsp:include是JSP标签,属于动态包含.在servlet执行时完成包含动作,包含的内容是目标jsp翻译为Servlet生成的HTML页面,每个被包含的JSP都会生成一个单独的Servlet,所以最终会生成多个Servlet
-
-
-
<jsp:forward >标签
-
功能上等价于 request.getRequestDispatcher("").forward(request,response);
-