2005年11月28日
#
环境:使用fm是2.3.9,webwork2.2.4(使用切换语法):
一:作为components组件的参数如果值为字符串,则需要在字符串上加上单引号。
<ww:component template="checkboxlist_portraitCols.ftl">
<ww:param name="name" value="'test'" /><!--注意单引号-->
<ww:param name="colCnt" value="4" />
<ww:param name="list" value="{'1','2','3','4','5','6'}" />
</ww:component>
二:终于理解freemaker的多值类型。
<#if (parameters.list?size%parameters.colCnt)?int==0>:求余数是否为0,必须加上内置方法int。
freemaker内置了chunk分块的方法,但是我始终没有想到怎么将这个快按纵向进行排列。横向好说,直接按行输出。因此写下列模板代码来实现。
<#assign itemCount = 0/>
<#if parameters.list??>
<#assign width=(100/parameters.colCnt)?int>
<#assign itemCount = itemCount + 1/>
<#assign rowCnt=0/>
<#assign colCnt=0/>
<#list parameters.list?chunk(parameters.colCnt) as row>
<#assign rowCnt=rowCnt+1/>
<tr>
<#list row as cell>
<#assign itemCount = itemCount + 1/>
<#assign colCnt=colCnt+1/>
<#if rowCnt==0 && col<parameters.colCnt-1 >
<td width='${width}%'>
<#else>
<td>
</#if>
<#if parameters.listKey??>
<#assign itemKey = cell[parameters.listKey]/>
<#else>
<#assign itemKey = cell/>
</#if>
<#if parameters.listValue??>
<#assign itemValue = cell[parameters.listValue]/>
<#else>
<#assign itemValue = cell/>
</#if>
<#assign itemKeyStr=itemKey.toString() />
<input type="checkbox" name="${parameters.name?html}"
value="${itemKeyStr?html}"
id="${parameters.name?html}-${itemCount}"<#rt/>
<#if tag.contains(parameters.nameValue, itemKey)>
checked="checked"<#rt/>
</#if>
<#if parameters.disabled!(false)>
disabled="disabled"<#rt/>
</#if>
/>
<label for="${parameters.name?html}-${itemCount}" class="checkboxLabel">${itemValue?html}</label>
</td>
</#list>
</#list>
<#else>
</#if>
jsp引用页面测试代码:
<table width="80%">
<ww:component template="checkboxlist_landscapeCols.ftl">
<ww:param name="name" value="'test'" />
<ww:param name="colCnt" value="4" />
<ww:param name="list" value="{'1','2','3','4','5','6'}" />
</ww:component>
</table>
http://www.ccw.com.cn/htm/center/prog/02_3_8_3.asp
1. 地址码:表示编码对象常住户口所在县(市、旗、区)的行政区划代码,按GB/T2260的规定执行。
2. 出生日期码:表示编码对象出生的年、月、日,按GB/T7408的规定执行,年、月、日分别用4位、2位、2位数字表示,之间不用分隔符。
3. 顺序码:表示在同一地址码所标识的区域范围内,对同年、同月、同日出生的人编定的顺序号,顺序码的奇数分配给男性,偶数分配给女性。
校验的计算方式:
1. 对前17位数字本体码加权求和
公式为:S = Sum(Ai * Wi), i = 0, ... , 16
其中Ai表示第i位置上的身份证号码数字值,Wi表示第i位置上的加权因子,其各位对应的值依次为: 7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2
2. 以11对计算结果取模
Y = mod(S, 11)
3. 根据模的值得到对应的校验码
对应关系为:
Y值: 0 1 2 3 4 5 6 7 8 9 10
校验码: 1 0 X 9 8 7 6 5 4 3 2
用ADO控件读EXCEL或DBF文件
用ADO连接Excel
设置属性ConnetionString
选择 Microsoft Jet 4.0 OLE DB provider
Select or enter a datasorce name -> 选择你要打开Excel文件
User name默认是Admin 密码默认为空,可以不用理会
Extended properties 设为:Excel 8.0
sql语句 select * from [yourtablename] (注意要有[])
更详细的请看这一篇:
在DELPHI中使用ADO直接访问Excel数据文件
摘 要:在DELPHI中使用ADO直接访问Excel数据文件
关键字:ADO Excel
类 别:数据库
要用DELPHI中的ADO系列控件访问Excel数据文件,首先应该建立一些基本概念。你需要将一个Excel数据文件想象
为一个关系数据库,Excel文件中的每个工作表就对应该数据库中的一个表,而工作表中的每一列当然就是表的列了。
然后,按照下列面的秘诀进行就可以。
1.设置ADOConnection的ConnectionString
构造ConnectionString时,OLE DB的提供者要选择Microsoft Jet 4.0 OLE DB Provider作为ADO的驱动程序。
这本来是用于连接Access数据库的驱动程序,但也可打开Excel文件。
连接的数据库名称当然就是你要打开的Excel文件,注意扩展名是*.xls,而不是*.mdb。
最关键的一点是,还要设置扩展属性Extended Properties为"Excel 8.0",否则,测试连接时会报告无法识别数据格式
的错误。Extended Properties的属性值在"所有"参数页中输入。
最后,设置完成后的ConnectionString中的各项参数为:
Provider=Microsoft.Jet.OLEDB.4.0
Data Source=MyExcelFile.xls
Extended Properties=Excel 8.0
Persist Security Info=False
2.设置ADODataSet或ADOTable
1将ADODataSet或ADOTable连接到刚才的ADOConnection。如果不用ADOConnection,也可以参照上面的方法直接设置
ADODataSet或ADOTable的ConnectionString属性。
2对于ADODataSet,需要将CommandType属性设置为cmdTableDirect,而对于ADOTable,则将TableDirect属性设置为True。
因为,访问Excel文件是直接的数据文件访问,不是通过SQL语句来操作游标访问的。如果不设置直接访问,则系统会报告
SQL语句格式错误等信息。
然后,当你下拉ADODataSet中的CommandText属性或ADOTable的TableName属性时,就可以选择到要打开的工作表了。
注意,表名后面多了加一个$符号。
3.打开ADODataSet或ADOTable
连接DBF数据
构造ado connection string
提供者选择 Microsoft Jet 4.0 OLEDB Provider
"所有"那里编辑 Extended Properties,
dbf文件的话设置为dBase 5.0(注意dBase和5.0之间必须有空格,最好拷贝过去粘贴)
db文件的话设置为Paradox 7.X
(dbf就是dbase或Vfox数据库,db就是paradox数据库)
"连接"那里的"数据库名称"输入的是目录名,不能包含文件名,
比如你的文件是 c:tempaaa.dbf ,那么输入c:temp
同时CursorLocation 设置为: clUseServer
还可以:
如果直接连的话,ADO的连接字串设为:
adoConnection1.ConnectionString:='Provider=MSDASQL.1;Extended
Properties="Driver={Microsoft Visual Foxpro
Driver};SourceType=DBF;SourceDB=c:mydb"';
如果是用ODBC,先在ODBC中设一个DSN连接到该DBF库,然后,在ADOConnection中设置连接ODBC的连接字串即可(可以用向导帮助完成)
1、允许匿名评论,注释掉batch.comment.php中的
if(empty($_SCONFIG['allowguest'])) {
//hszdz:jsmessage('error', 'no_login', geturl('action/login'));
}这个方法,后来发现有"允许匿名评论"的选项
2、tag比较混乱,用固定下拉选择框:修改xspace/admin/spaceap/common.js的addMouseEvent部分
var inputname=inputs[i].name;
if(inputname=='tagname'){
if(inputs[i].style.display!='none'){
inputs[i].style.display='none';
var hack = document.getElementById('tagnametips');
hack.innerHTML="<select name='tagname' id='tagname'><option value='情感' selected>情感</option><option value='论文'>论文</option><option value='心理'>心理</option><option value='写作'>写作</option></select>";
hack.className='';
hack.style.display='block';
}
}
3、
删除X-Space SuperSite 个人空间下方版权方法
修改/css/space.css找到以下代码:
CODE:
/*页脚*/
#xspace-footer { text-align : center; margin: 1em 0 0 0; }
#xspace-footer p { margin: 0.3em 0; }
#xspace-copyright { font: 10px Verdana, Arial, Helvetica, sans-serif; margin: 0; padding-bottom: 2em; }
#xspace-copyright strong { color: #036; font-weight:bold; }
#xspace-copyright em { color: #FF9900; font-weight:bold; font-style: normal; }
修改为:
CODE:
/*页脚*/
#xspace-footer { text-align : center; margin: 1em 0 0 0; }
#xspace-footer p { margin: 0.3em 0; }
#xspace-copyright { font: 10px Verdana, Arial, Helvetica, sans-serif; margin: 0; padding-bottom: 2em; display:none; }
#xspace-copyright strong { color: #036; font-weight:bold; }
#xspace-copyright em { color: #FF9900; font-weight:bold; font-style: normal; }
不会改的话,下载我的CSS吧,地址是:
删除X-Space个人空间标题方法:
找到/include/js/common.js再里面加入以下代码
CODE:
function title_powered(str2) {
var str1 = document.title;
var str2 = str1.indexOf(" - powered by X-Space");
if (str2 != -1) {
document.title=document.title.substring(0,str2);
}
}
title_powered();
方法二:
CODE:
document.title = document.title.replace(' - powered by X-Space', '');
删除X-Space个人空间管理版权方法:
修改admin/spacecp/style.css找到以下代码:
CODE:
.copyright { font-size: 12px; margin: 0; }
改为
CODE:
.copyright { display:none; }
http://www.javaeye.com/topic/137798
http://…/test.php/%22%3E%3Cscrīpt%3Ealert(’xss’)%3C/scrīpt%3E%3Cfoo
计算机dos中的net命令
----------------------------------------------------------------
net use \\ip\ipc$ " " /user:" " 建立IPC空链接
net use \\ip\ipc$ "密码" /user:"用户名" 建立IPC非空链接
net use h: \\ip\c$ "密码" /user:"用户名" 直接登陆后映射对方C:到本地为H:
net use h: \\ip\c$ 登陆后映射对方C:到本地为H:
net use \\ip\ipc$ /del 删除IPC链接
net use h: /del 删除映射对方到本地的为H:的映射
----------------------------------------------------------------
net user 用户名 密码 /add 建立用户
net user guest /active:yes 激活guest用户
net user 查看有哪些用户
net user 帐户名 查看帐户的属性
----------------------------------------------------------------
net localgroup administrators 用户名 /add 把“用户”添加到管理员中使其具有管理员权限,注意:***istrator后加s用复数
net start 查看开启了哪些服务
net start 服务名 开启服务;(如:net start telnet, net start schedule)
----------------------------------------------------------------
net stop 服务名 停止某服务
net time \\目标ip 查看对方时间
net time \\目标ip /set 设置本地计算机时间与“目标IP”主机的时间同步,加上参数/yes可取消确认信息
shutdown/r 重新启动
CREATE DATABASE IF NOT EXISTS my_db default charset utf8 COLLATE utf8_general_ci;
createdatabase dbname character set utf8;
solaris安装:pkgadd -d ./gcc-2.7.2.1
新机器,sata硬盘装win98+winxp双系统出死活装不上去
没办法,装vmware,fdisk后死活说不可以读C盘,abort进入A盘后格式化后可以安装了
错误:Starting MySQLCouldn't find MySQL manager or server
www kernel: audit(1145177979.106:127549): avc: denied { search } for pid=27355 co
mm="mysqld" name="/" dev=sdb7 ino=2 scontext=root:system_r:mysqld_t tcontext=system_u:object_r:file_
t tclass=dir
建目录/var/run/mysqld不存在
setsebool -P mysqld_disable_trans=1
正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。
1.可在同一应用服务器内共享方法:设置cookie.setPath("/");
本机tomcat/webapp下面有两个应用:cas和webapp_b,
1)原来在cas下面设置的cookie,在webapp_b下面获取不到,path默认是产生cookie的应用的路径。
2)若在cas下面设置cookie的时候,增加一条cookie.setPath("/");或者cookie.setPath("/webapp_b/");就可以在webapp_b下面获取到cas设置的cookie了。
3)此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此cookie.setPath
("/");之后,可以在webapp文件夹下的所有应用共享cookie,而cookie.setPath("/webapp_b/");是指cas应
用设置的cookie只能在webapp_b应用下的获得,即便是产生这个cookie的cas应用也不可以。
4)设置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b/jsp/")的时
候,只有在webapp_b/jsp下面可以获得cookie,在webapp_b下面但是在jsp文件夹外的都不能获得cookie。
5)设置cookie.setPath("/webapp_b");,是指在webapp_b下面才可以使用cookie,这样就不可以在产生cookie的应用cas下面获取cookie了
6)有多条cookie.setPath("XXX");语句的时候,起作用的以最后一条为准。
6)设置多个path的方法???
2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com");
A机所在的域:home.langchao.com,A有应用cas
B机所在的域:jszx.com,B有应用webapp_b
1)在cas下面设置cookie的时候,增加cookie.setDomain(".jszx.com");,这样在webapp_b下面就可以取到cookie。
2)这个参数必须以“.”开始。
3)输入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http://lc-bsp.jszx.com:
8080/webapp_b,可以获取cas在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:
8080/webapp_b则不可以获得cookie。
4)设置了cookie.setDomain(".jszx.com");,还可以在默认的home.langchao.com下面共享。
5)设置多个域的方法???
http://www.cnnb.com.cn/new-gb/xwzxzt/ndzt/fashion10/
http://www.chinahongyi.cn/newEbiz1/EbizPortalFG/portal/html/index.html
http://www.gmzs.com/高明市
http://www.dayic.com/data/firework/24.html--firework教程
http://www.68design.net/ 网站设计,好多酷站
http://www.swedu.or.kr/swpr/Index.jsp
http://www.68design.net/designweb/
http://www.java-asp.net/
http://net.nen.com.cn/admin/index.php wangsm2/wangsm,szexpert
awk 'length($1)==10 {system("postsuper -d "$1)}'删除邮件队列中的邮件
make -f Makefile.init makefiles \
'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -I/usr/include/sasl' \
'AUXLIBS=-L/usr/lib/mysql -lmysqlclient -lz -lm -L/usr/lib -lsasl2',加-DUSE_CYRUS_SASL
moodle是个好东西,安装也很顺利,但是在centos4.2+apache2+php4下出现了一些问题:
1、不能登陆,说是cookie没有开启,原因是在setCookie之前有header输出
在index.php的最前面加上
require_once('lib/moodlelib.php');
if (get_moodle_cookie() == '') {
set_moodle_cookie('nobody');
}
2、文件不能下载,原因同样是在文件下载header之前有了输出
在lib/file.php第1行加ob_start()
在send_file()之前加ob_end_clean()把缓冲清除掉
3、上传文件不能有中文文件名
在config.php里加$CFG->unicodecleanfilename = true;
4、下载文件中中文文件名乱码(不是很好的解决方案,不能满足国外用户访问了)
在lib/filelib.php的send_file中对$filename做utf8->gbk的转码
chcon -R -t httpd_user_content_t /web
system-config-securitylevel
sestatus
zend: chcon -t texrel_shlib_t xxxxx.so
要实现这个文字在图片右侧的环绕效果,需要自己给图片加入如下代码,因为很多象本站一样的blog默认编辑中是没有支持文字环绕功能的选项的。
(p style="clear:right ")……
(img src="图片实际地址" style="float:left" width="xxx" height="xxx" )(/p)
这样可以实现左环绕,把Clear设为Left,Float设为Right,可实现右环绕。
查看磁盘 df -h , du -hs /var
tcpdump port 80
vmstat -n 2
squidclient -p3128 cache_object://localhost/info
查看连接命令 netstat -an|grep EST|awk "{print $3}"|awk -F":" "{print $1}"|sort|uniq -c|sort
封禁连入的ip iptables -A INPUT -p tcp --dport 80 -s xxx.xxx.xxx.xxx -j DROP
检查named错误的命令 grep named /var/log/messages | tail -n 20
跟踪dns查询 dig @202.103.0.117 www.hssygz.com
.
+trace
http://www.blogjava.net/thinkbase/archive/2006/06/05/50382.html
解决思路:
配置web工程web.xml加上
<mime-mapping>
<extension>doc</extension>
<mime-type>application/msword</mime-type>
</mime-mapping>
<mime-mapping>
<extension>xls</extension>
<mime-type>application/vnd.ms-excel</mime-type>
</mime-mapping>
修改后非常注意的要清空缓存这样才会弹出保存还是打开的窗口否则打开还是乱码.
function ubb($str) {
$color=Array('red','blue','green');
$str=eregi_replace('\[url\]([a-zA-Z0-9@:%_.~#-\?&]+)\[\/url\]','<a href=http://\\1>\\1</a>',$str);//url
$str=eregi_replace('\[url=http://([a-zA-Z0-9@:%_.~#-\?&]+)\](.+)\[\/url\]','<a
href=\\1 target=_blank>\\2</a>',$str);
$str=eregi_replace('\[url=([a-zA-Z0-9@:%_.~#-\?&]+)\](.+)\[\/url\]','<a
href=http://\\1 target=_blank>\\2</a>',$str);
$str=eregi_replace('\[img\]([a-zA-Z0-9@:%_.~#-\?&]+)\[\/img\]','<img src=http://\\1>\\1</img>',$str);//img
$str=eregi_replace('\[h([1-6])\](.+)\[\/h[1-6]\]','<h\\1>\\2</h\\1>',$str);//h1-6
$str=eregi_replace('\[email\]([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})\[\/email\]','<a
href=mailto:\\1>\\1</a>',$str);//email
$str=eregi_replace('\[email=([_\.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,3})\](.+)\[\/email\]','<a
href=mailto:\\1>\\2</a>',$str);
$str=eregi_replace('\[b\](.+)\[\/b\]','<b>\\1</b>',$str);
$str=eregi_replace('\[i\](.+)\[\/i\]','<i>\\1</i>',$str);
$str=eregi_replace('\[size=(.+)\](.+)\[\/size\]','<font size=\\1>\\2</font>',$str);
$str=eregi_replace('\[color=(.+)\](.+)\[\/color\]','<font color=\\1>\\2</font>',$str);
$str=eregi_replace('\[sub\](.+)\[\/sub\]','<sub>\\1</sup>',$str);//下裱
$str=eregi_replace('\[sup\](.+)\[\/sup\]','<sup>\\1</sup>',$str);//上标
for($i=0;$i<=count($color);$i++)$str=eregi_replace('\['.$color[$i].'\](.+)\[\/'.$color[$i].'\]','<font
color='.$color[$i].'>\\1</font>',$str);
$str=preg_replace("/\[quote\](.+?)\[\/quote\]/is","<blockquote><font
size='1' face='Courier
New'>quote:</font><hr>\\1<hr></blockquote>",
$str);
$str=preg_replace("/\[code\](.+?)\[\/code\]/is","<blockquote><font
size='1' face='Times New Roman'>code:</font><hr
color='lightblue'><i>\\1</i><hr
color='lightblue'></blockquote>", $str);
$str=preg_replace("/\[sig\](.+?)\[\/sig\]/is","<div
style='text-align: left;color: darkgreen;margin-left:
5%'><br><br>--------------------------<br>\\1<br>--------------------------</div>",
$str);
return $str;
}
http://www.3doing.net/forums/printpage.asp?BoardID=48&ID=212
http://www.hibernate.org.cn/viewtopic.php?t=17939
打开开始--运行--键入gpedit.msc
按回车后打开组策略编辑器,双击管理模版菜单--选择系统下拉菜单,在工作区找到“显示‘关闭事件跟踪程序’”,双击“显示‘关闭事件跟踪程序’”项,在设置选项卡里把“已启用”改为“已禁用”,确定完成。
网页播放的视频代码
第一种是通过调用window media player进行播放诸如:wmv,asf等格式文件:
<object align=middle class=OBJECT classid=CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95 height=320 id=MediaPlayer width=356>
<param name="ShowStatusBar" value="-1">
<param name="Filename" value="电影地址">
<embed
type=application/x-oleobject
codebase=http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701
flename=mp src=电影地址 width=356 height=320>
</embed>
</object>
第二种是通过调用replayer进行播放诸如:rm,ram等格式文件
播放框:
<object classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA height=285 id=RAOCX name=rmplay width=356>
<param name="SRC" value="影片地址">
<param name="CONSOLE" value="Clip1">
<param name="CONTROLS" value="imagewindow">
<param name="AUTOSTART" value="true">
<embed src="影片地址" autostart="true" controls="ImageWindow" console="Clip1" pluginspage="http://www.real.com"/’ target="_blank" >http://www.real.com"; width="356" height="285">
</embed>
</object>
控制框:可紧跟播放框一起
<object classid=clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA height=27 id=video1 width=356>
<param name="_ExtentX" value="7276">
<param name="_ExtentY" value="1058">
<param name="AUTOSTART" value="0">
<param name="SHUFFLE" value="0">
<param name="PREFETCH" value="0">
<param name="NOLABELS" value="0">
<param name="CONTROLS" value="ControlPanel">
<param name="CONSOLE" value="Clip1">
<param name="LOOP" value="0">
<param name="NUMLOOP" value="0">
<param name="CENTER" value="0">
<param name="MAINTAINASPECT" value="0">
<param name="BACKGROUNDCOLOR" value="#ffffff">
<embed
type="audio/x-pn-realaudio-plugin" console="Clip1"
controls="ControlPanel" height="27" width="356" autostart="0"
_extentx="7276" _extenty="1058" shuffle="0" prefetch="0" nolabels="0"
loop="0" numloop="0" center="0" maintainaspect="0"
backgroundcolor="#ffffff">
</embed>
</object>
第三种是通过调用flashplayer进行播放:swf类的flash文档,分别如下:
<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="356" height=320>
<param name="movie" value="flash地址">
<param name="quality" value="high">
<embed src="flash地址" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer"’ target="_blank" >http://www.macromedia.com/go/getflashplayer"; type="application/x-shockwave-flash" width="356" height=320>
</embed>
</object>
Description: The Error means The connection with the server has been terminated.
If you check out the C:\Windows\system32\LogFiles\HTTPERR\httperr*.log
files on the distribution server, you'll likely see either
Timer_MinBytesPerSecond errors or Timer_ConnectionIdle errors. These
are caused by IIS' default settings, contained within its metabase,
which define the minimum traffic flow rate for a connection to be kept
alive and the maximum idle time allowed before a connection is dropped.
For some reason, SUS servers seem to take their good old time while
downloading updates, and these parameters are exceeded and the
distribution server drops 'em.
1) From IIS Manager, right click on the Internet Information Server
(IIS) Manager root level folder and go to Properties. Check the box to
enable direct metabase editing. Click OK.
2) Open the C:\Windows\system32\inetsrv\Me-taBase.xml file in Notepad.
Do a search for "MinFileBytesPerSec". Change the setting for
MinFileBytesPerSec from 240 to 0. Do another search, this time for
"ConnectionTimeout" to be 600. Save changes and exit.
3) Restart the IIS Admin service to effect the changes.
php.ini中文解释
[PHP]
; PHP还是一个不断发展的工具,其功能还在不断地删减
; 而php.ini的设置更改可以反映出相当的变化,
; 在使用新的PHP版本前,研究一下php.ini会有好处的
;;;;;;;;;;;;;;;;;;;
; 关于这个文件 ;
;;;;;;;;;;;;;;;;;;;
; 这个文件控制了PHP许多方面的观点.为了让PHP读取这个文件,它必须被命名为
; ''php.ini''.PHP 将在这些地方依次查找该文件:当前工作目录;环境变量PHPRC
; 指明的路径;编译时指定的路径.
; 在windows下,编译时的路径是Windows安装目录.
; 在命令行模式下,php.ini的查找路径可以用 -c 参数替代.
; 该文件的语法非常简单.空白字符和用分号'';''开始的行被简单地忽略(就象你可能
; 猜到的一样). 章节标题(例如 : [Foo])也被简单地忽略,即使将来它们可能
; 有某种的意义.
;
; 指示被指定使用如下语法:
; 指示标识符 = 值
; directive = value
; 指示标识符 是 *大小写敏感的* - foo=bar 不同于 FOO = bar.
;
; 值可以是一个字符串,一个数字,一个 PHP 常量 (如: E_ALL or M_PI), INI 常量中的
; 一个 (On, Off, True, False, Yes, No and None) ,或是一个表达式
; (如: E_ALL & ~E_NOTICE), 或是用引号括起来的字符串("foo").
;
; INI 文件的表达式被限制于位运算符和括号.
; | bitwise OR
; & bitwise AND
; ~ bitwise NOT
; ! boolean NOT
;
; 布尔标志可用 1, On, True or Yes 这些值置于开的状态.
; 它们可用 0, Off, False or No 这些值置于关的状态.
;
; 一个空字符串可以用在等号后不写任何东西表示,或者用 None 关键字:
;
; foo = ; 将foo置为空字符串
; foo = none ; 将foo置为空字符串
; foo = "none" ; 将foo置为字符串''none''
;
; 如果你值设置中使用常量,而这些常量属于动态调入的扩展库(不是 PHP 的扩展,就是
; Zend 的扩展),你仅可以调入这些扩展的行*之后*使用这些常量.
;
; 所有在 php.ini-dist 文件里设定的值与内建的默认值相同(这是说,如果 php.ini
; 没被使用或者你删掉了这些行,默认值与之相同).
;;;;;;;;;;;;;;;;;;;;
; 语言选项 ;
;;;;;;;;;;;;;;;;;;;;
engine = On
; 使 PHP scripting language engine(PHP 脚本语言引擎)在 Apache下有效.
short_open_tag = On
; 允许 tags 将被识别.
asp_tags = Off
; 允许ASP-style tags
precision = 14
; 浮点类型数显示时的有效位数
y2k_compliance = Off
; 是否打开 2000年适应 (可能在非Y2K适应的浏览器中导致问题)
output_buffering = Off
; 输出缓存允许你甚至在输出正文内容之后发送 header(标头,包括cookies)行
; 其代价是输出层减慢一点点速度.你可以使用输出缓存在运行时打开输出缓存,
; 或者在这里将指示设为 On 而使得所有文件的输出缓存打开.
output_handler = ; 你可以重定向你的脚本的所有输出到一个函数,
; 那样做可能对处理或以日志记录它有用.
; 例如若你将这个output_handler 设为"ob_gzhandler",
; 则输出会被透明地为支持gzip或deflate编码的浏览器压缩.
; 设一个输出处理器自动地打开输出缓冲.
implicit_flush = Off
; 强制flush(刷新)让PHP 告诉输出层在每个输出块之后自动刷新自身数据.
; 这等效于在每个 print() 或 echo() 调用和每个 HTML 块后调用flush()函数.
; 打开这项设置会导致严重的运行时冲突,建议仅在debug过程中打开.
allow_call_time_pass_reference = On
; 是否让强迫函数调用时按引用传递参数.这一方法遭到抗议,
; 并可能在将来版本的PHP/Zend里不再支持.
; 受到鼓励的指定哪些参数按引用传递的方法是在函数声明里.
; 你被鼓励尝试关闭这一选项并确认你的脚本仍能正常工作,以保证在将来版本的语言里
; 它们仍能工作.(你将在每次使用该特点时得到一个警告,而参数将按值而不是按引用
; 传递).
; Safe Mode 安全模式
safe_mode = Off
safe_mode_exec_dir =
safe_mode_allowed_env_vars = PHP_
; ?Setting certain environment variables
; ?may be a potential security breach.
; 该指示包含用逗号分隔的前缀列表.安全模式中,用户仅可以替换
; 以在此列出的前缀开头的环境变量的值.
; 默认地,用户将仅能 设定以PHP_开头的环境变量,(如: PHP_FOO=BAR).
; 注意: 如果这一指示为空,PHP 将让用户更改任意环境变量!
safe_mode_protected_env_vars = LD_LIBRARY_PATH
; 这条指示包含一个用逗号分隔的环境变量列表,那是最终用户将不能用putenv () 更改的.
; 这些变量甚至在safe_mode_allowed_env_vars 设置为允许的情况下得到保护.
disable_functions =
; 这条指示让你可以为了安全的原因让特定函数失效.
; 它接受一个用逗号分隔的函数名列表.
; 这条指示 *不受* 安全模式是否打开的影响.
; 语法高亮模式的色彩.
; 只要能被接受的东西就能工作.
highlight.string = #DD0000
highlight.comment = #FF8000
highlight.keyword = #007700
highlight.bg = #FFFFFF
highlight.default = #0000BB
highlight.html = #000000
; Misc 杂项
expose_php = Off
; 决定 PHP 是否标示它装在服务器上的事实(例如:加在它 —PHP—给Web服务
; 发送的信号上).
; (我个人的意见,在出现什么power-by的header的时候,把这关掉.)
; 它不会有安全上的威胁, 但它使检查你的服务器上是否安装了PHP成为了可能.
;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;
max_execution_time = 30 ; 每个脚本的最大执行时间, 按秒计
memory_limit = 8388608 ; 一个脚本最大可使用的内存总量 (这里是8MB)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
; 出错控制和登记 ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 错误报告是按位的.或者将数字加起来得到想要的错误报告等级.
; E_ALL - 所有的错误和警告
; E_ERROR - 致命性运行时错
; E_WARNING - 运行时警告(非致命性错)
; E_PARSE - 编译时解析错误
; E_NOTICE - 运行时提醒(这些经常是是你的代码的bug引起的,
;也可能是有意的行为造成的.(如:基于未初始化的变量自动初始化为一个
;空字符串的事实而使用一个未初始化的变量)
; E_CORE_ERROR - 发生于PHP启动时初始化过程中的致命错误
; E_CORE_WARNING - 发生于PHP启动时初始化过程中的警告(非致命性错)
; E_COMPILE_ERROR - 编译时致命性错
; E_COMPILE_WARNING - 编译时警告(非致命性错)
; E_USER_ERROR - 用户产生的出错消息
; E_USER_WARNING - 用户产生的警告消息
; E_USER_NOTICE - 用户产生的提醒消息
; 例子:
; error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒
; error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR ; 仅显示错误
error_reporting = E_ALL & ~E_NOTICE ; 显示所有的错误,除了提醒
display_errors = On ; 显示出错误信息(作为输出的一部分)
; 在最终发布的web站点上,强烈建议你关掉这个特性,并使用
; 错误日志代替(参看下面).
; 在最终发布的web站点继续让 display_errors 有效可能
; 暴露一些有关安全的信息,例如你的web服务上的文件路径、
; 你的数据库规划或别的信息.
display_startup_errors = Off ; 甚至当display_erroes打开了,发生于PHP的启动的步骤中
; 的错误也不会被显示.
; 强烈建议保持使 display_startup_errors 关闭,
; 除了在改错过程中.
log_errors = Off ; 在日志文件里记录错误(服务器指定的日志,stderr标准错误输出,或error_log(下面的))
; 正如上面说明的那样,强烈建议你在最终发布的web站点以日志记录错误
; 取代直接错误输出.
track_errors = Off ; 保存最近一个 错误/警告 消息于变量 $php_errormsg (boolean)
;error_prepend_string = "" ; 于错误信息前输出的字符串
;error_append_string = "" ; 于错误信息后输出的字符串
;error_log = filename ; 记录错误日志于指定文件
;error_log = syslog ; 记录错误日志于系统日志 syslog (NT 下的事件日志, Windows 95下无效)
warn_plus_overloading = Off ; 当将‘+’用于字符串时警告
;;;;;;;;;;;;;;;;;
; Data Handling ;
;;;;;;;;;;;;;;;;;
variables_order = "EGPCS" ; 这条指示描述了PHP 记录
; GET, POST, Cookie, Environment and Built-in 这些变量的顺序.
; (以 G, P, C, E & S 代表,通常以 EGPCS 或 GPC 的方式引用).
; 按从左到右记录,新值取代旧值.
register_globals = On ; 是否将这些 EGPCS 变量注册为全局变量.
; 若你不想让用户数据不在全局范围内混乱的话,你可能想关闭它.
; 这和 track_vars 连起来用更有意义 — 这样你可以通过
; $HTTP_*_VARS[] 数组访问所有的GPC变量.
register_argc_argv = On ; 这条指示告诉 PHP 是否声明 argv和argc 变量
; (注:这里argv为数组,argc为变量数)
; (其中包含用GET方法传来的数据).
; 若你不想用这些变量,你应当关掉它以提高性能.
track_vars = On ; 使$HTTP_*_VARS[]数组有效,这里*在使用时用
; ENV, POST, GET, COOKIE or SERVER替换
post_max_size = 8M ; PHP将接受的POST数据最大大小.
gpc_order = "GPC" ; 这条指示被人反对.用 variables_order 代替.
; Magic quotes
magic_quotes_gpc = On ; 在输入的GET/POST/Cookie数据里使用魔术引用
; (原文就这样,呵呵,所谓magic quotes 应该是指用转义符加在引用性的控制字符上,如 \''....)
magic_quotes_runtime= Off ; 对运行时产生的数据使用魔术引用,
; 例如:用SQL查询得到的数据,用exec()函数得到的数据,等等
magic_quotes_sybase = Off ; 采用 Sybase形式的魔术引用(用 '''' 脱出 '' 而不用 \'')
; 自动在 PHP 文档之前和之后添加文件
auto_prepend_file =
auto_append_file =
; 象4.04b4一样,PHP 默认地总是在 “Content-type:” 头标输出一个字符的编码方式.
; 让输出字符集失效,只要设置为空.
; PHP 的内建默认值是 text/html
default_mimetype = "text/html"
;default_charset = "iso-8859-1"
;;;;;;;;;;;;;;;;;;;;;;;;;
; Paths and Directories ;
;;;;;;;;;;;;;;;;;;;;;;;;;
include_path = ; include 路径设置,UNIX: "/path1:/path2" Windows: "\path1;\path2"
doc_root = ; php 页面的根路径,仅在非空时有效
user_dir = ; 告知 php 在使用 /~username 打开脚本时到哪个目录下去找,仅在非空时有效
;upload_tmp_dir = ; 存放用HTTP协议上载的文件的临时目录(在没指定时使用系统默认的)
upload_max_filesize = 2097152 ; 文件上载默认地限制为2 Meg
extension_dir = c:\php\ ; 存放可加载的扩充库(模块)的目录
enable_dl = On ; 是否使dl()有效.
; 在多线程的服务器上 dl()函数*不能*很好地工作,
; 例如IIS or Zeus,并在其上默认为禁止
;;;;;;;;;;;;;;;;
; File Uploads ;
;;;;;;;;;;;;;;;;
file_uploads = On ; 是否允许HTTP方式文件上载
;upload_tmp_dir = ; 用于HTTP上载的文件的临时目录(未指定则使用系统默认)
upload_max_filesize = 2M ; 上载文件的最大许可大小
; Fopen wrappers ;
;;;;;;;;;;;;;;;;;;
allow_url_fopen = On ; 是否允许把URLs当作http:.. 或把文件当作ftp:...
;;;;;;;;;;;;;;;;;;;;;;
; 动态扩展 ;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
; 若你希望一个扩展库自动加载,用下面的语法:
; extension=modulename.extension
; 例如,在windows上,
; extension=msql.dll
; or 在UNIX下,
; extension=msql.so
; 注意,这只应当是模块的名字,不需要目录信息放在里面.
; 用上面的 extension_dir 指示指定扩展库的位置.
;Windows 扩展
;extension=php_nsmail.dll
extension=php_calendar.dll
;extension=php_dbase.dll
;extension=php_filepro.dll
extension=php_gd.dll
;extension=php_dbm.dll
;extension=php_mssql.dll
;extension=php_zlib.dll
;extension=php_filepro.dll
;extension=php_imap4r2.dll
;extension=php_ldap.dll
;extension=php_crypt.dll
;extension=php_msql2.dll
;extension=php_odbc.dll
; 注意, MySQL的支持现在是内建的,因此,不需要用它的dll
;;;;;;;;;;;;;;;;;;;
; 模块设定 ;
; Module Settings ;
;;;;;;;;;;;;;;;;;;;
[Syslog]
define_syslog_variables = Off ; 是否定义各种的系统日志变量
; 如:$LOG_PID, $LOG_CRON, 等等.
; 关掉它是个提高效率的好主意.
; 运行时,你可以调用函数define_syslog_variables(),来定义这些变量
[mail function]
SMTP = localhost ;仅用于win32系统
sendmail_from = me@localhost.com ;仅用于win32系统
;sendmail_path = ;仅用于unix, 也可支持参数(默认的是''sendmail -t -i'')
[Debugger]
debugger.host = localhost
debugger.port = 7869
debugger.enabled = False
[Logging]
; 这些配置指示用于示例的日志记录机制.
; 看 examples/README.logging 以得到更多的解释
;logging.method = db
;logging.directory = /path/to/log/directory
[Java]
;java.class.path = .\php_java.jar
;java.home = c:\jdk
;java.library = c:\jdk\jre\bin\hotspot\jvm.dll
;java.library.path = .
[SQL]
sql.safe_mode = Off
[ODBC]
;uodbc.default_db = Not yet implemented
;uodbc.default_user = Not yet implemented
;uodbc.default_pw = Not yet implemented
uodbc.allow_persistent = On ; 允许或禁止 持久连接
uodbc.check_persistent = On ; 在重用前检查连接是否还可用
uodbc.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
uodbc.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
uodbc.defaultlrl = 4096 ; 控制 LONG 类型的字段.返回变量的字节数,0 代表通过(?)0 means passthru
uodbc.defaultbinmode = 1 ; 控制 二进制数据.0 代表?????Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char
; 见有关 odbc_binmode 和 odbc_longreadlen 的文档以得到 uodbc.defaultlrl 和 uodbc.defaultbinmode 的解释.
[MySQL]
mysql.allow_persistent = On ; 允许或禁止 持久连接
mysql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
mysql.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
mysql.default_port = ; mysql_connect() 使用的默认端口,如不设置,mysql_connect()
; 将使用变量 $MYSQL_TCP_PORT,或在/etc/services 下的mysql-tcp 条目(unix),
; 或在编译是定义的 MYSQL_PORT(按这样的顺序)
; Win32环境,将仅检查MYSQL_PORT.
mysql.default_socket = ; 用于本地 MySql 连接的默认的套接字名.为空,使用 MYSQL 内建值
mysql.default_host = ; mysql_connect() 默认使用的主机(安全模式下无效)
mysql.default_user = ; mysql_connect() 默认使用的用户名(安全模式下无效)
mysql.default_password = ; mysql_connect() 默认使用的密码(安全模式下无效)
; 注意,在这个文件下保存密码通常是一个*坏*主意
; *任何*可以使用PHP访问的用户可以运行
; ''echo cfg_get_var("mysql.default_password")''来显示那个密码!
; 而且当然地,任何有读该文件权力的用户也能看到那个密码.
[mSQL]
msql.allow_persistent = On ; 允许或禁止 持久连接
msql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
msql.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
[PostgresSQL]
pgsql.allow_persistent = On ; 允许或禁止 持久连接
pgsql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
pgsql.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
[Sybase]
sybase.allow_persistent = On ; 允许或禁止 持久连接
sybase.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
sybase.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
;sybase.interface_file = "/usr/sybase/interfaces"
sybase.min_error_severity = 10 ; 显示的错误的最低严重性
sybase.min_message_severity = 10 ; 显示的消息的最低重要性
sybase.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模式.若打开,这将导致 PHP 自动地
; 把根据结果的 Sybase 类型赋予它们,
; 而不是把它们全当成字符串.
; 这个兼容模式不会永远留着,
; 因此,将你的代码进行需要的修改,
; 并将该项关闭.
[Sybase-CT]
sybct.allow_persistent = On ; 允许或禁止 持久连接
sybct.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
sybct.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
sybct.min_server_severity = 10 ; 显示的错误的最低严重性
sybct.min_client_severity = 10 ; 显示的消息的最低重要性
[bcmath]
bcmath.scale = 0 ; 用于所有bcmath函数的10十进制数数字的个数number of decimal digits for all bcmath functions
[browscap]
;browscap = extra/browscap.ini
browscap = C:\WIN\SYSTEM\inetsrv\browscap.ini
[Informix]
ifx.default_host = ; ifx_connect() 默认使用的主机(安全模式下无效)
ifx.default_user = ; ifx_connect() 默认使用的用户名(安全模式下无效)
ifx.default_password = ; ifx_connect() 默认使用的密码(安全模式下无效)
ifx.allow_persistent = On ; 允许或禁止 持久连接
ifx.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
ifx.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
ifx.textasvarchar = 0 ; 若打开,select 状态符返回一个 ‘text blob’字段的内容,而不是它的id
ifx.byteasvarchar = 0 ; 若打开,select 状态符返回一个 ‘byte blob’字段的内容,而不是它的id
ifx.charasvarchar = 0 ; 追踪从固定长度的字符列里剥离的空格.
; 可能对 Informix SE 用户有效.
ifx.blobinfile = 0 ; 若打开,text和byte blobs 的内容被导出到一个文件
; 而不是保存到内存.
ifx.nullformat = 0 ; NULL(空)被作为空字段返回,除非,这里被设为1.
; 这种情况下(为1),NULL作为字串NULL返回.
[Session]
session.save_handler = files ; 用于保存/取回数据的控制方式
session.save_path = C:\win\temp ; 在 save_handler 设为文件时传给控制器的参数,
; 这是数据文件将保存的路径.
session.use_cookies = 1 ; 是否使用cookies
session.name = PHPSESSID
; 用在cookie里的session的名字
session.auto_start = 0 ; 在请求启动时初始化session
session.cookie_lifetime = 0 ; 为按秒记的cookie的保存时间,
; 或为0时,直到浏览器被重启
session.cookie_path = / ; cookie的有效路径
session.cookie_domain = ; cookie的有效域
session.serialize_handler = php ; 用于连接数据的控制器
; php是 PHP 的标准控制器.
session.gc_probability = 1 ; 按百分比的''garbage collection(碎片整理)''进程
; 在每次 session 初始化的时候开始的可能性.
session.gc_maxlifetime = 1440 ; 在这里数字所指的秒数后,保存的数据将被视为
; ''碎片(garbage)''并由gc 进程清理掉.
session.referer_check = ; 检查 HTTP引用以使额外包含于URLs中的ids无效
session.entropy_length = 0 ; 从文件中读取多少字节
session.entropy_file = ; 指定这里建立 session id
; session.entropy_length = 16
; session.entropy_file = /dev/urandom
session.cache_limiter = nocache ; 设为{nocache,private,public},以决定 HTTP 的
; 缓存问题
session.cache_expire = 180 ; 文档在 n 分钟后过时
session.use_trans_sid = 1 ; 使用过渡性的 sid 支持,若编译时许可了
; --enable-trans-sid
url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
[MSSQL]
;extension=php_mssql.dll
mssql.allow_persistent = On ; 允许或禁止 持久连接
mssql.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
mssql.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
mssql.min_error_severity = 10 ; 显示的错误的最低严重性
mssql.min_message_severity = 10 ; 显示的消息的最低重要性
mssql.compatability_mode = Off ; 与旧版的PHP 3.0 兼容的模式.
[Assertion]
; ?????
;assert.active = On ; ?assert(expr); active by default
;assert.warning = On ; issue a PHP warning for each failed assertion.
;assert.bail = Off ; don''t bail out by default.
;assert.callback = 0 ; user-function to be called if an assertion fails.
;assert.quiet_eval = 0 ; eval the expression with current
error_reporting(). set to true if you want error_reporting(0) around
the eval().
[Ingres II]
ii.allow_persistent = On ; 允许或禁止 持久连接
ii.max_persistent = -1 ; 持久连接的最大数.-1 代表无限制
ii.max_links = -1 ; 连接的最大数目(持久和非持久).-1 代表无限制
ii.default_database = ; 默认 database (format : [node_id::]dbname[/srv_class]
ii.default_user = ; 默认 user
ii.default_password = ; 默认 password
[Verisign Payflow Pro]
pfpro.defaulthost = "test.signio.com" ; 默认的 Signio 服务器
pfpro.defaultport = 443 ; 连接的默认端口
pfpro.defaulttimeout = 30 ; 按秒计的默认超时时间
; pfpro.proxyaddress = ; 默认的代理的 IP 地址(如果需要)
; pfpro.proxyport = ; 默认的代理的端口
; pfpro.proxylogon = ; 默认的代理的登录(logon 用户名)
; pfpro.proxypassword = ; 默认的代理的密码
[Sockets]
sockets.use_system_read = On ; 使用系统的read() 函数替代 php_read()封装
; Local Variables: (局部变量)
; tab-width: 4
; End:
-------
http://cosoft.org.cn/
湖北省软件公共开发平台http://gro.clinux.org/
1、到底在哪用cascade="..."?
cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有
cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade,unsaved-value是个很重要的属性。Hibernate通
过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是
persistence
object要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistence
object(数据库中已存在),只要update就行了。saveOrUpdate方法用的也是这个机制。
2、到底在哪用inverse="ture"?
inverse属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student,
Teacher和TeacherStudent表,Student和Teacher是多对多对多关系,这个关系由TeacherStudent这个表来表
现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对
TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指
定的是"谁"维护关系,那个在插入或删除"谁"时,就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了,就是说关系另一头的对象已经set
或是add到"谁"这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在
关系的一头,如Student中的bag或set中用了inverse="true"时,那就代表关系是由另一关维护的(Teacher)。就是说当这插
入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的
操作。所以,当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse=
"false"或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。
在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关
系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update
操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管
怎样说,还是让"多"方维护关系更直观一些。
3、cascade和inverse有什么区别?
可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。
4、
net.sf.hibernate.ObjectDeletedException: deleted object would be
re-saved by cascade (remove deleted object from associations): 2, of
class: Xxxxx
这个问题出现在要删除关系的一头时。如,要删除一个已经和Student有关系的Teacher。当tx.commit();时才会抛出这个异常。这时一
个在关系另一头的Student对象中的Set或是List中把这个Teacher对象显示的remove掉,再session.delete(这个
teacher);。这是为了防止在Student端有cascade时把这个Teacher对象再存回DB。所以,这个异常的只有在Student的关
系定义中有cascade="...",而且没有像上面说的显示的解除关系时才会出现。所以防止出现这个异常的方法就是:1,在Student端不用
cascade;2,或是用cascade的话,就显示的删除对像中的关系。 3,在Teacher端要用cascade
5、net.sf.hibernate.HibernateException: identifier of an instance of my.MyObject altered from N to N
这个异常其时不是多对多中常遇到的,但是这个异常的提示不make
sense,所以提一下,是因为id的java对象中的type和hbm文件中定义的不一样,如:java中用long,而hbm中用type=
"integer",并且generator用的是identity时就会出现
6、(To be add) 把hibernate遇到常见异常会一点点加上来的
相信使用过Spring +
Hibernate开发过的人,在写DAO的时候都使用过Spring的HibernateDaoSupport类,然后在实现的时候就可以很轻松的使用
getHibernateTemplate()方法之后就可以调用save()、delete()、update()等Hibernate的
Session的操作,很简单。比如:
getHibernateTemplate().save(user);
这样一句话在我们没有Spring的时候就必须使用如下的代码才能完成:
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
session.save(user);
tx.commit();
HibernateUtil.colseSession();
这里还省去了异常处理,同时使用了HibernateUtil类来简化从SessionFactory获取Session,以及关闭Session等处理。
但是我们在使用Hibernate的时候不一定会使用Spring,所以我们可以模仿Spring的处理方式,做一个Hibernate的模板,使用模板模式来简化我们的开发,其主要的目的就是为了简化开发,使代码达到最大话的重用。
1.我们现来实现一个Hibernate模板:
package kick.hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.Transaction;
public class HibernateTemplate{
public static Object run(HibernateCallback callback) throws HibernateException{
Session session = null;
Transaction tx = null;
try {
session = HibernateSessionutil.currentSession();
tx = session.beginTransaction();
Object result = callback.execute(session);
tx.commit();
session.flush();
return result;
} catch (HibernateException e) {
tx.rollback();
return null;
} finally {
HibernateSessionutil.closeSession();
}
}
这里类很简单,就是使用一个实现HibernateCallBack接口的一个回掉类,在调用的时候根据具体的需求实现HibernateCallBack类。
2.回掉接口HibernateCallBack:
package kick.hibernate;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
public interface HibernateCallBack {
Object execute(Session session)throws HibernateException;
}
好了,到此为止我们就可以使用这个模板了,可以用如下的方式使用:
HibernateTemplate.run(new HibernateCallback() {
public Object execute(Session session) throws HibernateException {
session.save(user);
return null;
}
});
看看,是不是省去了很多代码?^_^
不过这还没有达到想Spring里面那样简单,不要着急,“面包会有的”呵呵,我们会达到的。
3.实现我们自己的HibernateSupport类:
从上面的代码可以看出,我们要自己实现HibernateCallback接口,而每次我们实现的时候又重复代码了。因此我们再抽象,讲这些实现放到我们
的HibernateSupport类里面去。看看我们上面的代码就知道我们实现HibernateCallback接口的目的就是为了调用
session.save()方法,即session的方法。代码如下:
package kick.hibernate;
import java.io.Serializable;
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
public class HibernateSupport{
public Object save(final Object object) throws HibernateException{
return HibernateTemplate.run(new HibernateCallBack(){
public Object execute(Session session) throws HibernateException {
session.save(object);
return null;
}
});
}
public Object save(final Object object,final Serializable id) throws HibernateException{
return HibernateTemplate.run(new HibernateCallBack(){
public Object execute() throws HibernateException {
session.save(object,id);
return null;
}
});
}
public Object saveOrUpdate(final Object object) throws HibernateException{
return HibernateTemplate.run(new HibernateCallBack(){
public Object execute(Session session) throws HibernateException {
session.saveOrUpdate(object);
return null;
}
});
}
……………………………………………………………………………………
……………………………………………………………………………………
……………………………………………………………………………………
调用一些其他的session的方法。
}
4.抽象RootDao:
该类为抽象类,在实现自己的DAO类的时候继承该类。该类的有一个HibernateSupport的对象,在子类中使用getHibernateTemplate()方法就可以得到该对象,然后调用它对应的方法。实现代码如下:
package kick.hibernate.dao;
import net.sf.hibernate.Session;
import kick.hibernate.HibernateTemplateImpl;
public abstract class RootDao {
private HibernateSupport temp = null;
/**
* @return Returns the temp.
*/
public HibernateTemplateImpl getHibernateTemplate(Session session) {
return new HibernateSupport();
}
}
5.使用例子:
定义一个自己的DAO类,实现代码如下:
public class UserDaoImpl extends RootDao implements UserDaoInterface{
public void saveUser(User user) throws KickException {
getHibernateTemplate().saveOrUpdate(user);
}
……………………………………………………………………………………
实现其他的方法
……………………………………………………………………………………
}
看到没有?实现了Spring的HibernateSupport了吧?^_^
修改serif-10.css文件,把font-family改成宋体, Simsun,font-size改成9pt,这些就不说啦,狠简单。我要说的是防止文字太长导致屏幕横向移动。
在squirrelmail里,邮件正文显示时,用的是pre标签而不是p,所以一旦文字太长,超出叻浏览器屏幕,那么看起来就狠麻烦叻,总要左右移动。如果用p标签的话,会自动换行,效果好的多。
修改functions/mime.php,大概1990行左右,有个
$body = '<pre>' . implode("\n", $body_ary) . '</pre>';
改成
$body = '<p>' . strtr(implode("<br/>", $body_ary), array(' '=>' ')) . '</p>';
就行啦
一般我们开发一个新项目,都要从头设计CSS。而Tigris将自己的CSS抽取叻出来,专门立叻一个Tigris
Style项目。文件狠简单,就是几个CSS,一堆常用小图片(最大的有2k,最小的只有40字节,非常规范、省资源)。这几个CSS运用得当后,网页会
有立竿见影的效果,非常棒。这是几个范例,从
http://style.tigris.org上看到的:
没用CSS
http://style.tigris.org/nonav/docs/sampler.html
用叻CSS
http://style.tigris.org/nonav/docs/sampler_tigris.html
用叻CSS,稍微修改过的
http://style.tigris.org/nonav/docs/sampler_inst.html
有没有CSS就是不一样啊。有叻立马就给人感觉特好