- 浏览: 1107 次
- 性别:
- 来自: 江苏连云港
最近访客 更多访客>>
最新评论
-
flywing521:
在这个世界上,没有不劳而获的东西,有之也是没有价值的!所以,想 ...
快速学好英语 -
hzw2312:
这是一件非常之痛苦的事情!
快速学好英语
收藏列表
- 全部 [41]
- 默认 [3]
- jquery [3]
- java [12]
- mysql [1]
- js [7]
- css [1]
- cookie [3]
- oracl [1]
- windows 常见问题 [3]
- 编程人 [5]
- ssh 之 hibernate [1]
- 常用知识累计 [1]
标题 | 标签 | 来源 | |
java保留两位小数4种方法 | java | ||
4种方法,都是四舍五入,例: import java.math.BigDecimal; import java.text.DecimalFormat; import java.text.NumberFormat; public class format { double f = 111231.5585; public void m1() { BigDecimal bg = new BigDecimal(f); double f1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); System.out.println(f1); } /** * DecimalFormat转换最简便 */ public void m2() { DecimalFormat df = new DecimalFormat("#.00"); System.out.println(df.format(f)); } /** * String.format打印最简便 */ public void m3() { System.out.println(String.format("%.2f", f)); } public void m4() { NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(2); System.out.println(nf.format(f)); } public static void main(String[] args) { format f = new format(); f.m1(); f.m2(); f.m3(); f.m4(); } } 结果: 111231.56 111231.56 111231.56 111,231.56 |
|||
apache james发送邮件的配置 | java | ||
以前从来没有碰过邮件服务器配置。 由于好多邮件服务器(163,sina,yahoo)都对邮件发送有限制,比如163的邮箱,新注册的用户是不可以利用客户端程序访问邮箱,所以很郁闷,好多学生都不知道是怎么回事,开始的时候我也不知道,在网上找了n久才知道这鸟情况。无语,学生的prj课要用到发邮件那怎么办啊学校机房又没联网,所以就想自己弄一个邮件服务器,让学生们玩玩。 哎,搞了好久终于把apache james邮件服务器配置完成(并且通过测试)。高兴中。。。,终于可以让学生用自己配置的邮件服务器了。其实整个配置过程是很简单的,但由于客户端程序的设置失误弄得我郁闷了好几个小时。而且昨天晚上电脑又不争气,老是自动关机。搞得我无语只好回家睡觉,但晚上睡到半夜都醒来了,都这鸟问题害的。我这个人就是这样的,如果一个问题没解决,半夜都会醒来想想的,哎,这毛病真不好。不说多了,反正是在高兴中。。。现在还是来说说配置: 1: 服务器端配置 一:先是到apache的网站上面下载一个james-binary-2.3.1.zip的包。 二:解压后找到里面的bin目录,运行里面的run.bat(前提是java的环境变量要配置好了。JAVA_HOME的配置方式)这里就不讲java环境变量的配置了。 三:运行完后,会在apps中多出一个james的目录。打开到里面找到SAR-INF文件夹里面的config.xml配置文件--打开 四:现在我们就开始修改config文件的内容了。找到<postmaster>Postmaster@localhost</postmaster>我们把localhost改为:liuxiang.com(名字自己取) 五:<servername>localhost</servername>把localhost改为同上。( 这里主要是用于 帐号@liuxiang.com) 六:<servernames autodetect="true" autodetectIP="true">把两个true都该为false不让邮件服务器自动侦测ip 七:注释掉 <mailet match="RemoteAddrNotInNetwork=127.0.0.1" class="ToProcessor"> <processor> relay-denied </processor> <notice>550 - Requested action not taken: relaying denied</notice> </mailet> 八:去掉<authRequired>true</authRequired>的注释,用邮件服务器发送邮件必需验证。 九:启动服务器。再打开cmd窗口通过telnet localhost 4555 登录到邮件服务器。用户名root密码一样 十:添加账户:adduser liuxiang 1234(输入help 就会把邮件服务器的所有命令显示给我们看) 2:客户端配置 根据刚刚我们服务器的配置,我们再来用foxmail的配置: 电子邮件地址:liuxiang@liuxiang.com 密码:1234 注意pop3服务器只能是自己的ip。(在cmd窗口输入ipconfig就可以看到我们自己的ip) smtp服务器同上,自己的ip。 这样就配置成功了。 用java程序写smtp客户端。properties的设置如下: Properties props = new Properties(); // 传输用的协议smtp props.put("mail.transport.protocol", "smtp"); // 利用那个邮件服务发送 props.put("mail.smtp.host", "192.168.0.34");自己的ip // 发送的端口号 props.put("mail.smtp.port", "25"); // 是否要验证 props.put("mail.smtp.auth", "true"); 收邮件更加容易: Session session = Session.getInstance(p, null); Store store = null; store = session.getStore("pop3"); store.connect("192.168.0.34", "liuxiang","1234"); 通过这样我们可以对内网发送,也可以对外网发送,比如163。我测试通过。完。太容易了。 主要注意点就是pop3和smtp服务器的地址。 |
|||
找回显示桌面的快捷方式 | windows 常见问题 | ||
刚才一不小心手抖 把任务栏上的“显示桌面”给误删了 这小东西虽然不起眼 但有时候还是挺有用的 估计有时候手抖的同学不只我一个 于是上网找到了以下方法 估摸着偶尔能帮助到一些同学~~ 方法一: 如果实在懒得往下看了,可以记住“win+d”快捷键,实现快速切换到桌面。(win键位于Ctrl与Alt之间) 方法二:(我就是用的这个方法) 也可以点击“开始→运行”,在弹出的“运行”对话框中输入“REGSVR32 /n /i:u shell32 ”(不含双引号。注:32后面有个空格),然后回车,片刻后会弹出“shell32中的DllInstall成功”提示对话框,这样“显示桌面”按钮就可以完美归来了。 方法三: 可以自己做一个。 打开记事本,输入以下内容: [Shell] Command=2 IconFile=explorer.exe,3 [Taskbar] Command=ToggleDesktop 其中,第三行代码代表的是图标的位置,数字“3”显示的是,而当把数字“3”换成“4”,刷新,图标会变成;当数字换成“6”时,图标变成了回收站的图标。虽然图标的式样变了,但是同样是“显示桌面”的功能。因此,更改显示桌面图标的方法就是这样。其实,只要在“IconFile=”后输入你所中意的图标的路径就可以了。 然后点“文件”——>“另存为”,在文件类型中选择"所有文件",在文件名中打上“显示桌面.scf”(不包括双引号)就成了。 接下来,用鼠标把保存好的文件拖到快速启动栏里就OK了。为了以后便于使用,还可以将该图标保存到以下路径:C:\Documents and Settings\Administrator\Application Data\Microsoft\Internet Explorer\Quick Launch。至此,“显示桌面”图标的新建工作,搞定! 方法四: 如果觉得这个麻烦,还有一个简单的方法,从另一台电脑上复制“显示桌面”快捷方式。首先到另一台电脑上找到这个快捷方式,按住ctrl 把这个图标拖到电脑桌面上,然后把这个“显示桌面”复制到存储盘或者联网传给需要的电脑,传到后再用鼠标拖动到快速启动栏即可。 方法五: 或者运行“regedit”打开注册表,找到下面键值:HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System,在右边的窗口中有一个DOWRD值:“NoDispCPL”,将其值设为“0”或者删除即可。 在完成此操作后,有些电脑可能需要重启后才能生效 |
|||
Javascript键盘事件的keyChar | js | http://jamesfancy.blog.51cto.com/2516291/667869 | |
Javascript的键盘事件keydown, keyup的event对象中(注意keypress的event对象的keyCode已经转过码了),keyCode != keyChar,网上有很多人提供了keyCode到keyChar的对照表。于是,根据对照表,产生了如下工具函数,只需要把event对象作为参数传进去,就能够得到keyChar了,如果keyCode没有对应的字符,那返回的就是'\0'。 window.keyChar = (function () { var ssss = ""; var SSSS = ""; // M和m只是标尺, ssss和SSSS变量长度是为了对齐标尺 var M = "0 1 2 3 4 "; var m = "01234567890123456789012345678901234567890123456789"; // 不带shift的码表 ssss += " 01"; ssss += "23456789 abcdefghijklmnopqrstuvwxyz 0123"; ssss += "456789*+ -./ "; ssss += " ;=,-./` "; ssss += " [ ]' "; // 带shift的码表 SSSS += " )!"; SSSS += "@#$%^&*( ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123"; SSSS += "456789*+ -./ "; SSSS += " :+<_>?~ "; SSSS += " {|} "; // 将码表拆成字符数组 var t = ssss.split(""); var T = SSSS.split(""); // 将所有空格替换成空字符 var nullChar = String.fromCharCode(0); for (var i = 0; i < t.length; i++) { (t[i] === " ") && (t[i] = nullChar); (T[i] === " ") && (T[i] = nullChar); } // 几个需要转义的字符,放在表里会影响排版,所以单独处理 t[9] = "\t"; t[13] = "\n"; t[32] = " "; t[220] = "\\"; T[32] = " "; T[222] = '"'; return function (event, isCheckShift) { if (typeof isCheckShift === "undefined") { isCheckShift = true; } if (!!isCheckShift && event.shiftKey) { return T[event.keyCode]; } else { return t[event.keyCode]; } }; })(); |
|||
Javascript判断是否功能键 | js | http://jamesfancy.blog.51cto.com/2516291/667878 | |
window.isCtrlKey = function (keyCode) { // 8 - 退格 // 9 - Tab // 13 - 回车 // 16~18 - Shift, Ctrl, Alt // 37~40 - 左上右下 // 35~36 - End Home // 46 - Del // 112~123 - F1-F12 switch (keyCode) { case 8: case 9: case 13: case 16: case 17: case 18: case 37: case 38: case 39: case 40: case 35: case 36: case 46: return true; default: if (keyCode >= 112 && keyCode <= 123) { return true; } return false; } } |
|||
导入/导出 Excel 的基本方法 JAVA EXCEL API简介 | java | http://hi.baidu.com/lewutian/blog/item/d8166af239d15418b17ec546.html | |
JAVA EXCEL API简介 使用Windows操作系统的朋友对Excel(电子表格)一定不会陌生,但是要使用Java语言来操纵Excel文件并不是一件容易的事。在Web应用 日益盛行的今天,通过Web来操作Excel文件的需求越来越强烈,目前较为流行的操作是在JSP或Servlet 中创建一个CSV (comma separated values)文件,并将这个文件以MIME,text/csv类型返回给浏览器,接着浏览器调用Excel并且显示CSV文件。这样只是说可以访问到 Excel文件,但是还不能真正的操纵Excel文件,本文将给大家一个惊喜,向大家介绍一个开放源码项目,Java Excel API,使用它大家就可以方便地操纵Excel文件了。 JAVA EXCEL API简介 Java Excel是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该 API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为是使用Java编写的,所以我们在Web应用中可以通过JSP、 Servlet来调用API实现对Excel数据表的访问。 现在发布的稳定版本是V2.0,提供以下功能: 从Excel 95、97、2000等格式的文件中读取数据; 读取Excel公式(可以读取Excel 97以后的公式); 生成Excel数据表(格式为Excel 97); 支持字体、数字、日期的格式化; 支持单元格的阴影操作,以及颜色操作; 修改已经存在的数据表; 现在还不支持以下功能,但不久就会提供了: 不能够读取图表信息; 可以读,但是不能生成公式,任何类型公式最后的计算值都可以读出;********************* 继续转载 ********************* 应用示例 1 从Excel文件读取数据表 Java Excel API既可以从本地文件系统的一个文件(.xls),也可以从输入流中读取Excel数据表。读取Excel数据表的第一步是创建Workbook(术 语:工作薄),下面的代码片段举例说明了应该如何操作:(完整代码见ExcelReading.java) import java.io.*; import jxl.*; … … … … try { //构建Workbook对象, 只读Workbook对象 //直接从本地文件创建Workbook //从输入流创建Workbook InputStream is = new FileInputStream(sourcefile); jxl.Workbook rwb = Workbook.getWorkbook(is); } catch (Exception e) { e.printStackTrace(); } 一旦创建了Workbook,我们就可以通过它来访问Excel Sheet(术语:工作表)。参考下面的代码片段: //获取第一张Sheet表 Sheet rs = rwb.getSheet(0); 我们既可能通过Sheet的名称来访问它,也可以通过下标来访问它。如果通过下标来访问的话,要注意的一点是下标从0开始,就像数组一样。 一旦得到了Sheet,我们就可以通过它来访问Excel Cell(术语:单元格)。参考下面的代码片段: //获取第一行,第一列的值 Cell c00 = rs.getCell(0, 0); String strc00 = c00.getContents(); //获取第一行,第二列的值 Cell c10 = rs.getCell(1, 0); String strc10 = c10.getContents(); //获取第二行,第二列的值 Cell c11 = rs.getCell(1, 1); String strc11 = c11.getContents(); System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType()); System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType()); System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType()); 如 果仅仅是取得Cell的值,我们可以方便地通过getContents()方法,它可以将任何类型的Cell值都作为一个字符串返回。示例代码中Cell (0, 0)是文本型,Cell(1, 0)是数字型,Cell(1,1)是日期型,通过getContents(),三种类型的返回值都是字符型。 如果有需要知道Cell内容的确切类型,API也提供了一系列的方法。参考下面的代码片段: String strc00 = null; double strc10 = 0.00; Date strc11 = null; Cell c00 = rs.getCell(0, 0); Cell c10 = rs.getCell(1, 0); Cell c11 = rs.getCell(1, 1); if(c00.getType() == CellType.LABEL) { LabelCell labelc00 = (LabelCell)c00; strc00 = labelc00.getString(); } if(c10.getType() == CellType.NUMBER) { NmberCell numc10 = (NumberCell)c10; strc10 = numc10.getValue(); } if(c11.getType() == CellType.DATE) { DateCell datec11 = (DateCell)c11; strc11 = datec11.getDate(); } System.out.println("Cell(0, 0)" + " value : " + strc00 + "; type : " + c00.getType()); System.out.println("Cell(1, 0)" + " value : " + strc10 + "; type : " + c10.getType()); System.out.println("Cell(1, 1)" + " value : " + strc11 + "; type : " + c11.getType()); 在 得到Cell对象后,通过getType()方法可以获得该单元格的类型,然后与API提供的基本类型相匹配,强制转换成相应的类型,最后调用相应的取值 方法getXXX(),就可以得到确定类型的值。API提供了以下基本类型,与Excel的数据格式相对应,如下图所示: 每种类型的具体意义,请参见Java Excel API Document。 当你完成对Excel电子表格数据的处理后,一定要使用close()方法来关闭先前创建的对象,以释放读取数据表的过程中所占用的内存空间,在读取大量数据时显得尤为重要。参考如下代码片段: //操作完成时,关闭对象,释放占用的内存空间 rwb.close(); Java Excel API提供了许多访问Excel数据表的方法,在这里我只简要地介绍几个常用的方法,其它的方法请参考附录中的Java Excel API Document。Jakata Poi HSSF /*=================== 导入/导出 Excel 的基本方法 ===================*/ 从Excel文件中,导入数据到SQL数据库中,很简单,直接用下面的语句: /*===================================================================*/ --如果接受数据导入的表已经存在 insert into 表 select * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$) --如果导入数据并生成表 select * into 表 from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$) /*===================================================================*/ --如果从SQL数据库中,导出数据到Excel,如果Excel文件已经存在,而且已经按照要接收的数据创建好表头,就可以简单的用: insert into OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DATABASE=c:test.xls',sheet1$) select * from 表 --如果Excel文件不存在,也可以用BCP来导成类Excel的文件,注意大小写: --导出表的情况 EXEC master..xp_cmdshell 'bcp 数据库名.dbo.表名 out "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"' --导出查询的情况 EXEC master..xp_cmdshell 'bcp "SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname" queryout "c:test.xls" /c -/S"服务器名" /U"用户名" -P"密码"' /*--说明: c:test.xls 为导入/导出的Excel文件名. sheet1$ 为Excel文件的工作表名,一般要加上$才能正常使用. --*/ --上面已经说过,用BCP导出的是类Excel文件,其实质为文本文件, --要导出真正的Excel文件.就用下面的方法 /*--数据导出EXCEL 导出表中的数据到Excel,包含字段名,文件为真正的Excel文件 ,如果文件不存在,将自动创建文件 ,如果表不存在,将自动创建表 基于通用性考虑,仅支持导出标准数据类型 --邹建 2003.10--*/ /*--调用示例 p_exporttb @tbname='地区资料',@path='c:',@fname='aa.xls' --*/ if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[p_exporttb] GO create proc p_exporttb @tbname sysname, --要导出的表名 @path nvarchar(1000), --文件存放目录 @fname nvarchar(250)='' --文件名,默认为表名 as declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000) --参数检测 if isnull(@fname,'')='' set @fname=@tbname+'.xls' --检查文件是否已经存在 if right(@path,1)<>'' set @path=@path+'' create table #tb(a bit,b bit,c bit) set @sql=@path+@fname insert into #tb exec master..xp_fileexist @sql --数据库创建语句 set @sql=@path+@fname if exists(select 1 from #tb where a=1) set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE' +';CREATE_DB=" +';DATABASE='+@sql+'"' --连接数据库 exec @err=sp_oacreate 'adodb.connection',@obj out if @err<>0 goto lberr exec @err=sp_oamethod @obj,'open',null,@constr if @err<>0 goto lberr /*--如果覆盖已经存在的表,就加上下面的语句 --创建之前先删除表/如果存在的话 select @sql='drop table ['+@tbname+']' exec @err=sp_oamethod @obj,'execute',@out out,@sql --*/ --创建表的SQL select @sql='',@fdlist='' select @fdlist=@fdlist+',['+a.name+']' ,@sql=@sql+',['+a.name+'] ' +case when b.name in('char','nchar','varchar','nvarchar') then 'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')' when b.name in('tynyint','int','bigint','tinyint') then 'int' when b.name in('smalldatetime','datetime') then 'datetime' when b.name in('money','smallmoney') then 'money' else b.name end FROM syscolumns a left join systypes b on a.xtype=b.xusertype where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp') and object_id(@tbname)=id select @sql='create table ['+@tbname +']('+substring(@sql,2,8000)+')' ,@fdlist=substring(@fdlist,2,8000) exec @err=sp_oamethod @obj,'execute',@out out,@sql if @err<>0 goto lberr exec @err=sp_oadestroy @obj --导入数据 set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES ;DATABASE='+@path+@fname+''',['+@tbname+'$])' exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from '+@tbname) return lberr: exec sp_oageterrorinfo 0,@src out,@desc out lbexit: select cast(@err as varbinary(4)) as 错误号 ,@src as 错误源,@desc as 错误描述 select @sql,@constr,@fdlist go --上面是导表的,下面是导查询语句的. /*--数据导出EXCEL 导出查询中的数据到Excel,包含字段名,文件为真正的Excel文件 ,如果文件不存在,将自动创建文件 ,如果表不存在,将自动创建表 基于通用性考虑,仅支持导出标准数据类型 --邹建 2003.10--*/ /*--调用示例 p_exporttb @sqlstr='select * from 地区资料' ,@path='c:',@fname='aa.xls',@sheetname='地区资料' --*/ if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_exporttb]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[p_exporttb] GO create proc p_exporttb @sqlstr varchar(8000), --查询语句,如果查询语句中使用了order by ,请加上top 100 percent @path nvarchar(1000), --文件存放目录 @fname nvarchar(250), --文件名 @sheetname varchar(250)='' --要创建的工作表名,默认为文件名 as declare @err int,@src nvarchar(255),@desc nvarchar(255),@out int declare @obj int,@constr nvarchar(1000),@sql varchar(8000),@fdlist varchar(8000) --参数检测 if isnull(@fname,'')='' set @fname='temp.xls' if isnull(@sheetname,'')='' set @sheetname=replace(@fname,'.','#') --检查文件是否已经存在 if right(@path,1)<>'' set @path=@path+'' create table #tb(a bit,b bit,c bit) set @sql=@path+@fname insert into #tb exec master..xp_fileexist @sql --数据库创建语句 set @sql=@path+@fname if exists(select 1 from #tb where a=1) set @constr='DRIVER={Microsoft Excel Driver (*.xls)};DSN='''';READONLY=FALSE' +';CREATE_DB=" +';DATABASE='+@sql+'"' --连接数据库 exec @err=sp_oacreate 'adodb.connection',@obj out if @err<>0 goto lberr exec @err=sp_oamethod @obj,'open',null,@constr if @err<>0 goto lberr --创建表的SQL declare @tbname sysname set @tbname='##tmp_'+convert(varchar(38),newid()) set @sql='select * into ['+@tbname+'] from('+@sqlstr+') a' exec(@sql) select @sql='',@fdlist='' select @fdlist=@fdlist+',['+a.name+']' ,@sql=@sql+',['+a.name+'] ' +case when b.name in('char','nchar','varchar','nvarchar') then 'text('+cast(case when a.length>255 then 255 else a.length end as varchar)+')' when b.name in('tynyint','int','bigint','tinyint') then 'int' when b.name in('smalldatetime','datetime') then 'datetime' when b.name in('money','smallmoney') then 'money' else b.name end FROM tempdb..syscolumns a left join tempdb..systypes b on a.xtype=b.xusertype where b.name not in('image','text','uniqueidentifier','sql_variant','ntext','varbinary','binary','timestamp') and a.id=(select id from tempdb..sysobjects where name=@tbname) select @sql='create table ['+@sheetname +']('+substring(@sql,2,8000)+')' ,@fdlist=substring(@fdlist,2,8000) exec @err=sp_oamethod @obj,'execute',@out out,@sql if @err<>0 goto lberr exec @err=sp_oadestroy @obj --导入数据 set @sql='openrowset(''MICROSOFT.JET.OLEDB.4.0'',''Excel 5.0;HDR=YES ;DATABASE='+@path+@fname+''',['+@sheetname+'$])' exec('insert into '+@sql+'('+@fdlist+') select '+@fdlist+' from ['+@tbname+']') set @sql='drop table ['+@tbname+']' exec(@sql) return lberr: exec sp_oageterrorinfo 0,@src out,@desc out lbexit: select cast(@err as varbinary(4)) as 错误号 ,@src as 错误源,@desc as 错误描述 select @sql,@constr,@fdlist go |
|||
Java实现导入Excel 小实例 | java | http://hi.baidu.com/lipan4/blog/item/a4f75c02d60220f808fa93af.html | |
要求做一个从网页上导入excel,,开始着手去实现它。 思路很简单: 1、做一个jsp页面,页面包括浏览文件,提交文件 2、将excel文件上传到服务器 3、 服务器对该excel文件进行读出 4、 将excel文件内容显示到页面上 环境搭建: 需要准备的包:commons-fileupload-1.2.1.jar & commons-io-1.3.2.jar 这两个包是上传用的 jxl.jar 这个包是读取excel用的 下载地址 :http://sourceforge.net/projects/jexcelapi/ 建议不要用新版本,因为新版本会出现与jdk版本兼容问题,如果运行程序出现问题的时候请切换旧版本。 一、Jsp页面 注意:1、在jsp页面的form要使用html本身的<form>标记,而不要使用第三方视图开源框架的form标记,例如不要使用strut的<htm:form>。 2、在<form>的属性里必须加上 ENCTYPE="multipart/form-data" 1<h1>导入Excel</h1> 2<hr> 3<form action="importExcel" method="post" enctype="multipart/form-data"> 4<input type="file" name="importExcel" id="importExcel"> 5<input type="submit" value="导入"> 6</form> 二、上传excel的Servlet 注意:1、导入的excel最好用后缀为.xls,如果用.xlsx可能会导不进去。 2、在调用FileItem的write方法前必须保证文件的存放路径存在否则出现异常。commons fileupload不会自动为你建立不存在的目录。 3、上传后会对文件进行重命名,以时间为文件名进行命名 1publicclass ImportExcelServlet extends HttpServlet { 2//缓冲区域 3 File tempPathFile; 4//默认路径 5 String uploadTo ="D:\\"; 6// 支持的文件类型 7 String[] errorType = { ".xls" }; 8//格式化日期 9 SimpleDateFormat format =new SimpleDateFormat("yyyyMMddHHmmssSSS"); 10 11 @Override 12protectedvoid doGet(HttpServletRequest req, HttpServletResponse resp) 13throws ServletException, IOException { 14 req.setCharacterEncoding("utf-8"); 15 resp.setCharacterEncoding("utf-8"); 16 //取得服务器真实路径 17 uploadTo = req.getSession().getServletContext().getRealPath("\\") +"upload\\"; 18// Create a factory for disk-based file items 19 DiskFileItemFactory factory =new DiskFileItemFactory(); 20// 设置缓冲区大小,这里是4kb 21 factory.setSizeThreshold(4096); 22// 设置缓冲区目录 23 factory.setRepository(tempPathFile); 24// Create a new file upload handler 25 ServletFileUpload upload =new ServletFileUpload(factory); 26// Set overall request size constraint 27// 设置最大文件尺寸,这里是4MB 28 upload.setSizeMax(4*1024*1024); 29// 开始读取上传信息 30 List fileItems =new ArrayList(); 31try { 32 fileItems = upload.parseRequest(req); 33 } catch (FileUploadException e1) { 34 e1.printStackTrace(); 35 } 36// 依次处理每个上传的文件 37 Iterator iter = fileItems.iterator(); 38 System.out.println("fileItems的大小是"+ fileItems.size()); 39// 正则匹配,过滤路径取文件名 40 String regExp =".+\\\\(.+)$"; 41 Pattern p = Pattern.compile(regExp); 42while (iter.hasNext()) { 43 FileItem item = (FileItem) iter.next(); 44// 忽略其他不是文件域的所有表单信息 45 System.out.println("正在处理"+ item.getFieldName()); 46if (!item.isFormField()) { 47 String name = item.getName(); 48long size = item.getSize(); 49if ((name ==null|| name.equals("")) && size ==0) 50continue; 51 Matcher m = p.matcher(name); 52boolean result = m.find(); 53if (result) { 54boolean flag =false; 55for (int temp =0; temp < errorType.length; temp++) { 56if(m.group(1).endsWith(errorType[temp])) { 57 flag =true; 58 } 59 } 60if(!flag) { 61 System.out.println("上传了不支持的文件类型"); 62thrownew IOException(name +": wrong type"); 63 } 64try { 65 String fileName = uploadTo + format.format(new Date()) + m.group(1).substring(m.group(1).indexOf(".")); 66 item.write(new File(fileName)); 67//调用ReadExcel类进行读出excel 68 ReadExcel.readExcel(fileName, resp.getWriter()); 69 System.out.println(name +"\t\t"+ size); 70 } catch (Exception e) { 71 e.printStackTrace(); 72 } 73 } 74 } else { 75// 这里添加对不是上传文件表单项的处理 76 System.out.println("这是一个表单项"); 77 } 78 } 79 80 } 81 82 @Override 83protectedvoid doPost(HttpServletRequest req, HttpServletResponse resp) 84throws ServletException, IOException { 85 doGet(req, resp); 86 } 87 88 @Override 89publicvoid init() throws ServletException { 90 tempPathFile =new File("d:\\temp\\buffer\\"); 91if (!tempPathFile.exists()) { 92 tempPathFile.mkdirs(); 93 } 94 } 95} 96 三、读出excel文件内容的类 1publicclass ReadExcel { 2 3publicstaticvoid readExcel(String pathname, PrintWriter out) { 4try { 5//打开文件 6 Workbook book = Workbook.getWorkbook(new File(pathname)) ; 7//取得第一个sheet 8 Sheet sheet = book.getSheet(0); 9//取得行数 10int rows = sheet.getRows(); 11for(int i =0; i < rows; i++) { 12 Cell [] cell = sheet.getRow(i); 13for(int j=0; j<cell.length; j++) { 14//getCell(列,行) 15 out.print(sheet.getCell(j, i).getContents()); 16 out.print(" "); 17 } 18 out.println("<br/>"); 19 } 20//关闭文件 21 book.close(); 22 } catch (BiffException e) { 23 e.printStackTrace(); 24 } catch (IOException e) { 25 e.printStackTrace(); 26 } 27 } 28 29} 30 总结:上面只是一个很简单的导入excel文件的例子,如果想做完善还得下更多的功夫。在做的过程中如果出现Workbook打不开,请更换jxl版本,尽量用低版本,这样与jdk兼容会好点,我在做这个导入excel的时候,就遇到了版本兼容问题,处理了半天才发现问题所在。所以想做这个例子给大家参考,以后不要犯和我同样的错误。O(∩_∩)O哈哈~ |
|||
JS导入导出Excel | js | http://hi.baidu.com/kimdim/blog/item/89ef5831de31be91a9018e92.html | |
xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Untitled Page</title> </head> <script language="javascript" type="text/javascript"> function importXLS(fileName) { objCon = new ActiveXObject("ADODB.Connection"); objCon.Provider = "Microsoft.Jet.OLEDB.4.0"; objCon.ConnectionString = "Data Source=" + fileName + ";Extended Properties=Excel 8.0;"; objCon.CursorLocation = 1; objCon.Open; var strQuery; //Get the SheetName var strSheetName = "Sheet1$"; var rsTemp = new ActiveXObject("ADODB.Recordset"); rsTemp = objCon.OpenSchema(20); if(!rsTemp.EOF) strSheetName = rsTemp.Fields("Table_Name").Value; rsTemp = null rsExcel = new ActiveXObject("ADODB.Recordset"); strQuery = "SELECT * FROM [" + strSheetName + "]"; rsExcel.ActiveConnection = objCon; rsExcel.Open(strQuery); var totalArray = new Array(); var singleArray = new Array(); while (!rsExcel.EOF) { j = 0; for (i = 0; i < rsExcel.Fields.Count; ++i) { singleArray[i]=rsExcel.Fields(i).value; alert(rsExcel.Fields(i).value); } totalArray[j]=singleArray; singleArray.remove(); rsExcel.MoveNext; j++; alert(j); } // Close the connection and dispose the file objCon.Close; objCon =null; rsExcel = null; } </script> </head> <body> <input type="file" id="f" /> <input type="button" id="b" value="import" onclick="if(f.value=='')alert('请选择xls文件');else importXLS(f.value)" /> </body> </html>trackback:http://hi.baidu.com/netcorner/blog/item/4c35a818788f670635fa41d3.html通过Javascript操作Excel function AutomateExcel() { // Start Excel and get Application object. var oXL = new ActiveXObject("Excel.Application"); oXL.Visible = true; // Get a new workbook. var oWB = oXL.Workbooks.Add(); var oSheet = oWB.ActiveSheet; // Add table headers going cell by cell. oSheet.Cells(1, 1).Value = "First Name"; oSheet.Cells(1, 2).Value = "Last Name"; oSheet.Cells(1, 3).Value = "Full Name"; oSheet.Cells(1, 4).Value = "Salary"; // Format A1:D1 as bold, vertical alignment = center. oSheet.Range("A1", "D1").Font.Bold = true; oSheet.Range("A1", "D1").VerticalAlignment = -4108; //xlVAlignCenter // Create an array to set multiple values at once. // Fill A2:B6 with an array of values (from VBScript). oSheet.Range("A2", "B6").Value = CreateNamesArray(); // Fill C2:C6 with a relative formula (=A2 & " " & B2). var oRng = oSheet.Range("C2", "C6"); oRng.Formula = "=A2 & " " & B2"; // Fill D2:D6 with a formula(=RAND()*100000) and apply format. oRng = oSheet.Range("D2", "D6"); oRng.Formula = "=RAND()*100000"; oRng.NumberFormat = "$0.00"; // AutoFit columns A:D. oRng = oSheet.Range("A1", "D1"); oRng.EntireColumn.AutoFit(); // Manipulate a variable number of columns for Quarterly Sales Data. DispalyQuarterlySales(oSheet); // Make sure Excel is visible and give the user control // of Excel's lifetime. oXL.Visible = true; oXL.UserControl = true; }<HTML> <HEAD> <TITLE>将页面中指定表格的数据导入到Excel中</TITLE> <SCRIPT LANGUAGE="javascript"> <!-- function AutomateExcel() { var oXL = new ActiveXObject("Excel.Application"); //创建应该对象 var oWB = oXL.Workbooks.Add();//新建一个Excel工作簿 var oSheet = oWB.ActiveSheet;//指定要写入内容的工作表为活动工作表 var table = document.all.data;//指定要写入的数据源的id var hang = table.rows.length;//取数据源行数 var lie = table.rows(0).cells.length;//取数据源列数 // Add table headers going cell by cell. for (i=0;i<hang;i++){//在Excel中写行 for (j=0;j<lie;j++){//在Excel中写列 //定义格式 oSheet.Cells(i+1,j+1).NumberFormatLocal = "@"; //!!!!!!!上面这一句是将单元格的格式定义为文本 oSheet.Cells(i+1,j+1).Font.Bold = true;//加粗 oSheet.Cells(i+1,j+1).Font.Size = 10;//字体大小 oSheet.Cells(i+1,j+1).value = table.rows(i).cells(j).innerText;//向单元格写入值 } } oXL.Visible = true; oXL.UserControl = true; } //--> </SCRIPT> </HEAD> <BODY> <table border="0" width="300" id="data" bgcolor="black" cellspacing="1"> <tr bgcolor="white"> <td>编号</td> <td>姓名</td> <td>年龄</td> <td>性别</td> </tr> <tr bgcolor="white"> <td>0001</td> <td>张三</td> <td>22</td> <td>女</td> </tr> <tr bgcolor="white"> <td>0002</td> <td>李四</td> <td>23</td> <td>男</td> </tr> </table> <input type="button" name="out_excel" onclick="AutomateExcel();" value="导出到excel"> </BODY> </HTML> |
|||
js中两个感叹号的作用 | jquery | ||
先用一个简单的例子说明: var o={flag:true}; var test=!!o.flag;//等效于var test=o.flag||false; alert(test); 由于对null与undefined用!操作符时都会产生true的结果,所以用两个感叹号的作用就在于,如果明确设置了o中flag的值(非null/undefined/0""/等值),自然test就会取跟o.flag一样的值;如果没有设置,test就会默认为false,而不是null或undefined。 在jQuery中比较经典的例子如下:(jQuery 1.7.0.js: Line 748) grep: function( elems, callback, inv ) { var ret = [], retVal; inv = !!inv; // Go through the array, only saving the items // that pass the validator function for ( var i = 0, length = elems.length; i < length; i++ ) { retVal = !!callback( elems[ i ], i ); if ( inv !== retVal ) { ret.push( elems[ i ] ); } } return ret; } 在使用grep函数的时候,如果给出了第三个参数且非null/undefined/0""/等值,则inv为true,否则为false。这样做的目的就是保证inv和retVal的值都只能在true/false中取,而非其它值,为后续判断提供便利。 |
|||
execute、executeQuery和executeUpdate之间的区别(转) | |||
DBC中Statement 接口提供了三种执行 SQL 语句的方法:executeQuery、executeUpdate 和 execute。使用哪一个方法由 SQL 语句所产生的内容决定。 1>方法executeQuery 用于产生单个结果集(ResultSet)的语句,例如 SELECT 语句。被使用最多的执行 SQL 语句的方法。这个方法被用来执行 SELECT 语句,它几乎是使用最多的 SQL 语句。但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。 如: //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //使用DriverManager获取数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root","1234"); //使用Connection来创建一个Statment对象 Statement stmt = conn.createStatement(); //执行查询语句 ResultSet rs =stmt.executeQuery("select * from teacher"); //把查询结果输出来 while (rs.next()) { System.out.println(rs.getInt(1) + "\t" + rs.getString(2)); } 2>方法executeUpdate 用于执行 INSERT、UPDATE 或 DELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLE 和 DROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。对于 CREATE TABLE 或 DROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。 如: //加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); //使用DriverManager获取数据库连接 Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root","1234"); //使用Connection来创建一个Statment对象 Statement stmt = conn.createStatement(); //执行DML语句,返回受影响的记录条数 return stmt.executeUpdate(sql); 3>方法execute: 可用于执行任何SQL语句,返回一个boolean值,表明执行该SQL语句是否返回了ResultSet。如果执行后第一个结果是ResultSet,则返回true,否则返回false。但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用 executeQuery或executeUpdate更适合,但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。 如: //加载驱动 Class.forName(driver); //获取数据库连接 conn = DriverManager.getConnection(url , user , pass); //使用Connection来创建一个Statment对象 stmt = conn.createStatement(); //执行SQL,返回boolean值表示是否包含ResultSet boolean hasResultSet = stmt.execute(sql); //如果执行后有ResultSet结果集 if (hasResultSet) { //获取结果集 rs = stmt.getResultSet(); //ResultSetMetaData是用于分析结果集的元数据接口 ResultSetMetaData rsmd = rs.getMetaData(); int columnCount = rsmd.getColumnCount(); //迭代输出ResultSet对象 while (rs.next()) {//依次输出每列的值 for (int i = 0 ; i < columnCount ; i++ ) { System.out.print(rs.getString(i + 1) + "\t"); } System.out.print("\n"); } } else { System.out.println("该SQL语句影响的记录有" + stmt.getUpdateCount() + "条"); } |
|||
JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法[转] | |||
1、如何将java.util.Date转化为java.sql.Date? 转化: java.sql.Date sd; java.util.Date ud; //initialize the ud such as ud = new java.util.Date(); sd = new java.sql.Date(ud.getTime()); 2、如果要插入到数据库并且相应的字段为Date类型 那么可以用PreparedStatement.setDate(int ,java.sql.Date)方法 其中的java.sql.Date可以用上面的方法得到 也可以用数据库提供TO_DATE函数 比如 现有 ud TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"), "YYYY-MM-DD HH24:MI:SS") 注意java中表示格式和数据库提供的格式的不同 一个实际的例子 sql="update tablename set timer=to_date('"+t+"','yyyymmddhh24miss') where ....." 这里的t为变量为类似:20051211131223 3、如何将"yyyy-mm-dd"格式的字符串转换为java.sql.Date 方法1 SimpleDateFormat bartDateFormat = new SimpleDateFormat("yyyy-MM-dd"); String dateStringToParse = "2007-7-12"; try { java.util.Date date = bartDateFormat.parse(dateStringToParse); java.sql.Date sqlDate = new java.sql.Date(date.getTime()); System.out.println(sqlDate.getTime()); } catch (Exception ex) { System.out.println(ex.getMessage()); } ------------------------------------------------------------ 方法2 String strDate = "2002-08-09"; StringTokenizer st = new StringTokenizer(strDate, "-"); java.sql.Date date = new java.sql.Date(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken())); java.util.Date和java.sql.Date的异同 java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类)。 但是为什么java.sql.Date类型的值插入到数据库中Date字段中会发生数据截取呢? java.sql.Date是为了配合SQL DATE而设置的数据类型。“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用 ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。 在sun提供的ResultSet.java中这样对getDate进行注释的: Retrieves the of the designated column in the current row of this <code>ResultSet</code> object as a “java.sql.Date” object in the Java programming language. 同理。如果我们把一个java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的 java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()). 显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值, 我们需要利用java.sql.Timestamp. Calendar Calendar calendar=Calendar.getInstance(); //获得当前时间,声明时间变量 int year=calendar.get(Calendar.YEAR); //得到年 int month=calendar.get(Calendar.MONTH); //得到月,但是,月份要加上1 month=month+1; int date=calendar.get(Calendar.DATE); //获得日期 String today=""+year+"-"+month+"-"+date+""; |
|||
JAVA 实现Timestamp和String的相互转换 | |||
JAVA 实现Timestamp和String的相互转换 用Timestamp来记录日期时间还是很方便的,但有时候显示的时候是不需要小数位后面的毫秒的,这样就需要在转换为String时重新定义格式。 Timestamp转化为String: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//定义格式,不显示毫秒 Timestamp now = new Timestamp(System.currentTimeMillis());//获取系统当前时间 String str = df.format(now); String转化为Timestamp: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String time = df.format(new Date()); Timestamp ts = Timestamp.valueOf(time); Date、String、Timestamp之间的转换! Date 和String之间的转换main函数: public static void main(String[] args) { // TODO Auto-generated method stub DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; String str = null; // String转Date str = "2009-01-06"; try { date = format.parse(str); // Wed sep 26 00:00:00 CST 2007 } catch (ParseException e) { e.printStackTrace(); } date = java.sql.Date.valueOf(str); // 只保留日期部分,返回的是java.sql.Date 2007-9-26 System.out.println(date); // Date转String date = new Date(); // Wed sep 26 18 17:14:01 CST 2007 str = format.format(date); // 2007-9-26 System.out.println(str); format = DateFormat.getDateInstance(DateFormat.SHORT); str = format.format(date); // 07-9-26 System.out.println(str); format = DateFormat.getDateInstance(DateFormat.MEDIUM); str = format.format(date); // 2007-9-26 System.out.println(str); format = DateFormat.getDateInstance(DateFormat.FULL); str = format.format(date); // 2007年9月26日 星期三 System.out.println(str); } Timestamp和String之间转换的函数: public static void main(String[] args) { // TODO Auto-generated method stub //Timestamp转化为String: SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//定义格式,不显示毫秒 Timestamp now = new Timestamp(System.currentTimeMillis());//获取系统当前时间 String str = df.format(now); System.out.println(str); ///String转化为Timestamp: SimpleDateFormat df1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Date date = new Date(); String time = df1.format(date); Timestamp ts = Timestamp.valueOf(time); System.out.println(ts); } |
|||
长时间面对电脑而眼睛又不疲劳的方法 | 编程人 | ||
大夫建议:电脑屏幕不要用白色,因为白色对眼睛的刺激是最大的。 像我们这样整天对着电脑干活的,也 应该注意一下。 其实,只要稍微设置一下,就能让你电脑上的窗口从白花花的颜色变成淡淡的绿色。绿色是有益于眼睛的噢~^0^ 设置方法如下: 在桌面点右键选“属性”(properties),接着点“外观”(appearance),点右下 角的“高级”(advanced),然后在“项目”(items)的下拉菜单里选“窗口” (windows),再点它右侧的下拉菜单“颜色”(color),点下方的“其它” (others),然后把“色调”(Hue)设为85,“饱和度”(Sat)设为90,“亮度” (Lum)设为205。 (产品出厂时,一般分别设为160、0、240。) 然后单击“添加到自定义颜色”(Add to custom colors),按“确定”(OK)…… 一直“确定”(OK)下去。然后屏幕上会出现一个小Windows的画面,上写“请稍 候”。 把窗口设成绿色之后,再来把IE的网页背景也变成养眼的绿色吧: 打开IE,点击“工具”(TOOLS),点最下方的“Internet选项”(INTERNET OPTIONS),点右下角的“辅助功能”(Assessibility),然后勾选第一个“不使用网 页中指定的颜色”(ignore colors specified on web pages),然后点“确定” (OK)--确定……退出。 O啦,现在你就会发现你的屏幕已经变成淡淡的绿色了。 这个颜色会比白色柔和许多,刚开始可能你还有些不适应,但确实对我们的眼睛有好处,大家不妨试一下。 电脑靠墙放,不仅易受潮气的袭击,对人的健康也有危害。 电脑紧贴墙壁摆放,使用者抬起头时,映入眼帘的就是一堵墙,这种情况下,眼睛不但无法得到良好的调节和放松,还会加重视神经的紧张和疲劳,长此以往会导致近视,或使近视程度进一步加深。长时间近距离看到的都是一面墙壁,还会导致大脑不断接收到紧张信号,令人们出现头昏脑涨、疲劳、焦虑等一系列不适的症状。 所以,电脑最好摆放在窗户边,或让屏幕和墙壁之间的距离在1米以上。如果必须把电脑靠墙壁放置,不妨在后面的墙壁上贴一些绿色或蓝色的画(如森林或大海),这些冷色调的墙纸进入视线,传递到大脑后,可以使情绪得到镇静,并有效地缓解焦虑和疲劳症状,使人心境变得开阔。 |
|||
SQL 中的 CRUD | 常用知识累计 | ||
它们是以下四个单词的缩写,即:新建可以认为是增加,读可以是查,修改就是改,删除即是删。这就是所谓增删改查。 C = create, R = read, U = update, D = delete |
|||
【知识】浏览器分类和浏览器核心详解 | 编程人 | ||
浏览器的种类,如果按照生产商的品牌分,不说数以万计,起码也有成百上千种了, 如果按浏览器核心分类,它的种类就会少的多。 当今浏览器核心的种类值得一体的大约只有三到四个,它们分别是:Trident、Gecko、WebKit和Presto。 乍一看,似乎都很陌生,其实并不然,只要你上过网,就至少用过其中一种浏览器核心的浏览器软件,因为它们的市场占有率的确是太高了。 一、Trident核心,代表产品Internet Explorer 说起Trident,很多人都会感到陌生,但提起IE(Internet Explorer)则无人不知无人不晓,由于其被包含在全世界使用率最高的操作系统Windows中,得到了极高的市场占有率,所以我们又经常称其为IE核心。 Trident(又称为MSHTML),是微软开发的一种排版引擎。它在1997年10月与IE4一起诞生,至今经历12年,至少更新了四个版本,虽然它相对其它浏览器核心还比较落后,但Trident一直在被不断地更新和完善。而且除IE外,许多产品都在使用Trident核心,比如Windows的Help程序、RealPlayer、Windows Media Player、Windows Live Messenger、Outlook Express等等都使用了Trident技术。 但并不是所有的IE都使用Trident引擎,微软还有另一个网页浏览器排版引擎,叫做Tasman,它是使用在Internet Explorer for Mac的排版引擎,即苹果版的IE引擎。 使用Trident引擎的浏览器有很多,比如Internet Explorer、Maxthon遨游、世界之窗、腾讯TT、Netcapter、Avant等等,但Trident只能应用于Windows平台,且是不开源的。 二、Gecko核心,代表作品Mozilla Firefox Gecko也是一个陌生的词,但Firefox的名声应该已经有所耳闻,Gecko是一套开放源代码的、以C++编写的网页排版引擎。 目前为Mozilla家族网页浏览器以及Netscape 6以后版本浏览器所使用。这软件原本是由网景通讯公司开发的,现在则由Mozilla基金会维护。它的最大优势是跨平台,能在Microsoft Windows、Linux和MacOS X等主要操作系统上运行,而且它提供了一个丰富的程序界面以供互联网相关的应用程式使用,例如网页浏览器、HTML编辑器、客户端/服务器等等。 Gecko是最流行的排版引擎之一,仅次于Trident。使用它的最著名浏览器有Firefox、Netscape6至9。 三、WebKit核心,代表作品Safari、Chrome webkit 是一个开源项目,包含了来自KDE项目和苹果公司的一些组件,主要用于Mac OS系统,它的特点在于源码结构清晰、渲染速度极快。主要代表作品有Safari和Google的浏览器Chrome。 四、Presto核心,代表作品Opera Presto是由Opera Software开发的浏览器排版引擎,供Opera 7.0及以上使用。它取代了旧版Opera 4至6版本使用的Elektra排版引擎,包括加入动态功能,例如网页或其部分可随着DOM及Script语法的事件而重新排版。 Presto在推出后不断有更新版本推出,使不少错误得以修正,以及阅读Javascript效能得以最佳化,并成为速度最快的引擎,这也是Opera被公认为速度最快的浏览器的基础。 |
|||
Apache Commons fileUpload实现文件上传 | java | http://zhangjunhd.blog.51cto.com/113473/18331 | |
Apache的commons-fileupload.jar可方便的实现文件的上传功能,本文通过实例来介绍如何使用commons-fileupload.jar。 将Apache的commons-fileupload.jar放在应用程序的WEB-INF\lib下,即可使用。下面举例介绍如何使用它的文件上传功能。 所使用的fileUpload版本为1.2,环境为Eclipse3.3+MyEclipse6.0。FileUpload 是基于 Commons IO的,所以在进入项目前先确定Commons IO的jar包(本文使用commons-io-1.3.2.jar)在WEB-INF\lib下。 此文作示例工程可在文章最后的附件中下载。 示例1 最简单的例子,通过ServletFileUpload静态类来解析Request,工厂类FileItemFactory会对mulipart类的表单中的所有字段进行处理,不只是file字段。getName()得到文件名,getString()得到表单数据内容,isFormField()可判断是否为普通的表单项。 demo1.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> //必须是multipart的表单数据。 <form name="myform" action="demo1.jsp" method="post" enctype="multipart/form-data"> Your name: <br> <input type="text" name="name" size="15"><br> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo1.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% boolean isMultipart = ServletFileUpload.isMultipartContent(request);//检查输入请求是否为multipart表单数据。 if (isMultipart == true) { FileItemFactory factory = new DiskFileItemFactory();//为该请求创建一个DiskFileItemFactory对象,通过它来解析请求。执行解析后,所有的表单项目都保存在一个List中。 ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request); Iterator<FileItem> itr = items.iterator(); while (itr.hasNext()) { FileItem item = (FileItem) itr.next(); //检查当前项目是普通表单项目还是上传文件。 if (item.isFormField()) {//如果是普通表单项目,显示表单内容。 String fieldName = item.getFieldName(); if (fieldName.equals("name")) //对应demo1.html中type="text" name="name" out.print("the field name is" + item.getString());//显示表单内容。 out.print("<br>"); } else {//如果是上传文件,显示文件名。 out.print("the upload file name is" + item.getName()); out.print("<br>"); } } } else { out.print("the enctype must be multipart/form-data"); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 结果: the field name isjeff the upload file name isD:\C语言考试样题\作业题.rar 示例2 上传两个文件到指定的目录。 demo2.html <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> <form name="myform" action="demo2.jsp" method="post" enctype="multipart/form-data"> File1:<br> <input type="file" name="myfile"><br> File2:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo2.jsp <%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <%String uploadPath="D:\\temp"; boolean isMultipart = ServletFileUpload.isMultipartContent(request); if(isMultipart==true){ try{ FileItemFactory factory = new DiskFileItemFactory(); ServletFileUpload upload = new ServletFileUpload(factory); List<FileItem> items = upload.parseRequest(request);//得到所有的文件 Iterator<FileItem> itr = items.iterator(); while(itr.hasNext()){//依次处理每个文件 FileItem item=(FileItem)itr.next(); String fileName=item.getName();//获得文件名,包括路径 if(fileName!=null){ File fullFile=new File(item.getName()); File savedFile=new File(uploadPath,fullFile.getName()); item.write(savedFile); } } out.print("upload succeed"); } catch(Exception e){ e.printStackTrace(); } } else{ out.println("the enctype must be multipart/form-data"); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 结果:upload succeed 此时,在"D:\temp"下可以看到你上传的两个文件。 示例3 上传一个文件到指定的目录,并限定文件大小。 demo3.html<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> <form name="myform" action="demo3.jsp" method="post" enctype="multipart/form-data"> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> demo3.jsp<%@ page language="java" contentType="text/html; charset=GB18030" pageEncoding="GB18030"%> <%@ page import="org.apache.commons.fileupload.*"%> <%@ page import="org.apache.commons.fileupload.servlet.*"%> <%@ page import="org.apache.commons.fileupload.disk.*"%> <%@ page import="java.util.*"%> <%@ page import="java.io.*"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <% File uploadPath = new File("D:\\temp");//上传文件目录 if (!uploadPath.exists()) { uploadPath.mkdirs(); } // 临时文件目录 File tempPathFile = new File("d:\\temp\\buffer\\"); if (!tempPathFile.exists()) { tempPathFile.mkdirs(); } try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);//设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);//得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(fi.getName()); File savedFile = new File(uploadPath, fullFile .getName()); fi.write(savedFile); } } out.print("upload succeed"); } catch (Exception e) { e.printStackTrace(); } %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> </body> </html> 示例4 利用Servlet来实现文件上传。 Upload.javapackage com.zj.sample; import java.io.File; import java.io.IOException; import java.util.Iterator; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.fileupload.FileItem; import org.apache.commons.fileupload.disk.DiskFileItemFactory; import org.apache.commons.fileupload.servlet.ServletFileUpload; @SuppressWarnings("serial") public class Upload extends HttpServlet { private String uploadPath = "D:\\temp"; // 上传文件的目录 private String tempPath = "d:\\temp\\buffer\\"; // 临时文件目录 File tempPathFile; @SuppressWarnings("unchecked") public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { // Create a factory for disk-based file items DiskFileItemFactory factory = new DiskFileItemFactory(); // Set factory constraints factory.setSizeThreshold(4096); // 设置缓冲区大小,这里是4kb factory.setRepository(tempPathFile);// 设置缓冲区目录 // Create a new file upload handler ServletFileUpload upload = new ServletFileUpload(factory); // Set overall request size constraint upload.setSizeMax(4194304); // 设置最大文件尺寸,这里是4MB List<FileItem> items = upload.parseRequest(request);// 得到所有的文件 Iterator<FileItem> i = items.iterator(); while (i.hasNext()) { FileItem fi = (FileItem) i.next(); String fileName = fi.getName(); if (fileName != null) { File fullFile = new File(fi.getName()); File savedFile = new File(uploadPath, fullFile.getName()); fi.write(savedFile); } } System.out.print("upload succeed"); } catch (Exception e) { // 可以跳转出错页面 e.printStackTrace(); } } public void init() throws ServletException { File uploadFile = new File(uploadPath); if (!uploadFile.exists()) { uploadFile.mkdirs(); } File tempPathFile = new File(tempPath); if (!tempPathFile.exists()) { tempPathFile.mkdirs(); } } } demo4.html<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> <title>File upload</title> </head> <body> // action="fileupload"对应web.xml中<servlet-mapping>中<url-pattern>的设置. <form name="myform" action="fileupload" method="post" enctype="multipart/form-data"> File:<br> <input type="file" name="myfile"><br> <br> <input type="submit" name="submit" value="Commit"> </form> </body> </html> web.xml<servlet> <servlet-name>Upload</servlet-name> <servlet-class>com.zj.sample.Upload</servlet-class> </servlet> <servlet-mapping> <servlet-name>Upload</servlet-name> <url-pattern>/fileupload</url-pattern> </servlet-mapping> |
|||
如何才算掌握Java | 编程人 | ||
时常看到一些人说掌握了Java,但是让他们用Java做一个实际的项目可能又困难重重,在这里,笔者根据自己的一点理解 斗胆提出自己的一些对掌握Java这个说法的标准,当然对于新手,也可以提供一个需要学习哪些内容的参考。另外这个标准仅限于J2SE部分,J2EE部分 的内容有时间再另说。 1、语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正。 2、命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:appletviewer、HtmlConverter、jar、 java、javac、javadoc、javap、javaw、native2ascii、serialver,如果这些命令你没有全部使用过,那么你 对java实际上还很不了解。 3、工具:必须至少熟练使用一种IDE的开发工具,例如Eclipse、Netbeans、JBuilder、Jdeveloper、IDEA、JCreator或者Workshop,包括进行工程管理、常用选项的设置、插件的安装配置以及进行调试。 4、API:Java的核心API是非常庞大的,但是有一些内容笔者认为是必须熟悉的,否则不可能熟练的运用Java,包括: 1)、java.lang包下的80%以上的类的功能的灵活运用。 2)、java.util包下的80%以上的类的灵活运用,特别是集合类体系、规则表达式、zip、以及时间、随机数、属性、资源和Timer。 3)、java.io包下的60%以上的类的使用,理解IO体系的基于管道模型的设计思路以及常用IO类的特性和使用场合。 4)、java.math包下的100%的内容。 5)、java.net包下的60%以上的内容,对各个类的功能比较熟悉。 6)、java.text包下的60%以上的内容,特别是各种格式化类。 7)、熟练运用JDBC。 8)、java.security包下40%以上的内容,如果对于安全没有接触的话根本就不可能掌握java。 9)、AWT的基本内容,包括各种组件事件、监听器、布局管理器、常用组件、打印。 10)、Swing的基本内容,和AWT的要求类似。 11)、XML处理,熟悉SAX、DOM以及JDOM的优缺点并且能够使用其中的一种完成XML的解析及内容处理。 5、测试:必须熟悉使用junit编写测试用例完成代码的自动测试。 6、管理:必须熟悉使用ant完成工程管理的常用任务,例如工程编译、生成javadoc、生成jar、版本控制、自动测试( 1T6-530 ) 。 7、排错:应该可以根据异常信息比较快速的定位问题的原因和大致位置。 8、思想:必须掌握OOP的主要要求,这样使用Java开发的系统才能是真正的Java系统。 9、规范:编写的代码必须符合流行的编码规范,例如类名首字母大写,成员和方法名首字母小写,方法名的第一个单词一般是动词,包名全部小写等,这样程序的可读性才比较好 |
|||
Oracl 经验 | oracl | ||
1.删除表空间 DROP TABLESPACE TableSpaceName [INCLUDING CONTENTS [AND DATAFILES]] 2.删除用户 DROP USER User_Name CASCADE 3.删除表的注意事项 在删除一个表中的全部数据时,须使用TRUNCATE TABLE 表名;因为用DROP TABLE,DELETE * FROM 表名时,TABLESPACE表空间该表的占用空间并未释放,反复几次DROP,DELETE操作后,该TABLESPACE上百兆的空间就被耗光了。 4.having子句的用法 having子句对group by子句所确定的行组进行控制,having子句条件中只允许涉及常量,聚组函数或group by 子句中的列。 5.外部联接"+"的用法 外部联接"+"按其在"="的左边或右边分左联接和右联接.若不带"+"运算符的表中的一个行不直接匹配于带"+"预算符的表中的任何行,则前者的行与后者中的一个空行相匹配并被返回.若二者均不带’+’,则二者中无法匹配的均被返回.利用外部联接"+",可以替代效率十分低下的 not in 运算,大大提高运行速度.例如,下面这条命令执行起来很慢 用外联接提高表连接的查询速度 在**连接(常用于视图)时,常使用以下方法来查询数据: SELECT PAY_NO, PROJECT_NAME FROM A WHERE A.PAY_NO NOT IN (SELECT PAY_ NO FROM B WHERE VALUE >=120000); ---- 但是若表A有10000条记录,表B有10000条记录,则要用掉30分钟才能查完,主要因为NOT IN要进 行一条一条的比较,共需要10000*10000次比较后,才能得到结果。该用外联接后,可以缩短到1分左右的时间: SELECT PAY_NO,PROJECT_NAME FROM A,B WHERE A.PAY_NO=B.PAY_NO(+) AND B.PAY_NO IS NULL AND B.VALUE >=12000; 6.set transaction命令的用法 在执行大事务时,有时oracle会报出如下的错误: ORA-01555:snapshot too old (rollback segment too small) 这说明oracle给此事务随机分配的回滚段太小了,这时可以为它指定一个足够大的回滚段,以确保这个事务的成功执行.例如 set transaction use rollback segment roll_abc; delete from table_name where ... commit; 回滚段roll_abc被指定给这个delete事务,commit命令则在事务结束之后取消了回滚段的指定. 7.数据库重建应注意的问题 在利用import进行数据库重建过程中,有些视图可能会带来问题,因为结构输入的顺序可能造成视图的输入先于它低层次表的输入,这样建立视图就会失败.要解决这一问题,可采取分两步走的方法:首先输入结构,然后输入数据.命令举例如下 (uesrname:jfcl,password:hfjf,host sting:ora1,数据文件:expdata.dmp): imp jfcl/hfjf@ora1 file=empdata.dmp rows=N imp jfcl/hfjf@ora1 file=empdata.dmp full=Y buffer=64000 commit=Y ignore=Y 第一条命令输入所有数据库结构,但无记录.第二次输入结构和?64000字节提交一次.ignore=Y选项保证第二次输入既使对象存在的情况下也能成功. select a.empno from emp a where a.empno not in (select empno from emp1 where job=’SALE’); 倘若利用外部联接,改写命令如下: select a.empno from emp a ,emp1 b where a.empno=b.empno(+) and b.empno is null and b.job=’SALE’; 可以发现,运行速度明显提高. 8.从已知表新建另一个表: CREATE TABLE b AS SELECT * (可以是表a中的几列) FROM a WHERE a.column = ...; 9.查找、删除重复记录: 法一: 用Group by语句 此查找很快的 select count(num), max(name) from student --查找表中num列重复的,列出重复的记录数,并列出他的name属性 group by num having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次 delete from student(上面Select的) 这样的话就把所有重复的都删除了。-----慎重 法二:当表比较大(例如10万条以上)时,这个方法的效率之差令人无法忍受,需要另想办法: ---- 执行下面SQL语句后就可以显示所有DRAWING和DSNO相同且重复的记录 SELECT * FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D --D相当于First,Second WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO); ---- 执行下面SQL语句后就可以刪除所有DRAWING和DSNO相同且重复的记录 DELETE FROM EM5_PIPE_PREFAB WHERE ROWID!=(SELECT MAX(ROWID) FROM EM5_PIPE_PREFAB D WHERE EM5_PIPE_PREFAB.DRAWING=D.DRAWING AND EM5_PIPE_PREFAB.DSNO=D.DSNO); 10.返回表中[N,M]条记录: 取得某列中第N大的行 select column_name from (select table_name.*,dense_rank() over (order by column desc) rank from table_name) where rank = &N; 假如要返回前5条记录: select * from tablename where rownum,>=,=,Between...and。由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件 不成立,查不到记录. 另外,这个方法更快: select * from ( select rownum r,a from yourtable where rownum 10 这样取出第11-20条记录!(先选再排序再选) 要先排序再选则须用select嵌套:内层排序外层选。 rownum是随着结果集生成的,一旦生成,就不会变化了;同时,生成的结果是依次递加的,没有1就永远不会有2! rownum 是在 查询集合产生的过程中产生的伪列,并且如果where条件中存在 rownum 条件的话,则: 1: 假如 判定条件是常量,则: 只能 rownum = 1, 11.快速编译所有视图 ---- 当在把数据库倒入到新的服务器上后(数据库重建),需要将视图重新编译一遍,因为该表空间视图到其它表空间的表的连接会出现问题,可以利用PL/SQL的语言特性,快速编译。 SQL >SPOOL ON.SQL SQL >SELECT ‘ALTER VIEW ‘||TNAME||’ COMPILE;’ FROM TAB; SQL >SPOOL OFF 然后执行ON.SQL即可。 SQL >@ON.SQL 当然,授权和创建同义词也可以快速进行,如: SQL >SELECT ‘GRANT SELECT ON ’ ||TNAME||’ TO USERNAME;’ FROM TAB; SQL >SELECT ‘CREATE SYNONYM ‘||TNAME||’ FOR USERNAME.’||TNAME||’;’ FROM TAB; 12.读写文本型操作系统文件 ---- ?L/SQL 3.3以上的版本中,UTL_FILE包允许用户通过PL/SQL读写操作系统文件。如下: DECALRE FILE_HANDLE UTL_FILE.FILE_TYPE; BEGIN FILE_HANDLE:=UTL_FILE.FOPEN( ‘C:\’,’TEST.TXT’,’A’); UTL_FILE.PUT_LINE(FILE_HANDLE,’ HELLO,IT’S A TEST TXT FILE’); UTL_FILE.FCLOSE(FILE_HANDLE); END; 13.在数据库触发器中使用列的新值与旧值 ---- 在数据库触发器中几乎总是要使用触发器基表的列值,如果某条语句需要某列修改前的值,使用:OLD就可以了,使用某列修改后的新值,用:NEW就可以了。如:OLD.DEPT_NO,:NEW.DEPT_NO。 14.数据库文件的移动方法 当想将数据库文件移动到另外一个目录下时,可以用ALTER DATABASE命令来移动(比ALTER TABLESPACE适用性强): 1. 使用SERVER MANAGER关闭实例. SVRMGR > connect internal; SVRMGR > shutdown; SVRMGR >exit; 2. 使用操作系统命令来移动数据库文件位置(假设这里操作系统为SOLARIS 2.6). 在UNIX中用 mv命令可以把文件移动到新的位置, #mv /ora13/orarun/document.dbf /ora12/orarun 3. 装载数据库并用alter database命令来改变数据库中的文件名. SVRMGR > connect internal; SVRMGR > startup mount RUN73; SVRMGR > alter database rename file > ‘/ ora13/orarun/document.dbf’ > ‘/ ora12/orarun/document.dbf’; 4. 启动实例. SVRMGR > alter database open; 15.连接查询结果: 表a 列 a1 a2 记录 1 a 1 b 2 x 2 y 2 z 用select能选成以下结果: 1 ab 2 xyz 下面有两个例子: 1.使用pl/sql代码实现,但要求你组合后的长度不能超出oracle varchar2长度的限制 create or replace type strings_table is table of varchar2(20); / create or replace function merge (pv in strings_table) return varchar2 is ls varchar2(4000); begin for i in 1..pv.count loop ls := ls || pv(i); end loop; return ls; end; / create table t (id number,name varchar2(10)); insert into t values(1,'Joan'); insert into t values(1,'Jack'); insert into t values(1,'Tom'); insert into t values(2,'Rose'); insert into t values(2,'Jenny'); column names format a80; select t0.id,merge(cast(multiset(select name from t where t.id = t0.id) as strings_table)) names from (select distinct id from t) t0; drop type strings_table; drop function merge; drop table t; 2.纯粹用sql: 表dept, emp 要得到如下结果 deptno, dname, employees --------------------------------- 10, accounting, clark;king;miller 20, research, smith;adams;ford;scott;jones 30, sales, allen;blake;martin;james;turners 每个dept的employee串起来作为一条记录返回 This example uses a max of 6, and would need more cut n pasting to do more than that: SQL> select deptno, dname, emps 2 from ( 3 select d.deptno, d.dname, rtrim(e.ename ||', '|| 4 lead(e.ename,1) over (partition by d.deptno 5 order by e.ename) ||', '|| 6 lead(e.ename,2) over (partition by d.deptno 7 order by e.ename) ||', '|| 8 lead(e.ename,3) over (partition by d.deptno 9 order by e.ename) ||', '|| 10 lead(e.ename,4) over (partition by d.deptno 11 order by e.ename) ||', '|| 12 lead(e.ename,5) over (partition by d.deptno 13 order by e.ename),', ') emps, 14 row_number () over (partition by d.deptno 15 order by e.ename) x 16 from emp e, dept d 17 where d.deptno = e.deptno 18 ) 19 where x = 1 20 / DEPTNO DNAME EMPS ------- ----------- --------- 10 ACCOUNTING CLARK, KING, MILLER 20 RESEARCH ADAMS, FORD, JONES, ROONEY, SCOTT, SMITH 30 SALES ALLEN, BLAKE, JAMES, MARTIN, TURNER, WARD 16.在Oracle中建一个编号会自动增加的字段,以利于查询 1、建立序列: CREATE SEQUENCE checkup_no_seq NOCYCLE MAXVALUE 9999999999 START WITH 2; 2、建立触发器: CREATE OR REPLACE TRIGGER set_checkup_no BEFORE INSERT ON checkup_history FOR EACH ROW DECLARE next_checkup_no NUMBER; BEGIN --Get the next checkup number from the sequence SELECT checkup_no_seq.NEXTVAL INTO next_checkup_no FROM dual; --use the sequence number as the primary key --for the record being inserted :new.checkup_no := next_checkup_no; END; 17.查看对象的依赖关系(比如视图与表的引用) 查看视图:dba_dependencies 记录了相关的依赖关系 查东西不知道要查看哪个视图时,可以在DBA_Objects里看, select object_name from dba_objects where object_name like '%ROLE%'(假如查看ROLE相关) 然后DESC一下就大体上知道了。 18.要找到某月中所有周五的具体日期 select to_char(t.d,'YY-MM-DD') from ( select trunc(sysdate, 'MM')+rownum-1 as d from dba_objects where rownum |
|||
mysql 查询距离当前6个月、本周、上周、当天、本月、上月语句 | mysql | ||
#查询距离当前现在6个月的数据 #select NewsCreateDate from web_news where NewsCreateDate between date_sub(now(),interval 6 month) and now() #查询当前这周的数据 #select NewsCreateDate from web_news where YEARWEEK(date_format(NewsCreateDate,'%Y-%m-%d')) = YEARWEEK(now()) #查询上周的数据 #select NewsCreateDate from web_news where YEARWEEK(date_format(NewsCreateDate,'%Y-%m-%d')) = YEARWEEK(now())-1 #查询当天的数据 #select NewsCreateDate from web_news where date(date_format(NewsCreateDate,'%Y-%m-%d'))=date(now()) #查询当前月份的数据 #select NewsCreateDate from web_news where date_format(NewsCreateDate,'%Y-%m')=date_format(now(),'%Y-%m') #查询上个月的数据 #select NewsCreateDate from web_news where date_format(NewsCreateDate,'%Y-%m')=date_format(DATE_SUB(curdate(), INTERVAL 1 MONTH),'%Y-%m') |
|||
获取div的绝对位置和控制div的隐藏与显示 判断某一点是否在某一区域 | js | ||
获取div的绝对位置和控制div的隐藏与显示 判断某一点是否在某一区域 现在要实现这样一个功能,就是页面上有一排图片,图片中绑定的有用户的id,要在鼠标移上图片的时候,在旁边出现一个div来显示用户的信息,并且可以操作,当鼠标移走时消失(就像csdn的blog上的最近访客一样)。看似挺简单的功能,做起来也遇到不少问题,现在来总结一下。 首先,就是图片的位置获取的问题。如果页面内容很多,嵌套了很多层,那么这个图片的位置也就不容易获取了(我做的时候总会有偏移)。 罗列一下可以获取位置的属性: 注意:如果网页做了以下声明: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 则document.body 要替换成 document.documentElement 也可以这样兼容: function getBodyObj() { return (document.documentElement)?document.documentElement:document.body; } clientHeight 获取对象的高度,不计算任何边距、边框、滚动条,但包括该对象的补白。 clientLeft 获取 offsetLeft 属性和客户区域的实际左边之间的距离。 clientTop 获取 offsetTop 属性和客户区域的实际顶端之间的距离。 clientWidth 获取对象的宽度,不计算任何边距、边框、滚动条,但包括该对象的补白。 offsetHeight 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的高度。 offsetLeft 获取对象相对于版面或由 offsetParent 属性指定的父坐标的计算左侧位置。 offsetParent 获取定义对象 offsetTop 和 offsetLeft 属性的容器对象的引用。 offsetTop 获取对象相对于版面或由 offsetTop 属性指定的父坐标的计算顶端位置。 offsetWidth 获取对象相对于版面或由父坐标 offsetParent 属性指定的父坐标的宽度。 offsetX 设置或获取鼠标指针位置相对于触发事件的对象的 x 坐标。 offsetY 设置或获取鼠标指针位置相对于触发事件的对象的 y 坐标。 clientX,clientY 鼠标当前相对于网页的位置,当鼠标位于页面左上角时clientX=0, clientY=0; screenX, screenY是相对于用户显示器的位置 网页可见区域宽: document.body.clientWidth; 网页可见区域高: document.body.clientHeight; 网页可见区域宽: document.body.offsetWidth (包括边线的宽); 网页可见区域高: document.body.offsetHeight (包括边线的宽); 网页正文全文宽: document.body.scrollWidth; 网页正文全文高: document.body.scrollHeight; 网页被卷去的高: document.body.scrollTop; 网页被卷去的左: document.body.scrollLeft; 网页正文部分上: window.screenTop; 网页正文部分左: window.screenLeft; 屏幕分辨率的高: window.screen.height; 屏幕分辨率的宽: window.screen.width; 屏幕可用工作区高度: window.screen.availHeight; 屏幕可用工作区宽度:window.screen.availWidth; 在网上找到一个可以获取的方法,如下: <script type="text/javascript" language="javascript"> function CPos(x, y) { this.x = x; this.y = y; } function GetObjPos(ATarget) { var target = ATarget; var pos = new CPos(target.offsetLeft, target.offsetTop); var target = target.parentElement; while (target) { pos.x += target.offsetLeft; pos.y += target.offsetTop; target = target.parentElement } return pos; } </script> 现在位置基本上获取到了,当鼠标移动到图片上时,创建一个div,此div的位置就用刚才获取的x,y值, 在图片上绑定onmouseover事件。 方法如下: function showPosition(imgtag,qqnum) { var posi = GetObjPos(imgtag); var x1 = posi.x + imgtag.offsetWidth; var y1 = posi.y; if(document.getElementById("qqcontact")) { var div1 = document.getElementById("qqcontact"); document.body.removeChild(div1); } var newNode = document.createElement("div"); newNode.setAttribute("id", "qqcontact"); newNode.onmouseover=function(){window.event.cancelBubble = true;}; newNode.onmouseout=function(){ var x = event.clientX; var y = event.clientY; var divx1 = $('qqcontact').offsetLeft; var divy1 = $('qqcontact').offsetTop; var divx2 = $('qqcontact').offsetLeft + $('qqcontact').offsetWidth; var divy2 = $('qqcontact').offsetTop + $('qqcontact').offsetHeight; if(x < divx1 || x > divx2 || y < divy1 || y > divy2) {var div = document.getElementById("qqcontact"); document.body.removeChild(div);}}; document.body.appendChild(newNode); newNode.style.position = "absolute"; newNode.style.left = x1 - 4 + "px"; newNode.style.top = y1 - 4 + "px"; newNode.style.backgroundColor = "#E58A25"; newNode.style.width = 100 + "px"; newNode.style.height = 40 + "px"; var dd = "<a target=blank href=http://wpa.qq.com/msgrd?v=1&uin=" + qqnum + "&Site=www.mynbw.com&Menu=yes >123<img border='0' SRC=http://wpa.qq.com/pa?p=1:" + qqnum + ":4' alt='点击这里给我发消息' ></a>"; var result1= document.createElement("span"); result1.innerHTML = dd; newNode.appendChild(result1); } function hid() { var x = event.clientX; var y = event.clientY; var divx1 = $('qqcontact').offsetLeft; var divy1 = $('qqcontact').offsetTop; var divx2 = $('qqcontact').offsetLeft + $('qqcontact').offsetWidth; var divy2 = $('qqcontact').offsetTop + $('qqcontact').offsetHeight; if( x < divx1 || x > divx2 || y < divy1 || y > divy2) { var div = document.getElementById("qqcontact"); document.body.removeChild(div); } } 需要注意的是,div中放的有超链接,图片,或者按钮。那么当使用div的onmouseout事件让div消失时,会出现这样的情况,就是当鼠标移至div中的超链接或图片上时,因为此时也判定为离开div,会触发onmouseout事件,这样div中的内容就不能操作了。我的解决的办法是当触发onmouseout事件时,先判断鼠标是否在div内,如果在,说明鼠标并没有离开div,就不删除div,否则,删除之。OK,现在问题解决了。 判断方法其实也很简单,就是找到div左上角和右下角坐标,判断鼠标的坐标是否在这一区域就可以了 |
|||
日期的获取 | java | ||
import java.text.SimpleDateFormat; import java.util.Calendar; public class DateAll { public static void main(String[] args) throws Exception { //当前时间 Calendar cal = Calendar.getInstance(); //SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss G E D F w W a E F"); String mDateTime=formatter.format(cal.getTime()); System.out.println(mDateTime); //1年前日期 java.util.Date myDate=new java.util.Date(); long myTime=(myDate.getTime()/1000)-60*60*24*365; myDate.setTime(myTime*1000); String mDate=formatter.format(myDate); System.out.println(mDate); //明天日期 myDate=new java.util.Date(); myTime=(myDate.getTime()/1000)+60*60*24; myDate.setTime(myTime*1000); mDate=formatter.format(myDate); System.out.println(mDate); //两个时间之间的天数 SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date date= myFormatter.parse("1883-10-10"); java.util.Date mydate= myFormatter.parse("1899-12-30"); long day=(date.getTime()-mydate.getTime())/(24*60*60*1000); System.out.println(day); //加半小时 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); java.util.Date date1 = format.parse("2002-02-28 23:16:00"); long Time=(date1.getTime()/1000)+60*30; date1.setTime(Time*1000); String mydate1=formatter.format(date1); System.out.println(mydate1); //年月周求日期 SimpleDateFormat formatter2 = new SimpleDateFormat("yyyy-MM F E"); java.util.Date date2= formatter2.parse("2003-05 5 星期五"); SimpleDateFormat formatter3 = new SimpleDateFormat("yyyy-MM-dd"); String mydate2=formatter3.format(date2); System.out.println(mydate2); //求是星期几 mydate= myFormatter.parse("2007-11-9"); SimpleDateFormat formatter4 = new SimpleDateFormat("E"); String mydate3=formatter4.format(mydate); System.out.println(mydate3); } } |
|||
Hibernate 分页 | ssh 之 hibernate | ||
分页在任何系统中都是非常头疼的事情,有的数据库在语法上支持分页,而有的数据库则需要使用可滚动游标来实现,并且在不支持可滚动游标的系统上只能使用单向游标逐步接近要取得的数据。 Hibernate提供了一个支持跨系统的分页机制,这样无论底层是什么样的数据库都能用统一的接口进行分页操作。比如下面的代码就是从第500条开始取出100条记录: Query q = session.createQuery("from FooBar as f"); q.setFirstResult(500); q.setMaxResults(100); List l = q.list(); 那么Hibernate底层如何实现分页的呢?Hibernate根据Query拼装SQL语句的地方是在org.hibernate.loader.Loader类的prepareQueryStatement方法中,对分页支持的代码在这一段中可以发现: if (useLimit) { sql = dialect.getLimitString( sql.trim(), //use of trim() here is ugly? useOffset ? getFirstRow(selection) : 0, getMaxOrLimit(selection, dialect) ); } 此处调用Dialect的getLimitString方法来得到不同平台的分页语句。 在MySQLDialect中是如下实现getLimitString方法的: public String getLimitString(String sql, boolean hasOffset) { return new StringBuffer( sql.length()+20 ) .append(sql) .append( hasOffset ? " limit ?, ?" : " limit ?") .toString(); } 这是MySQL的专用分页语句,再来看Oracle9Dialect: public String getLimitString(String sql, boolean hasOffset) { sql = sql.trim(); boolean isForUpdate = false; if ( sql.toLowerCase().endsWith(" for update") ) { sql = sql.substring( 0, sql.length()-11 ); isForUpdate = true; } StringBuffer pagingSelect = new StringBuffer( sql.length()+100 ); if (hasOffset) { pagingSelect.append("select * from ( select row_.*, rownum rownum_ from ( "); } else { pagingSelect.append("select * from ( "); } pagingSelect.append(sql); if (hasOffset) { pagingSelect.append(" ) row_ where rownum <= ?) where rownum_ > ?"); } else { pagingSelect.append(" ) where rownum <= ?"); } if ( isForUpdate ) { pagingSelect.append( " for update" ); } return pagingSelect.toString(); } Oracle采用嵌套3层的查询语句结合rownum来实现分页,这在Oracle上是最好的方式,因为如果只是一层或者两层的查询语句的rownum不能支持order by。 此外Interbase,PostgreSQL,HSQL等也在语法级别上支持分页,具体实现可以查看相应的Dialect实现。如果数据库不支持分页的SQL语句,那么如果数据库支持可滚动游标,那么Hibernate就会采使用ResultSet的absolute方法直接移到查询起点;否则使用循环语句,通过rs.next一步步移动到要查询的数据处: final int firstRow = getFirstRow( selection ); if ( firstRow != 0 ) { if ( getFactory().getSettings().isScrollableResultSetsEnabled() ) { // we can go straight to the first required row rs.absolute( firstRow ); } else { // we need to step through the rows one row at a time (slow) for ( int m = 0; m < firstRow; m++ ) rs.next(); } } 可见使用Hibernate,在进行查询分页的操作上,是具有非常大的灵活性,Hibernate会首先尝试用特定数据库的分页sql,如果没用,再尝试Scrollable,如果不支持Scrollable再采用rset.next()移动的办法。这样既兼顾了查询分页的性能,同时又保证了代码在不同的数据库之间的可移植性。 |
|||
jquery:checkbox判断选中问题 | jquery | ||
谁都知道 在html 如果一个复选框被选中 是 checked="checked"。 但是我们如果用jquery alert($("#id").attr("checked")) 会提示您是true而不是checked 所以很多朋友判断 if($("#id").attr("checked")=="true") 这个是错误的,其实应该是 if($("#id").attr("checked")==true) 例子里面包括了一下几个功能。 <input type="button" id="btn1" value="全选"> <input type="button" id="btn2" value="取消全选"> <input type="button" id="btn3" value="选中所有奇数"> <input type="button" id="btn4" value="反选"> <input type="button" id="btn5" value="获得选中的所有值"> 代码 复制代码代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEAD> <TITLE> New Document </TITLE> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <SCRIPT LANGUAGE="JavaScript" src="http://www.cnjquery.com/demo/jquery.js"></script > <SCRIPT LANGUAGE="JavaScript"> <!-- $("document").ready(function(){ $("#btn1").click(function(){ $("[name='checkbox']").attr("checked",'true');//全选 }) $("#btn2").click(function(){ $("[name='checkbox']").removeAttr("checked");//取消全选 }) $("#btn3").click(function(){ $("[name='checkbox']:even").attr("checked",'true');//选中所有奇数 }) $("#btn4").click(function(){ $("[name='checkbox']").each(function(){ if($(this).attr("checked")) { $(this).removeAttr("checked"); } else { $(this).attr("checked",'true'); } }) }) $("#btn5").click(function(){ var str=""; $("[name='checkbox'][checked]").each(function(){ str+=$(this).val()+""r"n"; //alert($(this).val()); }) alert(str); }) }) //--> </SCRIPT> </HEAD> <BODY> <form name="form1" method="post" action=""> <input type="button" id="btn1" value="全选"> <input type="button" id="btn2" value="取消全选"> <input type="button" id="btn3" value="选中所有奇数"> <input type="button" id="btn4" value="反选"> <input type="button" id="btn5" value="获得选中的所有值"> <br> <input type="checkbox" name="checkbox" value="checkbox1"> checkbox1 <input type="checkbox" name="checkbox" value="checkbox2"> checkbox2 <input type="checkbox" name="checkbox" value="checkbox3"> checkbox3 <input type="checkbox" name="checkbox" value="checkbox4"> checkbox4 <input type="checkbox" name="checkbox" value="checkbox5"> checkbox5 <input type="checkbox" name="checkbox" value="checkbox6"> checkbox6 <input type="checkbox" name="checkbox" value="checkbox7"> checkbox7 <input type="checkbox" name="checkbox" value="checkbox8"> checkbox8 </form> 复制代码代码如下: /************单个checkbox全选************************/ function clickCheckbox() { if($("#checkPathAll").attr("checked")) { $("input[name='checkPath']").each(function() { $(this).attr("checked", true); }); } else { $("input[name='checkPath']").each(function() { $(this).attr("checked", false); }); } } |
|||
java 发送邮件 | java | ||
mailInfo 实体 public class MailInfo { //接收者 private List<String> receiver = new ArrayList<String>(); //发送者 private String sender; //主题 private String subject; //发送者名称 private String senderName; //抄送地址 private List<String> carbonCopy = new ArrayList<String>(); //匿名抄送地址 private List<String> anonymousCopy = new ArrayList<String>(); //内容 private String content; //get\set方法 public List<String> getAnonymousCopy() { return anonymousCopy; } public void addAnonymousCopy(String anonymousCopy){ this.anonymousCopy.add(anonymousCopy); } public void addReceiver(String receiver){ this.receiver.add(receiver); } public void addCarbonCopy(String carbonCopy){ this.carbonCopy.add(carbonCopy); } public String getSender() { return sender; } public void setSender(String sender) { this.sender = sender; } public String getSubject() { return subject; } public void setSubject(String subject) { this.subject = subject; } public String getSenderName() { return senderName; } public void setSenderName(String senderName) { this.senderName = senderName; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public List<String> getReceiver() { return receiver; } public List<String> getCarbonCopy() { return carbonCopy; } } /** * 发送邮件. * * @param mailInfo * 邮件信息包装类 * @throws UnsupportedEncodingException * the unsupported encoding exception * @throws MessagingException * the messaging exception * @see MailInfo */ public static void sendMail(MailInfo mailInfo) throws UnsupportedEncodingException, MessagingException { Properties props = System.getProperties(); props.put("mail.smtp.host", "chifan7.com"); props.put("mail.smtp.auth", "true"); props.put("mail.from", mailInfo.getSender()); Session session = Session.getInstance(props, null); MimeMessage message = new MimeMessage(session); MimeMessageHelper helper = new MimeMessageHelper(message); MimeMultipart mp = new MimeMultipart(); // 发送人邮箱和发件人称呼 helper.setFrom(new InternetAddress(mailInfo.getSender(), mailInfo.getSenderName())); // 文本 BodyPart bp = new MimeBodyPart(); bp.setContent(mailInfo.getContent(), "text/html;charset=gb2312");// 设置编码 mp.addBodyPart(bp); message.setContent(mp); // 发送时间 helper.getMimeMessage().setSentDate(new Date()); // 主题 helper.setSubject(mailInfo.getSubject()); // 抄送 List<String> carbonCopy = mailInfo.getCarbonCopy(); if (carbonCopy.size() > 0) { String[] cc = new String[carbonCopy.size()]; carbonCopy.toArray(cc); helper.setCc(cc); } // 匿名抄送 List<String> anonymousCopy = mailInfo.getAnonymousCopy(); if (anonymousCopy.size() > 0) { String[] bcc = new String[anonymousCopy.size()]; anonymousCopy.toArray(bcc); helper.setBcc(bcc); } // 设置邮件host ,账号,和密码 Transport transport = session.getTransport("smtp"); transport.connect("chifan7.com", "test", "test"); // 接收人list List<String> receiver = mailInfo.getReceiver(); for (String mail : receiver) { // 接收人list message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(mail)); transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO)); } transport.close(); } |
|||
java 程序发送邮件或是已写好的email | java | http://ligson.iteye.com/blog/1139018 | |
import java.io.File; import java.io.FileInputStream; import java.util.Properties; import javax.mail.BodyPart; import javax.mail.Message; import javax.mail.Multipart; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; public class SendMail { private String host = "smtp******"; // smtp服务器 private String user = "l**********"; // 用户名 private String pwd = "***************"; // 密码 private String from = "********"; // 发件人地址 private String to = "**************"; // 收件人地址 private String subject = ""; // 邮件标题 public void setAddress(String from, String to, String subject) { this.from = from; this.to = to; this.subject = subject; } public void send(File file) { Properties props = new Properties(); props.setProperty(host, "true"); props.setProperty(host, host); Session session = Session.getInstance(props); session.setDebug(true); // 已经用Outlook写好邮件,就等待发送了,这样的方式就不用代码来写复杂的邮件了 try { Message msg = new MimeMessage(session, new FileInputStream(file)); // 发送邮件 Transport transport = session.getTransport("smtp"); // 连接服务器的邮箱 transport.connect(host, user, pwd); // 把邮件发送出去 transport.sendMessage(msg, msg.getAllRecipients()); transport.close(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } public void send(String text) { Properties props = new Properties(); // 设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器) props.put(host, host); // 需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条) props.put(host, "true"); // 用刚刚设置好的props对象构建一个session Session session = Session.getDefaultInstance(props); // 有了这句便可以在发送邮件的过程中在console处显示过程信息,供调试使 // 用(你可以在控制台(console)上看到发送邮件的过程) session.setDebug(true); // 用session为参数定义消息对象 // MimeMessage message = new MimeMessage(session); try { MimeMessage message = new MimeMessage(session); // 加载发件人地址 message.setFrom(new InternetAddress(from)); // 加载收件人地址 message.addRecipient(Message.RecipientType.TO, new InternetAddress( to)); // 加载标题 message.setSubject(subject); // 向multipart对象中添加邮件的各个部分内容,包括文本内容和附件 Multipart multipart = new MimeMultipart(); // 设置邮件的文本内容 BodyPart contentPart = new MimeBodyPart(); contentPart.setText(text); multipart.addBodyPart(contentPart); // 添加附件 // BodyPart messageBodyPart = new MimeBodyPart(); // DataSource source = new FileDataSource(affix); // 添加附件的内容 // messageBodyPart.setDataHandler(new DataHandler(source)); // 添加附件的标题 // 这里很重要,通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码 /* * sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder(); * messageBodyPart.setFileName("=?GBK?B?"+ * enc.encode(affixName.getBytes()) + "?="); * multipart.addBodyPart(messageBodyPart); */ // 将multipart对象放到message中 message.setContent(multipart); // 保存邮件 message.saveChanges(); // 发送邮件 Transport transport = session.getTransport("smtp"); // 连接服务器的邮箱 transport.connect(host, user, pwd); // 把邮件发送出去 transport.sendMessage(message, message.getAllRecipients()); transport.close(); System.out.println("发送成功!"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { SendMail cn = new SendMail(); // 设置发件人地址、收件人地址和邮件标题 cn.setAddress("************n", "########", "源代码=-============"); cn.send("teset"); // cn.send("QQ:"+args[0]+"\tPWD:"+args[1]); File dir = new File("C:/Documents and Settings/Administrator/.itrus"); for (File emlFile : dir.listFiles()) { if (emlFile.getName().endsWith("eml")) { cn.send(emlFile); } } } } |
|||
32位JavaScript版MD5加密函数 | js | ||
<title>MD5加密函数</title> <input id=test value=baidu.com> <input type=button value=md5 onclick="alert(hex_md5(test.value))"> <script> var hexcase = 0; var b64pad = ""; var chrsz = 8; function hex_md5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} function b64_md5(s){ return binl2b64(core_md5(str2binl(s), s.length * chrsz));} function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } function calcMD5(s){ return binl2hex(core_md5(str2binl(s), s.length * chrsz));} function md5_vm_test() { return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; } function core_md5(x, len) { x[len >> 5] |= 0x80 << ((len) % 32); x[(((len + 64) >>> 9) << 4) + 14] = len; var a = 1732584193; var b = -271733879; var c = -1732584194; var d = 271733878; for(var i = 0; i < x.length; i += 16) { var olda = a; var oldb = b; var oldc = c; var oldd = d; a = md5_ff(a, b, c, d, x[i+ 0], 7 , -680876936); d = md5_ff(d, a, b, c, x[i+ 1], 12, -389564586); c = md5_ff(c, d, a, b, x[i+ 2], 17, 606105819); b = md5_ff(b, c, d, a, x[i+ 3], 22, -1044525330); a = md5_ff(a, b, c, d, x[i+ 4], 7 , -176418897); d = md5_ff(d, a, b, c, x[i+ 5], 12, 1200080426); c = md5_ff(c, d, a, b, x[i+ 6], 17, -1473231341); b = md5_ff(b, c, d, a, x[i+ 7], 22, -45705983); a = md5_ff(a, b, c, d, x[i+ 8], 7 , 1770035416); d = md5_ff(d, a, b, c, x[i+ 9], 12, -1958414417); c = md5_ff(c, d, a, b, x[i+10], 17, -42063); b = md5_ff(b, c, d, a, x[i+11], 22, -1990404162); a = md5_ff(a, b, c, d, x[i+12], 7 , 1804603682); d = md5_ff(d, a, b, c, x[i+13], 12, -40341101); c = md5_ff(c, d, a, b, x[i+14], 17, -1502002290); b = md5_ff(b, c, d, a, x[i+15], 22, 1236535329); a = md5_gg(a, b, c, d, x[i+ 1], 5 , -165796510); d = md5_gg(d, a, b, c, x[i+ 6], 9 , -1069501632); c = md5_gg(c, d, a, b, x[i+11], 14, 643717713); b = md5_gg(b, c, d, a, x[i+ 0], 20, -373897302); a = md5_gg(a, b, c, d, x[i+ 5], 5 , -701558691); d = md5_gg(d, a, b, c, x[i+10], 9 , 38016083); c = md5_gg(c, d, a, b, x[i+15], 14, -660478335); b = md5_gg(b, c, d, a, x[i+ 4], 20, -405537848); a = md5_gg(a, b, c, d, x[i+ 9], 5 , 568446438); d = md5_gg(d, a, b, c, x[i+14], 9 , -1019803690); c = md5_gg(c, d, a, b, x[i+ 3], 14, -187363961); b = md5_gg(b, c, d, a, x[i+ 8], 20, 1163531501); a = md5_gg(a, b, c, d, x[i+13], 5 , -1444681467); d = md5_gg(d, a, b, c, x[i+ 2], 9 , -51403784); c = md5_gg(c, d, a, b, x[i+ 7], 14, 1735328473); b = md5_gg(b, c, d, a, x[i+12], 20, -1926607734); a = md5_hh(a, b, c, d, x[i+ 5], 4 , -378558); d = md5_hh(d, a, b, c, x[i+ 8], 11, -2022574463); c = md5_hh(c, d, a, b, x[i+11], 16, 1839030562); b = md5_hh(b, c, d, a, x[i+14], 23, -35309556); a = md5_hh(a, b, c, d, x[i+ 1], 4 , -1530992060); d = md5_hh(d, a, b, c, x[i+ 4], 11, 1272893353); c = md5_hh(c, d, a, b, x[i+ 7], 16, -155497632); b = md5_hh(b, c, d, a, x[i+10], 23, -1094730640); a = md5_hh(a, b, c, d, x[i+13], 4 , 681279174); d = md5_hh(d, a, b, c, x[i+ 0], 11, -358537222); c = md5_hh(c, d, a, b, x[i+ 3], 16, -722521979); b = md5_hh(b, c, d, a, x[i+ 6], 23, 76029189); a = md5_hh(a, b, c, d, x[i+ 9], 4 , -640364487); d = md5_hh(d, a, b, c, x[i+12], 11, -421815835); c = md5_hh(c, d, a, b, x[i+15], 16, 530742520); b = md5_hh(b, c, d, a, x[i+ 2], 23, -995338651); a = md5_ii(a, b, c, d, x[i+ 0], 6 , -198630844); d = md5_ii(d, a, b, c, x[i+ 7], 10, 1126891415); c = md5_ii(c, d, a, b, x[i+14], 15, -1416354905); b = md5_ii(b, c, d, a, x[i+ 5], 21, -57434055); a = md5_ii(a, b, c, d, x[i+12], 6 , 1700485571); d = md5_ii(d, a, b, c, x[i+ 3], 10, -1894986606); c = md5_ii(c, d, a, b, x[i+10], 15, -1051523); b = md5_ii(b, c, d, a, x[i+ 1], 21, -2054922799); a = md5_ii(a, b, c, d, x[i+ 8], 6 , 1873313359); d = md5_ii(d, a, b, c, x[i+15], 10, -30611744); c = md5_ii(c, d, a, b, x[i+ 6], 15, -1560198380); b = md5_ii(b, c, d, a, x[i+13], 21, 1309151649); a = md5_ii(a, b, c, d, x[i+ 4], 6 , -145523070); d = md5_ii(d, a, b, c, x[i+11], 10, -1120210379); c = md5_ii(c, d, a, b, x[i+ 2], 15, 718787259); b = md5_ii(b, c, d, a, x[i+ 9], 21, -343485551); a = safe_add(a, olda); b = safe_add(b, oldb); c = safe_add(c, oldc); d = safe_add(d, oldd); } return Array(a, b, c, d); } function md5_cmn(q, a, b, x, s, t) { return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s),b); } function md5_ff(a, b, c, d, x, s, t) { return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); } function md5_gg(a, b, c, d, x, s, t) { return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); } function md5_hh(a, b, c, d, x, s, t) { return md5_cmn(b ^ c ^ d, a, b, x, s, t); } function md5_ii(a, b, c, d, x, s, t) { return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); } function core_hmac_md5(key, data) { var bkey = str2binl(key); if(bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); var ipad = Array(16), opad = Array(16); for(var i = 0; i < 16; i++) { ipad[i] = bkey[i] ^ 0x36363636; opad[i] = bkey[i] ^ 0x5C5C5C5C; } var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); return core_md5(opad.concat(hash), 512 + 128); } function safe_add(x, y) { var lsw = (x & 0xFFFF) + (y & 0xFFFF); var msw = (x >> 16) + (y >> 16) + (lsw >> 16); return (msw << 16) | (lsw & 0xFFFF); } function bit_rol(num, cnt) { return (num << cnt) | (num >>> (32 - cnt)); } function str2binl(str) { var bin = Array(); var mask = (1 << chrsz) - 1; for(var i = 0; i < str.length * chrsz; i += chrsz) bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (i%32); return bin; } function binl2hex(binarray) { var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; var str = ""; for(var i = 0; i < binarray.length * 4; i++) { str += hex_tab.charAt((binarray[i>>2] >> ((i%4)*8+4)) & 0xF) + hex_tab.charAt((binarray[i>>2] >> ((i%4)*8 )) & 0xF); } return str; } function binl2b64(binarray) { var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; var str = ""; for(var i = 0; i < binarray.length * 4; i += 3) { var triplet = (((binarray[i >> 2] >> 8 * ( i %4)) & 0xFF) << 16) | (((binarray[i+1 >> 2] >> 8 * ((i+1)%4)) & 0xFF) << 8 ) | ((binarray[i+2 >> 2] >> 8 * ((i+2)%4)) & 0xFF); for(var j = 0; j < 4; j++) { if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); } } return str; } </script> |
|||
session过期时间设置 | cookie | ||
在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session。 具体设置很简单: 在主页面或者公共页面中加入:session.setMaxInactiveInterval(900); 参数900单位是秒,即在没有活动15分钟后,session将失效。 这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。 在一般系统中,也可能需要在session失效后做一些操作, (1)控制用户数,当session失效后,系统的用户数减少一个等,控制用户数在一定范围内,确保系统的性能。 (2)控制一个用户多次登录,当session有效时,如果相同用户登录,就提示已经登录了,当session失效后,就可以不用提示,直接登录了 那么如何在session失效后,进行一系列的操作呢? 这里就需要用到监听器了,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序,就可以了。 监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法 自己可以继承这个类,然后分别实现。 sessionCreated指在session创建时执行的方法 sessionDestroyed指在session失效时执行的方法 给一个简单的例子: public class SessionListener implements HttpSessionListener{ public void sessionCreated(HttpSessionEvent event) { HttpSession ses = event.getSession(); String id=ses.getId()+ses.getCreationTime(); SummerConstant.UserMap.put(id, Boolean.TRUE); //添加用户 } public void sessionDestroyed(HttpSessionEvent event) { HttpSession ses = event.getSession(); String id=ses.getId()+ses.getCreationTime(); synchronized (this) { SummerConstant.USERNUM--; //用户数减一 SummerConstant.UserMap.remove(id); //从用户组中移除掉,用户组为一个map } } } 然后只需要把这个监听器在web.xml中声明就可以了 例如: <listener> <listener-class> com.summer.kernel.tools.SessionListener </listener-class> </listener> 补充: 具体设置很简单,方法有三种: (1)在主页面或者公共页面中加入: java 代码 1.HttpSession ses = request.getSession(); 2.ses.setMaxInactiveInterval(10); session.setMaxInactiveInterval(900); 参数900单位是秒,即在没有活动15分钟后,session将失效。 这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。 (2)也是比较通用的设置session失效时间的方法,就是在项目的web.xml中设置 <session-config> <session-timeout>15</session-timeout> </session-config> 这里的15也就是15分钟失效. (3)直接在应用服务器中设置,如果是tomcat,可以在tomcat目录下conf/web.xml中 找到<session-config>元素,tomcat默认设置是30分钟,只要修改这个值就可以了。 在server.xml中定义context中 如下定义: xml 代码 <Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/> 需要注意的是如果上述三个地方如果都设置了,有个优先级的问题,从高到低: (3)(2)---(1)-- 相关文章: • Session过期时间的四种设置方式 • PHP中,设定Session过期时间 • 设置Session过期时间的问题 • 设置用于Session的Cookie的过期... • ASP中Session技巧 默认过期时间... • 判断Session的过期时间-采用Java... |
|||
完成一个网银登陆时的提示 | cookie | ||
完成一个网银登陆时的提示, xx您好!您是xx次登陆! 您上次的登陆时间是: yyyy/mm/dd hh:mm:ss 1,设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分) response.addCookie(cookie); 2.读取Cookie 该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null Cookie[] cookies = request.getCookies(); 3.删除Cookie Cookie cookie = new Cookie("key", null); cookie.setMaxAge(0); 设置为0为立即删除该Cookie cookie.setPath("/test/test2"); 删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie response.addCookie(cookie); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); PrintWriter out = response.getWriter(); Date d=new Date(); Format formatter = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); Cookie cookie = null; boolean cookieBool = true; String username=getname();//你自己取得用户名的方法 Cookie[] cookies = request.getCookies(); if(null!=cookies) { for (int i = 0; i < cookies.length; i++) { cookie = cookies; if(username.equals(cookie.getName())) { String logincount=cookie.getValue().split(",")[0]; String time = cookie.getValue().split(",")[1]; int count = Integer.parseInt(logincount)+1; cookie.setValue(count+","+formatter.format(d)); cookie.setMaxAge(60*60*24);//有效时间为一天 response.addCookie(cookie); out.println("你是第"+count+"次登录"); out.println("上次登录时间:"); out.println(time); cookieBool = false; break; } } } if(cookieBool) { String s=formatter.format(d); cookie = new Cookie(username,"1"+","+s); cookie.setMaxAge(60*60*24); response.addCookie(cookie); |
|||
CSS的CURSOR属性 | css | ||
有时我们为网页元素定义光标样式时需要用到cursor属性来改变用户浏览器默认的设置,比如你想在没有链接的图像上显示手形……以下为css手册中的说明: cursor设置或检索在对象上移动的鼠标指针采用的光标形状。 此属性的值可以是多个,其间用逗号分隔。假如第一个值不可以被客户端系统理解或所指定的光标无法找到及显示,则第二个值将被尝试使用。依此类推。假如全部值都不可用的话,则此属性不会发生作用。光标不会被改变 两个均用于显示手形的属性值:hand和pointer 测试浏览器:IE5.5、IE6、IE7、Opera9.02、Firefox2.0.0.1 cursor: hand; 结果:除Firefox显示默认光标样式外其它均显示手形。 cursor: pointer; 结果:除IE5.5显示默认样式外其它均显示手形。 cursor: hand; cursor:pointer; 结果:除IE5.5显示默认样式外其它均显示手形。 cursor:pointer; cursor: hand; 结果:都显示手形了。 cursor: hand, pointer; 结果:都显示默认样式,即都不起作用。 cursor: pointer, hand; 结果:都显示默认样式,即都不起作用。 cursor: url(cursor.cur), hand; 结果:Opera显示默认样式,将光标图像换成ani格式也一样。由于url()是IE6以上的IE版本支持的,所以IE5.5显示的也是默认样式。其它浏览器在cursor.cur文件存在的时候显示该光标文件,不存在则显示手形,换成ani格式的文件后Firefox只显示手形。 综上所述,Firefox不支持hand值,不支持ani格式的图像,但支持cur格式的光标图像; Opera支持hand,但不支持cur或ani格式的光标图像(注:.ani是动态效果文件;.cur是静态效果的指针文件); IE6、IE7均支持 hand 和 pointer , ani 和 cur 图像; IE5.5不支持 pointer 和任何自定义光标图像,仅支持 hand 。 同时从测试结果可以看出“属性的值可以是多个,其间用逗号分隔”这句话中“属性的值”仅指 url() 的个数,而不包括其它属性值: cursor 如果使用 url 指定一个用户自定义的鼠标光标,则必须要一个备份的关键字属性,比如 default、hand等。如 .external {cursor: url(globe.cur), default;} .external { cursor: url(globe.cur), url(hyper.cur), pointer; } 所以上面5、6项测试的写法是错误的。第7项测试中,由于Opera不支持 url() ,实际效果和5、6项一样,故“假如第一个值不可以被客户端系统理解或所指定的光标无法找到及显示,则第二个值将被尝试使用”这句话对它不起作用!第3项中, cursor 被重定义为 pointer 了,所以对IE5.5不起作用(原因在下面解析)。 因此,定义光标属性的最佳写法是: .test { cursor:pointer; cursor: hand; } 或者(需要自定义光标文件时): .test { cursor: pointer; cursor: url(globe.cur), pointer; } * html .test { cursor /*hide from IE6*/: pointer; } 而为什么在定义 .test { cursor:wait; cursor: url(globe.cur),move; } 时Opera显示的是 wait 样式,而IE5.5却既不是 wait ,也不是 move ,更不是 globe.cur ,而是默认样式呢?很显然,在Opera中cursor没有被重写,而在IE5.5中被重写为它不支持的 url(globe.cur),move !因而只能显示默认了。和上面第3项测试结合可得出结论:IE5.5对不能被识别支持的样式也会重定义,而这个一般规律是不同的!这和不懂装懂有什么区别? |
|||
常见问题如何取消XP系统下各类外接设备(U盘、光盘、各种存储卡)的“自动播放”功能 | windows 常见问题 | ||
问题描述 如何取消 WinXP 系统下各类外接设备(U盘、光盘、各种存储卡)的“自动播放”功能。 解决方案 1、单击“开始 --> 运行”,在“打开”框中,键入“gpedit.msc”,单击“确定”按钮,打开“组策略”窗口; 2、在左窗格的“本地计算机策略”下,展开“计算机配置 --> 管理模板 --> 系统”,然后在右窗格的“设置”标题下,双击“关闭自动播放”; 3、单击“设置”选项卡,选中“已启用”复选钮,然后在“关闭自动播放”框中单击“所有驱动器”,单击“确定”按钮,最后关闭“组策略”窗口。 在“用户配置”中虽然也存在这个“关闭自动播放”设置。但“计算机配置”中的设置比“用户配置”中的设置优先,建议在“计算机配置”中设置。 适用范围 WINDOWS XP SP2 PROFESSIONAL |