maxl@forugame.com
2008.8.3
LINUX创建用户的命令
useradd -g test -d /home/test1 -s /etc/bash -m test1
注解:-g 所属组 -d 家目录 -s 所用的SHELL
删除用户命令
userdel -r test1
创建密码命令
passwd
1.创建cvs组和用户
useradd cvs # 创建cvs账户
passwd cvs # 配置密码
groupadd # 创建cvs组
groupmod –A cvs cvs # 将cvs用户添加到cvs组
2.创建仓库和初始化仓库
mkdir /usr/local/cvs # 创建cvs仓库
cvs –d /usr/local/cvs init # 初始化cvs仓库
解压该包并安装:
# tar zxvf cvs-1.11.21.tar.gz
进入解压包 cvs-1.11.21
创建文件:touch
: w filename (输入 「w filename」将文章以指定的文件名filename保存)
: wq (输入「wq」,存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)
所有服务的启动脚本都在/etc/init.d/里
service xinetd restart
CVS安装:
运行./configure --prefix=你想安装的路径(绝对路径)
运行 make 运行 make install
CVS环境变量
vi /etc/profile
(1)vi /etc/xinetd.d/cvs
service cvspserver
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/mylib pserver #注,此处即repository将来就init这个目录即可,否则客户端连的时候会提示“no such repository”
}
(2)由于不允许root从客户端连,所以我们在此创建非root用于cvs操作,下面开始:
(3)su root
(4)mkdir /mylib ,建个目录用来放repository
(5)groupadd cvsgroup,建cvs组
(6)useradd cvsuser -g cvsgroup,添加cvs用户
(7)chown -R cvsuser /mylib,更改归属owner
(8)chgrp -R cvs /mylib,更改归属组
(9)su cvsuser
(10)cvs -d /mylib init,用cvsueser初始化一个repository
(11)su root
(12)rcxinetd restart,重启cvs server服务
(13)nmap localhost,查看2401端口的pserver是否在listen
yast 界面操作
groups 查看当前登录用户的组内成员
groups gliethttp 查看gliethttp用户所在的组,连同组内成员
whoami 查看当前登录用户名
/etc/group文档包含任何组
/etc/shadow和/etc/passwd系统存在的任何用户名
一开始创建了cvsroot用户,设置权限
#chown -R cvsroot.cvs /home/cvsroot
#chmod -R ug+rwx /home/cvsroot
#chmod 644 /home/cvsroot/CVSROOT/config
3.2.2. 设置加密文件为可执行:
cvsroot$ chmod a+x genpasswd.pl
系统用户密码:
vi /etc/shadow
//正确
1、建立cvs用户组
groupadd cvs
2、建立cvs组的cvsroot用户和所属的目录
useradd -g cvs -G cvs -d/home/cvsroot cvsroot
3、为cvsroot用户添加密码
passwd cvsroot
4、改变/home/cvsroot的目录属性
chmod 775 /home/cvsroot
5、初始化cvs源码库,此操作生成目录/home/cvsroot/CVSROOT,其下为一些初始化文件
cvs -d/home/cvsroot init
6、创建可以登陆cvs服务的用户及密码,需要创建文件passwd
必须说明的,cvs中默认一个用户checkout代码时候,会在当前模块下生成一个锁文件,如果这个用户对当前模块没有写权限,读是不可能的。配合上面的权限设置,必须改一下cvs服务器配置。改成不在当前模块目录下生成锁文件,把锁文件集中到一个所有用户都有读写权限的目录。修改配置文件CVSROOT/config:
# Put CVS lock files in this directory rather than directly in the repository.
#LockDir=/var/lock/cvs
把LockDir设上就可以了。
设置文件为可写: chmod 4+2 filename
端口:
netstat -tlna|grep :80|wc -l
JQUERY:2008-8-12
获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框
editSysPublicType!readXML.action?file=xml/cardpassword.xml
2008-8-15:
Spring AOP 写日志,取request、session、application
网上都说spring多好多好,哎,没办法,人家说的这么好,我就试着体会一下。先用AOP来写个日志,目标就是把所有前后台针对数据库操作的方法都记录下来,是谁操作,操作了那些类,操作的方法是什么,还有IP地址,
我的环境 spring+webwork+hibernate+oracle,你要是不知道什么是AOP还有webwork,那你自己看去。这里不作解释。最重要的一部就是在:MethodBeforeAdvice这个类的befor里面得到request或session或application,下面说一下我的思路:
1:我看了网上说的最多的就是ThreadLocal 或者是 acegi,后面我的大体的看了下,主要是用来权限控制的,要达到我的的目标我没有找到怎么实现的方法,
我现在就只说ThreadLocal,这个类很不错的,网上很多说法,我的理解就是保证每个线程都有一个独立的变量,我理解了以后就写了下面一个类:
package com.bjfy.util;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
public class BJFYThreadBean implements Serializable{
private static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();
public HttpServletRequest getContext(){
return (HttpServletRequest)threadLocal.get();
}
public void setContext(HttpServletRequest request){
threadLocal.set(request);
}
public void cleanContext(){
threadLocal.set(null);
}
}
我一下开始是在用户登 陆的时候给ThreadLocal附值的,但是在befor方法里面就有问题了,我用 System.out.println(new BJFYThreadBean().getContext()) [说明一下,我的BJFYThreadBean一开始存付的是Users,我的登陆用户信息类]的时候就出怪问题了:
有的为null,有的不为null,我下子就搞晕了,奶奶的,要不就是全为null,就不就是都不为null,后来我查了资料,明白是怎么回事了,这是服务器的问题:因为客户端发送的请求服务器是在进程池里面找一个空闲进程来在客户端的响应,
在登陆以后的页面再请求服务器的时候服务器分给的线程和原来登陆的线程不是同一个线程了,所以ThreadLocal里面的值就得不到了,我看到不为null的时候那是运气,是服务器给你处理的线程正好是你登陆时候用的线程,所以就不为null.
我一下想明白这里就好办了,现在要解决的就是怎么在进到befor方法的这个线程里面附上ThreadLocal呢?想了办天,我把webwork的FilterDispatcher进行了继承,下面是我的继承类:
package com.bjfy.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import com.bjfy.bean.Users;
import com.bjfy.util.BJFYThreadBean;
import com.opensymphony.webwork.dispatcher.FilterDispatcher;
public class WebWorkFilterDispatcher extends FilterDispatcher {
private BJFYThreadBean bJFYThreadBean;
public WebWorkFilterDispatcher(){
bJFYThreadBean =new BJFYThreadBean();
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
super.doFilter(arg0, arg1, arg2);
bJFYThreadBean.setContext((HttpServletRequest)arg0);
}
}
这样就可以保证befor里面得到当前的request了,不过你不要忘了把web.xml里面的配置改一下啊:
<filter>
<filter-name>webwork</filter-name>
<filter-class>com.bjfy.filter.WebWorkFilterDispatcher</filter-class>
<!-- <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class> -->
</filter>
我用的webwork,我想信框架这种鸟东西都是一样,struts你也改一下他的过滤类就可以了。搞了一天,就这点收获,如有不对,希望大家多多指教。只要不骂我就行了。
hibernate 日期查询的一点总结: 先说一下,我用的是Oracle。以下是我的表,很简单:table name: AAA
id varchar2(32)
name Date
我定义了二个日期,二种方式初始化:
Date d=new Date(1219987516734l);
Date dd= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2008-08-29 13:25:16");
同时我把插二条记录:
values('aaa','2008-08-29 13:25:16')
values('bbb','2008-08-29 13:25:16')
接下来我用 DetachedCriteria 来查询:代码如下:
DetachedCriteria dc= DetachedCriteria.forClass(Aaa.class);
dc.add(Restrictions.eq("name", dd));
//或 dc.add(Restrictions.eq("name", dd));
ContextUtil.getBJFYService().getBaseManager().searchByDetachedCriteria(dc).size();
这个时间用d这个日期一条也查不出来,用dd可以查出这二条来,我后来把name 的data类型改为: TIMESTAMP(6) ,把name的值分别改为d,和dd二个日期,
再查的时候就是一个日期一条,结果上面得出如下结论:
1:d.getTime()-dd.getTime()==743,也就是说d比dd多了743毫秒,oracle的date类型是不存储毫秒数的.所以我用d 在name是date类型的时候怎么写查不到记录,而TIMESTAMP(6) 有毫秒数
所以二个日期可以分别查到一条。
2:hibernate 的日期比较应该是用毫秒数进行比较的. 不管用什么,反正不是用下面这种方式比较:
select * from aaa where name=to_date('20080829132516','yyyymmddHH24miss')
2008-9-10:
一:javascript 日期比较:
var s = "2005-12-15";
var s2 = "2008-01-18";
var d = Date.parse(s.replace(/-/g,"/"));
var d2= Date.parse(s2.replace(/-/g,"/"));
if((d2-d)>0){
alert("2008-01-18>2005-12-15");
}
Hibernate 批量插入的测试:
最近在项目中做了一个充值卡的模块,用到了批量插入:我一开始用hibernate插入五十万条数据:选说一下我的记算机配置:
内存:1G,CPU:Pentium(R) 4 CPU 3.20GHz. 配置应该算是过时的了,
我的数据库是:oracle10G,数据库服务器在外地,我测试插入到十万条的时候用了二十五分钟,后来我把程序放到外网服务器:配置:酷睿2代 2.0,4G内存,
插入十万条是五分钟,速试是大大的提升,但是我还是感觉有点慢,后来我用JDBC的批处理:还是在我本地插入:10万条用时:不到1分钟,如果放到外网服务器就更快。
下面贴一下我的代码:hibernate批量导入代码:(只是部分代码,不能运行。)
public boolean addCardList( final SysCardImport sysCardImport,final Date date){
boolean bool =(Boolean) hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
boolean flag=true;
try {
int i=0;
String temp=sysCardImport.getCardSymbol(); //卡代号
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//取得充值卡类型值和面额值
SysPublictype cardType = (SysPublictype)session.get(SysPublictype.class, sysCardImport.getCardType());
SysPublictype cardMoney = (SysPublictype)session.get(SysPublictype.class, sysCardImport.getCardMoney());
temp+=cardType.getVchvalue();
temp+=cardMoney.getVchvalue();
String templeng[]=sysCardImport.getPasswordChar();
for(int len=0;len<templeng.length;len++){ //循环遍历充值卡加密字符串
String temparray[]=templeng[len].split(":");
String temps=temp+temparray[0]; //加密字符串代码
long cardnum=0;
List list= session.createQuery(" from SysCard t where t.vchcode like ? order by t.vchcode desc")
.setString(0, ""+temps+"%").list();
if(list.size()>0){
SysCard card=(SysCard)list.get(0);
cardnum = Long.valueOf(card.getVchcode().substring(10));
}
for(int num=0;num<sysCardImport.getCardAmount();num++){ //生成充值卡卡号
String cardroand="000000000"+(++cardnum);
cardroand=cardroand.substring(cardroand.length()-10);
SysCard sysCard=new SysCard();
SysPassword sysPassword=new SysPassword();
String password=BJFYSystemUtil.getRandomString(sysCardImport.getCardPasswordLength(),2);
sysCard.setVchcode(temps+cardroand);
sysCard.setNummoney(sysCardImport.getCardMoneys());
sysCard.setCstate("10");
sysCard.setDatcreate(date);
sysCard.setDatavailability(sdf.parse(sysCardImport.getCardDate()));
sysCard.setVchremark(sysCardImport.getCardRemark());
sysCard.setVchpassword(BJFYSystemUtil.getMD5(password+temparray[1]));
sysCard.setNumscale(sysCardImport.getCardScale());
sysCard.setVarkey(temparray[1]);
sysCard.setVchtype(cardType.getId());
sysPassword.setVchcode(temps+cardroand);
sysPassword.setVchpassword(password);
sysPassword.setVchpasschar(temparray[1]);
session.save(sysPassword);
session.save(sysCard);
if ((i + 1) % 1000 == 0) {
session.flush();
session.clear();
}
i++;
}
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
flag = false;
}
return flag;
}
});
return bool;
}
下面是JDBC批处理的代码:
public boolean addCardListByJdbc( final SysCardImport sysCardImport,final Date date){
boolean flag=true;
Connection con= this.hibernateTemplate.getSessionFactory().openSession().connection();
PreparedStatement stm=null;
PreparedStatement stm2=null;
try {
int i=0;
String temp=sysCardImport.getCardSymbol(); //卡代号
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//取得充值卡类型值和面额值
SysPublictype cardType = (SysPublictype)hibernateTemplate.get(SysPublictype.class, sysCardImport.getCardType());
SysPublictype cardMoney = (SysPublictype)hibernateTemplate.get(SysPublictype.class, sysCardImport.getCardMoney());
temp+=cardType.getVchvalue();
temp+=cardMoney.getVchvalue();
con.setAutoCommit(false);
stm=con.prepareStatement("insert into sys_card values(?,?,?,?,?,?,?,?,?,?)");
stm2=con.prepareStatement("insert into sys_password values(?,?,?)");
String templeng[]=sysCardImport.getPasswordChar();
for(int len=0;len<templeng.length;len++){ //循环遍历充值卡加密字符串
String temparray[]=templeng[len].split(":");
String temps=temp+temparray[0]; //加密字符串代码
long cardnum=0;
List list= hibernateTemplate.find(" from SysCard t where t.vchcode like ? order by t.vchcode desc", temps+"%");
if(list.size()>0){
SysCard card=(SysCard)list.get(0);
cardnum = Long.valueOf(card.getVchcode().substring(10));
}
for(int num=0;num<sysCardImport.getCardAmount();num++){ //生成充值卡卡号
String cardroand="000000000"+(++cardnum);
cardroand=cardroand.substring(cardroand.length()-10);
SysCard sysCard=new SysCard();
SysPassword sysPassword=new SysPassword();
String password=BJFYSystemUtil.getRandomString(sysCardImport.getCardPasswordLength(),2);
stm.setString(1,temps+cardroand);
stm.setString(2, BJFYSystemUtil.getMD5(password+temparray[1]));
stm.setLong(3, sysCardImport.getCardMoneys());
stm.setLong(4, sysCardImport.getCardScale());
stm.setString(5,cardType.getId() );
stm.setDate(6, new java.sql.Date(System.currentTimeMillis()));
stm.setDate(7, new java.sql.Date(date.getTime()));
stm.setString(8, "10");
stm.setString(9, temparray[1]);
stm.setString(10, sysCardImport.getCardRemark());
stm.addBatch();
stm2.setString(1, temps+cardroand);
stm2.setString(2, password);
stm2.setString(3,temparray[1]);
stm2.addBatch();
if ((i + 1) % 1000 == 0) {
stm.executeBatch();
stm2.executeBatch();
con.commit();
}
i++;
}
}
if(stm!=null) {
stm.executeBatch();
stm2.executeBatch();
con.commit();
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
flag = false;
}finally{
try {
con.close();
stm=null;
stm2=null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return flag;
}
综上所述,hibernate的批量更新和插入要创建和销毁大量的对象,尤其是带有复杂业务逻辑的,所以本人建议在大批量导入和更新时,最好使用JDBC的批处理.在批处理上hibernate和jdbc Batch不是一个等级的。
2008-9-13:
今天我做excel批量导入,在进行数据库操作的时候插入数据总是报错。错误信息如下: 后来查明是oracle版本的问题,正式数据库是10.2.1,现在的是10.2.2,我非常鬼火,还有以前做的项目,本机的jdk和服务器的jdk版本不一致,也会产生很多想不到的错误,今天得到的经验是:
不管在什么地方,什么时候,做什么项目,第一条:所有的配置环境必须一样。
2008-9-17:
java批量导入Excel的测试类。下面是代码
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import java.io.File;
import java.io.IOException;
import com.sun.corba.se.spi.ior.Writeable;
public class TestWExcel {
File file=new File("c:\\test.xls");
Workbook workbook;
public TestWExcel(){
try {
writableWorkbook=Workbook.createWorkbook(file);
writableWorkbook.createSheet("aaa", 100);
writableWorkbook.write();
writableWorkbook.close();
writableWorkbook=null;
if(writableWorkbook!=null){
writableWorkbook.write();
writableWorkbook.close();
writableWorkbook=null;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//writableWorkbook = Workbook.createWorkbook(file);
}
WritableSheet writableSheet=null;
WritableWorkbook writableWorkbook =null;
int num=0;
int foreach=0;
public void writeExc(){
try {
if(writableWorkbook==null){
workbook=Workbook.getWorkbook(file);
writableWorkbook = Workbook.createWorkbook(file,workbook);
System.out.println("FFFFFFFFFFFFFFFFFF"+writableWorkbook.getSheets().length);
writableSheet= writableWorkbook.createSheet("第"+foreach, foreach);
}
System.out.println(foreach+"::::"+writableWorkbook+"::::::::");
for(;num<2000;num++){
for(int s=0;s<7;s++){
writableSheet.addCell(new Label(s,num,"中华人民共和国"));
}
}
num=0;
writableWorkbook.write();
writableWorkbook.close();
workbook.close();
workbook=null;
writableWorkbook=null;
writableSheet=null;
if(foreach<=10){
foreach++;
System.out.println(foreach);
writeExc();
}
} catch (Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
new TestWExcel().writeExc();
}
}
2008-9-18: Liunx查看版本命令:
1:cat /etc/SuSE-release
2:uname -a
3:lsb_release -a
用root用户登陆到系统,打开一个终端输入
删除JDK
# rpm -qa|grep gcj
显示内容其中包含下面两行
# java-1.4.2-gcj-compat-1.4.2.0-27jpp
# java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
卸载
# rpm -e java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
# rpm -e java-1.4.2-gcj-compat-l.4.2.0-27jpp
卸载其他自己安装的JDK就直接用rpm -e <javaXXXXX>
filename.-misc-simsun-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/local/share/fonts/simsun.ttf
嘿嘿,今天不错,起的早到的早,没有迟到心情好。整理一下,最近关于文件操作的linux命令。主要对文件夹及文件操作命令。
功能:创建一个目录(类似MSDOS下的md命令)。
Linux目录的创建与删除命令
mkdir命令
功能:创建一个目录(类似MSDOS下的md命令)。
语法:mkdir [选项] dir-name
说明:该命令创建由dir-name命名的目录。要求创建目录的用户在当前目录中(dir-name的父目录中)具有写权限,并且dirname不能是当前目录中已有的目录或 文件名称。
命令中各选项的含义为:
- m 对新建目录设置存取权限。也可以用chmod命令设置。
- p 可以是一个路径名称。此时若路径中的某些目录尚不存在, 加上此选项后, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。
rmdir 命令
功能:删除空目录。
语法:rmdir [选项] dir-name
说明:dir-name表示目录名。该命令从一个目录中删除一个或多个子目录项。需要 特别注意的是,一个目录被删除之前必须是空的。rm - r dir命令可代替 rmdir,但是有危险性。删除某目录时也必须具有对父目录的写权限。
命令中各选项的含义为:
- p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应 的信息。
cd 命令
功能:改变工作目录。
语法:cd [directory]
说明:该命令将当前目录改变至directory所指定的目录。若没有指定directory, 则回到用户的主目录。为了改变到指定目录,用户必须拥有对指定目录的执行和读 权限。
该命令可以使用通配符。
pwd 命令
在Linux层次目录结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用 户目前处于哪一个目录中。要想知道当前所处的目录,可以使用pwd命令,该命令显示整个路径名。
语法:pwd
说明:此命令显示出当前工作目录的绝对路径。
ls 命令
ls是英文单词list的简写,其功能为列出目录的内容。这是用户最常用的一个命令之一,因为用户需要不时地查看某个目录的内容。该命令类似于DOS下的dir命令。
语法:ls [选项] [目录或是文件]
对于每个目录,该命令将列出其中的所有子目录与文件。对于每个文件,ls将输出 其文件名以及所要求的其他信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或是文件名时,就显示当前目录的信息。
命令中各选项的含义如下:
- a 显示指定目录下所有子目录与文件,包括隐藏文件。
- A 显示指定目录下所有子目录与文件,包括隐藏文件。但不列出“.”和 “..”。
- b 对文件名中的不可显示字符用八进制逃逸字符显示。
- c 按文件的修改时间排序。
- C 分成多列显示各项。
- d 如果参数是目录,只显示其名称而不显示其下的各文件。往往与l选项一起使 用,以得到目录的详细信息。
- f 不排序。该选项将使lts选项失效,并使aU选项有效。
- F 在目录名后面标记“/”,可执行文件后面标记“*”,符号链接后面标记 “@”,管道(或FIFO)后面标记“|”,socket文件后面标记“=”。
- i 在输出的第一列显示文件的i节点号。
- l 以长格式来显示文件的详细信息。这个选项最常用。
每行列出的信息依次是: 文件类型与权限 链接数 文件属主 文件属组 文件大小 建立或最近修改的时间 名字
对于符号链接文件,显示的文件名之后有“—〉”和引用文件路径名。
对于设备文件,其“文件大小”字段显示主、次设备号,而不是文件大小。
目录中的总块数显示在长格式列表的开头,其中包含间接块。
- L 若指定的名称为一个符号链接文件,则显示链接所指向的文件。
- m 输出按字符流格式,文件跨页显示,以逗号分开。
- n 输出格式与l选项相同,只不过在输出中文件属主和属组是用相应的UID号和 GID号来表示,而不是实际的名称。
- o 与l选项相同,只是不显示拥有者信息。
- p 在目录后面加一个“/”。
- q 将文件名中的不可显示字符用“?”代替。
- r 按字母逆序或最早优先的顺序显示输出结果。
- R 递归式地显示指定目录的各个子目录中的文件。
- s 给出每个目录项所用的块数,包括间接块。
- t 显示时按修改时间(最近优先)而不是按名字排序。若文件修改时间相同,则 按字典顺序。修改时间取决于是否使用了c或u选顶。缺省的时间标记是最后一次修 改时间。
- u 显示时按文件上次存取的时间(最近优先)而不是按名字排序。即将-t的时间 标记修改为最后一次访问的时间。
- x 按行显示出各排序项的信息。
用ls - l命令显示的信息中,开头是由10个字符构成的字符串,其中第一个字符表示文件类型,它可以是下述类型之一:
- 普通文件
d 目录
l 符号链接
b 块设备文件
c 字符设备文件
后面的9个字符表示文件的访问权限,分为3组,每组3位。
第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字 符分别表示对文件的读、写和执行权限。
各权限如下所示:
r 读
w 写
x 执行。对于目录,表示进入权限。
s 当文件被执行时,把该文件的UID或GID赋予执行进程的UID(用户ID)或GID(组 ID)。
t 设置标志位(留在内存,不被换出)。如果该文件是目录,在该目录中的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文件,在该文件执行 后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。 下一页介绍文件操作命令。
Linux文件的复制、删除和移动命令
语法: cp [选项] 源文件或目录 目标文件或目录
说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
该命令的各选项含义如下:
- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
- d 拷贝时保留链接。
- f 删除已经存在的目标文件而不提示。
- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
- l 不作拷贝,只是链接文件。
需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。
mv命令
用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同MSDOS下的ren和move的组合。
语法:mv [选项] 源文件或目录 目标文件或目录
说明:视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称 时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件 的链接也将丢失。
命令中各选项的含义为:
- I 交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答y或n,这样可以避免误覆盖文件。
- f 禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示,指定此选项后,i选项将不再起作用。
如果所给目标文件(不是目录)已存在,此时该文件的内容将被新文件覆盖。为防止用户用mv命令破坏另一个文件,使用mv命令移动文件时,最好使用i选项。
rm命令
用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。
rm命令的一般形式为:
rm [选项] 文件…
如果没有使用- r选项,则rm不会删除目录。
该命令的各选项含义如下:
- f 忽略不存在的文件,从不给出提示。
- r 指示rm将参数中列出的全部目录和子目录均递归地删除。
- i 进行交互式删除。
使用rm命令要小心。因为一旦文件被删除,它是不能被恢复的。了防止这种情况的发生,可以使用i选项来逐个确认要删除的文件。如果用户输入y,文件将被删除。如果输入任何其他东西,文件则不会删除。
2008-9-19:
liunx 的oracle \ tomcat JDK启动服务的问题。设置bin目录startup.sh文件。
export JAVA_HOME=/usr/java/jdk1.6.0_10
export JRE_HOME=/usr/java/jdk1.6.0_10/jre
2008-9-22: ireport+jasperreport+liunx画饼图乱码.
我最近用jasperreport画了一张饼图片放到liunx上面,示视的中文标题没有问题,画出来的饼图分类中文有乱码,这个问题搞了我好几天,我查网上都是说配置JDK的编码,考字体一大堆,后来我找到一个贴子,很简单的就搞定了,下面我说一下解决办法。
不管你的liunx装的是JDK还是jre,你只要$JAVA_HOME/ lib/fonts 然后执行: mkdir fallback . 然后把windows操作系统的C:\windows\fonts\simsun.ttc 改为 simsun.ttf,然后上传到liunx新建的文件夹:fallback.
2008-9-25:
今天要在liunx上面装apache,我是个菜鸟,搞了一上午,说一下几个重要的地方:我的apache版本:httpd-2.2.9.tar.gz,在安装之前,我要先说明一下,安装这个版本的东西你要先安装apr和apr-util,这二个东西都在这个包里面了。
安装是注意设置参数:--
用www.apache.org上下载的源码安装apache2,
Redhat AS 4
执行了configure,make后
make install时出错:
/bin/sh /usr/local/httpd-2.2.3/srclib/apr/libtool --mode=install /usr/bin/install -c -m 755 libaprutil-1.la /usr/local/apache2/lib
libtool: install: error: cannot install `libaprutil-1.la' to a directory not ending in /usr/local/apache22/lib
make[2]: *** [install] Error 1
经过折腾之后找到规律:
./configure
make
make install
顺序不会出错
./configure --prefix=/app/apache
make
make install
顺序就会出错...
分析:
从apache网站上下载的source code,应该不会有如此不能安装到非/usr/local目录的低级错误。
肯定是自己有疏忽,猜测可能是以前安装用过./configure 来直接安装到/usr/local/apache2
导致安装文件已经不太“干净”
解决:
删除source code目录,重新tar -zxvf下载的apache安装包,上面的问题解决。
后来google了下面一句:
If some options do not become active after doing a configure; make; make install, try to do a make clean after configure.
看来make clean也是一个解决方式.... 可叹以前重新编译Linux 内核的时候还用过它...四年不用就忘这么干净。
./apachectl -f /usr/httpd/apache2/conf/httpd.conf
--enable-so
--enable-ssl --enable-mods-shared=all
以下是OpenSSL成生密钥和证书的方法:
首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情:
o Creation of RSA, DH and DSA Key Parameters # 创建密钥 key
o Creation of X.509 Certificates, CSRs and CRLs # 创建证书
o Calculation of Message Digests #
o Encryption and Decryption with Ciphers # 加密、解密
o SSL/TLS Client and Server Tests # SSL 服务器端/客户端测试
o Handling of S/MIME signed or encrypted Mail # 处理签名或加密了的邮件
1、生成RSA密钥的方法
openssl genrsa -des3 -out privkey.pem 2048这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成:openssl genrsa -out privkey.pem 2048建议用2048位密钥,少于此可能会不安全或很快将不安全。
2、生成一个证书请求
openssl req -new -key privkey.pem -out cert.csr
这个命令将会生成一个证书请求,当然,用到了前面生成的密钥privkey.pem文件
这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。
如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem
3、使用数字证书和密钥
有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器
./configure --prefix=/apache/httpd --enable-ssl=static --with-ssl=/usr/local/ssl
.so的是动态模块,你已经把需要的模块都编译成静态的,当然看不到so文件,静态模块在配置不用LoadModule加载即可使用,执行httpd -l就可以看到你安装的apache静态模块。^_^
动态模块可以这么用(以deflate压缩模块为例):
/data1/apache2/bin/apxs -i -c ./httpd-2.0.59/modules/filters/mod_deflate.c
httpd.conf中添加:
LoadModule deflate_module modules/mod_deflate.so
liunx查找文件: find /路径 -name 文件名
<Directory "/usr/DMA/webapps">
Options None //避免目录被浏览
AllowOverride None
Order allow,deny
Allow from all
DirectoryIndex index.jsp
</Directory>
查看CPU主频: cat /proc/cpuinfo
<composite-id name= "c.id " class= "c unsaved-value= "none ">
<key-many-to-one name= "a " class= "a " column= "a.id"/>
<key-many-to-one name= "b " class= "b " column= "b.id"/>
</composite-id>
create database link DBLINK
connect to account identified by aaa
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 221.238.251.144)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = TJTEBAK)
)
)';
liunx xml编辑: syntax on
2008年10月15号:
hibernateTemplate.find方法后面数组参数中字符串数组可以,整型数组有问题,例:
list = hibernateTemplate.findByNamedParam("select t.vchmoduel from SysFunction t where t.id in ( :ids ) group by t.vchmoduel", "ids",list.toArray());
中ids是整型必须用findByNamedParam,如果是字符串,可以下面的形式写:
list = hibernateTemplate.find("select t.vchmoduel from SysFunction t where t.id in ( :ids ) group by t.vchmoduel",list.toArray());
javascript 随机数:
Math.round(Math.random()*6)
所有字符串替换: replace(/\-/g,'ddd')
2008年10月21号:
今天解决了问题很让我鬼火,我的文件上传公共类,在tomcat下运行很正常,到是到了apache+tomcat下面就报错,后来我仔细的一点一点的找,发现服务器返回来的字符串经过apache的时候就给我前后加了个<PRE></PRE>,不明白为什么!
2008年10月23日:
javascript 日期格式化:
Date.prototype.format = function(format) //author: meizz
{
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
(this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)if(new RegExp("("+ k +")").test(format))
format = format.replace(RegExp.$1,
RegExp.$1.length==1 ? o[k] :
("00"+ o[k]).substr((""+ o[k]).length));
return format;
}
2008-11-3:
java类 Test.java static{} 里面的代码执行问题,我测试,如果里面有常量 A ,静态变量 B 和静态方法 C,访问B和C都执行static,访问常量A不执行此代码
2008-11-5:
学习tomcat源码心得:
1:tomcat启动服务调用:((Lifecycle) server).start(),这里Lifecycle里面有很多实现类,他在启动执行org.apache.catalina.core.StandardServer.start()。
synchronized (services) {
for (int i = 0; i < services.length; i++) {
if (services[i] instanceof Lifecycle)
((Lifecycle) services[i]).start();
}
}
2:在JVM加载类的时候,需要经过三个步骤,装载、连接、初始化。装载就是找到相应的class文件,读入JVM,初始化就不用说了,最主要就说说连接。
连接分三步,第一步是验证class是否符合规格,第二步是准备,就是为类变量分配内存同时设置默认初始值,第三步就是解释,而这步就是可选的,根据上面loadClass方法的第二个参数来判定是否需要解释,所谓的解释根据《深入JVM》这本书的定义就是根据类中的符号引用查找相应的实体,再把符号引用替换成一个直接引用的过程。
2008-11-14:
javascript面向对象的理解,javascritp 没有java中的真正类,他们只有一个方法类,例如下面的代码:
function AAA(ss){
alert(ss);
}
function BBB(){
this.sub=AAA;
}
var b=new BBB();这时AAA不会初始化,b.sub也不会初始化,只有b.sub();的时候才能初始化AAA这个方法类.
2008-11-17:
select * from sys_card a where a.cstate=5 and not exists(select vchpay_order from chg_charge_log where vchpay_order=a.vchcode)
2008-11-24:
今天搞了一个验证码的问题,得到点经验,一个页面画二个image,连接地址分别是二个action,这个时候服务器会创建二个会员,而不是一个,搞了一下午的问题 ,就得到这么一句话。
2008-12-2:
javascript 里面的类继承中,this.property=类名 ,这个类是不会初始化的,如果要初始化,有二种方法:
1:初始化子类,执行property();
2: 在他的this.property=类名下面加一行代码: this.property();
2008-12-9:
今天学习了javascript 的 arguments关健字,是用来取参数的详细信息,例子如下:
function fun1(){
alert(arguments.callee.caller);
}
function fun2(obj){
var temp='传入的参数:'+obj+"\n\n";
temp+='传入参数的个数:'+arguments.length+"\n\n";
temp+='传入的详细信息:'+arguments.callee+"\n\n";
temp+='当前函数的调用者:'+arguments.callee.caller;
alert(temp);
arguments[2]();
}
fun2('dddddd','参数二',fun1);
select distinct t.ip from ttt t ,e where substr(t.ip,instr(t.ip,'.',1,1)+1,length(t.ip)) = substr(e.ip,instr(e.ip,'.',1,1)+1,length(e.ip))
2009-1-4:
java中内部类的初始化,代码如下: 这里说一下初始化的问题,在A的main 方法中,初始化是:new B();是报错的,在构造或其他的方法中是可以,想在main方法中初始化, 内部类B 必须定义为静态类。
public class A{
public class B{
}
}
服务器启动时间:2009-1-5 14:30
jdbc:microsoft:sqlserver://192.168.2.222:1433 com.microsoft.jdbc.sqlserver.SQLServerDriver
2009-2-20:
jquery 取parent.document.getElementById('bobo') 语法:$('#bobo',parent.document)
浅谈 openfire 用户密码加密的实现方法:
openfire 做为基于jabber协议的开源IM工具,有着非常不错的性能,和JWChat结合,自己感觉很完美,不说废话,这里说一下对openfire对注册用户的密码加密实现,这里先推荐一篇不错的文章:
http://hetylei.iteye.com/blog/290519,这篇文章进的不错,不过对我没有多大帮助,我看了openfire的连接方法,不是用的他说的JDBCAuthProvider,是通过DefaultAuthProvider,在这个类的140行左右有下面一句:
return AuthFactory.decryptPassword(encrypted); 这一句就是解密的字符串,我看到AuthFactory类里面的代码,实现解密和加密的核心类就是:org.jivesoftware.util.Blowflsh.java, BlowFish的算法大家看资料吧,
这个类可以实现了解密和加密,每次针对用户密码加密的字符串都不一样!
cvs -d :pserver:用户名@localhost:/var/cvsroot login
38 admin.authorizedJIDs admin@icbcoa-6ca65744
js 设置 document.body.clientHeight 或 scrollHeight
2008.8.3
LINUX创建用户的命令
useradd -g test -d /home/test1 -s /etc/bash -m test1
注解:-g 所属组 -d 家目录 -s 所用的SHELL
删除用户命令
userdel -r test1
创建密码命令
passwd
1.创建cvs组和用户
useradd cvs # 创建cvs账户
passwd cvs # 配置密码
groupadd # 创建cvs组
groupmod –A cvs cvs # 将cvs用户添加到cvs组
2.创建仓库和初始化仓库
mkdir /usr/local/cvs # 创建cvs仓库
cvs –d /usr/local/cvs init # 初始化cvs仓库
解压该包并安装:
# tar zxvf cvs-1.11.21.tar.gz
进入解压包 cvs-1.11.21
创建文件:touch
: w filename (输入 「w filename」将文章以指定的文件名filename保存)
: wq (输入「wq」,存盘并退出vi)
: q! (输入q!, 不存盘强制退出vi)
所有服务的启动脚本都在/etc/init.d/里
service xinetd restart
CVS安装:
运行./configure --prefix=你想安装的路径(绝对路径)
运行 make 运行 make install
CVS环境变量
vi /etc/profile
(1)vi /etc/xinetd.d/cvs
service cvspserver
{
disable = no
socket_type = stream
protocol = tcp
wait = no
user = root
server = /usr/bin/cvs
server_args = -f --allow-root=/mylib pserver #注,此处即repository将来就init这个目录即可,否则客户端连的时候会提示“no such repository”
}
(2)由于不允许root从客户端连,所以我们在此创建非root用于cvs操作,下面开始:
(3)su root
(4)mkdir /mylib ,建个目录用来放repository
(5)groupadd cvsgroup,建cvs组
(6)useradd cvsuser -g cvsgroup,添加cvs用户
(7)chown -R cvsuser /mylib,更改归属owner
(8)chgrp -R cvs /mylib,更改归属组
(9)su cvsuser
(10)cvs -d /mylib init,用cvsueser初始化一个repository
(11)su root
(12)rcxinetd restart,重启cvs server服务
(13)nmap localhost,查看2401端口的pserver是否在listen
yast 界面操作
groups 查看当前登录用户的组内成员
groups gliethttp 查看gliethttp用户所在的组,连同组内成员
whoami 查看当前登录用户名
/etc/group文档包含任何组
/etc/shadow和/etc/passwd系统存在的任何用户名
一开始创建了cvsroot用户,设置权限
#chown -R cvsroot.cvs /home/cvsroot
#chmod -R ug+rwx /home/cvsroot
#chmod 644 /home/cvsroot/CVSROOT/config
3.2.2. 设置加密文件为可执行:
cvsroot$ chmod a+x genpasswd.pl
系统用户密码:
vi /etc/shadow
//正确
1、建立cvs用户组
groupadd cvs
2、建立cvs组的cvsroot用户和所属的目录
useradd -g cvs -G cvs -d/home/cvsroot cvsroot
3、为cvsroot用户添加密码
passwd cvsroot
4、改变/home/cvsroot的目录属性
chmod 775 /home/cvsroot
5、初始化cvs源码库,此操作生成目录/home/cvsroot/CVSROOT,其下为一些初始化文件
cvs -d/home/cvsroot init
6、创建可以登陆cvs服务的用户及密码,需要创建文件passwd
必须说明的,cvs中默认一个用户checkout代码时候,会在当前模块下生成一个锁文件,如果这个用户对当前模块没有写权限,读是不可能的。配合上面的权限设置,必须改一下cvs服务器配置。改成不在当前模块目录下生成锁文件,把锁文件集中到一个所有用户都有读写权限的目录。修改配置文件CVSROOT/config:
# Put CVS lock files in this directory rather than directly in the repository.
#LockDir=/var/lock/cvs
把LockDir设上就可以了。
设置文件为可写: chmod 4+2 filename
端口:
netstat -tlna|grep :80|wc -l
JQUERY:2008-8-12
获取一组radio被选中项的值
var item = $('input[@name=items][@checked]').val();
获取select被选中项的文本
var item = $("select[@name=items] option[@selected]").text();
select下拉框的第二个元素为当前选中值
$('#select_id')[0].selectedIndex = 1;
radio单选组的第二个元素为当前选中值
$('input[@name=items]').get(1).checked = true;
获取值:
文本框,文本区域:$("#txt").attr("value");
多选框checkbox:$("#checkbox_id").attr("value");
单选组radio: $("input[@type=radio][@checked]").val();
下拉框select: $('#sel').val();
控制表单元素:
文本框,文本区域:$("#txt").attr("value",'');//清空内容
$("#txt").attr("value",'11');//填充内容
多选框checkbox: $("#chk1").attr("checked",'');//不打勾
$("#chk2").attr("checked",true);//打勾
if($("#chk1").attr('checked')==undefined) //判断是否已经打勾
单选组radio: $("input[@type=radio]").attr("checked",'2');//设置value=2的项目为当前选中项
下拉框select: $("#sel").attr("value",'-sel3');//设置value=-sel3的项目为当前选中项
$("<option value='1'>1111</option><option value='2'>2222</option>").appendTo("#sel")//添加下拉框的option
$("#sel").empty();//清空下拉框
editSysPublicType!readXML.action?file=xml/cardpassword.xml
2008-8-15:
Spring AOP 写日志,取request、session、application
网上都说spring多好多好,哎,没办法,人家说的这么好,我就试着体会一下。先用AOP来写个日志,目标就是把所有前后台针对数据库操作的方法都记录下来,是谁操作,操作了那些类,操作的方法是什么,还有IP地址,
我的环境 spring+webwork+hibernate+oracle,你要是不知道什么是AOP还有webwork,那你自己看去。这里不作解释。最重要的一部就是在:MethodBeforeAdvice这个类的befor里面得到request或session或application,下面说一下我的思路:
1:我看了网上说的最多的就是ThreadLocal 或者是 acegi,后面我的大体的看了下,主要是用来权限控制的,要达到我的的目标我没有找到怎么实现的方法,
我现在就只说ThreadLocal,这个类很不错的,网上很多说法,我的理解就是保证每个线程都有一个独立的变量,我理解了以后就写了下面一个类:
package com.bjfy.util;
import java.io.Serializable;
import javax.servlet.http.HttpServletRequest;
public class BJFYThreadBean implements Serializable{
private static ThreadLocal<Object> threadLocal = new ThreadLocal<Object>();
public HttpServletRequest getContext(){
return (HttpServletRequest)threadLocal.get();
}
public void setContext(HttpServletRequest request){
threadLocal.set(request);
}
public void cleanContext(){
threadLocal.set(null);
}
}
我一下开始是在用户登 陆的时候给ThreadLocal附值的,但是在befor方法里面就有问题了,我用 System.out.println(new BJFYThreadBean().getContext()) [说明一下,我的BJFYThreadBean一开始存付的是Users,我的登陆用户信息类]的时候就出怪问题了:
有的为null,有的不为null,我下子就搞晕了,奶奶的,要不就是全为null,就不就是都不为null,后来我查了资料,明白是怎么回事了,这是服务器的问题:因为客户端发送的请求服务器是在进程池里面找一个空闲进程来在客户端的响应,
在登陆以后的页面再请求服务器的时候服务器分给的线程和原来登陆的线程不是同一个线程了,所以ThreadLocal里面的值就得不到了,我看到不为null的时候那是运气,是服务器给你处理的线程正好是你登陆时候用的线程,所以就不为null.
我一下想明白这里就好办了,现在要解决的就是怎么在进到befor方法的这个线程里面附上ThreadLocal呢?想了办天,我把webwork的FilterDispatcher进行了继承,下面是我的继承类:
package com.bjfy.filter;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import com.bjfy.bean.Users;
import com.bjfy.util.BJFYThreadBean;
import com.opensymphony.webwork.dispatcher.FilterDispatcher;
public class WebWorkFilterDispatcher extends FilterDispatcher {
private BJFYThreadBean bJFYThreadBean;
public WebWorkFilterDispatcher(){
bJFYThreadBean =new BJFYThreadBean();
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
// TODO Auto-generated method stub
super.doFilter(arg0, arg1, arg2);
bJFYThreadBean.setContext((HttpServletRequest)arg0);
}
}
这样就可以保证befor里面得到当前的request了,不过你不要忘了把web.xml里面的配置改一下啊:
<filter>
<filter-name>webwork</filter-name>
<filter-class>com.bjfy.filter.WebWorkFilterDispatcher</filter-class>
<!-- <filter-class>com.opensymphony.webwork.dispatcher.FilterDispatcher</filter-class> -->
</filter>
我用的webwork,我想信框架这种鸟东西都是一样,struts你也改一下他的过滤类就可以了。搞了一天,就这点收获,如有不对,希望大家多多指教。只要不骂我就行了。
hibernate 日期查询的一点总结: 先说一下,我用的是Oracle。以下是我的表,很简单:table name: AAA
id varchar2(32)
name Date
我定义了二个日期,二种方式初始化:
Date d=new Date(1219987516734l);
Date dd= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2008-08-29 13:25:16");
同时我把插二条记录:
values('aaa','2008-08-29 13:25:16')
values('bbb','2008-08-29 13:25:16')
接下来我用 DetachedCriteria 来查询:代码如下:
DetachedCriteria dc= DetachedCriteria.forClass(Aaa.class);
dc.add(Restrictions.eq("name", dd));
//或 dc.add(Restrictions.eq("name", dd));
ContextUtil.getBJFYService().getBaseManager().searchByDetachedCriteria(dc).size();
这个时间用d这个日期一条也查不出来,用dd可以查出这二条来,我后来把name 的data类型改为: TIMESTAMP(6) ,把name的值分别改为d,和dd二个日期,
再查的时候就是一个日期一条,结果上面得出如下结论:
1:d.getTime()-dd.getTime()==743,也就是说d比dd多了743毫秒,oracle的date类型是不存储毫秒数的.所以我用d 在name是date类型的时候怎么写查不到记录,而TIMESTAMP(6) 有毫秒数
所以二个日期可以分别查到一条。
2:hibernate 的日期比较应该是用毫秒数进行比较的. 不管用什么,反正不是用下面这种方式比较:
select * from aaa where name=to_date('20080829132516','yyyymmddHH24miss')
2008-9-10:
一:javascript 日期比较:
var s = "2005-12-15";
var s2 = "2008-01-18";
var d = Date.parse(s.replace(/-/g,"/"));
var d2= Date.parse(s2.replace(/-/g,"/"));
if((d2-d)>0){
alert("2008-01-18>2005-12-15");
}
Hibernate 批量插入的测试:
最近在项目中做了一个充值卡的模块,用到了批量插入:我一开始用hibernate插入五十万条数据:选说一下我的记算机配置:
内存:1G,CPU:Pentium(R) 4 CPU 3.20GHz. 配置应该算是过时的了,
我的数据库是:oracle10G,数据库服务器在外地,我测试插入到十万条的时候用了二十五分钟,后来我把程序放到外网服务器:配置:酷睿2代 2.0,4G内存,
插入十万条是五分钟,速试是大大的提升,但是我还是感觉有点慢,后来我用JDBC的批处理:还是在我本地插入:10万条用时:不到1分钟,如果放到外网服务器就更快。
下面贴一下我的代码:hibernate批量导入代码:(只是部分代码,不能运行。)
public boolean addCardList( final SysCardImport sysCardImport,final Date date){
boolean bool =(Boolean) hibernateTemplate.execute(new HibernateCallback() {
public Object doInHibernate(Session session) throws HibernateException, SQLException {
boolean flag=true;
try {
int i=0;
String temp=sysCardImport.getCardSymbol(); //卡代号
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//取得充值卡类型值和面额值
SysPublictype cardType = (SysPublictype)session.get(SysPublictype.class, sysCardImport.getCardType());
SysPublictype cardMoney = (SysPublictype)session.get(SysPublictype.class, sysCardImport.getCardMoney());
temp+=cardType.getVchvalue();
temp+=cardMoney.getVchvalue();
String templeng[]=sysCardImport.getPasswordChar();
for(int len=0;len<templeng.length;len++){ //循环遍历充值卡加密字符串
String temparray[]=templeng[len].split(":");
String temps=temp+temparray[0]; //加密字符串代码
long cardnum=0;
List list= session.createQuery(" from SysCard t where t.vchcode like ? order by t.vchcode desc")
.setString(0, ""+temps+"%").list();
if(list.size()>0){
SysCard card=(SysCard)list.get(0);
cardnum = Long.valueOf(card.getVchcode().substring(10));
}
for(int num=0;num<sysCardImport.getCardAmount();num++){ //生成充值卡卡号
String cardroand="000000000"+(++cardnum);
cardroand=cardroand.substring(cardroand.length()-10);
SysCard sysCard=new SysCard();
SysPassword sysPassword=new SysPassword();
String password=BJFYSystemUtil.getRandomString(sysCardImport.getCardPasswordLength(),2);
sysCard.setVchcode(temps+cardroand);
sysCard.setNummoney(sysCardImport.getCardMoneys());
sysCard.setCstate("10");
sysCard.setDatcreate(date);
sysCard.setDatavailability(sdf.parse(sysCardImport.getCardDate()));
sysCard.setVchremark(sysCardImport.getCardRemark());
sysCard.setVchpassword(BJFYSystemUtil.getMD5(password+temparray[1]));
sysCard.setNumscale(sysCardImport.getCardScale());
sysCard.setVarkey(temparray[1]);
sysCard.setVchtype(cardType.getId());
sysPassword.setVchcode(temps+cardroand);
sysPassword.setVchpassword(password);
sysPassword.setVchpasschar(temparray[1]);
session.save(sysPassword);
session.save(sysCard);
if ((i + 1) % 1000 == 0) {
session.flush();
session.clear();
}
i++;
}
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
flag = false;
}
return flag;
}
});
return bool;
}
下面是JDBC批处理的代码:
public boolean addCardListByJdbc( final SysCardImport sysCardImport,final Date date){
boolean flag=true;
Connection con= this.hibernateTemplate.getSessionFactory().openSession().connection();
PreparedStatement stm=null;
PreparedStatement stm2=null;
try {
int i=0;
String temp=sysCardImport.getCardSymbol(); //卡代号
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
//取得充值卡类型值和面额值
SysPublictype cardType = (SysPublictype)hibernateTemplate.get(SysPublictype.class, sysCardImport.getCardType());
SysPublictype cardMoney = (SysPublictype)hibernateTemplate.get(SysPublictype.class, sysCardImport.getCardMoney());
temp+=cardType.getVchvalue();
temp+=cardMoney.getVchvalue();
con.setAutoCommit(false);
stm=con.prepareStatement("insert into sys_card values(?,?,?,?,?,?,?,?,?,?)");
stm2=con.prepareStatement("insert into sys_password values(?,?,?)");
String templeng[]=sysCardImport.getPasswordChar();
for(int len=0;len<templeng.length;len++){ //循环遍历充值卡加密字符串
String temparray[]=templeng[len].split(":");
String temps=temp+temparray[0]; //加密字符串代码
long cardnum=0;
List list= hibernateTemplate.find(" from SysCard t where t.vchcode like ? order by t.vchcode desc", temps+"%");
if(list.size()>0){
SysCard card=(SysCard)list.get(0);
cardnum = Long.valueOf(card.getVchcode().substring(10));
}
for(int num=0;num<sysCardImport.getCardAmount();num++){ //生成充值卡卡号
String cardroand="000000000"+(++cardnum);
cardroand=cardroand.substring(cardroand.length()-10);
SysCard sysCard=new SysCard();
SysPassword sysPassword=new SysPassword();
String password=BJFYSystemUtil.getRandomString(sysCardImport.getCardPasswordLength(),2);
stm.setString(1,temps+cardroand);
stm.setString(2, BJFYSystemUtil.getMD5(password+temparray[1]));
stm.setLong(3, sysCardImport.getCardMoneys());
stm.setLong(4, sysCardImport.getCardScale());
stm.setString(5,cardType.getId() );
stm.setDate(6, new java.sql.Date(System.currentTimeMillis()));
stm.setDate(7, new java.sql.Date(date.getTime()));
stm.setString(8, "10");
stm.setString(9, temparray[1]);
stm.setString(10, sysCardImport.getCardRemark());
stm.addBatch();
stm2.setString(1, temps+cardroand);
stm2.setString(2, password);
stm2.setString(3,temparray[1]);
stm2.addBatch();
if ((i + 1) % 1000 == 0) {
stm.executeBatch();
stm2.executeBatch();
con.commit();
}
i++;
}
}
if(stm!=null) {
stm.executeBatch();
stm2.executeBatch();
con.commit();
}
} catch (Exception e) {
log.error(e);
e.printStackTrace();
flag = false;
}finally{
try {
con.close();
stm=null;
stm2=null;
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return flag;
}
综上所述,hibernate的批量更新和插入要创建和销毁大量的对象,尤其是带有复杂业务逻辑的,所以本人建议在大批量导入和更新时,最好使用JDBC的批处理.在批处理上hibernate和jdbc Batch不是一个等级的。
2008-9-13:
今天我做excel批量导入,在进行数据库操作的时候插入数据总是报错。错误信息如下: 后来查明是oracle版本的问题,正式数据库是10.2.1,现在的是10.2.2,我非常鬼火,还有以前做的项目,本机的jdk和服务器的jdk版本不一致,也会产生很多想不到的错误,今天得到的经验是:
不管在什么地方,什么时候,做什么项目,第一条:所有的配置环境必须一样。
2008-9-17:
java批量导入Excel的测试类。下面是代码
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
import java.io.File;
import java.io.IOException;
import com.sun.corba.se.spi.ior.Writeable;
public class TestWExcel {
File file=new File("c:\\test.xls");
Workbook workbook;
public TestWExcel(){
try {
writableWorkbook=Workbook.createWorkbook(file);
writableWorkbook.createSheet("aaa", 100);
writableWorkbook.write();
writableWorkbook.close();
writableWorkbook=null;
if(writableWorkbook!=null){
writableWorkbook.write();
writableWorkbook.close();
writableWorkbook=null;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//writableWorkbook = Workbook.createWorkbook(file);
}
WritableSheet writableSheet=null;
WritableWorkbook writableWorkbook =null;
int num=0;
int foreach=0;
public void writeExc(){
try {
if(writableWorkbook==null){
workbook=Workbook.getWorkbook(file);
writableWorkbook = Workbook.createWorkbook(file,workbook);
System.out.println("FFFFFFFFFFFFFFFFFF"+writableWorkbook.getSheets().length);
writableSheet= writableWorkbook.createSheet("第"+foreach, foreach);
}
System.out.println(foreach+"::::"+writableWorkbook+"::::::::");
for(;num<2000;num++){
for(int s=0;s<7;s++){
writableSheet.addCell(new Label(s,num,"中华人民共和国"));
}
}
num=0;
writableWorkbook.write();
writableWorkbook.close();
workbook.close();
workbook=null;
writableWorkbook=null;
writableSheet=null;
if(foreach<=10){
foreach++;
System.out.println(foreach);
writeExc();
}
} catch (Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
new TestWExcel().writeExc();
}
}
2008-9-18: Liunx查看版本命令:
1:cat /etc/SuSE-release
2:uname -a
3:lsb_release -a
用root用户登陆到系统,打开一个终端输入
删除JDK
# rpm -qa|grep gcj
显示内容其中包含下面两行
# java-1.4.2-gcj-compat-1.4.2.0-27jpp
# java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
卸载
# rpm -e java-1.4.2-gcj-compat-devel-l.4.2.0-27jpp
# rpm -e java-1.4.2-gcj-compat-l.4.2.0-27jpp
卸载其他自己安装的JDK就直接用rpm -e <javaXXXXX>
filename.-misc-simsun-medium-r-normal--*-%d-*-*-c-*-iso10646-1=/usr/local/share/fonts/simsun.ttf
嘿嘿,今天不错,起的早到的早,没有迟到心情好。整理一下,最近关于文件操作的linux命令。主要对文件夹及文件操作命令。
功能:创建一个目录(类似MSDOS下的md命令)。
Linux目录的创建与删除命令
mkdir命令
功能:创建一个目录(类似MSDOS下的md命令)。
语法:mkdir [选项] dir-name
说明:该命令创建由dir-name命名的目录。要求创建目录的用户在当前目录中(dir-name的父目录中)具有写权限,并且dirname不能是当前目录中已有的目录或 文件名称。
命令中各选项的含义为:
- m 对新建目录设置存取权限。也可以用chmod命令设置。
- p 可以是一个路径名称。此时若路径中的某些目录尚不存在, 加上此选项后, 系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。
rmdir 命令
功能:删除空目录。
语法:rmdir [选项] dir-name
说明:dir-name表示目录名。该命令从一个目录中删除一个或多个子目录项。需要 特别注意的是,一个目录被删除之前必须是空的。rm - r dir命令可代替 rmdir,但是有危险性。删除某目录时也必须具有对父目录的写权限。
命令中各选项的含义为:
- p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应 的信息。
cd 命令
功能:改变工作目录。
语法:cd [directory]
说明:该命令将当前目录改变至directory所指定的目录。若没有指定directory, 则回到用户的主目录。为了改变到指定目录,用户必须拥有对指定目录的执行和读 权限。
该命令可以使用通配符。
pwd 命令
在Linux层次目录结构中,用户可以在被授权的任意目录下利用mkdir命令创建新目录,也可以利用cd命令从一个目录转换到另一个目录。然而,没有提示符来告知用 户目前处于哪一个目录中。要想知道当前所处的目录,可以使用pwd命令,该命令显示整个路径名。
语法:pwd
说明:此命令显示出当前工作目录的绝对路径。
ls 命令
ls是英文单词list的简写,其功能为列出目录的内容。这是用户最常用的一个命令之一,因为用户需要不时地查看某个目录的内容。该命令类似于DOS下的dir命令。
语法:ls [选项] [目录或是文件]
对于每个目录,该命令将列出其中的所有子目录与文件。对于每个文件,ls将输出 其文件名以及所要求的其他信息。默认情况下,输出条目按字母顺序排序。当未给出目录名或是文件名时,就显示当前目录的信息。
命令中各选项的含义如下:
- a 显示指定目录下所有子目录与文件,包括隐藏文件。
- A 显示指定目录下所有子目录与文件,包括隐藏文件。但不列出“.”和 “..”。
- b 对文件名中的不可显示字符用八进制逃逸字符显示。
- c 按文件的修改时间排序。
- C 分成多列显示各项。
- d 如果参数是目录,只显示其名称而不显示其下的各文件。往往与l选项一起使 用,以得到目录的详细信息。
- f 不排序。该选项将使lts选项失效,并使aU选项有效。
- F 在目录名后面标记“/”,可执行文件后面标记“*”,符号链接后面标记 “@”,管道(或FIFO)后面标记“|”,socket文件后面标记“=”。
- i 在输出的第一列显示文件的i节点号。
- l 以长格式来显示文件的详细信息。这个选项最常用。
每行列出的信息依次是: 文件类型与权限 链接数 文件属主 文件属组 文件大小 建立或最近修改的时间 名字
对于符号链接文件,显示的文件名之后有“—〉”和引用文件路径名。
对于设备文件,其“文件大小”字段显示主、次设备号,而不是文件大小。
目录中的总块数显示在长格式列表的开头,其中包含间接块。
- L 若指定的名称为一个符号链接文件,则显示链接所指向的文件。
- m 输出按字符流格式,文件跨页显示,以逗号分开。
- n 输出格式与l选项相同,只不过在输出中文件属主和属组是用相应的UID号和 GID号来表示,而不是实际的名称。
- o 与l选项相同,只是不显示拥有者信息。
- p 在目录后面加一个“/”。
- q 将文件名中的不可显示字符用“?”代替。
- r 按字母逆序或最早优先的顺序显示输出结果。
- R 递归式地显示指定目录的各个子目录中的文件。
- s 给出每个目录项所用的块数,包括间接块。
- t 显示时按修改时间(最近优先)而不是按名字排序。若文件修改时间相同,则 按字典顺序。修改时间取决于是否使用了c或u选顶。缺省的时间标记是最后一次修 改时间。
- u 显示时按文件上次存取的时间(最近优先)而不是按名字排序。即将-t的时间 标记修改为最后一次访问的时间。
- x 按行显示出各排序项的信息。
用ls - l命令显示的信息中,开头是由10个字符构成的字符串,其中第一个字符表示文件类型,它可以是下述类型之一:
- 普通文件
d 目录
l 符号链接
b 块设备文件
c 字符设备文件
后面的9个字符表示文件的访问权限,分为3组,每组3位。
第一组表示文件属主的权限,第二组表示同组用户的权限,第三组表示其他用户的权限。每一组的三个字 符分别表示对文件的读、写和执行权限。
各权限如下所示:
r 读
w 写
x 执行。对于目录,表示进入权限。
s 当文件被执行时,把该文件的UID或GID赋予执行进程的UID(用户ID)或GID(组 ID)。
t 设置标志位(留在内存,不被换出)。如果该文件是目录,在该目录中的文件只能被超级用户、目录拥有者或文件属主删除。如果它是可执行文件,在该文件执行 后,指向其正文段的指针仍留在内存。这样再次执行它时,系统就能更快地装入该文件。 下一页介绍文件操作命令。
Linux文件的复制、删除和移动命令
语法: cp [选项] 源文件或目录 目标文件或目录
说明:该命令把指定的源文件复制到目标文件或把多个源文件复制到目标目录中。
该命令的各选项含义如下:
- a 该选项通常在拷贝目录时使用。它保留链接、文件属性,并递归地拷贝目录,其作用等于dpR选项的组合。
- d 拷贝时保留链接。
- f 删除已经存在的目标文件而不提示。
- i 和f选项相反,在覆盖目标文件之前将给出提示要求用户确认。回答y时目标文件将被覆盖,是交互式拷贝。
- p 此时cp除复制源文件的内容外,还将把其修改时间和访问权限也复制到新文件中。
- r 若给出的源文件是一目录文件,此时cp将递归复制该目录下所有的子目录和文件。此时目标文件必须为一个目录名。
- l 不作拷贝,只是链接文件。
需要说明的是,为防止用户在不经意的情况下用cp命令破坏另一个文件,如用户指定的目标文件名已存在,用cp命令拷贝文件后,这个文件就会被新源文件覆盖,因此,建议用户在使用cp命令拷贝文件时,最好使用i选项。
mv命令
用户可以使用mv命令来为文件或目录改名或将文件由一个目录移入另一个目录中。该命令如同MSDOS下的ren和move的组合。
语法:mv [选项] 源文件或目录 目标文件或目录
说明:视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。当第二个参数是已存在的目录名称 时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件 的链接也将丢失。
命令中各选项的含义为:
- I 交互方式操作。如果mv操作将导致对已存在的目标文件的覆盖,此时系统询问是否重写,要求用户回答y或n,这样可以避免误覆盖文件。
- f 禁止交互操作。在mv操作要覆盖某已有的目标文件时不给任何指示,指定此选项后,i选项将不再起作用。
如果所给目标文件(不是目录)已存在,此时该文件的内容将被新文件覆盖。为防止用户用mv命令破坏另一个文件,使用mv命令移动文件时,最好使用i选项。
rm命令
用户可以用rm命令删除不需要的文件。该命令的功能为删除一个目录中的一个或多个文件或目录,它也可以将某个目录及其下的所有文件及子目录均删除。对于链接文件,只是断开了链接,原文件保持不变。
rm命令的一般形式为:
rm [选项] 文件…
如果没有使用- r选项,则rm不会删除目录。
该命令的各选项含义如下:
- f 忽略不存在的文件,从不给出提示。
- r 指示rm将参数中列出的全部目录和子目录均递归地删除。
- i 进行交互式删除。
使用rm命令要小心。因为一旦文件被删除,它是不能被恢复的。了防止这种情况的发生,可以使用i选项来逐个确认要删除的文件。如果用户输入y,文件将被删除。如果输入任何其他东西,文件则不会删除。
2008-9-19:
liunx 的oracle \ tomcat JDK启动服务的问题。设置bin目录startup.sh文件。
export JAVA_HOME=/usr/java/jdk1.6.0_10
export JRE_HOME=/usr/java/jdk1.6.0_10/jre
2008-9-22: ireport+jasperreport+liunx画饼图乱码.
我最近用jasperreport画了一张饼图片放到liunx上面,示视的中文标题没有问题,画出来的饼图分类中文有乱码,这个问题搞了我好几天,我查网上都是说配置JDK的编码,考字体一大堆,后来我找到一个贴子,很简单的就搞定了,下面我说一下解决办法。
不管你的liunx装的是JDK还是jre,你只要$JAVA_HOME/ lib/fonts 然后执行: mkdir fallback . 然后把windows操作系统的C:\windows\fonts\simsun.ttc 改为 simsun.ttf,然后上传到liunx新建的文件夹:fallback.
2008-9-25:
今天要在liunx上面装apache,我是个菜鸟,搞了一上午,说一下几个重要的地方:我的apache版本:httpd-2.2.9.tar.gz,在安装之前,我要先说明一下,安装这个版本的东西你要先安装apr和apr-util,这二个东西都在这个包里面了。
安装是注意设置参数:--
用www.apache.org上下载的源码安装apache2,
Redhat AS 4
执行了configure,make后
make install时出错:
/bin/sh /usr/local/httpd-2.2.3/srclib/apr/libtool --mode=install /usr/bin/install -c -m 755 libaprutil-1.la /usr/local/apache2/lib
libtool: install: error: cannot install `libaprutil-1.la' to a directory not ending in /usr/local/apache22/lib
make[2]: *** [install] Error 1
经过折腾之后找到规律:
./configure
make
make install
顺序不会出错
./configure --prefix=/app/apache
make
make install
顺序就会出错...
分析:
从apache网站上下载的source code,应该不会有如此不能安装到非/usr/local目录的低级错误。
肯定是自己有疏忽,猜测可能是以前安装用过./configure 来直接安装到/usr/local/apache2
导致安装文件已经不太“干净”
解决:
删除source code目录,重新tar -zxvf下载的apache安装包,上面的问题解决。
后来google了下面一句:
If some options do not become active after doing a configure; make; make install, try to do a make clean after configure.
看来make clean也是一个解决方式.... 可叹以前重新编译Linux 内核的时候还用过它...四年不用就忘这么干净。
./apachectl -f /usr/httpd/apache2/conf/httpd.conf
--enable-so
--enable-ssl --enable-mods-shared=all
以下是OpenSSL成生密钥和证书的方法:
首先得安装OpenSSL软件包openssl,安装了这个软件包之后,我们可以做这些事情:
o Creation of RSA, DH and DSA Key Parameters # 创建密钥 key
o Creation of X.509 Certificates, CSRs and CRLs # 创建证书
o Calculation of Message Digests #
o Encryption and Decryption with Ciphers # 加密、解密
o SSL/TLS Client and Server Tests # SSL 服务器端/客户端测试
o Handling of S/MIME signed or encrypted Mail # 处理签名或加密了的邮件
1、生成RSA密钥的方法
openssl genrsa -des3 -out privkey.pem 2048这个命令会生成一个2048位的密钥,同时有一个des3方法加密的密码,如果你不想要每次都输入密码,可以改成:openssl genrsa -out privkey.pem 2048建议用2048位密钥,少于此可能会不安全或很快将不安全。
2、生成一个证书请求
openssl req -new -key privkey.pem -out cert.csr
这个命令将会生成一个证书请求,当然,用到了前面生成的密钥privkey.pem文件
这里将生成一个新的文件cert.csr,即一个证书请求文件,你可以拿着这个文件去数字证书颁发机构(即CA)申请一个数字证书。CA会给你一个新的文件cacert.pem,那才是你的数字证书。
如果是自己做测试,那么证书的申请机构和颁发机构都是自己。就可以用下面这个命令来生成证书:
openssl req -new -x509 -key privkey.pem -out cacert.pem -days 1095
这个命令将用上面生成的密钥privkey.pem生成一个数字证书cacert.pem
3、使用数字证书和密钥
有了privkey.pem和cacert.pem文件后就可以在自己的程序中使用了,比如做一个加密通讯的服务器
./configure --prefix=/apache/httpd --enable-ssl=static --with-ssl=/usr/local/ssl
.so的是动态模块,你已经把需要的模块都编译成静态的,当然看不到so文件,静态模块在配置不用LoadModule加载即可使用,执行httpd -l就可以看到你安装的apache静态模块。^_^
动态模块可以这么用(以deflate压缩模块为例):
/data1/apache2/bin/apxs -i -c ./httpd-2.0.59/modules/filters/mod_deflate.c
httpd.conf中添加:
LoadModule deflate_module modules/mod_deflate.so
liunx查找文件: find /路径 -name 文件名
<Directory "/usr/DMA/webapps">
Options None //避免目录被浏览
AllowOverride None
Order allow,deny
Allow from all
DirectoryIndex index.jsp
</Directory>
查看CPU主频: cat /proc/cpuinfo
<composite-id name= "c.id " class= "c unsaved-value= "none ">
<key-many-to-one name= "a " class= "a " column= "a.id"/>
<key-many-to-one name= "b " class= "b " column= "b.id"/>
</composite-id>
create database link DBLINK
connect to account identified by aaa
using '(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 221.238.251.144)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = TJTEBAK)
)
)';
liunx xml编辑: syntax on
2008年10月15号:
hibernateTemplate.find方法后面数组参数中字符串数组可以,整型数组有问题,例:
list = hibernateTemplate.findByNamedParam("select t.vchmoduel from SysFunction t where t.id in ( :ids ) group by t.vchmoduel", "ids",list.toArray());
中ids是整型必须用findByNamedParam,如果是字符串,可以下面的形式写:
list = hibernateTemplate.find("select t.vchmoduel from SysFunction t where t.id in ( :ids ) group by t.vchmoduel",list.toArray());
javascript 随机数:
Math.round(Math.random()*6)
所有字符串替换: replace(/\-/g,'ddd')
2008年10月21号:
今天解决了问题很让我鬼火,我的文件上传公共类,在tomcat下运行很正常,到是到了apache+tomcat下面就报错,后来我仔细的一点一点的找,发现服务器返回来的字符串经过apache的时候就给我前后加了个<PRE></PRE>,不明白为什么!
2008年10月23日:
javascript 日期格式化:
Date.prototype.format = function(format) //author: meizz
{
var o = {
"M+" : this.getMonth()+1, //month
"d+" : this.getDate(), //day
"h+" : this.getHours(), //hour
"m+" : this.getMinutes(), //minute
"s+" : this.getSeconds(), //second
"q+" : Math.floor((this.getMonth()+3)/3), //quarter
"S" : this.getMilliseconds() //millisecond
}
if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
(this.getFullYear()+"").substr(4 - RegExp.$1.length));
for(var k in o)if(new RegExp("("+ k +")").test(format))
format = format.replace(RegExp.$1,
RegExp.$1.length==1 ? o[k] :
("00"+ o[k]).substr((""+ o[k]).length));
return format;
}
2008-11-3:
java类 Test.java static{} 里面的代码执行问题,我测试,如果里面有常量 A ,静态变量 B 和静态方法 C,访问B和C都执行static,访问常量A不执行此代码
2008-11-5:
学习tomcat源码心得:
1:tomcat启动服务调用:((Lifecycle) server).start(),这里Lifecycle里面有很多实现类,他在启动执行org.apache.catalina.core.StandardServer.start()。
synchronized (services) {
for (int i = 0; i < services.length; i++) {
if (services[i] instanceof Lifecycle)
((Lifecycle) services[i]).start();
}
}
2:在JVM加载类的时候,需要经过三个步骤,装载、连接、初始化。装载就是找到相应的class文件,读入JVM,初始化就不用说了,最主要就说说连接。
连接分三步,第一步是验证class是否符合规格,第二步是准备,就是为类变量分配内存同时设置默认初始值,第三步就是解释,而这步就是可选的,根据上面loadClass方法的第二个参数来判定是否需要解释,所谓的解释根据《深入JVM》这本书的定义就是根据类中的符号引用查找相应的实体,再把符号引用替换成一个直接引用的过程。
2008-11-14:
javascript面向对象的理解,javascritp 没有java中的真正类,他们只有一个方法类,例如下面的代码:
function AAA(ss){
alert(ss);
}
function BBB(){
this.sub=AAA;
}
var b=new BBB();这时AAA不会初始化,b.sub也不会初始化,只有b.sub();的时候才能初始化AAA这个方法类.
2008-11-17:
select * from sys_card a where a.cstate=5 and not exists(select vchpay_order from chg_charge_log where vchpay_order=a.vchcode)
2008-11-24:
今天搞了一个验证码的问题,得到点经验,一个页面画二个image,连接地址分别是二个action,这个时候服务器会创建二个会员,而不是一个,搞了一下午的问题 ,就得到这么一句话。
2008-12-2:
javascript 里面的类继承中,this.property=类名 ,这个类是不会初始化的,如果要初始化,有二种方法:
1:初始化子类,执行property();
2: 在他的this.property=类名下面加一行代码: this.property();
2008-12-9:
今天学习了javascript 的 arguments关健字,是用来取参数的详细信息,例子如下:
function fun1(){
alert(arguments.callee.caller);
}
function fun2(obj){
var temp='传入的参数:'+obj+"\n\n";
temp+='传入参数的个数:'+arguments.length+"\n\n";
temp+='传入的详细信息:'+arguments.callee+"\n\n";
temp+='当前函数的调用者:'+arguments.callee.caller;
alert(temp);
arguments[2]();
}
fun2('dddddd','参数二',fun1);
select distinct t.ip from ttt t ,e where substr(t.ip,instr(t.ip,'.',1,1)+1,length(t.ip)) = substr(e.ip,instr(e.ip,'.',1,1)+1,length(e.ip))
2009-1-4:
java中内部类的初始化,代码如下: 这里说一下初始化的问题,在A的main 方法中,初始化是:new B();是报错的,在构造或其他的方法中是可以,想在main方法中初始化, 内部类B 必须定义为静态类。
public class A{
public class B{
}
}
服务器启动时间:2009-1-5 14:30
jdbc:microsoft:sqlserver://192.168.2.222:1433 com.microsoft.jdbc.sqlserver.SQLServerDriver
2009-2-20:
jquery 取parent.document.getElementById('bobo') 语法:$('#bobo',parent.document)
浅谈 openfire 用户密码加密的实现方法:
openfire 做为基于jabber协议的开源IM工具,有着非常不错的性能,和JWChat结合,自己感觉很完美,不说废话,这里说一下对openfire对注册用户的密码加密实现,这里先推荐一篇不错的文章:
http://hetylei.iteye.com/blog/290519,这篇文章进的不错,不过对我没有多大帮助,我看了openfire的连接方法,不是用的他说的JDBCAuthProvider,是通过DefaultAuthProvider,在这个类的140行左右有下面一句:
return AuthFactory.decryptPassword(encrypted); 这一句就是解密的字符串,我看到AuthFactory类里面的代码,实现解密和加密的核心类就是:org.jivesoftware.util.Blowflsh.java, BlowFish的算法大家看资料吧,
这个类可以实现了解密和加密,每次针对用户密码加密的字符串都不一样!
cvs -d :pserver:用户名@localhost:/var/cvsroot login
38 admin.authorizedJIDs admin@icbcoa-6ca65744
js 设置 document.body.clientHeight 或 scrollHeight