1. JSP语法分为三种不同的类型:
①编译器指令(DIRECTIVE) 例如: <%@page import="java.io.*"%>
②脚本语法(Scripting)
③动作语法(Action):
例如: <jsp:forward>, <jsp:getProperty>, <jsp:include>
2. 脚本语法:
脚本语法包括:
-- "HTML注释" : <!--comments-->
--"隐藏注释": <%--comments--%>
--"声明"
-- "表达式": 后面不能加分号
-- "脚本段": 后面必须加上分号.
3. HTML注释:
JSP语法格式如下:
<!--comment[<%= expression%>]-->或
<!--注释[]<%= 表达式%>-->
这种注释发送到客户端, 但不直接显示, 在源代码中可以看到.
4. 编译器指令:
编译器指令包含"包含指令", "页指令"和"taglib指令"
它们包含在"<%@ %>"卷标里.
两个主要的指令是page与include.
page指令的属性: language, pageEncoding, import
5. JSP声明语法格式如下:
<%! declaration; [declaration;] …%> 或
<%! 声明; [声明;] …%>, 当服务器将JSP转换为Servlet时, 会将JSP中的声明转换为成员变量,而将脚本段转换为方法中的局部变量, Servlet是单实例的, 这样成员变量的值就只能有一个,每个用户都会访问到它, 而脚本段的值则是局部变量, 每个用户访问的是偶各有一份, 互不影响.
例:
<%! int a = 3%>与
<% int a = 3%>的区别.
声明会生成成员JSP对应类的成员变量.
6. JSP脚本段, 语法格式如下:
<%code fragment %> 或
<%代码%>
转义字符: 双引号 \", 单引号 \', 反斜杠\\, 回车\r, 换行\n, 制表符\t, 退格 \b
7. 包含指令:
include指令: 向当前页中插入一个静态文件的内容.
JSP语法格式如下:
<%@ include file="relativeURL"%>或
<%@include file="相对位置"%>
8. Page指令:
"Page"指令用于定义JSP文件中的全局属性.
"<%@page %>"指令作用于整个JSP页面, 同样包括静态的包含文件, 但是"<%@page%>"指令不能作用于动态的包含文件, 比如"<jsp:include>".
可以在一个页面中用上多个"<%!@ page%>"指令, 但是其中的属性只能用一次, 不过也有例外, 那就是import属性. 因为import属性和Java中的import语句类似(import语句引入的是Java语言中的类), 所以此属性就能用多次.
无论把"<%@page%>"指令放在JSP的文件的哪个地方, 它的作用范围都是整个JSP页面. 不过, 为了JSP程序的可读性, 以及好的变成习惯, 最好还是把它放在JSP文件的顶部.
属性:
1). language = "java"
声明脚本语言的种类, 目前只能用"java"
2). import="{package.class | package.*}, …"
需要导入的Java包的列表, 这些包作用与程序段, 表达式, 以及声明, 下面的包在JSP编译时已经导入了, 所以就不需要再指明了:
java.lang.*javax.servlet.*
javax.servlet.jsp.*
javax.servlet.http.*
3) errorPage = "relativeURL"
设置处理异常事件的JSP文件.
4) isErrorPage = "true | false"
设置此页是否为出错页, 如果被设置为true, 你就能使用exception对象.
9. taglib指令
语法:
<%@ taglib uri="URIToTagLIbrary" prefix="tagPrefix"%>
用于引入定制标签库.
属性:
1) uri="URIToTagLibrary"
Uniform Resource Identifier(URI)根据标签的前缀对自定义的标签经行唯一的命名. URI可以是以下内容:
Uniform Resource Locator(URL)
Uniform Resource Name(URN)
一个相对或绝对的路径
可以是标签库的描述文件.
2) prefix = "tagPrefix"
表示标签在JSP中的名称.
在自定义标签之前的前缀, 比如, 在<public:loop>中的public, 如果这里不写public, 那么这就是不合法的, 请不要用jsp, jspx, java, javax, servlet, sun, 和sunw做为你的前缀, 这些已被Sun公司声明保留.
10. <jsp:forward>
1)<jsp:forward page={"relativeURL" | "<%expression%>"}/>
2)<jsp:forward page={"relativeURL"|"<%=expression%>"}>
<jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"/ >
[<jsp:param…/>]
</jsp:forward>
("[<jsp:param…/>]"指可以有多个"<jsp.param/>"标记)
属性:
1) page="{relativeURL | <%= expression%>}"
这里是一个表达式或是一个字符串用于说明你将要定要的文件或URL, 这个文件可以是JSP, 或程序段.
2) <jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"/ >
向一个动态文件发送一个或多个参数, 这个文件必须是动态文件. 如果想传递过个参数, 可是在一个JSP文件中使用多个"<jsp:param>"; "name"指定参数名,"value"指定参数值.
<jsp:forward>指令用于转向页面,在该指令后面的所有代码都没有机会执行了, 因为页面的流程已经转向了另外一个页面了.
Tomcat生成的代码如下:
if (true) {
_jspx_page_context.forward("ForwardTo.jsp" + (("ForwardTo.jsp").indexOf('?')>0? '&': '?') + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("username", request.getCharacterEncoding())+ "=" + org.apache.jasper.runtime.JspRuntimeLibrary.URLEncode("donaldjohn", request.getCharacterEncoding()));
return;
}
11. <jsp:include>
包含一个静态或动态文件:
JSP语法格式如下:
1)<jsp:include page="{relativeURL | <%=expression%>}" flush="true"/>
2) <jsp:include page="{relativeURL | <%=expression%>}" flush="true">
<jsp:param name="parameterName" value="{parameterValue | <%=expression%>}"/>
</jsp:include>
Java We JSP内置对象比较和分析
1. JSP内置对象:
JSP有以下九种内置对象, 包括:
request, javax.servlet.ServletRequest请求对象
response, javax.servlet.ServletResponse响应对象
pageContext, javax.servlet.jsp.PageContext页面上下文对象
session, javax.servlet.http.HttpSession会话对象
application, javax.servlet.ServletContext应用程序对象
out, javax.servlet.jsp.JspWriter输出对象
config, javax.servlet.ServletConfig配置对象
page, java.lang.Object页面对象
exception, java.lang.Throwable异常对象
request和response:
2. "request"对象代表的是来自客户端的请求, 例如我们在FORM表单中填写的信息等. 是最常用的对象. 关于它的方法使用较多的是getParameter, getParameterNames和getParameterValues, 通过调用这几个方法来获取请求对象中所包含的参数的值
getParameter()方法是getParameterValues()方法的特例, 表示请求参数值只有一个, 如果请求参数值由多个, 请使用getParameterValues方法, 在多选框的情况下, 需要使用getParameterValues方法来获取用户所选择的多个复选框的值.
<input type="checkbox" name = "interest">football
<input type="checkbox" name = "interest">basketball
<input type="checkbox" name = "interest">volleyball
3. "response" 对象代表的是对客户端的响应, 也就是说可以通过"response"对象来组织发送到客户端的数据, 但是由于组织方式比较底层, 所以不建议普通读者使用, 需要向客户端发送文字时直接使用"out" 对象即可. response可以使用在文件下载中.
4. "pageContext"对象可以成为"页面上下文"对象, 代表的是当前页面运行的一些属性, 常用的方法包括findAttribute, getAttribute, getAttributesScope和getAttributeNamesInScope, 一般情况下"pageContext"对象用到的也不是很多, 只有在项目所面临的情况比较复杂的情况下, 才会利用页面属性来属猪处理. 一般Servlet容器会使用该对象.
5. session对象:
代表服务器和客户端所建立的会话, 当需要在不同的JSP页面中保留客户信息的情况下使用, 比如在线购物, 客户轨迹跟踪等.
为什么要引入session:
Http是无状态(stateless)的协议
Web Server对每一个客户端请求都没有历史记忆
Session用来保存客户端状态信息.
6. application对象:
"application"对象负责提供应用程序在服务器中运行时的一些全局信息, 常用的方法有getMimeType和getRealPath等.
7. out对象代表了向客户端发送数据的对象, 与"response"对象不同, 通过"out"对象发送的内容将是浏览器需要显示的内容, 是文本一级, 可以通过"out"对象直接对客户端写一个由程序动态生成的HTML文件, 常用的方法包括: print, println, clear, clearBuffer, flush, getBufferSize, getRemaining, 这是因为"out" 对象内部包含了一个缓冲区, 所以需要一些对缓冲区进行操作的方法.
8. config, page, exception:
"config"对象提供了一些配置信息, 常用的方法有getInitParameter()和getInitParameterNames(),以获得Servlet初始化时的参数.
"page" 对象代表了正在运行的由JSP文件产生的类对象, 不建议一般读者使用.
"exception"对象则代表了JSP文件运行时所产生的异常现象, 此对象不能再一般JSP文件中直接使用, 而只能在使用了 "<%@ pageisErrorPage="true"%>"的JSP文件中使用.
9. request请求对象:
getAttribute()
原型: public java.lang.Object getAttribute(java.lang.String name)
说明: 以对象的形式返回特定名称的属性值, 这个方法允许Servlet引擎给出一个客户请求的特定信息.
如果说给名称的属性不存在,将返回空值.
参数: name一个表示属性名的字符串.
返回值: 一个包含属性值的对象, 当属性不存在时为空.
10. request的setAttribute与getAttribute方法一般都是成对出现的, 首先通过setAttribute方法设置属性与属性值, 然后通过getAttribute方法根据属性获取到与该属性对应的对象值(获取后一般都需要进行向下类型转换, 将属性转换为真正的对象). setAttribute与getAttribute方法都是在服务器端内部执行的, 客户端不知道服务器是否执行了这两个方法.
11. request的getParameter()方法的作用是获取到客户端, 通过表达或url请求参数所发送过来的参数值, 是客户端与服务器之间的交互, 服务器端要想获取到客户独拏发送过来的数据, 就需要使用getParameter()方法来获取, 没有与getParameter()方法对应的setParameter()方法.
12. request对象内数据的存货范围就是request对象的存货范围内, 当客户端向服务器端发送一个请求, 服务器想客户端返回一个响应后, 该请求对象就被小会了; 之后想服务器端发送新的请求时, 服务器会创建新的request对象, 该request对象与之前的request对象没有热河关系, 因此无法获得在之前的request对象中所存放的任何数据.
13. session对象内数据的存活范围也就是session对象的存活范围(只要浏览器不关闭, session对象就会一直存在, 事实上, 这种说法不正确). 因此在同一个浏览器窗口中,不论想客户端发送多少请求, session对象只有一个.
14. application(应用对象):存活范围最大的对象, 只要服务器没有关闭,application对象中的数据就会一直存在. 在整个服务器的运行当中, application对象只有一个.
15. request, session和application这3个对行的范围是逐个增加的, request只在一个请求的范围内; session是在浏览器窗口的范围内, application则是在整个服务器的运行过程中.
application.getRealPath()很重要.