`
quanxi40402
  • 浏览: 0 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论
收藏列表
标题 标签 来源
jquery对象 jquery
jQuery 1.4.4 中文参考手册      作者:Jack.W 此文档是在老版本API文档上修改升级而来,So在这里感谢之前作者和翻译者做出的贡献;具体作者详情参看关于;珍惜生命,远离360!
核心
jQuery 核心函数
jQuery(expr, [context]) 
jQuery(html, [ownerDoc]) 
jQuery(html, props) 
jQuery(elements) 
jQuery() 
jQuery(callback) 
jQuery 对象访问
each(callback) 
size() 
length 
selector 
context 
get() 
get(index) 
index(subject) 
数据缓存
data([name] , [value]) 
data(obj) 
removeData(name) 
$.data([el], [key], [val]) 
队列控制
queue(name ,[cb|queue]) 
dequeue(name) 
clearQueue([queueName]) 
插件机制
jQuery.fn.extend(object) 
jQuery.extend(object) 
多库共存
jQuery.noConflict([ex]) 
属性
属性
attr(name) 
attr(properties) 
attr(key, value) 
attr(key, fn) 
removeAttr(name) 
CSS 类
addClass(class | fn) 
removeClass([class | fn]) 
toggleClass(class|fn [, sw]) 
HTML代码/文本/值
html( [val | fn] ) 
text( [val | fn] ) 
val( [val | fn | arr] ) 
CSS
CSS
css(name) 
css(properties) 
css(name, value | fn) 
位置
offset([coordinates]) 
position() 
scrollTop( [val] ) 
scrollLeft( [val] ) 
尺寸
height( [val] ) 
width( [val] ) 
innerHeight() 
innerWidth() 
outerHeight(options) 
outerWidth(options) 
选择器
基本
#id 
element 
.class 
* 
selector1,selector2,selectorN 
层级
ancestor descendant 
parent > child 
prev + next 
prev ~ siblings 
基本
:first 
:last 
:not 
:even 
:odd 
:eq 
:gt 
:lt 
:header 
:animated 
内容
:contains 
:empty 
:has 
:parent 
可见性
:hidden 
:visible 
属性
[attribute] 
[attribute=value] 
[attribute!=value] 
[attribute^=value] 
[attribute$=value] 
[attribute*=value] 
[attrSel1][attrSel2][attrSelN] 
子元素
:nth-child 
:first-child 
:last-child 
:only-child 
表单
:input 
:text 
:password 
:radio 
:checkbox 
:submit 
:image 
:reset 
:button 
:file 
:hidden 
表单对象属性
:enabled 
:disabled 
:checked 
:selected 
文档处理
内部插入
append(content | fn) 
appendTo(content) 
prepend(content | fn) 
prependTo(content) 
外部插入
after(content | fn) 
before(content | fn) 
insertAfter(content) 
insertBefore(content) 
包裹
wrap(html) 
wrap(elem) 
wrap(fn) 
unwrap() 
wrapAll(html) 
wrapAll(elem) 
wrapInner(html) 
wrapInner(elem) 
wrapInner(fn) 
替换
replaceWith(content) 
replaceAll(selector) 
删除
empty() 
remove([expr]) 
detach([expr]) 
复制
clone() 
clone(true) 
筛选
过滤
eq(index) 
first() 
last() 
hasClass(class) 
filter(expr | fn) 
is(expr) 
map(callback) 
has(expr) 
not(expr) 
slice(start, [end]) 
查找
children([expr]) 
closest([expr]) 
find(expr) 
next([expr]) 
nextAll([expr]) 
nextUntil([expr]) 
offsetParent() 
parent([expr]) 
parents([expr]) 
parentsUntil([expr]) 
prev([expr]) 
prevAll([expr]) 
prevUntil([expr]) 
siblings([expr]) 
串联
add(expr, [context]) 
andSelf() 
contents() 
end() 
事件
页面载入
ready(fn) 
事件处理
bind(type, [data], fn) 
one(type, [data], fn) 
trigger(type, [data]) 
triggerHandler(type, [data]) 
unbind([type], [data]) 
事件委派
live(type, [data], fn) 
die([type], [fn]) 
delegate(selector, [type], [fn]) 
undelegate() 
事件切换
hover(over, out) 
toggle(fn, fn2, [fn3, fn4, ...]) 
事件
blur( [fn] ) 
change( [fn] ) 
click( [fn] ) 
dblclick( [fn] ) 
error( [fn] ) 
focus( [fn] ) 
focusin( [fn] ) 
focusout( [fn] ) 
keydown( [fn] ) 
keypress( [fn] ) 
keyup( [fn] ) 
mousedown(fn) 
mousemove(fn) 
mouseout(fn) 
mouseover(fn) 
mouseup(fn) 
resize(fn) 
scroll(fn) 
select( [fn] ) 
submit( [fn] ) 
unload(fn) 
效果
基本
show() 
show(speed, [callback]) 
hide() 
hide(speed, [callback]) 
toggle() 
toggle(switch) 
toggle(speed, [callback]) 
滑动
slideDown(speed, [callback]) 
slideUp(speed, [callback]) 
slideToggle(speed, [callback]) 
淡入淡出
fadeIn(speed, [callback]) 
fadeOut(speed, [callback]) 
fadeTo(speed, opacity, [fn]) fadeToggle(speed, [easing), [callback] 
自定义
animate(param,[dur],[e],[fn]) 
animate(params, options) 
stop([clearQueue], [gotoEnd]) 
delay(duration, [queueName]) 
设置
jQuery.fx.off 
jQuery.fx.interval 
Ajax
Ajax 请求
$.ajax([options]) 
load(url, [data], [callback]) 
$.get(url, [data], [fn], [type]) 
$.getJSON(url, [data], [fn]) 
$.getScript(url, [callback]) 
$.post(url, [data], [fn], [type]) 
Ajax 事件
ajaxComplete(callback) 
ajaxError(callback) 
ajaxSend(callback) 
ajaxStart(callback) 
ajaxStop(callback) 
ajaxSuccess(callback) 
其它
$.ajaxSetup([options]) 
serialize() 
serializeArray() 
工具
浏览器及特性检测
$.support 
$.browser 
$.browser.version 
$.boxModel 
数组和对象操作
$.each(object, [callback]) 
$.extend([d],tgt,obj1,[objN]) 
$.grep(array, fn, [invert]) 
$.makeArray(obj) 
$.map(array, callback) 
$.inArray(value, array) 
$.toArray() 
$.merge(first, second) 
$.unique(array) 
$.parseJSON(json) 
函数操作
$.noop 
$.proxy(function, scope) 
测试操作
$.contains(container, contained) 
$.isArray(obj) 
$.isFunction(obj) 
$.isEmptyObject(obj) 
$.isPlainObject(obj) 
$.isWindow(obj) 
$.type(obj) 
字符串操作
$.trim(str) 
URL
$.param(obj, [traditional]) 
插件编写
$.error(message) 
关于
关于此jQuery中文文档 
关于jQuery 1.4.4中文版 
关于jQuery 1.4.1中文版 
关于jQuery 1.3 版翻译 
关于jQuery 1.2 版翻译 
提交bug及获取更新 
拓展
ASP 参考手册 
PHP 参考手册 
SQL 参考手册 
HTML 5 参考手册 
CSS 参考手册 
更多手册 >> 
参考资料 - jQuery 参考书籍
该内容需要网络才可以显示最新出品的 jQuery 参考工具书!
文件下载代码 download
public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		request.setCharacterEncoding("utf-8");
		String url=HttpConfig.getInstance().getHost("wsp");
		String id=request.getParameter("id");
		id=StringUtil.decodeString(id);
		System.out.println("---------id:"+id);
		String reportName = new String(request.getParameter("reportName").getBytes("ISO-8859-1"),"utf-8") ;
		String start=request.getParameter("start");
		String end=request.getParameter("end");
		reportName=(reportName)+(start+"至"+end)+".doc";
		System.out.println("---------reportName:"+reportName);
		response.setContentType("application/x-msdownload");
		response.setHeader("Content-Disposition", "attachment; filename="+new String(reportName.getBytes("gb2312"), "ISO8859-1"));
		OutputStream out = response.getOutputStream();
		HttpClient client = new HttpClient();
		PostMethod postMethod = null;
		try {
			postMethod = new PostMethod(url+"/DownReportServlet?id="+id);
         	postMethod.getParams().setParameter(HttpMethodParams.HTTP_CONTENT_CHARSET,"utf-8"); 
			int i = client.executeMethod(postMethod);
			System.out.println("-=--status----->"+i);
			if (200 == i) {
				InputStream in = postMethod.getResponseBodyAsStream();
				if(in!=null)
				{
					try {
						byte[] buf = new byte[1024];
						int iret = 0;
						while ((iret = in.read(buf)) > 0)
						{
							out.write(buf, 0, iret);
						}
					} catch (Exception ex) {
//						ex.printStackTrace();

					} finally {
						in.close();
						if (out != null)
							out.flush();
					}
				}
			} 
		} catch (Exception e) {
//			e.printStackTrace();
		} finally {
			postMethod.releaseConnection();
			client.getHttpConnectionManager().closeIdleConnections(0);
		}
		return;
	}


public void downLoad(String filePath, HttpServletResponse response,
			boolean isOnLine) throws Exception {
		File f = new File(filePath);
		if (!f.exists()) {
			response.sendError(404, "File not found!");
			return;
		}
		BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
		byte[] buf = new byte[1024];
		int len = 0;

		response.reset(); // 非常重要
		if (isOnLine) { // 在线打开方式
			URL u = new URL("file:///" + filePath);
			response.setContentType(u.openConnection().getContentType());
			response.setHeader("Content-Disposition", "inline; filename="
					+ f.getName());
			// 文件名应该编码成UTF-8
		} else { // 纯下载方式
			response.setContentType("application/x-msdownload");
			response.setHeader("Content-Disposition", "attachment; filename="
					+ f.getName());
		}
		OutputStream out = response.getOutputStream();
		while ((len = br.read(buf)) > 0)
		{
			
			out.write(buf, 0, len);
		}
		br.close();
		out.close();
	}
oracle分页sql sql
select u.* from (select t.*,rownum r from t_upload_temp_info t) u
where  u.r>40 and u.r<50
java获取项目路径 getpath
关于绝对路径和相对路径

1.基本概念的理解绝对路径:绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,"../"代表上级目录。这种类似的表示,也是属于相对路径。另外关于URI,URL,URN等内容,请参考RFC相关文档标准。RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,(http://www.ietf.org/rfc/rfc2396.txt)2.关于JSP/Servlet中的相对路径和绝对路径。2.1服务器端的地址服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的)

1、reqst.getRealPath

方法:reqst.getRealPath("/")

得到的路径:C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\strutsTest\

方法:reqst.getRealPath(".")

得到的路径:C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\strutsTest\.

方法:reqst.getRealPath("")

得到的路径:C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\strutsTest

reqst.getRealPath("web.xml")

C:\Program Files\Apache Software Foundation\Tomcat 5.5\webapps\strutsTest\web.xml

2、reqst.getParameter("");

    ActionForm.getMyFile();

方法:String filepath = reqst.getParameter("myFile");

得到的路径:D:\VSS安装目录\users.txt

方法:String filepath = ActionForm.getMyFile();

得到的路径:D:\VSS安装目录\users.txt

--------------------------------------------------

strutsTest 为工程名

myFile 在ActionForm中,为private String myFile;

在jsp页面中:为<html:file property="myFile"></html:file>

--------------------------------------------------

3、获得系统路径

在Application中:

System.getProperty("user.dir")

在Servlet中:

ServletContext servletContext = config.getServletContext();

String rootPath = servletContext.getRealPath("/");

在jsp中:

application.getRealPath("")

4、其他

1.可以在servlet的init方法里String path = getServletContext().getRealPath("/");这将获取web项目的全路径例如 :E:\eclipseM9\workspace\tree\tree是我web项目的根目录2.你也可以随时在任意的class里调用this.getClass().getClassLoader().getResource("").getPath();这将获取 到classes目录的全路径例如 : /D:/workspace/strutsTest/WebRoot/WEB-INF/classes/

还有 this.getClass().getResource("").getPath().toString();

这将获取 到 /D:/workspace/strutsTest/WebRoot/WEB-INF/classes/bl/

这个方法也可以不在web环境里确定路径,比较好用3.reqst.getContextPath();获得web根的上下文环境如 /treetree是我的web项目的root context

 

5、其他12

java获取路径几种途径- -

jdk如何判断程序中的路径呢?一般在编程中,文件路径分为相对路径和绝对路径,绝对路径是比较好处理的,但是不灵活,因此我们在编程中对文件进行操作的时候,一般都是读取文件的相对路径,相对路径可能会复杂一点,但是也是比较简单的,相对的路径,主要是相对于谁,可以是类加载器的路径,或者是当前java文件下的路径,在jsp编程中可能是相对于站点的路径,相对于站点的路径,我们可以通过getServletContext().getRealPath("\") 和reqst.getRealPath("\"):这个是取得站点的绝对路径; 而getContextPath():取得站点的虚拟路径;2:class.getClassLoader.getPath():取得类加载器的路径:什么是类加载器呢?一般类加载器有系统的和用户自己定义的;系统的ClassLoader就是jdk提供的,他的路径就是jdk下的路径,或者在 jsp编程,比如Tomcat ,取得的类加载器的位置就是tomaca自己设计的加载器的路径,明白了这些之后,对于文件路径的操作就会相当的清楚,我们在编程的时候,只要想清楚我们所操作的文件是相对于什么路径下的,取得相对路径就可以了.

6、总结

1、获取web服务器下的文件路径

reqst.getRealPath("/")

application.getRealPath("")【jsp中 】

ServletContext().getRealPath("")

System.getProperty("user.dir")【不同位置调用,获取的路径是动态变化的】

2、获取本地路径

jsp中,<html:file property="myFile"/>

reqst.getParameter("myFile");

ActionForm.getMyFile();

获取的值相同:如D:\VSS安装目录\users.txt

*********************************

this.getClass().getClassLoader().getResource("").getPath();

==/D:/workspace/strutsTest/WebRoot/WEB-INF/classes/

this.getClass().getResource("").getPath().toString();

==/D:/workspace/strutsTest/WebRoot/WEB-INF/classes/bl/

3、获取相对路径

reqst.getContextPath();

如:/strutsTest

 

 

 

帖二:http://teamojiao.iteye.com/blog/446615

关于绝对路径和相对路径: 
绝对路径就是你的主页上的文件或目录在硬盘上真正的路径,(URL和物理路径)例如:C:xyz est.txt 代表了test.txt文件的绝对路径。http://www.sun.com/index.htm也代表了一个URL绝对路径。相对路径:相对与某个基准目录的路径。包含Web的相对路径(HTML中的相对目录),例如:在Servlet中,"/"代表Web应用的跟目录。和物理路径的相对表示。例如:"./" 代表当前目录,"../"代表上级目录。这种类似的表示,也是属于相对路径。另外关于URI,URL,URN等内容,请参考RFC相关文档标准。RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax,(http://www.ietf.org/rfc/rfc2396.txt)2.关于JSP/Servlet中的相对路径和绝对路径。 2.1服务器端的地址服务器端的相对地址指的是相对于你的web应用的地址,这个地址是在服务器端解析的(不同于html和javascript中的相对地址,他们是由客户端浏览器解析的) 

第一种: 
File f = new File(this.getClass().getResource("/").getPath()); 
System.out.println(f); 
结果: 
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin 
获取当前类的所在工程路径; 
如果不加“/” 
File f = new File(this.getClass().getResource("").getPath()); 
System.out.println(f); 
结果: 
C:\Documents%20and%20Settings\Administrator\workspace\projectName\bin\com\test 
获取当前类的绝对路径; 

第二种: 
File directory = new File("");//参数为空 
String courseFile = directory.getCanonicalPath() ; 
System.out.println(courseFile); 
结果: 
C:\Documents and Settings\Administrator\workspace\projectName 
获取当前类的所在工程路径; 

第三种: 
URL xmlpath = this.getClass().getClassLoader().getResource("selected.txt"); 
System.out.println(xmlpath); 
结果: 
file:/C:/Documents%20and%20Settings/Administrator/workspace/projectName/bin/selected.txt 
获取当前工程src目录下selected.txt文件的路径 

第四种: 
System.out.println(System.getProperty("user.dir")); 
结果: 
C:\Documents and Settings\Administrator\workspace\projectName 
获取当前工程路径 

第五种: 
System.out.println( System.getProperty("java.class.path")); 
结果: 
C:\Documents and Settings\Administrator\workspace\projectName\bin 
获取当前工程路径
java代码生成myeclipse注册码 regkey
/**
 * 
 */
package myeclipseKey;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * @author quanxi40402
 *
 */
public class CreateMyeclipseValidateKey 
{
	 private static final String key = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";//定义一个String字符串   
	
	 public String getSerial(String userId, String licenseNum) {   
	        java.util.Calendar cal = java.util.Calendar.getInstance();   
	        cal.add(1, 3);   
	        cal.add(6, -1);   
	        java.text.NumberFormat nf = new java.text.DecimalFormat("000");   
	        licenseNum = nf.format(Integer.valueOf(licenseNum));   
	        String verTime = new StringBuilder("-").append(new java.text.   
	                SimpleDateFormat("yyMMdd").format(cal.getTime())).append("0").   
	                         toString();   
	        String type = "YE3MP-";   
	        String need = new StringBuilder(userId.substring(0, 1)).append(type).   
	                      append("300").append(licenseNum).append(verTime).toString();   
	        String dx = new StringBuilder(need).append(key).append(userId).toString();   
	        int suf = this.decode(dx);   
	        String code = new StringBuilder(need).append(String.valueOf(suf)).   
	                      toString();   
	        return this.change(code);   
	    }   
	  
	    private int decode(String s) {   
	        int i;   
	        char[] ac;   
	        int j;   
	        int k;   
	        i = 0;   
	        ac = s.toCharArray();   
	        j = 0;   
	        k = ac.length;   
	        while (j < k) {   
	            i = (31 * i) + ac[j];   
	            j++;   
	        }   
	        return Math.abs(i);   
	    }   
	  
	    private String change(String s) {   
	        byte[] abyte0;   
	        char[] ac;   
	        int i;   
	        int k;   
	        int j;   
	        abyte0 = s.getBytes();   
	        ac = new char[s.length()];   
	        i = 0;   
	        k = abyte0.length;   
	        while (i < k) {   
	            j = abyte0[i];   
	            if ((j >= 48) && (j <= 57)) {   
	                j = (((j - 48) + 5) % 10) + 48;   
	            } else if ((j >= 65) && (j <= 90)) {   
	                j = (((j - 65) + 13) % 26) + 65;   
	            } else if ((j >= 97) && (j <= 122)) {   
	                j = (((j - 97) + 13) % 26) + 97;   
	            }   
	            ac[i] = (char) j;   
	            i++;   
	        }   
	        return String.valueOf(ac);   
	    }   
	  
	    public CreateMyeclipseValidateKey() {   
	        super();   
	    }   
	  
	    public static void main(String[] args) 
	    {   
	        try {   
	            System.out.println("please input register name:");   
	            BufferedReader reader = new BufferedReader(new InputStreamReader(   
	                    System.in));   
	            String userId = null;   
	            userId = reader.readLine();   
	            CreateMyeclipseValidateKey myeclipsegen = new CreateMyeclipseValidateKey();   
	            String res = myeclipsegen.getSerial(userId, "20");   
	            System.out.println("Serial:" + res); //输出序列号信息  
	            reader.readLine();   
	        } catch (IOException ex) {   
	         ex.printStackTrace();
	        }   
	    }   
}
div css 提示框
<html>
 <a href="#" onclick="sAlert('<a href=http://www.it300.net>测试效果</a>');">点击测试</a>


<script type="text/javascript" language="javascript">

          function sAlert(str)
{
var msgw,msgh,bordercolor;
msgw=300;//提示窗口的宽度
msgh=200;//提示窗口的高度
titleheight=25 //提示窗口标题高度
bordercolor="#FF3C00";//提示窗口的边框颜色
titlecolor="#D2CECE";//提示窗口的标题颜色

var sWidth,sHeight;
//sWidth=document.body.offsetWidth; //得出当前屏幕的宽
sWidth=document.body.clientWidth;//BODY对象宽度

     //sHeight=screen.height;//得到当前屏幕的高
//sHeight=document.body.clientHeight;//BODY对象高度
if (window.innerHeight && window.scrollMaxY) 
{    
sHeight = window.innerHeight + window.scrollMaxY;
} 
else if (document.body.scrollHeight > document.body.offsetHeight)
{ 
sHeight = document.body.scrollHeight;
} 
else 
{ 
sHeight = document.body.offsetHeight;
}//以上得到整个屏幕的高

var bgObj=document.createElement("div");//创建一个div对象
bgObj.setAttribute('id','bgDiv');//可以用bgObj.id="bgDiv"的方法,是为div指定属性值
bgObj.style.position="absolute";//把bgDiv这个div绝对定位
bgObj.style.top="0";//顶部为0
bgObj.style.background="#777";//背景颜色
bgObj.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=25,finishOpacity=75)";//ie浏览器透明度设置
bgObj.style.opacity="0.6";//透明度(火狐浏览器中)
bgObj.style.left="0";//左边为0
bgObj.style.width=sWidth + "px";//宽(上面得到的屏幕宽度)
bgObj.style.height=sHeight + "px";//高(上面得到的屏幕高度)
bgObj.style.zIndex = "100";//层的z轴位置
document.body.appendChild(bgObj);

var msgObj=document.createElement("div")//创建一个div对象
msgObj.setAttribute("id","msgDiv");//可以用bgObj.id="msgDiv"的方法,是为div指定属性值
msgObj.setAttribute("align","center");//为div的align赋值
msgObj.style.background="white";//背景颜色为白色
msgObj.style.border="1px solid " + bordercolor;//边框属性,颜色在上面已经赋值
msgObj.style.position = "absolute";//绝对定位
msgObj.style.left = "35%";//从左侧开始位置
msgObj.style.top = "30%";//从上部开始位置
msgObj.style.font="12px/1.6em Verdana, Geneva, Arial, Helvetica, sans-serif";//字体属性
//msgObj.style.marginLeft = "-225px";//左外边距
//msgObj.style.marginTop = -75+document.documentElement.scrollTop+"px";//上外边距
msgObj.style.width = msgw + "px";//提示框的宽(上面定义过)
msgObj.style.height =msgh + "px";//提示框的高(上面定义过)
msgObj.style.textAlign = "center";//文本位置属性,居中。
msgObj.style.lineHeight ="25px";//行间距
msgObj.style.zIndex = "101";//层的z轴位置

var title=document.createElement("h4");//创建一个h4对象
title.setAttribute("id","msgTitle");//为h4对象填加标题
title.setAttribute("align","right");//文字对齐方式
title.style.margin="0";//浮动
title.style.padding="3px";//浮动
title.style.background=titlecolor;//背景颜色
title.style.filter="progid:DXImageTransform.Microsoft.Alpha(startX=20, startY=20, finishX=100, finishY=100,style=1,opacity=75,finishOpacity=100);";
title.style.opacity="0.75";//透明
//title.style.border="1px solid " + bordercolor;//边框
title.style.height="25px";//高度
title.style.font="12px Verdana, Geneva, Arial, Helvetica, sans-serif";//字体属性
title.style.color="white";//文字颜色
title.style.cursor="pointer";//鼠标样式
title.innerHTML="<a href=\"#\">关闭</a>";//显示的文字
title.onclick=function()
{
document.body.removeChild(bgObj);//移除遮罩层
document.getElementById("msgDiv").removeChild(title);//在提示框中移除标题
document.body.removeChild(msgObj);//移除提示框
}
document.body.appendChild(msgObj);//在body中画出提示框层
document.getElementById("msgDiv").appendChild(title);//在提示框中增加标题
var txt=document.createElement("p");
txt.style.margin="1em 0";//文本浮动
txt.setAttribute("id","msgTxt");//为p属性增加id属性
txt.innerHTML=str;//把传进来的值赋给p属性
document.getElementById("msgDiv").appendChild(txt);//把p属性增加到提示框里
}
</script>

 ////////////////////////////////////////////////////////////////////////////



注释我大概都加上了,如果你有哪句不懂什么意思的,那只能说明你对js语法不是很了解,很简单,把代码拿到百度上搜索一下就明白什么意思了。

我这里讲几个重要的地方,第一:

     //sHeight=screen.height;//得到当前屏幕的高
//sHeight=document.body.clientHeight;//BODY对象高度
if (window.innerHeight && window.scrollMaxY) 
{    
sHeight = window.innerHeight + window.scrollMaxY;
} 
else if (document.body.scrollHeight > document.body.offsetHeight)
{ 
sHeight = document.body.scrollHeight;
} 
else 
{ 
sHeight = document.body.offsetHeight;
}//以上得到整个屏幕的高

可以看到这个变量被赋了好几次,开始我用的前面的赋值,但是后来发现,如果一旦屏幕太长,出现滚动条,上面的高度只是得出当前屏幕的高度,当我们弹 出对话框的时候底下的遮罩层,只在第一层遮罩,下面的都不管用,后来经过仔细研究,写出来了下面那几行判断的代码,这样就可以把整个网页都给遮罩上了。

当把上面我们需要的属性都设置好以后,就用这句代码document.body.appendChild(bgObj);把第一个半透明遮罩层给输出到屏幕上。

接下来又定义了一个div,然后还是一堆属性的赋值,然后这两句话很重要

    document.body.appendChild(msgObj);//在body中画出提示框层
document.getElementById("msgDiv").appendChild(title);//在提示框中增加标题

这是点击关闭按钮以后的处理代码

     title.onclick=function()
{
document.body.removeChild(bgObj);//移除遮罩层
document.getElementById("msgDiv").removeChild(title);//在提示框中移除标题
document.body.removeChild(msgObj);//移除提示框
}


</html>
ibatis插入数据(is null)
<insert id="addUser" parameterClass="com.mmblue.entity.system.User">  
    <selectKey keyProperty="id" resultClass="long">  
            select S_MYIVR_TUSER.NEXTVAL as id from DUAL  
        </selectKey>  
        INSERT INTO MYIVR_TUSER (  
            USERID  
        <isNotEmpty property="name">,USERNAME</isNotEmpty>  
        <isNotEmpty property="realName">,REALNAME</isNotEmpty>  
        <isNotEmpty property="password">,PASSWORD</isNotEmpty>  
        <isEqual property="enable" compareValue="1">,ISENABLE</isEqual>  
        <isNotEmpty property="createTime">,CREATETIME</isNotEmpty>  
    <![CDATA[ 
        ) VALUES ( 
    ]]>  
        #id#  
        <isNotEmpty property="name">,#name#</isNotEmpty>  
        <isNotEmpty property="realName">,#realName#</isNotEmpty>  
        <isNotEmpty property="password">,#password#</isNotEmpty>  
        <isEqual property="enable" compareValue="1">,#enable#</isEqual>  
        <isNotEmpty property="createTime">,#createTime#</isNotEmpty>  
    <![CDATA[ 
        ) 
    ]]>  
</insert>  
 注意 ,USERNAME 里面的',',和最后一个是不带' ,'  这样的话就算只有1个字段有值都可以插入进去。
如果和第一种方式一样的话就会出现INSERT INTO MYIVR_TUSER(USERID,,USERNAME) values(id,,name)这样的情况
创建struts2 web项目
创建struts2项目的一般步骤

博客分类: Struts2
Struts框架freemarkerJSPXML
1.导入struts2必需的5个jar包: 
struts2-core-2.x.x.jar :Struts2框架的核心类库 
xwork-2.x.x.jar :XWork类库,Struts2在其上构建 
ognl-2.6.x.jar :对象图导航语言(Object Graph Navigation Language),Struts2框架使用的一种表达式语言 
freemarker-2.3.x.jar :Struts2的UI标签的模板使用FreeMarker编写 
commons-logging-1.1.x.jar :ASF出品的日志包,Struts 2框架使用这个日志包来支持Log4J和JDK 1.4+的日志记录。 

2.修改web.xml,添加struts2框架的过滤器,服务器每次启动知道加载的是struts2框架。在struts1.x中, struts框架是通过Servlet启动的。在struts2中,struts框架是通过Filter启动的。 
<filter> 
    <filter-name>struts2</filter-name> 
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>struts2</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

3.新建一个struts.xml,放在项目的src目录下,FilterDispatcher过滤器在初始化时将会在WEB-INF/classes下寻找该文件,模板形式为: 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE struts PUBLIC 
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
    "http://struts.apache.org/dtds/struts-2.0.dtd"> 
<struts> 
  <include file="struts-default.xml"/> 
  <package name="struts2" namespace="/test" extends="struts-default"> 
    <action name="helloworld" class="com.dwj.action.HelloWorldAction" method=""> 
      <result name="success">/WEB-INF/page/hello.jsp</result> 
      <result name="input">/WEB-INF/page/faile.jsp</result> 
    </action> 
  </package> 
</struts> 

4.在src下新建一个package,com.dwj.action,在这个包下面新建普通的action类,它继承ActionSupport类。 

5.新建需要的jsp页面,里面包含一些表单控件,根据form表单的action属性指定要跳转的action。 

6.写action控制器,在action控制器中,把jsp表单元素当做类的属性,给对应的属性添加get和set方法来赋值和取值,获取表单提交的数据。 

7.写action中的方法,默认的是execute方法,或者新建自己的方法,成功返回"success",失败返回"input"; 

8.在struts.xml中配置程序跳转(如上struts.xml),action的名字是name=,它对应的类是class=,要调用的方法是method=。在struts.xml中一定要包含struts-default.xml(<include file="struts-default.xml"/>加载struts2默认配置文件),<package>中一定要继承struts-default(<extends="struts-default">)。
ibatis插入数据 insert
 Ibatis中insert用法
分类: Java分类 2009-04-16 12:30 1791人阅读 评论(2) 收藏 举报
    在Ibatis中,insert()的返回值为一个Object的主键,其实这个Object的主键是这样的来的:如果在bean的xml文件中设置了插入的keyProperty,则insert()方法返回的就是这个主键的值。

    例如,所以我们想要在插入时想要插入一个sequence值到数据库的某个字段(当然,这个字段的类型为Number的),我们可以在xml文件中做如下配置(以下为在DB服务器是Oracle的前提下):

<insert id="insertUser" parameterClass="po.User">
     <selectKey resultClass="int" keyProperty="userId" >
         SELECT user_account_s.nextval AS userid FROM dual
     </selectKey>
  insert into user_account(userid, username, password, groupname)
          values(#userId#, #userName#, #password#, #groupName#)
 </insert>

此时插入到数据库中的某表userid字段的值即使sequence的值。但要注意的是,配置中出现的红色加粗字体一定要对应到bean中的属性字段,也即要与bean中的属性字段名称相同,否则则会抛出异常。

    如果是SQL SERVER数据库,则进行如下配置:

<insert id="insertUser" parameterClass="po.User">
    insert into user_account(userid, username, password, groupname)
          values(#userId#, #userName#, #password#, #groupName#)

     <selectKey resultClass="int" keyProperty="userId" >
         SELECT @@IDENTITY as userid
     </selectKey>
 </insert>
listener启动
package com.appsafe.core.webapp.listener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.htmlparser.sax.XMLReader;

import com.appsafe.AgentManager;
import com.appsafe.WSPManager;
import com.appsafe.center.engine.model.Engine;
import com.appsafe.center.engine.service.EngineManager;
import com.appsafe.client.http.HttpClientManager;
import com.appsafe.config.CheckEventConfigFactory;
import com.appsafe.core.Constants;
import com.appsafe.core.base.model.BasePaginator;
import com.appsafe.core.base.util.MailSend;
import com.appsafe.core.base.util.MangroveWarningInfo;
import com.appsafe.core.dataobject.DataObject;
import com.appsafe.core.dataobject.XmlBaseReader;
import com.appsafe.core.service.LookupManager;
import com.appsafe.dynamic.webapp.loaddynamic.LoadDynamicData;
import com.appsafe.message.model.MailPost;
import com.appsafe.message.service.MailPostManager;
import com.appsafe.sitesafe.filedetect.model.Agent;
import com.appsafe.sitesafe.filedetect.model.Agents;
import com.appsafe.sitesafe.filedetect.model.Catalog;
import com.appsafe.sitesafe.outer.webapp.action.WeatherSafeProes;
import com.heartbeat.HeartRunnable;
import com.heartbeat.HeartbeatManager;

import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.security.providers.AuthenticationProvider;
import org.springframework.security.providers.ProviderManager;
import org.springframework.security.providers.encoding.PasswordEncoder;
import org.springframework.security.providers.rememberme.RememberMeAuthenticationProvider;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.xml.sax.SAXException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.jsp.jstl.core.Config;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * <p>
 * StartupListener class used to initialize and database settings and populate
 * any application-wide drop-downs. <p/>
 * <p>
 * Keep in mind that this listener is executed outside of
 * OpenSessionInViewFilter, so if you're using Hibernate you'll have to
 * explicitly initialize all loaded data at the GenericDao or service level to
 * avoid LazyInitializationException. Hibernate.initialize() works well for
 * doing this.
 * 
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 */
public class StartupListener implements ServletContextListener {
	private static final Log log = LogFactory.getLog(StartupListener.class);

	@SuppressWarnings( { "unchecked" })
	public void contextInitialized(ServletContextEvent event) {
		log.debug("Initializing context...");

		ServletContext context = event.getServletContext();

		// Orion starts Servlets before Listeners, so check if the config
		// object already exists
		Map<String, Object> config = (HashMap<String, Object>) context
				.getAttribute(Constants.CONFIG);

		if (config == null) {
			config = new HashMap<String, Object>();
		}

		if (context.getInitParameter(Constants.CSS_THEME) != null) {
			config.put(Constants.CSS_THEME, context
					.getInitParameter(Constants.CSS_THEME));
		}

		ApplicationContext ctx = WebApplicationContextUtils
				.getRequiredWebApplicationContext(context);

		/*
		 * String[] beans = ctx.getBeanDefinitionNames(); for (String bean :
		 * beans) { log.debug(bean); }
		 */

		PasswordEncoder passwordEncoder = null;
		try {
			ProviderManager provider = (ProviderManager) ctx
					.getBean("_authenticationManager");
			for (Object o : provider.getProviders()) {
				AuthenticationProvider p = (AuthenticationProvider) o;
				if (p instanceof RememberMeAuthenticationProvider) {
					config.put("rememberMeEnabled", Boolean.TRUE);
				} else if (ctx.getBean("passwordEncoder") != null) {
					passwordEncoder = (PasswordEncoder) ctx
							.getBean("passwordEncoder");
				}
			}
		} catch (NoSuchBeanDefinitionException n) {
			log
					.debug("authenticationManager bean not found, assuming test and ignoring...");
			// ignore, should only happen when testing
		}

		context.setAttribute(Constants.CONFIG, config);

		// output the retrieved values for the Init and Context Parameters
		if (log.isDebugEnabled()) {
			log
					.debug("Remember Me Enabled? "
							+ config.get("rememberMeEnabled"));
			if (passwordEncoder != null) {
				log.debug("Password Encoder: "
						+ passwordEncoder.getClass().getName());
			}
			log.debug("Populating drop-downs...");
		}

		setupContext(context);
	}

	/**
	 * This method uses the LookupManager to lookup available roles from the
	 * data layer.
	 * 
	 * @param context
	 *            The servlet context
	 */
	public static void setupContext(ServletContext context) {
		ApplicationContext ctx = WebApplicationContextUtils
				.getRequiredWebApplicationContext(context);
		LookupManager mgr = (LookupManager) ctx.getBean("lookupManager");
		// 加载WSPManager
		String path = context.getRealPath("/");
		final WSPManager manager = WSPManager.getInstance();
		if (manager.Init(path, ctx)) {
			log.debug("initializing WSPManager.......success");

		}
		// 加载config
		CheckEventConfigFactory.getInstance(WSPManager.getInstance()
				.getSystemPath());
		// get list of possible roles
		context.setAttribute(Constants.AVAILABLE_ROLES, mgr.getAllRoles());
		log.debug("Drop-down initialization complete [OK]");

		// 加载agent.xml
		// AgentManager.getInstance().Init("");

		try {
			// 是否启动线程发邮件
			ExecutorService executorService = Executors.newCachedThreadPool();// 创建线程管理池
			String isNeedMsg = manager.getIsNeedMsg();
			String isNeedShortMsg = manager.getIsNeedShortMsg();// 是否启动线程发短信息
			String isLoadDynamic = manager.getIsLoadDynamic();// 是否启动线程加载红树林首页信息
			String isLoadHeart = manager.getHearBeat();// 是否启动心跳线程向服务端发送请求
			String isReportSend = manager.getReportSendRun();// 是否启动线程自动发送邮件报告
			String isWarningCountStatus = manager.getWarningCountStatu();// 是否启动线程统计红树林预警信息

			if(isWarningCountStatus!=null&&"true".equals(isWarningCountStatus))
			{
				System.out.println("----------红树林预警信息统计线程已经启动...");
				Runnable mb = new MangroveWarningInfo(manager.getWarningCountFilePath(),manager.getWarningCountSleepTime());
				executorService.execute(mb);// 开启线程
			}
			if (isLoadHeart != null && "true".equals(isLoadHeart)) {
				System.out.println("----------心跳线程已经启动...");
				HeartbeatManager.getInstance().process();
			}
			// 倘若需要启动信息发送线程
			if (isNeedMsg != null && "true".equals(isNeedMsg)) {
				System.out.println("----------发送邮件-启动已线程....");
				Runnable rb = new MsgRunnable(manager.getMsgConfigPath());
				executorService.execute(rb);// 开启线程
			}
			if (isNeedShortMsg != null && "true".equals(isNeedShortMsg)) {
				System.out.println("----------发送短信息-启动已线程....");
				Runnable rb = new ShortMsgRunnable(manager.getMsgConfigPath());
				executorService.execute(rb);// 开启线程
			}
			if (isLoadDynamic != null && "true".equals(isLoadDynamic)) {
				Runnable rb = new LoadDynamicData();
				System.out.println("红树林首页信息加载--线程启动...");
				executorService.execute(rb);// 开启线程
			}
			// 周报生成xml配置
			String reportRun = manager.getReportRun();
			// 启动自动生成报告
			if (null != reportRun && reportRun.equals("run")) {
				System.out.println("红树林平台生台自动生成周报线程起来");
				Runnable report = new CreateReportRunnable(manager
						.getThreadCount(), manager.getReportWeek(), manager
						.getSleepTime(), manager.getSiteDomain());
				executorService.execute(report);// 开启线程
			}
			if (null != isReportSend && "true".equals(isReportSend)) {
				System.out.println("自动发送客户报告线程起来啦---------------------------");
				Runnable reportSend = new CustomerReportRunable(manager
						.getReportSleepTime(), manager.getReportType());
				executorService.execute(reportSend);
			}
			// 发送客户舆情报告每天发送
			String fakeRun = manager.getFakeStatus();
			if (null != fakeRun && !"".equals(fakeRun)) {
//				System.out.println("自动发送客户日报舆情报告");
				Runnable reportFake = new SendFakeReportRunnable(manager
						.getFakeSleepTime(), manager.getCustomerServiceIds(),
						manager.getCenterEmail(),manager.getSendTime());
				executorService.execute(reportFake);// 开启线程
			}

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * Shutdown servlet context (currently a no-op method).
	 * 
	 * @param servletContextEvent
	 *            The servlet context event
	 */
	public void contextDestroyed(ServletContextEvent servletContextEvent) {
		// LogFactory.release(Thread.currentThread().getContextClassLoader());
		// Commented out the above call to avoid warning when SLF4J in
		// classpath.
		// WARN: The method class
		// org.apache.commons.logging.impl.SLF4JLogFactory#release() was
		// invoked.
		// WARN: Please see http://www.slf4j.org/codes.html for an explanation.
	}

	public static void main(String[] args) {
		// sturtupMsg();
	}
}
动态添加table
<%@ include file="/common/taglibs.jsp"%>
<%@ page language="java" pageEncoding="utf-8"%>
<head>
	<title><fmt:message key="themeWebsiteDetail.title" />
	</title>
	<meta name="heading"
		content="<fmt:message key='themeWebsiteDetail.heading'/>" />
	<script type="text/javascript"
		src="<c:url value='/scripts/jquery-1.4.2.min.js'/>"></script>
</head>
<style type="text/css">
		.STYLE1 {color: #FF0000}
	</style>
<script type="text/javascript">  
var checkUrl=true;
var isSuccess='${isSuccess}';

if(isSuccess!=''&&isSuccess=='success')
  {
  		alert('保存成功!');
  		window.close();
  }
  if(isSuccess!=''&&isSuccess=='lose')
  {
  		alert('保存失败!');
  		window.close();
  }

//创建xmlHttpRequest对象   
function createXmlHttpObject()    
{    
    if(window.XMLHttpRequest)    
    {    
        xmlHttp = new XMLHttpRequest();    
    }else if(window.ActiveXObject)    
    {    
        xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");    
    }    
    return xmlHttp;   
}   
  
function send(temp)   
{   

	var temp = document.getElementById('url');
	var time = new Date();
    xmlHttp = createXmlHttpObject();   
    var url = "/sysappsafe/checkThemeUrl.html?url="+temp.value+"&c="+time.getTime(); //加能数
    if(xmlHttp)   
    {   
        xmlHttp.onreadystatechange =callback;   //注册回调函数名,只需要函数名,不要加括号   
        xmlHttp.open("GET", url, true);    
        xmlHttp.send(null);
    }else{   
        alert("your browser does not support ajax");   
    }       
}   
  
//回调函数   
function callback()    
{
    //判断对象的状态是交互完成  
    if(xmlHttp.readyState == 4)    
    {   
        //判断http的交互是否成功   
        if(xmlHttp.status==200)   
        {   
         //获取服务器端返回的数据   
            var xmlDoc = xmlHttp.responseText;  
            //返回为true 则为存在
            if(xmlDoc=='true'){
            	document.getElementById("checkId").innerHTML="<font color='red'>该url已经存在,请重新输入</font>";
		 		 checkUrl = false;
		 	}else
		 	{
		 		 document.getElementById('checkId').innerHTML="";
		 		 checkUrl = true;
		 	}
		}else{   
            alert(xmlHttp.statusText);   
        }    	
    }   
}  


function clearSpan()
{
	document.getElementById('checkId').innerHTML="";
}
function validate()
{
	if(document.getElementById("cust").value=="")
	{
		alert("请选择客户");
		return false;
	}
	if(document.getElementById("themeWebsite.customerServiceId").value=="")
	{
		alert("请选择客户服务");
		return false;
	}
	if(document.getElementById("themeName").value=="")
	{
		alert("舆情名称不能为空");
		return false;
	}
	if(document.getElementById("url").value=="")
	{
		alert("网站URL不能为空");
		return false;
	}
	
	var activeLength = document.getElementById("activeLength");
	if(activeLength.value=='')
		{
			alert('在线时长不能为空');
			activeLength.focus();
			return false;
		}else{
		 var t=activeLength.value;
		   if(/^[-]?\d+$/.test(t)){//这个正则表达式为整数
		     if(t>=0){
		     }else{
		      alert('在线时长必须大于0');
		      activeLength.focus();
		      return false;
		     }
		    }else{
		     alert('在线时长必须是整数');
		       activeLength.focus();
		      return false;
		    }
		 
		}
	if(checkUrl==false)
	{
		return false;
	}	
}


</script>


<script type="text/javascript">
	 var i = 1;
     function add() 
     {
         var name = "upload";
         var input1 = document.createElement("input");
         input1.type="file";
         input1.name=name;
         
         var br = document.createElement("<br/>");
         var td = document.getElementById("add");
         var btnDel = document.createElement("input");
         btnDel.type = "button";
         btnDel.value = "delete";
         btnDel.className="button";
         btnDel.onclick = function(){
                 td.removeChild(br);
                 td.removeChild(input1);
                 td.removeChild(btnDel);
             };
         td.appendChild(br);
         td.appendChild(input1);
         td.appendChild(btnDel);
         i++;
     }

</script>
<s:form id="themeWebsiteForm" action="saveThemeWebsite" theme="simple"
	namespace="/sysappsafe" method="post" validate="false"
	enctype="multipart/form-data">
	<table align="left" class="tableform">
		
		
		<tr>
			<td style="text-align: right;background: #DBF0FD; width:30%;">
				图片路径:
			</td>
			<td id="add" width="70%">
				<input type="file" name="upload" value="">
				<INPUT onclick="add()" ; value="more" type="button" class="button"
					style="margin-right: 5px">
			</td>
		</tr>
		
	</table>
</s:form>
刷新页面
<%@ page language="java" errorPage="/error.jsp" pageEncoding="UTF-8"
	contentType="text/html;charset=utf-8"%>
<jsp:directive.page import="com.appsafe.core.base.Constants"/>
<%@ include file="/common/taglibs.jsp"%>
 <jsp:directive.page import="com.appsafe.core.model.User"/>

<head>
	<title><fmt:message key="serviceTypeList.title" /></title>
	<meta name="heading"
		content="<fmt:message key='serviceTypeList.heading'/>" />
	<meta name="menu" content="ServiceTypeMenu" />
</head>
<script>
var oWindow;
var listen_started = false;
 function editTbDict(dictId)
{
	var sURL="/sysappsafe/editServiceType.html?id="+dictId;
	oWindow=window.open(sURL,'_','width=600,height=450,scrollbars=yes, status=yes,resizable=yes,top=200,left=200');
	if(!listen_started)
			  {   
			        setTimeout(refreshSelf,1000);   
			  }
			  else{   
			        listen_started=true;    
			  } 
	}
//刷新本页面
function refreshSelf()
{   
   if (!oWindow.closed){ 
       setTimeout(refreshSelf,500);
   } else {
      listen_started = false;
   var url= "/sysappsafe/serviceTypes.html?indexPage=1&search=search&paginator.currentPage=${paginator.currentPage}&typeId=${param.typeId}";
       window.location.href=url;
   }
}

//添加服务
 function addservice()
{
	var sURL = "/sysappsafe/editServiceType.html";
	 oWindow = window.open(sURL,'_','width=800,height=400,scrollbars=yes, status=yes,resizable=yes,top=0,left=0');
		 	if(!listen_started)
			  {   
			        setTimeout(refreshSelf,1000);   
			  }
			  else{   
			        listen_started=true;    
			  } 
}

//查看子服务
function openTbDictValue(id)
{
	var sURL = "/sysappsafe/serviceSubTypes.html?id="+id;
	window.open(sURL,'_','width=800,height=450,scrollbars=yes, status=yes,resizable=yes,top=200,left=200');
}
</script>
 <%
	User user = (User)request.getSession().getAttribute(Constants.LOGIN_SESSION_KEY);
 %>

<div class="topdiv">
	<span class="leftspan">当前位置 : 服务管理 -> 服务类型配置 </span>
</div>
<div>
	<s:form id="serviceTypes" action="serviceTypes" method="post"
		validate="true" namespace="/sysappsafe" theme="simple" cssStyle="float:left;width:100%">
		<table class="table" width="100%">
			<tr style="text-align: center">
				<th colspan="4"
					style="text-align: center; background: #DBF0FD; font-weight: bold;">
					<s:hidden key="paginator.currentPage" name="paginator.currentPage"></s:hidden>
					请输入查询条件
				</th>
			</tr>
			<tr>
				<td style="text-align: right;background: #DBF0FD;" width="20%">
				<input type="hidden" name="search" value="search">
					服务类型:
				</td>
				<td width="30%">
					<s:select name="typeId" headerKey="" headerValue="--请选择类型--"
						list="AllServiceTypes" listKey="serviceTypeId"
						listValue="serviceName">
					</s:select>
				</td>
				<td style="text-align: right;background: #DBF0FD;" width="50%"></td>
			</tr>
			<tr>
				<td colspan="4" style="text-align: center;background: #DBF0FD;">
				 <appfuse:user userId="<%=user.getId() %>" funcs="serviceManager.serviceMange.serviceTypeConfig.search" >
					<input type="submit" class="button" value="查询">
				</appfuse:user>
					<input type="reset" class="button" onclick="javascript:location.href='/sysappsafe/serviceTypes.html'" value="重置">
				<appfuse:user userId="<%=user.getId() %>" funcs="serviceManager.serviceMange.serviceTypeConfig.add" >
					<input type="button" class="button" onclick="addservice()"
						value="新增">
				</appfuse:user>
				</td>
			</tr>
		</table>
		<table class="table" width="100%">
			<thead>
				<tr>
					<th class="sortable" width="5%">
						<a>序号</a>
					</th>
					<th width="20%">
						<a>服务名称</a>
					</th>
					<th width="10%">
						<a>是否可用</a>
					</th>
					<th width="10%">
						<a>创建人</a>
					</th>
					<th width="10%">
						<a>创建时间</a>
					</th>
					<th width="30%">
						<a>备注</a>
					</th>
					<th class="sortable" width="20%">
						<a>操作</a>
					</th>
				</tr>
			</thead>
			<c:forEach var="ser" items="${serviceTypes}" varStatus="status">
				<c:if test="${status.index%2==0 }">
					<tr style="background-color:#F0F0F0;">
				</c:if>
				<c:if test="${status.index%2!=0 }">
					<tr style="background-color:#ffffff;">
				</c:if>
				<td style="text-align: center">
					<c:out value="${status.count}"></c:out>
				</td>
				<td style="text-align: center">
					${ser.serviceName }
				</td>
				<td style="text-align: center">
					${ser.enabledFlag==1?"是":"否"}
				</td>
				<td style="text-align: center">
					${ser.user.username}
				</td>
				<td style="text-align: center">
					${ser.time}
				</td>
				<td style="text-align: center">
					${ser.serviceMemo }
				</td>
				<td style="text-align: center">
				 <appfuse:user userId="<%=user.getId() %>" funcs="serviceManager.serviceMange.serviceTypeConfig.edit" >
					<a
						href="javascript:editTbDict('<c:out value="${ser.serviceTypeId}"/>')">
						<img src="<c:url value='/system/tab/images/33.gif'/>" width="14"
							height="14" title="编辑" /> </a>
				</appfuse:user>
				 <appfuse:user userId="<%=user.getId() %>" funcs="serviceManager.serviceMange.serviceTypeConfig.delete" >
					<a href="/sysappsafe/deleteSType.html?id=${ser.serviceTypeId}"
						onclick="return confirm('确定要删除吗?')"><img title="删除"
							src="<c:url value='/system/tab/images/11.gif'/>" width="14"
							height="14" /> </a>
				</appfuse:user>
				 <appfuse:user userId="<%=user.getId() %>" funcs="serviceManager.serviceMange.serviceTypeConfig.detail" >
					<a href="javascript:openTbDictValue(${ser.serviceTypeId})"> <img
							src="<c:url value='/system/tab/images/tb.gif'/>" width="14"
							height="14" title="详细" /> </a>
				</appfuse:user>
				</td>
			</c:forEach>
			<tr>
		<td colspan="10" style="text-align: right">
		 <appfuse:user userId="<%=user.getId() %>" funcs="serviceManager.serviceMange.serviceTypeConfig.nextPage" >
			每页显示${paginator.pageSize}行记录 共${paginator.totalRowsAmount}记录 
			当前	${paginator.currentPage}/${paginator.totalPages}页
					<a href="javascript:pageSubmit('1')"> 首页 </a>
					<a href="javascript:pageSubmit('${paginator.currentPage-1>0?paginator.currentPage-1:1}')">上一页 </a>
					<a href="javascript:pageSubmit('${paginator.currentPage +1}')">下一页 </a>
					<a href="javascript:pageSubmit('${paginator.totalPages}')">未页 </a>
		</appfuse:user>
		</td>
	</tr>
		</table>
	</s:form>


	<script type="text/javascript">
  function pageSubmit(page)
  {
  		document.forms[0].elements['paginator.currentPage'].value=page;
  		document.forms[0].submit();
  		
  }
	
</script>
servlet+ajax验证码
生成图片流的servlet

[java] view plaincopy
package com.jimo.tool;  
import java.awt.Color;     
import java.awt.Font;     
import java.awt.Graphics2D;     
import java.awt.image.BufferedImage;     
import java.util.Random;     
    
import javax.imageio.ImageIO;     
import javax.servlet.ServletException;     
import javax.servlet.ServletOutputStream;     
import javax.servlet.http.HttpServlet;     
import javax.servlet.http.HttpServletRequest;     
import javax.servlet.http.HttpServletResponse;     
import javax.servlet.http.HttpSession;     
    
/** 
* Package name : com.skcc.sample.action 
* File name : VerifyCodeServlet.java 
* Author : Administrator 
* Date : 2008-9-4 
* Description : VerifyCodeServlet 
*/  
public class VerifyCodeServlet extends HttpServlet {     
    
      
    /** 
    * 验证码图片的宽度。  
    */  
    private int width = 60;     
      
    /** 
    *  验证码图片的高度。 
    */  
    private int height = 20;     
    
   
    /** 
    * 验证码字符个数  
    */  
    private int codeCount = 4;     
    
    /** 
    * xx 
    */  
    private int xx = 0;     
    
    /** 
    * 字体高度    
    */  
    private int fontHeight;     
    
    /** 
    * codeY 
    */  
    private int codeY;     
    
    /** 
    * codeSequence 
    */  
    char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',     
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',     
            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };     
    
    /**   
     * 初始化验证图片属性   
     */    
    public void init() throws ServletException {     
        // 从web.xml中获取初始信息     
        // 宽度     
        String strWidth = this.getInitParameter("width");  
        // 高度     
        String strHeight = this.getInitParameter("height");     
        // 字符个数     
        String strCodeCount = this.getInitParameter("codeCount");     
    
        // 将配置的信息转换成数值     
        try {     
            if (strWidth != null && strWidth.length() != 0) {     
                width = Integer.parseInt(strWidth);     
            }     
            if (strHeight != null && strHeight.length() != 0) {     
                height = Integer.parseInt(strHeight);     
            }     
            if (strCodeCount != null && strCodeCount.length() != 0) {     
                codeCount = Integer.parseInt(strCodeCount);     
            }     
        } catch (NumberFormatException e) {  
         e.printStackTrace();  
        }     
    
        xx = width / (codeCount + 1);     
        fontHeight = height - 2;     
        codeY = height - 4;     
    
    }     
    
    /** 
    * @param req 
    * @param resp 
    * @throws ServletException 
    * @throws java.io.IOException 
    */  
    protected void service(HttpServletRequest req, HttpServletResponse resp)     
            throws ServletException, java.io.IOException {     
    
        // 定义图像buffer     
        BufferedImage buffImg = new BufferedImage(width, height,     
                BufferedImage.TYPE_INT_RGB);     
        Graphics2D gd = buffImg.createGraphics();     
    
        // 创建一个随机数生成器类     
        Random random = new Random();     
    
        // 将图像填充为白色     
        gd.setColor(Color.WHITE);     
        gd.fillRect(0, 0, width, height);     
    
        // 创建字体,字体的大小应该根据图片的高度来定。     
        Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);     
        // 设置字体。     
        gd.setFont(font);     
    
        // 画边框。     
        gd.setColor(Color.BLACK);  
        gd.drawRect(0, 0, width - 1, height - 1);     
    
        // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。     
        gd.setColor(Color.BLACK);     
        for (int i = 0; i < 1; i++) {     
            int x = random.nextInt(width);     
            int y = random.nextInt(height);     
            int xl = random.nextInt(12);     
            int yl = random.nextInt(12);     
            gd.drawLine(x, y, x + xl, y + yl);     
        }     
    
        // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。     
        StringBuffer randomCode = new StringBuffer();     
        int red = 0, green = 0, blue = 0;     
    
        // 随机产生codeCount数字的验证码。     
        for (int i = 0; i < codeCount; i++) {     
            // 得到随机产生的验证码数字。     
            String strRand = String.valueOf(codeSequence[random.nextInt(36)]);     
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。     
            red = random.nextInt(255);     
            green = random.nextInt(255);     
            blue = random.nextInt(255);     
    
            // 用随机产生的颜色将验证码绘制到图像中。     
            gd.setColor(new Color(red, green, blue));     
            gd.drawString(strRand, (i + 1) * xx, codeY);     
    
            // 将产生的四个随机数组合在一起。     
            randomCode.append(strRand);     
        }     
        // 将四位数字的验证码保存到Session中。     
        HttpSession session = req.getSession();     
        session.setAttribute("validateCode", randomCode.toString());     
    
        // 禁止图像缓存。     
        resp.setHeader("Pragma", "no-cache");     
        resp.setHeader("Cache-Control", "no-cache");     
        resp.setDateHeader("Expires", 0);     
    
        resp.setContentType("image/jpeg");     
    
        // 将图像输出到Servlet输出流中。     
        ServletOutputStream sos = resp.getOutputStream();     
        ImageIO.write(buffImg, "jpeg", sos);     
        sos.close();  
    }       
}   
 

处理结果的servlet

[java] view plaincopy
package com.jimo.tool;  
import java.io.IOException;     
import java.io.PrintWriter;     
    
import javax.servlet.ServletException;     
import javax.servlet.http.HttpServlet;     
import javax.servlet.http.HttpServletRequest;     
import javax.servlet.http.HttpServletResponse;     
    
/** 
* Package name : com.skcc.sample.action 
* File name : ResultServlet.java 
* Author : Administrator 
* Date : 2008-9-4 
* Description : ResultServlet 
*/  
public class ResultServlet extends HttpServlet {     
    
    /**   
     * The doGet method of the servlet. <br>   
     *   
     * This method is called when a form has its tag value method equals to get.   
     *    
     * @param request the request send by the client to the server   
     * @param response the response send by the server to the client   
     * @throws ServletException if an error occurred   
     * @throws IOException if an error occurred   
     */    
    public void doGet(HttpServletRequest request, HttpServletResponse response)     
            throws ServletException, IOException {  
        doPost(request, response);     
    }     
    
    /**   
     * The doPost method of the servlet. <br>   
     *   
     * This method is called when a form has its tag value method equals to post.   
     *    
     * @param request the request send by the client to the server   
     * @param response the response send by the server to the client   
     * @throws ServletException if an error occurred   
     * @throws IOException if an error occurred   
     */    
    public void doPost(HttpServletRequest request, HttpServletResponse response)     
            throws ServletException, IOException {     
    
        response.setContentType("text/html;charset=utf-8");     
        String validateC = request.getSession().getAttribute("validateCode").toString();     
        String veryCode = request.getParameter("c");     
        PrintWriter out = response.getWriter();     
        if(veryCode==null||"".equalsIgnoreCase(veryCode)){  
            out.println("验证码为空");  
        }else{     
            if(validateC.equalsIgnoreCase(veryCode)){     
                out.println("验证码正确");  
            }else{     
                out.println("验证码错误");     
            }     
        }     
        out.flush();     
        out.close();     
    }    
}  

 

页面调用:

 <script language="javascript" type="text/javascript" src="js/checknum.js"></script>

 

<input id="veryCode" name="veryCode" type="text" />
<img id="imgObj" alt="" src="verifyCodeServlet" align="middle"/>
<input type="button" onclick="changeImg()" value="换一张" />
<div id="info" style="color:red; font-size:12px; font-weight:600">验证码为空</div>
 
验证的js文件:
[javascript] view plaincopy
function changeImg(){   
   //alert("in changeImg");    
      var imgSrc = document.getElementById("imgObj");  
      //alert(""+imgSrc);     
      var oldsrc = imgSrc.src;   
      //alert(""+oldsrc);  
      var newsrc = chgUrl(oldsrc);  
      //alert(""+newsrc);   
      imgSrc.src = newsrc;    
  }     
  //时间戳     
  //为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳     
  function chgUrl(url){   
   //alert("in chgUrl");    
      var timestamp = (new Date()).valueOf();  
      //alert(""+url);  
      var postion = url.indexOf("?");  
      //alert(""+postion);   
      if(postion>=0){     
          var suburl = url.substr(0,postion);  
          //alert(""+ suburl);  
          url = suburl + "?timestamp=" + timestamp;      
      }else{     
          url = url + "?timestamp=" + timestamp;     
      }     
      return url;     
  }   
  
    
function isRightCode(){     
    var code = $("#veryCode").attr("value");  
    //alert(code);  
    code = "c=" + code;     
    $.ajax({     
        type:"post",     
        url:"resultServlet",  
        data:code,     
        success:callback  
    });     
}     
    
function callback(data){  
    $("#info").html(data);  
}  
jsp九大内置对象详解
 out - javax.servlet.jsp.jspWriter  
   out对象用于把结果输出到网页上。  
  
方法:  
1. void clear() ;  
   清除输出缓冲区的内容,但是不输出到客户端。  
  
2. void clearBuffer() ;  
   清除输出缓冲区的内容,并输出到客户端。  
  
3. void close() ;  
   关闭输出流,清除所有内容。  
  
4. void flush() ;  
   输出缓冲区里面的数据。  
  
5. int getBufferSize() ;  
   获取以kb为单位的目前缓冲区大小。  
  
6. int getRemaining() ;  
   获取以kb为单位的缓冲区中未被占用的空间大小。  
  
7. boolean isAutoFlush() ;  
   是否自动刷新缓冲区。  
  
8. void newLine() ;  
   输出一个换行字符。  
  
9. void print( boolean b ) ;  
   void print( char c ) ;  
   void print( char[] s ) ;  
   void print( double d ) ;  
   void print( float f ) ;  
   void print( int i ) ;  
   void print( long l ) ;  
   void print( Object obj ) ;  
   void print( String s ) ;  
   将指定类型的数据输出到Http流,不换行。  
  
10. void println( boolean b ) ;  
    void println( char c ) ;  
    void println( char[] s ) ;  
    void println( double d ) ;  
    void println( float f ) ;  
    void println( int i ) ;  
    void println( long l ) ;  
    void println( Object obj ) ;  
    void println( String s ) ;  
    将指定类型的数据输出到Http流,并输出一个换行符。  
      
11. Appendable append( char c ) ;  
    Appendable append( CharSequence cxq, int start, int end ) ;  
    Appendable append( CharSequence cxq ) ;  
    将一个字符或者实现了CharSequence接口的对象添加到输出流的后面。  
  
成员:  
int DEFAULT_BUFFER = 0    - 缺省缓冲区大小  
int NO_BUFFER = -1        - writer是否处于缓冲输出状态  
int UNBOUNDED_BUFFER = -2 - 是否限制缓冲区大小  
  
  
② request - javax.servlet.http.HttpServletRequest  
   request对象包含所有请求的信息,如请求的来源、标头、cookies和请求相关的参数值等。  
  
方法:  
1. Object getAttribute( String name ) ;  
   返回由name指定的属性值,该属性不存在时返回null。  
  
2. Enumeration getAttributeNames() ;  
   返回request对象的所有属性名称的集合。  
  
3. String getAuthType() ;  
   返回用来保护servlet的认证方法的名称,未受保护时返回null。  
  
4. String getCharacterEncoding() ;  
   返回请求中的字符编码方法,可以在response对象中设置。  
  
5. int getContentLength() ;  
   返回请求的BODY的长度,不能确定长度时返回-1。可以在response中设置。  
  
6. String getContentType() ;  
   返回在response中定义的内容类型。  
  
7. String getContentPath() ;  
   返回请求的路径。  
  
8. Cookie[] getCookies() ;  
   返回客户端所有的Cookie的数组。  
  
9. Enumeration getHeaderNames() ;  
   返回所有HTTP头的名称的集合。  
  
10. Enumeration getHeaders( String name ) ;  
    返回指定HTTP头的所有值的集合。  
  
11. String getHeader( String name ) ;  
    返回指定名称的HTTP头的信息。  
  
12. long getDateHeader( String name ) ;  
    返回指定名称的Data类型的HTTP头的信息。  
  
13. int getIntHeader( String name ) ;  
    返回指定名称的Int类型的HTTP头的信息。  
  
14. ServletInputStream getInputStream() ;  
    返回请求的输入流。  
  
15. Locale getLocale() ;  
    返回当前页的Locale对象,可以在response中设定。  
  
16. Enumeration getLocales() ;  
    返回请求中所有的Locale对象的集合。  
  
17. String getLocalName() ;  
    获取响应请求的服务器端主机名。  
  
18. String getLocalAddr() ;  
    获取响应请求的服务器端地址。  
  
19. int getLocalPort() ;  
    获取响应请求的服务器端端口  
  
20. String getMethod() ;  
    获取客户端向服务器端发送请求的方法(GET、POST)。  
  
21. String getParameter( String name ) ;  
    获取客户端发送给服务器端的参数值。  
  
22. Map getParameterMap() ;  
    该方法返回包含请求中所有参数的一个Map对象。  
  
23. Enumeration getParameterNames() ;  
    返回请求中所有参数的集合。  
  
24. String[] getParameterValues( String name ) ;  
    获得请求中指定参数的所有值。  
  
25. String getQueryString() ;  
    返回get方法传递的参数字符串,该方法不分解出单独的参数。  
  
26. String getPathInfo() ;  
    取出请求中处于ServletPath和QueryString之间的额外信息。  
  
27. String getPathTranslated() ;  
    返回用getPathInfo()方法取得的路径信息的实际路径。  
  
28. String getProtocol() ;  
    返回请求使用的协议。可以是HTTP1.1或者HTTP1.0。  
  
29. BufferedReader getReader() ;  
    返回请求的输入流对应的Reader对象,该方法和getInputStream()方法在一个页面中只能调用一个。  
  
30. String getRemoteAddr() ;  
    获取发出请求的客户端IP地址。  
  
31. String getRemoteHost() ;  
    获取发出请求的客户端主机名  
  
32. String getRemoteUser() ;  
    返回经过客户端验证的用户名,未经验证返回null。  
  
33. int getRemotePort() ;  
    返回发出请求的客户端主机端口。  
  
34. String getRealPath( String path ) ;  
    返回给定虚拟路径的物理路径。  
  
35. RequestDispatcher getRequestDispatcher( String path ) ;  
    按给定的路径生成资源转向处理适配器对象。  
  
36. String getRequestedSessionId() ;  
    返回请求的session的标识。  
  
37. String RequestURI() ;  
    返回发出请求的客户端地址,但是不包括请求的参数字符串。  
  
38. StringBuffer getRequestURI() ;  
    返回响应请求的服务器端地址  
  
39. String getScheme() ;  
    获取协议名称,缺省值为HTTP协议。  
  
40. String getServerName() ;  
    返回响应请求的服务器名称。  
  
41. String getServletPath() ;  
    获取客户端所请求的脚本文件的文件路径。  
  
42. int getServerPort() ;  
    获取响应请求的服务器端主机端口号。  
  
43. void removeAttribute( String name ) ;  
    在属性列表中删除指定名称的属性。  
  
44. void setAttribute( String name, Object value ) ;  
    在属性列表中添加/删除指定的属性。  
  
45. void setCharacterEncoding( String name ) ;  
    设置请求的字符编码格式。  
  
46. HttpSession getSession() ;  
    HttpSession getSession( boolean create ) ;  
    获取session,如果create为true,在无session的情况下创建一个。  
      
47. boolean isRequestedSessionIdFromCookie() ;  
    检查请求的会话ID是否为通过Cookie传入。  
  
48. boolean isRequestedSessionIdFromURL() ;  
    检查请求的会话ID是否为通过URL传入。  
  
49. boolean isRequestedSessionIdValid() ;  
    检查请求的会话ID是否仍然有效。  
  
50. boolean isSecure() ;  
    检查请求是否使用安全链接,如果HTTPS等。  
  
51. boolean isUserInRole( String role ) ;  
    检查已经通过验证的用户是否在是role所指定的角色。  
  
52. Principal getUserPrincipal() ;  
    返回包含用户登陆名的一个java.security.Principal对象。  
  
成员:  
String BASIC_AUTH = "BASIC"             -   
String CLIENT_CERT_AUTH = "CLIENT_CERT" -   
String DIGEST_AUTH = "DIGEST"           -   
String FORM_AUTH = "FORM"               -   
  
  
③ response - javax.servlet.http.HttpServletResponse  
   response对象主要将JSP容器处理后的结果传回到客户端。  
  
方法:  
1. void addCookie( Cookie cookie ) ;  
   添加一个Cookie对象,保存客户端信息。  
  
2. void addDateHeader( String name, long value ) ;  
   添加一个日期类型的HTTP头信息,覆盖同名的HTTP头信息。  
  
3. void addHeader( String name, String value ) ;  
   添加一个HTTP头,覆盖同名的旧HTTP头。  
  
4. void addIntHeader( String name, int value ) ;  
   添加一个整型的HTTP头,覆盖同名的旧HTTP头。  
  
5. boolean containsHeader( String name ) ;  
   判断指定的HTTP头是否存在。  
  
6. String encodeRedirectURL( String url ) ;  
   对sendRedirect()方法使用的URL进行编码。  
  
7. String encodeURL( String url ) ;  
   将URL予以编码,回传包含session ID的URL。  
     
8. void flushBuffer() ;  
   强制把当前缓冲区的内容发送到客户端。  
  
9. int getBufferSize() ;  
   取得以kb为单位的缓冲区大小。  
  
10. String getCharacterEncoding() ;  
    获取响应的字符编码格式。  
  
11. String getContentType() ;  
    获取响应的类型。  
  
12. Locale getLocale() ;  
    获取响应的Locale对象。  
  
13. ServletOutputStream getOutputStream() ;  
    返回客户端的输出流对象。  
  
14. PrintWriter getWriter() ;  
    获取输出流对应的writer对象。  
  
15. boolean isCommitted() ;  
    判断服务器端是否已经将数据输出到客户端。  
  
16. void reset() ;  
    清空buffer中的所有内容。  
  
17. void resetBuffer() ;  
    情况buffer中所有的内容,但是保留HTTP头和状态信息。  
  
18. void sendError( int xc, String msg ) ;  
    void sendError( int xc ) ;  
    发送错误,包括状态码和错误信息。  
  
19. void sendRedirect( String locationg ) ;  
    把响应发送到另外一个位置进行处理。  
  
20. void setBufferSize( int size ) ;  
    设置以kb为单位的缓冲区大小。  
  
21. void setCharacterEncoding( String charset ) ;  
    设置响应使用的字符编码格式。  
  
22. void setContentLength( int length ) ;  
    设置响应的BODY长度。  
  
23. void setContentType( String type ) ;  
    设置响应的类型。  
  
24. void setDateHeader( String name, long value ) ;  
    设置指定名称的Data类型的HTTP头的值。  
  
25. void setHeader( String name, String value ) ;  
    设置指定名称的HTTP头的值。  
  
26. void setIntHeader( String name, int value ) ;  
    设置指定名称的int类型的HTTP头的值。  
  
27. void setStatus( int xc ) ;  
    设置响应状态码,新值会覆盖当前值。  
  
成员(HTTP状态码):  
int SC_CONTINUE = 100                      int SC_SWITCHING_PROTOCOLS = 101  
int SC_OK = 200                            int SC_NON_AUTHORITATIVE_INFORMATION = 203  
int SC_ACCEPTED = 202                      int SC_CREATED = 201  
int SC_NO_CONTENT = 204                    int SC_RESET_CONTENT = 205  
int SC_PARTIAL_CONTENT = 206               int SC_MULTIPLE_CHOICES = 300  
int SC_MOVED_PERMANENTLY = 301             int SC_MOVED_TEMPORARILY = 302  
int SC_FOUND = 302                         int SC_SEE_OTHER = 303  
int SC_NOT_MODIFIED = 304                  int SC_USE_PROXY = 305  
int SC_TEMPORARY_REDIRECT = 307            int SC_BAD_REQUEST = 400  
int SC_UNAUTHORIZED = 401                  int SC_PAYMENT_REQUIRED = 402  
int SC_FORBIDDEN = 403                     int SC_NOT_FOUND = 404  
int SC_METHOD_NOT_ALLOWED = 405            int SC_NOT_ACCEPTABLE = 406  
int SC_PROXY_AUTHENTICATION_REQUIRED = 407 int SC_REQUEST_TIMEOUT = 408  
int SC_CONFLICT = 409                      int SC_GONE = 410  
int SC_LENGTH_REQUIRED = 411               int SC_PRECONDITION_FAILED = 412  
int SC_REQUEST_ENTITY_TOO_LARGE = 413      int SC_REQUEST_URI_TOO_LONG = 414  
int SC_UNSUPPORTED_MEDIA_TYPE = 415        int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416  
int SC_EXPECTATION_FAILED = 417            int SC_INTERNAL_SERVER_ERROR = 500  
int SC_NOT_IMPLEMENTED = 501               int SC_BAD_GATEWAY = 502  
int SC_SERVICE_UNAVAILABLE = 503           int SC_GATEWAY_TIMEOUT = 504  
int SC_HTTP_VERSION_NOT_SUPPORTED = 505  
  
  
④ session - javax.servlet.http.HttpSession  
   session对象表示目前个别用户的会话状态,用来识别每个用户。  
  
方法:  
1. Object getAttribute( String name ) ;  
   获取与指定名字相关联的session属性值。  
  
2. Enumeration getAttributeNames() ;  
   取得session内所有属性的集合。  
  
3. long getCreationTime() ;  
   返回session的创建时间,最小单位千分之一秒。  
  
4. String getId() ;  
   取得session标识。  
  
5. long getLastAccessedTime() ;  
   返回与当前session相关的客户端最后一次访问的时间,由1970-01-01算起,单位毫秒。  
  
6. int getMaxInactiveInterval( int interval ) ;  
   返回总时间,以秒为单位,表示session的有效时间(session不活动时间)。-1为永不过期。  
  
7. ServletContext getServletContext() ;  
   返回一个该JSP页面对应的ServletContext对象实例。  
  
8. HttpSessionContext getSessionContext() ;  
     
  
9. Object getValue( String name ) ;  
   取得指定名称的session变量值,不推荐使用。  
  
10. String[] getValueNames() ;  
    取得所有session变量的名称的集合,不推荐使用。  
  
11. void invalidate() ;  
    销毁这个session对象。  
  
12. boolean isNew() ;  
    判断一个session是否由服务器产生,但是客户端并没有使用。  
  
13. void pubValue( String name, Object value ) ;  
    添加一个session变量,不推荐使用。  
  
14. void removeValue( String name ) ;  
    移除一个session变量的值,不推荐使用。  
  
15. void setAttribute( String name, String value ) ;  
    设置指定名称的session属性值。  
  
16. void setMaxInactiveInterval( int interval ) ;  
    设置session的有效期。  
  
17. void removeAttribute( String name ) ;  
    移除指定名称的session属性。  
  
  
⑤ pageContext - javax.servlet.jsp.PageContext  
   pageContext对象存储本JSP页面相关信息,如属性、内建对象等。  
  
方法:  
1. void setAttribute( String name, Object value, int scope ) ;  
   void setAttribute( String name, Object value ) ;  
   在指定的共享范围内设置属性。  
  
2. Object getAttribute( String name, int scope ) ;  
   Object getAttribute( String name ) ;  
   取得指定共享范围内以name为名字的属性值。  
  
3. Object findAttribute( String name ) ;  
   按页面、请求、会话和应用程序共享范围搜索已命名的属性。  
  
4. void removeAttribute( String name, int scope ) ;  
   void removeAttribute( String name ) ;  
   移除指定名称和共享范围的属性。  
  
5. void forward( String url ) ;  
   将页面导航到指定的URL。  
  
6. Enumeration getAttributeNamesScope( int scope ) ;  
   取得指定共享范围内的所有属性名称的集合。  
  
7. int getAttributeScope( String name ) ;  
   取得指定属性的共享范围。  
  
8. ErrorData getErrorDate() ;  
   取得页面的errorData对象。  
  
9. Exception getException() ;  
   取得页面的exception对象。  
  
10. ExpressionEvaluator getExpressionEvaluator() ;  
    取得页面的expressionEvaluator对象。  
  
11. JspWriter getOut() ;  
    取得页面的out对象。  
  
12. Object getPage() ;  
    取得页面的page对象。  
  
13. ServletRequest getRequest() ;  
    取得页面的request对象。  
  
14. ServletResponse getResponse() ;  
    取得页面的response对象。  
  
15. ServletConfig getConfig() ;  
    取得页面的config对象。  
  
16. ServletContext getServletContext() ;  
    取得页面的servletContext对象。  
  
17. HttpSession getSession() ;  
    取得页面的session对象。  
  
18. VariableResolver getVariableResolver() ;  
    取得页面的variableResolver对象。  
  
19. void include( String url, boolean flush ) ;  
    void include( String url ) ;  
    包含其他的资源,并指定是否自动刷新。  
  
20. void release() ;  
    重置pageContext内部状态,释放所有内部引用。  
  
21. void initialize( Servlet servlet, ServletRequest request, ServletResponse response,  
                     String errorPageURL, boolean needSession, int bufferSize, boolean autoFlush ) ;  
    初始化未经初始化的pageContext对象。  
  
22. BodyContext pushBody() ;  
    BodyContext pushBody( Writer writer ) ;  
    保存当前的out对象,并更新pageContext中page范围内的out对象。  
  
23. JspWrite popBody() ;  
    取出由pushBody()方法保存的out对象。  
  
24. void handlePageException( Exception e ) ;  
    void handlePageException( Thrwoable t ) ;  
      
  
成员:  
int PAGE_SCOPE = 1        - 页面共享范围  
int REQUEST_SCOPE = 2     - 请求共享范围  
int SESSION_SCOPE = 3     - 会话共享范围  
int APPLICATION_SCOPE = 4 - 应用程序共享范围  
String PAGE = "javax.servlet.jsp.jspPage"  
String PAGECONTEXT = "javax.servlet.jsp.jspPageContext"  
String REQUEST = "javax.servlet.jsp.jspRequest"  
String RESPONSE = "javax.servlet.jsp.jspResponse"  
String CONFIG = "javax.servlet.jsp.jspConfig"  
String SESSION = "javax.servlet.jsp.jspSession"  
String OUT = "javax.servlet.jsp.jspOut"  
String APPLICATION = "javax.servlet.jsp.jspApplication"  
String EXCEPTION = "javax.servlet.jsp.jspException"  
  
  
⑥ application - javax.servlet.ServletContext  
   application主要功用在于取得或更改Servlet的设定。  
  
方法:  
1. Object getAttribute( String name ) ;  
   返回由name指定的application属性。  
  
2. Enumeration getAttributes() ;  
   返回所有的application属性。  
  
3. ServletContext getContext( String uripath ) ;  
   取得当前应用的ServletContext对象。  
  
4. String getInitParameter( String name ) ;  
   返回由name指定的application属性的初始值。  
  
5. Enumeration getInitParameters() ;  
   返回所有的application属性的初始值的集合。  
  
6. int getMajorVersion() ;  
   返回servlet容器支持的Servlet API的版本号。  
  
7. String getMimeType( String file ) ;  
   返回指定文件的类型,未知类型返回null。一般为"text/html"和"image/gif"。  
  
8. int getMinorVersion() ;  
   返回servlet容器支持的Servlet API的副版本号。  
  
9. String getRealPath( String path ) ;  
   返回给定虚拟路径所对应物理路径。  
  
10. RequestDispatcher getNamedDispatcher( String name ) ;  
    为指定名字的Servlet对象返回一个RequestDispatcher对象的实例。  
  
11. RequestDispatcher getRequestDispatcher( String path ) ;  
    返回一个RequestDispatcher对象的实例。  
  
12. URL getResource( String path ) ;  
    返回指定的资源路径对应的一个URL对象实例,参数要以"/"开头。  
  
13. InputStream getResourceAsStream( String path ) ;  
    返回一个由path指定位置的资源的InputStream对象实例。  
  
14. Set getResourcePaths( String path ) ;  
    返回存储在web-app中所有资源路径的集合。  
  
15. String getServerInfo() ;  
    取得应用服务器版本信息。  
  
16. Servlet getServlet( String name ) ;  
    在ServletContext中检索指定名称的servlet。  
  
17. Enumeration getServlets() ;  
    返回ServletContext中所有servlet的集合。  
  
18. String getServletContextName() ;  
    返回本web应用的名称。  
  
19. Enumeration getServletContextNames() ;  
    返回ServletContext中所有servlet的名称集合。  
  
20. void log( Exception ex, String msg ) ;  
    void log( String msg, Throwable t ) ;  
    void log( String msg ) ;  
    把指定的信息写入servlet log文件。  
  
21. void removeAttribute( String name ) ;  
    移除指定名称的application属性。  
  
22. void setAttribute( String name, Object value ) ;  
    设定指定的application属性的值。  
  
  
⑦ config - javax.servlet.ServletConfig  
   config对象用来存放Servlet初始的数据结构。  
  
方法:  
1. String getInitParameter( String name ) ;  
   返回名称为name的促使参数的值。  
  
2. Enumeration getInitParameters() ;  
   返回这个JSP所有的促使参数的名称集合。  
  
3. ServletContext getContext() ;  
   返回执行者的servlet上下文。  
  
4. String getServletName() ;  
   返回servlet的名称。  
  
  
⑧ exception - java.lang.Throwable  
   错误对象,只有在JSP页面的page指令中指定isErrorPage="true"后,才可以在本页面使用exception对象。  
  
方法:  
1. Throwable fillInStackTrace() ;  
   将当前stack信息记录到exception对象中。  
  
2. String getLocalizedMessage() ;  
   取得本地语系的错误提示信息。  
  
3. String getMessage()  
   取得错误提示信息。  
  
4. StackTrackElement[] getStackTrace() ;  
   返回对象中记录的call stack track信息。  
  
5. Throwable initCause( Throwable cause ) ;  
   将另外一个异常对象嵌套进当前异常对象中。  
     
6. Throwable getCause() ;  
   取出嵌套在当前异常对象中的异常。  
  
7. void printStackTrace() ;  
   void printStackTrace( printStream s ) ;  
   void printStackTrace( printWriter s ) ;  
   打印出Throwable及其call stack trace信息。  
  
8. void setStackTrace( StackTraceElement[] stackTrace )  
   设置对象的call stack trace信息。  
  
  
⑨ page - javax.servlet.jsp.HttpJspPage  
   page对象代表JSP对象本身,或者说代表编译后的servlet对象,  
   可以用( (javax.servlet.jsp.HttpJspPage)page )来取用它的方法和属性
oraxcle 80端口占用解决方法
可能在本地同时安装过Tomcat和Oracle的人都会知道,安装完Oracle后,会发现Tomcat的8080端口已经被Oracle占用了。

完全安装Oracle数据库后,当我们访问8080端口时,会弹出一个XDB窗口,要求输入用户名和密码。这样将和我们本地一些使用该端口的应用冲突,比如tomcat、jboss等,虽然这些端口是可以修改的,但总是不爽oracle一直占用这个端口。 
其实那是Oracle的一个XML数据库服务占用了8080端口,解决方法有以下几种:
方法一:可以使用sys账号以sysdba身份登录进去,用以下语句更改掉Oracle所占用的端口:

Oracle 9i:call   dbms_namespace.shell('@jis/install/serverendp.ssh   admin   8080   9090   -register');

Oracle 10g:call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',9090));

注意:以上语句是更改Oracle XML数据库端口为9090,你可以改为其它空闲的端口。执行以上命令要以sysdba身份进行登陆。


方法二:
可以到开始菜单下的Oracle组里选择Database  Configuration  Assistant,将XDM服务的默认端口改掉 ,如改成8081即可。
tcp与udp详解
[转]TCP、UDP协议详解 
1.  
      现在Internet上流行的协议是TCP/IP协议,该协议中对低于1024的端口都有确切的定义,他们对应着Internet上一些常见的服务。这些常见的服务可以分为使用TCP端口(面向连接)和使用UDP端口(面向无连接)两种。
      说到TCP和UDP,首先要明白“连接”和“无连接”的含义,他们的关系可以用一个形象地比喻来说明,就是打电话和写信。两个人如果要通话,首先要建立 连接——即打电话时的拨号,等待响应后——即接听电话后,才能相互传递信息,最后还要断开连接——即挂电话。写信就比较简单了,填写好收信人的地址后将信 投入邮筒,收信人就可以收到了。从这个分析可以看出,建立连接可以在需要通信的双方建立一个传递信息的通道,在发送方发送请求连接信息接收方响应后,由于是在接受方响应后才开始传递信息,而且是在一个通道中传送,因此接受方能比较完整地收到发送方发出的信息,即信息传递的可靠性比较高。但也正因为需要建立连接,使资源开销加大(在建立连接前必须等待接受方响应,传输信息过程中必须确认信息是否传到及断开连接时发出相应的信号等),独占一个通道,在断开连接前不能建立另一个连接,即两人在通话过程中第三方不能打入电话。而无连接是一开始就发送信息(严格说来,这是没有开始、结束的),只是一次性的传递,是先不需要接受方的响应,因而在一定程度上也无法保证信息传递的可靠性了,就像写信一样,我们只是将信寄出去,却不能保证收信人一定可以收到。
      TCP是面向连接的,有比较高的可靠性,  一些要求比较高的服务一般使用这个协议,如FTP、Telnet、SMTP、HTTP、POP3等,而UDP是面向无连接的,使用这个协议的常见服务有 DNS、SNMP、QQ等。对于QQ必须另外说明一下,QQ2003以前是只使用UDP协议的,其服务器使用8000端口,侦听是否有信息传来,客户端使 用4000端口,向外发送信息(这也就不难理解在一般的显IP的QQ版本中显示好友的IP地址信息中端口常为4000或其后续端口的原因了),即QQ程序 既接受服务又提供服务,在以后的QQ版本中也支持使用TCP协议了。

      
2.
      在了解TCP和UDP之前,我们需要来了解俩个概念,面向连接的服务和无连接的服务,应用面向连接的服务时,客户和服务器在进行数据发送前,彼此向对方发送控制分组,这就是所谓的握手过程,使得客户和服务器都做好分组交换准备。这个准备是很松散的,面向连接服务与很多其他的服务捆绑在一起,包括可靠的数据传输,流量控制和拥塞控制等,依赖连接以正确的顺序无错地传递所有数据。还要使用确认和重传机制实现来可靠性。而无连接服务侧是没有握手过程的,当一方想发送数据时就直接了当地发送,因为没有握手过程也就没有什么流量控制和拥塞控制,这样数据可能传输得更快,但是,由于也没有确认过程,源端就不知道那些分组到达了目的端。因此可能在传输过程中丢失数据,不适合用在一些文件的传输,可以用在因特网电话,视频会议什么的。 
    TCP(传输控制协议)和UDP(用户数据报协议)是传输层的俩个传输协议,它们俩个的最大区别就是是否面向连接。
    TCP包括了面向连接和可靠数据传输服务,在客户端和服务器端进行通信前,要先交换传输层控制信息,为双方的通信做好准备。在这个握手阶段后,我们就可以认为在这俩个进程间存在一个TCP连接,且是一个全双工的连接,在消息发送完后,应用程序会告诉TCP拆除这个连接。可靠的传输服务为了保障彼此通信能无差错地顺序传递所有数据。
    当其中任何一个应用程序把一个字节流传如套接字时,它可以指望TCP把同样的字节流传递到对方的套接字,中间不回丢失和重传。TCP是因特网的一种公益服务,其目的是能调节数据传输过程中的一些问题,因此还要包含一个拥塞机制。TCP拥塞机制在网络变得拥塞时阻止发送进程。确切地说,TCP拥塞控制试图把每个TCP连接限定在它所公平共享的网络带宽上。对于有最小带宽需求限制的实时音频或视频应用来说,阻止其带宽那就让它们不能正常工作,此外,我们能想象一下,在网络电话通话时,偶尔的不连续是可以容忍的,可见实时应用可以容忍丢失少部分数据,不需要完全可靠服务。
    说了这么多,TCP能提供的好的服务,再看一下其缺点吧,首先,TCP不保证最小传输率,通俗点说,TCP不允许发送进程以想要的速率发送数据,受到TCP拥塞控制的调节,发送进程有可能被迫以一个较低的平均速率发送。其次,TCP不提供任何延时保障,具体点说,发送进程把数据传入自己的TCP套接字后,这个数据将最终到达其接受套接字,但是中间所经历的时间就不能保证了 ,花几秒或则几分钟都不一定。
    UDP是一个非面向连接的轻量级传输协议,具有一个最简单的服务模型。UDP是无连接的,因此两个进程彼此通信之前没有握手过程。UDP提供不可靠的数据传输服务,也就是说当一个进程往自己套接字发送一个消息时,UDP不能保障这个消息回最终到达接受套接字。另外,就确实到达接收套节字的消息而言,他们的到达顺序也可能不是有序的。
   
    UDP不含拥塞控制机制,因此发送进程能够以任意速率往UDP套接字发送数据,尽管不能保证所有数据都到达接收套接字,但是会有相当比列的数据到达。实时应用程序的开发人员往往选择在UDP上运行他们的应用。与TCP类似,UDP也不提供任何延迟保证。
    说了这么多,我们可以通过下表来体会一下上面说的真正含义。
应    用	应用层协议	用来支撑的传输协议
电子邮件	SMTP(RFC82)	TCP
远程终端访问	Telenet	TCP
WEB	HTTP	TCP
文件传送	FTP	TCP
远程文件服务器	NFS	TCP或UDP
流多媒体	专属	UDP或TCP
因特网电话	专属	一般为UDP

    在表中我们看到,电子邮件,远程终端访问,WEB和文件传送都使用TCP协议,这些应用选择TCP的主要原因是在于TCP提供了可靠的数据传输服务,能够保证所有数据最终到达其目的地。我们还看到,因特网电话一般运行在UDP协议上面,一个因特网电话应用的俩端都得以某个最小速率跨越网络发送数据;另外,因特网电话可以容忍数据丢失,从这个俩个条件来看,都适合UDP,不需要可靠的TCP传输服务。
    总的来说,TCP能保证传递全部数据,而UDP不能,且他们都不提供延迟保证。他们不提供延迟保证,并不意味着时间敏感的应用不能运行在现在的因特网上,而是应用是通过一些其他的方法来保证这些需要。
oracle常用函数
1.	ASCII 
返回与指定的字符对应的十进制数; 
SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dual; 
A A ZERO SPACE 
--------- --------- --------- --------- 
65 97 48 32 

2. CHR 
给出整数,返回对应的字符; 
SQL> select chr(54740) zhao,chr(65) chr65 from dual; 
ZH C 
-- - 
赵 A 
3. CONCAT 
连接两个字符串; 
SQL> select concat(010-,88888888)||转23 高乾竞电话 from dual; 
高乾竞电话 
---------------- 
010-88888888转23 
4. INITCAP 
返回字符串并将字符串的第一个字母变为大写; 
SQL> select initcap(smith) upp from dual; 
UPP 
----- 
Smith 

5.INSTR(C1,C2,I,J) 
在一个字符串中搜索指定的字符,返回发现指定的字符的位置; 
C1 被搜索的字符串 
C2 希望搜索的字符串 
I 搜索的开始位置,默认为1 
J 出现的位置,默认为1 
SQL> select instr(oracle traning,ra,1,2) instring from dual; 
INSTRING 
--------- 
9 

6.LENGTH 
返回字符串的长度; 
SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao.nchar_tst; 
NAME LENGTH(NAME) ADDR LENGTH(ADDR) SAL LENGTH(TO_CHAR(SAL)) 
------ ------------ ---------------- ------------ --------- -------------------- 
高乾竞 3 北京市海锭区 6 9999.99 7 

7.LOWER 
返回字符串,并将所有的字符小写 
SQL> select lower(AaBbCcDd)AaBbCcDd from dual; 
AABBCCDD 
-------- 
aabbccdd 

8.UPPER 
返回字符串,并将所有的字符大写 
SQL> select upper(AaBbCcDd) upper from dual; 
UPPER 
-------- 
AABBCCDD 

9.RPAD和LPAD(粘贴字符) 
RPAD 在列的右边粘贴字符 
LPAD 在列的左边粘贴字符 
SQL> select lpad(rpad(gao,10,*),17,*)from dual; 
LPAD(RPAD(GAO,1 
----------------- 
*******gao******* 
不够字符则用*来填满 

10.LTRIM和RTRIM 
LTRIM 删除左边出现的字符串 
RTRIM 删除右边出现的字符串 
SQL> select ltrim(rtrim( gao qian jing , ), ) from dual; 
LTRIM(RTRIM( 
------------- 
gao qian jing 

11.SUBSTR(string,start,count) 
取子字符串,从start开始,取count个 
SQL> select substr(13088888888,3,8) from dual; 
SUBSTR( 
-------- 
08888888 

12.REPLACE(string,s1,s2) 
string 希望被替换的字符或变量 
s1 被替换的字符串 
s2 要替换的字符串 
SQL> select replace(he love you,he,i) from dual; 
REPLACE(H 
---------- 
i love you 

13.SOUNDEX 
返回一个与给定的字符串读音相同的字符串 
SQL> create table table1(xm varchar(8)); 
SQL> insert into table1 values(weather); 
SQL> insert into table1 values(wether); 
SQL> insert into table1 values(gao); 
SQL> select xm from table1 where soundex(xm)=soundex(weather); 
XM 
-------- 
weather 
wether 
• 14.TRIM(s from string) 
LEADING 剪掉前面的字符 
TRAILING 剪掉后面的字符 
如果不指定,默认为空格符 
15.ABS 
返回指定值的绝对值 
SQL> select abs(100),abs(-100) from dual; 
ABS(100) ABS(-100) 
--------- --------- 
100 100 

16.ACOS 
给出反余弦的值 
SQL> select acos(-1) from dual; 
ACOS(-1) 
--------- 
3.1415927 

17.ASIN 
给出反正弦的值 
SQL> select asin(0.5) from dual; 
ASIN(0.5) 
--------- 
.52359878 

18.ATAN 
返回一个数字的反正切值 
SQL> select atan(1) from dual; 
ATAN(1) 
--------- 
.78539816 

19.CEIL 
返回大于或等于给出数字的最小整数 
SQL> select ceil(3.1415927) from dual; 
CEIL(3.1415927) 
--------------- 
4 

20.COS 
返回一个给定数字的余弦 
SQL> select cos(-3.1415927) from dual; 
COS(-3.1415927) 
--------------- 
-1
21.COSH 
返回一个数字反余弦值 
SQL> select cosh(20) from dual; 
COSH(20) 
--------- 
242582598 

22.EXP 
返回一个数字e的n次方根 
SQL> select exp(2),exp(1) from dual; 
EXP(2) EXP(1) 
--------- --------- 
7.3890561 2.7182818 

23.FLOOR 
对给定的数字取整数 
SQL> select floor(2345.67) from dual; 
FLOOR(2345.67) 
-------------- 
2345 

24.LN 
返回一个数字的对数值 
SQL> select ln(1),ln(2),ln(2.7182818) from dual; 
LN(1) LN(2) LN(2.7182818) 
--------- --------- ------------- 
0 .69314718 .99999999 

25.LOG(n1,n2) 
返回一个以n1为底n2的对数 
SQL> select log(2,1),log(2,4) from dual; 
LOG(2,1) LOG(2,4) 
--------- --------- 
0 2 

26.MOD(n1,n2) 
返回一个n1除以n2的余数 
SQL> select mod(10,3),mod(3,3),mod(2,3) from dual; 
MOD(10,3) MOD(3,3) MOD(2,3) 
--------- --------- --------- 
1 0 2 

27.POWER 
返回n1的n2次方根 
SQL> select power(2,10),power(3,3) from dual; 
POWER(2,10) POWER(3,3) 
----------- ---------- 
1024 27 

28.ROUND和TRUNC 
按照指定的精度进行舍入 
SQL> select round(55.5),round(-55.4),trunc(55.5),trunc(-55.5) from dual; 
ROUND(55.5) ROUND(-55.4) TRUNC(55.5) TRUNC(-55.5) 
----------- ------------ ----------- ------------ 
56 -55 55 -55 

29.SIGN 
取数字n的符号,大于0返回1,小于0返回-1,等于0返回0 
SQL> select sign(123),sign(-100),sign(0) from dual; 
SIGN(123) SIGN(-100) SIGN(0) 
--------- ---------- --------- 
1 -1 0 

30.SIN 
返回一个数字的正弦值 
SQL> select sin(1.57079) from dual; 
SIN(1.57079) 
------------ 
1 
• 31.SIGH 
返回双曲正弦的值 
SQL> select sin(20),sinh(20) from dual; 
SIN(20) SINH(20) 
--------- --------- 
.91294525 242582598 

32.SQRT 
返回数字n的根 
SQL> select sqrt(64),sqrt(10) from dual; 
SQRT(64) SQRT(10) 
--------- --------- 
8 3.1622777 

33.TAN 
返回数字的正切值 
SQL> select tan(20),tan(10) from dual; 
TAN(20) TAN(10) 
--------- --------- 
2.2371609 .64836083 

34.TANH 
返回数字n的双曲正切值 
SQL> select tanh(20),tan(20) from dual; 
TANH(20) TAN(20) 
--------- --------- 
1 2.2371609 

35.TRUNC 
按照指定的精度截取一个数 
SQL> select trunc(124.1666,-2) trunc1,trunc(124.16666,2) from dual; 
TRUNC1 TRUNC(124.16666,2) 
--------- ------------------ 
100 124.16 

36.ADD_MONTHS 
增加或减去月份 
SQL> select to_char(add_months(to_date(199912,yyyymm),2),yyyymm) from dual; 
TO_CHA 
------ 
200002 
SQL> select to_char(add_months(to_date(199912,yyyymm),-2),yyyymm) from dual; 
TO_CHA 
------ 
199910 

37.LAST_DAY 
返回日期的最后一天 
SQL> select to_char(sysdate,yyyy.mm.dd),to_char((sysdate)+1,yyyy.mm.dd) from dual; 
TO_CHAR(SY TO_CHAR((S 
---------- ---------- 
2004.05.09 2004.05.10 
SQL> select last_day(sysdate) from dual; 
LAST_DAY(S 
---------- 
31-5月 -04 

38.MONTHS_BETWEEN(date2,date1) 
给出date2-date1的月份 
SQL> select months_between(19-12月-1999,19-3月-1999) mon_between from dual; 
MON_BETWEEN 
----------- 
9 
SQL>selectmonths_between(to_date(2000.05.20,yyyy.mm.dd),to_date(2005.05.20,yyyy.mm.dd)) mon_betw from dual; 
MON_BETW 
--------- 
-60 

39.NEW_TIME(date,this,that) 
给出在this时区=other时区的日期和时间 
SQL> select to_char(sysdate,yyyy.mm.dd hh24:mi:ss) bj_time,to_char(new_time 
2 (sysdate,PDT,GMT),yyyy.mm.dd hh24:mi:ss) los_angles from dual; 
BJ_TIME LOS_ANGLES 
------------------- ------------------- 
2004.05.09 11:05:32 2004.05.09 18:05:32 

40.NEXT_DAY(date,day) 
给出日期date和星期x之后计算下一个星期的日期 
SQL> select next_day('18-5月-2001','星期五') next_day from dual; 
NEXT_DAY 
---------- 
25-5月 -01 

41.SYSDATE 
用来得到系统的当前日期 
SQL> select to_char(sysdate,dd-mm-yyyy day) from dual; 
TO_CHAR(SYSDATE, 
----------------- 
09-05-2004 星期日 
trunc(date,fmt)按照给出的要求将日期截断,如果fmt=mi表示保留分,截断秒 
SQL> select to_char(trunc(sysdate,hh),yyyy.mm.dd hh24:mi:ss) hh, 
2 to_char(trunc(sysdate,mi),yyyy.mm.dd hh24:mi:ss) hhmm from dual; 
HH HHMM 
------------------- ------------------- 
2004.05.09 11:00:00 2004.05.09 11:17:00 

42.CHARTOROWID 
将字符数据类型转换为ROWID类型 
SQL> select rowid,rowidtochar(rowid),ename from scott.emp; 
ROWID ROWIDTOCHAR(ROWID) ENAME 
------------------ ------------------ ---------- 
AAAAfKAACAAAAEqAAA AAAAfKAACAAAAEqAAA SMITH 
AAAAfKAACAAAAEqAAB AAAAfKAACAAAAEqAAB ALLEN 
AAAAfKAACAAAAEqAAC AAAAfKAACAAAAEqAAC WARD 
AAAAfKAACAAAAEqAAD AAAAfKAACAAAAEqAAD JONES 

43.CONVERT(c,dset,sset) 
将源字符串 sset从一个语言字符集转换到另一个目的dset字符集 
SQL> select convert(strutz,we8hp,f7dec) "conversion" from dual; 
conver 
------ 
strutz 

44.HEXTORAW 
将一个十六进制构成的字符串转换为二进制 

45.RAWTOHEXT 
将一个二进制构成的字符串转换为十六进制 

46.ROWIDTOCHAR 
将ROWID数据类型转换为字符类型 

47.TO_CHAR(date,format) 
SQL> select to_char(sysdate,yyyy/mm/dd hh24:mi:ss) from dual; 
TO_CHAR(SYSDATE,YY 
------------------- 
2004/05/09 21:14:41 
• 48.TO_DATE(string,format) 
将字符串转化为ORACLE中的一个日期 

49.TO_MULTI_BYTE 
将字符串中的单字节字符转化为多字节字符 
SQL> select to_multi_byte(高) from dual; 
TO 
-- 
高 

50.TO_NUMBER 
将给出的字符转换为数字 
SQL> select to_number(1999) year from dual; 
YEAR 
--------- 
1999
51.BFILENAME(dir,file) 
指定一个外部二进制文件 
SQL>insert into file_tb1 values(bfilename(lob_dir1,image1.gif)); 

52.CONVERT(x,desc,source) 
将x字段或变量的源source转换为desc 
SQL> select sid,serial#,username,decode(command, 
2 0,none, 
3 2,insert, 
4 3, 
5 select, 
6 6,update, 
7 7,delete, 
8 8,drop, 
9 other) cmd from v$session where type!=background; 
SID SERIAL# USERNAME CMD 
--------- --------- ------------------------------ ------ 
1 1 none 
2 1 none 
3 1 none 
4 1 none 
5 1 none 
6 1 none 
7 1275 none 
8 1275 none 
9 20 GAO select 
10 40 GAO none 

53.DUMP(s,fmt,start,length) 
DUMP函数以fmt指定的内部数字格式返回一个VARCHAR2类型的值 
SQL> col global_name for a30 
SQL> col dump_string for a50 
SQL> set lin 200 
SQL> select global_name,dump(global_name,1017,8,5) dump_string from global_name; 
GLOBAL_NAME DUMP_STRING 
------------------------------ -------------------------------------------------- 
ORACLE.WORLD Typ=1 Len=12 CharacterSet=ZHS16GBK: W,O,R,L,D 

54.EMPTY_BLOB()和EMPTY_CLOB() 
这两个函数都是用来对大数据类型字段进行初始化操作的函数 

55.GREATEST 
返回一组表达式中的最大值,即比较字符的编码大小. 
SQL> select greatest(AA,AB,AC) from dual; 
GR 
-- 
AC 
SQL> select greatest(啊,安,天) from dual; 
GR 
-- 
天 

56.LEAST 
返回一组表达式中的最小值 
SQL> select least(啊,安,天) from dual; 
LE 
-- 
啊 

57.UID 
返回标识当前用户的唯一整数 
SQL> show user 
USER 为"GAO" 
SQL> select username,user_id from dba_users where user_id=uid; 
USERNAME USER_ID 
------------------------------ --------- 
GAO 25 

58.USER 
返回当前用户的名字 
SQL> select user from dual; 
USER 
------------------------------ 
GAO 

59.USEREVN 
返回当前用户环境的信息,opt可以是: 
ENTRYID,SESSIONID,TERMINAL,ISDBA,LABLE,LANGUAGE,CLIENT_INFO,LANG,VSIZE 
ISDBA 查看当前用户是否是DBA如果是则返回true 
SQL> select userenv(isdba) from dual; 
USEREN 
------ 
FALSE 
SQL> select userenv(isdba) from dual; 
USEREN 
------ 
TRUE 
SESSION 
返回会话标志 
SQL> select userenv(sessionid) from dual; 
USERENV(SESSIONID) 
-------------------- 
152 
ENTRYID 
返回会话人口标志 
SQL> select userenv(entryid) from dual; 
USERENV(ENTRYID) 
------------------ 
0 
INSTANCE 
返回当前INSTANCE的标志 
SQL> select userenv(instance) from dual; 
USERENV(INSTANCE) 
------------------- 
1 
LANGUAGE 
返回当前环境变量 
SQL> select userenv(language) from dual; 
USERENV(LANGUAGE) 
---------------------------------------------------- 
SIMPLIFIED CHINESE_CHINA.ZHS16GBK 
LANG 
返回当前环境的语言的缩写 
SQL> select userenv(lang) from dual; 
USERENV(LANG) 
---------------------------------------------------- 
ZHS 
TERMINAL 
返回用户的终端或机器的标志 
SQL> select userenv(terminal) from dual; 
USERENV(TERMINA 
---------------- 
GAO 
VSIZE(X) 
返回X的大小(字节)数 
SQL> select vsize(user),user from dual; 
VSIZE(USER) USER 
----------- ------------------------------ 
6 SYSTEM 
• 60.AVG(DISTINCT|ALL) 
all表示对所有的值求平均值,distinct只对不同的值求平均值 
SQLWKS> create table table3(xm varchar(8),sal number(7,2)); 
语句已处理。 
SQLWKS> insert into table3 values(gao,1111.11); 
SQLWKS> insert into table3 values(gao,1111.11); 
SQLWKS> insert into table3 values(zhu,5555.55); 
SQLWKS> commit; 
SQL> select avg(distinct sal) from gao.table3; 
AVG(DISTINCTSAL) 
---------------- 
3333.33 
SQL> select avg(all sal) from gao.table3; 
AVG(ALLSAL) 
----------- 
2592.59 

61.MAX(DISTINCT|ALL) 
求最大值,ALL表示对所有的值求最大值,DISTINCT表示对不同的值求最大值,相同的只取一次 
SQL> select max(distinct sal) from scott.emp; 
MAX(DISTINCTSAL) 
---------------- 
5000 

62.MIN(DISTINCT|ALL) 
求最小值,ALL表示对所有的值求最小值,DISTINCT表示对不同的值求最小值,相同的只取一次 
SQL> select min(all sal) from gao.table3; 
MIN(ALLSAL) 
----------- 
1111.11 

63.STDDEV(distinct|all) 
求标准差,ALL表示对所有的值求标准差,DISTINCT表示只对不同的值求标准差 
SQL> select stddev(sal) from scott.emp; 
STDDEV(SAL) 
----------- 
1182.5032 
SQL> select stddev(distinct sal) from scott.emp; 
STDDEV(DISTINCTSAL) 
------------------- 
1229.951 

64.VARIANCE(DISTINCT|ALL) 
求协方差 
SQL> select variance(sal) from scott.emp; 
VARIANCE(SAL) 
------------- 
1398313.9 

65.GROUP BY 
主要用来对一组数进行统计 
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno; 
DEPTNO COUNT(*) SUM(SAL) 
--------- --------- --------- 
10 3 8750 
20 5 10875 
30 6 9400 

66.HAVING 
对分组统计再加限制条件 
SQL> select deptno,count(*),sum(sal) from scott.emp group by deptno having count(*)>=5; 
DEPTNO COUNT(*) SUM(SAL) 
--------- --------- --------- 
20 5 10875 
30 6 9400 
SQL> select deptno,count(*),sum(sal) from scott.emp having count(*)>=5 group by deptno ; 
DEPTNO COUNT(*) SUM(SAL) 
--------- --------- --------- 
20 5 10875 
30 6 9400 

67.ORDER BY 
用于对查询到的结果进行排序输出 
SQL> select deptno,ename,sal from scott.emp order by deptno,sal desc; 
DEPTNO ENAME SAL 
--------- ---------- --------- 
10 KING 5000 
10 CLARK 2450 
10 MILLER 1300 
20 SCOTT 3000 
20 FORD 3000 
20 JONES 2975 
20 ADAMS 1100 
20 SMITH 800 
30 BLAKE 2850 
30 ALLEN 1600 
30 TURNER 1500 
30 WARD 1250 
30 MARTIN 1250 
30 JAMES 950 
68. pl/sql中的case语句 
select  (case  when  DUMMY='X'  then  0  else  1  end)  as  flag  from  dual; 
case的第1种用法: 
case col when 'a' then 1 
when 'b' then 2 
else 0 end 
这种用法跟decode一样没什么区别 
case的第2种用法: 
case when score <60 then 'd' 
when score >=60 and score <70 then 'c' 
when score >=70 and score <80 then 'b' 
else 'a' end 
69.NVL(expr1, expr2) 
NVL(expr1, expr2)->expr1为NULL,返回expr2;不为NULL,返回expr1。注意两者的类型要一致 
NVL2 (expr1, expr2, expr3) ->expr1不为NULL,返回expr2;为NULL,返回expr3。expr2和expr3类型不同的话,expr3会转换为expr2的类型 
NULLIF (expr1, expr2) ->相等返回NULL,不等返回expr1 
• Oracle分析函数参考手册 
============================================= 
作者: xsb([url]http://xsb.itpub.net)[/url] 
发表于:2006.03.01 12:22 
分类: DW&BI 
出处:http://xsb.itpub.net/post/419/33028 
--------------------------------------------------------------- 
    Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行, 
而聚合函数对于每个组只返回一行。 
常用的分析函数如下所列: 
row_number() over(partition by ... order by ...) 
rank() over(partition by ... order by ...) 
dense_rank() over(partition by ... order by ...) 
count() over(partition by ... order by ...) 
max() over(partition by ... order by ...) 
min() over(partition by ... order by ...) 
sum() over(partition by ... order by ...) 
avg() over(partition by ... order by ...) 
first_value() over(partition by ... order by ...) 
last_value() over(partition by ... order by ...) 
lag() over(partition by ... order by ...) 
lead() over(partition by ... order by ...) 

    下面例子中使用的表来自Oracle自带的HR用户下的表,如果没有安装该用户,可以在SYS用户下运行 
$ORACLE_HOME/demo/schema/human_resources/hr_main.sql来创建。 
除本文内容外,你还可参考: 
ROLLUP与CUBE [url]http://xsb.itpub.net/post/419/29159[/url] 
分析函数使用例子介绍:[url]http://xsb.itpub.net/post/419/44634[/url] 
本文如果未指明,缺省是在HR用户下运行例子。 
开窗函数的的理解: 
开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化,举例如下: 
over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数 
over(partition by deptno)按照部门分区 
over(order by salary range between 50 preceding and 150 following) 
每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150 
over(order by salary rows between 50 preceding and 150 following) 
每行对应的数据窗口是之前50行,之后150行 
over(order by salary rows between unbounded preceding and unbounded following) 
每行对应的数据窗口是从第一行到最后一行,等效: 
over(order by salary range between unbounded preceding and unbounded following) 
主要参考资料:《expert one-on-one》 Tom Kyte 《Oracle9i SQL Reference》第6章 
ohwww 2007-3-12 09:19
70。AVG 
功能描述:用于计算一个组和数据窗口内表达式的平均值。 
SAMPLE:下面的例子中列c_mavg计算员工表中每个员工的平均薪水报告,该平均值由当前员工和与之具有相同经理的前一个和后一个三者的平均数得来; 
SELECT manager_id, last_name, hire_date, salary, 
AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date 
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg 
FROM employees; 
MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG 
---------- ------------------------- --------- ---------- ---------- 
100 Kochhar 21-SEP-89 17000 17000 
100 De Haan 13-JAN-93 17000 15000 
100 Raphaely 07-DEC-94 11000 11966.6667 
100 Kaufling 01-MAY-95 7900 10633.3333 
100 Hartstein 17-FEB-96 13000 9633.33333 
100 Weiss 18-JUL-96 8000 11666.6667 
100 Russell 01-OCT-96 14000 11833.3333 
71。CORR 
功能描述:返回一对表达式的相关系数,它是如下的缩写: 
COVAR_POP(expr1,expr2)/STDDEV_POP(expr1)*STDDEV_POP(expr2)) 
从统计上讲,相关性是变量之间关联的强度,变量之间的关联意味着在某种程度 
上一个变量的值可由其它的值进行预测。通过返回一个-1~1之间的一个数, 相关 
系数给出了关联的强度,0表示不相关。 
SAMPLE:下例返回1998年月销售收入和月单位销售的关系的累积系数(本例在SH用户下运行) 
SELECT t.calendar_month_number, 
CORR (SUM(s.amount_sold), SUM(s.quantity_sold)) 
OVER (ORDER BY t.calendar_month_number) as CUM_CORR 
FROM sales s, times t 
WHERE s.time_id = t.time_id AND calendar_year = 1998 
GROUP BY t.calendar_month_number 
ORDER BY t.calendar_month_number; 
CALENDAR_MONTH_NUMBER CUM_CORR 
--------------------- ---------- 
1 
2 1 
3 .994309382 
4 .852040875 
5 .846652204 
6 .871250628 
7 .910029803 
8 .917556399 
9 .920154356 
10 .86720251 
11 .844864765 
12 .903542662 

72。COVAR_POP 
功能描述:返回一对表达式的总体协方差。 
SAMPLE:下例CUM_COVP返回定价和最小产品价格的累积总体协方差 
SELECT product_id, supplier_id, 
COVAR_POP(list_price, min_price) 
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP, 
COVAR_SAMP(list_price, min_price) 
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS 
FROM product_information p 
WHERE category_id = 29 
ORDER BY product_id, supplier_id; 
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS 
---------- ----------- ---------- ---------- 
1774 103088 0 
1775 103087 1473.25 2946.5 
1794 103096 1702.77778 2554.16667 
1825 103093 1926.25 2568.33333 
2004 103086 1591.4 1989.25 
2005 103086 1512.5 1815 
2416 103088 1475.97959 1721.97619 
. 
. 

73。COVAR_SAMP 
功能描述:返回一对表达式的样本协方差 
SAMPLE:下例CUM_COVS返回定价和最小产品价格的累积样本协方差 
SELECT product_id, supplier_id, 
COVAR_POP(list_price, min_price) 
OVER (ORDER BY product_id, supplier_id) AS CUM_COVP, 
COVAR_SAMP(list_price, min_price) 
OVER (ORDER BY product_id, supplier_id) AS CUM_COVS 
FROM product_information p 
WHERE category_id = 29 
ORDER BY product_id, supplier_id; 
PRODUCT_ID SUPPLIER_ID CUM_COVP CUM_COVS 
---------- ----------- ---------- ---------- 
1774 103088 0 
1775 103087 1473.25 2946.5 
1794 103096 1702.77778 2554.16667 
1825 103093 1926.25 2568.33333 
2004 103086 1591.4 1989.25 
2005 103086 1512.5 1815 
2416 103088 1475.97959 1721.97619 
• 74。COUNT 
功能描述:对一组内发生的事情进行累积计数,如果指定*或一些非空常数,count将对所有行计数,如果指定一个表达式,count 
返回表达式非空赋值的计数,当有相同值出现时,这些相等的值都会被纳入被计算的值;可以使用DISTINCT来记录去掉一组中完全 
相同的数据后出现的行数。 
SAMPLE:下面例子中计算每个员工在按薪水排序中当前行附近薪水在[n-50,n+150]之间的行数,n表示当前行的薪水 
例如,Philtanker的薪水2200,排在他之前的行中薪水大于等于2200-50的有1行,排在他之后的行中薪水小于等于2200+150的行 
没有,所以count计数值cnt3为2(包括自己当前行);cnt2值相当于小于等于当前行的SALARY值的所有行数 
SELECT last_name, salary, COUNT(*) OVER () AS cnt1, 
COUNT(*) OVER (ORDER BY salary) AS cnt2, 
COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING 
AND 150 FOLLOWING) AS cnt3 FROM employees; 
LAST_NAME SALARY CNT1 CNT2 CNT3 
------------------------- ---------- ---------- ---------- ---------- 
Olson 2100 107 1 3 
Markle 2200 107 3 2 
Philtanker 2200 107 3 2 
Landry 2400 107 5 8 
Gee 2400 107 5 8 
Colmenares 2500 107 11 10 
Patel 2500 107 11 10 
. 
. 
75。CUME_DIST 
功能描述:计算一行在组中的相对位置,CUME_DIST总是返回大于0、小于或等于1的数,该数表示该行在N行中的位置。例如, 
在一个3行的组中,返回的累计分布值为1/3、2/3、3/3 
SAMPLE:下例中计算每个工种的员工按薪水排序依次累积出现的分布百分比 
SELECT job_id, last_name, salary, CUME_DIST() 
OVER (PARTITION BY job_id ORDER BY salary) AS cume_dist 
FROM employees WHERE job_id LIKE 'PU%'; 
JOB_ID LAST_NAME SALARY CUME_DIST 
---------- ------------------------- ---------- ---------- 
PU_CLERK Colmenares 2500 .2 
PU_CLERK Himuro 2600 .4 
PU_CLERK Tobias 2800 .6 
PU_CLERK Baida 2900 .8 
PU_CLERK Khoo 3100 1 
PU_MAN Raphaely 11000 1 
76。DENSE_RANK 
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序,然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。有同样值的行得到同样的数字序号(认为null时相等的)。密集的序列返回的时没有间隔的数 
SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与RANK函数的区别) 
SELECT d.department_id , e.last_name, e.salary, DENSE_RANK() 
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank 
FROM employees e, departments d 
WHERE e.department_id = d.department_id 
AND d.department_id IN ('60', '90'); 
DEPARTMENT_ID LAST_NAME SALARY DRANK 
------------- ------------------------- ---------- ---------- 
60 Lorentz 4200 1 
60 Austin 4800 2 
60 Pataballa 4800 2 
60 Ernst 6000 3 
60 Hunold 9000 4 
90 Kochhar 17000 1 
90 De Haan 17000 1 
90 King 24000 2 

77。FIRST 
功能描述:从DENSE_RANK返回的集合中取出排在最前面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录 
SAMPLE:下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序,FIRST取出佣金最低的对应的所有行,然后前面的MAX函数从这个集合中取出薪水最低的值;LAST取出佣金最高的对应的所有行,然后前面的MIN函数从这个集合中取出薪水最高的值 
SELECT last_name, department_id, salary, 
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) 
OVER (PARTITION BY department_id) "Worst", 
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct) 
OVER (PARTITION BY department_id) "Best" 
FROM employees 
WHERE department_id in (20,80) 
ORDER BY department_id, salary; 
LAST_NAME DEPARTMENT_ID SALARY Worst Best 
------------------------- ------------- ---------- ---------- ---------- 
Fay 20 6000 6000 13000 
Hartstein 20 13000 6000 13000 
Kumar 80 6100 6100 14000 
Banda 80 6200 6100 14000 
Johnson 80 6200 6100 14000 
Ande 80 6400 6100 14000 
Lee 80 6800 6100 14000 
Tuvault 80 7000 6100 14000 
Sewall 80 7000 6100 14000 
Marvins 80 7200 6100 14000 
Bates 80 7300 6100 14000 
. 
. 
. 
78。FIRST_VALUE 
功能描述:返回组中数据窗口的第一个值。 
SAMPLE:下面例子计算按部门分区按薪水排序的数据窗口的第一个值对应的名字,如果薪水的第一个值有多个,则从多个对应的名字中取缺省排序的第一个名字 
SELECT department_id, last_name, salary, FIRST_VALUE(last_name) 
OVER (PARTITION BY department_id ORDER BY salary ASC ) AS lowest_sal 
FROM employees 
WHERE department_id in(20,30); 
DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL 
------------- ------------------------- ---------- -------------- 
20 Fay 6000 Fay 
20 Hartstein 13000 Fay 
30 Colmenares 2500 Colmenares 
30 Himuro 2600 Colmenares 
30 Tobias 2800 Colmenares 
30 Baida 2900 Colmenares 
30 Khoo 3100 Colmenares 
30 Raphaely 11000 Colmenares 

79。LAG 
功能描述:可以访问结果集中的其它行而不用进行自连接。它允许去处理游标,就好像游标是一个数组一样。在给定组中可参考当前行之前的行,这样就可以从组中与当前行一起选择以前的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行),其相反的函数是LEAD 
SAMPLE:下面的例子中列prev_sal返回按hire_date排序的前1行的salary值 
SELECT last_name, hire_date, salary, 
LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal 
FROM employees 
WHERE job_id = 'PU_CLERK'; 
LAST_NAME HIRE_DATE SALARY PREV_SAL 
------------------------- ---------- ---------- ---------- 
Khoo 18-5月 -95 3100 0 
Tobias 24-7月 -97 2800 3100 
Baida 24-12月-97 2900 2800 
Himuro 15-11月-98 2600 2900 
Colmenares 10-8月 -99 2500 2600

80。LAST 
功能描述:从DENSE_RANK返回的集合中取出排在最后面的一个值的行(可能多行,因为值可能相等),因此完整的语法需要在开始处加上一个集合函数以从中取出记录 
SAMPLE:下面例子中DENSE_RANK按部门分区,再按佣金commission_pct排序,FIRST取出佣金最低的对应的所有行,然后前面的MAX函数从这个集合中取出薪水最低的值;LAST取出佣金最高的对应的所有行,然后前面的MIN函数从这个集合中取出薪水最高的值 
SELECT last_name, department_id, salary, 
MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct) 
OVER (PARTITION BY department_id) "Worst", 
MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct) 
OVER (PARTITION BY department_id) "Best" 
FROM employees 
WHERE department_id in (20,80) 
ORDER BY department_id, salary; 
LAST_NAME DEPARTMENT_ID SALARY Worst Best 
------------------------- ------------- ---------- ---------- ---------- 
Fay 20 6000 6000 13000 
Hartstein 20 13000 6000 13000 
Kumar 80 6100 6100 14000 
Banda 80 6200 6100 14000 
Johnson 80 6200 6100 14000 
Ande 80 6400 6100 14000 
Lee 80 6800 6100 14000 
Tuvault 80 7000 6100 14000 
Sewall 80 7000 6100 14000 
Marvins 80 7200 6100 14000 
Bates 80 7300 6100 14000 
. 
81。LAST_VALUE 
功能描述:返回组中数据窗口的最后一个值。 
SAMPLE:下面例子计算按部门分区按薪水排序的数据窗口的最后一个值对应的名字,如果薪水的最后一个值有多个,则从多个对应的名字中取缺省排序的最后一个名字 
SELECT department_id, last_name, salary, LAST_VALUE(last_name) 
OVER(PARTITION BY department_id ORDER BY salary) AS highest_sal 
FROM employees 
WHERE department_id in(20,30); 
DEPARTMENT_ID LAST_NAME SALARY HIGHEST_SAL 
------------- ------------------------- ---------- ------------ 
20 Fay 6000 Fay 
20 Hartstein 13000 Hartstein 
30 Colmenares 2500 Colmenares 
30 Himuro 2600 Himuro 
30 Tobias 2800 Tobias 
30 Baida 2900 Baida 
30 Khoo 3100 Khoo 
30 Raphaely 11000 Raphaely 
82。LEAD 
功能描述:LEAD与LAG相反,LEAD可以访问组中当前行之后的行。Offset是一个正整数,其默认值为1,若索引超出窗口的范围,就返回默认值(默认返回的是组中第一行) 
SAMPLE:下面的例子中每行的"NextHired"返回按hire_date排序的下一行的hire_date值 
SELECT last_name, hire_date, 
LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired" 
FROM employees WHERE department_id = 30; 
LAST_NAME HIRE_DATE NextHired 
------------------------- --------- --------- 
Raphaely 07-DEC-94 18-MAY-95 
Khoo 18-MAY-95 24-JUL-97 
Tobias 24-JUL-97 24-DEC-97 
Baida 24-DEC-97 15-NOV-98 
Himuro 15-NOV-98 10-AUG-99 
Colmenares 10-AUG-99 

83。MAX 
功能描述:在一个组中的数据窗口中查找表达式的最大值。 
SAMPLE:下面例子中dept_max返回当前行所在部门的最大薪水值 
SELECT department_id, last_name, salary, 
MAX(salary) OVER (PARTITION BY department_id) AS dept_max 
FROM employees WHERE department_id in (10,20,30); 
DEPARTMENT_ID LAST_NAME SALARY DEPT_MAX 
------------- ------------------------- ---------- ---------- 
10 Whalen 4400 4400 
20 Hartstein 13000 13000 
20 Fay 6000 13000 
30 Raphaely 11000 11000 
30 Khoo 3100 11000 
30 Baida 2900 11000 
30 Tobias 2800 11000 
30 Himuro 2600 11000 
30 Colmenares 2500 11000 

84。MIN 
功能描述:在一个组中的数据窗口中查找表达式的最小值。 
SAMPLE:下面例子中dept_min返回当前行所在部门的最小薪水值 
SELECT department_id, last_name, salary, 
MIN(salary) OVER (PARTITION BY department_id) AS dept_min 
FROM employees WHERE department_id in (10,20,30); 
DEPARTMENT_ID LAST_NAME SALARY DEPT_MIN 
------------- ------------------------- ---------- ---------- 
10 Whalen 4400 4400 
20 Hartstein 13000 6000 
20 Fay 6000 6000 
30 Raphaely 11000 2500 
30 Khoo 3100 2500 
30 Baida 2900 2500 
30 Tobias 2800 2500 
30 Himuro 2600 2500 
30 Colmenares 2500 2500 

85。NTILE 
功能描述:将一个组分为"表达式"的散列表示,例如,如果表达式=4,则给组中的每一行分配一个数(从1到4),如果组中有20行,则给前5行分配1,给下5行分配2等等。如果组的基数不能由表达式值平均分开,则对这些行进行分配时,组中就没有任何percentile的行数比其它percentile的行数超过一行,最低的percentile是那些拥有额外行的percentile。例如,若表达式=4,行数=21,则percentile=1的有5行,percentile=2的有5行等等。 
SAMPLE:下例中把6行数据分为4份 
SELECT last_name, salary, 
NTILE(4) OVER (ORDER BY salary DESC) AS quartile FROM employees 
WHERE department_id = 100; 
LAST_NAME SALARY QUARTILE 
------------------------- ---------- ---------- 
Greenberg 12000 1 
Faviet 9000 1 
Chen 8200 2 
Urman 7800 2 
Sciarra 7700 3 
Popp 6900 4 

86。PERCENT_RANK 
功能描述:和CUME_DIST(累积分配)函数类似,对于一个组中给定的行来说,在计算那行的序号时,先减1,然后除以n-1(n为组中所有的行数)。该函数总是返回0~1(包括1)之间的数。 
SAMPLE:下例中如果Khoo的salary为2900,则pr值为0.6,因为RANK函数对于等值的返回序列值是一样的 
SELECT department_id, last_name, salary, 
PERCENT_RANK() 
OVER (PARTITION BY department_id ORDER BY salary) AS pr 
FROM employees 
WHERE department_id < 50 
ORDER BY department_id,salary; 
DEPARTMENT_ID LAST_NAME SALARY PR 
------------- ------------------------- ---------- ---------- 
10 Whalen 4400 0 
20 Fay 6000 0 
20 Hartstein 13000 1 
30 Colmenares 2500 0 
30 Himuro 2600 0.2 
30 Tobias 2800 0.4 
30 Baida 2900 0.6 
30 Khoo 3100 0.8 
30 Raphaely 11000 1 
40 Mavris 6500 0 
• 87。PERCENTILE_CONT 
功能描述:返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数PERCENT_RANK,如果没有正好对应的数据值,就通过下面算法来得到值: 
RN = 1+ (P*(N-1)) 其中P是输入的分布百分比值,N是组内的行数 
CRN = CEIL(RN) FRN = FLOOR(RN) 
if (CRN = FRN = RN) then 
(value of expression from row at RN) 
else 
(CRN - RN) * (value of expression for row at FRN) + 
(RN - FRN) * (value of expression for row at CRN) 
注意:本函数与PERCENTILE_DISC的区别在找不到对应的分布值时返回的替代值的计算方法不同 
SAMPLE:在下例中,对于部门60的Percentile_Cont值计算如下: 
P=0.7 N=5 RN =1+ (P*(N-1)=1+(0.7*(5-1))=3.8 CRN = CEIL(3.8)=4 
FRN = FLOOR(3.8)=3 
(4 - 3.8)* 4800 + (3.8 - 3) * 6000 = 5760 
SELECT last_name, salary, department_id, 
PERCENTILE_CONT(0.7) WITHIN GROUP (ORDER BY salary) 
OVER (PARTITION BY department_id) "Percentile_Cont", 
PERCENT_RANK() 
OVER (PARTITION BY department_id ORDER BY salary) "Percent_Rank" 
FROM employees WHERE department_id IN (30, 60); 
LAST_NAME SALARY DEPARTMENT_ID Percentile_Cont Percent_Rank 
------------------------- ---------- ------------- --------------- ------------ 
Colmenares 2500 30 3000 0 
Himuro 2600 30 3000 0.2 
Tobias 2800 30 3000 0.4 
Baida 2900 30 3000 0.6 
Khoo 3100 30 3000 0.8 
Raphaely 11000 30 3000 1 
Lorentz 4200 60 5760 0 
Austin 4800 60 5760 0.25 
Pataballa 4800 60 5760 0.25 
Ernst 6000 60 5760 0.75 
Hunold 9000 60 5760 1 

88。PERCENTILE_DISC 
功能描述:返回一个与输入的分布百分比值相对应的数据值,分布百分比的计算方法见函数CUME_DIST,如果没有正好对应的数据值,就取大于该分布值的下一个值。 
注意:本函数与PERCENTILE_CONT的区别在找不到对应的分布值时返回的替代值的计算方法不同 
SAMPLE:下例中0.7的分布值在部门30中没有对应的Cume_Dist值,所以就取下一个分布值0.83333333所对应的SALARY来替代 
SELECT last_name, salary, department_id, 
PERCENTILE_DISC(0.7) WITHIN GROUP (ORDER BY salary ) 
OVER (PARTITION BY department_id) "Percentile_Disc", 
CUME_DIST() OVER (PARTITION BY department_id ORDER BY salary) "Cume_Dist" 
FROM employees 
WHERE department_id in (30, 60); 
LAST_NAME SALARY DEPARTMENT_ID Percentile_Disc Cume_Dist 
------------------------- ---------- ------------- --------------- ---------- 
Colmenares 2500 30 3100 .166666667 
Himuro 2600 30 3100 .333333333 
Tobias 2800 30 3100 .5 
Baida 2900 30 3100 .666666667 
Khoo 3100 30 3100 .833333333 
Raphaely 11000 30 3100 1 
Lorentz 4200 60 6000 .2 
Austin 4800 60 6000 .6 
Pataballa 4800 60 6000 .6 
Ernst 6000 60 6000 .8 
Hunold 9000 60 6000 1 
89。RANK 
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序, 
然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。 
有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1, 
则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。 
SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与DENSE_RANK函数的区别) 
SELECT d.department_id , e.last_name, e.salary, RANK() 
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank 
FROM employees e, departments d 
WHERE e.department_id = d.department_id 
AND d.department_id IN ('60', '90'); 
DEPARTMENT_ID LAST_NAME SALARY DRANK 
------------- ------------------------- ---------- ---------- 
60 Lorentz 4200 1 
60 Austin 4800 2 
60 Pataballa 4800 2 
60 Ernst 6000 4 
60 Hunold 9000 5 
90 Kochhar 17000 1 
90 De Haan 17000 1 
90 King 24000 3

90。RATIO_TO_REPORT 
功能描述:该函数计算expression/(sum(expression))的值,它给出相对于总数的百分比,即当前行对sum(expression)的贡献。 
SAMPLE:下例计算每个员工的工资占该类员工总工资的百分比 
SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr 
FROM employees 
WHERE job_id = 'PU_CLERK'; 
LAST_NAME SALARY RR 
------------------------- ---------- ---------- 
Khoo 3100 .223021583 
Baida 2900 .208633094 
Tobias 2800 .201438849 
Himuro 2600 .18705036 
Colmenares 2500 .179856115 
• 91。REGR_ (Linear Regression) Functions 
功能描述:这些线性回归函数适合最小二乘法回归线,有9个不同的回归函数可使用。 
REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2) 
REGR_INTERCEPT:返回回归线的y截距,等于 
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2) 
REGR_COUNT:返回用于填充回归线的非空数字对的数目 
REGR_R2:返回回归线的决定系数,计算式为: 
If VAR_POP(expr2) = 0 then return NULL 
If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1 
If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then 
return POWER(CORR(expr1,expr),2) 
REGR_AVGX:计算回归线的自变量(expr2)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr2) 
REGR_AVGY:计算回归线的应变量(expr1)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr1) 
REGR_SXX: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2) 
REGR_SYY: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1) 
REGR_SXY: 返回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2) 
(下面的例子都是在SH用户下完成的) 
SAMPLE 1:下例计算1998年最后三个星期中两种产品(260和270)在周末的销售量中已开发票数量和总数量的累积斜率和回归线的截距 
SELECT t.fiscal_month_number "Month", t.day_number_in_month "Day", 
REGR_SLOPE(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_SLOPE, 
REGR_INTERCEPT(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_ICPT 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND s.prod_id IN (270, 260) 
AND t.fiscal_year=1998 
AND t.fiscal_week_number IN (50, 51, 52) 
AND t.day_number_in_week IN (6,7) 
ORDER BY t.fiscal_month_desc, t.day_number_in_month; 
Month Day CUM_SLOPE CUM_ICPT 
---------- ---------- ---------- ---------- 
12 12 -68 1872 
12 12 -68 1872 
12 13 -20.244898 1254.36735 
12 13 -20.244898 1254.36735 
12 19 -18.826087 1287 
12 20 62.4561404 125.28655 
12 20 62.4561404 125.28655 
12 20 62.4561404 125.28655 
12 20 62.4561404 125.28655 
12 26 67.2658228 58.9712313 
12 26 67.2658228 58.9712313 
12 27 37.5245541 284.958221 
12 27 37.5245541 284.958221 
12 27 37.5245541 284.958221 
SAMPLE 2:下例计算1998年4月每天的累积交易数量 
SELECT UNIQUE t.day_number_in_month, 
REGR_COUNT(s.amount_sold, s.quantity_sold) 
OVER (PARTITION BY t.fiscal_month_number ORDER BY t.day_number_in_month) 
"Regr_Count" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND t.fiscal_year = 1998 AND t.fiscal_month_number = 4; 
DAY_NUMBER_IN_MONTH Regr_Count 
------------------- ---------- 
1 825 
2 1650 
3 2475 
4 3300
26 21450 
30 22200 
SAMPLE 3:下例计算1998年每月销售量中已开发票数量和总数量的累积回归线决定系数 
SELECT t.fiscal_month_number, 
REGR_R2(SUM(s.amount_sold), SUM(s.quantity_sold)) 
OVER (ORDER BY t.fiscal_month_number) "Regr_R2" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND t.fiscal_year = 1998 
GROUP BY t.fiscal_month_number 
ORDER BY t.fiscal_month_number; 
FISCAL_MONTH_NUMBER Regr_R2 
------------------- ---------- 
1 
2 1 
3 .927372984 
4 .807019972 
5 .932745567 
6 .94682861 
7 .965342011 
8 .955768075 
9 .959542618 
10 .938618575 
11 .880931415 
12 .882769189 
SAMPLE 4:下例计算1998年12月最后两周产品260的销售量中已开发票数量和总数量的累积平均值 
SELECT t.day_number_in_month, 
REGR_AVGY(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) 
"Regr_AvgY", 
REGR_AVGX(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) 
"Regr_AvgX" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND s.prod_id = 260 
AND t.fiscal_month_desc = '1998-12' 
AND t.fiscal_week_number IN (51, 52) 
ORDER BY t.day_number_in_month; 
DAY_NUMBER_IN_MONTH Regr_AvgY Regr_AvgX 
------------------- ---------- ---------- 
14 882 24.5 
14 882 24.5 
15 801 22.25 
15 801 22.25 
16 777.6 21.6 
18 642.857143 17.8571429 
18 642.857143 17.8571429 
20 589.5 16.375 
21 544 15.1111111 
22 592.363636 16.4545455 
22 592.363636 16.4545455 
24 553.846154 15.3846154 
24 553.846154 15.3846154 
26 522 14.5 
27 578.4 16.0666667 
SAMPLE 5:下例计算产品260和270在1998年2月周末销售量中已开发票数量和总数量的累积REGR_SXY, REGR_SXX, and REGR_SYY统计值 
SELECT t.day_number_in_month, 
REGR_SXY(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxy", 
REGR_SYY(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_syy", 
REGR_SXX(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxx" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND prod_id IN (270, 260) 
AND t.fiscal_month_desc = '1998-02' 
AND t.day_number_in_week IN (6,7) 
ORDER BY t.day_number_in_month; 
DAY_NUMBER_IN_MONTH Regr_sxy Regr_syy Regr_sxx 
------------------- ---------- ---------- ---------- 
1 18870.4 2116198.4 258.4 
1 18870.4 2116198.4 258.4 
1 18870.4 2116198.4 258.4 
1 18870.4 2116198.4 258.4 
7 18870.4 2116198.4 258.4 
8 18870.4 2116198.4 258.4 
14 18870.4 2116198.4 258.4 
15 18870.4 2116198.4 258.4 
21 18870.4 2116198.4 258.4 
22 18870.4 2116198.4 258.4
92。ROW_NUMBER 
功能描述:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。 
SAMPLE:下例返回每个员工再在每个部门中按员工号排序后的顺序号 
SELECT department_id, last_name, employee_id, ROW_NUMBER() 
OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id 
FROM employees 
WHERE department_id < 50; 
DEPARTMENT_ID LAST_NAME EMPLOYEE_ID EMP_ID 
------------- ------------------------- ----------- ---------- 
10 Whalen 200 1 
20 Hartstein 201 1 
20 Fay 202 2 
30 Raphaely 114 1 
30 Khoo 115 2 
30 Baida 116 3 
30 Tobias 117 4 
30 Himuro 118 5 
30 Colmenares 119 6 
40 Mavris 203 1 
93。STDDEV 
功能描述:计算当前行关于组的标准偏离。(Standard Deviation) 
SAMPLE:下例返回部门30按雇佣日期排序的薪水值的累积标准偏离 
SELECT last_name, hire_date,salary, 
STDDEV(salary) OVER (ORDER BY hire_date) "StdDev" 
FROM employees 
WHERE department_id = 30; 
LAST_NAME HIRE_DATE SALARY StdDev 
------------------------- ---------- ---------- ---------- 
Raphaely 07-12月-94 11000 0 
Khoo 18-5月 -95 3100 5586.14357 
Tobias 24-7月 -97 2800 4650.0896 
Baida 24-12月-97 2900 4035.26125 
Himuro 15-11月-98 2600 3649.2465 
Colmenares 10-8月 -99 2500 3362.58829 
94。STDDEV_POP 
功能描述:该函数计算总体标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同。(Standard Deviation-Population) 
SAMPLE:下例返回部门20、30、60的薪水值的总体标准偏差 
SELECT department_id, last_name, salary, 
STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std 
FROM employees 
WHERE department_id in (20,30,60); 
DEPARTMENT_ID LAST_NAME SALARY POP_STD 
------------- ------------------------- ---------- ---------- 
20 Hartstein 13000 3500 
20 Fay 6000 3500 
30 Raphaely 11000 3069.6091 
30 Khoo 3100 3069.6091 
30 Baida 2900 3069.6091 
30 Colmenares 2500 3069.6091 
30 Himuro 2600 3069.6091 
30 Tobias 2800 3069.6091 
60 Hunold 9000 1722.32401 
60 Ernst 6000 1722.32401 
60 Austin 4800 1722.32401 
60 Pataballa 4800 1722.32401 
60 Lorentz 4200 1722.32401
95。STDDEV_SAMP 
功能描述: 该函数计算累积样本标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同。(Standard Deviation-Sample) 
SAMPLE:下例返回部门20、30、60的薪水值的样本标准偏差 
SELECT department_id, last_name, hire_date, salary, 
STDDEV_SAMP(salary) OVER 
(PARTITION BY department_id ORDER BY hire_date 
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev 
FROM employees 
WHERE department_id in (20,30,60); 
DEPARTMENT_ID LAST_NAME HIRE_DATE SALARY CUM_SDEV 
------------- ------------------------- ---------- ---------- ---------- 
20 Hartstein 17-2月 -96 13000 
20 Fay 17-8月 -97 6000 4949.74747 
30 Raphaely 07-12月-94 11000 
30 Khoo 18-5月 -95 3100 5586.14357 
30 Tobias 24-7月 -97 2800 4650.0896 
30 Baida 24-12月-97 2900 4035.26125 
30 Himuro 15-11月-98 2600 3649.2465 
30 Colmenares 10-8月 -99 2500 3362.58829 
60 Hunold 03-1月 -90 9000 
60 Ernst 21-5月 -91 6000 2121.32034 
60 Austin 25-6月 -97 4800 2163.33077 
60 Pataballa 05-2月 -98 4800 1982.42276 
60 Lorentz 07-2月 -99 4200 1925.61678 

96。SUM 
功能描述:该函数计算组中表达式的累积和。 
SAMPLE:下例计算同一经理下员工的薪水累积值 
SELECT manager_id, last_name, salary, 
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary 
RANGE UNBOUNDED PRECEDING) l_csum 
FROM employees 
WHERE manager_id in (101,103,108); 
MANAGER_ID LAST_NAME SALARY L_CSUM 
---------- ------------------------- ---------- ---------- 
101 Whalen 4400 4400 
101 Mavris 6500 10900 
101 Baer 10000 20900 
101 Greenberg 12000 44900 
101 Higgins 12000 44900 
103 Lorentz 4200 4200 
103 Austin 4800 13800 
103 Pataballa 4800 13800 
103 Ernst 6000 19800 
108 Popp 6900 6900 
108 Sciarra 7700 14600 
108 Urman 7800 22400 
108 Chen 8200 30600 
108 Faviet 9000 39600 
97。VAR_POP 
功能描述:(Variance Population)该函数返回非空集合的总体变量(忽略null),VAR_POP进行如下计算: 
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr) 
SAMPLE:下例计算1998年每月销售的累积总体和样本变量(本例在SH用户下运行) 
SELECT t.calendar_month_desc, 
VAR_POP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Pop", 
VAR_SAMP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Samp" 
FROM sales s, times t 
WHERE s.time_id = t.time_id AND t.calendar_year = 1998 
GROUP BY t.calendar_month_desc; 
CALENDAR Var_Pop Var_Samp 
-------- ---------- ---------- 
1998-01 0 
1998-02 6.1321E+11 1.2264E+12 
1998-03 4.7058E+11 7.0587E+11 
1998-04 4.6929E+11 6.2572E+11 
1998-05 1.5524E+12 1.9405E+12 
1998-06 2.3711E+12 2.8453E+12 
1998-07 3.7464E+12 4.3708E+12 
1998-08 3.7852E+12 4.3260E+12 
1998-09 3.5753E+12 4.0222E+12 
1998-10 3.4343E+12 3.8159E+12 
1998-11 3.4245E+12 3.7669E+12 
1998-12 4.8937E+12 5.3386E+12 
• 98。VAR_SAMP 
功能描述:(Variance Sample)该函数返回非空集合的样本变量(忽略null),VAR_POP进行如下计算: 
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1) 
SAMPLE:下例计算1998年每月销售的累积总体和样本变量 
SELECT t.calendar_month_desc, 
VAR_POP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Pop", 
VAR_SAMP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Samp" 
FROM sales s, times t 
WHERE s.time_id = t.time_id AND t.calendar_year = 1998 
GROUP BY t.calendar_month_desc; 
CALENDAR Var_Pop Var_Samp 
-------- ---------- ---------- 
1998-01 0 
1998-02 6.1321E+11 1.2264E+12 
1998-03 4.7058E+11 7.0587E+11 
1998-04 4.6929E+11 6.2572E+11 
1998-05 1.5524E+12 1.9405E+12 
1998-06 2.3711E+12 2.8453E+12 
1998-07 3.7464E+12 4.3708E+12 
1998-08 3.7852E+12 4.3260E+12 
1998-09 3.5753E+12 4.0222E+12 
1998-10 3.4343E+12 3.8159E+12 
1998-11 3.4245E+12 3.7669E+12 
1998-12 4.8937E+12 5.3386E+12 
99。VARIANCE 
功能描述:该函数返回表达式的变量,Oracle计算该变量如下: 
如果表达式中行数为1,则返回0 
如果表达式中行数大于1,则返回VAR_SAMP 
SAMPLE:下例返回部门30按雇佣日期排序的薪水值的累积变化 
SELECT last_name, salary, VARIANCE(salary) 
OVER (ORDER BY hire_date) "Variance" 
FROM employees 
WHERE department_id = 30; 
LAST_NAME SALARY Variance 
------------------------- ---------- ---------- 
Raphaely 11000 0 
Khoo 3100 31205000 
Tobias 2800 21623333.3 
Baida 2900 16283333.3 
Himuro 2600 13317000 
Colmenares 2500 11307000 
100。RANK 
功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置。组内的数据按ORDER BY子句排序, 
然后给每一行赋一个号,从而形成一个序列,该序列从1开始,往后累加。每次ORDER BY表达式的值发生变化时,该序列也随之增加。 
有同样值的行得到同样的数字序号(认为null时相等的)。然而,如果两行的确得到同样的排序,则序数将随后跳跃。若两行序数为1, 
则没有序数2,序列将给组中的下一行分配值3,DENSE_RANK则没有任何跳跃。 
SAMPLE:下例中计算每个员工按部门分区再按薪水排序,依次出现的序列号(注意与DENSE_RANK函数的区别) 
SELECT d.department_id , e.last_name, e.salary, RANK() 
OVER (PARTITION BY e.department_id ORDER BY e.salary) as drank 
FROM employees e, departments d 
WHERE e.department_id = d.department_id 
AND d.department_id IN ('60', '90'); 
DEPARTMENT_ID LAST_NAME SALARY DRANK 
------------- ------------------------- ---------- ---------- 
60 Lorentz 4200 1 
60 Austin 4800 2 
60 Pataballa 4800 2 
60 Ernst 6000 4 
60 Hunold 9000 5 
90 Kochhar 17000 1 
90 De Haan 17000 1 
90 King 24000 3

101。RATIO_TO_REPORT 
功能描述:该函数计算expression/(sum(expression))的值,它给出相对于总数的百分比,即当前行对sum(expression)的贡献。 
SAMPLE:下例计算每个员工的工资占该类员工总工资的百分比 
SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr 
FROM employees 
WHERE job_id = 'PU_CLERK'; 
LAST_NAME SALARY RR 
------------------------- ---------- ---------- 
Khoo 3100 .223021583 
Baida 2900 .208633094 
Tobias 2800 .201438849 
Himuro 2600 .18705036 
Colmenares 2500 .179856115 
• 102。REGR_ (Linear Regression) Functions 
功能描述:这些线性回归函数适合最小二乘法回归线,有9个不同的回归函数可使用。 
REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2) 
REGR_INTERCEPT:返回回归线的y截距,等于 
AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2) 
REGR_COUNT:返回用于填充回归线的非空数字对的数目 
REGR_R2:返回回归线的决定系数,计算式为: 
If VAR_POP(expr2) = 0 then return NULL 
If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1 
If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then 
return POWER(CORR(expr1,expr),2) 
REGR_AVGX:计算回归线的自变量(expr2)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr2) 
REGR_AVGY:计算回归线的应变量(expr1)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr1) 
REGR_SXX: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2) 
REGR_SYY: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1) 
REGR_SXY: 返回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2) 
(下面的例子都是在SH用户下完成的) 
SAMPLE 1:下例计算1998年最后三个星期中两种产品(260和270)在周末的销售量中已开发票数量和总数量的累积斜率和回归线的截距 
SELECT t.fiscal_month_number "Month", t.day_number_in_month "Day", 
REGR_SLOPE(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_SLOPE, 
REGR_INTERCEPT(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) AS CUM_ICPT 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND s.prod_id IN (270, 260) 
AND t.fiscal_year=1998 
AND t.fiscal_week_number IN (50, 51, 52) 
AND t.day_number_in_week IN (6,7) 
ORDER BY t.fiscal_month_desc, t.day_number_in_month; 
Month Day CUM_SLOPE CUM_ICPT 
---------- ---------- ---------- ---------- 
12 12 -68 1872 
12 12 -68 1872 
12 13 -20.244898 1254.36735 
12 13 -20.244898 1254.36735 
12 19 -18.826087 1287 
12 20 62.4561404 125.28655 
12 20 62.4561404 125.28655 
12 20 62.4561404 125.28655 
12 20 62.4561404 125.28655 
12 26 67.2658228 58.9712313 
12 26 67.2658228 58.9712313 
12 27 37.5245541 284.958221 
12 27 37.5245541 284.958221 
12 27 37.5245541 284.958221 
SAMPLE 2:下例计算1998年4月每天的累积交易数量 
SELECT UNIQUE t.day_number_in_month, 
REGR_COUNT(s.amount_sold, s.quantity_sold) 
OVER (PARTITION BY t.fiscal_month_number ORDER BY t.day_number_in_month) 
"Regr_Count" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND t.fiscal_year = 1998 AND t.fiscal_month_number = 4; 
DAY_NUMBER_IN_MONTH Regr_Count 
------------------- ---------- 
1 825 
2 1650 
3 2475 
4 3300 
. 
26 21450 
30 22200 
SAMPLE 3:下例计算1998年每月销售量中已开发票数量和总数量的累积回归线决定系数 
SELECT t.fiscal_month_number, 
REGR_R2(SUM(s.amount_sold), SUM(s.quantity_sold)) 
OVER (ORDER BY t.fiscal_month_number) "Regr_R2" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND t.fiscal_year = 1998 
GROUP BY t.fiscal_month_number 
ORDER BY t.fiscal_month_number; 
FISCAL_MONTH_NUMBER Regr_R2 
------------------- ---------- 
1 
2 1 
3 .927372984 
4 .807019972 
5 .932745567 
6 .94682861 
7 .965342011 
8 .955768075 
9 .959542618 
10 .938618575 
11 .880931415 
12 .882769189 
SAMPLE 4:下例计算1998年12月最后两周产品260的销售量中已开发票数量和总数量的累积平均值 
SELECT t.day_number_in_month, 
REGR_AVGY(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) 
"Regr_AvgY", 
REGR_AVGX(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_month_desc, t.day_number_in_month) 
"Regr_AvgX" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND s.prod_id = 260 
AND t.fiscal_month_desc = '1998-12' 
AND t.fiscal_week_number IN (51, 52) 
ORDER BY t.day_number_in_month; 
DAY_NUMBER_IN_MONTH Regr_AvgY Regr_AvgX 
------------------- ---------- ---------- 
14 882 24.5 
14 882 24.5 
15 801 22.25 
15 801 22.25 
16 777.6 21.6 
18 642.857143 17.8571429 
18 642.857143 17.8571429 
20 589.5 16.375 
21 544 15.1111111 
22 592.363636 16.4545455 
22 592.363636 16.4545455 
24 553.846154 15.3846154 
24 553.846154 15.3846154 
26 522 14.5 
27 578.4 16.0666667 
SAMPLE 5:下例计算产品260和270在1998年2月周末销售量中已开发票数量和总数量的累积REGR_SXY, REGR_SXX, and REGR_SYY统计值 
SELECT t.day_number_in_month, 
REGR_SXY(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxy", 
REGR_SYY(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_syy", 
REGR_SXX(s.amount_sold, s.quantity_sold) 
OVER (ORDER BY t.fiscal_year, t.fiscal_month_desc) "Regr_sxx" 
FROM sales s, times t 
WHERE s.time_id = t.time_id 
AND prod_id IN (270, 260) 
AND t.fiscal_month_desc = '1998-02' 
AND t.day_number_in_week IN (6,7) 
ORDER BY t.day_number_in_month; 
DAY_NUMBER_IN_MONTH Regr_sxy Regr_syy Regr_sxx 
------------------- ---------- ---------- ---------- 
1 18870.4 2116198.4 258.4 
1 18870.4 2116198.4 258.4 
1 18870.4 2116198.4 258.4 
1 18870.4 2116198.4 258.4 
7 18870.4 2116198.4 258.4 
8 18870.4 2116198.4 258.4 
14 18870.4 2116198.4 258.4 
15 18870.4 2116198.4 258.4 
21 18870.4 2116198.4 258.4 
22 18870.4 2116198.4 258.4 
• 103。ROW_NUMBER 
功能描述:返回有序组中一行的偏移量,从而可用于按特定标准排序的行号。 
SAMPLE:下例返回每个员工再在每个部门中按员工号排序后的顺序号 
SELECT department_id, last_name, employee_id, ROW_NUMBER() 
OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id 
FROM employees 
WHERE department_id < 50; 
DEPARTMENT_ID LAST_NAME EMPLOYEE_ID EMP_ID 
------------- ------------------------- ----------- ---------- 
10 Whalen 200 1 
20 Hartstein 201 1 
20 Fay 202 2 
30 Raphaely 114 1 
30 Khoo 115 2 
30 Baida 116 3 
30 Tobias 117 4 
30 Himuro 118 5 
30 Colmenares 119 6 
40 Mavris 203 1 
104。STDDEV 
功能描述:计算当前行关于组的标准偏离。(Standard Deviation) 
SAMPLE:下例返回部门30按雇佣日期排序的薪水值的累积标准偏离 
SELECT last_name, hire_date,salary, 
STDDEV(salary) OVER (ORDER BY hire_date) "StdDev" 
FROM employees 
WHERE department_id = 30; 
LAST_NAME HIRE_DATE SALARY StdDev 
------------------------- ---------- ---------- ---------- 
Raphaely 07-12月-94 11000 0 
Khoo 18-5月 -95 3100 5586.14357 
Tobias 24-7月 -97 2800 4650.0896 
Baida 24-12月-97 2900 4035.26125 
Himuro 15-11月-98 2600 3649.2465 
Colmenares 10-8月 -99 2500 3362.58829

105。STDDEV_POP 
功能描述:该函数计算总体标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同。(Standard Deviation-Population) 
SAMPLE:下例返回部门20、30、60的薪水值的总体标准偏差 
SELECT department_id, last_name, salary, 
STDDEV_POP(salary) OVER (PARTITION BY department_id) AS pop_std 
FROM employees 
WHERE department_id in (20,30,60); 
DEPARTMENT_ID LAST_NAME SALARY POP_STD 
------------- ------------------------- ---------- ---------- 
20 Hartstein 13000 3500 
20 Fay 6000 3500 
30 Raphaely 11000 3069.6091 
30 Khoo 3100 3069.6091 
30 Baida 2900 3069.6091 
30 Colmenares 2500 3069.6091 
30 Himuro 2600 3069.6091 
30 Tobias 2800 3069.6091 
60 Hunold 9000 1722.32401 
60 Ernst 6000 1722.32401 
60 Austin 4800 1722.32401 
60 Pataballa 4800 1722.32401 
60 Lorentz 4200 1722.32401 
106。STDDEV_SAMP 
功能描述: 该函数计算累积样本标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同。(Standard Deviation-Sample) 
SAMPLE:下例返回部门20、30、60的薪水值的样本标准偏差 
SELECT department_id, last_name, hire_date, salary, 
STDDEV_SAMP(salary) OVER 
(PARTITION BY department_id ORDER BY hire_date 
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cum_sdev 
FROM employees 
WHERE department_id in (20,30,60); 
DEPARTMENT_ID LAST_NAME HIRE_DATE SALARY CUM_SDEV 
------------- ------------------------- ---------- ---------- ---------- 
20 Hartstein 17-2月 -96 13000 
20 Fay 17-8月 -97 6000 4949.74747 
30 Raphaely 07-12月-94 11000 
30 Khoo 18-5月 -95 3100 5586.14357 
30 Tobias 24-7月 -97 2800 4650.0896 
30 Baida 24-12月-97 2900 4035.26125 
30 Himuro 15-11月-98 2600 3649.2465 
30 Colmenares 10-8月 -99 2500 3362.58829 
60 Hunold 03-1月 -90 9000 
60 Ernst 21-5月 -91 6000 2121.32034 
60 Austin 25-6月 -97 4800 2163.33077 
60 Pataballa 05-2月 -98 4800 1982.42276 
60 Lorentz 07-2月 -99 4200 1925.61678 

107。SUM 
功能描述:该函数计算组中表达式的累积和。 
SAMPLE:下例计算同一经理下员工的薪水累积值 
SELECT manager_id, last_name, salary, 
SUM (salary) OVER (PARTITION BY manager_id ORDER BY salary 
RANGE UNBOUNDED PRECEDING) l_csum 
FROM employees 
WHERE manager_id in (101,103,108); 
MANAGER_ID LAST_NAME SALARY L_CSUM 
---------- ------------------------- ---------- ---------- 
101 Whalen 4400 4400 
101 Mavris 6500 10900 
101 Baer 10000 20900 
101 Greenberg 12000 44900 
101 Higgins 12000 44900 
103 Lorentz 4200 4200 
103 Austin 4800 13800 
103 Pataballa 4800 13800 
103 Ernst 6000 19800 
108 Popp 6900 6900 
108 Sciarra 7700 14600 
108 Urman 7800 22400 
108 Chen 8200 30600 
108 Faviet 9000 39600 
108。VAR_POP 
功能描述:(Variance Population)该函数返回非空集合的总体变量(忽略null),VAR_POP进行如下计算: 
(SUM(expr2) - SUM(expr)2 / COUNT(expr)) / COUNT(expr) 
SAMPLE:下例计算1998年每月销售的累积总体和样本变量(本例在SH用户下运行) 
SELECT t.calendar_month_desc, 
VAR_POP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Pop", 
VAR_SAMP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Samp" 
FROM sales s, times t 
WHERE s.time_id = t.time_id AND t.calendar_year = 1998 
GROUP BY t.calendar_month_desc; 
CALENDAR Var_Pop Var_Samp 
-------- ---------- ---------- 
1998-01 0 
1998-02 6.1321E+11 1.2264E+12 
1998-03 4.7058E+11 7.0587E+11 
1998-04 4.6929E+11 6.2572E+11 
1998-05 1.5524E+12 1.9405E+12 
1998-06 2.3711E+12 2.8453E+12 
1998-07 3.7464E+12 4.3708E+12 
1998-08 3.7852E+12 4.3260E+12 
1998-09 3.5753E+12 4.0222E+12 
1998-10 3.4343E+12 3.8159E+12 
1998-11 3.4245E+12 3.7669E+12 
1998-12 4.8937E+12 5.3386E+12 
109。VAR_SAMP 
功能描述:(Variance Sample)该函数返回非空集合的样本变量(忽略null),VAR_POP进行如下计算: 
(SUM(expr*expr)-SUM(expr)*SUM(expr)/COUNT(expr))/(COUNT(expr)-1) 
SAMPLE:下例计算1998年每月销售的累积总体和样本变量 
SELECT t.calendar_month_desc, 
VAR_POP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Pop", 
VAR_SAMP(SUM(s.amount_sold)) 
OVER (ORDER BY t.calendar_month_desc) "Var_Samp" 
FROM sales s, times t 
WHERE s.time_id = t.time_id AND t.calendar_year = 1998 
GROUP BY t.calendar_month_desc; 
CALENDAR Var_Pop Var_Samp 
-------- ---------- ---------- 
1998-01 0 
1998-02 6.1321E+11 1.2264E+12 
1998-03 4.7058E+11 7.0587E+11 
1998-04 4.6929E+11 6.2572E+11 
1998-05 1.5524E+12 1.9405E+12 
1998-06 2.3711E+12 2.8453E+12 
1998-07 3.7464E+12 4.3708E+12 
1998-08 3.7852E+12 4.3260E+12 
1998-09 3.5753E+12 4.0222E+12 
1998-10 3.4343E+12 3.8159E+12 
1998-11 3.4245E+12 3.7669E+12 
1998-12 4.8937E+12 5.3386E+12 
110。VARIANCE 
功能描述:该函数返回表达式的变量,Oracle计算该变量如下: 
如果表达式中行数为1,则返回0 
如果表达式中行数大于1,则返回VAR_SAMP 
SAMPLE:下例返回部门30按雇佣日期排序的薪水值的累积变化 
SELECT last_name, salary, VARIANCE(salary) 
OVER (ORDER BY hire_date) "Variance" 
FROM employees 
WHERE department_id = 30; 
LAST_NAME SALARY Variance 
------------------------- ---------- ---------- 
Raphaely 11000 0 
Khoo 3100 31205000 
Tobias 2800 21623333.3 
Baida 2900 16283333.3 
Himuro 2600 13317000 
Colmenares 2500 11307000
jsp页面导出数据servlet。
package servlet;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.swing.JOptionPane;

import comm.CreateExcel;
import comm.Student;

public class doImportExcel extends HttpServlet {

	/**
	 * Constructor of the object.
	 */
	public doImportExcel() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
		// Put your code here
	}

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doPost(request, response);
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println("============我进来servlet----------");
		request.setCharacterEncoding("utf-8");
		String nameTitle=request.getParameter("nameTitle");
		String numTitle=request.getParameter("numTitle");
		String birthTitle=request.getParameter("birthTitle");
		String name=request.getParameter("name");
		String num=request.getParameter("num");
		String birth=request.getParameter("birth");
		String url="d://demo.xls";
		
		System.out.println("-----nameTitle:"+nameTitle+"---numTitle:"+numTitle+"---birthTitle:"+birthTitle);
		System.out.println("-----name:"+name+"---num:"+num+"---birth:"+birth+"----------url:"+url);
		
		
		
		
		  CreateExcel<Student> ex = new CreateExcel<Student>();  
          String[] headers = { nameTitle, numTitle, birthTitle};  //标题
    	   List<Student> dataset = new ArrayList<Student>();  
    	   SimpleDateFormat d=new SimpleDateFormat("yyyy-MM-dd");
    	   try {
			Date date=d.parse(birth);
			 dataset.add(new Student(name,num,date));  
		} catch (ParseException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
         
//          dataset.add(new Student(52, "李四", 24, "男", new Date()));  
//          dataset.add(new Student(45, "王五", 22, "女", new Date()));  
		 OutputStream out=null;
          try {  
  
           out  = new FileOutputStream(url);  
             ex.exportExcel(headers, dataset, out);  
             JOptionPane.showMessageDialog(null, "导出成功!");  
             System.out.println("excel导出成功!");  
             
             
             File f = new File(url);
             URL u = new URL("file:///" + url);
 			response.setContentType(u.openConnection().getContentType());
 			response.setHeader("Content-Disposition", "inline; filename="
 					+ f.getName());
 			
 			BufferedInputStream br = new BufferedInputStream(new FileInputStream(f));
 			byte[] buf = new byte[1024];
 			int len = 0;
 			
 			OutputStream outputStream = response.getOutputStream();
 			while ((len = br.read(buf)) > 0)
 			{
 				
 				outputStream.write(buf, 0, len);
 			}
 			br.close();
 			outputStream.close();
             
             
             
          } catch (FileNotFoundException e) {  
             e.printStackTrace();  
          }  finally{
        	  out.close();  
          }
		
		
		
		
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occure
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}
jsp页面导出数据处理类。
package comm;

import java.io.BufferedInputStream;  
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
import java.io.OutputStream;  
import java.lang.reflect.Field;  
import java.lang.reflect.InvocationTargetException;  
import java.lang.reflect.Method;  
import java.text.SimpleDateFormat;  
import java.util.ArrayList;  
import java.util.Collection;  
import java.util.Date;  
import java.util.Iterator;  
import java.util.List;  
import java.util.regex.Matcher;  
import java.util.regex.Pattern;  
import javax.swing.JOptionPane;  
import org.apache.poi.hssf.usermodel.HSSFCell;  
import org.apache.poi.hssf.usermodel.HSSFCellStyle;  
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;  
import org.apache.poi.hssf.usermodel.HSSFComment;  
import org.apache.poi.hssf.usermodel.HSSFFont;  
import org.apache.poi.hssf.usermodel.HSSFPatriarch;  
import org.apache.poi.hssf.usermodel.HSSFRichTextString;  
import org.apache.poi.hssf.usermodel.HSSFRow;  
import org.apache.poi.hssf.usermodel.HSSFSheet;  
import org.apache.poi.hssf.usermodel.HSSFWorkbook;  
import org.apache.poi.hssf.util.HSSFColor;  
  
  
public class CreateExcel<T> {  
      
    public void exportExcel(Collection<T> dataset, OutputStream out) {  
          exportExcel("测试POI导出EXCEL文档", null, dataset, out, "yyyy-MM-dd");  
       }  
       
  
       public void exportExcel(String[] headers, Collection<T> dataset,  
             OutputStream out) {  
          exportExcel("测试POI导出EXCEL文档", headers, dataset, out, "yyyy-MM-dd");  
       }  
       
  
       public void exportExcel(String[] headers, Collection<T> dataset,  
             OutputStream out, String pattern) {  
          exportExcel("测试POI导出EXCEL文档", headers, dataset, out, pattern);  
       }  
       
  
       /** 
        * 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上 
        *  
        * @param title 
        *            表格标题名 
        * @param headers 
        *            表格属性列名数组 
        * @param dataset 
        *            需要显示的数据集合,集合中一定要放置符合javabean风格的类的对象。此方法支持的 
        *            javabean属性的数据类型有基本数据类型及String,Date,byte[](图片数据) 
        * @param out 
        *            与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中 
        * @param pattern 
        *            如果有时间数据,设定输出格式。默认为"yyy-MM-dd" 
        */  
       @SuppressWarnings("unchecked")  
       public void exportExcel(String title, String[] headers,  
             Collection<T> dataset, OutputStream out, String pattern) {  
          // 声明一个工作薄   
          HSSFWorkbook workbook = new HSSFWorkbook();  
          // 生成一个表格   
          HSSFSheet sheet = workbook.createSheet(title);  
          // 设置表格默认列宽度为15个字节   
          sheet.setDefaultColumnWidth((short) 35);  
          // 生成一个样式   
          HSSFCellStyle style = workbook.createCellStyle();  
          // 设置这些样式   
          style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);  
          style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
          style.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
          style.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
          style.setBorderRight(HSSFCellStyle.BORDER_THIN);  
          style.setBorderTop(HSSFCellStyle.BORDER_THIN);  
          style.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
          // 生成一个字体   
          HSSFFont font = workbook.createFont();  
          font.setColor(HSSFColor.VIOLET.index);  
          font.setFontHeightInPoints((short) 12);  
          font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);  
          // 把字体应用到当前的样式   
          style.setFont(font);  
          // 生成并设置另一个样式   
          HSSFCellStyle style2 = workbook.createCellStyle();  
          style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);  
          style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);  
          style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);  
          style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);  
          style2.setBorderRight(HSSFCellStyle.BORDER_THIN);  
          style2.setBorderTop(HSSFCellStyle.BORDER_THIN);  
          style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
          style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);  
          // 生成另一个字体   
          HSSFFont font2 = workbook.createFont();  
          font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);  
          // 把字体应用到当前的样式   
          style2.setFont(font2);  
            
          // 声明一个画图的顶级管理器   
          HSSFPatriarch patriarch = sheet.createDrawingPatriarch();  
          // 定义注释的大小和位置,详见文档   
          HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));  
          // 设置注释内容   
          comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));  
          // 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.   
          comment.setAuthor("luo");  
       
          //产生表格标题行   
          HSSFRow row = sheet.createRow(0);  
          for (short i = 0; i < headers.length; i++) {  
             HSSFCell cell = row.createCell(i);  
             cell.setCellStyle(style);  
             HSSFRichTextString text = new HSSFRichTextString(headers[i]);  
             cell.setCellValue(text);  
          }  
       
  
          //遍历集合数据,产生数据行   
          Iterator<T> it = dataset.iterator();  
          int index = 0;  
          while (it.hasNext()) {  
             index++;  
             row = sheet.createRow(index);  
             T t = (T) it.next();  
             //利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值   
             Field[] fields = t.getClass().getDeclaredFields();  
             for (short i = 0; i < fields.length; i++) {  
                HSSFCell cell = row.createCell(i);  
                cell.setCellStyle(style2);  
                Field field = fields[i];  
                String fieldName = field.getName();  
                String getMethodName = "get"  
                       + fieldName.substring(0, 1).toUpperCase()  
                       + fieldName.substring(1);  
                try {  
                    Class tCls = t.getClass();  
                    Method getMethod = tCls.getMethod(getMethodName,  
                          new Class[] {});  
                    Object value = getMethod.invoke(t, new Object[] {});  
                    //判断值的类型后进行强制类型转换   
                    String textValue = null;  
                     if (value instanceof Date) {  
                       Date date = (Date) value;  
                       SimpleDateFormat sdf = new SimpleDateFormat(pattern);  
                        textValue = sdf.format(date);  
                    }  else if (value instanceof byte[]) {  
                       // 有图片时,设置行高为60px;   
                       row.setHeightInPoints(60);  
                       // 设置图片所在列宽度为80px,注意这里单位的一个换算   
                       sheet.setColumnWidth(i, (short) (35.7 * 80));  
                       // sheet.autoSizeColumn(i);   
                       byte[] bsValue = (byte[]) value;  
                       HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0,  
                             1023, 255, (short) 6, index, (short) 6, index);  
                       anchor.setAnchorType(2);  
                       patriarch.createPicture(anchor, workbook.addPicture(  
                             bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));  
                    } else{  
                       //其它数据类型都当作字符串简单处理   
                       textValue =""+value;
                    }  
                    //如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成   
                    if(textValue!=null){  
                       Pattern p = Pattern.compile("^//d+(//.//d+)?$");     
                       Matcher matcher = p.matcher(textValue);  
                       if(matcher.matches()){  
                          //是数字当作double处理   
                          cell.setCellValue(Double.parseDouble(textValue));  
                       }else{  
                          HSSFRichTextString richString = new HSSFRichTextString(textValue);  
                          HSSFFont font3 = workbook.createFont();  
                          font3.setColor(HSSFColor.BLUE.index);  
                          richString.applyFont(font3);  
                          cell.setCellValue(richString);  
                       }  
                    }  
                } catch (SecurityException e) {  
                    // TODO Auto-generated catch block   
                    e.printStackTrace();  
                } catch (NoSuchMethodException e) {  
                    // TODO Auto-generated catch block   
                    e.printStackTrace();  
                } catch (IllegalArgumentException e) {  
                    // TODO Auto-generated catch block   
                    e.printStackTrace();  
                } catch (IllegalAccessException e) {  
                    // TODO Auto-generated catch block   
                    e.printStackTrace();  
                } catch (InvocationTargetException e) {  
                    // TODO Auto-generated catch block   
                    e.printStackTrace();  
                } finally {  
                    //清理资源   
                	System.out.println("------清理资源  -------");
                }  
             }  
       
  
          }  
          try {  
             workbook.write(out);  
          } catch (IOException e) {  
             // TODO Auto-generated catch block   
             e.printStackTrace();  
          }  
       
  
       }  
       
  
       public static void main(String[] args) {  
          // 测试学生   
    	   CreateExcel<Student> ex = new CreateExcel<Student>();  
          String[] headers = { "学号", "姓名", "年龄", "性别", "出生日期" };  //标题
    	   List<Student> dataset = new ArrayList<Student>();  
//          dataset.add(new Student(8, "张三", 20, "男", new Date()));  
//          dataset.add(new Student(52, "李四", 24, "男", new Date()));  
//          dataset.add(new Student(45, "王五", 22, "女", new Date()));  
          try {  
  
             OutputStream out = new FileOutputStream("E://a.xls");  
             ex.exportExcel(headers, dataset, out);  
             out.close();  
             JOptionPane.showMessageDialog(null, "导出成功!");  
             System.out.println("excel导出成功!");  
          } catch (FileNotFoundException e) {  
             e.printStackTrace();  
          } catch (IOException e) {  
             e.printStackTrace();  
          }  
       }  
      
}  
jsp页面导出数据文档说明
JSP中导入导出Excel文件
一.POI简介 
Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 
目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。 
二.HSSF概况 
HSSF 是sHorrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。 
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。 
三.开始编码 
1 . 准备工作 
要求:JDK 1.4+POI开发包 
可以到 http://www.apache.org/dyn/closer.cgi/jakarta/poi/ 最新的POI工具包 
2 . EXCEL 结构 
HSSFWorkbook excel 文档对象介绍 
HSSFSheet excel的表单 
HSSFRow excel的行 
HSSFCell excel的格子单元 
HSSFFont excel字体 
HSSFName 名称 
HSSFDataFormat 日期格式 
HSSFHeader sheet头 
HSSFFooter sheet尾 
和这个样式 
HSSFCellStyle cell样式 
辅助操作包括 
HSSFDateUtil 日期 
HSSFPrintSetup 打印 
HSSFErrorConstants 错误信息表 
4 . 可参考文档 
POI 主页:http://jakarta.apache.org/poi/, 
初学者如何快速上手使用POI HSSF 
http://jakarta.apache.org/poi/hssf/quick-guide.html 。 
代码例子 
http://blog.java-cn.com/user1/6749/archives/2005/18347.html 
里面有很多例子代码,可以很方便上手。 

四.使用心得 
POI HSSF 的usermodel包把Excel文件映射成我们熟悉的结构,诸如Workbook、Sheet、Row、Cell等,它把整个结构以一组对象的形式保存在内存之中,便于理解,操作方便,基本上能够满足我们的要求,所以说这个是一个不错的选择。 


1.创建工作簿 (WORKBOOK) 
HSSFWorkbook wb = new HSSFWorkbook();    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);
fileOut.close(); 







2.创建工作表(SHEET)
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet1 = wb.createSheet("new sheet");    
HSSFSheet sheet2 = wb.createSheet("second sheet");    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();  

3.创建单元格(CELL) 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");
HSSFRow row = sheet.createRow((short)0);
HSSFCell cell = row.createCell((short)0);    
cell.setCellValue(1);
row.createCell((short)1).setCellValue(1.2);    
row.createCell((short)2).setCellValue("This is a string");    
row.createCell((short)3).setCellValue(true); 
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close(); 




4.创建指定单元格式的单元格 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");      
HSSFRow row = sheet.createRow((short)0);        
HSSFCell cell = row.createCell((short)0);    
cell.setCellValue(new Date());    

HSSFCellStyle cellStyle = wb.createCellStyle();    
cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"));    
cell = row.createCell((short)1);    
cell.setCellValue(new Date());    
cell.setCellStyle(cellStyle);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

5. 单元格的不同格式 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFRow row = sheet.createRow((short)2);    
row.createCell((short) 0).setCellValue(1.1);    
row.createCell((short) 1).setCellValue(new Date());    
row.createCell((short) 2).setCellValue("a string");    
row.createCell((short) 3).setCellValue(true);    
row.createCell((short) 4).setCellType(HSSFCell.CELL_TYPE_ERROR);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close(); 

6.单元格的不通对齐方式 
public static void main(String[] args) throws IOException    
{    
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFRow row = sheet.createRow((short) 2);    
createCell(wb, row, (short) 0, HSSFCellStyle.ALIGN_CENTER);    
createCell(wb, row, (short) 1, HSSFCellStyle.ALIGN_CENTER_SELECTION);    
createCell(wb, row, (short) 2, HSSFCellStyle.ALIGN_FILL);    
createCell(wb, row, (short) 3, HSSFCellStyle.ALIGN_GENERAL);    
createCell(wb, row, (short) 4, HSSFCellStyle.ALIGN_JUSTIFY);    
createCell(wb, row, (short) 5, HSSFCellStyle.ALIGN_LEFT);    
createCell(wb, row, (short) 6, HSSFCellStyle.ALIGN_RIGHT);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();    
}    






private static void createCell(HSSFWorkbook wb, HSSFRow row, short column, short align)    
{    
HSSFCell cell = row.createCell(column);    
cell.setCellValue("Align It");    
HSSFCellStyle cellStyle = wb.createCellStyle();    
cellStyle.setAlignment(align);    
cell.setCellStyle(cellStyle);    
}   

7.单元格的边框设置 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");      
HSSFRow row = sheet.createRow((short) 1);    
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue(4);    
HSSFCellStyle style = wb.createCellStyle();    
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);    
style.setBottomBorderColor(HSSFColor.BLACK.index);    
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);    
style.setLeftBorderColor(HSSFColor.GREEN.index);    
style.setBorderRight(HSSFCellStyle.BORDER_THIN);    
style.setRightBorderColor(HSSFColor.BLUE.index);    
style.setBorderTop(HSSFCellStyle.BORDER_MEDIUM_DASHED);    
style.setTopBorderColor(HSSFColor.BLACK.index);    
cell.setCellStyle(style);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

8.填充和颜色设置 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");       
HSSFRow row = sheet.createRow((short) 1);  
HSSFCellStyle style = wb.createCellStyle();    
style.setFillBackgroundColor(HSSFColor.AQUA.index);    
style.setFillPattern(HSSFCellStyle.BIG_SPOTS);    
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue("X");    
cell.setCellStyle(style);       
style = wb.createCellStyle();    
style.setFillForegroundColor(HSSFColor.ORANGE.index);    
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);    
cell = row.createCell((short) 2);    
cell.setCellValue("X");    
cell.setCellStyle(style);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   




9.合并单元格操作 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFRow row = sheet.createRow((short) 1);    
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue("This is a test of merging");    
sheet.addMergedRegion(new Region(1,(short)1,1,(short)2));   
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

9.1合并单元格边框的解决办法 
private void setRegionStyle(HSSFSheet sheet, Region region , HSSFCellStyle cs) {   
       int toprowNum = region.getRowFrom();   
       for (int i = region.getRowFrom(); i <= region.getRowTo(); i ++) {   
           HSSFRow row = HSSFCellUtil.getRow(i, sheet);   
           for (int j = region.getColumnFrom(); j <= region.getColumnTo(); j++) {   
               HSSFCell cell = HSSFCellUtil.getCell(row, (short)j);   
               cell.setCellStyle(cs);   
           }   
       }   
}  




10.字体设置 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFRow row = sheet.createRow((short) 1);  
HSSFFont font = wb.createFont();    
font.setFontHeightInPoints((short)24);    
font.setFontName("Courier New");    
font.setItalic(true);    
font.setStrikeout(true);     
HSSFCellStyle style = wb.createCellStyle();    
style.setFont(font);      
HSSFCell cell = row.createCell((short) 1);    
cell.setCellValue("This is a test of fonts");    
cell.setCellStyle(style);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   









11.自定义颜色 
Java代码 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet();    
HSSFRow row = sheet.createRow((short) 0);    
HSSFCell cell = row.createCell((short) 0);    
cell.setCellValue("Default Palette");      
HSSFCellStyle style = wb.createCellStyle();    
style.setFillForegroundColor(HSSFColor.LIME.index);    
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);    
HSSFFont font = wb.createFont();    
font.setColor(HSSFColor.RED.index);    
style.setFont(font);    
cell.setCellStyle(style);    
FileOutputStream out = new FileOutputStream("default_palette.xls");    
wb.write(out);    
out.close();    
cell.setCellValue("Modified Palette");    
HSSFPalette palette = wb.getCustomPalette();    
palette.setColorAtIndex(HSSFColor.RED.index,    
(byte) 153, //RGB red (0-255)    
(byte) 0, //RGB green    
(byte) 0 //RGB blue    
);      
palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);   
out = new FileOutputStream("modified_palette.xls");    
wb.write(out);    
out.close();   


12.读和重写EXCEL文件 
POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("workbook.xls"));    
HSSFWorkbook wb = new HSSFWorkbook(fs);    
HSSFSheet sheet = wb.getSheetAt(0);    
HSSFRow row = sheet.getRow(2);    
HSSFCell cell = row.getCell((short)3);    
if (cell == null)    
cell = row.createCell((short)3);    
cell.setCellType(HSSFCell.CELL_TYPE_STRING);    
cell.setCellValue("a test");    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   









13.在EXCEL单元格中使用自动换行 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet s = wb.createSheet();    
HSSFRow r = null;    
HSSFCell c = null;    
HSSFCellStyle cs = wb.createCellStyle();    
HSSFFont f = wb.createFont();    
HSSFFont f2 = wb.createFont();    
cs = wb.createCellStyle();    
cs.setFont( f2 );    
cs.setWrapText( true );    
r = s.createRow( (short) 2 );    
r.setHeight( (short) 0x349 );    
c = r.createCell( (short) 2 );    
c.setCellType( HSSFCell.CELL_TYPE_STRING );    
c.setCellValue( "Use \n with word wrap on to create a new line" );    
c.setCellStyle( cs );    
s.setColumnWidth( (short) 2, (short) ( ( 50 * 8 ) / ( (double) 1 / 20 ) ) );    
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );    
wb.write( fileOut );    
fileOut.close();  





14.数字格式自定义 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("format sheet");    
HSSFCellStyle style;    
HSSFDataFormat format = wb.createDataFormat();    
HSSFRow row;    
HSSFCell cell;    
short rowNum = 0;    
short colNum = 0;    
row = sheet.createRow(rowNum++);    
cell = row.createCell(colNum);    
cell.setCellValue(11111.25);    
style = wb.createCellStyle();    
style.setDataFormat(format.getFormat("0.0"));    
cell.setCellStyle(style);    
row = sheet.createRow(rowNum++);    
cell = row.createCell(colNum);    
cell.setCellValue(11111.25);    
style = wb.createCellStyle();    
style.setDataFormat(format.getFormat("#,##0.0000"));    
cell.setCellStyle(style);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

HSSFWorkbook wb = new HSSFWorkbook(); 
HSSFSheet sheet = wb.createSheet("format sheet"); 
HSSFCellStyle style; 
HSSFDataFormat format = wb.createDataFormat(); 
HSSFRow row; 
HSSFCell cell; 
short rowNum = 0; 
short colNum = 0; 
row = sheet.createRow(rowNum++); 
cell = row.createCell(colNum); 
cell.setCellValue(11111.25); 
style = wb.createCellStyle(); 
style.setDataFormat(format.getFormat("0.0")); 
cell.setCellStyle(style); 
row = sheet.createRow(rowNum++); 
cell = row.createCell(colNum); 
cell.setCellValue(11111.25); 
style = wb.createCellStyle(); 
style.setDataFormat(format.getFormat("#,##0.0000")); 
cell.setCellStyle(style); 
FileOutputStream fileOut = new FileOutputStream("workbook.xls"); 
wb.write(fileOut); 
fileOut.close(); 




15.调整工作单位置 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("format sheet");    
HSSFPrintSetup ps = sheet.getPrintSetup();    
sheet.setAutobreaks(true);    
ps.setFitHeight((short)1);    
ps.setFitWidth((short)1); // Create various cells and rows for spreadsheet.    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

16.设置打印区域 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("Sheet1");    
wb.setPrintArea(0, "$A$1:$C$2");    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   








17.标注脚注 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("format sheet");    
HSSFFooter footer = sheet.getFooter()    
footer.setRight( "Page " + HSSFFooter.page() + " of " + HSSFFooter.numPages() );    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

18.使用方便的内部提供的函数 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet1 = wb.createSheet( "new sheet" );    
HSSFRow row = sheet1.createRow( (short) 1 );    
HSSFRow row2 = sheet1.createRow( (short) 2 );    
HSSFCell cell = row.createCell( (short) 1 );    
cell.setCellValue( "This is a test of merging" );    
Region region = new Region( 1, (short) 1, 4, (short) 4 );    
sheet1.addMergedRegion( region );    
final short borderMediumDashed = HSSFCellStyle.BORDER_MEDIUM_DASHED;    
HSSFRegionUtil.setBorderBottom( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBorderTop( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBorderLeft( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBorderRight( borderMediumDashed,    
region, sheet1, wb );    
HSSFRegionUtil.setBottomBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
HSSFRegionUtil.setTopBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
HSSFRegionUtil.setLeftBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
HSSFRegionUtil.setRightBorderColor(HSSFColor.AQUA.index, region, sheet1, wb);    
HSSFCellStyle style = wb.createCellStyle();    
style.setIndention((short)4);    
HSSFCellUtil.createCell(row, 8, "This is the value of the cell", style);    
HSSFCell cell2 = HSSFCellUtil.createCell( row2, 8, "This is the value of the cell");    
HSSFCellUtil.setAlignment(cell2, wb, HSSFCellStyle.ALIGN_CENTER);    
FileOutputStream fileOut = new FileOutputStream( "workbook.xls" );    
wb.write( fileOut );    
fileOut.close();   

19.在工作单中移动行,调整行的上下位置 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("row sheet");      
sheet.shiftRows(5, 10, -5);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   





20.选种指定的工作单 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("row sheet");    
sheet.setSelected(true);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close();   

21.工作单的放大缩小 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet1 = wb.createSheet("new sheet");    
sheet1.setZoom(3,4);    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close(); 











22.头注和脚注 
HSSFWorkbook wb = new HSSFWorkbook();    
HSSFSheet sheet = wb.createSheet("new sheet");    
HSSFHeader header = sheet.getHeader();    
header.setCenter("Center Header");    
header.setLeft("Left Header");    
header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +    
HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");    
FileOutputStream fileOut = new FileOutputStream("workbook.xls");    
wb.write(fileOut);    
fileOut.close(); 

23.图片的使用 
//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray    
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();    
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg"));    
ImageIO.write(bufferImg,"jpg",byteArrayOut);    
//读进一个excel模版    
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt");    
fs = new POIFSFileSystem(fos);    
//创建一个工作薄    
HSSFWorkbook wb = new HSSFWorkbook(fs);    
HSSFSheet sheet = wb.getSheetAt(0);    
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();    
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10);    
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG));   
//先把读进来的图片放到一个ByteArrayOutputStream中,以便产生ByteArray 
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); 
BufferedImage bufferImg = ImageIO.read(new File("ok.jpg")); 
ImageIO.write(bufferImg,"jpg",byteArrayOut); 
//读进一个excel模版 
FileInputStream fos = new FileInputStream(filePathName+"/stencil.xlt"); 
fs = new POIFSFileSystem(fos); 
//创建一个工作薄 
HSSFWorkbook wb = new HSSFWorkbook(fs); 
HSSFSheet sheet = wb.getSheetAt(0); 
HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); 
HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,(short) 0,0,(short)10,10); 
patriarch.createPicture(anchor , wb.addPicture(byteArrayOut.toByteArray(),HSSFWorkbook.PICTURE_TYPE_JPEG)); 

//-------------------------------以上实例代码均来自官方网站 
//-------------------------------POI中使用的颜色是用颜色索引来实现,如下: 
/* 
* 颜色对照表 数字代表颜色索引 
8: BLACK 
60: BROWN 
59: OLIVE_GREEN 
58: DARK_GREEN 
56: DARK_TEAL 
18: DARK_BLUE 
32: DARK_BLUE 
62: INDIGO 
63: GREY_80_PERCENT 
53: ORANGE 
19: DARK_YELLOW 
17: GREEN 
21: TEAL 
38: TEAL 
12: BLUE 
39: BLUE 
54: BLUE_GREY 
23: GREY_50_PERCENT 
10: RED 
52: LIGHT_ORANGE 
50: LIME 
57: SEA_GREEN 
49: AQUA 
48: LIGHT_BLUE 
20: VIOLET 
36: VIOLET 
55: GREY_40_PERCENT 
14: PINK 
33: PINK 
51: GOLD 
13: YELLOW 
34: YELLOW 
11: BRIGHT_GREEN 
35: BRIGHT_GREEN 
15: TURQUOISE 
35: TURQUOISE 
16: DARK_RED 
37: DARK_RED 
40: SKY_BLUE 
61: PLUM 
25: PLUM 
22: GREY_25_PERCENT 
45: ROSE 
43: LIGHT_YELLOW 
42: LIGHT_GREEN 
41: LIGHT_TURQUOISE 
27:LIGHT_TURQUOISE 
44: PALE_BLUE 
46: LAVENDER 
9: WHITE 
24: CORNFLOWER_BLUE 
26: LEMON_CHIFFON 
25: MAROON 
28: ORCHID 
29: CORAL 
30: ROYAL_BLUE 
31: LIGHT_CORNFLOWER_BLUE 



五、应用实例:

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@ page import="java.lang.*,computer.*"%>
<html>
<head>
<title>计算机设备管理</title>
<%
GetData gd=new GetData();
%>
</head>
<form name="form1"  action="SaveData.jsp">
<table border="0" cellspacing="1" cellpadding="2" width="97%" align="center" bgcolor="#F6F6F6">    
 <tr><td colspan="5"><div align="center"><img src="images/text01.jpg" align="center"></div></td></tr>
    <tr><td colspan="5">
  <hr>
  </td></tr>
  <tr>
 <td width="15%"><div align="right">设备编号</div></td>
   </tr>
     <tr>
    <td colspan="5"><div align="center">
          <input name="btnDo" type="submit" value="数据提交">    
          <input name="btnReset" type="reset" value="重新输入">    
    <input name="btnOutToExcel" type="button" value="导出到Excel" onClick="clickForOutToExcel();">
    </div></td></tr>
  <tr><td colspan="5">
  <hr>
  </td></tr>
   </table>
<input name="Page_Mark" type="hidden" value="Maintain">
</form>
<form name="form2" action="JSPExcel.jsp">  
 <input name="GetOrPut" type="hidden" value="">
</form>
<script language=javascript>
 function clickForOutToExcel()
 {
  document.form2.GetOrPut.value="PutMaintain";
 alert("维修设备清单成功导出为EXCEL文件!\r\r请查看C盘根目录下的:维修清单.xls");
 document.form2.submit();
 }
</script>
</html>








六、处理有EXCEL导入导出要求的JSP文件(JSPExcel.jsp)
<%@ page contentType="text/html;charset=gbk"%>
<%@ page import="java.lang.*,computer.*"%>
<html>
<head>
</head>
<body>
<% 
String gp=request.getParameter("GetOrPut"); 
String gf=Pool.toChinese(request.getParameter("GFF"));
GetOrWriteExcel gwe=new GetOrWriteExcel();
if (gp.compareTo("Put")==0) {
  try{
  gwe.AllEquipToExcel();  
  %>
  <jsp:forward page="Equip.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%

 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("Get")==0) {
  try{
  gwe.GetEquipFromExcel(gf);
  %>
  <jsp:forward page="Equip.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("PutDis")==0) {
  try{
  gwe.DisToExcel();
  %>
  <jsp:forward page="Distribute.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%  
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("PutMaintain")==0) {
  try{
  gwe.MaintainToExcel();
  %>
  <jsp:forward page="Maintain.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%  
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else if (gp.compareTo("PutTrash")==0) {
  try{
  gwe.TrashToExcel();
  %>
  <jsp:forward page="Trash.jsp">
  <jsp:param name="" value=""/>
  </jsp:forward>
  <%  
  
 }catch(Exception ep){
   System.out.println(ep);
 } 
}
else {
  System.out.println("GETORPUT的值是空的!");
}
%>
</body>
</html>


七、Javabean中专门处理EXCEL的导入导出的类:GetOrWriteExcel.java
package computer;
import java.io.*;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class GetOrWriteExcel {
 Pool pl;
 Connection cn;
 
 public GetOrWriteExcel(){
  try{
   pl=new Pool();
   //在办公室通过WEB操作数据库
   cn=pl.getConnection();
   //在办公室用Test测试数据库操作
   //cn=pl.getConnectForTest();
   //在家测试数据库
   //cn=pl.getConnectAtHome();
   
   if (cn==null){
    System.out.println("数据库连接为空");
   }
   
  } catch(Exception ex){
   System.out.println(ex);
  }  
 }

 public void AllEquipToExcel(){
  
  String sqlStr="select * from Equip_View";
  String fname="c:\\设备清单.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有设备导入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
  
 }
 
 /*
  * 从Excel中导入设备列表,参数gf表示要导入的excel文件名
  */
 public void GetEquipFromExcel(String gf)throws IOException{
  try{
   POIFSFileSystem fs=new POIFSFileSystem(new FileInputStream(gf));
   HSSFWorkbook wb=new HSSFWorkbook(fs);
   HSSFSheet sheet=wb.getSheetAt(0);
   HSSFRow row;   
   int count=0;
   count=sheet.getPhysicalNumberOfRows();
   
   //数据库操作
   try{
   cn.setAutoCommit(false);
   Statement st=cn.createStatement();
   String sqlStr="";
   for (int i=1;i<count;i++){
    row=sheet.getRow(i);
    sqlStr="INSERT INTO Equip(EquipID,Price,BuyDate,ETypeID,DealerID,CPU,HD,MEMORY,DISPLAY,MAINBOARD,EState,Other,Remark,Spec) VALUES(";
    sqlStr += "'";
    sqlStr += row.getCell((short)0).toString().trim();
    sqlStr += "','";
    sqlStr += Float.parseFloat(row.getCell((short)1).toString());
    sqlStr += "','";
    sqlStr += row.getCell((short)2).toString().substring(0, 10);
    sqlStr += "','";
    sqlStr += row.getCell((short)3).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)4).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)5).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)6).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)7).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)8).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)9).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)10).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)11).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)12).toString().trim();
    sqlStr += "','";
    sqlStr += row.getCell((short)13).toString().trim();
    sqlStr += "')";
    //System.out.println(sqlStr);
    st.addBatch(sqlStr);
    //st.execute(sqlStr);
    //System.out.println(sqlStr);
   }  
   
   st.executeBatch();
   cn.commit();
   cn.setAutoCommit(true);     
   st.close();
   System.out.println("从Excel中成功批量导入设备!");
   }catch(Exception se){
    System.out.println("向Equip表中批量存入数据时出错,错误代码:" + se);
   }    
   
  }catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  
 }
 
 public void DisToExcel(){
  String sqlStr="select * from Distribute_View";
  String fname="c:\\领用清单.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有领用设备导入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } 
 }
 
 public void MaintainToExcel(){
  String sqlStr="select * from EquipMaintain_View";
  String fname="c:\\维修清单.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有维修记录导入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }   
 }
 
 public void TrashToExcel(){
  String sqlStr="select * from Trash_View";
  String fname="c:\\报废清单.xls";
  
  try {
   DataToExcel(sqlStr,fname);
   System.out.println("所有维修记录导入到Excel成功!");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }  
 }
 
 /*
  * 从数据库将数据导出到EXCEL文件的通用函数,参数sqlStr是传来的sql语句,filename是要保存的文件名与路径
  */
 public void DataToExcel(String sqlStr,String filename) throws IOException{
  ResultSet rs = null;
  ResultSetMetaData rsmeta=null;
  Statement st = null;   
  try{ 
   String[] title;
   
   HSSFWorkbook wb=new HSSFWorkbook();
   HSSFSheet sheet=wb.createSheet("数据清单");
   HSSFRow row=sheet.createRow((short)0);//第一行显示字段名称
   
   st=cn.createStatement();
   rs = st.executeQuery(sqlStr);
   rsmeta=rs.getMetaData();
   int numofCols=rsmeta.getColumnCount();
   title=new String[numofCols];
   for (int i=0;i<numofCols;i++){
    title[i]=rsmeta.getColumnName(i+1);
    row.createCell((short)i).setCellValue(title[i]);
   }
   //以下显示数据
   int k=1;
   while(rs.next()){
    row=sheet.createRow((short)k);
    for (int j=1;j<=numofCols;j++){
     row.createCell((short)(j-1)).setCellValue(rs.getString(j));
    }
    k++;
   }
   
   FileOutputStream fileOut=new FileOutputStream(filename);
   wb.write(fileOut);
   fileOut.close();
   
  } catch (SQLException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  } finally {
   try {
    rs.close();
    st.close();
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
}
jsp页面加载javascript
<!-- 所有包含这个页面的页面,将会实现页面正在加载的提示信息,注意必须放在页面的最前面 author:kiral--> 
<%@ page contentType="text/html;charset=UTF-8"%>
<%String ctx=request.getContextPath();%>
<link rel="stylesheet" type="text/css"
			href="<%=ctx%>/widgets/loading/style.css" />
<div id="loading">
	<div class="loading-indicator">
		页面正在加载中...
	</div>
</div>
<script type="text/javascript">
//判断页面是否加载完毕,如果加载完毕,就删除加载信息的DIV
function document.onreadystatechange()
{
	try
	{
		if (document.readyState == "complete") 
		{
	     	delNode("loading");
	    }
    }
    catch(e)
    {
    	alert("页面加载失败");
    }
}

//删除指定的DIV
function  delNode(nodeId)
{   
  try
  {   
	  var div =document.getElementById(nodeId);  
	  if(div !==null)
	  {
		  div.parentNode.removeChild(div);   
		  div=null;    
		  CollectGarbage(); 
	  }  
  }
  catch(e)
  {   
  	   alert("删除ID为"+nodeId+"的节点出现异常");
  }   
}
</script>
页面查询加载css
.loading-indicator {
    font-size:8pt; 
    background-image:url(images/loading.gif);
    background-repeat: no-repeat;  
    background-position:top left; 
    padding-left:20px;
	height:18px;
	text-align:left;
}
 
#loading{
	position:absolute;
	left:45%;
	top:40%;
	border:3px solid #B2D0F7;
	background:white url(images/block-bg.gif) repeat-x;
	padding:10px;
	font:bold 14px verdana,tahoma,helvetica; 
	color:#003366;
	width:180px;
	text-align:center;
}
ibatis教程 数据访问
1.	显示数据库所有数据
希望能给大家带来帮助
iBatis是个像Hibernate, JDO,EJB一类的数据持久框架,它能将对象映射为SQL语句.它是个轻量级的框架并且持久性API适合持久化POJO.iBatis也与Hibernate, JDO不同,因为它使用存储过程和现有的SQL来处理数据库.
本节我们将向你讲述如何配置iBatis来运行一个小型程序.既然一次性将所有知识全部解释很难,我们索性把本教程分为几个单独的例子来陈述.该例是关于如何从数据库读取数据并将结果显示在你的命令提示符上.在第二个例子中你将学习如何添加更多的数据到数据库中,在此之后的第三个例子将会向你展示如何通过iBatis从记录中删除数据.
现在的第一个例子将会向你展示如何从数据库中读取记录,我们需要一个数据库来执行查询,所以我们使用MySQL5.0作为这个例子的数据库.
这里我们将要检索一些人的contact的信息, contact的表结构给出如下 : 

DROP TABLE IF EXISTS `contact`;
CREATE TABLE `contact` (
       `id` int(11) NOT NULL auto_increment,
       `firstName` varchar(20) default NULL,
       `lastName` varchar(20) default NULL,
       `email` varchar(20) default NULL,
       PRIMARY KEY (`id`)
);
根据Contact表我们需要创建一个POJO类,在我们的例子中,数据库vin有一个表Contact,包括四个字段 : 
•	id 
•	firstName 
•	lastName 
•	email 
Contact.java
public class Contact {
  private String firstName; 
  private String lastName;   
  private String email;  
  private int id;

  public Contact() {}
  
  public Contact(
    String firstName,
    String lastName,
    String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    }
  
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  } 
}
为了映射配置我们需要创建SqlMapConfig.xml来指定如下信息 : 
	针对映射语句的命名空间前缀
	我们的数据库将使用JDBC来进行访问
	针对MySQL的JDBC驱动为" com.mysql.jdbc.Driver"
	连接URL为"jdbc:mysql://192.168.10.112:3306/vin"
	用户名与密码分别为"root"和"root"
	我们的SQL语句描述在"Contact.xml"
SqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <settings useStatementNamespaces="true"/>
     <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL"
               value="jdbc:mysql://192.168.10.112:3306/vin"/>
          <property name="JDBC.Username" value="root"/>
          <property name="JDBC.Password" value="root"/>
        </dataSource>
      </transactionManager>
     <sqlMap resource="Contact.xml"/> 
</sqlMapConfig>
映射文件在下面给出,它主要负责为我们的程序执行SQL查询. Contact.xml的代码如下 : 
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap 
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Contact">
<!--- Showing all data of table -->
<select id="getAll" resultClass="Contact">
          select * from contact
</select>
</sqlMap>
现在为了显示数据库中的数据我们需要创建一个类----IbatisExample,它从SqlMapConfig.xml中读取配置并在你的控制台输出所有数据. IbatisExample.java的代码如下 : 
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisExample{
  public static void main(String[] args)
    throws IOException,SQLException{
    Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient sqlMap = 
      SqlMapClientBuilder.buildSqlMapClient(reader);
      //Output all contacts
      System.out.println("All Contacts");
      List<Contact> contacts = (List<Contact>)
        sqlMap.queryForList("Contact.getAll",null);
        Contact contact = null;
      for (Contact c : contacts) {
      System.out.print("  " + c.getId());
      System.out.print("  " + c.getFirstName());
      System.out.print("  " + c.getLastName());
      System.out.print("  " + c.getEmail());
        contact = c; 
      System.out.println("");
      }    
  }
}
为了运行该例,你需要遵循如下步骤 : 
	在你的MySQL数据库中创建表Contact
	下载iBatis的JAR文件(ibatis-common-2.jar,ibatis-dao-2.jar,ibatis-sqlmap-2.jar),并将其放置在你的lib目录中
	设置类路径
	创建Contact.java将其编译
	创建Contact.java
	创建SqlMapConfig.xml
	创建IbatisExample.java并将其编译
	执行IbatisExample文件
输出 : 
你的命令提示符应该有像这样的输出 : 
 


2.向数据库插入数据
iBatis最棒的特点就是它的简洁,这也是唯一令它在任何数据库程序中更容易使用的原因.iBatis使得通过Java或者任何其它的Microsoft的程序来使用数据库变得非常简单.本章我们将会通过一个例子向你介绍如何向数据库插入一行数据.我们使用MySQL作为本例的数据库,和我们上一章中使用的是一样的.这是"Contact"表和我们上一章使用过的两个文件:"Contact.java"和"SqlMapConfig.xml"
Contact.java
public class Contact {
  private String firstName; 
  private String lastName;   
  private String email;  
  private int id;

  public Contact() {}
  
  public Contact(
    String firstName,
    String lastName,
    String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    }
  
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  } 
}
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <settings useStatementNamespaces="true"/>
     <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL"
               value="jdbc:mysql://192.168.10.112:3306/vin"/>
          <property name="JDBC.Username" value="root"/>
          <property name="JDBC.Password" value="root"/>
        </dataSource>
      </transactionManager>
     <sqlMap resource="Contact.xml"/> 
</sqlMapConfig>
我们使用<insert>标签来映射SQL语句,在该标签中我们定义了一个"id",它将在IbatisInsertion.java文件中用来执行数据库插入,查询操作.
<selectKey resultClass="int" keyProperty="id">
   select last_insert_id() as id
</selectKey>
上面的代码意味着表中被插入数据的下一行.
Contact.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap 
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Contact"> 
<!--- Inserting data in table -->

<insert id="insert" parameterClass="Contact">
           insert into contact (firstName,lastName,email)
           values (#firstName#, #lastName#, #email#)
           <selectKey resultClass="int" keyProperty="id">
                select last_insert_id() as id
           </selectKey>
</insert> 
<!--- Showing all data of table -->
<select id="getAll" resultClass="Contact">
       select * from contact
</select>
</sqlMap>
IbatisInsertion.java的代码如下 :
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisInsertion{
  public static void main(String[] args) throws IOException,SQLException{
     Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
      //Inserting one record in contacts
      System.out.println(
     "*-------------- Inserting information in Contact Table -----------*");
      Contact contact=new Contact("Amit","Kumar","amit@roseindia.net");
      sqlMap.insert("Contact.insert",contact);
      System.out.println("|Record Inserted Successfully ");
      System.out.println("All Contacts");
      List<Contact> contacts = (List<Contact>)
        sqlMap.queryForList("Contact.getAll",null);
        Contact contactall = new Contact();
      for (Contact c : contacts) {
      System.out.print("  " + c.getId());
      System.out.print("  " + c.getFirstName());
      System.out.print("  " + c.getLastName());
      System.out.print("  " + c.getEmail());
        contact = c; 
      System.out.println("");
    }
      System.out.println("===============================================");
      }    
}
如何执行本例 :
1.创建Contact.java并将其编译
2.创建Contact.xml和SqlMapConfig.xml
3.创建IbatisInsertion.java
4.执行IbatisInsertion类文件,结果将在你的命令提示符上输出如下 :
"Record Inserted Successfully"
输出 :
 


3.iBatis删除操作教程
我希望通过上面的例子,你能完全懂得如何向数据库执行插入或者查询操作.所以在本例中你将学习到如何通过iBatis在数据库中删除数据.所以你需要分析代码并清楚的理解在这些代码里到底发生了什么.然而你绝对不需要再创建一个不同的数据库,虽然你知道我们使用上一个MySQL作为数据库而且你已经知道了我们的表名是Contact.但你可以选择是使用这个数据库还是再创建一个,这都由你决定!你唯一需要确定的就是你定义的表名是正确的,否则将会产生Bug.如果你从本iBatis教程的开始学下来的,那么你是不需要修改代码的.仅仅将给定的代码拷贝到文件夹并执行,最终删除数据库表中的数据.
正如我之前提到的,在iBatis的本章,我们将要从Ctract表中删除记录,我们使用MySQL的数据库"vin"
我们的Contact.java和SqlMapConfig.xm与上一个例子中的是一样的.
Contact.java
public class Contact {
  private String firstName; 
  private String lastName;   
  private String email;  
  private int id;

  public Contact() {}
  
  public Contact(
    String firstName,
    String lastName,
    String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    }
  
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  } 
}
 SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <settings useStatementNamespaces="true"/>
     <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL"
               value="jdbc:mysql://192.168.10.112:3306/vin"/>
          <property name="JDBC.Username" value="root"/>
          <property name="JDBC.Password" value="root"/>
        </dataSource>
      </transactionManager>
     <sqlMap resource="Contact.xml"/> 
</sqlMapConfig>
 
在Contract.xml文件中我们使用<delete>标签删除Contract表中的全部记录.
<delete id="deleteAll" parameterClass="Contact">
         delete from Contact
</delete>
上面几行代码删除了Contract表中的所有记录,这里定义的id"deleteAll"会在以后在IbatisDeletion类中执行数据库的查询操作.
Contact.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap 
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Contact">
<!--- Delete data from Contact table --> 
<delete id="deleteAll" parameterClass="Contact">
         delete from Contact
</delete> 
<!--- Showing all data of table --> 
<select id="getAll" resultClass="Contact">
       select * from contact
</select>
</sqlMap>
我们需要引入下面的包 :
com.ibatis.common.resources
com.ibatis.sqlmap.client 
SQL映射所需的类和接口 :
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
    SqlMapClient sqlMap = 
    SqlMapClientBuilder.buildSqlMapClient(reader);
上面的代码能从"SqlMapConfig.xml"中读取配置信息, IbatisDeletion.java的代码如下 :
IbatisDeletion.java
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisDeletion{
  public static void main(String[] args)
    throws IOException,SQLException{
    Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
    SqlMapClient sqlMap = 
    SqlMapClientBuilder.buildSqlMapClient(reader);
     //Deleting all records from contacts
    System.out.println("*-- Deleting informations from Contact------*");
    Contact contct=new Contact();
    sqlMap.delete("Contact.deleteAll",contct);
    System.out.println("|Deleted Record Successfully ");
    System.out.println("All Contacts");
      List<Contact> contacts = (List<Contact>)
        sqlMap.queryForList("Contact.getAll",null);
        Contact contact = null;
      for (Contact c : contacts) {
      System.out.print("  " + c.getId());
        System.out.print("  " + c.getFirstName());
      System.out.print("  " + c.getLastName());
      System.out.print("  " + c.getEmail());
        contact = c; 
      System.out.println("");
    }
    System.out.println("============================================");
      }    
}
按照如下步骤执行本例 :
创建Contact.xml和SqlMapConfig.xml
创建Contract.java并将其编译
创建IbatisDeletion.java并将其编译
执行IbatisDeletion你将会在你的命令提示符中得到如下输出 :
 


4.更新表中的数据
对任何数据库程序来说,添加,更新,删除都是十分常见且必要的特性.在该教程里我们已经讲解了使用iBatis在Java中进行插入和删除操作,现在本章将讲述如何使用iBatis在数据表中更新数据.在iBatis中执行一条更新语句是非常简单的.为了更新数据你得在SQL映射文件"Contact.xml"中添加SQL的update语句.
iBatis更新语句例子 :
Contact.java
public class Contact {
  private String firstName; 
  private String lastName;   
  private String email;  
  private int id;

  public Contact() {}
  
  public Contact(
    String firstName,
    String lastName,
    String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    }
  
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  } 
}

SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <settings useStatementNamespaces="true"/>
     <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL"
               value="jdbc:mysql://192.168.10.112:3306/vin"/>
          <property name="JDBC.Username" value="root"/>
          <property name="JDBC.Password" value="root"/>
        </dataSource>
      </transactionManager>
     <sqlMap resource="Contact.xml"/> 
</sqlMapConfig>
 
iBatis更新查询
在我们的例子中,我们通过参数中指定的id更新了表中的数据,因此对于"id"我们将"parameterClass"的属性值分配为"long".
Contact.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap 
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Contact">
 <!--- Showing all data of table -->
         <select id="getAll" resultClass="Contact">
               select * from contact
        </select>
<!--- Update data of Contact table --> 
 <update id="updateById" parameterClass="long">
       update Contact 
                  set 
                  lastName = 'Raghuwanshi'
                             where
                                      id=#id# 
</update> 
</sqlMap>

现在我们可以在Java程序中通过如下代码执行更新操作了 :
sqlMap.update("Contact.updateById",contactId);
IbatisUpdate.java代码如下 :
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisUpdate{
  public static void main(String[] args)
    throws IOException,SQLException{
    Reader reader = Resources.getResourceAsReader(
                    "SqlMapConfig.xml"
                    );
    SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
      //Updating one record of contact
    System.out.println("*---- Updating informations of Contact -----*");
    Contact contct=new Contact();
    long contactId=1;
    sqlMap.update("Contact.updateById",contactId);
      System.out.println("|Updated Record Successfully ");
    System.out.println("All Contacts");
      List<Contact> contacts = (List<Contact>)
        sqlMap.queryForList("Contact.getAll",null);
        Contact contact = null;
      for (Contact c : contacts) {
      System.out.print("  " + c.getId());
      System.out.print("  " + c.getFirstName());
      System.out.print("  " + c.getLastName());
      System.out.print("  " + c.getEmail());
        contact = c; 
      System.out.println("");
    }
    System.out.println("============================================");
   }    
} 

为了执行update的例子,遵照如下步骤 :
  创建Contact.java和SqlMapConfig.xml
  编译Contact.java
  创建Contact.xml
  创建IbatisUpdate.java并将其编译
  执行IbatisUpdate类文件,你会得到如下输出 :
 


5.iBatis ResultMap例子
如果你使用iBatis的Result Map来工作,那么你一定知道iBatis的Result Map是用来提供数据库查询结果和它的对象属性之间的映射的,这是iBatis最常见且重要的特性了.本章仅是一个ResultMap的简单介绍.我们的Contact.java and SqlMapConfig.xml文件和我们的上一个例子是一样的,没有任何变化. Contact POJO的代码如下 :
Contact.java
public class Contact {
  private String firstName; 
  private String lastName;   
  private String email;  
  private int id;

  public Contact() {}
  
  public Contact(
    String firstName,
    String lastName,
    String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    }
  
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  } 
} 

SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <settings useStatementNamespaces="true"/>
     <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL"
               value="jdbc:mysql://192.168.10.112:3306/vin"/>
          <property name="JDBC.Username" value="root"/>
          <property name="JDBC.Password" value="root"/>
        </dataSource>
      </transactionManager>
     <sqlMap resource="Contact.xml"/> 
</sqlMapConfig>
要想使用ResultMap我们得使用<resultMap></resultMap>标签.它由一个id组成,该id需要在<select>标签下的resultMap属性中运行resultMap.这是Contact.xml的代码

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap 
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Contact">
<!--- Showing data by ID -->
 <resultMap id="result" class="Contact">
    <result property="id" column="id"/>
    <result property="firstName" column="firstName"/>
    <result property="lastName" column="lastName"/>
    <result property="email" column="email"/>
</resultMap> 
<select id="getById" resultMap="result">
         select * from contact where id=#id#
</select>
</sqlMap>

为了执行resultMap例子,我们需要将下面的Java代码引入进来.
sqlMap.queryForObject("Contact.getById",new Integer(1));
这里我们传递值为1的id来显示所有该id的信息.
IbatisResultMap.java
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisResultMap{
  public static void main(String[] args) 
    throws IOException,SQLException{
    Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
    SqlMapClient sqlMap = 
    SqlMapClientBuilder.buildSqlMapClient(reader);
      //Output all contacts
    System.out.println("*------Information by Contact Id--------*");
    Contact contact = 
    (Contact)sqlMap.queryForObject("Contact.getById",new Integer(1));
    System.out.println("|Id          = " + contact.getId());
    System.out.println("|First Name  = " + contact.getFirstName());
    System.out.println("|Last Name   = " + contact.getLastName());
    System.out.println("|Email Id    = " + contact.getEmail());
    System.out.println("==========================================");
   }    
} 
为了运行该程序 :
  创建Contact.xml和SqlMapConfig.xml
  创建并编译Contact.java
  创建并编译IbatisResultMap.java
  在执行IbatisResultMap类文件的时候,该id的所有信息将会显示出来 :
 


6.iBatis存储过程例子
正如你在本教程上面部分看到的,通过iBatis我们可以在数据库表中执行内嵌的insert , delete, update SQL命令.本例中你将看到如何在iBatis中调用存储过程.
就像我在上一个例子中提到的,我们使用MySQL数据库,并且使用和上一个例子中一样的Contact表.
我们在数据库"vin"中创建了一个叫showData()的存储过程,它将显示Contract表中的所有的contact信息.为了创建存储过程,我们打开MySQL并创建如下定义的过程 :
DELIMITER $$

DROP PROCEDURE IF EXISTS `vin`.`showData`$$

CREATE PROCEDURE `vin`.`showData`()
BEGIN
select * from Contact;
END$$

DELIMITER ;
"Contact.java"和"SqlMapConfig.xml"与上一个例子中的是一样的 :
Contact.java
public class Contact {
  private String firstName; 
  private String lastName;   
  private String email;  
  private int id;

  public Contact() {}
  
  public Contact(
    String firstName,
    String lastName,
    String email) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.email = email;
    }
  
  public String getEmail() {
    return email;
  }
  public void setEmail(String email) {
    this.email = email;
  }
  public String getFirstName() {
    return firstName;
  }
  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getLastName() {
    return lastName;
  }
  public void setLastName(String lastName) {
    this.lastName = lastName;
  } 
}
SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
   <settings useStatementNamespaces="true"/>
     <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver" value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL"
               value="jdbc:mysql://192.168.10.112:3306/vin"/>
          <property name="JDBC.Username" value="root"/>
          <property name="JDBC.Password" value="root"/>
        </dataSource>
      </transactionManager>
     <sqlMap resource="Contact.xml"/> 
</sqlMapConfig>

我们只需修改"Contact.xml"并使用<procedure>标签来调用存储过程
<procedure id="storedInfo" resultClass="Contact">
       { call showData() } 
</procedure>
上面几行代码调用了存储过程并集合了contract表.下面是Contact.xml的代码 :
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Contact">
  <!--- Calling stored procedure --> 
      <procedure id="storedInfo" resultClass="Contact">
            { call showData()} 
   </procedure>
</sqlMap>
现在我们可以这样调用存储过程 :
sqlMap.queryForList("Contact.storedInfo",null); "sqlMap"是SqlMapClient类的一个对象. IbatisStoredProcedure.java的代码如下 :
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class IbatisStoredProcedure{
  public static void main(String[] args) 
      throws IOException,SQLException{  
      Reader reader = 
      Resources.getResourceAsReader("SqlMapConfig.xml");
      SqlMapClient sqlMap = 
      SqlMapClientBuilder.buildSqlMapClient(reader);
      System.out.println("All Contacts");
      List<Contact> contacts = (List<Contact>)
        sqlMap.queryForList("Contact.storedInfo",null);
        Contact contact = null;
      for (Contact c : contacts) {
      System.out.print("  " + c.getId());
      System.out.print("  " + c.getFirstName());
      System.out.print("  " + c.getLastName());
      System.out.print("  " + c.getEmail());
        contact = c; 
      System.out.println("");
      }    
  }
} 
请依照如下步骤执行本例 :
  创建Contact.xml和SqlMapConfig.xml
  创建Contact.java并将其编译
  创建IbatisStoredProcedure.java并将其编译
  执行IbatisStoredProcedure类文件,所有的Contract信息将在你的命令提示符下显示 :
 
jsp中文乱码
中文乱码解决方案

1:选择window → preferences…,打开窗体设置界面
把workspace里面的Text file encoding设置为UTF-8


2:进入到窗体设置界面的MyEclipst → Files and Edtors选项
设置里面的ASP and PHP, CSS ,HTML ,JavaScrip t,JSF ,JSP, XML,为UTF-8



3:页面:
	1.<% request.setCharacterEncoding("utf-8");%>

	2.<%@ page language="java" pageEncoding="UTF-8" contentType="text/html; charset=utf-8"%>

	3.<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


4:Tomcat服务器端
	进入Tomcat根目录的config,然后打开config下的server.xml文件
	将URIEncoding改为"UTF-8"


手工转换方式
	String a=request.getParameter("a");
	String b=new String(a.getBytes("ISO-8859-1"),"utf-8");  
  

html标记详解 html标签
--  HTML标签详解
HTML指令详解
结构
<html>
<head>
<title>标题<title>
</head>
<body>..........文件内容..........
</body>
</html>
1.文件标题
<title>..........</title>
2.文件更新--<meta>
 【1】10秒后自动更新一次
  <meta http-equiv="refresh" content=10>
 【2】10秒後自动连结到另一文件
  <meta http-equiv="refresh" content="10;URL=欲连结文件之URL">
3.查询用表单--<isindex>
   若欲设定查询栏位前的提示文字:
  <isindex prompt="提示文字">
4.预设的基准路径--<base>
   <base href="放置文件的主机之URL">
版面
1.标题文字 <h#>..........</h#> #=1~6;h1为最大字,h6为最小字
2.字体变化 <font>..........</font> 
【1】字体大小 <font size=#>..........</font> #=1~7;数字愈大字也愈大 
【2】指定字型 <font face="字型名称">..........</font> 
【3】文字颜色 <font color=#rrggbb>..........</font> rr:表红色(red)色码 gg:表绿色(green)色码 bb:表蓝色(blue)色码
3.显示小字体 <small>..........</small> 
4.显示大字体 <big>..........</big>
5.粗体字 <b>..........</b>
6.斜体字 <i>..........</i> 
7.打字机字体 <tt>..........</tt>
8.底线 <u>..........</u>
9.删除线 <strike>..........</strike>
10.下标字 <sub>..........</sub>
11.上标字 <sup>..........</sup>
12.文字闪烁效果 <blink>..........</blink>
13.换行 <br>
14.分段 <p> 
15.文字的对齐方向 <p align="#"> #号可为 left:表向左对齐(预设值) center:表向中对齐 right:表向右对齐 P.S.<p align="#">之後的文字都会以所设的对齐方式显示, 直到出现另一个<p align="#">改变其对齐方向,或遇到 <hr>ⅱ<h#>标签时会自动设回预设的向左对齐。
16.分隔线 <hr> 
【1】分隔线的粗细 <hr size=点数> 
【2】分隔线的宽度 <hr size=点数或百分比> 
【3】分隔线对齐方向 <hr align="#"> #号可为 left:表向左对齐(预设值) center:表向中对齐 right:表向右对齐 
【4】分隔线的颜色 <hr color=#rrggbb> 
【5】实心分隔线 <hr noshade>
17.向中对齐 <center>..........</center>
18.依原始样式显示 <pre>..........</pre>
19.<body>指令的属性 
【1】背景颜色 -- bgcolor <body bgcolor=#rrggbb> 
【2】背景图案 -- background <body background="图形文件名"> 
【3】设定背景图案不会卷动 -- bgproperties <body bgproperties=fixed> 
【4】文件内容文字的颜色 -- text <body text=#rrggbb> 
【5】超连结文字颜色 -- link <body link=#rrggbb> 
【6】正被选取的超连结文字颜色 -- vlink <body vlink=#rrggbb> 
【7】已连结过的超连结文字颜色 -- alink <body alink=#rrggbb>
20.注解 <!--..........-->21.特殊字元表示法 
符 号   语 法  
<     &lt  
>     &gt  
&     &amp  
"     &quot  
空白    &nbsp   
 
图片
1.插入图片 <img src="图形文件名">
2.设定图框 -- border <img src="图形文件名" border=点数>
3.设定图形大小 -- widthⅱheight <img src="图形文件名" width=宽度点数 height=高度点数>
4.设定图形上下左右留空 -- vspaceⅱhspace <img src="图形文件名" vspace=上下留空点数 hspace=左右留空点数>
5.图形附注 <img src="图形文件名" alt="说明文字">
6.预载图片
<img src="高解析度图形文件名" lowsrc="低解析度图形文件名"> P.S.两个图的图形大小最好一致
7.影像地图(Image Map) <img src="图形文件名" usemap="#图的名称"> <map name="图的名称">
       <area shape=形状 coords=区域座标列表 href="连结点之URL">
       <area shape=形状 coords=区域座标列表 href="连结点之URL">
       <area shape=形状 coords=区域座标列表 href="连结点之URL">
       <area shape=形状 coords=区域座标列表 href="连结点之URL">    </map>    
【1】定义形状 -- shape
       shape=rect:矩形         shape=circle:圆形         shape=poly:多边形    
【2】定义区域 -- coords
a.矩形:必须使用四个数字,前两个数字为左上角座标,后两个数字为右下角座标
例:<area shape=rect coords=100,50,200,75 href="URL">
b.圆形:必须使用三个数字,前两个数字为圆心的座标,最后一个数字为半径长度
例:<area shape=circle coords=85,155,30 href="URL">
c.任意图形(多边形):将图形之每一转折点座标依序填入
例:<area shape=poly coords=232,70,285,70,300,90,250,90,200,78 href="URL">
表格
1.定义表格 <table>..........</table> 
【1】设定边框的厚度 -- border
<table border=点数> 
【2】设定格线的宽度 -- cellspacing
<table cellspacing=点数> 
【3】设定资料与格线的距离 -- cellpadding
<table cellpadding=点数> 
【4】调整表格宽度 -- width
<table width=点数或百分比> 
【5】调整表格高度 -- height
<table height=点数或百分比> 
【6】设定表格背景色彩 -- bgcolor
<table bgcolor=#rrggbb> 
【7】设定表格边框色彩 -- bordercolor
<table bordercolor=#rrggbb>
2.显示格线 <table border>
3.表格标题
<caption>..........</caption> 
表格标题位置 -- align
<caption align="#"> #号可为 top:表标题置于表格上方(预设值)
bottom:表标题置于表格下方
4.定义列 <tr>
5.定义栏位 《1》<td>:靠左对齐
《2》<th>:靠中对齐ⅱ粗体 
【1】水平位置 -- align <th align="#">
#号可为 left:向左对齐
center:向中对齐 right:向右对齐
【2】垂直位置 -- align <th align="#"> #号可为
top:向上对齐 middle:向中对齐
bottom:向下对齐 
【3】栏位宽度 -- width
<th width=点数或百分比> 
【4】栏位垂直合并 -- rowspan
<th rowspan=欲合并栏位数> 
【5】栏位横向合并 -- colspan
<th colspan=欲合并栏位数>
清单
一、目录式清单 
<dir> <li>项目1 <li>项目2 <li>项目3 </dir> P.S.目录式清单每一个项目不能超过20个字元(即10个中文字)
二、选项式清单 <menu> <li>项目1 <li>项目2 <li>项目3 </menu>
三、有序号的清单 <ol> <li>项目1 <li>项目2 <li>项目3 </ol> 
【1】序号形式 -- type <ol type=#>或<li type=#> #号可为 A:表以大写英文字母AⅱBⅱCⅱD...做为项目编号 a:表以小写英文字母aⅱbⅱcⅱd...做为项目编号 I:表以大写罗马数字做为项目编号 i:表以小写罗马数字做为项目编号 1:表以阿拉伯数字做为项目编号(预设值) 
【2】起始数字 -- start <ol start=欲开始计数的序数> 
【3】指定编号 -- value <li value=欲指定的序数>
四、无序号的清单 <ul> <li>项目1 <li>项目2 <li>项目3 </ul> 
【1】项目符号形式 -- type <ul type=#>或<li type=#> #号可为 disc:实心圆点(预设值) circle:空心圆点 square:实心方块 
【2】原始清单 -- plain <ul plain> 
【3】清单排列方式 -- warp 《1》清单垂直排列 <ul warp = vert> 《2》清单水平排列 <ul warp = horiz>
五、定义式清单 <dl> <dt>项目1 <dd>项目1说明 <dt>项目2 <dd>项目2说明 <dt>项目3 <dd>项目3说明 </dl> 
紧密排列 -- compact <dl compact> P.S.如此可使<dt>的内容与<dd>的内容在同一行,仅 以数格空白相隔而不换行,但若<dt>的文字超过一 定的长度后,compact的作用就消失了!
表单
一、基本架构 <form action="处理资料用的CGI程式之URL"或"mailto:电子信箱的URL" method="get或post"> .......... .......... .......... </form> 
二、输入文件型表单 <form action="URL" method="post"> <input> <input> .......... .......... </form> 
【1】栏位类型 -- type <input type=#> #号可为 text:文字输入 password:密码 checkbox:多选钮 radio:单选钮 submit:接受按钮 reset:重设按钮 image:图形钮 hidden:隐藏栏位 
【2】栏位名称 -- name <input name="资料栏名"> P.S.若type为submitⅱreset则name不必设定 
【3】文件上的预设值 -- value <input value="预设之字串"> 
【4】设定栏位的宽度 -- size <input size=字元数> 
【5】限制最大输入字串的长度 -- maxlength <input maxlength=字元数> 
【6】预设checkbox或radio的初值 -- checked <input type=checkbox checked> <input type=radio checked> 
【7】指定图形的URL -- src <input type=image src="图档名"> 
【8】图文对齐 -- align <input type=image align="#"> #号可为 top:文字对齐图片之顶端 middle:文字对齐图片之中间 buttom:文字对齐图片之底部
三、选择式表单 <form action="URL" method="post"> <select> <option> <option> .......... .......... </select> </form> 
A、<select>的属性 
【1】栏位名称 -- name <select name="资料栏位名"> 
【2】设定显示的选项数 -- size <select size=个数> 
【3】多重选项 -- multiple <select multiple> 
B、<option>的属性 
【1】定义选项的传回值 -- value <option value="传回值"> 
【2】预先选取的选项 -- selected <option selected>
四、多列输入文字区表单 <form action="URL" method="post"> <textarea> .......... .......... </textarea> </form> 
【1】文字区的变数名称 -- name <textarea name=变数名称> 
【2】设定文字输入区宽度 -- cols <textarea cols=字元数> 
【3】设定文字输入区高度 -- rows <textarea rows=列数> 
【4】输入区设定预设字串 <textarea> 预设文字 </textarea> 
【5】自动换行与否 -- wrap <textarea wrap=#> #号可为 off:表输入的文字超过栏宽时,不会自动换行(预设值) virtual:表输入的文字在超过栏宽时会自动换行
链接
一、连结至其他文件 <a href="URL">说明文字或图片</a>
二、连结至文件内之某一处(外部连结) 
《1》起点
<a href="档名#名称">..........</a> 
《2》终点 <a name="名称">
三、frame的超连结 
【1】开启新的浏览器来显示连结文件 -- _blank <a href="URL" target=_blank>
【2】显示连结文件於目前的frame -- _self <a href="URL" target=_self>
【3】以上一层的分割视窗显示连结文件 -- _parent <a href="URL" target=_parent>
【4】以全视窗显示连结文件 -- _top <a href="URL" target=_top> 
【5】以特定视窗显示连结文件 --<a href="URL" target="特定视窗名称">
FRAME
一、分割视窗指令 <frameset>..........</frameset> 
【1】垂直(上下)分割 -- rows
<frameset rows=#> #号可为点数:如欲分割为100,200,300三个视窗,则
<frameset rows=100,200,300>;亦可以*号代表,如<frameset rows=*,500,*>
百分比:如<frameset rows=30%,70%>,各 项总和最好为100%
【2】水平(左右)分割 -- cols <frameset cols=点数或百分比>
二ⅱ指定视窗内容 -- <frame>
<frameset cols=30%,70%>    <frame>    <frame> </frameset>
【1】指定视窗的文件名称 -- src <frame src=HTML档名> 
【2】定义视窗的名称 -- name
<frame name=视窗名称> 
【3】设定文件与上下边框的距离 -- marginheight
<frame marginheight=点数> 
【4】设定文件与左右边框的距离 -- marginwidth
<frame marginwidth=点数> 
【5】设定分割视窗卷轴 -- scrolling
<frame scrolling=#> #号可为 yes:固定出现卷轴
no:不出现卷轴 auto:自动判断文件大小需不需要卷轴(预设值)
【6】锁住分割视窗的大小 -- noresize <frame noresize> 
jsp页面Ajax请求 ajax+jsp异步请求
关于ajax的实现
第一步:
 

以上代码上创建请求对象。。。。










第二步:
 
以上代码是:通过客户Id获取服务(一个客户有多个服务,当点击客户列表,加载当前选中客户对应的服务。。。。







第三步:
 
以上代码是回调函数实现。。。将从后台请求回来的数据解析,因为从后台是将数据用字符串拼接(stringBuffer)然后通过字符流传到前台界面。在回调函数中,allItem就是返回的数据
custService就是要动态加载的下列框对象











第四步:
 
这部分代码是在后台action里获取数据的,
List list = customerServiceManager.getviewCustomerServiceList(custId, null, null, null);是通过客户Id获取该客户的服务列表

if (list != null && list.size() > 0) {
				for (int i = 0; i < list.size(); i++) {
					ViewCustomerService eg = (ViewCustomerService) list.get(i);
					if (i != list.size() - 1) {
						strBuffer.append(eg.getId().getCustomerServiceSubId()+ ":" + 
								eg.getId().getCustomerServiceName()+ "<app>");
					} else {
						strBuffer.append(eg.getId().getCustomerServiceSubId()
								+ ":" + eg.getId().getCustomerServiceName());
					}
				}
			}

这部分代码就是将查询出来的数据List进行解析,用一个字符拼接然后在转换字符流





try {
				PrintWriter out = getResponse().getWriter();
				out.print(strBuffer.toString());
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return null;

传到前台。。。。以上具体实现就这么多,不懂再问我。。。具体哪一行不懂,截图发我。。。
HTTP状态码解释 httpstatu
本部分余下的内容会详细地介绍 HTTP 1.1中的状态码。这些状态码被分为五大类: 

100-199 用于指定客户端应相应的某些动作。 
200-299 用于表示请求成功。 
300-399 用于已经移动的文件并且常被包含在定位头信息中指定新的地址信息。 
400-499 用于指出客户端的错误。 
500-599 用于支持服务器错误。 

HttpServletResponse中的常量代表关联不同标准消息的状态码。在servlet程序中,你会更多地用到这些常量的标识来使用状态码。例如:你一般会使用response.setStatus(response.SC_NO_CONTENT)而不是 response.setStatus(204),因为后者不易理解而且容易导致错误。但是,你应当注意到服务器允许对消息轻微的改变,而客户端只注意状态码的数字值。所以服务器可能只返回 HTTP/1.1 200 而不是 HTTP/1.1 200 OK。 

100 (Continue/继续)
如果服务器收到头信息中带有100-continue的请求,这是指客户端询问是否可以在后续的请求中发送附件。在这种情况下,服务器用100(SC_CONTINUE)允许客户端继续或用417 (Expectation Failed)告诉客户端不同意接受附件。这个状态码是 HTTP 1.1中新加入的。 

101 (Switching Protocols/转换协议)
101 (SC_SWITCHING_PROTOCOLS)状态码是指服务器将按照其上的头信息变为一个不同的协议。这是 HTTP 1.1中新加入的。 

200 (OK/正常)
200 (SC_OK)的意思是一切正常。一般用于相应GET和POST请求。这个状态码对servlet是缺省的;如果没有调用setStatus方法的话,就会得到200。 

201 (Created/已创建)
201 (SC_CREATED)表示服务器在请求的响应中建立了新文档;应在定位头信息中给出它的URL。

202 (Accepted/接受)
202 (SC_ACCEPTED)告诉客户端请求正在被执行,但还没有处理完。 

203 (Non-Authoritative Information/非官方信息)
状态码203 (SC_NON_AUTHORITATIVE_INFORMATION)是表示文档被正常的返回,但是由于正在使用的是文档副本所以某些响应头信息可能不正确。这是 HTTP 1.1中新加入的。 

204 (No Content/无内容)
在并没有新文档的情况下,204 (SC_NO_CONTENT)确保浏览器继续显示先前的文档。这各状态码对于用户周期性的重载某一页非常有用,并且你可以确定先前的页面是否已经更新。例如,某个servlet可能作如下操作: 
int pageVersion =Integer.parseInt(request.getParameter("pageVersion"));
if (pageVersion >;= currentVersion) {
   response.setStatus(response.SC_NO_CONTENT);
} else {
       // Create regular page
}
但是,这种方法对通过刷新响应头信息或等价的HTML标记自动重载的页面起作用,因为它会返回一个204状态码停止以后的重载。但基于JavaScript脚本的自动重载在这种情况下仍然需要能够起作用。可以阅读本书7.2 ( HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1响应头信息以及他们的意义)部分的详细讨论。 

205 (Reset Content/重置内容)
重置内容205 (SC_RESET_CONTENT)的意思是虽然没有新文档但浏览器要重置文档显示。这个状态码用于强迫浏览器清除表单域。这是 HTTP 1.1中新加入的。 

206 (Partial Content/局部内容)
206 (SC_PARTIAL_CONTENT)是在服务器完成了一个包含Range头信息的局部请求时被发送的。这是 HTTP 1.1中新加入的。 

300 (Multiple Choices/多重选择)
300 (SC_MULTIPLE_CHOICES)表示被请求的文档可以在多个地方找到,并将在返回的文档中列出来。如果服务器有首选设置,首选项将会被列于定位响应头信息中。 

301 (Moved Permanently)
301 (SC_MOVED_PERMANENTLY)状态是指所请求的文档在别的地方;文档新的URL会在定位响应头信息中给出。浏览器会自动连接到新的URL。 

302 (Found/找到)
与301有些类似,只是定位头信息中所给的URL应被理解为临时交换地址而不是永久的。注意:在 HTTP 1.0中,消息是临时移动(Moved Temporarily)的而不是被找到,因此HttpServletResponse中的常量是SC_MOVED_TEMPORARILY不是我们以为的SC_FOUND。 

注意
代表状态码302的常量是SC_MOVED_TEMPORARILY而不是SC_FOUND。 

状态码302是非常有用的因为浏览器自动连接在定为响应头信息中给出的新URL。这非常有用,而且为此有一个专门的方法——sendRedirect。使用response.sendRedirect(url)比调用response.setStatus(response.SC_MOVED_TEMPORARILY)和response.setHeader("Location", url)多几个好处。首先,response.sendRedirect(url)方法明显要简单和容易。第二,servlet自动建立一页保存这一连接以提供给那些不能自动转向的浏览器显示。最后,在servlet 2.2版本(J2EE中的版本)中,sendRedirect能够处理相对路径,自动转换为绝对路径。但是你只能在2.1版本中使用绝对路径。 

如果你将用户转向到站点的另一页中,你要用 HttpServletResponse 中的 encodeURL 方法传送URL。这么做可预防不断使用基于URL重写的会话跟踪的情况。URL重写是一种在你的网站跟踪不使用 cookies 的用户的方法。这是通过在每一个URL尾部附加路径信息实现的,但是 servlet 会话跟踪API会自动的注意这些细节。会话跟踪在第九章讨论,并且养成使用 encodeURL 的习惯会使以后添加会话跟踪的功能更容易很多。 

核心技巧
如果你将用户转向到你的站点的其他页面,用 response.sendRedirect(response.encodeURL(url)) 的方式事先计划好会话跟踪(session tracking)要比只是调用 response.sendRedirect(url) 好的多。 

这个状态码有时可以与301交换使用。例如,如果你错误的访问了http://www.talentdigger.cn/home/link.php?url=aG9zdC9%2BdXNlcg%3D%3D(路径信息不完整),有些服务器就会回复301状态码而有些则回复302。从技术上说,如果最初的请求是GET浏览器只是被假定自动转向。如果想了解更多细节,请看状态码307的讨论。 

303 (See Other/参见其他信息)
这个状态码和 301、302 相似,只是如果最初的请求是 POST,那么新文档(在定位头信息中给出)药用 GET 找回。这个状态码是新加入 HTTP 1.1中的。 

304 (Not Modified/为修正)
当客户端有一个缓存的文档,通过提供一个 If-Modified-Since 头信息可指出客户端只希望文档在指定日期之后有所修改时才会重载此文档,用这种方式可以进行有条件的请求。304 (SC_NOT_MODIFIED)是指缓冲的版本已经被更新并且客户端应刷新文档。另外,服务器将返回请求的文档及状态码 200。servlet一般情况下不会直接设置这个状态码。它们会实现getLastModified方法并根据修正日期让默认服务方法处理有条件的请求。这个方法的例程已在2.8部分(An Example Using Servlet Initialization and Page Modification Dates/一个使用servlet初始化和页面修正日期的例子)给出。 

305 (Use Proxy/使用代理)
305 (SC_USE_PROXY)表示所请求的文档要通过定位头信息中的代理服务器获得。这个状态码是新加入 HTTP 1.1中的。 

307 (Temporary Redirect/临时重定向)
浏览器处理307状态的规则与302相同。307状态被加入到 HTTP 1.1中是由于许多浏览器在收到302响应时即使是原始消息为POST的情况下仍然执行了错误的转向。只有在收到303响应时才假定浏览器会在POST请求时重定向。添加这个新的状态码的目的很明确:在响应为303时按照GET和POST请求转向;而在307响应时则按照GET请求转向而不是POST请求。注意:由于某些原因在HttpServletResponse中还没有与这个状态对应的常量。该状态码是新加入HTTP 1.1中的。 

注意
在 HttpServletResponse 中没有 SC_TEMPORARY_REDIRECT 常量,所以你只能显示的使用307状态码。 

400 (Bad Request/错误请求)
400 (SC_BAD_REQUEST)指出客户端请求中的语法错误。 

401 (Unauthorized/未授权)
401 (SC_UNAUTHORIZED)表示客户端在授权头信息中没有有效的身份信息时访问受到密码保护的页面。这个响应必须包含一个WWW-Authenticate的授权信息头。例如,在本书4.5部分中的“Restricting Access to Web Pages./限制访问Web页。” 

403 (Forbidden/禁止)
403 (SC_FORBIDDEN)的意思是除非拥有授权否则服务器拒绝提供所请求的资源。这个状态经常会由于服务器上的损坏文件或目录许可而引起。 

404 (Not Found/未找到)
404 (SC_NOT_FOUND)状态每个网络程序员可能都遇到过,他告诉客户端所给的地址无法找到任何资源。它是表示“没有所访问页面”的标准方式。这个状态码是常用的响应并且在HttpServletResponse类中有专门的方法实现它:sendError("message")。相对于setStatus使用sendError得好处是:服务器会自动生成一个错误页来显示错误信息。但是,Internet Explorer 5浏览器却默认忽略你发挥的错误页面并显示其自定义的错误提示页面,虽然微软这么做违反了 HTTP 规范。要关闭此功能,在工具菜单里,选择Internet选项,进入高级标签页,并确认“显示友好的 HTTP 错误信息”选项(在我的浏览器中是倒数第8各选项)没有被选。但是很少有用户知道此选项,因此这个特性被IE5隐藏了起来使用户无法看到你所返回给用户的信息。而其他主流浏览器及IE4都完全的显示服务器生成的错误提示页面。可以参考图6-3及6-4中的例子。 

核心警告
默认情况下,IE5忽略服务端生成的错误提示页面。 

405 (Method Not Allowed/方法未允许)
405 (SC_METHOD_NOT_ALLOWED)指出请求方法(GET, POST, HEAD, PUT, DELETE, 等)对某些特定的资源不允许使用。该状态码是新加入 HTTP 1.1中的。 

406 (Not Acceptable/无法访问)
406 (SC_NOT_ACCEPTABLE)表示请求资源的MIME类型与客户端中Accept头信息中指定的类型不一致。见本书7.2部分中的表7.1(HTTP 1.1 Response Headers and Their Meaning/HTTP 1.1响应头信息以及他们的意义)中对MIME类型的介绍。406是新加入 HTTP 1.1中的。 

407 (Proxy Authentication Required/代理服务器认证要求)
407 (SC_PROXY_AUTHENTICATION_REQUIRED)与401状态有些相似,只是这个状态用于代理服务器。该状态指出客户端必须通过代理服务器的认证。代理服务器返回一个Proxy-Authenticate响应头信息给客户端,这会引起客户端使用带有Proxy-Authorization请求的头信息重新连接。该状态码是新加入 HTTP 1.1中的。 

408 (Request Timeout/请求超时)
408 (SC_REQUEST_TIMEOUT)是指服务端等待客户端发送请求的时间过长。该状态码是新加入 HTTP 1.1中的。 

409 (Conflict/冲突)
该状态通常与PUT请求一同使用,409 (SC_CONFLICT)状态常被用于试图上传版本不正确的文件时。该状态码是新加入 HTTP 1.1中的。 

410 (Gone/已经不存在)
410 (SC_GONE)告诉客户端所请求的文档已经不存在并且没有更新的地址。410状态不同于404,410是在指导文档已被移走的情况下使用,而404则用于未知原因的无法访问。该状态码是新加入 HTTP 1.1中的。 

411 (Length Required/需要数据长度)
411 (SC_LENGTH_REQUIRED)表示服务器不能处理请求(假设为带有附件的POST请求),除非客户端发送Content-Length头信息指出发送给服务器的数据的大小。该状态是新加入 HTTP 1.1的。 

412 (Precondition Failed/先决条件错误)
412 (SC_PRECONDITION_FAILED)状态指出请求头信息中的某些先决条件是错误的。该状态是新加入 HTTP 1.1的。 

413 (Request Entity Too Large/请求实体过大)
413 (SC_REQUEST_ENTITY_TOO_LARGE)告诉客户端现在所请求的文档比服务器现在想要处理的要大。如果服务器认为能够过一段时间处理,则会包含一个Retry-After的响应头信息。该状态是新加入 HTTP 1.1的。 

414 (Request URI Too Long/请求URI过长)
414 (SC_REQUEST_URI_TOO_LONG)状态用于在URI过长的情况时。这里所指的“URI”是指URL中主机、域名及端口号之后的内容。例如:在URL--http://www.y2k-disaster.com:8080/we/look/silly/now/中URI是指/we/look/silly/now/。该状态是新加入 HTTP 1.1的。 

415 (Unsupported Media Type/不支持的媒体格式)
415 (SC_UNSUPPORTED_MEDIA_TYPE)意味着请求所带的附件的格式类型服务器不知道如何处理。该状态是新加入 HTTP 1.1的。 

416 (Requested Range Not Satisfiable/请求范围无法满足)
416表示客户端包含了一个服务器无法满足的Range头信息的请求。该状态是新加入 HTTP 1.1的。奇怪的是,在servlet 2.1版本API的HttpServletResponse中并没有相应的常量代表该状态。 

注意
在servlet 2.1的规范中,类HttpServletResponse并没有SC_REQUESTED_RANGE_NOT_SATISFIABLE 这样的常量,所以你只能直接使用416。在servlet 2.2版本之后都包含了此常量。 

417 (Expectation Failed/期望失败)
如果服务器得到一个带有100-continue值的Expect请求头信息,这是指客户端正在询问是否可以在后面的请求中发送附件。在这种情况下,服务器也会用该状态(417)告诉浏览器服务器不接收该附件或用100 (SC_CONTINUE)状态告诉客户端可以继续发送附件。该状态是新加入 HTTP 1.1的。 

500 (Internal Server Error/内部服务器错误)
500 (SC_INTERNAL_SERVER_ERROR) 是常用的“服务器错误”状态。该状态经常由CGI程序引起也可能(但愿不会如此!)由无法正常运行的或返回头信息格式不正确的servlet引起。 

501 (Not Implemented/未实现)
501 (SC_NOT_IMPLEMENTED)状态告诉客户端服务器不支持请求中要求的功能。例如,客户端执行了如PUT这样的服务器并不支持的命令。 

502 (Bad Gateway/错误的网关)
502 (SC_BAD_GATEWAY)被用于充当代理或网关的服务器;该状态指出接收服务器接收到远端服务器的错误响应。 

503 (Service Unavailable/服务无法获得)
状态码503 (SC_SERVICE_UNAVAILABLE)表示服务器由于在维护或已经超载而无法响应。例如,如果某些线程或数据库连接池已经没有空闲则servlet会返回这个头信息。服务器可提供一个Retry-After头信息告诉客户端什么时候可以在试一次。 

504 (Gateway Timeout/网关超时)
该状态也用于充当代理或网关的服务器;它指出接收服务器没有从远端服务器得到及时的响应。该状态是新加入 HTTP 1.1的。 

505 (HTTP Version Not Supported/不支持的 HTTP 版本)
505 (SC_HTTP_VERSION_NOT_SUPPORTED)状态码是说服务器并不支持在请求中所标明 HTTP 版本。该状态是新加入 HTTP 1.1的。
java用jdbc调用存储过程
通过CallableStatement对象可以调用数据库中的存储过程。
try {
	Class.forName( "oracle.jdbc.driver.OracleDriver" );
	Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@localhost:1521:o9i", "scott", "tiger" );
	CallableStatement cstmt = conn.prepareCall(
			"{ call inser_d_pro( ?, ?, ? ) }" );
	cstmt.setString( 1, "Cas003" );
	cstmt.setInt( 2, 50 );
	cstmt.setString( 3, "Sean" );
	//执行存储过程
	cstmt.execute();
	
	cstmt.close();
	conn.close();
} catch( Exception e ) {
	System.err.println( e );
}
调用有输出参数的存储过程
try {
	Class.forName( "oracle.jdbc.driver.OracleDriver" );
	Connection conn = DriverManager.getConnection(
			"jdbc:oracle:thin:@localhost:1521:o9i", "scott", "tiger" );
	CallableStatement cstmt = conn.prepareCall(
			"{ call total_person_pro( ? ) }" );
	cstmt.registerOutParameter( 1, Types.INTEGER );
	//执行存储过程
	cstmt.execute();
	System.out.println( "总共有" + cstmt.getInt( 1 ) + "个人" );
	cstmt.close();
	conn.close();
} catch( Exception e ) {
	System.err.println( e );
}
解析xml
Java操作XML编程实例解析
2008-05-29 11:19:44 来源:互联网 作者:编辑整理 【大 中 小】 评论:1 条
XML作为全球通用的结构化语言,越来越受人们青睐,各种开发平台(比如Microsoft Studio系列、Oracle系列、Inprise Borland系列等)也都把支持XML开发作为宣传口号之一。在许多项目中利用XML数据交换信息,省去了许多麻烦事,不用制定繁锁的数据格式,利用XML数据易于表达,也利于一线开发者跟踪调试。
在XML应用中,最常用也最实用的莫过于XML文件的读写,所以笔者通过一个简单的XML文件读写来作简要分析。可以在任何文本编辑器中先建立如下结构的XML文件,类似于HTML结构,但XML语义比较严格,起始标记必须配对,比如"〈学生花名册〉"与"〈/学生花名册〉"对应,空格多少可不必在意,但一般都以缩格形式书写,便于阅读。把此文件命名为Input.xml,可以在任何支持XML的浏览器中打开测试一下,如果输入正确,在浏览中可以看到此文件的树形表示结构。如果您还对XML结构感到比较陌生,建议先看看《简析Delphi中的XML编程》一文中关于XML文件的说明。
	<?xml version="1.0" encoding="GB2312"?>
	<学生花名册>
		<学生 性别 = "男">
			<姓名>李华</姓名>
			<年龄>14</年龄>
			<电话>6287555</电话>
		</学生>
		<学生 性别 = "男">
			<姓名>张三</姓名>
			<年龄>16</年龄>
			<电话>8273425</电话>
		</学生>
	</学生花名册>






准备工作做完后,接着就开始写实质性的JAVA代码了。为保存从XML文件读入的信息,需要先建一个简单的Bean来保存学生信息,命名为StudentBean,代码如下所示:
public class StudentBean {
	private String sex; //学生性别
	private String name; //学生姓名
	private int age; //学生年龄
	private String phone; //电话号码public void setSex(String s) {
		sex = s;
	}
	public void setName(String s) {
		name = s;
	}
	public void setAge(int a) {
		age = a;
	}
	public void setPhone(String s) {
		phone = s;
	}
	public String getSex() {
		return sex;
	}
	public String getName() {
		return name;
	}
	public int getAge() {
		return age;
	}
	public String getPhone() {
		return phone;
	}
}





之后写XML的测试类,笔者把这个类命名为XMLTest,为了读写XML文件,需要导入如下JAVA包,"//"后为注释说明,笔者的环境是JDK 1.3.1_04,在JDK 1.4.0中测试也通过,XML解释器用Apache的Crimson,可以到Apache主页去上载。
import java.io.*;
//Java基础包,包含各种IO操作
import java.util.*;
//Java基础包,包含各种标准数据结构操作
import javax.xml.parsers.*;
//XML解析器接口
import org.w3c.dom.*;
//XML的DOM实现
import org.apache.crimson.tree.XmlDocument;
//写XML文件要用到
为了保存多个学生信息,还得借助一个集合类(并不是单纯意义上的集合,JAVA中的集合是集合框架的概念,包含向量、列表、哈希表等),这里采用Vector向量类。定义在XMLTest测试类中,命名为student_Vector。然后定义两个方法readXMLFile和writeXMLFile,实现读写操作。代码如下:
private void readXMLFile(String inFile) throws Exception {
	//为解析XML作准备
	//创建DocumentBuilderFactory实例,指定DocumentBuilder
	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	DocumentBuilder db = null;
	try {
		db = dbf.newDocumentBuilder();
	} catch (ParserConfigurationException pce) {
		System.err.println(pce);
		//出异常时输出异常信息,然后退出,下同
		System.exit(1);
	}
	Document doc = null;
	try {
		doc = db.parse(inFile);
	} catch (DOMException dom) {
		System.err.println(dom.getMessage());
		System.exit(1);
	} catch (IOException ioe) {
		System.err.println(ioe);
		System.exit(1);
	}
	//下面是解析XML的全过程,
	//比较简单,先取根元素"学生花名册"
	Element root = doc.getDocumentElement();
	//取"学生"元素列表
	NodeList students = root.getElementsByTagName("学生");
	for (int i = 0; i < students.getLength(); i++) {
		//依次取每个"学生"元素
		Element student = (Element) students.item(i);
		//创建一个学生的Bean实例
		StudentBean studentBean = new StudentBean();
		//取学生的性别属性
		studentBean.setSex(student.getAttribute("性别"));
		//取"姓名"元素,下面类同
		NodeList names = student.getElementsByTagName("姓名");
		if (names.getLength() == 1) {
			Element e = (Element) names.item(0);
			Text t = (Text) e.getFirstChild();
			studentBean.setName(t.getNodeValue());
		}NodeList ages = student.getElementsByTagName("年龄");
		if (ages.getLength() == 1) {
			Element e = (Element) ages.item(0);
			Text t = (Text) e.getFirstChild();
			studentBean.setAge(Integer.parseInt(t.getNodeValue()));
		}
		NodeList phones = student.getElementsByTagName("电话");
		if (phones.getLength() == 1) {
			Element e = (Element) phones.item(0);
			Text t = (Text) e.getFirstChild();
			studentBean.setPhone(t.getNodeValue());
		}student_Vector.add(studentBean);
	}
}

private void writeXMLFile(String outFile) throws Exception {
	//为解析XML作准备,
	//创建DocumentBuilderFactory实例,指定DocumentBuilder
	DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
	DocumentBuilder db = null;
	try {
		db = dbf.newDocumentBuilder();
	} catch (ParserConfigurationException pce) {
		System.err.println(pce);
		System.exit(1);
	}
	Document doc = null;
	doc = db.newDocument();//下面是建立XML文档内容的过程,
	//先建立根元素"学生花名册"
	Element root = doc.createElement("学生花名册");
	//根元素添加上文档
	doc.appendChild(root);//取学生信息的Bean列表
	for (int i = 0; i < student_Vector.size(); i++) {
	//依次取每个学生的信息
	StudentBean studentBean = (StudentBean) student_Vector.get(i);
	//建立"学生"元素,添加到根元素
	Element student = doc.createElement("学生");
	student.setAttribute("性别", studentBean.getSex());
	root.appendChild(student);
	//建立"姓名"元素,添加到学生下面,下同
	Element name = doc.createElement("姓名");
	student.appendChild(name);
	Text tName = doc.createTextNode(studentBean.getName());
	name.appendChild(tName);Element age = doc.createElement("年龄");
	student.appendChild(age);
	Text tAge = doc.createTextNode(String.valueOf(studentBean.getAge()));
	age.appendChild(tAge);Element phone = doc.createElement("电话");
	student.appendChild(phone);
	Text tPhone = doc.createTextNode(studentBean.getPhone());
	phone.appendChild(tPhone);
}
//把XML文档输出到指定的文件
FileOutputStream outStream = new FileOutputStream(outFile);
OutputStreamWriter outWriter = new OutputStreamWriter(outStream);
((XmlDocument) doc).write(outWriter, "GB2312");
outWriter.close();
outStream.close();
}
最后加入测试主函数,如下:
public static void main(String[] args) throws Exception {
	//建立测试实例
	XMLTest xmlTest = new XMLTest();
	//初始化向量列表
	xmlTest.student_Vector = new Vector();System.out.println("开始读Input.xml文件");
	xmlTest.readXMLFile("Input.xml");System.out.println("读入完毕,开始写Output.xml文件");
	xmlTest.writeXMLFile("Output.xml");
	System.out.println("写入完成");
}
好了,保存好StudentBean和XMLTest,把Input.xml保存到工作目录下。可以看到"写入完成"了。
struts2标签
要在jsp中使用Struts2的标志,先要指明标志的引入。通过jsp的代码的顶部加入以下的代码:
<%@taglib prefix="s" uri="/struts-tags" %>
 
If elseif  else
描述:
执行基本的条件流转。
参数:
名称	必需	默认	类型	描述	备注
test	是	 	boolean	决定标志里的内容是否显示的表达式	else标志没有这个参数
id	否	 	Object/String	用来标识元素的id。在UI和表单中为HTML的id属性	 
 
例子:
<s:set name="age" value="61"/>
 
<s:if test="${age > 60}">
    老年人
</s:if>
<s:elseif test="${age > 35}">
    中年人
</s:elseif>
<s:elseif test="${age > 15}" id="wawa">
    青年人
</s:elseif>
<s:else>
    少年
</s:else>
 
<s:set name="name" value="<%="'"+ request.getParameter("name")+"'" %>"/>
<%
  System.out.println(request.getParameter("name"));
 %>
<s:if test="#name=='zhaosoft'">
  zhaosoft here
</s:if>
<s:elseif test="#name=='zxl'">
  zxl here
</s:elseif>
<s:else>
  other is here
</s:else>
 
Iterator(迭代)
描述:用于遍历集合(java.util.Collection)或枚举值(java.util.iterator)
参数
名称	必需	默认	类型	描述
status	否	 	String	如果设置此参数,一个IteratorStatus的实例将会压入每一个遍历的堆栈
value	否	 	Object/String	要遍历的可枚举的(iteratable)数据源,或者将放入的新列表(List)的对想
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
I18n(国际化操作)
描述:
加载资源包到值堆栈。它可以允许text标志访问任何资源包的信息。而不只当前的action相关联的资源包。
名称	必需	默认	类型	描述
name	是	 	Object/String	资源包的类路径(如com.xxxx.resources.AppMsg)
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
Include
描述:包含一个servlet的输出(servlet或jsp的页面)
名称	必需	默认	类型	描述
value	时	 	String	要包含的jsp页面或servlet
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
 
param
描述:属性是可选的,如果提供,会调用Component的方法,addParameter(String,Object),如果不提供,则外层嵌套标签必须实现UnnamedParametric接口。
Value的提供有两种方式,通过value属性或者标签中间的text,不同之处:
<s:param name="name">zhaosoft</s:param>
参数会以String的格式放入statck
<s:param name="name" value="zhaosoft"/>
该值会以java.lang.Object的格式放入statck
名称	必需	默认	类型	描述
name	否	 	String	参数名
value	时	 	String	value表达式
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
set
描述:set标签赋予变量一个特定范围内的值。当希望给一个变量赋一个复杂的表达式,每次访问该变量而不是复杂的表达式时用到。其在两种情况下非常有用:复杂的表达式很耗时(性能提升)或者很难理解(代码的可读性提高)
参数:
名称	必需	默认	类型	描述
name	是	 	String	变量名字
scope	否	 	String	变量作用域,可以为application,session,request,page,action
value	否	 	Object/String	将会赋给变量的值
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
Text
描述:支持国际化信息的标签。国际化信息必须放在一个和当前action同名的resource bundle中,如果没有找到相应message,tag body将被当作默认的message,如果没有tag body,message的name会被作为默认message.
名称	必需	默认	类型	描述
name	是	 	String	资源属性的名字
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
url
描述:该标签用于创建url,可以通过”param”标签提供request参数。
当includeParams的值是all或get,param标签中定义的参数将有优先权,也就是说其会覆盖其他同名参数的值。
 
 
 
 
 
 
 
 
 
 
UI标志
 
单行文本框
Textfield标签输出一个HTML单行文本输入控件,等价于HTML代码<input type=”text”>
名称	必需	默认	类型	描述
maxlength	否	无	Integer	文本输入控件可以输入字符的最大长度
readonly	否	false	Boolean	当该属性为true时,不能输入
size	否	无	Integer	指定可视尺寸
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
例子:
<s:form action="register" method="post">
   <s:textfield name="username" label="用户名"></s:textfield>
</s:form>
 
 
 
文本框区
Textarea标签输出一个HTML多行文本输入控件,等价于HTML代码:<textarea />
名称	必需	默认	类型	描述
cols	否	无	Integer	列数
rows	否	无	Integer	行数
readonly	否	false	Boolean	当该属性为true时,不能输入
wrap	否	false	Boolean	指定多行文本输入控件是否应该换行
id	否	 	Object/String	用来标识元素的id。在ui和表单中为HTML的id属性
 
例子:
<s:textarea name="personal" cols="10" rows="5" label="个人简历"></s:textarea>
 
 
 
下拉列表
s:select 标签输出一个下拉列表框,相当于HTML代码中的<select/>
名称	必需	默认	类型	描述
list	是	无	Cellection Map Enumeration Iterator array	要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容
listKey	否	无	String	指定集合对象中的哪个属性作为选项的value
listValue	否	无	String	指定集合对象中的哪个属性作为选项的内容
headerKey	否	无	String	设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值
headerValue	否	无	String	显示在页面中header选项内容
emptyOption	否	false	Boolean	是否在header选项后面添加一个空选项
multiple	否	false	Boolean	是否多选
size	否	无	Integer	显示的选项个数
 
例子:
%@ page contentType="text/html;charset=GBK" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
 
<h3>使用name和list属性,list属性的值是一个列表</h3>
<s:form>
    <s:select label="最高学历" name="education" list="{'高中','大学','硕士','博士'}"/>
</s:form>
 
<h3>使用name和list属性,list属性的值是一个Map</h3>
<s:form>
    <s:select label="最高学历" name="education" list="#{1:'高中',2:'大学',3:'硕士',4:'博士'}"/>
</s:form>
 
<h3>使用headerKey和headerValue属性设置header选项</h3>
<s:form>
    <s:select label="最高学历" name="education" list="{'高中','大学','硕士','博士'}"
       headerKey="-1" headerValue="请选择您的学历"/>
</s:form>
 
 
<h3>使用emptyOption属性在header选项后添加一个空的选项</h3>
<s:form>
    <s:select label="最高学历" name="education" list="{'高中','大学','硕士','博士'}"
       headerKey="-1" headerValue="请选择您的学历"
       emptyOption="true"/>
</s:form>
 
 
<h3>使用multiple属性设置多选</h3>
<s:form>
    <s:select label="最高学历" name="education" list="{'高中','大学','硕士','博士'}"
       headerKey="-1" headerValue="请选择您的学历"
       emptyOption="true"
       multiple="true"/>
</s:form>
 
<h3>使用size属性设置下拉框可显示的选项个数</h3>
<s:form>
    <s:select label="最高学历" name="education" list="{'高中','大学','硕士','博士'}"
       headerKey="-1" headerValue="请选择您的学历"
       emptyOption="true"
       multiple="true" size="8"/>
</s:form>
 
 
<h3>使用listKey和listValue属性,利用Action实例的属性(property)来设置选项的值和选项的内容</h3>
<s:form>
    <s:select label="最高学历" name="education" list="educations"
       listKey="id" listValue="name"/>
</s:form
 
 
 
doubleselect标签
doubleselect标签输出关联的两个HTML列表框,产生联动效果。
名称	必需	默认	类型	描述
list	是	无	Cellection Map Enumeration Iterator array	要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容
listKey	否	无	String	指定集合对象中的哪个属性作为选项的value,该选项只对第一个列表框起作用
listValue	否	无	String	指定集合对象中的哪个属性作为选项的内容,该选项只对第一个列表框起作用
headerKey	否	无	String	设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值
headerValue	否	无	String	显示在页面中header选项内容
emptyOption	否	false	Boolean	 
multiple	否	false	Boolean	是否多选
size	否	无	Integer	显示的选项个数,该选项只对第一个列表框起作用
doubleId	否	无	String	指定第二个列表框的ID
doubleList	是	无	Cellection Map Enumeration Iterator array	要迭代的集合
doubleListKey	否	无	String	指定集合对象中的哪个属性作为选项的value,该选项只对第二个列表框起作用
doubleListValue	否	无	String	指定集合对象中的哪个属性作为选项的内容,该选项只对第二个列表框起作用
doubleSize	否	无	Integer	选项个数
doubleName	否	无	String	指定第二个列表框的name映射
doubleValue	否	无	Object	第二个列表框的初始选种项
 
实例:
<s:form name="test">
    <s:doubleselect label="请选择所在省市"
       name="province" list="{'四川省','山东省'}" doubleName="city"
       doubleList="top == '四川省' ? {'成都市', '绵阳市'} : {'济南市', '青岛市'}" />
</s:form>
 
<s:form action="doubleselectTag">
    <s:doubleselect
            label="请选择所在省市"
            name="province"
            list="provinces"
            listKey="id"
            listValue="name"
            doubleList="cities"
            doubleListKey="id"
            doubleListValue="name"
            doubleName="city"
            headerKey="-1"
            headerValue="---------- 请选择 ----------"
            emptyOption="true" />
</s:form>
 
复选框
名称	必需	默认	类型	描述
fieldValue	是	true	String	指定在复选框选中时,实际提交的值
 
复选框组,对应Action中的集合
名称	必需	默认	类型	描述
list	是	无	Cellection Map Enumeration Iterator array	要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容
listKey	否	无	String	指定集合对象中的哪个属性作为选项的value
listValue	否	无	String	指定集合对象中的哪个属性作为选项的内容
例子:checkboxlistTag.jsp
<%@ page contentType="text/html;charset=GBK" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:form>
    <s:checkboxlist name="interest" list="{'足球','篮球','排球','游泳'}" label="兴趣爱好"/>
</s:form>
 
单击复选框
 
文件选择组建
file标签输出一个HTML文件选择框。
名称	必需	默认	类型	描述
accept	否	input	String	HTML accept属性,指出接受文件的MIME类型
 
按钮
Submit标签输出一个按钮,submit标签和form标签使用可以提供异步表单提交功能。Submit标签可以输出以下三种类型的提交按钮:
Input: 等价于 HTML代码<input type=”submit”>
Image: 等价于 HTML代码 <input type="image">
Button:<button type="submit"></button>
名称	必需	默认	类型	描述
type	否	input	String	要使用的提交按钮的类型,有效值:input button image
src	否	无	String	为image类型的提交按钮设置图片地址。该属性对input和button类型的提交按钮无效
action	否	无	String	指定处理提交请求的action
method	否	无	String	指定处理提交请求的action的方法
实例
实例1.<s:submit type="image" method="login" src="images/login.jpg"></s:submit>
页面输出:
<input type="image" alt="Submit" src="images/login.jpg" id="user__login" name="method:login" value="Submit"/>
 
实例2.<s:submit type="button" action="selectTag" method="login" label="登陆"></s:submit>
页面输出:
<button type="submit" id="user_selectTag_login" name="action:selectTag!login" value="Submit">登陆</button>
 
Struts2预定义的前缀:
1。method   method:login
使用method前缀,来取代action默认的execute()方法的执行。
<s:form action="user">
   <s:textfield name="user.username" label="用户名"></s:textfield>
   <s:textfield name="user.password" label="密码"></s:textfield>
   <s:submit value="登陆" name="method:login"></s:submit>
   <s:submit value="注册" name="method:register"></s:submit>
</s:form>
 
注意:1。input类型的按钮,不能用label设置按钮上的文本,只能用value
2、action前缀
使用action前缀,取代form标签指定的action,导向到另一个action进行处理。
<s:form action="login">
   <s:textfield name="user.username" label="用户名"></s:textfield>
   <s:textfield name="user.password" label="密码"></s:textfield>
   <s:submit value="登陆"></s:submit>
   <s:submit value="注册" name="action:register"></s:submit>
</s:form>
 
2、redirect前缀
使用redirect前缀请求重定向到其他的url,甚至可以是web英语程序外部的url。
<s:form action="login">
   <s:textfield name="user.username" label="用户名"></s:textfield>
   <s:textfield name="user.password" label="密码"></s:textfield>
   <s:submit value="登陆"></s:submit>
   <s:submit value="搜索" name="redirect:www.google.com"></s:submit>
</s:form>
2、redirect-action前缀
使用redirect-action前缀请求重定向到其他的action.
<s:form action="login">
   <s:textfield name="user.username" label="用户名"></s:textfield>
   <s:textfield name="user.password" label="密码"></s:textfield>
   <s:submit value="登陆"></s:submit>
   <s:submit value="搜索" name="redirect-action:register"></s:submit>
</s:form>
reset标签
reset标签输出一个重置按钮
名称	必需	默认	类型	描述
type	否	input	String	要使用的重置按钮的内容,input、button
 
<s:reset value="重置"></s:reset>
<s:reset type="button" label="重置"></s:reset>
updownselect标签
updownselect标签创建一个带有上下移动的按钮的列表框,可以通过上下移动按钮来调整列表框的选项的位置。
 
名称	必需	默认	类型	描述
list	是	无	Cellection Map Enumeration Iterator array	要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容
listKey	否	无	String	指定集合对象中的哪个属性作为选项的value
listValue	否	无	String	指定集合对象中的哪个属性作为选项的内容
headerKey	否	无	String	设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值
headerValue	否	无	String	显示在页面中header选项内容
emptyOption	否	false	Boolean	是否在header选项后面添加一个空选项
multiple	否	false	Boolean	是否多选
size	否	无	Integer	显示的选项个数
moveUplabel	否	 	String	设置向上移动按钮上的文本
moveDownLabel	否	 	String	设置向下移动按钮上的文本
selectAllLabel	否	 	String	设置向全部选择按钮上的文本
allowMoveUp	否	无	Boolean	设置是否使用向上移动按钮
allowMoveDown	否	无	Boolean	设置是否使用向下移动按钮
allowSelectAll	否	无	Boolean	设置是否使用全部选择按钮
 
实例:
<s:form>
<!-- 使用简单集合来生成可上下移动选项的下拉选择框 -->
<s:updownselect name="a" label="请选择您喜欢的图书" labelposition="top"
    moveUpLabel="向上移动"
    list="{'Spring2.0宝典' , '轻量级J2EE企业应用实战' , 'JavaScript: The Definitive Guide'}"/>
   
   
<!-- 使用简单Map对象来生成可上下移动选项的下拉选择框
     且使用emptyOption="true"增加一个空选项-->
<s:updownselect name="b" label="请选择您想选择出版日期" labelposition="top"
    moveDownLabel="向下移动"
    list="#{'Spring2.0宝典':'2006年10月' , '轻量级J2EE企业应用实战':'2007月4月' , '基于J2EE的Ajax宝典':'2007年6月'}"
    listKey="key"
    emptyOption="true"
    listValue="value"/>
   
<s:bean name="com.zhaosoft.ui.formtag.BookService" id="bs"/>
<!-- 使用集合里放多个JavaBean实例来可上下移动选项的生成下拉选择框 -->
<s:updownselect name="c" label="请选择您喜欢的图书的作者" labelposition="top"
    selectAllLabel="全部选择" multiple="true"
    list="#bs.books"
    listKey="author"
    listValue="name"/>
</s:form>
 
package com.zhaosoft.ui.formtag;
public class BookService
{
    public Book[] getBooks()
    {
       return new Book[]
       {
           new Book("Spring2.0宝典","zhaosoft"),
           new Book("轻量级J2EE企业应用实战","zhaosoft"),
           new Book("基于J2EE的Ajax宝典","zhaosoft")
       };
    }
}
 
 
 
optiontransferselect标签
optiontransferselect标签创建一个选项转移列表组建,它由两个<select>标签以及它们之间的用于将选项在两个<select>之间相互移动的按钮组成。表单提交时,将提交两个列表框中选中的选项。
名称	必需	默认	类型	描述
list	是	无	Cellection Map Enumeration Iterator array	要迭代的集合,使用集合中的元素来设置各个选项,如果list的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容,该选项只对第一个列表框起作用
listKey	否	无	String	指定集合对象中的哪个属性作为选项的value,该选项只对第一个列表框起作用
listValue	否	无	String	指定集合对象中的哪个属性作为选项的内容,该选项只对第一个列表框起作用
headerKey	否	无	String	设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值
headerValue	否	无	String	显示在页面中header选项内容
multiple	否	false	Boolean	是否多选
size	否	无	Integer	显示的选项个数,该选项只对第一个列表框起作用
doubleId	否	无	String	指定第二个列表框的ID
doubleList	是	无	Cellection Map Enumeration Iterator array	要迭代的集合,使用集合中的元素来设置各个选项,如果doubleList的属性为Map则Map的key成为选项的value,Map的value会成为选项的内容,该选项只对第二个列表框起作用
doubleListKey	否	无	String	指定集合对象中的哪个属性作为选项的value,该选项只对第二个列表框起作用
doubleListValue	否	无	String	指定集合对象中的哪个属性作为选项的内容,该选项只对第二个列表框起作用
doubleHeaderKey	否	无	String	设置当用户选择了header选项时,提交的的value,如果使用该属性,不能为该属性设置空值
doubleHeaderVale	否	无	String	显示在页面中header选项内容
doubleEmptyOption	否	无	String	是否在第二列表框的header后面添加一个空选项
doubleMultiple	否	true	Boolean	是否多选
doubleSize	否	无	Integer	选项个数
doubleName	否	无	String	指定第二个列表框的name映射
doubleValue	否	无	Object	第二个列表框的初始选种项
leftTitle	否	无	String	左边列表框的标题
rightTitle	否	<-	String	右边列表框的标题
addToLeftLable	否	 	String	 
addToRightLable	 	 	 	 
addAllToLeftLable	 	 	 	 
addAllToRightLable	 	 	 	 
leftUpLabel	 	 	 	 
leftDownLabel	 	 	 	 
rightUpLabel	 	 	 	 
rightDownLabel	 	 	 	 
allowAddToLeft	 	 	 	 
allowAddToright	 	 	 	 
allowAddAllToLeft	 	 	 	 
allowAddAllToRight	 	 	 	 
allowSelectAll	否	无	Boolean	设置是否使用全部选择按钮
allowUpdownOnLeft	 	 	 	 
allowUpDownOnRight	 	 	 	 
 
例子:
<s:head/>
<s:form>
    <s:optiontransferselect
    label="最喜爱的图书"
        name="javaBook"
        list="{'《Java Web开发详解》', '《Struts 2深入详解》', '《Java快速入门》'}"
        doubleName="cBook"
        doubleList="{'《VC++深入详解》', '《C++ Primer》', '《C++程序设计语言》'}"/>
</s:form>
---------------------------
<s:form>
    <s:optiontransferselect
    label="最喜爱的图书"
        name="book1"
        leftTitle="Java图书"
        rightTitle="C/C++图书"
        list="{'《Java Web开发详解》', '《Struts 2深入详解》', '《Java快速入门》'}"
        headerKey="-1"
        headerValue="--- 请选择 ---"
        emptyOption="true"
        doubleName="book2"
        doubleList="{'《VC++深入详解》', '《C++ Primer》', '《C++程序设计语言》'}"
        doubleHeaderKey="-1"
        doubleHeaderValue="--- 请选择 ---"
        doubleEmptyOption="true"
        addToLeftLabel="向左移动"
        addToRightLabel="向右移动"
        addAllToLeftLabel="全部左移"
        addAllToRightLabel="全部右移"
        selectAllLabel="全部选择"
        leftUpLabel="向上移动"
        leftDownLabel="向下移动"
        rightUpLabel="向上移动"
        rightDownLabel="向下移动"/>
</s:form>
Global site tag (gtag.js) - Google Analytics