JSP总结
背景
servlet 可以通过转发或重定向跳转到某个 html 文档。但 html 文档中的内容不受 servlet 的控制。比如登录失败时,跳转回登录表单页面无法显示诸如“用户名或密码不正确”的错误消息,所以我们目前采用的办法是跳转到一个错误信息页面。如果通过 servlet 逐行输出响应信息则会非常繁琐。
|
servlet |
html |
长处 |
接收请求参数,访问域对象,转发页面 |
以友好方式显示数据 |
短处 |
以友好方式显示数据 |
动态显示数据 |
servlet 和 html 二者的长处结合起来就诞生了 jsp 。
jsp 简介
java server page
1) jsp 的本质是一个 servlet,servlet 能做的事情 jsp 都能做。
2) jsp 能够以 html 页面的方式呈现数据,是一个可以嵌入 java 代码的 html。
3) jsp 不同于 html,不能使用浏览器直接打开,而必须运行在 servlet 容器中。
4) jsp 可以放置在 web 应用程序中的除了 web-inf 及其子目录外的其他任何目录中,jsp 页面的访问路径与普通 html 页面的访问路径形式也完全一样。
jsp 运行原理
每个jsp 页面在第一次被访问时, jsp 引擎将它翻译成一个 servlet 源程序, 接着再把这个 servlet 源程序编译成 servlet 的class类文件.然后再由web容器(servlet引擎)像调用普通servlet程序一样的方式来装载和解释执行这个由jsp页面翻译成的servlet程序。
jsp 基本语法
jsp 模板元素
1) jsp 页面中的静态 html 内容称之为 jsp 模版元素,在静态的 html 内容之中可以嵌套 jsp的其他各种元素来产生动态内容和执行业务逻辑。
2) jsp 模版元素定义了网页的基本骨架,即定义了页面的结构和外观
jsp 表达式
1) jsp 表达式(expression)提供了将一个 java 变量或表达式的计算结果输出到客户端的简化方式,它将要输出的变量或表达式直接封装在<%= 和 %>之中
举例:current time: <%= new java.util.date() %>
2) jsp 表达式中的变量或表达式的计算结果将被转换成一个字符串,然后被插入到整个 jsp页面输出结果的相应位置处。
3) jsp 表达式中的变量或表达式后面不能有分号(;),jsp 表达式被翻译成 servlet 程序中的一条 out.print(…)语句。
jsp 脚本片段
1)jsp 脚本片断(scriptlet)是指嵌套在<% 和 %>之中的一条或多条 java 程序代码。
2)在 jsp 脚本片断中,可以定义变量、执行基本的程序运算、调用其他 java 类、访问数据库、访问文件系统等普通 java 程序所能实现的功能。
3)在 jsp 脚本片断可以直接使用 jsp 提供的隐含对象来完成 web 应用程序特有的功能。
4) jsp 脚本片断中的 java 代码将被原封不动地搬移进由 jsp 页面所翻译成的 servlet 的 _jspservice()方法中。所以,jsp 脚本片断之中只能是符合 java 语法要求的程序代码,除此之外的任何文本、html 标记、其他 jsp 元素都必须在脚本片断之外编写。
5) jsp 脚本片断中的 java 代码必须严格遵循 java 语法,例如,每条命令执行语句后面必须用分号(;)结束。
6)在一个 jsp 页面中可以有多个脚本片断(每个脚本片断代码嵌套在各自独立的一对<% 和 %>之间),在两个或多个脚本片断之间可以嵌入文本、html 标记和其他 jsp 元素。
举例:
<% int x = 3; %> <p>这是一个 html 段落</p> <% out.println(x); %>
7)多个脚本片断中的代码可以相互访问,犹如将所有的代码放在一对<%%>之中的情况。 举例:上面的 jsp 内容与下面的 jsp 内容具有同样的运行效果
<p>这是一个 html 段落</p> <% int x = 3; out.println(x); %>
举例 1:
jsp 代码 |
_jspservice()方法中的代码 |
<%for (int i=1; i<5; i++) {%> <h<%=i%>></h<%=i%>> <%}%> |
for (int i=1; i<5; i++) { out.write("\r\n"); out.write("\t\t<h"); out.print(i); out.write("></h"); out.print(i); out.write(">\r\n"); out.write("\t"); } |
举例 2:
jsp 代码 |
_jspservice()方法中的代码 |
<% if(age>65){ %> 可以退休 <%}else{ %> 不能退休 <%} %> |
if(age>65){ out.write("\r\n"); out.write("\t\t 可以退休\r\n"); out.write("\t"); }else{ out.write("\r\n"); out.write("\t\t 不能退休\r\n"); out.write("\t"); }
|
jsp 指令
指令简介
1) jsp 指令(directive)是为 jsp 引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理 jsp 页面中的其余部分。
2) jsp 指令的基本语法格式:
<%@ 指令名 属性名="值" %>
举例:<%@ page contenttype="text/html;charset=gb2312"%>
注意:属性名部分是大小写敏感的
3)在目前的 jsp2.0 中,定义了 page、include 和 taglib 这三种指令,每种指令中又都定义了一些各自的属性。如果要在一个 jsp 页面中设置同一条指令的多个属性,可以使用多条指令语句单独设置每个属性,也可以使用同一条指令语句设置该指令的多个属性。
第一种方式:
<%@ page contenttype="text/html;charset=gb2312"%>
<%@ page import="java.util.date"%>
第二种方式:
<%@ page contenttype="text/html;charset=gb2312" import="java.util.date"%>
page 指令和 include 指令
1) page 指令
page 指令用于定义 jsp 页面的各种属性,无论 page 指令出现在 jsp 页面中的什么地方,它作用的都是整个 jsp 页面。为了保持程序的可读性和遵循良好的编程习惯, page 指令最好是放在整个 jsp 页面的起始位置
<%@ page [ language="java" ] [ extends="package.class" ] [ import="{package.class | package.*}, ..." ] [ session="true | false" ] [ buffer="none | 8kb | sizekb" ] [ autoflush="true | false" ] [ isthreadsafe="true | false" ] [ info="text" ] [ errorpage="relative_url" ] [ iserrorpage="true | false" ] [contenttype="mimetype [ ;charset=characterset ]" | "text/html ; charset=iso-8859-1" ] [ pageencoding="characterset | iso-8859-1" ] [ iselignored="true | false" ] %>
[1]import 属性:指定 jsp 页面转换成 servlet 时应该导入的包。
[2]pageencoding 属性:设置 jsp 页面翻译成 servlet 源文件时使用的字符集。
[3]contenttype 属性:设置 content-type 响应报头,标明即将发送到客户程序的文档的 mime 类型以及浏览器对响应内容的解码字符集。
[4]errorpage 属性:指定当前 jsp 抛出异常时的转发页面。
[5]iserrorpage 属性:指定当前页面是不是一个显示错误消息的页面,如果是,则会自动创建 exception 对象,否则就不会创建 exception 对象。
[6]session 属性:控制页面是否参与 http 会话,其本质是要不要自动创建session 隐含对象以供使用。
[7]iselignored 属性:指定当前页面是否忽略 el 表达式,如果忽略,el 表达式的内容将会原封不动的输出到浏览器端。
errorpage 和 iserrorpage:
errorpage 指定若当前页面出现错误的实际响应页面时什么. 其中 / 表示的是当前 web 应用的根目录.
<%@ page errorpage="/error.jsp" %>
在响应 error.jsp 时, jsp 引擎使用的请求转发的方式.
iserrorpage 指定当前页面是否为错误处理页面, 可以说明当前页面是否可以使用 exception 隐藏变量. 需要注意的是: 若指定
iserrorpage="true", 并使用 exception 的方法了, 一般不建议能够直接访问该页面.
如何使客户不能直接访问某一个页面呢 ? 对于 tomcat 服务器而言, web-inf 下的文件是不能通过在浏览器中直接输入地址的方式
来访问的. 但通过请求的转发是可以的!
还可以在 web.xml 文件中配置错误页面:
<error-page> <!-- 指定出错的代码: 404 没有指定的资源, 500 内部错误. --> <error-code>404</error-code> <!-- 指定响应页面的位置 --> <location>/web-inf/error.jsp</location> </error-page> <error-page> <!-- 指定异常的类型 --> <exception-type>java.lang.arithmeticexception</exception-type> <location>/web-inf/error.jsp</location> </error-page>
2) include 指令
include 指令用于通知 jsp 引擎在翻译当前 jsp 页面时将其他文件中的内容合并进当前 jsp 页面转换成的 servlet 源文件中,这种在源文件级别进行引入的方式称之为静态引入,当前 jsp 页面与静态引入的页面紧密结合为一个 servlet。
语法:
<%@ include file="relativeurl"%>
其中的 file 属性用于指定被引入文件的相对路径。
jsp 标签
概述
1) jsp 还提供了一种称之为 action 的元素,在 jsp 页面中使用 action 元素可以完成各种通用的 jsp 页面功能,也可以实现一些处理复杂业务逻辑的专用功能。
2) action 元素采用 xml 元素的语法格式,即每个 action 元素在 jsp 页面中都以 xml标签的形式出现。
3) jsp 规范中定义了一些标准的 action 元素,这些元素的标签名都以 jsp 作为前缀,并且全部采用小写,例如,<jsp:include>、<jsp:forward>等等。
<jsp:include>标签
1)<jsp:include>标签用于把另外一个资源的输出内容插入进当前 jsp 页面的输出内容之中,这种在 jsp 页面执行时的引入方式称之为动态引入。
2)语法:
<jsp:include page="relativeurl | <%=expression%>" flush="true|false" />
3)<jsp:include>标签与 include 指令的比较
○ @include 指令在翻译“主体”代码时起作用。相当于把“被包含”的 jsp 代码复制到“主体”jsp 文件中,生成一个合并之后的 servlet 源文件,所以二者在代码中不能使用相同的变量名等——凡是放在一起会冲突的内容都不被允许。
○ <jsp:include>标签会被翻译为 jspruntimelibrary 类的 include()方法,“被包含”的 jsp 页面会单独翻译、编译;每次“主体”jsp 被请求时,都会先执行“被包含”的jsp,将执行结果合并到 html 代码中,一起发送到浏览器端。所以使用<jsp:include>标签时,“被包含”的 jsp 中的代码不会和“主体”jsp 冲突。
○ 对比
|
@include 指令 |
<jsp:include>标签 |
特点 |
静态包含 |
动态包含 |
语法的基本形式 |
<%@ include file=”…”%> |
<jsp:include page=”…”/> |
包含动作发生的时机 |
翻译期间 |
请求期间 |
生成 servlet 源文件 |
一个 |
多个 |
合并方式 |
代码复制 |
合并运行结果 |
包含的内容 |
文件实际内容 |
页面输出结果 |
代码冲突 |
有可能 |
不可能 |
被包含页面中可否设置影响主页面的响应 报头 |
可以 |
不可以 |
<jsp:forward>标签
1)<jsp:forward>标签用于把请求转发给另外一个资源
2)语法:
<jsp:forward page="relativeurl|<%=expression%>" />
page 属性用于指定请求转发到的资源的相对路径,它也可以通过执行一个表达式来获得。
<jsp:param>标签
1)当使用<jsp:include>和<jsp:forward>标签引入或将请求转发给的资源是一个能动态执 行的程序时,例如 servlet 和 jsp 页面,那么,还可以使用<jsp:param>标签向这个程序传递请求参数。
语法 1:
<jsp:include page="relativeurl | <%=expression%>"> <jsp:param name="parametername" value="parametervalue|<%= expression %>" /> </jsp:include>
语法 2:
<jsp:forward page="relativeurl | <%=expression%>"> <jsp:param name="parametername" value="parametervalue|<%= expression %>" /> </jsp:include>
2)<jsp:param>标签的name属性用于指定参数名,value属性用于指定参数值。在<jsp:include>和<jsp:forward>标签中可以使用多个<jsp:param>标签来传递多个参数。
jsp 九大隐含对象
在 jsp 页面上编写 java 代码时,有九个可以直接使用的内置对象。
pagecontext pagecontext httpservletrequest request httpsession session servletcontext application httpservletresponse response servletconfig config throwable exception jspwriter out object page
为什么可以在页面使用它们,因为我们发现,页面是在service方法中进行解析的。而service方法在解析页面之前申明了。在页面设置为 iserrorpage=”true”的时候,exception对象就会显示
pagecontext pagecontext
页面的上下文, 是 pagecontext 的一个对象. 可以从该对象中获取到其他 8 个隐含对象. 也可以从中获取到当前页面的其他信息.
1) 获取其它隐含对象
getexception 方法返回 exception 隐式对象 getpage 方法返回 page 隐式对象 getrequest 方法返回 request 隐式对象 getresponse 方法返回 response 隐式对象 getservletconfig 方法返回 config 隐式对象 getservletcontext 方法返回 application 隐式对象 getsession 方法返回 session 隐式对象 getout 方法返回 out 隐式对象
1) 作为域对象
可以设置、获取属性值
public void setattribute(java.lang.string name,java.lang.object value) public java.lang.object getattribute(java.lang.string name) public void removeattribute(java.lang.string name)
3) 访问其它属性域
public java.lang.object getattribute(java.lang.string name,int scope) public void setattribute(java.lang.string name, java.lang.object value,int scope) public void removeattribute(java.lang.string name,int scope)
属性的作用范围仅限于当前 jsp 页面
httpservletrequest request
域对象,可以存取属性值,用来在域*享。httpservletrequest 的一个对象。
public void setattribute(java.lang.string name,java.lang.object value)
public java.lang.object getattribute(java.lang.string name) public void removeattribute(java.lang.string name)
属性的作用范围仅限于同一个请求.
httpsession session
域对象,可以存取属性值,用来在域*享。
代表浏览器和服务器的一次会话, 是 httpsession 的一个对象.
属性的作用范围限于一次会话: 浏览器打开直到关闭称之为一次会话(在此期间会话不失效)
servletcontext application
域对象,可以存取属性值,用来在域*享。
代表当前 web 应用. 是 servletcontext 对象.
属性的作用范围限于当前 web 应用. 是范围最大的属性作用范围, 只要在一处设置属性, 在其他各处的 jsp 或 servlet 中都可以获取到.
pagecontext, request, session, application 这四个对象也称之为域对象.
四个域对象的比较
域对象 |
作用范围 |
起始时间 |
结束时间 |
pagecontext |
当前 jsp 页面 |
页面加载 |
离开页面 |
request |
同一个请求 |
收到请求 |
响应 |
session |
同一个会话 |
开始会话 |
结束会话 |
application |
当前 web 应用 |
web 应用加载 |
web 应用卸载 |
pagecontext, request, session, application(对属性的作用域的范围从小到大)
httpservletresponse response
httpservletresponse 的一个对象(在 jsp 页面中几乎不会调用 response 的任何方法.)
servletconfig config
当前 jsp 对应的 servlet 的 servletconfig 对象(几乎不使用).
throwable exception
exception 对象:封装了当前 jsp 页面捕获到的异常信息
在声明了 page 指令的 iserrorpage="true" 时, 才可以使用.
jspwriter out
jspwriter 对象. 调用 out.println() 可以直接把字符串打印到浏览器上.
object page
指向当前 jsp 对应的 servlet 对象的引用, 但为 object 类型, 只能调用 object 类的方法(几乎不使用)
上一篇: JavaScript循环语句
下一篇: Feign源码解析系列-最佳实践