??xml version="1.0" encoding="utf-8" standalone="yes"?> cascade表示U联操作 CascadeType.REFRESHU联保存Q对order对象保存时也对items里的对象也会保存。对应EntityManager的presistҎ CascadeType.REMOVEU联删除Q对order对象删除也对items里的对象也会删除。对应EntityManager的removeҎ CascadeType.MERGE指AcL增或者变化,会联B对象Q新增或者变化) CascadeType.REMOVE只有Acd除时Q会U联删除Bc; CascadeType.ALL包含所有; CascadeType.REFRESH没用q? lgQ大多数情况用CascadeType.MERGEp辑ֈU联跟新又不报错Q用CascadeType.ALL时要斟酌下CascadeType.REMOVE @Fetch: 定义了加载关联关pȝ获取{略. FetchMode 可以? SELECT (在需要加载关联的时候触发select操作), SUBSELECT(只对集合有效,使用了子查询{略,详情参考Hibernate参考文? JOIN (在加载主实体(owner entity)的时候用SQL JOIN来加载关联关p?. JOIN 覆写Q何gq属?(通过 JOIN{略加蝲的关联将不再h延迟?. 实体加蝲完成?/span>Q立卛_载其兌的数据?/span> 实体相关联的数据?span style="color: rgb(255, 0, 0);">W一ơ访?/span>时再q行d? 与immediately loadingcMQ但实体和相兌的数据是通过一条sql同时d?br />4.扚w加蝲 batch loading object is still valid, of course, and the detached instance might even be modified in this state. A detached instance can be reattached to a new Session at a later point in time, making it (and all the modifications) persistent again 现在应该明白了吧Q在删除之前把这个Detached instancel定到当前的SesssionQ在用当前Sesssion删除此instance。修改后的代码如 dom是解析xml的底层接口之一(另一U是sax)
注解配置实体cȝ兌关系Q在many-to-one,one-to-one兌中,一边引用自另一边的属性,如果属性gؓ某某的数据在数据库不存在了,hibernate默认会抛出异常。解x问题Q加上如下注解就可以了:
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?/strong>
cascade = CascadeType.REFRESHQcascade=CascadeType.ALL
CascadeType.MERGEU联更新Q若items属性修改了那么order对象保存时同时修改items里的对象。对应EntityManager的mergeҎ
CascadeType.PERSISTU联hQ获取order对象里也同时也重新获取最新的items时的对象。对应EntityManager的refresh(object)Ҏ有效。即会重新查询数据库里的最新数?nbsp;
Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q-Q?/strong>
fetch=FetchType.LAZY
Hibernate的数据加载方式:
1.x加蝲 immediately loading
2.延迟加蝲lazy loading
3.预先加蝲 eager loading
Q?br />
EntityManager 的API
下面是EntityManager的一些主要的接口ҎQ?
void persist(Object entity)
通过调用EntityManager的persist()ҎQ新实体实例{换ؓ受控状态。这意谓着当persist()Ҏ所在的事务提交Ӟ实体的数据将保存到数据库中。如果实体已l被持久化,那么调用persist()操作不会发生M事情。如果对一个已l删除的实体调用persist()操作Q删除态的实体又{变ؓ受控态。如果对游离状的实体执行persist()操作Q将抛出IllegalArgumentException?在一个实体上调用persist()操作Q将q播到和实体兌的实体上Q执行相应的U联持久化操作;
void remove(Object entity)
通过调用remove()Ҏ删除一个受控的实体。如果实体声明ؓU联删除(cascade=REMOVE 或者cascade=ALL )Q被兌的实体也会被删除。在一个新建状态的实体上调用remove()操作Q将被忽略。如果在游离实体上调用remove()操作Q将抛出IllegalArgumentExceptionQ相关的事务回滚。如果在已经删除的实体上执行remove()操作Q也会被忽略Q?
void flush()
受控态的实体数据同步到数据库中;
T merge(T entity)
一个游L的实体持久化到数据库中Qƈ转换为受控态的实体Q?
T find(Class entityClass, Object primaryKey)
以主键查询实体对象,entityClass是实体的c,primaryKey是主键|如以下的代码查询Topic实体Q?Topic t = em.find(Topic.class,1); Query createQuery(String qlString) ҎJPA的查询语句创Z个查询对象QueryQ如下面的代码:
Query q= em.createQuery(""SELECT t FROM Topic t WHERE t.topicTitle LIKE :topicTitle")"); Query createNativeQuery(String sqlString)
使用本地数据库的SQL语句创徏一个Query对象QQuery通过getResultList()Ҏ执行查询后,q回一个Listl果集,每一行数据对应一个Vector?
使用本地数据库的SQL语句创徏一个Query对象QQuery通过getResultList()Ҏ执行查询后,q回一个Listl果集,每一行数据对应一个Vector?
看来要学习的东东q有好多啊~~努力吧!
]]>
目前下蝲版本Q?.2.1GA?br />
Hibernate下蝲地址Q?br />http://www.hibernate.org/downloads
目前下蝲版本Q?.6.0 Final?br />
Spring的下载地址Q?br />http://www.springsource.org/download
目前下蝲版本Q稳定版3.0.5
1、struts2 top关键字理解?nbsp;
1).top 指代当前q代元素Q可以ؓ对象Q?br />2).q里的top可用[0].top替代Q但不能使用[0];[0]代表整个栈对象。如果单U调用[0]会调用?toString()Ҏ输出对象信息Q?br />
2、删除信息时错误日志Q?br />java.lang.IllegalArgumentException: Removing a detached instance
Detached - a detached instance is an object that has been persistent, but its Session has been closed. The reference to the
解决办法Q?br />public void delete(SASVo vo) {
entityManager.remove( entityManager.merge(vo));
}
]]>
而jdom和dom4j则是Z底层api的更高装
dom是通用的,而jdom和dom4j则是面向java语言?nbsp;
DOM 是用与^台和语言无关的方式表C?XML 文档的官?W3C 标准。DOM 是以层次l构l织的节Ҏ信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因?DOM 被认为是Z树或Z对象的。DOM 以及q义的基于树的处理具有几个优炏V首先,׃树在内存中是持久的,因此可以修改它以便应用程序能Ҏ据和l构作出更改。它q可以在M时候在树中上下DQ而不是像 SAX 那样是一ơ性的处理。DOM 使用h也要单得多?/span>
XML的四U解析器(dom,sax,jdom,dom4j)原理及性能比较(转自zsq)
1、DOM
DOM 是用与^台和语言无关的方式表C?XML 文档的官?W3C 标准。DOM 是以层次l构l织的节Ҏ信息片断的集合。这个层ơ结构允许开发h员在树中L特定信息。分析该l构通常需要加载整个文档和构造层ơ结构,然后才能做Q何工作。由于它是基于信息层ơ的Q因?DOM 被认为是Z树或Z对象的。DOM 以及q义的基于树的处理具有几个优炏V?br /> 首先Q由于树在内存中是持久的Q因此可以修改它以便应用E序能对数据和结构作出更攏V它q可以在M时候在树中上下DQ而不是像 SAX 那样是一ơ性的处理。DOM 使用h也要单得多?br /> 另一斚wQ对于特别大的文档,解析和加载整个文档可能很慢且很耗资源,因此使用其他手段来处理这L数据会更好。这些基于事件的模型Q比?SAX?
2、SAX
q种处理的优炚w常类g媒体的优点。分析能够立卛_始,而不是等待所有的数据被处理。而且Q由于应用程序只是在d数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优炏V事实上Q应用程序甚至不必解析整个文档;它可以在某个条g得到满时停止解析。一般来_SAX q比它的替代?DOM 快许多?br />3、选择 DOM q是选择 SAX Q?/strong>
对于需要自q写代码来处理 XML 文档的开发h员来_选择 DOM q是 SAX 解析模型是一个非帔R要的设计决策?nbsp;
DOM 采用建立树Şl构的方式访?XML 文档Q?SAX 采用的事件模型?nbsp;
DOM 解析器把 XML 文档转化Z个包含其内容的树Qƈ可以Ҏq行遍历。用 DOM 解析模型的优Ҏ~程ҎQ开发h员只需要调用徏树的指oQ然后利用navigation APIs讉K所需的树节点来完成Q务。可以很Ҏ的添加和修改树中的元素。然而由于?DOM 解析器的时候需要处理整?XML 文档Q所以对性能和内存的要求比较高,其是遇到很大的 XML 文g的时候。由于它的遍历能力,DOM 解析器常用于 XML 文档需要频J的改变的服务中?br /> SAX 解析器采用了Z事g的模型,它在解析 XML 文档的时候可以触发一pd的事Ӟ当发现给定的tag的时候,它可以激zM个回调方法,告诉该方法制定的标签已经扑ֈ。SAX 对内存的要求通常会比较低Q因为它让开发h员自己来军_所要处理的tag。特别是当开发h员只需要处理文档中所包含的部分数据时QSAX q种扩展能力得到了更好的体现。但?SAX 解析器的时候编码工作会比较困难Q而且很难同时讉K同一个文档中的多处不同数据?br />4、JDOM
JDOM的目的是成ؓ Java 特定文档模型Q它化与 XML 的交互ƈ且比使用 DOM 实现更快。由于是W一?Java 特定模型QJDOM 一直得到大力推q和促进。正在考虑通过“Java 规范h JSR-102”它最l用?#8220;Java 标准扩展”。从 2000 q初已l开始了 JDOM 开发?br /> JDOM ?DOM 主要有两斚w不同。首先,JDOM 仅用具体类而不使用接口。这在某些方面简化了 APIQ但是也限制了灵zL。第二,API 大量使用?Collections c,化了那些已经熟悉q些cȝ Java 开发者的使用?br /> JDOM 文档声明其目的是“使用 20%Q或更少Q的_֊解决 80%Q或更多QJava/XML 问题”Q根据学习曲U假定ؓ 20%Q。JDOM 对于大多?Java/XML 应用E序来说当然是有用的Qƈ且大多数开发者发?API ?DOM Ҏ理解得多。JDOM q包括对E序行ؓ的相当广泛检查以防止用户做Q何在 XML 中无意义的事。然而,它仍需要您充分理解 XML 以便做一些超出基本的工作Q或者甚至理解某些情况下的错误)。这也许是比学习 DOM ?JDOM 接口都更有意义的工作?br /> JDOM 自n不包含解析器。它通常使用 SAX2 解析器来解析和验证输?XML 文档Q尽它q可以将以前构造的 DOM 表示作ؓ输入Q。它包含一些{换器以将 JDOM 表示输出?SAX2 事g、DOM 模型?XML 文本文档。JDOM 是在 Apache 许可证变体下发布的开放源码?br />5、DOM4J
虽然 DOM4J 代表了完全独立的开发结果,但最初,它是 JDOM 的一U智能分支。它合ƈ了许多超出基?XML 文档表示的功能,包括集成?XPath 支持、XML Schema 支持以及用于大文档或化文档的基于事件的处理。它q提供了构徏文档表示的选项Q它通过 DOM4J API 和标?DOM 接口hq行讉K功能。从 2000 下半q开始,它就一直处于开发之中?br /> 为支持所有这些功能,DOM4J 使用接口和抽象基本类Ҏ。DOM4J 大量使用?API 中的 Collections c,但是在许多情况下Q它q提供一些替代方法以允许更好的性能或更直接的编码方法。直接好处是Q虽?DOM4J 付出了更复杂?API 的代P但是它提供了?JDOM 大得多的灉|性?br /> 在添加灵zL、XPath 集成和对大文档处理的目标ӞDOM4J 的目标与 JDOM 是一LQ针?Java 开发者的易用性和直观操作。它q致力于成ؓ?JDOM 更完整的解决ҎQ实现在本质上处理所?Java/XML 问题的目标。在完成该目标时Q它?JDOM 更少防止不正的应用E序行ؓ?br /> DOM4J 是一个非帔R怼U的Java XML APIQ具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的Y件。如今你可以看到来多?Java 软g都在使用 DOM4J 来读?XMLQ特别值得一提的是连 Sun ?JAXM 也在?DOM4J?br />6、总述
JDOM ?DOM 在性能试时表C佻I在测?10M 文档时内存溢出。在文档情况下q值得考虑使用 DOM ?JDOM。虽?JDOM 的开发者已l说明他们期望在正式发行版前专注性能问题Q但是从性能观点来看Q它实没有值得推荐之处。另外,DOM 仍是一个非常好的选择。DOM 实现q泛应用于多U编E语a。它q是许多其它?XML 相关的标准的基础Q因为它正式获得 W3C 推荐Q与Z非标准的 Java 模型相对Q,所以在某些cd的项目中可能也需要它Q如?javascript 中?DOMQ?br /> SAX表现较好Q这要依赖于它特定的解析方式。一?SAX 即到来的XML,但ƈ没有载入到内存(当然当XML被dӞ会有部分文档暂时隐藏在内存中Q?br /> 无疑QDOM4J是最好的Q目前许多开源项目中大量采用 DOM4JQ例如大名鼎鼎的 Hibernate 也用 DOM4J 来读?XML 配置文g。如果不考虑可移植性,那就采用DOM4J吧!
]]>
W二步:在CLASSPATH下徏立log4j.properties。内容如下:
1 log4j.rootCategory=INFO, stdout , R
2
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
5 log4j.appender.stdout.layout.ConversionPattern=[QC] %p [%t] %C.%M(%L) | %m%n
6
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log
9 log4j.appender.R.layout=org.apache.log4j.PatternLayout
10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
11
12 log4j.logger.com.neusoft=DEBUG
13 log4j.logger.com.opensymphony.oscache=ERROR
14 log4j.logger.net.sf.navigator=ERROR
15 log4j.logger.org.apache.commons=ERROR
16 log4j.logger.org.apache.struts=WARN
17 log4j.logger.org.displaytag=ERROR
18 log4j.logger.org.springframework=DEBUG
19 log4j.logger.com.ibatis.db=WARN
20 log4j.logger.org.apache.velocity=FATAL
21
22 log4j.logger.com.canoo.webtest=WARN
23
24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
25 log4j.logger.org.hibernate=DEBUG
26 log4j.logger.org.logicalcobwebs=WARN
W三步:相应的修改其中属性,修改之前必ȝ道这些都是干什么的Q在W二部分讲解?/span>
W四步:在要输出日志的类中加入相兌句:
定义属性:protected final Log log = LogFactory.getLog(getClass());
在相应的Ҏ中:
if (log.isDebugEnabled())
{
log.debug(“System …..”);
}
二、Log4j说明
1 log4j.rootCategory=INFO, stdout , R
此句为将{为INFO的日志信息输出到 stdout和Rq两个目的地Qstdout和R的定义在下面的代码,可以L起名。等U可分ؓOFF?FATAL、ERROR、WARN、INFO、DEBUG、ALLQ如果配|OFF则不打出M信息Q如果配|ؓINFOq样只显CINFO, WARN, ERROR的log信息Q而DEBUG信息不会被显C,具体讲解可参照第三部分定义配|文件中的logger?/span>
3 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
此句为定义名为stdout的输出端是哪U类型,可以?/span>
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?/span>
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?/span>
org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文Ӟ
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
具体讲解可参照第三部分定义配|文件中的Appender?/span>
4 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
此句为定义名为stdout的输出端的layout是哪U类型,可以?/span>
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
具体讲解可参照第三部分定义配|文件中的Layout?/span>
5 log4j.appender.stdout.layout.ConversionPattern= [QC] %p [%t] %C.%M(%L) | %m%n
如果使用pattern布局p指定的打C息的具体格式ConversionPatternQ打印参数如下:
%m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?/span>
%t 输出产生该日志事件的U程?/span>
%n 输出一个回车换行符QWindowsq_?#8220;rn”QUnixq_?#8220;n”
%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?/span>
[QC]是log信息的开_可以ZQ意字W,一般ؓ目U?/span>
输出的信?/span>
[TS] DEBUG [main] AbstractBeanFactory.getBean(189) | Returning cached instance of singleton bean 'MyAutoProxy'
具体讲解可参照第三部分定义配|文件中的格式化日志信息?/span>
7 log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
此句与第3行一栗定义名为R的输出端的类型ؓ每天产生一个日志文件?/span>
8 log4j.appender.R.File=D:\Tomcat 5.5\logs\qc.log
此句为定义名为R的输出端的文件名为D:\Tomcat 5.5\logs\qc.log
可以自行修改?/span>
9 log4j.appender.R.layout=org.apache.log4j.PatternLayout
与第4行相同?/span>
10 log4j.appender.R.layout.ConversionPattern=%d-[TS] %p %t %c - %m%n
与第5行相同?/span>
12 log4j.logger.com. neusoft =DEBUG
指定com.neusoft包下的所有类的等UؓDEBUG?/span>
可以把com.neusoft改ؓ自己目所用的包名?/span>
13 log4j.logger.com.opensymphony.oscache=ERROR
14 log4j.logger.net.sf.navigator=ERROR
q两句是把这两个包下出现的错误的{设ؓERRORQ如果项目中没有配置EHCacheQ则不需要这两句?/span>
15 log4j.logger.org.apache.commons=ERROR
16 log4j.logger.org.apache.struts=WARN
q两句是struts的包?/span>
17 log4j.logger.org.displaytag=ERROR
q句是displaytag的包。(QC问题列表面所用)
18 log4j.logger.org.springframework=DEBUG
此句为Spring的包?/span>
24 log4j.logger.org.hibernate.ps.PreparedStatementCache=WARN
25 log4j.logger.org.hibernate=DEBUG
此两句是hibernate的包?/span>
以上q些包的讄可根据项目的实际情况而自行定制?/span>
三、log4j详解
1、定义配|文?/span>
Log4j支持两种配置文g格式Q一U是XML格式的文Ӟ一U是JavaҎ文件log4j.propertiesQ键=|。下面将介绍使用log4j.properties文g作ؓ配置文g的方?
①、配|根Logger
Logger 负责处理日志记录的大部分操作?/span>
其语法ؓQ?/span>
log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中Qlevel 是日志记录的优先U,分ؓOFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定义的别。Log4j只用四个别,?先从高C分别是ERROR、WARN、INFO、DEBUG。通过在这里定义的U别Q您可以控制到应用程序中相应U别的日志信息的开兟뀂比如在q里?义了INFOU别Q只有等于及高于q个U别的才q行处理Q则应用E序中所有DEBUGU别的日志信息将不被打印出来。ALL:打印所有的日志QOFFQ关 闭所有的日志输出?appenderName是指定日志信息输出到哪个地斏V可同时指定多个输出目的地?/span>
②、配|日志信息输出目的地 Appender
Appender 负责控制日志记录操作的输出?/span>
其语法ؓQ?/span>
log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.optionN = valueN
q里的appenderName为在①里定义的Q可L起名?/span>
其中QLog4j提供的appender有以下几U:
org.apache.log4j.ConsoleAppenderQ控制台Q,
org.apache.log4j.FileAppenderQ文ӞQ?/span>
org.apache.log4j.DailyRollingFileAppenderQ每天生一个日志文ӞQ?/span>
org.apache.log4j.RollingFileAppenderQ文件大到达指定尺寸的时候生一个新的文ӞQ可通过 log4j.appender.R.MaxFileSize=100KB讄文g大小Q还可通过 log4j.appender.R.MaxBackupIndex=1讄Z存一个备份文件?/span>
org.apache.log4j.WriterAppenderQ将日志信息以流格式发送到L指定的地方)
例如Qlog4j.appender.stdout=org.apache.log4j.ConsoleAppender
定义一个名为stdout的输出目的地QConsoleAppender为控制台?/span>
③、配|日志信息的格式Q布局QLayout
Layout 负责格式化Appender的输出?/span>
其语法ؓQ?/span>
log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.optionN = valueN
其中QLog4j提供的layout有以下几U:
org.apache.log4j.HTMLLayoutQ以HTML表格形式布局Q,
org.apache.log4j.PatternLayoutQ可以灵zd指定布局模式Q,
org.apache.log4j.SimpleLayoutQ包含日志信息的U别和信息字W串Q,
org.apache.log4j.TTCCLayoutQ包含日志生的旉、线E、类别等{信息)
2、格式化日志信息
Log4J采用cMC语言中的printf函数的打印格式格式化日志信息Q打印参数如下:
%m 输出代码中指定的消息
%p 输出优先U,即DEBUGQINFOQWARNQERRORQFATAL
%r 输出自应用启动到输出该log信息耗费的毫U数
%c 输出所属的cȝQ通常是所在类的全?/span>
%t 输出产生该日志事件的U程?/span>
%n 输出一个回车换行符QWindowsq_?#8220;rn”QUnixq_?#8220;n”
%d 输出日志旉点的日期或时_默认格式为ISO8601Q也可以在其后指定格式,比如Q?d{yyyy MMM dd HH:mm:ss,SSS}Q输出类|2002q?0?8?22Q?0Q?8Q?21
%l 输出日志事g的发生位|,包括cȝ名、发生的U程Q以及在代码中的行数?/span>
3、在代码中用Log4j
我们在需要输出日志信息的cM做如下的三个工作Q?/span>
1、导入所有需的commongs-loggingc:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
2、在自己的类中定义一个org.apache.commons.logging.LogcȝU有静态类成员Q?/span>
private final Log log = LogFactory.getLog(getClass());
LogFactory.getLog()Ҏ的参C用的是当前类的class?/span>
3、用org.apache.commons.logging.Logcȝ成员Ҏ输出日志信息Q?/span>
if (log.isDebugEnabled())
{
log.debug("111");
}
if (log.isInfoEnabled())
{
log.info("222");
}
if (log.isWarnEnabled())
{
log.warn("333");
}
if (log.isErrorEnabled())
{
log.error("444");
}
if (log.isFatalEnabled())
{
log.fatal("555")
}
]]>
使用场景Q一般在模型中对应某一个字D늚属性中的set和getҎ中。作用是数据与数据库中不一一对应。如Q?br />/*@Transient
public String getModulename() {
return modulename;
}
public void setModulename(String modulename) {
this.modulename = modulename;
}*/
2、@ManyToOne
多对一。可以把另一个模型对应过来。在查询Ӟ无需要联表查询?br /> @JoinColumn(name="moduleid",insertable=false,updatable=false)
@NotFound(action=NotFoundAction.IGNORE)
public CateModule getCateModule() {
return cateModule;
}
public void setCateModule(CateModule cateModule) {
this.cateModule = cateModule;
}
]]>
Class objCls=obj.getClass();
Field[] allFields=objCls.getDeclaredFields();
if(allFields!=null && allFields.length!=0){
HTMLFilter filter=new HTMLFilter();
for(Field field: allFields){
if(field!=null){
if(field.getType().equals(String.class)){
String getMethod="get"+upperCaseFirstChar(field.getName());
String setMethod="set"+upperCaseFirstChar(field.getName());
try {
//String value=(String)objCls.getMethod(getMethod).invoke(obj);
//value=filter.filter(value);
//objCls.getMethod(setMethod, value.getClass()).invoke(obj, value);
} catch (Exception e) {
throw e;
}
}
}
}
}
return obj;
}
]]>
ADD COLUMN "isrejected" int2 DEFAULT 0 NOT NULL;
ALTER TABLE "public"."base_contract"
ADD COLUMN "userid" int8 DEFAULT 0 NOT NULL;
ALTER TABLE "public"."base_user"
ADD COLUMN "telphone" varchar(20) DEFAULT ''::character varying NOT NULL;
INSERT INTO "base_role" VALUES ('21', '代理?, '只能查看对属于自q所有合?);
update base_contract a set userid=(SELECT b.userid from base_user b where a.username=b.username LIMIT 1)
delete from base_menu;
BEGIN;
INSERT INTO "base_menu" VALUES ('1', 'infoMenu', null, '公用菜单', null, null, null, null, 'Y', '0');
INSERT INTO "base_menu" VALUES ('2', 'ediUser', 'infoMenu', '修改个h资料', 'Note', 'ediUser.jsp', 'top', '2', 'N', '0');
COMMIT;
三、安装jdkq且配置resin
下蝲jdk1.7.0Qƈ且解压到/usr/java/?l果昄?/usr/java/jdk1.7.0
cd /usr/src/ && tar xzf resin-pro-4.0.23.tar.gz &&cd resin-pro-4.0.23 &&./configure –with-java-home=/usr/java/jdk1.7.0 &&make &&make install 卛_Q?br />安装完后resin的日志目录在 /var/log/resin/?br />启动resin命o如下 /etc/init.d/resin start 卛_Q然后访问http://ip:8080
四、nginx整合resin的方式跟nginx整合tomcat一P再这里就不重复了Q?br />提供我上一文章地址:http://chinaapp.sinaapp.com/?p=1922
五、resin配置优化:
以下是我的配|文?贴出一部分修改的,其他的保持不变,在回复下面!
二:switch
<#switch value>
<#case refValue1>...<#break>
<#case refValue2>...<#break>...
<#case refValueN>...<#break>
<#default>...</#switch>
三:listQbreak
<#list sequence as item>
...
</#list>
两个Ҏ的@环变量:
item_index: 当前变量的烦引倹{?br />item_has_next: 是否存在下一个对象?/p>
可以?lt;#break/>指odloop循环?/p>
四:include指o
<#include filename>或?br /><#include filenameoptions>
filename: 表达式{换ؓ字符?br />options: encoding=encoding, parse=parse encoding: 表达式{换ؓ字符?br />parse: 表达式{换ؓ逻辑|是否作ؓftl文g解析?br /><#include "/common/navbar.html" parse=false encoding="Shift_JIS">
<#include "*/footer.ftl">表示当前目录下以及所有父目录下的文g。如果当前模版在/foo/bar/template.ftl Q那么查找footer.ftl的顺序ؓQ?foo/bar/footer.ftl
/foo/footer.ftl/footer.ftlq种方式讲允许设计者将通用的模版放在父文g多w面?br />也可以只指定部分路径Q?lt;#include "*/commons/footer.ftl">
五:import指o<#import path as hash>
六:noparse
<#noparse>
...
</#noparse>
七:compress
<#compress>
...
</#compress>
八:escapeQnoescape
<#escape identifier as expression>
...
<#noescape>...</#noescape>
...
</#escape>
escape指obody区的ftl的interpolations都会被自动加上escape表达式。但是不会媄响字W串内的interpolations。而且也只会媄响到body内出现的interpolationsQ比如不会媄响到include的ftl的interpolations?br /><#escape x as x?html>
First name: ${firstName}
Last name: ${lastName}
Maiden name: ${maidenName}</#escape>
{同于:
First name: ${firstName?html}
Last name: ${lastName?html}
Maiden name: ${maidenName?html}
escape指o在解析模版时起作用,而不是运行时起作用?/p>
escape指oq能嵌套使用Q子l承父的escape规则?/p>
<#escape x as x?html>
Customer Name: ${customerName}
Items to ship:
<#escape x as itemCodeToNameMap[x]>
${itemCode1}
${itemCode2}
${itemCode3}
${itemCode4}
</#escape></#escape>
{同于:Customer Name: ${customerName?html}
Items to ship:
${itemCodeToNameMap[itemCode1]?html}
${itemCodeToNameMap[itemCode2]?html}
${itemCodeToNameMap[itemCode3]?html}
${itemCodeToNameMap[itemCode4]?html}
九:assign指o
<#assign name=value>or<#assign name1=value1name2=value2... nameN=valueN>or<#assign same as above... in namespacehash>or<#assign name> capture this</#assign>or<#assign name in namespacehash> capture this</#assign>创徏或者替换一个已l存在的变量Q只能作用于层变量。不好的做法Q?lt;#assign x>Hello ${user}!</#assign>更改为:<#assign x="Hello ${user}!">
十:global指o
<#global name=value>
or
<#global name1=value1name2=value2... nameN=valueN>or<#global name>
capture this
</#global>
十一Qlocal指o
<#local name=value>
or
<#local name1=value1name2=value2... nameN=valueN>or<#local name>
capture this
</#local>只能用于macro的定义body中?/p>
十二Qsetting指oQ?/p>
<#setting name=value>
name的取D_
localQnumber_formatQ?br />boolean_format:~省gؓ"true,false"
date_format, time_format, datetime_format
time_zoneQurl_escaping_charset
classic_compatible
十三Q用戯定义指o
<@macro_or_transfparam1=val1param2=val2...paramN=valN/><@macro_or_transfparam1=val1param2=val2...paramN=valN ; lv1, lv2, ..., lvN/><@macro_or_transf...> ...</@macro_or_transf><@macro_or_transf...> ...</@><@macro_or_transfval1, val2, ..., valN/>
十四Qmacro,nested,return
<#macro nameparam1param2... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
十五Qfunction, return
<#function nameparam1param2... paramN>
... <#return returnValue>
...
</#function>
<#function avg x y>
<#return (x + y) / 2>
</#function>
${avg(10, 20)}
十六Qflush
<#flush>
十七Qstop
<#stop>
or
<#stop reason>取消处理模版?/p>
十八Qftl指o
<#ftl param1=value1param2=value2...paramN=valueN>
ftl指o必须攑֜ftl文g的最上面?/p>
参数范围Q?br />encodingQ?br />strip_whitespace
strip_text
strict_syntax
十九Qt, lt, rt
二十Qattempt, recover
<#attempt>
attempt block<#recover>
recover block
</#attempt>
<#attempt>
Optional content: ${thisMayFails}
<#recover>
Ops! The optional content is not available.
</#attempt>
<!-- http://www.iefans.net/ie8-filteralpha-png-touming/
IE8里可以这样写 -ms-filter:”progid:DXImageTransform.Microsoft.Alpha(opacity=50)”;
IE7里可以这样写 filter:progid:DXImageTransform.Microsoft.Alpha(opacity=50);
IE6,IE7,IE8里都可以q样写 filter:alpha(opacity=50)
-->
from:http://unc0pyrightable.blog.163.com/blog/static/1313300602010021526561/
今天推荐一个最完美让ie6支持png透明的js,Z么说它最完美呢?
只因为它支持background-position和background-repeat
q是市面上的其它Ҏ比不上的
首先,要在|页中引用js
<!--[if IE 6]>
<script src="http://www.dillerdesign.com/experiment/DD_belatedPNG/DD_belatedPNG_0.0.8a-min.js"></script>
<script>
DD_belatedPNG.fix('.png_bg');
</script>
<![endif]-->
上面那个js路径是绝对\?大家最好还是把它下下来,以防|站挂了.
引用之后是更改W二?lt;script>里的.pngZ要实现效果的选择?
比??header引用了一个background,那你上面p改ؓ:
DD_belatedPNG.fix('#header');
q且它还支持l选择??
DD_belatedPNG.fix('#header,h1,h2,h3,#content');
很简单吧,只要把有透明png的标{或选择器写在里面就?/font>
至于q里面能不能支持css3׃得而知?
官网:http://www.dillerdesign.com/experiment/DD_belatedPNG/
q个JS内容Q?font color="#666666" size="3">DD_belatedPNG_0.0.8a-min.jsQ,备存Q?/p>
/**
* DD_belatedPNG: Adds IE6 support: PNG images for CSS background-image and HTML <IMG/>.
* Author: Drew Diller
* Email: drew.diller@gmail.com
* URL: http://www.dillerdesign.com/experiment/DD_belatedPNG/
* Version: 0.0.8a
* Licensed under the MIT License: http://dillerdesign.com/experiment/DD_belatedPNG/#license
*
* Example usage:
* DD_belatedPNG.fix('.png_bg'); // argument is a CSS selector
* DD_belatedPNG.fixPng( someNode ); // argument is an HTMLDomElement
**/
var DD_belatedPNG={
ns:"DD_belatedPNG",imgSize:{
},delay:10,nodesFixed:0,createVmlNameSpace:function () {
if(document.namespaces&&!document.namespaces[this.ns]) {
document.namespaces.add(this.ns,"urn:schemas-microsoft-com:vml")
}
},createVmlStyleSheet:function () {
var b,a;
b=document.createElement("style");
b.setAttribute("media","screen");
document.documentElement.firstChild.insertBefore(b,document.documentElement.firstChild.firstChild);
if(b.styleSheet) {
b=b.styleSheet;
b.addRule(this.ns+"\\:*","{behavior:url(#default#VML)}");
b.addRule(this.ns+"\\:shape","position:absolute;");
b.addRule("img."+this.ns+"_sizeFinder","behavior:none; border:none; position:absolute; z-index:-1; top:-10000px; visibility:hidden;");
this.screenStyleSheet=b;
a=document.createElement("style");
a.setAttribute("media","print");
document.documentElement.firstChild.insertBefore(a,document.documentElement.firstChild.firstChild);
a=a.styleSheet;
a.addRule(this.ns+"\\:*","{display: none !important;}");
a.addRule("img."+this.ns+"_sizeFinder","{display: none !important;}")
}
},readPropertyChange:function () {
var b,c,a;
b=event.srcElement;
if(!b.vmlInitiated) {
return
}if(event.propertyName.search("background")!=-1||event.propertyName.search("border")!=-1) {
DD_belatedPNG.applyVML(b)
}if(event.propertyName=="style.display") {
c=(b.currentStyle.display=="none")?"none":"block";
for(a in b.vml) {
if(b.vml.hasOwnProperty (a)) {
b.vml[a].shape.style.display=c
}
}
}if(event.propertyName.search("filter")!=-1) {
DD_belatedPNG.vmlOpacity(b)
}
},vmlOpacity:function (b) {
if(b.currentStyle.filter.search("lpha")!=-1) {
var a=b.currentStyle.filter;
a=parseInt(a.substring(a.lastIndexOf("=")+1,a.lastIndexOf(")")),10)/100;
b.vml.color.shape.style.filter=b.currentStyle.filter;
b.vml.image.fill.opacity=a
}
},handlePseudoHover:function (a) {
setTimeout(function () {
DD_belatedPNG.applyVML(a)
},1)
},fix:function (a) {
if(this.screenStyleSheet) {
var c,b;
c=a.split(",");
for(b=0;b<c.length;b++) {
this.screenStyleSheet.addRule(c[b],"behavior:expression(DD_belatedPNG.fixPng(this))")
}
}
},applyVML:function (a) {
a.runtimeStyle.cssText="";
this.vmlFill(a);
this.vmlOffsets(a);
this.vmlOpacity(a);
if(a.isImg) {
this.copyImageBorders(a)
}
},attachHandlers:function (i) {
var d,c,g,e,b,f;
d=this;
c={
resize:"vmlOffsets",move:"vmlOffsets"
};
if(i.nodeName=="A") {
e={
mouseleave:"handlePseudoHover",mouseenter:"handlePseudoHover",focus:"handlePseudoHover",blur:"handlePseudoHover"
};
for(b in e) {
if(e.hasOwnProperty (b)) {
c[b]=e[b]
}
}
}for(f in c) {
if(c.hasOwnProperty (f)) {
g=function () {
d[c[f]](i)
};
i.attachEvent("on"+f,g)
}
}i.attachEvent("onpropertychange",this.readPropertyChange)
},giveLayout:function (a) {
a.style.zoom=1;
if(a.currentStyle.position=="static") {
a.style.position="relative"
}
},copyImageBorders:function (b) {
var c,a;
c={
borderStyle:true,borderWidth:true,borderColor:true
};
for(a in c) {
if(c.hasOwnProperty (a)) {
b.vml.color.shape.style[a]=b.currentStyle[a]
}
}
},vmlFill:function (e) {
if(!e.currentStyle) {
return
}else {
var d,f,g,b,a,c;
d=e.currentStyle
}for(b in e.vml) {
if(e.vml.hasOwnProperty (b)) {
e.vml[b].shape.style.zIndex=d.zIndex
}
}e.runtimeStyle.backgroundColor="";
e.runtimeStyle.backgroundImage="";
f=true;
if(d.backgroundImage!="none"||e.isImg) {
if(!e.isImg) {
e.vmlBg=d.backgroundImage;
e.vmlBg=e.vmlBg.substr(5,e.vmlBg.lastIndexOf('")')-5)
}else {
e.vmlBg=e.src
}g=this;
if(!g.imgSize[e.vmlBg]) {
a=document.createElement("img");
g.imgSize[e.vmlBg]=a;
a.className=g.ns+"_sizeFinder";
a.runtimeStyle.cssText="behavior:none; position:absolute; left:-10000px; top:-10000px; border:none; margin:0; padding:0;";
c=function () {
this.width=this.offsetWidth;
this.height=this.offsetHeight;
g.vmlOffsets(e)
};
a.attachEvent("onload",c);
a.src=e.vmlBg;
a.removeAttribute("width");
a.removeAttribute("height");
document.body.insertBefore(a,document.body.firstChild)
}e.vml.image.fill.src=e.vmlBg;
f=false
}e.vml.image.fill.on=!f;
e.vml.image.fill.color="none";
e.vml.color.shape.style.backgroundColor=d.backgroundColor;
e.runtimeStyle.backgroundImage="none";
e.runtimeStyle.backgroundColor="transparent"
},vmlOffsets:function (d) {
var h,n,a,e,g,m,f,l,j,i,k;
h=d.currentStyle;
n={
W:d.clientWidth+1,H:d.clientHeight+1,w:this.imgSize[d.vmlBg].width,h:this.imgSize[d.vmlBg].height,L:d.offsetLeft,T:d.offsetTop,bLW:d.clientLeft,bTW:d.clientTop
};
a=(n.L+n.bLW==1)?1:0;
e=function (b,p,q,c,s,u) {
b.coordsize=c+","+s;
b.coordorigin=u+","+u;
b.path="m0,0l"+c+",0l"+c+","+s+"l0,"+s+" xe";
b.style.width=c+"px";
b.style.height=s+"px";
b.style.left=p+"px";
b.style.top=q+"px"
};
e(d.vml.color.shape,(n.L+(d.isImg?0:n.bLW)),(n.T+(d.isImg?0:n.bTW)),(n.W-1),(n.H-1),0);
e(d.vml.image.shape,(n.L+n.bLW),(n.T+n.bTW),(n.W),(n.H),1);
g={
X:0,Y:0
};
if(d.isImg) {
g.X=parseInt(h.paddingLeft,10)+1;
g.Y=parseInt(h.paddingTop,10)+1
}else {
for(j in g) {
if(g.hasOwnProperty (j)) {
this.figurePercentage(g,n,j,h["backgroundPosition"+j])
}
}
}d.vml.image.fill.position=(g.X/n.W)+","+(g.Y/n.H);
m=h.backgroundRepeat;
f={
T:1,R:n.W+a,B:n.H,L:1+a
};
l={
X:{
b1:"L",b2:"R",d:"W"
},Y:{
b1:"T",b2:"B",d:"H"
}
};
if(m!="repeat"||d.isImg) {
i={
T:(g.Y),R:(g.X+n.w),B:(g.Y+n.h),L:(g.X)
};
if(m.search("repeat-")!=-1) {
k=m.split("repeat-")[1].toUpperCase();
i[l[k].b1]=1;
i[l[k].b2]=n[l[k].d]
}if(i.B>n.H) {
i.B=n.H
}d.vml.image.shape.style.clip="rect("+i.T+"px "+(i.R+a)+"px "+i.B+"px "+(i.L+a)+"px)"
}else {
d.vml.image.shape.style.clip="rect("+f.T+"px "+f.R+"px "+f.B+"px "+f.L+"px)"
}
},figurePercentage:function (d,c,f,a) {
var b,e;
e=true;
b=(f=="X");
switch(a) {
case "left":case "top":d[f]=0;
break;
case "center":d[f]=0.5;
break;
case "right":case "bottom":d[f]=1;
break;
default:if(a.search("%")!=-1) {
d[f]=parseInt(a,10)/100
}else {
e=false
}
}d[f]=Math.ceil(e?((c[b?"W":"H"]*d[f])-(c[b?"w":"h"]*d[f])):parseInt(a,10));
if(d[f]%2===0) {
d[f]++
}return d[f]
},fixPng:function (c) {
c.style.behavior="none";
var g,b,f,a,d;
if(c.nodeName=="BODY"||c.nodeName=="TD"||c.nodeName=="TR") {
return
}c.isImg=false;
if(c.nodeName=="IMG") {
if(c.src.toLowerCase().search(/\.png$/)!=-1) {
c.isImg=true;
c.style.visibility="hidden"
}else {
return
}
}else {
if(c.currentStyle.backgroundImage.toLowerCase().search(".png")==-1) {
return
}
}g=DD_belatedPNG;
c.vml={
color:{
},image:{
}
};
b={
shape:{
},fill:{
}
};
for(a in c.vml) {
if(c.vml.hasOwnProperty (a)) {
for(d in b) {
if(b.hasOwnProperty (d)) {
f=g.ns+":"+d;
c.vml[a][d]=document.createElement(f)
}
}c.vml[a].shape.stroked=false;
c.vml[a].shape.appendChild(c.vml[a].fill);
c.parentNode.insertBefore(c.vml[a].shape,c)
}
}c.vml.image.shape.fillcolor="none";
c.vml.image.fill.type="tile";
c.vml.color.fill.on=false;
g.attachHandlers(c);
g.giveLayout(c);
g.giveLayout(c.offsetParent);
c.vmlInitiated=true;
g.applyVML(c)
}
};
try{
document.execCommand("BackgroundImageCache",false,true)
}catch(r) {
}DD_belatedPNG.createVmlNameSpace();
DD_belatedPNG.createVmlStyleSheet();
或者:
让IE6支持PNG格式的图?/font>
用法Q?br />
先复制下面的代码在记事本中,然后另存为pngbehavior.htcQ名字可以Q意)Q?br />
<public:componentlightWeight="true">
<public:attach event="onpropertychange"onevent="propertyChanged()" />
<public:attach event="onbeforeprint"onevent="beforePrint()" for="window"/>
<public:attach event="onafterprint"onevent="afterPrint()" for="window"/>
<script>
var supported = /MSIE ((5\.5)|[6789])/.test(navigator.userAgent)&&
navigator.platform== "Win32";
var realSrc;
var blankSrc = "blank.gif";
var isPrinting = false;
if (supported) fixImage();
function propertyChanged() {
if (!supported || isPrinting) return;
var pName = event.propertyName;
if (pName != "src") return;
// if not set to blank
if (!new RegExp(blankSrc).test(src))
fixImage();
};
function fixImage() {
// get src
var src = element.src;
// check for real change
if (src == realSrc&& /\.png$/i.test(src)) {
element.src =blankSrc;
return;
}
if ( ! new RegExp(blankSrc).test(src)) {
// backup old src
realSrc = src;
}
// test for png
if (/\.png$/i.test(realSrc)) {
// set blank image
element.src =blankSrc;
// set filter
element.runtimeStyle.filter= "progid:DXImageTransform.Microsoft." +
"AlphaImageLoader(src='"+ src + "',sizingMethod='scale')";
}
else {
// remove filter
element.runtimeStyle.filter= "";
}
}
function beforePrint() {
isPrinting = true;
element.src = realSrc;
element.runtimeStyle.filter = "";
realSrc = null;
}
function afterPrint() {
isPrinting = false;
fixImage();
}
</script>
</public:component>
最后在你的css文g里面加上q么一D代码:
img {
behavior: url("pngbehavior.htc");
}