??xml version="1.0" encoding="utf-8" standalone="yes"?> 1.portlet.xml文gQ放|在WEB_INF/portlet.xml下面。典型的例子Q?/p>
<portlet>
portlet-class是实现的类。可以和web.xml对照比较一下?/font>
2.实现的PortletcR和传统的servlet一Pportal容器来管理protlet的生命周期。它必须实现javax.portlet.Portlet接口。但是jsr168标准提供了一个方便类QGenericPortlet你可以直?br />l承它就ok了?/font>
1)生命周期Q同servlet一样Portlet必须有自q命周期。这定义在javax.portlet.Portlet接口中。它的方法是Qinit(),render(),processAction(),destroy().但创建portlet实例的时候调用init()Ҏ。它完成一些需要花Ҏ늚资源的动作。但实例被销毁的时候,容器调用destroyҎ来释放这些资源?/font>
Portlet规范清晰的区分了renderh和actionh的区别。renderRequest()会调用该portlet上的render()ҎQactionRequst()会调用processAction()Ҏ.要注意的是一ơ用户完整的h是Qportal面上的所有的protlet?render()调用Q该hprotlet?font color="#000000">processAction()调用。具体看图:
3.Portlet模式 VIEW模式是你必须实现的,EDITQHELP模式是可选的。你可以通过修改doEdit()和doHelp()
<supports>
修改本文件但没有实现该模式容器会抛出
javax.portlet.PortletException异常.
实现window状态,注意JSR 168q没有对q个q行规定Q但webLogic 完成了:
<portlet>
包含JSP文gQ?/font>
上面的例子中我们在doViewҎ中通过Ҏ得到Writer实例Q这样可以输出HTML片断。但是,
处理动作
在标准的web应用E序?提交表单Q或者一个动作url常见的。JSR168规范中定义了portlet taglib
<form action="<portlet:actionURL/>" method="post">
提交的话会自动调用该portlet?font color="#000000">processAction(ActionRequest aRequest, ActionResponse aResponse)ҎQ这p你传l方式一样了reqeust的getParameter()或者是getAttribute()?br />得到传来的参数?/font>
processAction()Ҏ讄response对象中的倹{不要用ActionRequest或ActionResponse对象的setAttribute()Ҏ。g会从processAction()传递到render()ҎQ而且在JSP中是不可用的。相反要使用ActionResponse对象的setRenderParameter()Ҏ。这些render参数对所有后lrenderh可用Q这一点与典型的Web应用E序h属性很不相同。典型的Web applicationh属性只对于一个请求可用。另一斚wQrenderh参数对于许多后箋renderh可用。render参数保持可用直到D动作的重新执行显式地修改或删除?br /> 所呈现的参数是怎样昄在JSP上的呢?应用来自portlet标签库的defineObjects标签来定义portlet对象。该标签使renderRequest、renderResponse和portletConfig portlet对象在页面中可用。参数通过调用renderRequest对象的getParameter()Ҏ来显C。请参考与所包含的源代码CZ中的favoriteColorView.jsp?br /> 1.建立 ORACLE 用户?DBA l,初始化安装目? 2.为安?ORACLE 讄pȝ变量 vi /etc/services vi /etc/oracle/.profile(.cshrc) #sync;sync;reboot Sun OS重启Qɾpȝ参数生效 3.Install 2?%cd /cdrom/cdrom0 %./runInstaller 出现 ORACLE Universal Installer的安装窗?按Next键l? (q程安装则在 KEA!X Server {远E模拟桌面环境下在命令窗口中q行 ./runInstaller 出现 ORACLE Universal Installer的安装窗?按Next键l? 3、Destination框输入将要安装oracle的目录这里我输入/oracleQ接着出现弹出H口要求用rootq行/tmp/orainstRoot.sh (它创建oraInventory的安装目? 接着选择要安装的产品ORACLE8I 8.1.5 4、选typical或custom安装Q注意屏q上端Language按钮Q选Chinese语言? 5、接着出现要安装ORACLE产品的全部信息,如果有不对的地方可以按Perious按钮q回修改。如果确认无误,按NextQORACLE开始安装? (如果选择了要建数据库Q会要求你输入数据库的存攑֜址Q这里我输入/oracle/data,那么数据库的真正存放地址?/oracle/data/oradata/dbdir) 6、安装成?00%后又回到开始的选项菜单?oracle/orainst/install.log 安装日志文g最后提COK 7、弹出Setup PrivilegesH口,要求用rootq行 #/oracle/root.sh Character sets : ZHS16GDK 建库p|错误 01034 : 先取消徏库过E? 建库p|后重建时说库已经存在Q? rm -r /oracle/admin/ #vi /var/opt/oracle/tnsnames.ora 一些连接字W串Q分布式通讯时有? %svrmgrl 唤醒SVRMGR状? %lsnrctl start 启动listener 如果出错查环境变量是否设好,及lsnrctl文g的内容和执行属性? #!/bin/sh case "$OPT_" in # NOTE: Must exit with zero unless error is severe. # NOTE: Must exit with zero unless error is severe. 讄执行ơ序 原著QSteve Mansour 译QNeo Lee 译者按Q原文因为年代久q,文中很多链接早已q期Q主要是关于vi、sed{工L介绍和手册)Q本译文中已此c链接删除,如需查这些链接可以查看上面链接的原文。除此之外基本照原文直译Q括号中有“译者按”的部分是译者补充的说明。如有内Ҏ面的问题L接和Steve Mansor联系Q当Ӟ如果你只写中文,也可以和我联pR?/p>
什么是正则表达?/a>
我们在如下的章节中利用一些例子来解释正则表达式的用法Q绝大部分的例子是基?b>vi中的文本替换命o?b>grep文g搜烦命o来书写的Q不q它们都是比较典型的例子Q其中的概念可以在sed、awk、perl和其他支持正则表辑ּ的编E语a中用。你可以看看不同工具中的正则表达?/a>q一节,其中有一些在别的工具中用正则表辑ּ的例子。还有一个关于vi中文本替换命令(sQ的单说?/a>附在文后供参考?/p> 在最单的情况下,一个正则表辑ּ看上d是一个普通的查找丌Ӏ例如,正则表达?testing"中没有包含Q何元字符Q,它可以匹?testing"?123testing"{字W串Q但是不能匹?Testing"?/p> 要想真正的用好正则表辑ּQ正的理解元字W是最重要的事情。下表列Z所有的元字W和对它们的一个简短的描述?
最单的元字W是点,它能够匹配Q何单个字W(注意?/strong>包括新行W)。假定有个文件test.txt包含以下几行内容Q?/p> 要想匚w行首的字W要使用抑扬字符Q?em>^Q——又是也被叫做插入符。例如,x到text.txt中行?he"打头的行Q你可能会先用简单表辑ּheQ但是这会匹配第三行?b>theQ所以要使用正则表达?b>^heQ它只匹配在行首出现?b>h? 有时候指定“除了×××都匚w”会比较Ҏ辑ֈ目的Q当抑扬字符Q?em>^Q出现在Ҏ号中是,它表C“排除”,例如要匹?b>he Q但是排除前面是t or s的情性(也就?b>the?b>sheQ,可以使用Q?b>[^st]he? 可以使用Ҏh指定多个字符区间。例如正则表辑ּ[A-Za-z]匚wM字母Q包括大写和写的;正则表达?b>[A-Za-z][A-Za-z]* 匚w一个字母后面接着0或者多个字母(大写或者小写)。当然我们也可以用元字符+做到同样的事情,也就是:[A-Za-z]+ Q和[A-Za-z][A-Za-z]*完全{h。但是要注意元字W?b>+ q不是所有支持正则表辑ּ的程序都支持的。关于这一点可以参考后面的正则表达式语法支持情?/a>?/p> 要指定特定数量的匚wQ要使用大括P注意必须使用反斜杠来转义Q。想匚w所?b>100?b>1000的实例而排?b>10?b>10000Q可以用:10\{2,3\}Q这个正则表辑ּ匚w数字1后面跟着2或??的模式。在q个元字W的使用中一个有用的变化是忽略第二个数字Q例如正则表辑ּ0\{3,\} 匹配至?个连l的0?/p> q里有一些有代表性的、比较简单的例子?
所有方法foo(a,b,c)的实例改为foo(b,a,c)。这里a、b和c可以是Q何提供给Ҏfoo()的参数。也是说我们要实现q样的{换:
下面q条替换命o能够实现q一法Q?/p> 现在让我们把它打散来加以分析。写个表辑ּ的基本思\是找出foo()和它的括号中的三个参数的位置。第一个参数是用这个表辑ּ来识别的Q:\([^,]*\)Q我们可以从里向外来分析它:
现在正是指出一个用正则表辑ּ常见错误的最x机。ؓ什么我们要使用[^,]*q样的一个表辑ּQ而不是更加简单直接的写法Q例如:.*Q来匚wW一个参数呢Q设x们用模?b>.*来匹配字W串"10,7,2"Q它应该匚w"10,"q是"10,7,"Qؓ了解册个两义性(ambiguityQ,正则表达式规定一律按照最长的串来Q在上面的例子中是"10,7,"Q显然这样就扑և了两个参数而不是我们期望的一个。所以,我们要?b>[^,]*来强制取出第一个逗号之前的部分?/p> q个表达式我们已l分析到了:foo(\([^,]*\)Q这一D可以简单的译为“当你找?b>foo(把其后直到W一个逗号之前的部分标Cؓ\1”。然后我们用同L办法标记W二个参Cؓ\2。对W三个参数的标记Ҏ也是一P只是我们要搜索所有的字符直到x受我们ƈ没有必要L索第三个参数Q因为我们不需要调整它的位|,但是q样的模式能够保证我们只L换那些有三个参数的foo()Ҏ调用Q在foo()是一个重载(overoadingQ方法时q种明确的模式往往是比较保险的。然后,在替换部分,我们扑ֈfoo()的对应实例,然后利用标记好的部分q行替换Q是的第一和第二个参数交换位置?/p> q里有几行我们现在的数据Q?/p> 下面是W一个替换命令: 下面q个替换命o则用来去除空| 当然Q你也可以在Visual C++~辑器中使用RE。选择Edit->ReplaceQ然后选择"Regular expression"选择框,Find What输入框对应上面介l的vi命o:%s/pat1/pat2/g中的pat1部分Q而Replace输入框对应pat2部分。但是,Z得到vi的执行范围和g选项Q你要用Replace All或者适当的手工Find Next and ReplaceQ译者按Q知道ؓ啥有人骂微Y弱智了吧Q虽然VC中可以选中一个范围的文本Q然后在其中执行替换Q但是M不够vi那么灉|和典雅)?/p> Sed?b>Stream EDitor的羃写,是Unix下常用的Z文g和管道的~辑工具Q可以在手册中得到关于sed的详l信息? q里是一些有的sed脚本Q假定我们正在处理一个叫做price.txt的文件。注意这些编辑ƈ不会改变源文Ӟsed只是处理源文件的每一行ƈ把结果显C在标准输出中(当然很容易用重定向来定ӞQ?
在AhoQWeinberger和Kernighan的书The AWK Programming Language中有很多很好的awk的例子,请不要让下面q些微不道的脚本例子限制你对awk强大能力的理解。我们同样假定我们针对price.txt文gq行处理Q跟sed一Pawk也只是把l果昄在终端上。?
下面的例子中我们假定在文件phone.txt中包含以下的文本Q——其格式是姓加一个逗号Q然后是名,然后是一个制表符Q然后是电话LQ?/p> Francis, John 5-3871 s 表示其后是一个替换命令?/p> pat1 q是要查扄一个正则表辑ּQ这文章中有一大堆例子?/p> g 可选标志,带这个标志表C替换将针对行中每个匚w的串q行Q否则则只替换行中第一个匹配串?/p>
用户账号密码
为安全v见,需要定期更改超U用户root的密码。这个操作十分简单,在shell提示W?后输?passwd回RQ然后两ơ输入新密码卛_。退出rootdQ然后再ơ登录,验密码修Ҏ否正。然而不q的事情q是偶尔会发生,刚才更改的密码记不清楚了Qroot用户d不了Q急h啦,Nq要重装linux操作pȝQ如果你q想试一遍安装操作,本是无可厚非的,但这q不是一个好LQ特别是在硬盘上存储很多重要数据的情形下。请参照下面的操作来解决q个问题Q?br />1? 手动重启pȝQ按计算机复位键或先关闭计算机在开启?br />2? 当引pȝ到达“引导加载程序(选择Ʋ启动的操作pȝQ”GRUBӞredhat 9在安装的时候,我们默认安装的引导程序是 GRUBQ,按键盘字母“e”键Q如果硬盘上安装多个操作pȝ的话Q还需要用头选中linux 启动条目。将看到如下几行文本Qؓ节省幅Q多余的文本省略了)
root (hd0,4)
kernel /boot/vmlinuz-2.4.20-8 ro root=LABLE/ hdc=ide-scsi
initrd /boot/initrd-2.4.20-8.img
3? ?“kernel /boot/vmlinuz-2.4.20-8 ro root=LABLE/ hdc=ide-scsi?Ҏ “kernel /boot/vmlinuz-2.4.28 single root=LABLE/ hdc=ide-scsi”后按回车键Q返回编辑屏q?br />4? 按“b”键使用上面更改后的选项引导计算机,q样计算机就q入单用h式(q行U别1Q而不用输入用户名和密码登录?br />5? 输入命opasswd回RQ两ơ输入新口oQ然后小心保存。关于口令设|的有很多,可以Ҏ自己的情况设|复杂口令?br />6? 再次重启计算机,q时便可利使用新密码进入系l了?br />q个操作对于理员来Ԍ是十分有用的Q但是如果这个服务器q行的是关键应用Q那么应当把它锁在机柜里Q因Z是公司聘用的非管理员也能够替你执行这个操作,很危险的?br />
用户账号
有句名言叫“linux是|络”,q就意味着linuxpȝ不是pȝ理员一个h把玩的,有太多的理由让更多的人来使用q个资源。刚安装完的linuxpȝQ只有一个用户rootQ没有Q何责任让其他仅需使用一部分功能的h来共享root账号和密码。既然如此,l要用计机资源的h开设̎号吧?br />1? 开设̎P在命令提C符输入 #useradd sery 可以成功的d账号seryQ用命o#passwd sery 来给账号sery 讄密码。通过q种方式d的̎Lȝ录将?home/sery, sery用户的环境变?bash_profile在目?/home/sery中。也可以指定用户的主目录Q例如我们要安装数据库Y件sybase ASEQ需要指定它的主目录?opt/sybaseQ通过输入命o#useradd –d /opt/sybase sybse 可以了Q这样sybase用户的环境变量\径也变成 /opt/sybase/.bash_profile。可以把一些用h加到一个组了,以满特定的功能。上面开讄两个账号Q默认生两个组sery和sybase?br />2? 更改账号Q某天,公司的sery职了,由新来的tieny接替他的工作Q可以用命o#usermod –l tieny –m –d /home/tieny sery来实现。当然还应当把口令也改一下?br />3? 删除账号Qsery׃工作不力Q被老板开除了Q那么作为系l管理员应当把他的̎号删除,先删除̎?userdel sery,然后q要删除sery用户的主目录/home/sery?br />需要注意的是,上述的̎h作,只有具备理员权限的用户Q比如rootQ才可以q行的,普通用户仅仅能更改自己的密码而已?br />
文本~辑器vi
要用Unix/linux来完成工作,你没有办法来回避使用文本~辑器这个工兗在unix/linux的世界里Qvi是赫赫有名的Qibm的AIX、SUN的Solaris、SCO UNIX、RedHat Linux{等Q没有一个不用vi q个~辑工具的。因此,作ؓunix/linuxpȝ理员,必须熟练掌握q个基本技能?br />vi文本~辑器打开以后Q有两种模式Q命令模式和输入Q或者编辑)模式。在使用q程中,q两U模式是需要来回相互切换的Q初学者对此往往感到qhQ下面D一个例子来说明一下:
我们在此要把计算机的L名改成sery,那么qvi~辑器修攚w|文?etc/hosts文g。输入命?#vi /etc/hosts 回RQ立刻进入vi的命令模式。在q种模式下,可以q行查找、保存文件等操作Q按字母“i”键切换到编辑模?--屏幕底部昄“Insert”,然后光标定位Q输入相关的字符Q输入完毕ƈ查无误后Q按“Esc”键切换到命令模式,接着输入“:”加wq回R把刚才的输入保存在文g/etc/hosts里。整个过Eȝ一下流E就是:vi filename 打开文g---切换到编辑模式(“i”)----输入文本----切换到命令模式(“Esc?Q“:”)----保存文gQwqQ?br />[root@sybase root]# vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost //按i切换~辑模式
202.108.93.200 sery //q行是加上去?br />//按Esc键回到命令模式,再输入“:?br />Qwq //保存文g退?br />
有时Q文件修改后不想保存它,则在命o模式下输入?q!?如果只是打开文g而没有做M修改Q在命o模式下输入?q”就可以了。有一个技巧还是需要掌握的Q那是在文件中查找字符。编辑一个小的文Ӟ字符C多)用光标定位就可以完成修改Q但是如果要~辑的一个文件较大,例如修改Apache的配|文ӞҎ实际应用Q我们仅需?etc/httpd/conf/httpd.conf做少怿改就可以了,假如用光标定位的Ҏ来做q个事情Q恐怕是一件很Ҏ的事Q这Ӟ查找定位q个功能派上用Z。查找是在命令模式下q行的,q一点要记牢。在apache的配|文仉Q我们要修改Ҏ档的位置Q首先?vi /etc/httpd/conf/httpd.conf打开文gq入命o模式Q然后输入“?DocumentRoot”很快就可定位输入点Q接着按“i”切换到~辑模式Q按要求修改文本Q而后切换到命令模式保存退出。查找方式也是很灉|的,Ҏ当前光标所在的位置Q既可以向后查找Q有可以向前查找Q不q向前查扑ּ始字W是?”而不是?”。vi的功能特别多Q在此无法一一列DQ不q笔者介l的Ҏ已经以对付日常的工作,随着旉的推U,你同样会逐步掌握更多?vi 使用技能。随着linux版本不断的升U,vi也越来越便于使用Q例如在linux桌面环境下,可以用鼠标选定文本Q然后用复制功能来化操作?br />
配置|络参数
如果linux服务器不q入|络Q除了供理员测试而外Q再没有别的实际意义Q因此把linux服务器连入网l就是必ȝ了。在W一招安装linuxӞ我们已经把网l的一些参数手动输入了Q但是有时还得在实际应用中更Ҏ些参数。网l参C要包括:IP地址、子|掩码、默认网兛_指定dns服务器。IP地址、子|掩码、默认网关由文g/etc/sysconfig/network-scripts/ifcfg-eth0来指定。用~辑?vi 打开/etc/sysconfig/network-scripts/ifcfg-eth0Q修改对应的|我本Z惯把默认|关加在q个文g里,卛_q个文g里插入一行“GATEWAY=X.X.X.X”。默认网x个非帔R要的讄Q如果设|错误,linux服务器就只能讉K同一|段的主不能与其他|段的计机互访管其他的网l参数设|完全无误。我曾有意无意的犯过q个错误Q结果每ơ都是一栯人沮丧。在讲授|络的课E里Q默认网兌定义成一个三层设备,讲得通俗一点就是\由器Q它的作用是q接不同|段/子网的通信Q它记录与它某一端口直连的同一|段的机器mac与ip地址对应|UCؓARPQ。\由器/|关不会自动获得同一|段L的mac-ip|只有通过手动指定默认|关把主机的mac-ip值通告l网兟뀂指定dns服务器地址可以让linux服务器以域名的方式访问互联网上的其他机器。指定域名服务器地址q程很简单,只需用vi~辑文g/etc/resolve.conf,输入 nameserver 202.106.0.20 保存退出。需要特别注意的是,不要把指定dns服务器与讑֮本linux服务器ؓdns服务器搞混了Q这是两个完全不同的东西Q前者ؓ客户端,后者ؓ服务器端?br />q有一U特D情况,在只有一个网l设备的条g下,我们需要设|几个IP地址Q比如基于IP地址的虚拟主机。这U操作称备别名。eth0的第一个别名是/etc/sysconfig/network-scripts/ifcfg-eth0:1,用编辑器vi参照/etc/sysconfig/network-scripts/ifcfg-eth0的格式输入网l参数即可?br />在系l提C符下,用命?ifconfig eth0 200.200.200.200 255.255.255.248 up也可指定或修改网l设备的|络参数。但是这U修Ҏ式是动态进行的Q系l重启以后就无效了。以命o#route add default gw X.X.X.X d的默认网关也是同L效果?br />修改|络参数后,要修改立即生效Q不需要重启计机Q重新启动网l服务就可以了。在RedHat linux 9以后的版本,只要输入命o#service network restart卛_Q然后用命o#ifconfig –a来检验修改的l果?br />修改|络参数需要管理员权限才能q行?br />
文gpȝ和原始设?br />在这里介l文件系l和原始讑֤Q?raw deviceQ的目的主要是ؓ来安装大型数据库oracle或sybase奠定一些基Q因些数据库可以使用文gpȝ或原始设备作为逻辑存储区域?br />文gpȝ是一U存储数据的ҎQ采用分层目录结构来存储文gQ由一个根目录和许多子目录、文件组成(IBM AIX 5Lpȝ理技术定义)。Redhat linux 9主要包括以下一些目录:
1?bin:linux通用命o?br />2?dev:pȝ讑֤文g?br />3?etc:理配置文g?br />4?home:各用L目录?br />5?mnt:挂接讑֤的位|?br />6?root:根用Lȝ录?br />7?sbin:pȝ理命o和守护进E?br />8?tmp:临时文g目录?br />9?var:应用E序使用的数据目录,如系l日志文件目录、匿名ftp目录{?br />10?usr:手动安装E序的目录?br />对于文gpȝ的目录及其目录下的文Ӟ我们可以直接q行讉KQ例如在/tmp下创建目?tmp/test?br />原始讑֤指不是由基础操作pȝ可以理的磁盘,q句话不太好理解。给linux服务器添加一个硬盘,创徏分区Q但是不能直接用基本命o对这个分行操作,比如直接在上面创建目录,只有通过挂接才可以进行磁盘I/O操作。例子的命oQ?mount /dev/sdb1 /mnt/dsk2, cd /mnt/dsk2Q在q个目录下就可以创徏文g{基本操作了。Sybase{数据库可以直接指定原始讑֤为存储空_其目的是使数据的修改立即写入盘?br />
q行U别
RedHat linux ?-6{几U运行别。与solaris和AIX的运行别的定义差异较大。按照前面安装linux的设定,pȝ启动后进入的q行U别?。要切换到别的运行环境只需输入#init <runlevel> 。下面列出各个运行别的功能Q?br />1? q行U别0Q关机操作?br />2? q行U别1Q单用户l护模式。这U模式只能是用户root,上文我们更改遗忘?root 密码是在这U模式下q行的。另外,有时文gpȝ损坏时进行修复,也要在这U模式下q行。运行?相当与MS windows 2000的安全模式?br />3? q行U别2Q多用户模式。所有配|文件系l被挂装Q但NFS资源不可用。运行?与MS windows 2000的带|络的安全模式有些类伹{?br />4? q行U别3Q这是linux服务器的正常模式Q系l资源完全可用?br />5? q行U别4Q用戯定义?br />6? q行U别5Q多用户带网l服务加囑Ş界面Qinit 3加图形)。这相当于MS windows的正常模式。如果没有安装xwindow׃能启用这个别,用命?startx也可从运行?切换到运行??br />7? q行U别6Q重新启动计机?br />在一般情况下Q我们需要linux服务器工作在q行U别3下,偶尔Z操作方便会?q个U别。Linuxq有另外一些运行别,但不多用。熟l掌握上q几个运行别对于系l维护是很有帮助的?br />
q程操作linux服务?br />linux服务器基本配|完成后Q需要把它撤L试台Q也许要把它攑֜隔自己办公室很远的idc机房Q或者由于同事无法忍受机器巨大的噪音而必L它放在某个隔ȝ房间的机柜里。我们更愿意坐在自己的办公桌前,用桌面系l或W记本来q程控制和操作放在在某个地方的linux服务器,然后惬意的喝一杯咖啡?br />telnet曾作为最主要的远E管理工P׃其存在安全隐患而逐渐失宠Q从RedHat linux 7.1开始,默认情况?telnet 服务是不启用的。安全shell包(sshQ由于它提供Ҏ据的加密传输Q具备较高的安全Ҏ,因此来多的系l管理员正在在用ssh来管理远E的 linux服务器?br />要用ssh服务Q应当保证openssh-server软g包被安装Q一般情况下Qssh服务器被配置成自动启动,?linux服务器端Q不必对ssh做Q何设|,只需保证它被安装和启动就可以了。RedHat linux 允许root用户q程dQ而RedFlag linux则在默认情况下不允许root 用户q程d。可通过修改文g /etc/sshd/sshd_configQ“PermitRootLogin no”表CZ允许root用户q程dQ“PermitRootLogin yes”表C允许root用户q程登陆。我本h习惯使用rootq程d?br />1? 从linuxq接Q输入命?ssh <q程linux服务器的ip地址或域?gt;Q回车后输入 root密码可以得到root的shell环境Q与直接操作linux服务器一栗?br />2? 从windowsq接Q有多款用来q接linux服务器的q程理工具Q比较有名的有SecureCRT、NetTerm、XManager、Putty{。SecureCRT是个不错的工P它不仅支持ssh,q支持文件上传功能。Windows下配|SecureCRT是比较容易的Q在此不做介l?br />下图是SecureCRT使用sshdlinux服务器的事例Q?
当作好上q的准备后,真正的远E操?控制可以开始了?br />
]]>
]]> Portlet开发基知识
<description>Description goes here</description>
<portlet-name>first</portlet-name>
<portlet-class>com.malani.examples.portlets.jsr168.FirstPortlet
</portlet-class>
<portlet-info>
<title>First</title>
</portlet-info>
</portlet>
Ҏ来实现这些模式。另外还需要在portlet.xml配置模式Q?/p>
<mime-type>text/html</mime-type>
<portlet-mode>edit</portlet-mode>
<portlet-mode>help</portlet-mode>
</supports>
<portlet-name>state</portlet-name>
<supports>
<mime-type>text/html</mime-type>
<excluded-window-state>minimized</excluded-window-state>
<excluded-window-state>maximized</excluded-window-state>
</supports>
</portlet>
我们q不推荐您这样做。我们推荐您使用JSP来达到视图-java的分Rؓ了包含一个特定的jsp
首先你必d到PortletContext.在PortletContext中,通过调用getRequestDispatcher()Ҏ
得到PorletRequestDispatcherQ通过它的includer()Ҏ来包含JSp例如Q?br />// execute the necessary logic here...
PortletRequestDispatcher aDispatcher =
getPortletContext().getRequestDispatcher(
"/IncludePortlet/includeView.jsp"
);
aDispatcher.include(aRequest, aResponse);
来帮助我们完成这些工作:
...
</form>
portlet FavoriteColor也展CZ其他概念。第一个是如何在processAction()Ҏ中用~程的方法改变portlet模式。调用ActionResponse对象的setPortletMode()Ҏ来修改portlet模式。第二个概念是如何用一个HTML链接来修改portlet模式。该链接使用来自portlet标签库的renderURL标签生成。根据希望的portlet模式指定portletMode属性的倹{请参考源代码CZ中的FavoriteColorPortletcdfavoriteColorView.jsp面?/p>
]]>
接触 solaris : 安装 oracle
作者:佚名 来源Q本站收集 发布时_2005-11-14 18:40:47 发布人:admin
Install oracle815 in Solaris 7
=================================================
groupadd dba
useradd -g dba oracle
passwd oracle
mkdir /oracle
chown -R oracle.dba /oracle
=================================================
vi /etc/system
(add in the end)=>
set shmsys:shminfo_shmmax=4294967295
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=10
set semsys:seminfo_semmni=100
set semsys:seminfo_semmsl=100
set semsys:seminfo_semmns=2000
set semsys:seminfo_semopm=100
set semsys:seminfo_semvmx=32767
Q请Ҏ实际情况做调_
(add in the end)=>
orasrv 1525/tcp oracle
listener 1521/tcp
Q请Ҏ实际情况做调_
(add or modify)=>
set path=( /oracle/bin /usr/sbin /usr/bin /usr/openwin/bin /oracle /etc /usr/ccs/bin . )
setenv ORACLE_HOME /oracle
setenv ORACLE_SID oracle8
#setenv DISPLAY 10.1.1.110:0.0
setenv NLS_LANG AMERICAN_AMERICA.ZHS16CGB231280
#setenv NLS_LANG=SIMPLIFIED CHINESE_CHINA.ZHS16GBK
Q请Ҏ实际情况做调_
说明Q加#为可选的参数Q?10.1.1.110是用PC行EXTRAXd服务器所配置的?
=================================================
1 、插入ORACLE 安装光盘
#/etc/init.d/volmgt stop
#/etc/init.d/volmgt start
%volcheck
%df -k 查有无cdrom的设?
Are these setting correct (y/n):?y Enter the full pathname of the local bin directory (y/n): ?bin (此shell E序?var/oracle路径下生成一个文件oratab ,q做pȝ?
4.创徏数据库时应该注意的问?
=================================================
心库徏好后不能修改的参敎ͼ
db_block_size : 2048
查oracle安装目录下的 .profile(.cshrc) 讄及其他系l设|?
Q必要的时?reboot 服务器)?oracle/dbs/dbassist 重新建库
rm -r /oracle//
5.建库后的微调
=================================================
#vi /var/opt/oracle/oratab 最后一行改 app1:/oracle:Y
#vi /var/opt/oracle/listener.ora ?host= (host_name) oraclehome= (/oracle)
例子: listener=(address_list=
(address=(protocol=tcp)
(port=1521)
(host=joe)))
sid_list_listener=(sid_list=
(sid_desc=(sid_name=oracle8)
(oracle_home=/oracle)))
trace_level+listener=admin
startup_wait_time_listener=0
connect_timeout_listener=5
6.安装试
=================================================
#su - oracle %env 看环境变量改变了没有
SVRMGR>connect internal
q接打开数据?SVRMGR>shutdown immediate 先关?instances, 数据?
SVRMGR>startup 再打开数据库,当看?instances startup, database mount, database open的时候,oracle安装成功
SVRMGR>exit
7。配|自启动/关闭
=================================================
~写 SH 文g
vi /etc/oracle
OPT_=$1
start)
/bin/echo "$0 : (start)"
#
# Your service startup command goes here.
#
su - oracle -c "/oracle/bin/dbstart"
su - oracle -c "/oracle/bin/lsnrctl start"
# su - root -c "/www/tomcat/bin/startup.sh"
# su - root -c "/www/apache/bin/apachectl start"
exit 0
;;
stop)
/bin/echo "$0 : (stop)"
#
# Your service shutdown command goes here.
#
su - oracle -c "/oracle/bin/lsnrctl stop"
su - oracle -c "/oracle/bin/dbshut"
# su - root -c "/www/tomcat/bin/shutdown.sh"
# su - root -c "/www/apache/bin/apachectl stop"
exit 0
;;
*) /bin/echo ''
/bin/echo "Usage: $0 [start|stop]"
/bin/echo " Invalid argument ==> \"${OPT_}\""
/bin/echo ''
exit 0
;;
esac
ln -s /etc/init.d/oracle /etc/rc2.d/S99oracle
ln -s /etc/init.d/oracle /etc/rc0.d/K01oracle
8.自启?关闭 试
=================================================
reboot ?ps -ef | grep oracle
]]>
匚w中文字符的正则表辑ּQ?[\u4e00-\u9fa5]
评注Q匹配中文还真是个头疼的事,有了q个表达式就好办?br />
匚w双字节字W?包括汉字在内)Q[^\x00-\xff]
评注Q可以用来计字W串的长度(一个双字节字符长度?QASCII字符?Q?br />
匚wI白行的正则表达式:\n\s*\r
评注Q可以用来删除空白行
匚wHTML标记的正则表辑ּQ?lt;(\S*?)[^>]*>.*?|<.*? />
评注Q网上流传的版本太糟p,上面q个也仅仅能匚w部分Q对于复杂的嵌套标记依旧无能为力
匚w首尾I白字符的正则表辑ּQ^\s*|\s*$
评注Q可以用来删除行首行I白字符(包括I格、制表符、换늬{等)Q非常有用的表达?br />
匚wEmail地址的正则表辑ּQ\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
评注Q表单验证时很实?br />
匚w|址URL的正则表辑ּQ[a-zA-z]+://[^\s]*
评注Q网上流传的版本功能很有限,上面q个基本可以满需?br />
匚w帐号是否合法(字母开_允许5-16字节Q允许字母数字下划线)Q^[a-zA-Z][a-zA-Z0-9_]{4,15}$
评注Q表单验证时很实?br />
匚wGUIDQ由数字Q字母,下划U,中划U组?br />/^[a-zA-Z0-9_\-]*$/
匚w国内电话LQ\d{3}-\d{8}|\d{4}-\d{7}
评注Q匹配Ş式如 0511-4405222 ?021-87888822
匚w腾讯QQP[1-9][0-9]{4,}
评注Q腾讯QQ号从10000开?br />
匚w中国邮政~码Q[1-9]\d{5}(?!\d)
评注Q中国邮政编码ؓ6位数?br />
匚ww䆾证:\d{15}|\d{18}
评注Q中国的w䆾证ؓ15位或18?br />
匚wip地址Q\d+\.\d+\.\d+\.\d+
评注Q提取ip地址时有?br />
匚w特定数字Q?br />^[1-9]\d*$ //匚w正整?br />^-[1-9]\d*$ //匚w负整?br />^-?[1-9]\d*$ //匚w整数
^[1-9]\d*|0$ //匚w非负整数Q正整数 + 0Q?br />^-[1-9]\d*|0$ //匚w非正整数Q负整数 + 0Q?br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ //匚w正QҎ
^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ //匚w负QҎ
^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$ //匚w点?br />^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ //匚w非负点敎ͼ正QҎ + 0Q?br />^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ //匚w非正点敎ͼ负QҎ + 0Q?br />评注Q处理大量数据时有用Q具体应用时注意修正
匚w特定字符Ԍ
^[A-Za-z]+$ //匚w?6个英文字母组成的字符?br />^[A-Z]+$ //匚w?6个英文字母的大写l成的字W串
^[a-z]+$ //匚w?6个英文字母的写l成的字W串
^[A-Za-z0-9]+$ //匚w由数字和26个英文字母组成的字符?br />^\w+$ //匚w由数字?6个英文字母或者下划线l成的字W串
评注Q最基本也是最常用的一些表辑ּ
原蝲地址Qhttp://lifesinger.3322.org/myblog/?p=185
]]>正则表达式之?/h1>
sman@scruznet.com
Revised: June 5, 1999
(copied by jm /at/ jmason.org from http://www.scruz.net/%7esman/regexp.htm, after the original disappeared! )
neo.lee@gmail.com
2004q?0?6?/font>
??/h1>
范例
?/a>
中Q神奇的咒语Q?/a>
困难Q不可思议的象形文字)
不同工具中的正则表达?/a>
什么是正则表达?/h1>一个正则表辑ּQ就是用某种模式d配一cdW串的一个公式。很多h因ؓ它们看上L较古怪而且复杂所以不敢去使用——很不幸Q这文章也不能够改变这一点,不过Q经q一点点l习之后我就开始觉得这些复杂的表达式其实写hq是相当单的Q而且Q一旦你弄懂它们Q你p把数时辛苦而且易错的文本处理工作压~在几分钟(甚至几秒钟)内完成。正则表辑ּ被各U文本编辑Y件、类库(例如Rogue Wave的tools.h++Q、脚本工P像awk/grep/sedQ广泛的支持Q而且像Microsoft的Visual C++q种交互式IDE也开始支持它了?
正则表达式基
正则表达式由一些普通字W和一?i>元字W(metacharactersQ?/i>l成。普通字W包括大写的字母和数字Q而元字符则具有特D的含义Q我们下面会l予解释?
元字W?/i> 描述 匚wM单个字符。例如正则表辑ּr.t匚wq些字符Ԍrat?i>rut?i>r tQ但是不匚wroot。?/td> 匚w行结束符。例如正则表辑ּweasel$ 能够匚w字符?He's a weasel"的末,但是不能匚w字符?They are a bunch of weasels."。?/td> 匚w一行的开始。例如正则表辑ּ^When in能够匚w字符?When in the course of human events"的开始,但是不能匚w"What and When in the"?/i> 匚w0或多个正好在它之前的那个字符。例如正则表辑ּ.*意味着能够匚wL数量的Q何字W?/td> q是引用府,用来这里列出的q些元字W当作普通的字符来进行匹配。例如正则表辑ּ\$被用来匹配美元符P而不是行,cM的,正则表达?tt>\.用来匚w点字W,而不是Q何字W的通配W?/td>
[c1-c2]
[^c1-c2]匚w括号中的M一个字W。例如正则表辑ּr[aou]t匚wrat?i>rot?i>rutQ但是不匚wret。可以在括号中用连字符-来指定字W的区间Q例如正则表辑ּ[0-9]可以匚wM数字字符Q还可以制定多个区间Q例如正则表辑ּ[A-Za-z]可以匚wM大小写字母。另一个重要的用法是“排除”,要想匚w除了指定区间之外的字W——也是所谓的补集——在左边的括号和W一个字W之间用^字符Q例如正则表辑ּ[^269A-Z] 匹配除???和所有大写字母之外的M字符?/td> 匚w词(wordQ的开始(\<Q和l束Q\>Q。例如正则表辑ּ\<the能够匚w字符?for the wise"中的"the"Q但是不能匹配字W串"otherwise"中的"the"?strong>注意Q这个元字符不是所有的软g都支持的?/td> ?\( ?\) 之间的表辑ּ定义为“组”(groupQ,q且匹配这个表辑ּ的字W保存到一个时区域(一个正则表辑ּ中最多可以保?个)Q它们可以用 \1 ?b>\9 的符h引用?/td> 两个匹配条件进行逻辑“或”(OrQ运。例如正则表辑ּ(him|her) 匚w"it belongs to him"?it belongs to her"Q但是不能匹?it belongs to them."?strong>注意Q这个元字符不是所有的软g都支持的?/td> 匚w1或多个正好在它之前的那个字符。例如正则表辑ּ9+匚w9?9?99{?strong>注意Q这个元字符不是所有的软g都支持的?/td> 匚w0?个正好在它之前的那个字符?strong>注意Q这个元字符不是所有的软g都支持的?/td>
\{i,j\}匚w指定数目的字W,q些字符是在它之前的表达式定义的。例如正则表辑ּA[0-9]\{3\} 能够匚w字符"A"后面跟着正好3个数字字W的Ԍ例如A123、A348{,但是不匹配A1234。而正则表辑ּ[0-9]\{4,6\} 匚wq箋的Q?个?个或?个数字字W?strong>注意Q这个元字符不是所有的软g都支持的?/td> he is a rat
我们可以使用grep命o来测试我们的正则表达式,grep命o使用正则表达式去试匚w指定文g的每一行,q将臛_有一处匹配表辑ּ的所有行昄出来。命?
he is in a rut
the food is Rotten
I like root beergrep r.t test.txt
在test.txt文g中的每一行中搜烦正则表达?b>r.tQƈ打印输出匚w的行。正则表辑ּr.t匚w一?b>r接着M一个字W再接着一?b>t。所以它匹配文件中?b>rat?b>rutQ而不能匹?b>Rotten中的RotQ因为正则表辑ּ是大写敏感的。要惛_时匹配大写和写字母Q应该用字W区间元字符Q方括号Q。正则表辑ּ[Rr]能够同时匚wR?b>r。所以,要想匚w一个大写或者小写的r接着M一个字W再接着一?b>tp使用q个表达式:[Rr].t?
单的例子
vi 命o 作用 :%s/ */ /g 把一个或者多个空格替换ؓ一个空根{?/td> :%s/ *$// L行尾的所有空根{?/td> :%s/^/ / 在每一行头上加入一个空根{?/td> :%s/^[0-9][0-9]* // L行首的所有数字字W?/td> :%s/b[aeio]g/bug/g 所有的bag?i>beg?i>big?i>bog改ؓbug。?/td> :%s/t\([aou]\)g/h\1t/g 所?i>tag?i>tog?i>tug分别改ؓhat?i>hot?i>hugQ注意用group的用法和使用\1引用前面被匹配的字符Q?/td> 中的例子(奇的咒语)
?
之前 之后 foo(10,7,2) foo(7,10,2) foo(x+13,y-2,10) foo(y-2,x+13,10) foo( bar(8), x+y+z, 5) foo( x+y+z, bar(8), 5) :%s/foo(\([^,]*\),\([^,]*\),\([^)]*\))/foo(\2,\1,\3)/g
[^,] 除了逗号之外的Q何字W?/td> [^,]* 0或者多个非逗号字符 \([^,]*\) 这些非逗号字符标记?b>\1Q这样可以在之后的替换模式表辑ּ中引用它 \([^,]*\), 我们必须扑ֈ0或者多个非逗号字符后面跟着一个逗号Qƈ且非逗号字符那部分要标记出来以备后用?/td> ?
假设有一个CSVQcomma separated valueQ文Ӟ里面有一些我们需要的信息Q但是格式却有问题,目前数据的列序是:姓名Q公司名Q州名羃写,邮政~码Q现在我们希望讲q些数据重新l织Q以便在我们的某个Y件中使用Q需要的格式为:姓名Q州名羃?邮政~码Q公司名。也是_我们要调整列序Q还要合q两个列来构成一个新列。另外,我们的Y件不能接受逗号前后面有MI格Q包括空格和制表W)所以我们还必须要去掉逗号前后的所有空根{?
Bill Jones, HI-TEK Corporation , CA, 95011
我们希望把它变成q个样子Q?
Sharon Lee Smith, Design Works Incorporated, CA, 95012
B. Amos , Hill Street Cafe, CA, 95013
Alexander Weatherworth, The Crafts Store, CA, 95014
...Bill Jones,CA 95011,HI-TEK Corporation
我们用两个正则表达式来解决q个问题。第一个移动列和合q列Q第二个用来LI格?
Sharon Lee Smith,CA 95012,Design Works Incorporated
B. Amos,CA 95013,Hill Street Cafe
Alexander Weatherworth,CA 95014,The Crafts Store
...:%s/\([^,]*\),\([^,]*\),\([^,]*\),\(.*\)/\1,\3 \4,\2/
q里的方法跟?基本一PW一个列Q姓名)用这个表辑ּ来匹配:\([^,]*\)Q即W一个逗号之前的所有字W,而姓名内容被?b>\1标记下来。公司名和州名羃写字D는同样的方法标Cؓ\2?b>\3Q而最后一个字D는\(.*\)来匹配("匚w所有字W直到行?Q。替换部分则引用上面标记的那些内Ҏq行构造?
:%s/[ \t]*,[ \t]*/,/g
我们q是分解来看Q?b>[ \t]匚wI格/制表W,[ \t]* 匚w0或多个空?制表W,[ \t]*,匚w0或多个空?制表W后面再加一个逗号Q最后,[ \t]*,[ \t]*匚w0或多个空?制表W接着一个逗号再接着0或多个空?制表W。在替换部分Q我们简单的我们扑ֈ的所有东西替换成一个逗号。这里我们用了l尾的可选的g参数Q这表示在每行中Ҏ有匹配的串执行替换(而不是缺省的只替换第一个匹配串Q?
?
假设有一个多字符的片断重复出玎ͼ例如Q?
Billy tried really hard
而你x"really"?really really"Q以及Q意数量连l出现的"really"字符串换成一个简单的"very"Qsimple is good!Q,那么以下命oQ?
Sally tried really really hard
Timmy tried really really really hard
Johnny tried really really really really hard:%s/\(really \)\(really \)*/very /
׃把上q的文本变成Q?
Billy tried very hard
表达?b>\(really \)*匚w0或多个连l的"really "Q注意结有个空|Q?b>\(really \)\(really \)* 匚w1个或多个q箋?really "实例?
Sally tried very hard
Timmy tried very hard
Johnny tried very hard困难的例子(不可思议的象形文字)
Coming soon.
不同工具中的正则表达?/h1>OKQ你已经准备使用REQregular expressionsQ正则表辑ּQ,但是你ƈ准备使用vi。所以,在这里我们给Z些在其他工具中用RE的例子。另外,我还会ȝ一下你在不同程序之间用RE可能发现的区别?
sed
sed脚本 描述 sed 's/^$/d' price.txt 删除所有空?/td> sed 's/^[ \t]*$/d' price.txt 删除所有只包含I格或者制表符的行 sed 's/"http://g' price.txt 删除所有引?/td> awk
awk是一U编E语aQ可以用来对文本数据q行复杂的分析和处理。可以在手册中得到关于awk的详l信息。这个古怪的名字是它作者们的姓的羃写(AhoQWeinberger和KernighanQ?
awk脚本 描述 awk '$0 !~ /^$/' price.txt 删除所有空?/td> awk 'NF > 0' price.txt awk中一个更好的删除所有行的办?/td> awk '$2 ~ /^[JT]/ {print $3}' price.txt 打印所有第二个字段?J'或?T'打头的行中的W三个字D?/td> awk '$2 !~ /[Mm]isc/ {print $3 + $4}' price.txt 针对所有第二个字段不包?Misc'或?misc'的行Q打印第3和第4列的和(假定为数字) awk '$3 !~ /^[0-9]+\.[0-9]*$/ {print $0}' price.txt 打印所有第三个字段不是数字的行Q这里数字是?tt>d.d或?tt>dq样的Ş式,其中d??的Q何数?/td> awk '$2 ~ /John|Fred/ {print $0}' price.txt 如果W二个字D包?John'或?Fred'则打印整?/td> grep
grep是一个用来在一个或者多个文件或者输入流中用REq行查找的程序。它的name~程语言可以用来针对文g和管道进行处理。可以在手册中得到关于grep的完整信息。这个同样古怪的名字来源于vi的一个命令,g/re/pQ意思是global regular expression print?
Wong, Fred 4-4123
Jones, Thomas 1-4122
Salazar, Richard 5-2522grep命o 描述 grep '\t5-...1' phone.txt 把所有电话号码以5开头以1l束的行打印出来Q注意制表符是用\t表示?/td> grep '^S[^ ]* R' phone.txt 打印所有姓以S打头和名以R打头的行 grep '^[JW]' phone.txt 打印所有姓开头是J或者W的行 grep ', ....\t' phone.txt 打印所有姓?个字W的行,注意制表W是?b>\t表示?/td> grep -v '^[JW]' phone.txt 打印所有不以J或者W开头的?/td> grep '^[M-Z]' phone.txt 打印所有姓的开头是M到Z之间M字符的行 grep '^[M-Z].*[12]' phone.txt 打印所有姓的开头是M到Z之间M字符Qƈ且点号号码结是1或?的行 egrep
egrep是grep的一个扩展版本,它在它的正则表达式中支持更多的元字符。下面的例子中我们假定在文gphone.txt中包含以下的文本Q——其格式是姓加一个逗号Q然后是名,然后是一个制表符Q然后是电话LQ?
Francis, John 5-3871
Wong, Fred 4-4123
Jones, Thomas 1-4122
Salazar, Richard 5-2522egrep command Description egrep '(John|Fred)' phone.txt 打印所有包含名?i>John或?i>Fred的行 egrep 'John|22$|^W' phone.txt 打印所有包?i>John 或者以22l束或者以W的行 egrep 'net(work)?s' report.txt 从report.txt中找到所有包?i>networks或?i>nets的行 正则表达式语法支持情?/h1>
命o或环?/b> . [ ] ^ $ \( \) \{ \} ? + | ( ) vi X X X X X Visual C++ X X X X X awk X X X X X X X X sed X X X X X X Tcl X X X X X X X X X ex X X X X X X grep X X X X X X egrep X X X X X X X X X fgrep X X X X X perl X X X X X X X X X vi替换命o?/h1>Vi的替换命令:
:ranges/pat1/pat2/g
其中
: q是Vi的命令执行界面?
range 是命令执行范围的指定Q可以用百分号Q?Q表C所有行Q用点Q?Q表C当前行Q用美元符P$Q表C最后一行。你q可以用行P例如10,20表示W?0?0行,.,$表示当前行到最后一行,.+2,$-5表示当前行后两行直到全文的倒数W五行,{等?
pat2 q是希望把匹配串变成的模式的正则表达式,q篇文章中有一大堆例子?
|上有很多vi的在U手册,你可以访问他们以获得更加完整的信息?
]]>正则表达式详l解
字符/
意义Q对于字W,通常表示按字面意义,指出接着的字WؓҎ字符Q不作解释?br />例如Q?b/匚w字符’b?通过在b 前面加一个反斜杠Q也是/b/Q则该字W变成特D字W,表示
匚w一个单词的分界Uѝ?br />或者:
对于几个字符Q通常说明是特D的Q指出紧接着的字W不是特D的Q而应该按字面解释?br />例如Q?是一个特D字W,匚wL个字W?包括0个字W?Q例如:/a*/意味匚w0个或多个a。ؓ了匹配字面上?Q在a前面加一个反斜杠Q例如:/a*/匚w’a*’?br />
字符^
意义Q表C匹配的字符必须在最前边?br />例如Q?^A/不匹?an A,"中的’A’,但匹?An A."中最前面的’A’?br />
字符$
意义Q与^cMQ匹配最末的字符?br />例如Q?t$/不匹?eater"中的’t’,但匹?eat"中的’t’?br />
字符*
意义Q匹?前面的字W?ơ或nơ?br />例如:/bo*/匚w"A ghost booooed"中的’boooo’或"A bird warbled"中的’b’,但不匚w"Agoat g
runted"中的M字符?br />
字符+
意义Q匹?号前面的字符1ơ或nơ。等价于{1,}?br />例如Q?a+/匚w"candy"中的’a’和"caaaaaaandy."中的所有’a’?br />
字符?
意义Q匹?前面的字W?ơ或1ơ?br />例如Q?e?le?/匚w"angel"中的’el’和"angle."中的’le’?br />
字符.
意义Q?数?匚w除换行符外的所有单个的字符?br />例如Q?.n/匚w"nay, an apple is on the tree"中的’an’和’on’,但不匚w’nay’?br />
字符(x)
意义Q匹配’x’ƈ记录匚w的倹{?br />例如Q?(foo)/匚w和记?foo bar."中的’foo’。匹配子串能被结果数l中的素[1], ...,[n] q?br />回,或被RegExp对象的属? ..., q回?br />
字符x│y
意义Q匹配’x’或者’y’?br />例如Q?green│red/匚w"green apple"中的’green’和"red apple."中的’red’?br />
字符{ n }
意义Q这里的n是一个正整数。匹配前面的n个字W?br />例如Q?a{ 2 }/不匹?candy,"中的’a’,但匹?caandy," 中的所有’a’和"caaandy."中前面的两个’a’?br />
字符{ n, }
意义Q这里的n是一个正整数。匹配至n个前面的字符?br />例如Q?a{ 2, }不匹?candy"中的’a’,但匹?caandy"中的所有’a’和"caaaaaaandy."中的所有’a?br />
字符{ n,m }
意义Q这里的n和m都是正整数。匹配至n个最多m个前面的字符?br />例如Q?a{ 1,3 }/不匹?cndy"中的M字符Q但匚w "candy,"中的’a’,"caandy," 中的前面两个
’a’和"caaaaaaandy"中前面的三个’a’,注意Q即?caaaaaaandy" 中有很多个’a’,但只匚w前面的三 个’a’即"aaa"?br />
字符[xyz]
意义Q一字符列表Q匹配列Z的Q一字符。你可以通过q字W?指出一个字W范围?br />例如Q[abcd]跟[a-c]一栗它们匹?brisket"中的’b’和"ache"中的’c’?br />
字符[^xyz]
意义Q一字符补集Q也是_它匹配除了列出的字符外的所有东ѝ?你可以用连字符-指出一 字符范围?br />例如Q[^abc]和[^a-c]{hQ它们最早匹?brisket"中的’r’和"chop."中的’h’?br />
字符
意义Q匹配一个空?不要与bh)
字符b
意义Q匹配一个单词的分界U,比如一个空?不要与?
例如Q?bnw/匚w"noonday"中的’no’,/wyb/匚w"possibly yesterday."中的’ly’?br />
字符B
意义Q匹配一个单词的非分界线
例如Q?wBn/匚w"noonday"中的’on’,/yBw/匚w"possibly yesterday."中的’ye’?br />
字符cX
意义Q这里的X是一个控制字W。匹配一个字W串的控制字W?br />例如Q?cM/匚w一个字W串中的control-M?br />
字符d
意义Q匹配一个数字,{h于[0-9]?br />例如Q?d/?[0-9]/匚w"B2 is the suite number."中的?’?br />
字符D
意义Q匹配Q何的非数字,{h于[^0-9]?br />例如Q?D/?[^0-9]/匚w"B2 is the suite number."中的’B’?br />
字符f
意义Q匹配一个表单符
字符n
意义Q匹配一个换行符
字符r
意义Q匹配一个回车符
字符s
意义Q匹配一个单个whiteI格W,包括I格QtabQform feedQ换行符Q等价于[ fnrtv]?br />例如Q?sw*/匚w"foo bar."中的?bar’?br />
字符S
意义Q匹配除whiteI格W以外的一个单个的字符Q等价于[^ fnrtv]?br />例如Q?S/w*匚w"foo bar."中的’foo’?br />
字符t
意义Q匹配一个制表符
字符v
意义Q匹配一个顶头制表符
字符w
意义Q匹配所有的数字和字母以及下划线Q等价于[A-Za-z0-9_]?br />例如Q?w/匚w"apple,"中的’a’,".28,"中的?’和"3D."中的?’?br />
字符W
意义Q匹配除数字、字母外及下划线外的其它字符Q等价于[^A-Za-z0-9_]?br />例如Q?W/或?[^$A-Za-z0-9_]/匚w"50%."中的?’?br />
字符n
意义Q这里的n是一个正整数。匹配一个正则表辑ּ的最后一个子串的n的?计数左圆括号)?br />
例如Q?apple(,)sorange1/匚w"apple, orange, cherry, peach."中的’apple, orange’,下面有一个更加完整的例子?br />注意Q如果左圆括号中的数字比n指定的数字还,则n取下一行的八进制escape作ؓ描述?br />
字符ooctal和xhex
意义Q这里的ooctal是一个八q制的escape|而xhex是一个十六进制的escape|允许在一个正则表辑ּ中嵌入ASCII?br />
?下表是元字符及其在正则表辑ּ上下文中的行为的一个完整列表:字符 描述 \
下一个字W标Cؓ一个特D字W、或一个原义字W、或一个后向引用、或一个八q制转义W。例如,'n' 匚w字符 "n"?\n' 匚w一个换行符。序?'\' 匚w "" ?"\(" 则匹?"("?
^
匚w输入字符串的开始位|。如果设|了 RegExp 对象?Multiline 属性,^ 也匹?'\n' ?'\r' 之后的位|?
$
匚w输入字符串的l束位置。如果设|了RegExp 对象?Multiline 属性,$ 也匹?'\n' ?'\r' 之前的位|?
*
匚w前面的子表达式零ơ或多次。例如,zo* 能匹?"z" 以及 "zoo"?* {h于{0,}?
+ 匚w前面的子表达式一ơ或多次。例如,'zo+' 能匹?"zo" 以及 "zoo"Q但不能匚w "z"? {h?{1,}?
?
匚w前面的子表达式零ơ或一ơ。例如,"do(es)?" 可以匚w "do" ?"does" 中的"do" ? {h?{0,1}?
{n}
n 是一个非负整数。匹配确定的 n ơ。例如,'o{2}' 不能匚w "Bob" 中的 'o'Q但是能匚w "food" 中的两个 o?
{n,}
n 是一个非负整数。至匹配n ơ。例如,'o{2,}' 不能匚w "Bob" 中的 'o'Q但能匹?"foooood" 中的所?o?o{1,}' {h?'o+'?o{0,}' 则等价于 'o*'?
{n,m}
m ?n 均ؓ非负整数Q其中n <= m。最匹?n ơ且最多匹?m ơ。刘Q?"o{1,3}" 匹?"fooooood" 中的前三?o?o{0,1}' {h?'o?'。请注意在逗号和两个数之间不能有空根{?
?
当该字符紧跟在Q何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面Ӟ匚w模式是非贪婪的。非贪婪模式可能少的匹配所搜烦的字W串Q而默认的贪婪模式则尽可能多的匚w所搜烦的字W串。例如,对于字符?"oooo"Q?o+?' 匹配单?"o"Q?'o+' 匹配所?'o'?
.
匚w?"\n" 之外的Q何单个字W。要匚w包括 '\n' 在内的Q何字W,请用象 '[.\n]' 的模式?
(pattern)
匚wpattern q获取这一匚w。所获取的匹配可以从产生?Matches 集合得到Q在VBScript 中?SubMatches 集合Q在JScript 中则使用 {CONTENT}?属性。要匚w圆括号字W,请?'\(' ?'\)'?
(?:pattern)
匚w pattern 但不获取匚wl果Q也是说这是一个非获取匚wQ不q行存储供以后用。这在?"? 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 是一个比 'industry|industries' 更简略的表达式?
(?=pattern)
正向预查Q在M匚w pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹?"Windows 2000" 中的 "Windows" Q但不能匚w "Windows 3.1" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开始?
(?!pattern)
负向预查Q在M不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字W串开始处匚w查找字符丌Ӏ这是一个非获取匚wQ也是_该匹配不需要获取供以后使用。例?Windows (?!95|98|NT|2000)' 能匹?"Windows 3.1" 中的 "Windows"Q但不能匚w "Windows 2000" 中的 "Windows"。预查不消耗字W,也就是说Q在一个匹配发生后Q在最后一ơ匹配之后立卛_始下一ơ匹配的搜烦Q而不是从包含预查的字W之后开?
x|y
匚w x ?y。例如,'z|food' 能匹?"z" ?"food"?(z|f)ood' 则匹?"zood" ?"food"?
[xyz]
字符集合。匹配所包含的Q意一个字W。例如, '[abc]' 可以匚w "plain" 中的 'a'?
[^xyz]
负值字W集合。匹配未包含的Q意字W。例如, '[^abc]' 可以匚w "plain" 中的'p'?
[a-z]
字符范围。匹配指定范围内的Q意字W。例如,'[a-z]' 可以匚w 'a' ?'z' 范围内的L写字母字符?
[^a-z]
负值字W范围。匹配Q何不在指定范围内的Q意字W。例如,'[^a-z]' 可以匚wM不在 'a' ?'z' 范围内的L字符?
\b
匚w一个单词边界,也就是指单词和空格间的位|。例如, 'er\b' 可以匚w"never" 中的 'er'Q但不能匚w "verb" 中的 'er'?
\B
匚w非单词边界?er\B' 能匹?"verb" 中的 'er'Q但不能匚w "never" 中的 'er'?
\cx
匚w由x指明的控制字W。例如, \cM 匚w一?Control-M 或回车符?x 的值必Mؓ A-Z ?a-z 之一。否则,?c 视ؓ一个原义的 'c' 字符?
\d
匚w一个数字字W。等价于 [0-9]?
\D
匚w一个非数字字符。等价于 [^0-9]?
\f
匚w一个换늬。等价于 \x0c ?\cL?
\n
匚w一个换行符。等价于 \x0a ?\cJ?
\r
匚w一个回车符。等价于 \x0d ?\cM?
\s
匚wMI白字符Q包括空根{制表符、换늬{等。等价于 [ \f\n\r\t\v]?
\S
匚wM非空白字W。等价于 [^ \f\n\r\t\v]?
\t
匚w一个制表符。等价于 \x09 ?\cI?
\v
匚w一个垂直制表符。等价于 \x0b ?\cK?
\w
匚w包括下划U的M单词字符。等价于'[A-Za-z0-9_]'?
\W
匚wM非单词字W。等价于 '[^A-Za-z0-9_]'?
\xn
匚w nQ其?n 为十六进制{义倹{十六进制{义值必Mؓ定的两个数字长。例如, '\x41' 匚w "A"?\x041' 则等价于 '\x04' & "1"。正则表辑ּ中可以?ASCII ~码?
\num
匚w numQ其?num 是一个正整数。对所获取的匹配的引用。例如,'(.)' 匚w两个q箋的相同字W?
\n
标识一个八q制转义值或一个后向引用。如?\n 之前臛_ n 个获取的子表辑ּQ则 n 为后向引用。否则,如果 n 为八q制数字 (0-7)Q则 n Z个八q制转义倹{?
\nm
标识一个八q制转义值或一个后向引用。如?\nm 之前臛_有is preceded by at least nm 个获取得子表辑ּQ则 nm 为后向引用。如?\nm 之前臛_?n 个获取,?n Z个后跟文?m 的后向引用。如果前面的条g都不满Q若 n ?m 均ؓ八进制数?(0-7)Q则 \nm 匹配八q制转义?nm?
\nml
如果 n 为八q制数字 (0-3)Q且 m ?l 均ؓ八进制数?(0-7)Q则匚w八进制{义?nml?
\un
匚w nQ其?n 是一个用四个十六q制数字表示?Unicode 字符。例如,\u00A9 匚w版权W号 (?)?
]]>
--表说?br />SELECT dbo.sysobjects.name AS TableName,
dbo.sysproperties.[value] AS TableDesc
FROM dbo.sysproperties INNER JOIN
dbo.sysobjects ON dbo.sysproperties.id = dbo.sysobjects.id
WHERE (dbo.sysproperties.smallid = 0)
ORDER BY dbo.sysobjects.name
--字段说明
SELECT dbo.sysobjects.name AS TableName, dbo.syscolumns.colid,
dbo.syscolumns.name AS ColName, dbo.sysproperties.[value] AS ColDesc
FROM dbo.sysproperties INNER JOIN
dbo.sysobjects ON dbo.sysproperties.id = dbo.sysobjects.id INNER JOIN
dbo.syscolumns ON dbo.sysobjects.id = dbo.syscolumns.id AND
dbo.sysproperties.smallid = dbo.syscolumns.colid
ORDER BY dbo.sysobjects.name, dbo.syscolumns.colid
--主键、外键信??
select
c_obj.name as CONSTRAINT_NAME
,t_obj.name as TABLE_NAME
,col.name as COLUMN_NAME
,case col.colid
when ref.fkey1 then 1
when ref.fkey2 then 2
when ref.fkey3 then 3
when ref.fkey4 then 4
when ref.fkey5 then 5
when ref.fkey6 then 6
when ref.fkey7 then 7
when ref.fkey8 then 8
when ref.fkey9 then 9
when ref.fkey10 then 10
when ref.fkey11 then 11
when ref.fkey12 then 12
when ref.fkey13 then 13
when ref.fkey14 then 14
when ref.fkey15 then 15
when ref.fkey16 then 16
end as ORDINAL_POSITION
from
sysobjects c_obj
,sysobjects t_obj
,syscolumns col
,sysreferences ref
where
permissions(t_obj.id) != 0
and c_obj.xtype in ('F ')
and t_obj.id = c_obj.parent_obj
and t_obj.id = col.id
and col.colid in
(ref.fkey1,ref.fkey2,ref.fkey3,ref.fkey4,ref.fkey5,ref.fkey6,
ref.fkey7,ref.fkey8,ref.fkey9,ref.fkey10,ref.fkey11,ref.fkey12,
ref.fkey13,ref.fkey14,ref.fkey15,ref.fkey16)
and c_obj.id = ref.constid
union
select
i.name as CONSTRAINT_NAME
,t_obj.name as TABLE_NAME
,col.name as COLUMN_NAME
,v.number as ORDINAL_POSITION
from
sysobjects c_obj
,sysobjects t_obj
,syscolumns col
,master.dbo.spt_values v
,sysindexes i
where
permissions(t_obj.id) != 0
and c_obj.xtype in ('UQ' ,'PK')
and t_obj.id = c_obj.parent_obj
and t_obj.xtype = 'U'
and t_obj.id = col.id
and col.name = index_col(t_obj.name,i.indid,v.number)
and t_obj.id = i.id
and c_obj.name = i.name
and v.number > 0
and v.number <= i.keycnt
and v.type = 'P'
order by CONSTRAINT_NAME, ORDINAL_POSITION
--主键、外键对??
select
fc_obj.name as CONSTRAINT_NAME
,i.name as UNIQUE_CONSTRAINT_NAME
from
sysobjects fc_obj
,sysreferences r
,sysindexes i
,sysobjects pc_obj
where
permissions(fc_obj.parent_obj) != 0
and fc_obj.xtype = 'F'
and r.constid = fc_obj.id
and r.rkeyid = i.id
and r.rkeyindid = i.indid
and r.rkeyid = pc_obj.id
------------------------------------------ ORACLE ----------------------------------------------------
--表信?br />select * from all_tab_comments t
where owner='DBO'
--列信?br />select * from all_col_comments t
where owner='DBO'
--主键、外键对?br />select OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, R_OWNER, R_CONSTRAINT_NAME
from all_constraints
where owner='DBO' and (Constraint_Type='P' or Constraint_Type='R')
--主键、外键信?br />select *
from all_cons_columns
where owner='DBO'
order by Constraint_Name, Position
-------------------------------------------- Access ----------------------------------------------------
//Access中的pȝ表MSysobjects存储属性的字段是二q制格式Q不能直接分?br />//可以采用ADO自带的OpenSchemaҎ获得相关信息
//use ADOInt.pas
//po: TableName
//DBCon:TADOConnection
/ds:TADODataSet
--表信?br />DBCon.OpenSchema(siTables, VarArrayOf([Null, Null, 'Table']), EmptyParam, ds);
--列信?br />DBCon.OpenSchema(siColumns, VarArrayOf([Null, Null, 'po']), EmptyParam, ds);
--主键
DBCon.OpenSchema(siPrimaryKeys, EmptyParam, EmptyParam, ds);
--主键、外键对?br />DBCon.OpenSchema(siForeignKeys, EmptyParam, EmptyParam, ds);
使用<f:attribute>標籤來設定屬性,接著我們可以如下取得所a定的屬性:
....
<h:inputSecret value="#{user.password}" required="true">
<f:validator validatorId="onlyfun.caterpillar.Password"/>
<f:attribute name="pattern" value=".+[0-9]+"/>
</h:inputSecret><p>
....
您也可以開發自己的一i驗證標c,並提供相關屬性設定,這需要瞭解JSP Tag Library的撰寫,所以請您先參?JSP/Servlet 中有關於JSP Tag Library的介紏V?BR> 要開發驗證器轉用標籤Q您可以直接J承javax.faces.webapp.ValidatorTagQ這個類別可以幫您處理大部䆾的細Q您所需要的Q就是重新定它的createValidator()ҎQ我們以改寫 自訂驗證?/A> 中的PasswordValidatorZQ?BR>
....
public void validate(FacesContext context,
UIComponent component,
Object obj)
throws ValidatorException {
....
String pattern = (String)
component.getAttributes().get("pattern");
....
}
....
主要的差別是我們提供了pattern屬性,在validate()Ҏ中進行驗證時,是根據我們所a定的pattern屬性,接著我們繼?javax.faces.webapp.ValidatorTag來撰寫自q驗證標籤Q?BR>
package onlyfun.caterpillar;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
public class PasswordValidator implements Validator {
private String pattern;
public void setPattern(String pattern) {
this.pattern = pattern;
}
public void validate(FacesContext context,
UIComponent component,
Object obj)
throws ValidatorException {
String password = (String) obj;
if(password.length() < 6) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"字元長度於6", "字元長度不得於6");
throw new ValidatorException(message);
}
if(pattern != null && !password.matches(pattern)) {
FacesMessage message = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"密碼必須包括字元與數?,
"密碼必須是字元加數字所i成");
throw new ValidatorException(message);
}
}
}
application.createValidator()Ҏ建立驗證器物件時Q是Ҏ在faces-config.xml中註冊驗證器的識別(Validater IDQ:
package onlyfun.caterpillar;
import javax.faces.application.Application;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.webapp.ValidatorTag;
public class PasswordValidatorTag extends ValidatorTag {
private String pattern;
public void setPattern(String pattern) {
this.pattern = pattern;
}
protected Validator createValidator() {
Application application =
FacesContext.getCurrentInstance().
getApplication();
PasswordValidator validator =
(PasswordValidator) application.createValidator(
"onlyfun.caterpillar.Password");
validator.setPattern(pattern);
return validator;
}
}
剩下來的工作Q就是佈|tld描述檔了Q我們簡單的定義一下:
<?xml version="1.0"?>
<!DOCTYPE faces-config PUBLIC
"-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.0//EN"
"http://java.sun.com/dtd/web-facesconfig_1_0.dtd">
<faces-config>
....
<validator>
<validator-id>
onlyfun.caterpillar.Password
</validator-id>
<validator-class>
onlyfun.caterpillar.PasswordValidator
</validator-class>
</validator>
....
</faces-config>
而我們的index.jsp改寫如下Q?BR>
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
web-jsptaglibrary_2_0.xsd"
version="2.0">
<description>PasswordValidator Tag</description>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>co</short-name>
<uri>http://caterpillar.onlyfun.net</uri>
<tag>
<description>PasswordValidator</description>
<name>passwordValidator</name>
<tag-class>
onlyfun.caterpillar.PasswordValidatorTag
</tag-class>
<body-content>empty</body-content>
<attribute>
<name>pattern</name>
<required>true</required>
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
</taglib>
主要的差別是Q我們用了自己的驗證器標籤Q?BR>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>
<%@ taglib uri="/WEB-INF/taglib.tld" prefix="co" %>
<%@page contentType="text/html;charset=Big5"%>
<html>
<head>
<title>驗證器示?lt;/title>
</head>
<body>
<f:view>
<h:messages layout="table" style="color:red"/>
<h:form>
<h3>請入您的名E?lt;/h3>
<h:outputText value="#{user.errMessage}"/><p>
名稱: <h:inputText value="#{user.name}"
required="true"/><p>
密碼: <h:inputSecret value="#{user.password}"
required="true">
<co:passwordValidator pattern=".+[0-9]+"/>
</h:inputSecret> <p>
<h:commandButton value="送出"
action="#{user.verify}"/>
</h:form>
</f:view>
</body>
</html>
如果要自a轉換器標籤Q方法也是類|您要作的是繼承javax.faces.webapp.ConverterTagQ並重新定義?createConverter()Ҏ?BR>
<co:passwordValidator pattern=".+[0-9]+"/>
*
createProduct
/createProduct.jsp
/createProduct.jsp
success
/uploadImage.jsp
retry
/createProduct.jsp
cancel
/productList.jsp
public String createAction() {
try {
Product product = ProductBeanBuilder.createProduct(this);
//Save the product.
this.serviceLocator.getCatalogService().saveProduct(product);
//Store the current product id inside the session bean.
//For the use of image uploader.
FacesUtils.getSessionBean().setCurrentProductId(this.id);
//Remove the productList inside the cache.
this.logger.debug("remove ProductListBean from cache");
FacesUtils.resetManagedBean(BeanNames.PRODUCT_LIST_BEAN);
} catch (DuplicateProductIdException de) {
String msg = "Product id already exists";
this.logger.info(msg);
FacesUtils.addErrorMessage(msg);
return NavigationResults.RETRY;
} catch (Exception e) {
String msg = "Could not save product";
this.logger.error(msg, e);
FacesUtils.addErrorMessage(msg + ": Internal Error");
return NavigationResults.FAILURE;
}
String msg = "Product with id of " + this.id + " was created successfully.";
this.logger.debug(msg);
FacesUtils.addInfoMessage(msg);
return NavigationResults.SUCCESS;
}
Backing bean that contains product information.
ServletContext context = FacesUtils.getServletContext();业务逻辑?/B>
this.appContext = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
this.catalogService = (CatalogService)this.lookupService(CATALOG_SERVICE_BEAN_NAME);
this.userService = (UserService)this.lookupService(USER_SERVICE_BEAN_NAME);
public interface CatalogService {
public Product saveProduct(Product product) throws CatalogException;
public void updateProduct(Product product) throws CatalogException;
public void deleteProduct(Product product) throws CatalogException;
public Product getProduct(String productId) throws CatalogException;
public Category getCategory(String categoryId) throws CatalogException;
public List getAllProducts() throws CatalogException;
public List getAllCategories() throws CatalogException;
}
PROPAGATION_REQUIRED,readOnly
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
PROPAGATION_REQUIRED
Integration?/B>
<!-- Hibernate SessionFactory Definition -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate.LocalSessionFactoryBean">
<property name="mappingResources">
<list>
<value>catalog/model/businessobject/Product.hbm.xml</value>
<value>catalog/model/businessobject/Category.hbm.xml</value>
<value>catalog/model/businessobject/User.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">net.sf.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.cglib.use_reflection_optimizer">true</prop>
<prop key="hibernate.cache.provider_class">net.sf.hibernate.cache.HashtableCacheProvider</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource"/>
</property>
</bean>
CatalogDao
usesHibernateTemplate
to integrate between Hibernate and Spring. Here's the configuration forHibernateTemplate
:
<!-- Hibernate Template Defintion -->
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate.HibernateTemplate">
<property name="sessionFactory"><ref bean="sessionFactory"/></property>
<property name="jdbcExceptionTranslator"><ref bean="jdbcExceptionTranslator"/></property>
</bean>
l论
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="catalog.model.businessobject">
<class name="Product" table="product">
<id name="id" column="ID" unsaved-value="null">
<generator class="assigned"/>
</id>
<property name="name" column="NAME" unique="true" not-null="true"/>
<property name="price" column="PRICE"/>
<property name="width" column="WIDTH"/>
<property name="height" column="height"/>
<property name="description" column="description"/>
<set name="categoryIds" table="product_category" cascade="all">
<key column="PRODUCT_ID"/>
<element column="CATEGORY_ID" type="string"/>
</set>
</class>
</hibernate-mapping>
CatalogDao
is wired withHibernateTemplate
by Spring:
<!-- Catalog DAO Definition: Hibernate implementation -->
<bean id="catalogDao" class="catalog.model.dao.hibernate.CatalogDaoHibernateImpl">
<property name="hibernateTemplate"><ref bean="hibernateTemplate"/></property>
</bean>
使用 Log4j 搭徏一个日志服务器 |
|
最q项目要用到日志服务器,需要把所有服务器的日志统一存入一个日志文件服务器中,于是想CLog4j的SocketAppender?BR> |上一通搜索,l于扑ֈ了相关的只言片语Q内容几乎雷同,和examples\lf5\UsingSocketAppenders中提供的例子没有什么区别! 只好自己研究了! 1.基本使用 1.1服务?/B> q个日志服务器的服务器端需要运行: log4j jar包中的org.apache.log4j.net.SocketServer 加参?【本地监听端口】【配|文件】【客L配置文g目录?BR> W三个参数【配|文件目录】其实指的是针对每个客户端的配置文gQ等会详l讲Q现在用?”就可以? 服务器端的配|文件可以用q个Q引自利用Log4j 创徏日志服务?By ??Q: #文g名socketserver.properties #如果需要显C日志界面,可以本行启?BR> #log4j.rootCategory=, A1 log4j.rootLogger=DEBUG,A3 log4j.category.org.apache.log4j.net=INFO log4j.appender.A1=org.apache.log4j.lf5.LF5Appender log4j.appender.A1.MaxNumberOfRecords=700 log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender log4j.appender.A4.file=server.log log4j.appender.A4.DatePattern='.'yyyyMMdd log4j.appender.A4.layout=org.apache.log4j.PatternLayout log4j.appender.A4.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n log4j.appender.A3=org.apache.log4j.RollingFileAppender log4j.appender.A3.file=server2.log log4j.appender.A3.MaxFileSize=1024KB log4j.appender.A3.MaxBackupIndex=999 log4j.appender.A3.layout=org.apache.log4j.PatternLayout log4j.appender.A3.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 其中A1是启动Lf5的log监视l端QA3限制大小的文ӞA4是日期滚动文件?BR> 单A3QA4是讲所有客L的日志都存放C同一个日志文件中Q我觉的q种Ҏq不好?BR> 1.2客户?/B> 客户端的配置文g是这LQ?BR> log4j.rootCategory=,SOCKET log4j.addivity.org.apache=true #应用于socket log4j.appender.SOCKET=org.apache.log4j.net.SocketAppender log4j.appender.SOCKET.RemoteHost=localhost #服务器的IP地址 log4j.appender.SOCKET.Port=1978 #服务器的监听端口 log4j.appender.SOCKET.LocationInfo=true #q个是什么我不知?BR> log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout log4j.appender.SOCKET.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%t%m%n #A2 log4j.appender.A2=org.apache.log4j.DailyRollingFileAppender log4j.appender.A2.file=server.log log4j.appender.A2.DatePattern='.'yyyy-MM-dd log4j.appender.A2.layout=org.apache.log4j.PatternLayout log4j.appender.A2.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 启动服务器端,再运行客L可以了!但所有的服务器端/客户端的日志都放C一个日志文件中! 2.E微高点的使用 下面讲如何把各个客户端和服务器端的日志分别放C同的日志文g? q个我在|上找了好久也没有找? 2.1服务?/B> 服务器的配置文g不用怎么改动Q如果你不需要在同一个文件中存放所有日志,可以把配|文件第一行的A3L?BR> 但服务器端有个更大的ȝQ代码有问题Q问题够大了吧,不知道算不算是个bugQ我用的?.2.11版log4jQ?BR> 改吧! 打开log4j目录下的src\java\org\apache\log4j\net\SocketServer.java 在这D中改动(看下面代码第12? LoggerRepository configureHierarchy(InetAddress inetAddress) { cat.info("Locating configuration file for "+inetAddress); // We assume that the toSting method of InetAddress returns is in // the format hostname/d1.d2.d3.d4 e.g. torino/192.168.1.1 String s = inetAddress.toString(); int i = s.indexOf("/"); if(i == -1) { cat.warn("Could not parse the inetAddress ["+inetAddress+ "]. Using default hierarchy."); return genericHierarchy(); } else { //q个是什么意?专门?/"W号?明显是错?闭掉 // String key = s.substring(0, i); //改ؓ String key = s.substring(i+1); File configFile = new File(dir, key+CONFIG_FILE_EXT); if(configFile.exists()) { Hierarchy h = new Hierarchy(new RootLogger((Level) Priority.DEBUG)); hierarchyMap.put(inetAddress, h); new PropertyConfigurator().doConfigure(configFile.getAbsolutePath(), h); return h; } else { cat.warn("Could not find config file ["+configFile+"]."); return genericHierarchy(); } } } ~译文g! 打开log4j目录下的src\java\org\apache\log4j\net\SocketNode.java (改这D|因ؓ我用的时候出?看不出来改不Ҏ什么区? 改第54?BR> ois = new ObjectInputStream( new BufferedInputStream(socket.getInputStream())); ?BR> InputStream is = socket.getInputStream(); if (is != null) { ois = new ObjectInputStream(new BufferedInputStream(is)); } 文g头加 import java.io.InputStream; ~译文g! 现在为每个配|客L~配|文?把配|文件放到【客L配置文g目录】中: log4j.rootCategory=,A4 log4j.appender.A4=org.apache.log4j.DailyRollingFileAppender log4j.appender.A4.file=127.0.0.1.log #为每个客L取不同的名字 log4j.appender.A4.DatePattern='.'yyyyMMdd log4j.appender.A4.layout=org.apache.log4j.PatternLayout log4j.appender.A4.layout.ConversionPattern=\n\n[%-5p] %d{yyyy-MM-dd HH:mm:ss,SSS} method:%l%n%m%n 保存文g名ؓ[客户端ip地址].lcf ?92.168.0.126.lcf 2.2 客户?/B> 客户端不用改?太幸q了!! ok? 启动服务?启动客户?现在服务器的日志攑ֈ了server.log?有配|文件的客户端的日志会放到相应的日志文g?没有配置文g的客L的日志依然放在server.log? SocketServer.java ?SocketNode.java两个文g可以单独做一个工E?把他们的packageLp? |
Log4j׃个重要的lg构成Q日志信息的优先U,日志信息的输出目的地Q日志信息的输出格式。日志信息的优先U从高到低有ERROR、WARN、INFO、DEBUGQ分别用来指定这条日志信息的重要E度Q日志信息的输出目的地指定了日志打印到控制台还是文件中Q而输出格式则控制了日志信息的昄内容?/P>
一、定义配|文?/STRONG>
其实您也可以完全不用配|文Ӟ而是在代码中配置Log4j环境。但是,使用配置文g您的应用E序更加灉|。Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ文Ӟ?|。下面我们介l用JavaҎ文件做为配|文件的ҎQ?/P>
1.配置根LoggerQ其语法为:
log4j.rootLogger = [ level ] , appenderName, appenderName, ?
其中Qlevel 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者您定义的别。Log4j只用四个别,优先U从高到低分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里定义了INFOU别Q则应用E序中所有DEBUGU别的日志信息将不被打印出来?appenderName是指B日志信息输出到哪个地斏V您可以同时指定多个输出目的地?
2.配置日志信息输出目的地AppenderQ其语法为:
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
?
log4j.appender.appenderName.option = valueN
其中QLog4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?BR> org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ?
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
3.配置日志信息的格式(布局Q,其语法ؓQ?/P>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
?
log4j.appender.appenderName.layout.option = valueN
其中QLog4j提供的layout有以e几种Q?
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下: %m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?
%t 输出产生该日志事件的U程?
%n 输出一个回车换行符QWindowsq_为“\r\n”,Unixq_为“\n?
%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数。D例:Testlog4.main(TestLog4.java:10)
二、在代码中用Log4j
1.得到记录?/P>
使用Log4jQ第一步就是获取日志记录器Q这个记录器负责控制日志信息。其语法为:
public static Logger getLogger( String name)
通过指定的名字获得记录器Q如果必要的话,则ؓq个名字创徏一个新的记录器。Name一般取本类的名字,比如Q?
static Logger logger = Logger.getLogger ( ServerWithLog4j.class.getName () )
2.d配置文g
当获得了日志记录器之后,W二步将配置Log4j环境Q其语法为:
BasicConfigurator.configure ()Q?自动快速地使用~省Log4j环境?BR> PropertyConfigurator.configure ( String configFilename) Q读取用Java的特性文件编写的配置文g?BR> DOMConfigurator.configure ( String filename ) Q读取XML形式的配|文件?/P>
3.插入记录信息Q格式化日志信息Q?/P>
当上两个必要步骤执行完毕Q您可以轻村֜使用不同优先U别的日志记录语句插入到您想记录日志的Q何地方,其语法如下:
Logger.debug ( Object message ) ;
Logger.info ( Object message ) ;
Logger.warn ( Object message ) ;
Logger.error ( Object message ) ;
- 作者: icefire 2005q?5?8? 星期?17:22
java调用存储q程 By zxjygx 发表?2005-10-17 21:40:00 | |
Java 调用存储q程 本文阐述了怎么使用DBMS存储q程。我阐述了用存储过E的基本的和高Ҏ,比如q回ResultSet。本文假设你对DBMS和JDBC已经非常熟悉Q也假设你能够毫无障地阅读其它语言写成的代码(即不是Java的语aQ,但是Qƈ不要求你有Q何存储过E的~程l历?存储q程是指保存在数据库q在数据库端执行的程序。你可以使用Ҏ的语法在JavacM调用存储q程。在调用Ӟ存储q程的名U及指定的参数通过JDBCq接发送给DBMSQ执行存储过Eƈ通过q接Q如果有Q返回结果? 使用存储q程拥有和用基于EJB或CORBAq样的应用服务器一L好处。区别是存储q程可以从很多流行的DBMS中免费用,而应用服务器大都非常昂贵。这q不只是许可证费用的问题。用应用服务器所需要花费的理、编写代码的费用Q以及客L序所增加的复杂性,都可以通过DBMS中的存储q程所整个地替代? 你可以用JavaQPythonQPerl或C~写存储q程Q但是通常使用你的DBMS所指定的特定语a。Oracle使用PL/SQLQPostgreSQL使用pl/pgsqlQDB2使用Procedural SQL。这些语a都非常相伹{在它们之间UL存储q程q不比在Sun的EJB规范不同实现版本之间ULSession Bean困难。ƈ且,存储q程是ؓ嵌入SQL所设计Q这使得它们比Java或C{语a更加友好地方式表达数据库的机制? 因ؓ存储q程q行在DBMS自nQ这可以帮助减少应用E序中的{待旉。不是在Java代码中执?个或5个SQL语句Q而只需要在服务器端执行1个存储过E。网l上的数据往q次数的减少可以戏剧性地优化性能? 使用存储q程 单的老的JDBC通过CallableStatementcL持存储过E的调用。该cd际上是PreparedStatement的一个子cR假设我们有一个poets数据库。数据库中有一个设|诗人逝世q龄的存储过E。下面是对老酒鬼Dylan ThomasQold soak Dylan ThomasQ不指定是否有关典故、文化,h评指正。译注)q行调用的详l代码: try{ int age = 39; String poetName = "dylan thomas"; CallableStatement proc = connection.prepareCall("{ call set_death_age(?, ?) }"); proc.setString(1, poetName); proc.setInt(2, age); cs.execute(); }catch (SQLException e){ // ....} poet_id NUMBER; begin SELECT id INTO poet_id FROM poets WHERE name = poet; INSERT INTO deaths (mort_id, age) VALUES (poet_id, poet_age); end set_death_age; Connection con = null; CallableStatement proc = null; try { con = connectionPool.getConnection(); proc = con.prepareCall("{ call set_death_age(?, ?) }"); proc.setString(1, dyingBard.getName()); proc.setInt(2, age); proc.execute(); } finally { try { proc.close(); } catch (SQLException e) {} con.close(); } } poet_id NUMBER; poet_age NUMBER; begin --first get the id associated with the poet. SELECT id INTO poet_id FROM poets WHERE name = $1; --get and return the age. SELECT age INTO poet_age FROM deaths WHERE mort_id = poet_id; return age; end;' language 'pl/pgsql'; CallableStatement proc = connection.prepareCall("{ ? = call snuffed_it_when(?) }"); proc.registerOutParameter(1, Types.INTEGER); proc.setString(2, poetName); cs.execute(); int age = proc.getInt(2); toesup refcursor; begin open toesup for SELECT poets.name, deaths.age FROM poets, deaths -- all entries in deaths are for poets. -- but the table might become generic. WHERE poets.id = deaths.mort_id AND deaths.age < 60; return toesup; end;' language 'plpgsql'; Connection con = null; CallableStatement toesUp = null; try { con = ConnectionPool.getConnection(); // PostgreSQL needs a transaction to do this... con. setAutoCommit(false); // Setup the call. CallableStatement toesUp = connection.prepareCall("{ ? = call list_early_deaths () }"); toesUp.registerOutParameter(1, Types.OTHER); toesUp.execute(); ResultSet rs = (ResultSet) toesUp.getObject(1); while (rs.next()) { String name = rs.getString(1); int age = rs.getInt(2); out.println(name + " was " + age + " years old."); } rs.close(); } catch (SQLException e) { // We should protect these calls. toesUp.close(); con.close(); } } public abstract void sendDeath(String name, int age); } static void mapEarlyDeaths(ProcessPoetDeaths mapper){ Connection con = null; CallableStatement toesUp = null; try { con = ConnectionPool.getConnection(); con.setAutoCommit(false); CallableStatement toesUp = connection.prepareCall("{ ? = call list_early_deaths () }"); toesUp.registerOutParameter(1, Types.OTHER); toesUp.execute(); ResultSet rs = (ResultSet) toesUp.getObject(1); while (rs.next()) { String name = rs.getString(1); int age = rs.getInt(2); mapper.sendDeath(name, age); } rs.close(); } catch (SQLException e) { // We should protect these calls. toesUp.close(); con.close(); } } ProcessPoetDeaths myMapper = new ProcessPoetDeaths() { public void sendDeath(String name, int age) { out.println(name + " was " + age + " years old."); } }; mapEarlyDeaths(myMapper); }
|