什么是jsp?
Jsp全称,Java Server Page ,java服务页面,能够提供java服务的页面
html:由html标签组成的,输出能够输出一些静态内容.
jsp:可以写html标签,还可以写java代码.
jsp页面也是需要交给tomcat服务器运行
Jsp页面如何被tomcat服务器运行?
第一次访问jsp:
1)tomcat服务器会把jsp页面翻译成java源文件.(01.hello.jsp--->01.hello_jsp.java)
2)tomcat服务器会把java源文件编译成class文件: _01_hello_jsp.java---->_01_hello_jsp.class
3)读取class文件,创建类对象._01hell0_jsp类的方法
4)执行类中的方法._01_hello_jsp类的方法
第n次访问jsp:
4)执行类中的方法._01_hello_jsp类的方法
直接走第4个步骤:
注意:
重新修改了jsp页面时,重新走翻译和编译的过程.
运行的class类是什么类?
public final class _01_hello_jsp extends org.apache.jasper.runtime.HttpJspBase
public abstract class org.apache.jasper.runtime.HttpJspBase extends javax.servlet.http.HttpServlet implements javax.servlet.jsp.HttpJspPage
jsp的源文件是一个servlet!
servlet的技术可以用在jsp上面
servlet的生命周期:
构造方法
init方法
service方法
destory方法
jsp的生命周期
翻译(java文件)
编译(class文件)
构造方法
_jspinit方法
_jspService方法
_jspDestroy方法
Jsp的表达式
语法:<%=变量或者表达式%>
作用:想浏览器输出变量的值或表达式计算的结果
注意:
原理是使用out.print()方法向浏览器输出内容
Jsp脚本
语法:<% java语句 %>
作用:执行java语句
原理:脚本就是原封不动地翻译到java文件的_jspservice方法中执行
Jsp声明
语法:<%! 变量或者方法%>
作用:用于声明变量或者方法的
原理:声明的变量变成成员变量,声明的方法作为成员方法
注意:
1)不要声明和翻译后的java文件相同的方法名
2)jsp脚本是不能声明方法的
Jsp注释
语法:<%--jsp注释--% >
作用:注释jsp页面的内容
注意:
html注释会被翻译执行,而jsp的注释不会被翻译和执行
<!--<jsp:forward page="/01.hello.jsp"></jsp:forward>?还会跳转
所以应该用:<%-- <jsp:forward page="/01.hello.jsp"></jsp:forward>m--%>
Jsp的三大指令
1、taglib指令
作用:taglib指令用来引用标签库并设置标签库的前缀。
taglib指令包含两个属性:
1)uri属性:用来指定标签文件或标签库的存放位置。
2)prifix属性:用来指定该标签锁使用的前缀。
2、include指令
作用:用于包含其他页面的
<%--包含头部页面 --%>
<%@include file="/common/header.jsp" %>
原理:直接把包含与被包含的内容先合并在一起,然后翻译成一个java源文件,最后编译执行.(先合并到一起,再翻译)(源码包含,也叫做静态的包含)
3、page指令
作用:告诉浏览器如何翻译jsp文件
<%@
page
language="java" -- 使用什么语言翻译jsp文件
import="java.util.*" -- 导包;导入多个包中间使用逗号
jsp文件的编码相关的
pageEncoding="utf-8" -- 使用什么编码翻译jsp文件
contentType="text/html; charset=utf-8" –- 服务器发送给浏览器的数据类型和内容的编码格式
异常页面相关的
errorPage="/common/error.jsp" -- 指定jsp错误处理页面
isErrorPage="true" --指定当前页面为错误处理页面,如果是错误处理页面,就可以使用exception内置对象,使用exception对象可以查看错误信息
session="true" -- 是否打开session功能,true:打开,false:关闭
buffer="8kb" -- jsp页面的缓冲区大写
isELIgnored="false" -- 是否忽略EL表达式;true:忽略,false:不忽略
%>
分工问题:
servlet技术:写java代码(普通的java类)
jsp技术:输出html代码(类似于html页面)
项目中涉及的功能:
1)接收参数信息: (servlet做)
2)执行业务逻辑(CURD) (servlet做)
3)返回结果,输出结果 (jsp做)
4)跳转页面 (servlet做)
jsp的七大动作指令
(1)JSP:forward 执行页面转向,将请求的处理转发到下一个页面。
用于将页面相应转发到另外的页面,既可以转发到静态的html页面,也可以转发到动态的JSP页面,或者转发到容器中的Servlet。
(2)JSP:param 用于传递参数,必须与其他支持参数的标签一起使用
param用于设置参数值,这个指令本身不能单独使用,因此单独的param指令没有实际意义,param指令可以与以下指令结合使用(jsp:include jsp:forward jsp:plugin)
(3)JSP:include 用于动态引入一个JSP页面
include指令时一个动态include指令,也用于包含某一个页面,它不会导入被include页面的编译指令,仅仅被导入页面的body内容插入页面。
(4)JSP:plugin 用于下载JavaBean或者Applet到客户端执行
plugin指令主要用于下载服务器端的JavaBean或Applet到到客户端执行,由于程序在客户端执行,因此客户端必须安装虚拟机。
(5) JSP:useBean 创建一个Javabean实例
<jsp:useBean id="name" class="classname" scope="page|request|session|application"/>
其中,id属性是JavaBean的实例名,class属性确定JavaBean的实现类。scope属性用于指定JavaBean实例的作用范围。
(6) JSP:setProperty 设置JavaBean实例的属性值
<jsp:setProperty name="BeanName" property="propertyName" value="propertyValue"/>
其中,name属性是要确定JavaBean的实例名,property属性要确定设置属性的属性名,value属性时要确定属性名对应的值。
(7)JSP:getProperty 获取JavaBean实例的属性值
<jsp:getProperty name="BeanName" property="propertyName"/>
其中,name属性时要确定JavaBean的实例名,property属性是指定要获取的属性名对应的值。
注意: 注:使用userBean标签时,除在页面脚本中创建了JavaBean实例之外,该标签还会将该JavaBean实例放入指定scope中,所以我们还需要在脚本中将JavaBean放入指定的scope中,所下面的代码所示:
pageContext.setAttribute("beanName",beanName)
request.setAtttibutr("beanName",beanName)
session.setAttribute("beanName",beanName)
application.setAttribute("beanName",beanName)
jsp九大内置对象(隐藏对象)
在jsp开发有些对象使用频率比较高,(例如:request,response,session,servletContext…)如果每次要使用这些对象都自己去获取对象才能使用,会显示太麻烦了.jsp把这些对象都创建或获取好了,我们开发者之间使用这些对象即可。这些对象叫内置对象。
jsp对象名 类型
request HttpServletRequest 请求对象
response HttpServletResponse 响应对象
config ServletConfig 配置对象
application servletContext servlet上下文对象
session HttpSession 会话对象
exception Throwable 异常信息对象
page Object ---代表jsp文件翻译后的java类
out JspWriter 代表输出对象,response.getWriter.PrintWriter相当于带缓冲功能的PrintWriter
pageContext pageContext 代表jsp的上下文对象
通过pageContext获得其他对象
getException方法返回exception隐式对象
getPage方法返回page隐式对象
getRequest方法返回request隐式对象
getResponse方法返回response隐式对象
getServletConfig方法返回config隐式对象
getServletContext方法返回application隐式对象
getSession方法返回session隐式对象
getOut方法返回out隐式对象
什么是EL?
EL表达式替代jsp的表达式.因为开发jsp页面的时候遵守原则:在jsp页面中尽量少写甚至不写java代码.
EL表达式作用:向浏览器输出域对象中的变量或者表达式技术的结果
语法: ${变量或表达式} 代替:<%= 变量或者表达式%>
想要停用对EL表达式的评估的话,需要使用page指令将isELIgnored属性值设为true:
<%@ page isELIgnored ="true|false" %>
这样,EL表达式就会被忽略。若设为false,则容器将会计算EL表达式。
EL中的基础操作符
EL表达式支持大部分Java所提供的算术和逻辑操作符:
. 访问一个Bean属性或者一个映射条目
[] 访问一个数组或者链表的元素
( ) 组织一个子表达式以改变优先级
+ 加
- 减或负
* 乘
/ or div 除
% or mod 取模
== or eq 测试是否相等
!= or ne 测试是否不等
< or lt 测试是否小于
> or gt 测试是否大于
<= or le 测试是否小于等于
>= or ge 测试是否大于等于
&& or and 测试逻辑与
|| or or 测试逻辑或
! or not 测试取反
empty 测试是否空值
.与 [ ] 运算符
EL 提供 . 和 [ ] 两种运算符来导航数据。下列两者所代表的意思是一样的:
${sessionScope.user.sex}等于${sessionScope.user["sex"]}
. 和 [ ] 也可以同时混合使用,如下:
${sessionScope.shoppingCart[0].price}
回传结果为shoppingCart中第一项物品的价格。
不过,以下两种情况,两者会有差异:
(1) 当要存取的属性名称中包含一些特殊字符,如. 或 – 等并非字母或数字的符号,就一定要使用 [ ],
例如:${user.My-Name }
上述是不正确的方式,应当改为:${user["My-Name"] }
(2) 我们来考虑下列情况:
${sessionScope.user[data]}
此时,data 是一个变量,假若data的值为"sex"时,那上述的例子等于${sessionScope.user.sex};
假若data 的值为"name"时,它就等于${sessionScope.user.name}。
因此,如果要动态取值时,就可以用上述的方法来做,但无法做到动态取值。
EL 变量
EL 存取变量数据的方法很简单,例如:${username}。它的意思是取出某一范围中名称为username的变量。
因为我们并没有指定哪一个范围的username,所以它的默认值会先从Page 范围找,假如找不到,
再依序到Request、Session、Application范围。假如途中找到username,就直接回传,不再继续找下去,
但是假如全部的范围都没有找到时,就回传null,当然EL表达式还会做出优化,页面上显示空白,而不是打印输出NULL。
自动转变类型
EL 除了提供方便存取变量的语法之外,它另外一个方便的功能就是:自动转变类型,我们来看下面这个范例:
${param.count + 20}
假若窗体传来count的值为10时,那么上面的结果为30。之前没接触过JSP 的读者可能会认为上面的例子是理所当然的,
但是在JSP 1.2 之中不能这样做,原因是从窗体所传来的值,它们的类型一律是String,所以当你接收之后,必须再将它转为其他类型,
如:int、float 等等,然后才能执行一些数学运算,下面是之前的做法:
String str_count =request.getParameter("count");
int count =Integer.parseInt(str_count);
count = count + 20;
所以,注意不要和java的语法(当字符串和数字用“+”链接时会把数字转换为字符串)搞混淆。
什么是JSTL?(需要导入)
JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能。
JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签。
根据JSTL标签所提供的功能,可以将其分为5个类别。
1、核心标签
2、格式化标签
3、SQL 标签
4、XML 标签
5、JSTL 函数
JSTL的核心标签
1、<c:out> 用于在JSP中显示数据,就像<%= ... >
语法格式
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
属性 描述 是否必要 默认值
value 要输出的内容 是 无
default 输出的默认值 否 主体中的内容
escapeXml 是否忽略XML特殊字符 否 true
2、<c:set> 用于保存数据
<c:set>标签用于设置变量值和对象属性。
<c:set>标签就是<jsp:setProperty>行为标签的孪生兄弟。
这个标签之所以很有用呢,是因为它会计算表达式的值,然后使用计算结果来设置 JavaBean 对象或 java.util.Map 对象的值。
语法格式
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="<string>"/>
属性 描述 是否必要 默认值
value 要存储的值 否 主体的内容
target 要修改的属性所属的对象 否 无
property 要修改的属性 否 无
var 存储信息的变量 否 无
scope var属性的作用域 否 Page
3、<c:remove> 用于删除数据
<c:remove>标签用于移除一个变量,可以指定这个变量的作用域,若未指定,则默认为变量第一次出现的作用域。
这个标签不是特别有用,不过可以用来确保JSP完成清理工作。
语法格式
<c:remove var="<string>" scope="<string>"/>
属性 描述 是否必要 默认值
var 要移除的变量名称 是 无
scope 变量所属的作用域 否 所有作用域
4、<c:catch> 用来处理产生错误的异常状况,并且将错误信息储存起来
<c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来。
语法格式
<c:catch var="<string>">
...
</c:catch>
属性 描述 是否必要 默认值
var 用来储存错误信息的变量 否 None
5、<c:if> 与我们在一般程序中用的if一样
<c:if>标签判断表达式的值,如果表达式的值为 true 则执行其主体内容。
语法格式
<c:if test="<boolean>" var="<string>" scope="<string>">
...
</c:if>
属性 描述 是否必要 默认值
test 条件 是 无
var 用于存储条件结果的变量 否 无
scope var属性的作用域 否 page
6、<c:choose> 本身只当做<c:when>和<c:otherwise>的父标签
7、<c:when> <c:choose>的子标签,用来判断条件是否成立
8、<c:otherwise> <c:choose>的子标签,接在<c:when>标签后,当<c:when>标签判断为false时被执行
<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。
switch语句中有case,而<c:choose>标签中对应有<c:when>,switch语句中有default,而<c:choose>标签中有<c:otherwise>。
语法格式
<c:choose>
<c:when test="<boolean>">
...
</c:when>
<c:when test="<boolean>">
...
</c:when>
...
...
<c:otherwise>
...
</c:otherwise>
</c:choose>
属性
<c:choose>标签没有属性。
<c:when>标签只有一个属性,在下表中有给出。
<c:otherwise>标签没有属性。
属性 描述 是否必要 默认值
test 条件 是 无
9、<c:import> 检索一个绝对或相对 URL,然后将其内容暴露给页面
<c:import>标签提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL。
举例来说,使用<c:import>标签可以包含一个FTP服务器中不同的网页内容。
语法格式
<c:import
url="<string>"
var="<string>"
scope="<string>"
varReader="<string>"
context="<string>"
charEncoding="<string>"/>
属性 描述 是否必要 默认值
url 待导入资源的URL,可以是相对路径和绝对路径,并且可以导入其他主机资源 是 无
context 当使用相对路径访问外部context资源时,context指定了这个资源的名字。 否 当前应用程序
charEncoding 所引入的数据的字符编码集 否 ISO-8859-1
var 用于存储所引入的文本的变量 否 无
scope var属性的作用域 否 page
varReader 可选的用于提供java.io.Reader对象的变量 否 无
10、<c:forEach> 基础迭代标签,接受多种集合类型
11、<c:forTokens> 根据指定的分隔符来分隔内容并迭代输出
这些标签封装了Java中的for,while,do-while循环。
相比而言,<c:forEach>标签是更加通用的标签,因为它迭代一个集合中的对象。
<c:forTokens>标签通过指定分隔符将字符串分隔为一个数组然后迭代它们。
forEach 语法格式
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
forTokens 语法格式
<c:forTokens
items="<string>"
delims="<string>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
<c:forEach>标签有如下属性:
属性 描述 是否必要 默认值
items 要被循环的信息 否 无
begin 开始的元素(0=第一个元素,1=第二个元素) 否 0
end 最后一个元素(0=第一个元素,1=第二个元素) 否 Last element
step 每一次迭代的步长 否 1
var 代表当前条目的变量名称 否 无
varStatus 代表循环状态的变量名称 否 无
<c:forTokens>标签与<c:forEach>标签有相似的属性,不过<c:forTokens>还有另一个属性:
属性 描述 是否必要 默认值
delims 分隔符 是 无
12、<c:param> 用来给包含或重定向的页面传递参数
<c:param>标签用于在<c:url>标签中指定参数,而且与URL编码相关。
在<c:param>标签内,name属性表明参数的名称,value属性表明参数的值。
语法格式
<c:param name="<string>" value="<string>"/>
属性 描述 是否必要 默认值
name URL中要设置的参数的名称 是 无
value 参数的值 否 Body
13、<c:redirect> 重定向至一个新的URL.
<c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL,它提供内容相关的URL,并且支持c:param标签。
语法格式
<c:redirect url="<string>" context="<string>"/>
属性 描述 是否必要 默认值
url 目标URL 是 无
context 紧接着一个本地网络应用程序的名称 否 当前应用程序
14、<c:url> 使用可选的查询参数来创造一个URL
<c:url>标签将URL格式化为一个字符串,然后存储在一个变量中。
这个标签在需要的时候会自动重写URL。
var属性用于存储格式化后的URL。
<c:url>标签只是用于调用response.encodeURL()方法的一种可选的方法。它真正的优势在于提供了合适的URL编码,包括<c:param>中指定的参数。
语法格式
<c:url
var="<string>"
scope="<string>"
value="<string>"
context="<string>"/>
属性 描述 是否必要 默认值
value 基础URL 是 无
context 本地网络应用程序的名称 否 当前应用程序
var 代表URL的变量名 否 Print to page
scope var属性的作用域 否 Page
格式化标签
JSTL格式化标签用来格式化并输出文本、日期、时间、数字。引用格式化标签库的语法如下:
<fmt:formatNumber> 使用指定的格式或精度格式化数字
<fmt:parseNumber> 解析一个代表着数字,货币或百分比的字符串
<fmt:formatDate> 使用指定的风格或模式格式化日期和时间
<fmt:parseDate> 解析一个代表着日期或时间的字符串
<fmt:bundle> 绑定资源
<fmt:setLocale> 指定地区
<fmt:setBundle> 绑定资源
<fmt:timeZone> 指定时区
<fmt:setTimeZone> 指定时区
<fmt:message> 显示资源配置文件信息
<fmt:requestEncoding> 设置request的字符编码