Posts Tagged ‘元素’

深入探讨CSS中字体元素

星期三, 06月 4th, 2008

字体de处理在网页设计中无论怎么强调也不为过,毕竟网页使用来传递信息de,而最经典最直接de信息传递方式就是文字,所以,了解一点字体de基本知识对于设计来说还是非常重要de.

   中文和英文de最大区别就是中文是方块字,英文是拼音文字,这对字体de处理de影响是巨大de.看看下面de图示就会发现,英文字体里de那些变化在中文字体里都弱化了.



   作为中文de读者,习惯性de接受方块形状做为阅读de单元,其实对于眼睛来说,这是一种容易疲劳de方式,阅读de时候您de视线实际上是跟随整行文字de外形.看看这个例子.
   NOW I”VE TRIED TO TALK TO YOU AND MAKE YOU UNDERSTAND
   Now I”ve tried to talk to you and make you understand
   哪一行更容易读呢?
   第一行和中文de情形有些类似,不同de是,每个中文单字就好比一幅画,其变化要比26个英文字母丰富de多,对于我来说,我接受了这个特点,但是设计时 还是有一些问题需要考虑,我不是设计师,如果说de不对,请在下面留言讨论.这些内容在我教授Typographyde时候是作为一般原则来提出de.我也告诉 学生一句话:“The purpose of rule is to break the rule.” 设计原则本身就是为了打破原则,这也是所谓decreativityde表现.问题是您需要先知道原则,并且顺从原则进行练习,只有在您熟悉原则之后才有可能 打破原则显现您de创造性,打破原则不意味着原则de缺陷和错误,只是您对这些原则de别出心裁de使用,您打破了一些,同时也对您所破坏de部分做一定de补偿,似 乎很有点哲学de味道.
   我个人以为比较重要de几个原则是(适用于英文de情形):
   字体de选用要考虑该文字de用途,是做标题呢,还是段落文字?
通 常来说 san serif 字体适合作为标题使用,例如 Arial;serif 字体适合作为段落文字使用,例如Time New Roman.对于网页设计来说,有几个字体是我强烈推荐de,verdana, tahoma, georgia.事实上,像 Verdana 这个字体是由世界上顶级de字体设计师花了差不多两年时间设计出来de,Microsoft负责买单, 然后免费提供给用户,这个字体是IE安装de一部分,如果您安装了IE 4以上de版本,您de电脑里就一定有这个字体,所以您不必担心用户是否有这个字体.它de设计考虑了字体在屏幕上显示de可能面对de问题,而且提供了近乎完美de 答案.唯一de麻烦是它de近乎完美造成了我使用de时候没有了个性,因为每个人都使用它.
   字号de大小?
   论坛里很多讨论,关于pixle 好还是point好? 我就不重复了,在这里我想提出de是字号de大小在CSS里,有很多不同de单位,大致上有三类:
   绝对大小:mm, cm, in, pt, pc
   相对大小:em, ex
   相对于设备:px
   可能要多说几句de是 em 和 ex,em 在 css 里代表就是字体字号de大小,例如对于12 ptde字体来说, 1 em 就等于12 pt 例子:
p {
font-size: 10pt;
text-indent: 1em
}
   也许您会说我可以用text-indent: 10pt来实现同样de效果啊,但那只是在理想de情形下,如果用户觉得他de浏览器设置字体大小为14pt更好de时候,您所设计de比例就失去了,所以相对尺寸对于网页de可伸缩性设计是非常有利de.
   ex 和 em 类似,但不尽相同, 回到上面de图示,x-height 对于每一种字体来说是不同de,ex 是根据字体de x-height 来定义字体de大小.
   对齐方式?
   最好使用左对齐,尤其要避免使用左右对齐,除非您有一个特殊de设计目de,左对齐时右侧de不对齐正是为了阅读de方便,右侧de变化对您de视力是一个帮助,它借助变化告诉您de眼睛可以换行了.
   行间距?
   行间距取决于字体de大小,一般来说,小de字号需要大一点de行间距来便于阅读,中文字体在网页上如果没有行间距de设定,对于阅读大段文字来说是读者de灾 难,所以适当设定line-height是非常必要de.一般地, line-height 在网页设计中应该是字体大小de1.5倍到2倍.Word 和其它de文本编辑软件里, 一般设定字体de120%作为缺省de行间距.css里de line- height 设定,是均分后加在每一行de上下,也就是说,如果 line-height 设定为 20px de话,那么每一行文字de上下各有10pxde间距.
   字间距和字符间距?
   很特殊de用途,对中文来说这两者应该是相同de.这个设定de本身就是为了解决某些字体设计上缺陷,来增加文字de可读性.
   每次写专栏de文章都有这种感觉,越写越不知道怎么结尾, 这可能就是随笔方式de弊病吧.请留言讨论,我这个就算是抛砖了.

元素水平居中方案全集

星期三, 06月 4th, 2008

先来看我一个简单XHTML/HTML文件相关代码(部分),我de目de是让#container水平居中.


<body>
<div?id=”container”>
<h1>content</h1>
<p>Lorem?ipsum?dolor?sit?amet,?consectetuer?adipiscing?elit.Phasellus?varius?eleifend.</p>
</div>
</body>

使用自适应边界(auto?margin)
水平居中任意元素de首选办法是使用边界(margin)性质(property),并把左右之值设置为auto.但您必须为#container指定一个宽度.

div#container?{
margin-left:?auto;
margin-right:?auto;
width:?168px;
}
这个方案在任何当代浏览器上都有效,即使是IE6,前提是在web标准兼容模式下(compliance?mode).不幸de是,它不会在先前版本deIE/Win中工作.我为此列一个表格:


浏览de自适应边界支持一览表?浏览器?版本?支持?
Internet Explorer 6.0, compliance?mode?是?
Internet Explorer 6.0, quirks?mode?否?
Internet Explorer 5.5 Windows?否?
Internet Explorer 5.0 Windows?否?
Internet Explorer 5.2 Macintosh?是?
Mozilla 所有当前版本?是?
Mozilla Firefox?所有版本?是?
Netscape?4.x?否?
Netscape?6.x ?是?
Opera?6.0,?7.0?Macintosh?and?Windows?是?
Safari?1.2?是?

尽管受到浏览器支持de限制,大部分设计师还是提倡您尽可能这样做.但我依然可以使用CSS应付一切情况.

使用文本排列(text-align)
此方案需要使用到text-align性质,应用给body元素并且赋予centerde值.

body{
text-align:center;
}
它公正地对待各种浏览器,十分彻底,唾手可得.然而,这是赋予文本de性质,它使#container中de文本也居中了.所以,在布局上我还得做一些额外工作:

div#container{
text-align:?left;
}
这样才可以把文本de对齐方式返回默认状状态.

综合边界和文本排列
因为文本排列向后兼容,当代浏览器也支持自适应边界,很多设计师把他们结合起来,实现跨浏览器使用.

body{
text-align:?center;
}
#container?{
margin-left:?auto;
margin-right:?auto;
border:?1px?solid?red;
width:?168px;
text-align:?left
}
唉,依然不完美,因为还是一个黑客技巧?(hack).您不得不为文本排列写下多余de规则.但现在,我可以使用更完美de跨浏览器de方案.

负边界解决方案
此方案得结合使用绝对定位(absolute?positioning?).首先,把#container绝对定位并左偏移 50%,这样,#containerde左边界就是页面分辨率de一半.下一步,把#containerde左边界设置为负值,值大小为#container宽 度(width)de一半.

#container?{
background:?#ffc?url(mid.jpg)?repeat-y?center;
position:?absolute;
left:?50%;
width:?760px;
margin-left:?-380px;
}
看,没有任何黑客技巧(no?hacks)!连Netscape?4.x都支持!

CSS中div、span和center元素

星期三, 06月 4th, 2008

  <div>和<span>用来为内容指定样式或绑定脚本.虽然大多数HTML元素可以通过style属性来设置样式信息,但是许多HTML元素有自己默认de样式,该样式可能和style定义de样式混合甚至冲突,是我不希望看到de.如:<strong style = “color: red”>I am strong!</strong>.和其他html元素不同,<div>和<span>没有默认de显示样式.所以可以通过它们来指定样式.

  (1)<div>(division)是块级元素,可以包含段落、标题、表格,乃至诸如章节、摘要和备注等.由于是块级元素,在段落开始、结束处会插入一个换行.<div align=””>…</div>用来设置内容块de位置.可以使用<div>来为文档de任意部分绑定脚本或样式.

  (2)和<div>不同,<span>是一个行内元素,不会引起换行.它是一个逻辑化de内嵌分组元素.最常见de使用方式是用它来为一段文本中de几个单词甚至某几个字符指定样式.

  (3)可以将需要居中de内容放到<center></center>中间.<center>与<div align = ”center”>作用相同.

  举例:<span>元素de使用.

<p>In this sentence <span class = “important”>some of the text is important!</span></p>

css元素定位

星期三, 06月 4th, 2008

css元素定位

1. position:static|无定位
position:static是所有元素定位de默认值, 一般不用注明,除非有需要取消继承de别de定位

example:
#div-1 {
position:static;
}

2. position:relative|相对定位
使用position:relative,就需要top,bottom,left,right4个属性来配合,确定元素de位置.
如果要让div-1层向下移动20px,左移40px:

example:
#div-1 {
position:relative;
top:20px;
left:40px;
}

如果用到相对定位,紧随他de层divafter是不会出现在div-1de下方,而是和div-1在同一个高度出现.

可见, position:relative;并不是很好用.

3. position:absolute|绝对定位
使用position:absolute;,能够很准确de将元素移动到您想要de位置,让我将 div-1a 移动到页面de右上角:

example:
#div-1a {
position:absolute;
top:0;
right:0;
width:200px;
}

使用绝对定位dediv-1a层前面de或者后面de层会认为这个层并不存在,丝毫不影响到他们.所以position:absolute;用于将一个元素放到固定de位置很好用,但是如果需要div-1a层相对于附近de层来确定位置就不要实现了.
*这里有个Win IEdebug需要提到,就是如果为绝对定位de元素定义一个相对de度,那么在IE下它de宽度取决于父元素de宽度而不是整个页面de宽度.

4. position:relative position:absolute|绝对定位 相对定位
如果给父元素(div-1)定义为position:relative;子元素(div-1a)定义为position:absolute,那么子元素(div-1a)de位置将相对于父元素(div-1),而不是整个页面.
让div-1a定位于div-1de右上角:

example:
<div id=”div-1″>
<div id=”div-1a”>
this is div-1a element.
</div>
this is div-1 element.
</div>

#div-1 {
position:relative;
}
#div-1a {
position:absolute;
top:0;
right:0;
width:200px;
}

5. two column layout|两列布局
让我实践position:relative position:absolutede理论,实现两列布局.

example:
<div id=”div-1″>
<div id=”div-1a”>this is the column-one</div>
<div id=”div-1b”>this is the column-two</div>
</div>

#div-1 {
position:relative;/*父元素相对定位*/
}
#div-1a {
position:absolute;/*子元素绝对定位*/
top:0;
right:0;
width:200px;
}
#div-1b {
position:absolute;/*子元素绝对定位*/
top:0;
left:0;
width:200px;
}

注意,在这个例子中会发现父元素de高度不会随着子元素de告诉变化,所以如果父元素de背景和边框需要定义一个足够高de高度才能显示出来.

6.float|浮动对齐
使用float定位一个元素有float:left;&float:right;两种值.这种定位只能在水平坐标定位,不能在垂直坐标定位.而且让下面de元素浮动环绕在它de左边或者右边.

example:
#div-1a {
float:left;
width:200px;
}

7.make two clumn with float|浮动实现两列布局
如果让一个元素float:left;另一个float:right;控制好他们de宽度,就能实现两列de布局效果.

example:
#div-1a {
float:left;
width:150px;
}
#div-1b {
float:left;
width:150px;
}

8.clear float|清除浮动
如果您不想让使用了float元素de下面de元素浮动环绕在它de周围,那么您就使用clear,clear有三个值,clear:left;(清除左浮动),clear:right;(清除右浮动),clear:both;(清除所有浮动).

example:
<div id=”div-1a”>this is div-1a</div>
<div id=”div-1b”>this is div-1b</div>
<div id=”div-1c”>this is div-1c</div>

#div-1a {
float:left;
width:190px;
}
#div-1b {
float:left;
width:190px;
}
#div-1c {
clear:both;
}

至此,这个cssde定位部分就结束了,您可以动手体会体会加深印象

用定制标签库和配置文件实现对JSP页面元素的访问控制

星期一, 06月 2nd, 2008

控制客户端访问是开发一个基于B/Sde架构de系统de开发者必须考虑de问题.JSPSERVLET规范de基于配置文件de安全策略对资源de控制是以文件为单位de,即只可以定义某个视图全部可以或全部不能被访问.一个比较复杂de系统往往要要求对视图de一部分(如JSP页面里de一个按钮)提供访问控制,只允许被某种角色de用户访问.如果采用可编程de安全策略,因为对用户角色和操作de定义在开发时不能定义,而且这种策略加大了程序员de工作量,它可能不是一种好de办法.

我采用定制标签库和和配置文件来解决这个问题:把要权限控制deJSP页面元素如BUTTON,作为标签de内容.为受保护de内容起一个唯一de名称,把这个名称作为标签de一个属性.某个角色对某个页面元素或一组页面元素是否有权限,在XML配置文件中描述.

例如,下面deJSP页面有“详细”和“修改”两个按钮.

<%@ taglib uri=”http://mytag” prefix=”custTag” %>

<html>

<head>

<title>test</title>

</head>

<body >

<form name=”form1″ >

<table width=”600″ border=”0″ cellspacing=”0″ cellpadding=”2″ >

<tr>

<td>

<custTag:JspSecurity elementName=”employeedetail” >

<input type=”button” name=”detail” value=”详细” >

</custTag:JspSecurity>

<custTag:JspSecurity elementName=”employeemodify” >

<input type=”button” name=”modify” value=”修改” >

</custTag:JspSecurity>

</td>

</tr>

</table>

<br>

</form>

</body>

下面XML配置文件内容表示对角色为commonde用户,只对名为employeedetail de页面元素即“详细”按钮有权限,对角色为“admin”de用户,对名为employeedetail employeemodifyde页面元素即两个按钮都有权限.

<?xml version=”1.0″ encoding=”GB2312″?>

<security>

<htmlElement name=”employeedetail” >

<roleName name=”common” />

<roleName name=”admin” />

</htmlElement>

<htmlElement name=”employeemodify” >

<roleName name=”admin” />

</htmlElement>

</security>

定制标签类JspSecurityTag继承了BodyTagSupport类.BodyTagSupport有一个变量bodyContent指向起始标志和结束标志之间de内容.JspSecurityTagde私有静态变量roleList保存从XML文件中取到角色和页面元素de对应集合,私有变量ElementName对应页面元素de名称.当解析该定制标签时,首先先取到页面元素de名称,再取到当前用户de角色,如果角色有该页面元素de权限,就显示标签正文(即页面元素),否则不显示.

Pagekage com.presentation.viewhelper.JspSecurityTag;

import javax.servlet.jsp.tagext.*;

import javax.servlet.jsp.*;

import java.util.*;

import org.xml.sax.*;

import org.xml.sax.helpers.*;

import org.w3c.dom.*;

import java.io.*;

import javax.xml.parsers.*;

public class JspSecurityTag extends BodyTagSupport {

//保存从XML文件中取到角色和页面元素de对应集合

private static ArrayList roleList;

//页面元素de名称

private String elementName;

public void setElementName(String str)

{

this.elementName=str;

}

public int doAfterBody() throws JspException{

if(roleList==null)

{

roleList=getList();

}

try{

//如果认证通过就显示标签正文,否则跳过标签正文,就这么简单

if(isAuthentificated(elementName))

{

if(bodyContent != null){

JspWriter out=bodyContent.getEnclosingWriter();

bodyContent.writeOut(out);

}else

{

}

}

}catch(Exception e){

throw new JspException();

}

return SKIP_BODY;

}

//XML配置文件中取到角色和页面元素de对应,保存到静态deArrayList

private ArrayList getList()

{

DocumentBuilderFactory dbf =

DocumentBuilderFactory.newInstance();

DocumentBuilder db = null;

Document doc=null;

NodeList childlist = null;

String elementName;

String roleName;

int index;

ArrayList theList = new ArrayList();

try{

db = dbf.newDocumentBuilder();

}catch(Exception e)

{

e.printStackTrace();

}

try{

doc = db.parse(new File(”security.xml”));

}catch(Exception e)

{

e.printStackTrace();

}

//读取页面元素列表

NodeList elementList = doc.getElementsByTagName(”htmlElement”);

for(int i=0;i<elementList.getLength();i )

{

Element name = ((Element)elementList.item(i));

//页面元素de名称

elementName = name.getAttribute(”name”);

//该页面元素对应de有权限de角色de列表

NodeList rolNodeList = ((NodeList)name.getElementsByTagName(”roleName”));

for(int j=0;j<rolNodeList.getLength();j )

{

//有权限de角色de名称

//roleName = ((Element)rolNodeList.item(j)).getNodeValue();

roleName = ((Element)rolNodeList.item(j)).getAttribute(”name”);

theList.add(new ElementAndRole(elementName,roleName));

}

}

return theList;

}

//检查该角色是否有该页面元素de权限

private boolean isAuthentificated(String elementName)

{

String roleName = “”;

//在用户登陆时把该用户de角色保存到SESSION中,这里只是直接从SESSION中取用//户角色.

roleName=this.pageContext.getSession().getAttribute(”rolename”);

// roleList包含elementName属性为elementName,roleName属性为roleNamede//ElementAndRole对象,则该角色有该页面元素de权限

if(roleList.contains(new ElementAndRole(elementName,roleName)))

{

return true;

}

}

return false;

}

//表示角色和页面元素de对应de关系de内部类

class ElementAndRole{

String elementName;

String roleName;

public ElementAndRole(String elementName,String roleName)

{

this.elementName=elementName;

this.roleName=roleName;

}

public boolean equals(Object obj)

{

return(((ElementAndRole)obj).elementName.equals(this.elementName)&&((ElementAndRole)obj).roleName.equals(this.roleName));

}

}

}

在标签库能被JSP页面使用前,要做以下三个步骤

1、 JSP页面中包括一个taglib元素,确定需要加载到内存de标签库.前面deJSP文件de第一行:<%@ taglib uri=”http://mytag” prefix=”custTag” %>做de就是这件事.

2、 在配置文件web.xml中使用taglib元素确定TLD文件de位置.在web.xml中增加:

<taglib>

<taglib-uri>http://mytag</taglib-uri>

<taglib-location>

/WEB-INF/mytag.tld

</taglib-location>

</taglib>

3TLD文件必须使用taglib元素标识每个定制标签极其属性.

下面是使用这个标签库对应deTLD文件

<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

<!DOCTYPE taglib

PUBLIC “-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN”

“http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd”>

<taglib>

<tlibversion>1.0</tlibversion>

<jspversion>1.1</jspversion>

<shortname>myTag</shortname>

<uri/>

<tag>

<name>JspSecurity</name>

<tagclass>com.presentation.viewhelper.JspSecurityTag</tagclass>

<info>

JspSecurityTag

</info>

<attribute>

<name>elementName</name>

<required>true</required>

<rtexprvalue>true</rtexprvalue>

</attribute>

</tag>

</taglib>

十二、脚本元素、指令和预定义变量

星期一, 06月 2nd, 2008

12.1 JSP脚本元素
   JSP脚本元素用来插入Java相关代码,这些Java相关代码将出现在由当前JSP页面生成deServlet中.脚本元素有三种格式:
表达式格式<%= expression %>:计算表达式并输出其结果.
Scriptlet格式<% code %>:把相关代码插入到Servletdeservice方法.
声明格式<%! code %>:把声明加入到Servlet类(在任何方法之外).
   下面我详细说明它们de用法.
   12.1.1 JSP表达式
   JSP表达式用来把Java数据直接插入到输出.其语法如下:
<%= Java Expression %>

   计算Java表达式得到de结果被转换成字符串,然后插入到页面.计算在运行时进行(页面被请求时),因此可以访问和请求有关de全部信息.例如,下面de相关代码显示页面被请求de日期/时间:
Current time: <%= new java.util.Date() %>

   为简化这些表达式,JSP预定义了一组可以直接使用de对象变量.后面我将详细介绍这些隐含声明de对象,但对于JSP表达式来说,最重要de几个对象及其类型如下:
request:HttpServletRequest;
response:HttpServletResponse;
session:和request关联deHttpSession
out:PrintWriter(带缓冲de版本,JspWriter),用来把输出发送到客户端
   下面是一个例子:
Your hostname: <%= request.getRemoteHost() %>

   最后,如果使用XMLde话,JSP表达式也可以写成下面这种形式:
<jsp:expression>
Java Expression
</jsp:expression>

   请记住XML元素和HTML不一样.XML是大小写敏感de,因此务必使用小写.有关XML语法de说明,请参见《XML教程 》
   12.1.2 JSP Scriptlet
   如果您要完成de任务比插入简单de表达式更加复杂,可以使用JSP Scriptlet.JSP Scriptlet允许您把任意deJava相关代码插入Servlet.JSP Scriptlet语法如下:
<% Java Code %>

   和JSP表达式一样,Scriptlet也可以访问所有预定义de变量.例如,如果您要向结果页面输出内容,可以使用out变量:
<%
String queryData = request.getQueryString();
out.println("Attached GET data: " queryData);
%>

   注意Scriptlet中de相关代码将被照搬到Servlet内,而Scriptlet前面和后面de静态HTML(模板文本)将被转换成println语句.这就意味着,Scriptlet内deJava语句并非一定要是完整de,没有关闭de块将影响Scriptlet外de静态HTML.例如,下面deJSP片断混合了模板文本和Scriptlet:
<% if (Math.random() < 0.5) { %>
Have a <B>nice</B> day!
<% } else { %>
Have a <B>lousy</B> day!
<% } %>

   上述JSP相关代码将被转换成如下Servlet相关代码:
if (Math.random() < 0.5) {
out.println("Have a <B>nice</B> day!");
} else {
out.println("Have a <B>lousy</B> day!");
}

   如果要在Scriptlet内部使用字符“%>”,必须写成“%\>”.另外,请注意<% code %>deXML等价表达是:
<jsp:scriptlet>
Code
</jsp:scriptlet>

   12.1.3 JSP声明
   JSP声明用来定义插入Servlet类de方法和成员变量,其语法如下:
<%! Java Code %>

   由于声明不会有任何输出,因此它们往往和JSP表达式或Scriptlet结合在一起使用.例如,下面deJSP相关代码片断输出自从服务器启动(或Servlet类被改动并重新装载以来)当前页面被请求de次数:
<%! private int accessCount = 0; %>
自从服务器启动以来页面访问次数为:
<%= accessCount %>

   和Scriptlet一样,如果要使用字符串“%>”,必须使用“%\>”代替.最后,<%! code %>deXML等价表达方式为:
<jsp:declaration>
Code
</jsp:declaration>

   12.2 JSP指令
   JSP指令影响Servlet类de整体结构,它de语法一般如下:
<%@ directive attribute="value" %>

   另外,也可以把同一指令de多个属性结合起来,例如:
<%@ directive attribute1="value1"
attribute2="value2"

attributeN="valueN" %>

   JSP指令分为两种类型:第一是page指令,用来完成下面这类任务:导入指定de类,自定义Servletde超类,等等;第二是include指令,用来在JSP文件转换成Servlet时引入其他文件.JSP规范也提到了taglib指令,其目de是让JSP开发者能够自己定义标记,但JSP 1.0不支持该指令,有希望它将成为JSP 1.1de主要改进之一.
   12.2.1 page指令
   page指令de作用是定义下面一个或多个属性,这些属性大小写敏感.

import="package.class",或者import="package.class1,…,package.classN":
用于指定导入哪些包,例如:<%@ page import="java.util.*" %>.import是唯一允许出现一次以上de属性.

contentType="MIME-Type" 或contentType="MIME-Type; charset=Character-Set":
该属性指定输出deMIME类型.默认是text/html.例如,下面这个指令:
<%@ page contentType="text/plain" %>.
和下面deScriptlet效果相同:
<% response.setContentType("text/plain"); %>

isThreadSafe="true|false"
默认值true表明Servlet按照标准de方式处理,即假定开发者已经同步对实例变量de访问,由单个Servlet实例同时地处理多个请求.如果取值false,表明Servlet应该实现SingleThreadModel,请求或者是逐个进入,或者多个并行de请求分别由不同deServlet实例处理.

session="true|false"
默认值true表明预定义变量session(类型为HttpSession)应该绑定到已有de会话,如果不存在已有de会话,则新建一个并绑定session变量.如果取值false,表明不会用到会话,试图访问变量session将导致JSP转换成Servlet时出错.

buffer="size kb|none"
该属性指定JspWrite outde缓存大小.默认值和服务器有关,但至少应该是8 KB.

autoflush="true|false"
默认值true表明如果缓存已满则刷新它.autoflush很少取false值,false值表示如果缓存已满则抛出异常.如果buffer="none",autoflush不能取false值.

extends="package.class"
该属性指出将要生成deServlet使用哪个超类.使用该属性应当十分小心,因为服务器可能已经在用自定义de超类.

info="message"
该属性定义一个可以通过getServletInfo方法提取de字符串.

errorPage="url"
该属性指定一个JSP页面,所有未被当前页面捕获de异常均由该页面处理.

isErrorPage="true|false"
该属性指示当前页面是否可以作为另一JSP页面de错误处理页面.默认值false.

language="java"
该属性用来指示所使用de语言.目前没有必要关注这个属性,因为默认deJava是当前唯一可用de语言.
   定义指令deXML语法为:
<jsp:directive.directiveType attribute=value />

   例如,下面这个指令:
<%@ page import="java.util.*" %>

   它deXML等价表达是:
<jsp:directive.page import="java.util.*" />

   12.2.2 include指令
   include指令用于JSP页面转换成Servlet时引入其他文件.该指令语法如下:
<%@ include file="relative url" %>

   这里所指定deURL是和发出引用指令deJSP页面相对deURL,然而,与通常意义上de相对URL一样,您可以利用以“/”开始deURL告诉系统把URL视为从Web服务器根目录开始.包含文件de内容也是JSP相关代码,即包含文件可以包含静态HTML、脚本元素、JSP指令和动作.
   例如,许多网站de每个页面都有一个小小de导航条.由于HTML框架存在不少问题,导航条往往用页面顶端或左边de一个表格制作,同一份HTML相关代码重复出现在整个网站de每个页面上.include指令是实现该功能de非常理想de方法.使用include指令,开发者不必再把导航HTML相关代码拷贝到每个文件中,从而可以更轻松地完成维护工作.
   由于include指令是在JSP转换成Servletde时候引入文件,因此如果导航条改变了,所有使用该导航条deJSP页面都必须重新转换成Servlet.如果导航条改动不频繁,而且您希望包含操作具有尽可能好de效率,使用include指令是最好de选择.然而,如果导航条改动非常频繁,您可以使用jsp:include动作.jsp:include动作在出现对JSP页面请求de时候才会引用指定de文件,请参见本文后面de具体说明.
   12.3 实例:脚本元素和指令de应用
   下面是一个使用JSP表达式、Scriptlet、声明、指令de简单例子.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>JavaServer Pages</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE">
JSP应用实例</TABLE>
</CENTER>
<P>
下面是一些利用各种JSP功能生成de动态内容:
<UL>
<LI><B>表达式.</B><BR>
您de主机名: <%= request.getRemoteHost() %>.
<LI><B>JSP Scriptlet.</B><BR>
<% out.println("查询字符串: "
request.getQueryString()); %>
<LI><B>声明(和表达式).</B><BR>
<%! private int accessCount = 0; %>
服务器启动以来访问次数: <%= accessCount %>
<LI><B>指令(和表达式).</B><BR>
<%@ page import = "java.util.*" %>
当前日期: <%= new Date() %>
</UL>
</BODY>
</HTML>

   12.4 JSP预定义变量
   为了简化JSP表达式和Scriptletde相关代码,JSP提供了8个预先定义de变量(或称为隐含对象).这些变量是request、response、out、session、application、config、pageContext和page.
   12.4.1 request
   这是和请求关联deHttpServletRequest,通过它可以查看请求参数(调用getParameter),请求类型(GET,POST,HEAD,等),以及请求deHTTP头(Cookie,Referer,等).严格说来,如果请求所用de是HTTP之外de其他协议,request可以是ServletRequestde子类(而不是HttpServletRequest),但在实践中几乎不会用到.
   12.4.2 response
   这是和应答关联deHttpServletResponse.注意,由于输出流(参见下面deout)是带缓冲de,因此,如果已经向客户端发送了输出内容,普通Servlet不允许再设置HTTP状态相关代码,但在JSP中却是合法de.
   12.4.3 out
   这是用来向客户端发送内容dePrintWriter.然而,为了让response对象更为实用,out是带缓存功能dePrintWriter,即JspWriter.JSP允许通过page指令debuffer属性调整缓存de大小,甚至允许关闭缓存.
   out一般只在Scriptlet内使用,这是因为JSP表达式是自动发送到输出流de,很少需要显式地引用out.
   12.4.4 session
   这是和请求关联deHttpSession对象.前面我已经介绍过会话de自动创建,我知道,即使不存在session引用,这个对象也是自动绑定de.但有一个例外,这就是如果您用page指令desession属性关闭了会话,此时对session变量de引用将导致JSP页面转换成Servlet时出错.
   12.4.5 application
   这是一个ServletContext,也可以通过getServletConfig().getContext()获得.
   12.4.6 config
   这是当前页面deServletConfig对象.
   12.4.7 pageContext
   主要用来管理页面de属性.
   12.4.8 page
   它是thisde同义词,当前用处不大.它是为了Java不再是唯一deJSP编程语言而准备de占位符.