??xml version="1.0" encoding="utf-8" standalone="yes"?>
JSP学习之四Q?/span>JSP指o
CoffeeTree 2009-1-5
一?/span>指o基础
a) 指o的格式:<%@ 指o?/span> [….一个或多个属?/span>….] %>Q?/span>
b) 指o的作用:告诉容器在解?/span>JSP时的一些约定;
c) 可用?/span>JSP指o
i. page指o;
ii. taglib指o
iii. include指o
d) JSP指o的处理(注意各个动作所发生的阶D)
二?/span>page指o
告诉容器译阶段如何处理JSP文g?/span>
1. language属?/span> Q?/span><%@ page language=”java” %> 此ؓ默认Q?/span>
2. extends属?/span> Q用超c,基本不用Q?/span>
3. import属?/span> Q?/span><%@ page import=”java.util.*” %> Q?/span>
4. session属?/span> Q?/span>true | false Q?/span>
5. info属?/span> Q指定页面信息,基本不用Q?/span>
6. isELIgnored属?/span> Q?/span>true | false Q?/span>
7. isErrorPage属?/span> Q?/span>true | false Q?/span>
8. errorPage属?/span> Q?/span><%@ page errorPage=”error.jsp” %> Q?/span>
9. contentType属?/span> Q?/span>text/html | text/xml Q?/span>
三?/span>taglib指o
taglib指o的工作流E在?/span> JSP学习之三Q?/span>EL & JSTL(?/span>) 》中已经描述Q关键字Q?/span>taglib映射Q?/span>TLD Q?/span>
1. uri属?/span>
taglib指o告诉容器?/span>JSP用与?/span>uri相关联的标记库?/span>
2. tagdir属?/span>
指定标记库具体目录。(必须?/span>/WEB-INF/tags目录或子目录下)
3. prefix属?/span>
指定一个前~?/span>
隐式包含介绍Q?/span>
如果你开发了一个项目,每一?/span>JSP都用C10个不同的标记库,在每?/span>JSP前面都指?/span>10?/span>taglib指o会很ȝQ此旉式包含可以方便的解决此问题,其处理方法类gC语言中引入一?/span>.h文g?/span>
WEB.xmldQ?/span>
<jsp-config>
<jsp-property-group>
<uri-pattern> index.jsp</uri-pattern>
<include-preclude> /WEB-INF/jspf/pre.jspf</include-preclude>
</jsp-property-group>
</jsp-config>
/WEB-INF/jspf/pre.jspfQ?/span>
<%@ taglib prefix=”c” uri=http://java.sun.com/jsp/jstl/core %>
<%@ taglib prefix=”fmt” uri=http://java.sun.com/jsp/jstl/format %>
四?/span>include指o
include指o告诉容器Q在译阶段把其他文件的内容与当?/span>JSP合ƈ?/span>
1Q?span style="font: 7pt 'Times New Roman'"> 所包含的所?/span>JSP代码都不会被执行Q甚至不会被~译?/span>
2Q?span style="font: 7pt 'Times New Roman'"> 首先合ƈ文gQ然后合q后的整个输ZZ个单元得到翻译?/span>
3Q?span style="font: 7pt 'Times New Roman'"> 如果所包含的文件有所改动Q容器没有一般的Ҏ来知道这一点,只能重新~译整个译单元?/span>
<jsp : include >动作?span style="color: red">h时发?/span>Q可以克服以上限制?br />
CoffeeTree 2008-12-27
一?/span>JSTLQ?/span>JSP Standard Tag LibraryQ:JSP 标准标记?/span>
1. JSTL应用领域Q?/span>
a) 讄作用域变量、显C辑ּ和倹{删除作用域变量、捕获异常的通用标记Q?/span>
b) 条g程控制标记Q包?/span>if?/span>switch…case之类的构造;
c) 循环标记Q用于对集合中或计@环中的元素进行P代处理;
d) URL标记Q用于在JSP中处?/span>URL以及通过URL加蝲资源Q?/span>
e) 支持应用国际化的标记Q?/span>
f) 格式化日期和数字的标讎ͼ
g) 用于字符串处理的一l?/span>EL可访问函数?/span>
2. 标记库剖析:
下图构成了一个标记库的代码和描述文g
3. JSTL标记
a) 核心标记
b) 格式化标?/span>
c) XML标记
d) SQL标记
二?/span>探烦core
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
1. 核心标记是一l最常用?/span>JSTL标记?/span>
a. 用于条g程控制?/span><c:if>;
b. 用于循环?/span><c:forEach> ?/span><c:forTokens>;
c. 用于互斥代码中控刉择程?/span><c:choose>…<c:when>…<c:otherwise>;
d. 用于处理作用域变量的<c:set>?/span><c:remove>;
e. 用于昄变量和表辑ּ?/span><c:out>;
f. 用于处理异常?/span><c:catch>;
g. 用于创徏和处?/span>URL?/span><c:url>.
value 属性用来指定基?/span> URLQ然后在必要时标记对其进行{换。如果这个基?/span> URL 以一个斜杠开始,那么会在它前面加?/span> servlet 的上下文名称。可以?/span> context 属性提供显式的上下文名U。如果省略该属性,那么׃用当?/span> servlet 上下文的名称?/span>(如果q个基本 URL 不是以斜杠开始的Q那么就认ؓ它是一个相?/span> URLQ这时就不必d上下文名U?/span>)
如果?/span> var 属性提供了一个|q可以同时ؓ scope 属性提供一个相应的|q是可选的Q,那么生成的 URL 赋值给q个限定了作用域的指定变量?/span>
?/span>JSP中用脚本元素的主要需求:
1.
2. 讄JSP面的局部变量,q在以后讉KQ?/span>
3.
4. 讉K对象的性质Q?/span>
5. 调用JavaBean或其?/span>Java对象的方法;
但是如今已经不提倡在JSP中用脚本元素:
1. 如果使用Java代码Q开发h员就可能用到整个APIQ这样就会很Ҏ创徏Z可移植的代码Q而对某种机器或系l存在依赖性;
2. ׃能通过Java语言讉Kpȝ元素Q可能会?/span>Jsp中入应用业务逻辑Q这׃“污染”应用的表C层Q?/span>
3. 嵌入?/span>Jsp中的Java代码很难阅读和调试,因此很难l护Q?/span>
引入EL?/span>JSTL可以写出完全不含脚本的程序,前两要求由JSTL处理Q后三项?/span>EL处理
二?/span>EL?/span>
1. EL命名变量Q附属到JSP作用域对象上的属性?/span>${属性名}
2. EL表达式的使用
a) 内联攄在模板数据中Q?/span>
b) 攑֜JSP动作的属性中Q?/span>
3. “ . ” ?/span> “ [ ] “ 操作W访问对象的性质
4. EL表达式中可用的操作符
a) 术操作W?/span> Q?/span>+?/span>-?/span>*?/span>$?/span>/?/span>div?/span>%?/span>mod
b) 逻辑操作W?/span> Q?/span>&&?/span>and?/span>||?/span>or?/span>!?/span>not
c) 比较操作W?/span> Q?/span>==?/span>eq?/span>!=?/span>ne?/span><?/span>lt?/span>>?/span>gt?/span><=?/span>le?/span>>=?/span>ge
i. ELq行比较ӞL?#8220;合理?#8221;转换所比较的数据类型?/span>
d) 其他 Q?/span>Emptyq算W、条件运符?/span>()q算W?/span>
i. Empty试条g
5. EL隐式对象
a) JSP隐式对象
i. pageContext
${pageContext.request.queryString} 取得h的参数字W串
${pageContext.request.requestURL} 取得h?/span>URLQ但不包括请求之 参数字符?/span>
${pageContext.request.contextPath} 服务?/span>web application 的名U?/span>
${pageContext.request.method} 取得HTTP 的方?/span>(GET?/span>POST)
${pageContext.request.protocol} 取得使用的协?/span>(HTTP/1.1?/span>HTTP/1.0)
${pageContext.request.remoteUser} 取得用户名称
${pageContext.request.remoteAddr } 取得用户?/span>IP 地址
${pageContext.session.new} 判断session 是否为新?/span>
${pageContext.session.id} 取得session ?/span>ID
${pageContext.servletContext.serverInfo} 取得L端的服务信息
b) 作用域访问隐式对?/span>
i. pageScope
ii. requestScope
iii. sessionScope
iv. applicationScope
c) 参数讉K隐式对象
i. param
ii. paramValues
d) 首部讉K隐式对象
i. header
${header["User-Agent"]} 获得览器版?/span>
ii. headerValues
iii. cookie
e) 初始化参数访问隐式对?/span>
i. InitParam
6. EL函数
1. 指o元素
a. page指o
b. taglib指o
c. include指o
2. 模板数据
3. 动作
a. 标准动作
a) <jsp:useBean>
b) <jsp:getProperty>
c) <jsp:setProperty>
d) <jsp:include>
b. 定制动作
4. 脚本元素
a. 声明 <%!......%>
a) 声明脚本中声明常量、变量、方法可以在JSP面中由其他脚本?/span>EL表达式?/span>JSP动作使用?/span>
b. 脚?/span> <%.....%>
a) 脚本元素可以和模板数据合用来控制JSP的流E?/span>
c. 表达?/span> <%=……%>
a) 表达式脚本可以出现在JSP动作、模板数据中?/span>
二?/span>EL?/span>JSTL
1. EL (Expression Language) Q?/span>JSP表达式语a
a. EL的用范?/span>
a) EL可以出现在模板数据的M位置Q?/span>
b) 可以攑֜取表辑ּ作ؓ参数的动作属性中?/span>
b. EL隐式对象
2. JSTL(JSP Standard Tag Library)Q?/span>JSP标准标记?/span>
a) 程控制
b) 循环
c) 数据输出
d) 国际?/span>
e) XML文档
f) 数据?/span>
通过EL+JSTL开?/span>JSP可以解决JSP中因内嵌q多JAVA代码而难以维护的问题Q这也是最佛_늚一U要求?/span>
早期JSP出现之前Q所有网都是基?/span>HTML所~写出来Q用戯问一个站ҎE:
׃WEB服务器的功能限制Q其存储器中只能存储数量有限的静?/span>HTML面Q维护及其不便,CGIQ?/span>Common Gateway Interface 公共|关接口Q诞生:
到此表面上似?/span>CGI已经很完,但是当多个用户同时访问该CGI的时候,其缺陷就会暴露无遗:每个用户的请求,操作pȝ都会开辟一个进E,带来很大开销Q基?/span>Javaq_可以在运行时动态加载类Q?/span>servlet诞生Q?br />
从上囑֏以很Ҏ的看?/span>servlet的缺?/span>--J琐Q程序员每次要维护网站,都必dsevlet源码q行修改Q然后编译,部vQ测试,JSP诞生Q?/span>
JSP优点Q?/span>
1. 提供模板机制Q事实上JSP是带有一些特D标讎ͼUCؓQ模板)?/span>HTML面Q?/span>
2. 只要JSP有修改,JSP容器会自动检和重新~译?/span>
一?span style="font-family: 宋体">W一?/span>JSP
1. 安装环境Q?/span>
安装前先保已经安装JDK(下蝲)
Q进行简单的配置后便可安?/span>Tomcat,配置Ҏ|上有很多介l,在此不再赘述?/span>Tomcat安装完成后安装开发工P在这我选择Myeclipse AllInOne?/span>(下蝲)Q安?/span>Myeclipse有一个过E很漫长Q耐心{待.Q本人非常支持正版,但网上有很多注册码)Q安装完?/span>Myeclipse中对Tomcatq行配置Q同样配|教E网上有很多Q不再赘q?/span>2. 创徏一?/span>JSP看看效果Q?/span>
q行Myeclipse->File->New->Web Project起名HelloProject,展开目看看都有些什么:
其中有个index.jspq就是我们这个项目的入口Q双?/span>index.jsp打开原来的E序替换Z面的E序Q看不懂没关p,复制_脓可以)Q?/span>
<%@taglib prefix="CoffeeTree" tagdir="/WEB-INF/tags"%>
<html>
<head>
<title>My first jsp</title>
</head>
<body>
<h1>This is my first jsp page</h1><hr>
I want to say:<CoffeeTree:hello/>
</body>
</html>
?/span>WEB-INF目录下新建文件夹tasgs,?/span>tags目录下新建文本文?/span>hello.tag,?/span>hello.tag中写入:<b>hello everyone!</b>
启动Tomcat,通过刚才配置?/span>Tomcat发布该项目(如何发布|上介绍很多Q,打开览器,在地址栏输入:http://localhost:8080/HelloProject如果昄如下Q那么恭喜你的第一?/span>JSP创徏成功了!
3. 上面E序的解释:
前面提过其实JSP是一个带有特D标{HTML面Q特D标{什么意思呢Q就是指不是HTML定义的标{,JSP这些特D标{放在一个叫“标签?#8221;的地方:
<%@taglib prefix="CoffeeTree" tagdir="/WEB-INF/tags"%>
上面q句话就是告?/span>JSP解释器,q张JSP中要用到些标{定义所在,q且告诉JSP解释器,q些标签有个标记CoffeeTree,x有标{։面都有个标记,如:<CoffeeTree:hello/>,tagdir告诉标签攑֜什么地方,?/span>WEB-INF?/span>tags目录下。当JSP解释器遇到该标签的时候就通过该\径找到标{定义Qƈ按照定义的约定去解释?/span>