JSP引入
servlet的作用:用于JAVA语言开发动态资源的技术
JSP的作用:用Java语言(+html语言)开发动态资源的技术
jsp就是servlet
JSP的特点
1)JSP的运行必须交给tomcat服务器
tomcat的work目录:tomcat服务器存放JSP运行时的临时文件
2)JSP页面既可以写html代码,也可以写java代码(html页面不可以写java代码)
JSP的执行过程
问题:http://localhost/NotepadDemo2/ListContactServlet/hello.jsp 如何显示效果
1)访问到hello.jsp页面,tomcat扫描到jsp文件,在%tomcat%/work把jsp文件翻译成java源文件
(hello.jsp -> _hello_jsp.java)(翻译)
2)tomcat服务器把java源文件编译成class字节码文件(编译)
(_hello_jsp.java -> _hello_jsp.class)
3)tomcat服务器构造_hello_jsp类对象
4)tomcat服务器调用_hello_jsp类里面方法,返回显示内容到浏览器
第一次访问jsp:执行1 、2 、3 、4
第n次访问jsp:执行 4
注意:
1)jsp文件修改了或者jsp临时文件被删除,就要重新走 1 和 2 的过程
2)
问题:
为什么jsp就是servlet
jsp翻译的java文件:
public final class _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
结论:jsp就是一个servlet程序!!
servlet的技术可以用在jsp程序中
jsp的技术并不是全部适用于servlet程序
servlet的生命周期
1)构造方法
2)init方法
3)service方法
4)destory方法
jsp的生命周期
1)编译:jsp ->java文件
2)翻译:java文件 ->class文件(servlet程序)
3)构造方法(第一次访问)
4)init方法(第一次访问):_jspInit()
5)service方法:_jspService()
6)destory方法:_jspDestory()
JSP语法
1)jsp模板
jsp页面中的html代码就是jsp的模板
2)jsp表达式
语法:<%= 变量或表达式%>
作用:向浏览器输出变量的值或者表达是计算的结果
注意:
1)表达式的原理就是翻译成out.print(“变量”);通过该方法向浏览器写出内容
2)表达式后面不需要带分号结束
3)jsp的脚本
语法:<%java代码 %>
作用:执行java代码
注意:
1)原理把脚本中java代码原封不动的拷贝到jspService方法中执行
脚本中不能声明方法
4)jsp的声明
语法:<%! 变量或方法 %>
作用:声明jsp的变量或方法
注意:
变量翻译成成员变量,方法翻译成成员方法
jsp声明中不能重复定义翻译好的一些方法
5)jsp的注释
语法:<%-- jsp注释--%>
和html注释的区别: html注释会执行但是jsp注释不会被执行( html注释不会注释掉jsp标签)
JSP指令有page指令、include指令和taglib指令。
一 、page指令:
作用:
告诉tomcat服务器如何
<%@ page
[language="java"]--告诉服务器是用什么动态语言来翻译jsp文件
[extends="package.class"]
[import="{package.class|package.*}、. . ."]--告诉服务器java文件使用什么导入包,多个包之间用逗号分隔
[session="true|false"] --表示是否开启session的功能
false,不能用session内置对象;true可以使用session内置对象
[buffer="none|8kb|seizekb"] -- jsp页面的缓冲区大小
[autoFlush="true|false"][isThreadSafe="true|false"]
[info="text"]
[errorPage="relativeURL"] --指定当前jsp页面的错误处理页面
[isErrorPage="true|false"] --指定当前页面为错误处理页面
exception内置对象:true,是错误处理页面,可以使用exception内置对象
<!--全局错误处理页面配置--> <error-page> <error-code>500</error-code> <location>/500.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page>
[contentType="mimeType[;charset=characterSet]"|"text/html;charset=IOS-8859-1"] --服务器发送浏览器的数据类型和内容编码
[pageEncoding="charACTERsET|IOS-8859-1"] --告诉服务器使用什么编码翻译jsp文件(称Java文件)
[isELlgnored="true|false"] --是否忽略EL表达式
%>
最简单的page指令
<%@ page language="java" contentType="text/html;charset=UTF-8" import="java.util.*" pageEncoding="UTF-8"%>
page常用的属性:
1.language属性:language属性为指定JSP页面使用的是哪种脚本语言,目前使用的只有Java所以默认 language=“Java”
2.extends属性:extends属性是JSP文件被编译成Java代码后继承的父类,它便可以引用父类中的变量、方法。但是会降低JSP的灵活性。
3.import属性:用来指定导入的Java包名或者类列表。需要引用多个类文件时用( ,)隔开。
4.contentType属性:用来指定以哪种文件形式显示JSP文件,同时指定页面的字符编码方式。
5.pageEncoding属性:用来指定JSP页面采用的字符编码方式,相当于contentType属性值中的charset值。
二 、include指令:
通过include指令来包含另外一个页面,当容器编译JSP文件时,当前的页面会和include指令指定的页面合并。作用是:通过代码的重用来减少工作量。
include指令的两种形式:
<%@ include file=" " %> 指令元素(静态包含)
<jsp:include flush="true" page=" "></jsp:include> 行为元素(动态包含)
注意:
1)原理:把被包含的页面的内容翻译到包含页面中,合并成翻译成一个java源文件,在编译运行
这种叫做静态包含(源码包含)
2)如果使用静态包含,被包含页面中不需要出现全局的html标签了(如html、head、body)
这两种方法的区别:
1、指令元素是在JSP文件被编译成servlet时,引入指定的文件;行为元素是当JSP页面被请求时,才引入指定文件。
2、行为元素可以向页面传递参数;指令元素不能传递参数。
3、在编译阶段,指令元素把被包含的文件插入到包含的地方,生成一个.Java文件和一个.class文件;行为元素在编译时,被包含的文件单独生成一个.Java文件和.class文件。
4、指令元素用include的伪代码实现页面包含页面,不会检查包含文件的变化;行为元素用jsp:include动作实现页面包含页面,总是检查包含文件中的变化。
动态包含是把两个或两个以上的独立文件合并成一个页面显示出来,动态包含是把两个或两个以上的文件合并成一个文件编译。
三、taglib指令:
是用来制定一个标签库以及自定义标签库的前缀。JSP文件使用taglib指令来告诉容器,该JSP文件需要哪些标签库,并可以指定标签的前缀。
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
其中 uri是指标签库的路径;prefix是标签的前缀。taglib指令在JSP文件中的代码如下:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:forEach>
<c:if test=" "></c:if>
</c:forEach>
只有在JSP文件中需要用到标签库的时候,才会使用taglib指令。
四、JSP的内置对象
1)什么事内置对象?
例如:HttpSession ServletContext HttpServletRequest。我们每次都要使用这些对象,一直创建会很麻烦。所以sun公司设计jsp时,在jsp页面加载完毕之后就会自动帮开发者创建好这些对象。而开发者只需要直接使用这些对象调用方法即可!这些创建爱女好的对象就叫内置对象。
举例:
servlet:
HttpSession session=request.getSession();
jsp:
tomcat: HttpSession session=request.getSession();(不需要开发者做)
九大内置对象
内置对象 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page Object(this)
out JspWriter
pageContext PageContext
out对象
out对象类型,JspWriter类,相当于带缓冲的PrintWriter
PrintWriter:
writer(内容):直接向浏览器写出内容
JspWriter:
writer(内容):向jsp缓冲区写出内容
pageContext对象
pageContext对象的类型是PageContext,叫jsp的上下文对象
1)可以获取其他八个内置对象
public class _hello_jsp{
public void jspService(request,response){
创建内置对象
HttpSession session=request.get.......;
ServletConfig config=.......;
把8个经常使用的内置对象分装到PageContext对象中
PageContext pageContext = 封装
调用method1方法
method1(session,config);
}
public void method1(){
希望使用内置对象
从PageContext对象中获取其他八个内置对象
jspWriter out = pageContext.getOut();
HttpServletRequest request = pageContext.getRequest();
......
}
}
使用场景:在自定义标签的时候,pageContext对象频繁使用到
2)本身是一个域对象
ServletContext context域
HttpServletRequest request域
HttpSession session域
PageContext page域
作用:保存数据和获取数据,用于获取数据
保存数据:
1)默认情况下,保存到page域
pageContext.setAttribute("name");
2)可以向四个域对象保存数据
pageContext.setAttribute("name",域范围常量)
获取数据:
1)默认情况下,从page域获取
pageContext.getAttribute("name");
2)可以从四个域中获取数据
pageContext.getAttribute("name",域范围常量)
域范围常量
PAGE_SCOPE REQUEST_SCOPE SESSION_SCOPE APPLICATION_SCOPE
3)自动在四个域中搜索数据
pageContext.findAttribute("name");
顺序:page域 -> request域 -> session域 ->context域
JSP中的四个域对象:
1)域对象作用
保存数据 和获取数据 ,用于数据共享
2)域对象方法
setAttribute(“name”,Object)保存数据
getAttribute(“name”) 获取数据
removeAttribute(“name”)清除数据
3)域对象作用范围
page域:只能在当前jsp页面中请求(当前页面)
request域:只能在同一个请求中使用(转发)
session域:只能在同一个会话(session)中使用(私有的)
context域:只能在同一个web应用中使用(全局的)
Jsp的最佳实践
servlet技术:开发动态资源。是一个java类,最擅长写java代码
jsp技术:开发动态资源。最擅长通过java代码输出html代码。
各取所长:
在web项目下所涉及到逻辑
1)接收参数(servlet做)
2)处理业务逻辑,返回结果(servlet做)
3)显示数据到浏览器(jsp做)
4)跳转到其他页面(servlet做)
servlet+jsp模式
servlet:
1)接收参数
2)处理业务逻辑
3)把结果保存到域对象
4)跳转页面
jsp:
1)从域对象取出数据
2)把数据显示到浏览器
servlet的数据 -> jsp页面
List<Contact> 使用域对象 共享数据