JSP:Java Server Pages (Java服务器端页面),其实就是在HTML中嵌入Java代码。
JSP将Java代码和特定变动内容嵌入到静态的页面中,实现以静态页面为模板,动态生成其中的部分内容。
JSP引入了被称为“JSP动作”的XML标签,用来调用内建功能。另外,可以创建JSP标签库,然后像使用标准HTML或XML标签一样使用它们。标签库能增强功能和服务器性能,而且不受跨平台问题的限制。
JSP文件在运行时会被其编译器转换成更原始的Servlet代码。JSP编译器可以把JSP文件编译成用Java代码写的Servlet,然后再由Java编译器来编译成能快速执行的二进制机器码,也可以直接编译成二进制码。
SUN公司提供了动态网页开发技术:Servlet。Servlet技术生成动态网页的时候很麻烦,需要通过response获得输出流,调用print方法进行打印的。这种编程方式很麻烦,而且美工也不容易处理,SUN公司发现了这些问题,推出了一个新的动态网页开发技术JSP。
缺点:Servlet需要进行配置,不方便维护;Servlet很难向网页中输出HTML页面内容
JSP的简单使用:
创建一个web项目,2.5版本,finish。在WebContent下新建一个包,新建一个JSPfile。将其中的编码改为UTF-8
JSP需要发布到服务器中才可以运行:
在services中添加这个web项目,finish。启动服务器。浏览器输入访问。
运行原理:JSP文件翻译成Java文件,将这个Java文件编译生成class文件,运行class文件。JSP在执行时,会被服务器翻译为Servlet编译执行,JSP就是一个Servlet。
JSP = HTML + Java代码 + JSP自身东西
JSP的脚本元素就是在JSP中嵌入Java代码。
分类:
1.声明标签:写在这个脚本中的代码,翻译成Servlet内部的成员变量或成员方法(JSP声明 翻译成 Servlet成员部分的内容。声明变量,方法,内部类)
语法:<%! 变量或方法声明 %>
2.表达式标签:写在这个脚本中的代码,翻译成方法内部的out.print();当中的内容(翻译out.print(),在service方法内部。用于生成HTML页面源码)
语法:<%= 表达式 %>
3.程序代码标签:写在这个脚本中的代码,翻译成方法内部的局部变量或方法内部代码片段(嵌入Java代码 翻译成service方法内部的代码块。声明变量,内部类)
语法:<% 程序代码 %>
因为Servlet被认为是线程不安全的,所以用声明标签来定义局部变量不合适,一般都会用程序代码标签来定义变量。
JSP的开发模式:
以后开发一般都用MVC开发模式
开发中的路径问题:
提供一些页面,在页面中会提供链接或者表单,当点击链接或者表单的时候需要进行提交,提交到Servlet中。从页面向Servlet发送请求的地址(路径)应该如何编写。
路径的分类:
1.相对路径:相对路径不是以 / 开头的
比如:
在根路径下的页面访问Servlet:
假如demo2.jsp的访问路径:http://localhost:8080/web02/demo2.jsp
ServletDemo1的访问路径:http://localhost:8080/web02/ServletDemo1
则:
加不加./都可以
在某个目录下的页面访问Servlet:
假如demo2.jsp的访问路径:http://localhost:8080/web02/demo2/demo2.jsp
ServletDemo1的访问路径:http://localhost:8080/web02/ServletDemo1
则:
需要先返回上一级再去访问
2.绝对路径(通常用这个):通常以 / 开始的路径
*使用绝对路径,不需要关心当前文件和要请求的文件的相对位置的关系*
*绝对路径分成服务器端路径和客户端路径*****:****
*客户端路径 需要带工程名*
*服务器端路径 不需要带工程名*
这个例子的工程名是web02
JSP的模板修改JSP的字符集编码:在window下的Preferences中找到jsp
JSP的注释:
1.HTML的注释:
写法:
存在时机:存在JSP的源码中,翻译成Servlet后这个注释也存在,在生成HTML响应到页面的时候这个注释也会存在。
2.JAVA代码的注释:
写法:<% // 单行注释
/* 多行注释 */
/*文档注释/
%>
存在时机:存在JSP的源码中,翻译成Servlet后Java代码的注释也会存在,但是生成HTML响应到页面后,这种注释就消失了。
3.JSP自身的注释:
写法:<%– JSP的注释 –%>
存在时机:存在JSP的源码中,翻译Servlet后注释就没有了。
注意:HTML的注释只能注释一些元素,不能注释java代码
JSP的指令元素
作用:用于指示JSP执行的某些步骤;用于指示JSP变现特定行为
语法:<%@ 指令名称 属性名称=属性的值 属性名称=属性的值 %>
分类:
page指令:指示JSP的页面设置属性和行为
include指令:指示JSP包含哪些其他页面
taglib指令:指示JSP页面包含哪些标签库
page指令:
写法:<%@ page 属性名=属性值 属性名=属性值 属性名=属性值 %>
Page指令用来定义JSP文件的全局属性。
这些属性可以单独使用,也可以几个或多个同时使用。
在JSP页面中,只有import属性可以出现多次,其他属性都只能出现一次。
language属性:声明使用脚本的语言。只能是java。
extends属性:标明JSP编译成Servlet的时候继承的类。默认值:HttpJspBase。
session属性:标明JSP中是否可以直接使用session对象。默认值是true。
buffer属性:标明JSP对客户端输出缓冲区大小。默认值8kb。
autoFlush属性:如果缓冲区大小溢出,是否自动刷出。默认true。
*import属性:用于导入Java包或类。*****(**写完java代码后alt+/自动导入**)****
*contentType属性:标明JSP被浏览器解析和打开的时候采用的默认的字符集。*
*pageEncoding属性:JSP文件及JSP翻译后的Servlet保存到硬盘上采用字符集。*
isErrorPage属性:处理JSP页面异常。默认为false,改为true后,可以<%= exception.getMessage>就可以输出异常信息
errorPage属性:处理JSP页面异常。(后面可以跟一个jsp的页面地址,当出现异常时,就可以跳转到)
isELIgnored属性:通知JSP是否忽略EL表达式。默认是false。改为true后,EL内的信息会直接输出,EL写进标签就会报错。
include指令:
写法:<%@ include 属性名=属性值%>
作用:在JSP页面中****静态包含****一个文件,同时由该JSP解析包含的文件内容。
file属性:指示JSP页面包含页面路径。
注意:应该将被包含的页面的结构去掉(会有重复的HTML标签,被包含的去掉)。在被包含的页面中定义变量,在包含的页面中还可以使用。
taglib指令:
写法:<%@ taglib 属性名=属性值%>
作用:用于在JSP页面中引入标签库。
uri属性:引入的标签库的路径
prefix属性:引入标签库的别名(前缀)
JSP的内置对象:指的是可以直接在JSP页面中使用的对象。
JSP当中有9大内置对象(具体类型):
l request(HttpServletRequest):从客户端向服务器发送的请求对象
l response (HttpServletResponse):从服务器端向客户端作出响应对象
l session (HttpSession):服务器为客户端创建会话对象
l application(ServletContext):代表应用。获得的ServletContext对象。
l out (JspWriter):向输出流写入内容的对象。
l page(Object):当前的JSP翻译成Servlet后的对象的引用。
l pageContext (PageContext):本JSP的页面的上下文对象。
l config(ServletConfig):本JSP的ServletConfig对象。
l exception(Throwable):表示JSP页面运行时产生的异常对象。
pageContext对象:pageContext对象直接翻译为“页面上下文”对象,代表的是当前页面运行的一些属性。
它是javax.servlet.jsp.PageContext类的实例对象。
1.提供了page范围的数据存取的方法:
向page范围中存入数据:
从page范围获取数据
从page范围移除数据
查找属性的方法:
2.通过这个对象获得其他的8个内置对象:
获得其他8个内置对象的方法
JSP的四个作用范围
PageScope:页面范围。
页面范围指的是在当前的页面内有效,出了这个页面,用pageContext保存的数据就无效了。
RequestScope:请求范围。
从客户端向服务器发送一次请求,服务器对这次请求作出了响应之后,用request保存的数据就无效了。
SessionScope:会话范围。
每个浏览器向服务器发送请求(多次请求)。将该会话结束,用session保存的数据就无效了。
ApplicationScope:应用范围。
在整个应用中任意的地方都可以获取。用application保存。
调取的时候使用重载方法:
pageContext.getAttribute(“name”,PageContext.SESSION_SCOPE)
findAttribute方法:查找属性方法,先根据小范围的名称进行查找,如果找到了就返回,如果没有找到就会去比其大一个域的范围进行查找。(page–request–session–application)
JSP的动作标签:用于在JSP页面中提供业务逻辑功能,避免在JSP页面中直接编写Java代码(会有大量的<% >),造成jsp页面难以维护。
常用的动作标签:
*<jsp:forward**** ****page=“”********>* *<********/********jsp:forward********>* *:请求转发。*
*<jsp:include**** ****page=********””********>* *</********jsp:include********>*****:包含(**是一种**动态包含)。****
<jsp:param value=“” name=“” />:传递参数。(很少使用,因为可以用set/getAttribute来设置获取参数)
动态包含的原理:
查看Tomcat的work下的localhost下的项目下会找到被包含的jsp都被编译成了java和clss文件。
EL
EL(Expression Language) 是为了使JSP写起来更加简单。表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法,让Jsp的代码更加简化。
EL:Expression Language表达式语言。
EL和JSTL一起使用取代JSP页面中嵌入Java代码写法。(去掉<>和%)
EL的语法:${ EL表达式 }
EL的功能:
1.EL获取数据(域对象中)
EL表达式语句在执行的时候,会调用pageContext.findAttribute()方法。分别从page、request、session、application范围查找相应对象,找到就会返回相应对象,找不到返回””(不是null,是空的字符串)。EL所获取的数据需要在四个作用范围中。
这两种方式的区别:如果没有存入数据,前者获取输出的是null,后者输出的是“”。直接写${name}会先从最小范围查找,找不到的话会向上一级域查找(其实相当于调用了pageContext.findAttribute()方法)。
(需要引包:alt+/)
如果map的key中包含了特殊字符,不能使用.必须使用[]。
因为: .用来获取对象的属性的 []用来获得下标
例如,包含特殊字符.
*2.*****EL执行运算****
会自动类型转换,即使是字符串,也会转换成算数运算
lt:less than gt:great than ne:not equal
判断一个对象是否为空 也可以${not empty user}
不支持位运算
*3.*****EL获取web开发常用的对象****
EL表达式定义了11个web开发常用对象。使用这些对象可以很方便获取web开发中的一些常见对象,并可以读取这些对象中的数据。
*pageContext* :相当于JSP内置对象中pageContext(可以通过这个获取其他八个对象)
pageScope:获取指定域下的名称的数据
requestScope:获取指定域下的名称的数据
sessionScope:获取指定域下的名称的数据
applicationScope :获取指定域下的名称的数据
param:在页面中接收请求参数(接收一个名称对应一个值参数)。相当于requset.getParam
paramValues :在页面中接收请求参数(接收一个名称对应多个值参数)。
header:在页面上获取请求头(获取一个key对应一个value 头)
headerValues:在页面上获取请求头(获取一个key对应多个value 头)
cookie:访问cookie的名称和值(${cookie.key.name} ${cookie.key.value})
initParam:获取全局初始化参数的值
4.EL调用Java方法(基本不用)
JSTL
JSTL(Java server pages standarded tag library,即JSP标准标签库)是由JCP(Java community Proces)所制定的标准规范,它主要提供给Java Web开发人员一个标准通用的标签库,并由Apache的Jakarta小组来维护。开发人员可以利用这些标签取代JSP页面上的Java代码,从而提高程序的可读性,降低程序的维护难度。
JSTL:JSP的标准标签库。
JSTL主要是和EL来取代传统页面上直接嵌入Java代码写法。提升程序可读性、维护性和方便性。
版本:JSTL1.0、JSTL1.1和JSTL1.2版本
1.0版本不支持EL表达式。*1.1和1.2支持了EL表达式。*
标签库:
*c标签(core标签库*****,**核心标签库**)****
fmt标签(国际化标签库)
xml标签(后台编写,前台标签不怎么用)
sql标签(后台编写,前台标签不怎么用)
*jstl函数库(EL函数)*
使用:先导入JSTL的jar包到lib中
新建一个jsp页面:
在上面导入标签库:
可以直接使用:
value相当于是值,var相当于是name,scope是域对象的范围
JSTL有很多标签,可以查看文档使用,用的较多的是:
JSTL的if标签使用:只有if没有else
test属性:条件
var属性:将test中的条件的值赋给一个变量,在var中定义变量
scope属性:作用范围
<c:if var=”flag” test=”${ i<10 }” scope =”page”>
后面可以直接使用flag
<c:if test=”${flag }” >
JSTL的forEach标签使用: