??xml version="1.0" encoding="utf-8" standalone="yes"?> ps.executeQuery(); 3.提交Q? List results = session.createCriteria(Cat.class)
help => Software Updates => Find and Install... => Search for new features to install,单击"New Remote Site..." 在URL栏输?http://www.technoetic.com/eclipse/update
安装好后可以看到Window => Preferences... => Java => Jode Decompiler选项卡?
配置QWindow => Preferences... => General => Editors => File Associations扑ֈ"*.class"?Associated editors"里面可以看到"Jode class file viewer"选中它再单击Default按钮.
在Eclipse中展开jar文g,双击class文g卛_看到反编译之后的源代?
]]>
className="Oracle.jdbc.driver.OracleDriver";
uid="scott";
pwd="tiger";
url="jdbc:oracle:thin:@localhost:1521:ora92";
Class.forName(classname);
Connection conn=DriverManager.getConnection(url,uid,pwd);
2.JNDI链接数据?br />
String jndi ="jdbc/db"; // e20-040 9L0-609 数据源的名称
//context是一l名U到对象的绑定组?br />
Hashtable env=new Hashtable ();
Context ctx=(Context)new InitialContext.lookup("env");// 获得数据源所在的上下文点的对?br />
DataSource ds=(DataSource)ctx.lookup(jndi);//扑ֈ数据?/font>
Connection conn=ds.getConnection();//
b.执行 sql语句
String sql;
StateMent stat=conn.createStatement();
ResultSet rs=stat.executeQuery(sql);//执行数据的查询语?select);
stat.executeUpdate(sql);//执行数据的更新语?inset into ,delete ,update ,drop)
stat.close();
c.用preparedStatement 来执行sql语句
String sql="inset into table(id,name) values(?,?)";
PreparedStatement ps=conn.prepareStatement(sql);
ps.setInt(1,001);
ps.setString(2,"zhangmanli");
int count=ps.executeUpdate();
d.处理执行l果
查询语句Q返回记录集ResultSet对象
更新语句Q返回数字,表示该更新媄(jing)响的记录?br />
javax.sql.*
javax.naming.*;
数据处理Q?br />
1关闭connection 的自动提?br />
conn.setAutoCommit(false);
2执行一pdsql 语句Q?br />
Statement sm;
sm=conn.createStatement(sql);
sm.executeUpdate();
sm.close();
conn.commit();
4.回滚机制Q?br />
conn.rollback();
e:U程处理Q?br />
DQjndi和dataSource 来获得数据库的链接:(x)
import java.sql.ResultSet ;
import java.sql.*;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;
import java.util.Properties;
import java.io.*;
public class BasicExample{
public static void main(String args[]){
Connection conn=null;
try{
Properties prop =new Properties();
prop.load(new FileInputStream("simple.properties"));
Hashtable env =new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY,prop.getProperty("INITIAL_CONTEXT_FACTORY"));
env.put(Context.PROVIDER_URL,prop.getProperty("PROVIDER_URL"));
InitialContext ctx=new InitialContext(env);
DataSource ds=(DataSource)ctx.lookup("Book");
Conn=ds.getConnection();
Statement stat=conn.createStatement();;
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()){
int id=Integer.parseInt(rs.getString("userId"));
String userName=rs.getString ("username");
}
}catch(SQLException e){
e.printStackTrace();
}finally{
try{
if(conn!=null){
conn.close();
}
}catch(SQLException e){
e.printStackTrace();
}
}
}
};
]]>
设计上可以灵zȝҎ(gu) Criteria 的特Ҏ(gu)方便地进行查询条件的l装。现在对 Hibernate的Criteria 的用法进行ȝQ?/font>
Hibernate 设计?CriteriaSpecification 作ؓ(f) Criteria 的父接口Q下面提供了(jin) Criteria和DetachedCriteria ?
Criteria ?DetachedCriteria 的主要区别在于创建的形式不一P Criteria 是在U的Q所
以它是由 Hibernate Session q行创徏的;?DetachedCriteria 是离U的Q创建时无需
SessionQDetachedCriteria 提供?2 个静(rn)态方?forClass(Class) ?forEntityName(Name)
q行DetachedCriteria 实例的创建?Spring 的框架提供了(jin)getHibernateTemplate
().findByCriteria(detachedCriteria) Ҏ(gu)可以很方便地Ҏ(gu)DetachedCriteria 来返回查询结
果?
Criteria ?DetachedCriteria 均可使用 Criterion ?Projection 讄查询条g。可以设
|?FetchMode( 联合查询抓取的模?) Q设|排序方式。对?Criteria q可以设|?FlushModel
Q冲?Session 的方式)(j)?LockMode Q数据库锁模式)(j)?
下面?Criterion ?Projection q行详细说明?/font>
Criterion ?Criteria 的查询条件。Criteria 提供?add(Criterion criterion) Ҏ(gu)?/font>
d查询条g?br />
Criterion 接口的主要实现包括:(x) Example ?Junction ?SimpleExpression 。?
Junction 的实际用是它的两个子类 conjunction ?disjunction Q分别是使用 AND ?OR ?/font>
作符q行来联l查询条仉合?br />
Criterion 的实例可以通过 Restrictions 工具cL创徏QRestrictions 提供?jin)大量的静(rn)?/font>
Ҏ(gu)Q如 eq Q等于)(j)?ge Q大于等于)(j)?between {来Ҏ(gu)的创?Criterion 查询条g
QSimpleExpression 实例Q。除此之外, Restrictions q提供了(jin)Ҏ(gu)来创?conjunction ?
disjunction 实例Q通过往该实例的 add(Criteria) Ҏ(gu)来增加查询条件Ş成一个查询条仉?/font>
?br />
至于 Example 的创建有所不同Q?Example 本n提供?jin)一个静(rn)态方?create(Object
entity) Q即Ҏ(gu)一个对象(实际使用中一般是映射到数据库的对象)(j)来创建。然后可以设|一?/font>
qo(h)条gQ?
Example exampleUser =Example.create(u)
.ignoreCase() // 忽略大小?
.enableLike(MatchMode.ANYWHERE);
// ?String cd的属性,无论在那里值在那里都匹配。相当于 %value%
Project 主要是让 Criteria 能够q行报表查询Qƈ可以实现分组?Project 主要?
SimpleProjection ?ProjectionList ?Property 三个实现。其?SimpleProjection ?
ProjectionList 的实例化是由内徏?Projections 来完成,如提供的 avg ?count ?max ?
min ?sum 可以让开发者很Ҏ(gu)Ҏ(gu)个字D进行统计查询?
Property 是对某个字段q行查询条g的设|,如通过Porperty.forName(“color”).in
(new String[]{“black”,”red”,”write”}); 则可以创Z?Project 实例。通过
criteria ?add(Project) Ҏ(gu)加入到查询条件中厅R?
使用 Criteria q行查询Q主要要清晰的是 Hibernate 提供?jin)那些类和方法来满开发中?/font>
询条件的创徏和组装,下面介绍几种用法Q?/font>
1. 创徏一个Criteria 实例
org.hibernate.Criteria接口表示特定持久cȝ一个查询。Session?Criteria实例的工厂?br />
Criteria crit = sess.createCriteria(Cat.class);
crit.setMaxResults(50);
List cats = crit.list();
2. 限制l果集内?br />
一个单独的查询条g是org.hibernate.criterion.Criterion 接口的一个实例?/font>
org.hibernate.criterion.Restrictionsc?定义?jin)获得某些内|Criterioncd的工厂方法?br />
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.between("weight", minWeight, maxWeight) )
.list();
U束可以按逻辑分组?
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.add( Restrictions.or(
Restrictions.eq( "age", new Integer(0) ),
Restrictions.isNull("age")
) )
.list();
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.in( "name", new String[] { "Fritz", "Izi", "Pk" } ) )
.add( Restrictions.disjunction()
.add( Restrictions.isNull("age") )
.add( Restrictions.eq("age", new Integer(0) ) )
.add( Restrictions.eq("age", new Integer(1) ) )
.add( Restrictions.eq("age", new Integer(2) ) )
) )
.list();
Hibernate提供?jin)相当多的内|criterioncd(Restrictions 子类), 但是其有用的是可以允许
你直接用SQL?br />
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.sql("lower({alias}.name) like lower(?)", "Fritz%",
Hibernate.STRING) )
.list();
{alias}占位W应当被替换查询实体的列别名?
Property实例是获得一个条件的另外一U途径。你可以通过调用Property.forName() 创徏一?/font>
Property?
Property age = Property.forName("age");
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.disjunction()
.add( age.isNull() )
.add( age.eq( new Integer(0) ) )
.add( age.eq( new Integer(1) ) )
.add( age.eq( new Integer(2) ) )
) )
.add( Property.forName("name").in( new String[] { "Fritz", "Izi", "Pk" } ) )
.list();
3. l果集排?br />
你可以用org.hibernate.criterion.Order来ؓ(f)查询l果排序?
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.addOrder( Order.asc("name") )
.addOrder( Order.desc("age") )
.setMaxResults(50)
.list();
List cats = sess.createCriteria(Cat.class)
.add( Property.forName("name").like("F%") )
.addOrder( Property.forName("name").asc() )
.addOrder( Property.forName("age").desc() )
.setMaxResults(50)
.list();
4. 兌
你可以用createCriteria()非常Ҏ(gu)的在互相兌的实体间建立 U束?br />
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "F%")
.createCriteria("kittens")
.add( Restrictions.like("name", "F%")
.list();
注意W二?createCriteria()q回一个新?Criteria实例Q该实例引用kittens 集合中的元素?
接下来,替换形态在某些情况下也是很有用的?br />
List cats = sess.createCriteria(Cat.class)
.createAlias("kittens", "kt")
.createAlias("mate", "mt")
.add( Restrictions.eqProperty("kt.name", "mt.name") )
.list();
(createAlias()q不创徏一个新?Criteria实例?
Cat实例所保存的之前两ơ查询所q回的kittens集合?没有被条仉qo(h)的。如果你希望只获?/font>
W合条g的kittensQ?你必M用returnMaps()?
List cats = sess.createCriteria(Cat.class)
.createCriteria("kittens", "kt")
.add( Restrictions.eq("name", "F%") )
.returnMaps()
.list();
Iterator iter = cats.iterator();
while ( iter.hasNext() ) {
Map map = (Map) iter.next();
Cat cat = (Cat) map.get(Criteria.ROOT_ALIAS);
Cat kitten = (Cat) map.get("kt");
}
5. 动态关联抓?br />
你可以用setFetchMode()在运行时定义动态关联抓取的语义?
List cats = sess.createCriteria(Cat.class)
.add( Restrictions.like("name", "Fritz%") )
.setFetchMode("mate", FetchMode.EAGER)
.setFetchMode("kittens", FetchMode.EAGER)
.list();
q个查询可以通过外连接抓取mate和kittens?br />
6. 查询CZ
org.hibernate.criterion.Examplecd怽通过一个给定实?构徏一个条件查询?br />
Cat cat = new Cat();
cat.setSex('F');
cat.setColor(Color.BLACK);
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.list();
版本属性、标识符和关联被忽略。默认情况下gؓ(f)null的属性将被排除?
可以自行调整Example使之更实用?
Example example = Example.create(cat)
.excludeZeroes() //exclude zero valued properties
.excludeProperty("color") //exclude the property named "color"
.ignoreCase() //perform case insensitive string comparisons
.enableLike(); //use like for string comparisons
List results = session.createCriteria(Cat.class)
.add(example)
.list();
甚至可以使用examples在关联对象上攄条g?br />
List results = session.createCriteria(Cat.class)
.add( Example.create(cat) )
.createCriteria("mate")
.add( Example.create( cat.getMate() ) )
.list();
7. 投媄(jing)(Projections)、聚合(aggregationQ和分组QgroupingQ?br />
org.hibernate.criterion.Projections?Projection 的实例工厂。我们通过调用
setProjection()应用投媄(jing)C个查询?
List results = session.createCriteria(Cat.class)
.setProjection( Projections.rowCount() )
.add( Restrictions.eq("color", Color.BLACK) )
.list();
List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount() )
.add( Projections.avg("weight") )
.add( Projections.max("weight") )
.add( Projections.groupProperty("color") )
)
.list();
在一个条件查询中没有必要昑ּ的?"group by" 。某些投q型就是被定义?分组投媄(jing)Q他
们也出现在SQL的group by子句中?
可以选择把一个别名指z一个投影,q样可以使投影DU束或排序所引用。下面是两种不同?/font>
实现方式Q?br />
List results = session.createCriteria(Cat.class)
.setProjection( Projections.alias( Projections.groupProperty("color"), "colr" ) )
.addOrder( Order.asc("colr") )
.list();
.setProjection( Projections.groupProperty("color").as("colr") )
.addOrder( Order.asc("colr") )
.list();
alias()和as()Ҏ(gu)便的一个投影实例包装到另外一?别名的Projection实例中。简而言之,
当你d一个投影到一个投影列表中?你可以ؓ(f)它指定一个别名:(x)
List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount(), "catCountByColor" )
.add( Projections.avg("weight"), "avgWeight" )
.add( Projections.max("weight"), "maxWeight" )
.add( Projections.groupProperty("color"), "color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder( Order.desc("avgWeight") )
.list();
List results = session.createCriteria(Domestic.class, "cat")
.createAlias("kittens", "kit")
.setProjection( Projections.projectionList()
.add( Projections.property("cat.name"), "catName" )
.add( Projections.property("kit.name"), "kitName" )
)
.addOrder( Order.asc("catName") )
.addOrder( Order.asc("kitName") )
.list();
也可以用Property.forName()来表C投影:(x)
List results = session.createCriteria(Cat.class)
.setProjection( Property.forName("name") )
.add( Property.forName("color").eq(Color.BLACK) )
.list();
List results = session.createCriteria(Cat.class)
.setProjection( Projections.projectionList()
.add( Projections.rowCount().as("catCountByColor") )
.add( Property.forName("weight").avg().as("avgWeight") )
.add( Property.forName("weight").max().as("maxWeight") )
.add( Property.forName("color").group().as("color" )
)
.addOrder( Order.desc("catCountByColor") )
.addOrder( Order.desc("avgWeight") )
.list();
8. ȝ(detached)查询和子查询
DetachedCriteriacM你在一个session范围之外创徏一个查询,q且可以使用L?Session?/font>
执行它?br />
DetachedCriteria query = DetachedCriteria.forClass(Cat.class)
.add( Property.forName("sex").eq('F') );
//创徏一个Session
Session session = .;
Transaction txn = session.beginTransaction();
List results = query.getExecutableCriteria(session).setMaxResults(100).list();
txn.commit();
session.close();
DetachedCriteria也可以用以表C子查询。条件实例包含子查询可以通过 Subqueries或?/font>
Property获得?br />
DetachedCriteria avgWeight = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight").avg() );
session.createCriteria(Cat.class)
.add( Property.forName("weight).gt(avgWeight) )
.list();
DetachedCriteria weights = DetachedCriteria.forClass(Cat.class)
.setProjection( Property.forName("weight") );
session.createCriteria(Cat.class)
.add( Subqueries.geAll("weight", weights) )
.list();
怺兌的子查询也是有可能的Q?br />
DetachedCriteria avgWeightForSex = DetachedCriteria.forClass(Cat.class, "cat2")
.setProjection( Property.forName("weight").avg() )
.add( Property.forName("cat2.sex").eqProperty("cat.sex") );
session.createCriteria(Cat.class, "cat")
.add( Property.forName("weight).gt(avgWeightForSex) )
.list();
]]>
再看一下TextField中的rewindFormComponentlgҎ(gu)
可以看到在rewindFormComponent中,主要是从h中取得用戯入的|然后q行处理Q最后赋值给容器或者页面,上面的例子中?x)调用页面类的getPicture().setPrice(“用户输入的?#8221;)来进行赋倹{这h个表单的提交可以理解ؓ(f)所有的表单lgd用户输入的值ƈ赋值给面的过E?
整个表单提交的详l处理过E如下:(x)
* initialize():面初始?
我们可以看到pageBeginRender和pageEndRender被调用了(jin)两次Q两ơ中的区别ؓ(f)RequestCycle().isRewindingQ因为我们在使用时经常利用pageBeginRender的初始化|所以这里有很多使用上的误区Q如果在pageBeginRender中从数据库读取数据来初始化跟表单提交无关的变量的话,可能被调用两次Q这个是应该避免的。什么叫跟表单提交无关的变量呢,是表单lg中跟赋值无关的Q例如上Ҏ(gu)到的value="ognl:picture.price",q时picture是与表单提交相关的变量Q如果你没有初始化,那么在赋值时调用getPicture().setPrice()׃(x)出现I指针异常,因ؓ(f)q是的picture为null。我们D个例子来看一下表单无关的变量Q假如这个picture面?x)显CZ个创建picture的表单和所有picture的列表,那这个picture的列表就是与表单提交无关的变量,如果你在pageBeginRender中初始化的话Q就需要区分是否rewindQ否则表单提交时׃(x)被初始化两次Q让我们看一下代码:(x)
* pageBeginRender() ("rewind"):getRequestCycle().isRewinding()为true
* rewind of the form / setting of properties:所有表单组件调用rewindFormComponent来取D?
* Deferred listeners (for Submit components):调用Submitlg的listener
* Form's listenerQ调用Formlg的listener
* pageEndRender() ("rewind"): getRequestCycle().isRewinding()为true
* pageBeginRender() (normal): getRequestCycle().isRewinding()为false
* pageEndRender() (normal): getRequestCycle().isRewinding()为false
原文地址Qhttp://www.javaeye.com/article/41724
]]>
数据讉K对象(Data Acess Object) 模式
一.环境
Ҏ(gu)数据源不同,数据讉K也不同。根据存储的cd(关系数据库、面向对象数据库、文件等{?和供应商实现不同Q持久性存?比如数据?的访问差别也很大
?问题
许多真是的J2EE应用E序需要在一定程度上使用持久性数据。对于许多应用程序,持久性存储是使用不同的机制实现的,q且用来讉Kq些不同的持久性存储机制的API也有很大的不同?br />
比如Q应用程序用实体bean(q里应该是指BMP的beanQCMP的bean已大大降低了(jin)与RDBMS的耦合)的分布式lg来表C持久性数据,或者用JDBC API来访问驻留在某关pL据库理pȝ(RDBMS)中的数据Q这些组件中包含q接性性和数据讉K代码?x)引入这些组件与数据源实C间的紧密耦合。组件中q类代码依赖性应用E序从某U数据源q移到其他种cȝ数据源将变得非常ȝ(ch)和困难。当数据源变化时Q组件也需要改变,以便于能够处理新cd的数据源
(举个例子来说Q我们UPTELpȝ是用JDBC API?nbsp;ORACLE数据库进行连接和数据讉K的,q些JDBC API与SQL语句散布在系l中Q当我们需要将UPTELq移到其他RDBMSӞ比如曄q移到INFORMIXQ就面(f)重写数据库连接和讉K数据的模块?
?作用?br /> 1.诸如bean理的实体bean、会(x)话bean、servlet{组件往往需要从持久性存储数据源中检索数据,以及(qing)q行数据存储{操作?br /> 2.Ҏ(gu)产品供应商的不同Q持久性存储API差别也很大,q些API和其能力同样Ҏ(gu)存储的类型不同也有差别,q样存在以下~点Q即讉Kq些独立pȝ的API很不l一?br /> 3.lg需要透明于实际的持久性存储或者数据源实现Q以便于提供C同供应商产品、不同存储类型和不同数据源类型的更容易的UL性?/p>
?解决Ҏ(gu)
使用数据讉K对象(DAO)模式来抽象和装所有对数据源的讉K。DAO理着与数据源的连接以便检索和存储数据?br />
DAO实现?jin)用来操作数据源的访问机制。数据源可以时RDBMS,LDAP,File{。依赖于DAO的业务组件ؓ(f)其客L(fng)使用DAO提供更简单的接口。DAO完全向客L(fng)隐藏?jin)数据源实现l节。由于当低层数据源实现变化时QDAO向客L(fng)提供的接口不?x)变化,所有该模式允许DAO调整C同的存储模式Q而不?x)?jing)响其客户端或者业务组件。重要的?DAO充当lg和数据源之间的适配器?/p>
(按照q个理论Q如果我们UPTELpȝ使用?jin)DAO模式,可以无~的从ORACLEq移CQ何一个RDBMS?jin)。梦xL很完的Q且看看DAO模式如何实现)
public class StringConverter implements Converter {
public Object getAsObject(FacesContext context, UIComponent component,
String newValues) throws ConverterException {
String newstr = "";
if (newValues == null) {
newValues = "";
}
byte[] byte1 = null;
try {
byte1 = newValues.getBytes("ISO-8859-1");
newstr = new String(byte1, "GB2312");
UIInput input=(UIInput)component;//
input.setSubmittedValue(newstr);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return newstr;
}
public String getAsString(FacesContext context, UIComponent component,
Object Values) throws ConverterException {
return (String) Values;
}
}
2、注册{换器
faces-config.xml片段
<converter>
<converter-id>util.stringconverter</converter-id>
<converter-class>util.StringConverter</converter-class>
</converter>
3、在面使用转换?br />
<h:inputText id="account" value="#{util.account}" required="true" styleClass="input" >
<f:converter converterId="utilstringconverter"/>
* csr 文g的生成:(x)
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks
* 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?br />
2Q部|keystore 文g
?<http://hostname:7001/console> 中配|刚才生成的 testKey.jks 文g?/p>
1.1.2 Tomcat 下面SSL配置
1Q生?keystoreFileQ?br />
* keystoreFile 文g的生成:(x)
%Java_Home%\bin\keytool -genkey -alias localhost-weblogic -keyalg RSA -validity 365 -keystore ./testKey.jks
Example for inner testQ?br />
[root@localhost ~]#
/home/tomcat/jdk1.5.0_12/bin/keytool -genkey -alias localhost-tomcat -keyalg RSA -validity 365 -keystore /home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks
Enter keystore password: someday2007
What is your first and last name?
[Unknown]: lifenote
What is the name of your organizational unit?
[Unknown]: Java
What is the name of your organization?
[Unknown]: Sunxc
What is the name of your City or Locality?
[Unknown]: Beijing
What is the name of your State or Province?
[Unknown]: Beijing
What is the two-letter country code for this unit?
[Unknown]: ZH
Is CN=lifenote, OU=Java, O=Sunxc, L=Beijing, ST=Beijing, C=ZH correct?
[no]: y
Enter key password for <localhost-tomcat>
(RETURN if same as keystore password): someday2007
[root@localhost ~]#
* csr 文g的生成:(x)
%Java_Home%\bin\keytool -certreq -alias localhost-weblogic -sigalg MD5withRSA -file ./testServer.csr -keystore ./testKey.jks
* 注意Q?http 的默认端口是80Qhttps 的默认端口是433Qftp 的默认端口是21?/p>
2Q部|keystore 文g
打开 server.xml 文gQ修改内容如下:(x)
* 只需L server.xml 中对SSL定义的注释,在加?keystoreFile、keystorePass q两个属性即可?br />
<Service
name="Catalina">
<Connector
port="8080"
...
</Connector>
<!-- Define a SSL HTTP/1.1 Connector on port 8443 --------------------- 要加入的内容在这?-->
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="e:/temp_E/ssl/testKey.jks"
keystorePass="aaaaaa"/>
<Connector
port="8009"
...
</Connector>
...
Example for inner testQ?br />
<Connector port="443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="/home/tomcat/apache-tomcat-5.5.23/conf/VCMarketKey.jks"
keystorePass="password"/>
注意需默认要?443 而不?8443Q要使用8443要在apache中配|,保证从apachehtomcat 采用 <https://ip:8443/>... 的格式?/p>
1.1.3 使用http讉KWebService s的客L(fng)配置
Servlet服务器配|好SSL之后Q客L(fng)可以使用https讉K?jin)?br />
对于用户使用览器访问https的方式,览器会(x)弹出安装证书的对话框Q确认之后可以正怋用https讉K?br />
对于WebService 通过https方式讉KQ按照一下步骤:(x)
1Q?nbsp;WebService客户端要先取得keyStore文gQ?br />
2Q?nbsp;虚拟机系l?System.setProperties(…) 讄keyStore信息Q?br />
3Q?nbsp;使用 url=<https://ip:port/...> 讉KWebService服务
3Q对resin容器Q同样可以在启动时对jvm讄内存限度。在bin文g夹下创徏一个startup.bat文gQ内容如下:(x)
@echo off
call "httpd.exe" "-Xms128M" "-Xmx256M"
:end
其中"-Xms128M"为最内存,"-Xmx256M"为最大内存?/p>
2. 优化E序Q释攑֞圾?/p>
1、因q行验证Q所以在每个模块对应的资源文仉都要?#8220;errors.required={0} is required.”{资源,有没有只用在一个文仉定义的方法?
2、用tiles的时候,要在每个模块对应的tiles-defs.xml里定义几乎相同的definitionQ有没有只用在一个文仉定义的方法?Q我试过在缺省模块里定义一个definitionQ然后在模块里extends它,但不行,extendsg只找当前模块Q?/p>
3、用ExceptionHandler的时候,Z么在exception标签里指定了(jin)bundle属性还是只在当前模块里找资源?我希望把一些重复用的异常处理声明在一个文仉Q例如NotLoginException、NoSuchObjectException{等Qƈ且它们对应的key也指向同一个资源文仉的资源(利用bundle属性)(j)Q怎么实现Q?/p>
l过一D|间的摸烦(ch)Q第一个和W三个问题基本上解决?jin),其实它们可以看作同一c问题,是资源的问题。在struts-config-xxx.xml里定义资源文件时Q可以指定一个factory属性,不指定时使用~省?#8220;org.apache.struts.util.PropertyMessageResourcesFactory”cR我的解x法是自定义一个CustomMessageResourcesFactoryc,多个资源文件以逗号分隔的Ş式作为参敎ͼ即message-resources的parameter属性)(j)传给它,在需要资源的地方?x)遍历它们进行查找。同时还要自定义一个CustomMessageResourcesc,它的getMessage()Ҏ(gu)里是查找资源的关键代码,而factory只是解析逗号分隔的参数构造ƈq回CustomMessageResources实例?/p>
CustomMessageResourcesFactory的代码比较简单,如下所C:(x)
CustomMessageResourcesq微复杂一些,不过很幸q,我在|上扑ֈ?jin)一个完全符合自p求的c,下蝲地址?A&NBSP;HREF="HTTP: javaboutique.internet.com tutorials Dynaform source.zip?>
上面参考了(jin)q篇文章
Session sessionToExpose = (exposeNativeSession ? session : createSessionProxy(session)); |
public Criteria getExecutableCriteria(Session session) { impl.setSession( (SessionImpl) session ); // 要求SessionImplQSpring传递的是Proxy return impl; } |
public List findByCriteria(final DetachedCriteria detachedCriteria) { return (List) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException { Criteria criteria = detachedCriteria.getExecutableCriteria(session); return criteria.list(); } }, true); } |
to_char(sysdate, 'dd') 查看今天是几号to_char(sysdate, 'ww') 查看q是q个月第几个星期
to_char(sysdate, 'mm') 查看q是一q中W几个月
to_char(sysdate, 'yyyy') 查看q䆾last_day(to_date('2007-02-01','YYYY-MM-DD'))查看一个月的最后一天,add_months(sysdate,10)查看若干个月后的今天Qnext_day(sysdate,'星期?)l个日期查看后面的最q的星期几的日期Q不q这个星期五要是换成英文居然有问题,W?个参数可以是数字1-7Q分别表C周日到周六?/p>
下面贴个全的Q需要的时候顺便查一下?/p>
一、PL/SQL单行函数和组函数详解
函数是一U有零个或多个参数ƈ且有一个返回值的E序。在SQL中Oracle内徏?jin)一pd函数Q这些函数都可被UCؓ(f)SQL或PL/SQL语句Q函C要分Z大类Q单行函数和l函数?/p>
本文讨论如何利用单行函C?qing)用规则?br /> 1、SQL中的单行函数
SQL和PL/SQL中自带很多类型的函数Q有字符、数字、日期、{换、和混合型等多种函数用于处理单行数据Q因此这些都可被l称为单行函数。这些函数均可用于SELECT,WHERE、ORDER BY{子句中Q例如下面的例子中就包含?jin)TO_CHAR,UPPER,SOUNDEX{单行函数?/p>
SELECT ename,TO_CHAR(hiredate,'day,DD-Mon-YYYY')FROM empWhere UPPER(ename) Like 'AL%'ORDER BY SOUNDEX(ename)
单行函数也可以在其他语句中用,如update的SET子句QINSERT的VALUES子句QDELET的WHERE子句,认证考试特别注意在SELECT语句中用这些函敎ͼ所以我们的注意力也集中在SELECT语句中?/p>
2、NULL和单行函?/p>
在如何理解NULL上开始是很困隄Q就是一个很有经验的Z然对此感到困惑。NULLDCZ个未知数据或者一个空|术操作W的M一个操作数为NULL|l果均ؓ(f)提个NULL?q个规则也适合很多函数Q只有CONCAT,DECODE,DUMP,NVL,REPLACE在调用了(jin)NULL参数时能够返回非NULL倹{在q些中NVL函数时最重要的,因ؓ(f)他能直接处理NULL|NVL有两个参?NVL(x1,x2),x1和x2都式表达式,当x1为null时返回X2,否则q回x1?/p>
下面我们看看emp数据表它包含?jin)薪水、奖金两,需要计ȝ补偿?/p>
column name emp_id salary bonuskey type pk nulls/unique nn,u nnfk table datatype number number numberlength 11.2 11.2
不是单的薪水和奖金加v来就可以?jin),如果某一行是null值那么结果就是nullQ比如下面的例子Q?/p>
update empset salary=(salary+bonus)*1.1
q个语句中,雇员的工资和奖金都将更新Z个新的|但是如果没有奖金Q即 salary + null,那么׃(x)得出错误的结论,q个时候就要用nvl函数来排除null值的影响?/p>
所以正的语句是:(x)
update empset salary=(salary+nvl(bonus,0)*1.1
3、单行字W串函数
单行字符串函数用于操作字W串数据Q他们大多数有一个或多个参数Q其中绝大多数返回字W串?/p>
ASCII()
c1是一字符Ԍq回c1W一个字母的ASCII码,他的逆函数是CHR()
SELECT ASCII('A') BIG_A,ASCII('z') BIG_z FROM empBIG_A BIG_z65 122
CHR()[NCHAR_CS]
i是一个数字,函数q回十进制表C的字符?/p>
select CHR(65),CHR(122),CHR(223) FROM empCHR65 CHR122 CHR223A z B
CONCAT(,)
c1,c2均ؓ(f)字符Ԍ函数c2q接到c1的后面,如果c1为null,返回c2.如果c2为null,则返回c1Q如果c1、c2都ؓ(f)nullQ则q回null。他和操作符||q回的结果相?/p>
select concat('slobo ','Svoboda') username from dualusernameslobo Syoboda
INITCAP()
c1Z字符丌Ӏ函数将每个单词的第一个字母大写其它字母小写返回。单词由I格Q控制字W,标点W号限制?/p>
select INITCAP('veni,vedi,vici') Ceasar from dualCeasarVeni,Vedi,Vici
INSTR(,[,[,]])
c1,c2均ؓ(f)字符Ԍi,j为整数。函数返回c2在c1中第jơ出现的位置Q搜索从c1的第i个字W开始。当没有发现需要的字符时返?,如果i敎ͼ那么搜烦(ch)从叛_左进行,但是位置的计还是从左到叻Ii和j的缺省gؓ(f)1?/p>
select INSTR('Mississippi','i',3,3) from dualINSTR('MISSISSIPPI','I',3,3)11select INSTR('Mississippi','i',-2,3) from dualINSTR('MISSISSIPPI','I',3,3)2
INSTRB(,[,i[,j])
与INSTR()函数一P只是他返回的是字节,对于单字节INSTRB(){于INSTR()?/p>
LENGTH()
c1为字W串Q返回c1的长度,如果c1为nullQ那么将q回null倹{?/p>
select LENGTH('Ipso Facto') ergo from dualergo10
LENGTHb()
与LENGTH()一Pq回字节?/p>
lower()
q回c的小写字W,l常出现在where子串中?/p>
select LOWER(colorname) from itemdetail WHERE LOWER(colorname) LIKE '%white%'COLORNAMEWinterwhite
LPAD(,[,])
c1,c2均ؓ(f)字符Ԍi为整数。在c1的左侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ(f)单空|参见RPAD?/p>
select LPAD(answer,7,'') padded,answer unpadded from question;PADDED UNPADDED Yes YesNO NOMaybe maybe
LTRIM(,)
把c1中最左边的字W去掉,使其W一个字W不在c2中,如果没有c2Q那么c1׃?x)改变?/p>
select LTRIM('Mississippi','Mis') from dualLTRppi
RPAD(,[,])
在c1的右侧用c2字符串补长度i,可多ơ重复,如果i于c1的长度,那么只返回i那么长的c1字符Q其他的被截去。c2的缺省gؓ(f)单空?其他与LPAD怼?/p>
RTRIM(,)
把c1中最双的字W去掉,使其W后一个字W不在c2中,如果没有c2Q那么c1׃?x)改变?/p>
REPLACE(,[,])
c1,c2,c3都是字符Ԍ函数用c3代替出现在c1中的c2后返回?/p>
select REPLACE('uptown','up','down') from dualREPLACEdowntown
STBSTR(,[,])
c1Z字符Ԍi,j为整敎ͼ从c1的第i位开始返回长度ؓ(f)j的子字符Ԍ如果j为空Q则直到串的N?/p>
select SUBSTR('Message',1,4) from dualSUBSMess
SUBSTRB(,[,])
与SUBSTR大致相同Q只是I,J是以字节计算?/p>
SOUNDEX()
q回与c1发音怼的词?/p>
select SOUNDEX('dawes') Dawes SOUNDEX('daws') Daws, SOUNDEX('dawson') from dualDawes Daws DawsonD200 D200 D250
TRANSLATE(,,)
c1中与c2相同的字W以c3代替
select TRANSLATE('fumble','uf','ar') test from dualTEXTramble
TRIM([[]] from c3)
c3串中的第一个,最后一个,或者都删除?/p>
select TRIM(' space padded ') trim from dual TRIMspace padded
UPPER()
q回c1的大写,常出现where子串?/p>
select name from dual where UPPER(name) LIKE 'KI%'NAMEKING
4、单行数字函?/p>
单行数字函数操作数字数据Q执行数学和术q算。所有函数都有数字参数ƈq回数字倹{所有三角函数的操作数和值都是弧度而不是角度,oracle没有提供内徏的弧度和角度的{换函数?/p>
ABS()
q回n的绝对?/p>
ACOS()
反余弦函敎ͼq回-1?之间的数。n表示弧度
select ACOS(-1) pi,ACOS(1) ZERO FROM dualPI ZERO3.14159265 0
ASIN()
反正弦函敎ͼq回-1?Qn表示弧度
ATAN()
反正切函敎ͼq回n的反正切|n表示弧度?/p>
CEIL()
q回大于或等于n的最整数?/p>
COS()
q回n的余玄|n为弧?/p>
COSH()
q回n的双曲余玄|n 为数字?/p>
select COSH(<1.4>) FROM dualCOSH(1.4)2.15089847
EXP()
q回e的nơ幂Qe=2.71828183.
FLOOR()
q回于{于N的最大整数?/p>
LN()
q回N的自然对敎ͼN必须大于0
LOG(,)
q回以n1为底n2的对?/p>
MOD()
q回n1除以n2的余?br /> POWER(,)
q回n1的n2ơ方
ROUND(,)
q回舍入数点右边n2位的n1的|n2的缺省gؓ(f)0Q这回将数Ҏ(gu)接近的整敎ͼ如果n2数就舍入到小数点左边相应的位上,n2必须是整数?/p>
select ROUND(12345,-2),ROUND(12345.54321,2) FROM dualROUND(12345,-2) ROUND(12345.54321,2)12300 12345.54
SIGN()
如果n敎ͼq回-1,如果n为正敎ͼq回1Q如果n=0q回0
SIN()
q回n的正玄?n为弧度?/p>
SINH()
q回n的双曲正玄?n为弧度?/p>
SQRT()
q回n的^Ҏ(gu),n为弧?/p>
TAN()
q回n的正切?n为弧?/p>
TANH()
q回n的双曲正切?n为弧?/p>
TRUNC(,)
q回截尾到n2位小数的n1的|n2~省讄?Q当n2为缺省设|时?x)将n1截尾为整敎ͼ如果n2|截֜数点左边相应的位上?/p>
5、单行日期函?/p>
单行日期函数操作DATA数据cdQ绝大多数都有DATA数据cd的参敎ͼl大多数q回的也是DATA数据cd的倹{?/p>
ADD_MONTHS(,)
q回日期d加上i个月后的l果。i可以使Q意整数。如果i是一个小敎ͼ那么数据库将隐式的他转换成整敎ͼ会(x)截去数点后面的部分?/p>
LAST_DAY()
函数q回包含日期d的月份的最后一?/p>
MONTHS_BETWEEN(,)
q回d1和d2之间月的数目,如果d1和d2的日的日期都相同Q或者都使该月的最后一天,那么返回一个整敎ͼ否则?x)返回的l果包含一个分数?/p>
NEW_TIME(,,)
d1是一个日期数据类型,当时区tz1中的日期和时间是dӞq回时区tz2中的日期和时间。tz1和tz2时字W串?/p>
NEXT_DAY(,)
q回日期d后由dowl出的条件的W一天,dow使用当前?x)话中给出的语言指定?jin)一周中的某一天,q回的时间分量与d的时间分量相同?/p>
select NEXT_DAY('01-Jan-2000','Monday') "1st Monday",NEXT_DAY('01-Nov-2004','Tuesday')+7 "2nd Tuesday") from dual;1st Monday 2nd Tuesday03-Jan-2000 09-Nov-2004
ROUND([,])
日期d按照fmt指定的格式舍入,fmt为字W串?/p>
SYADATE
函数没有参数Q返回当前日期和旉?/p>
TRUNC([,])
q回由fmt指定的单位的日期d
6、单行{换函?/p>
单行转换函数用于操作多数据类型,在数据类型之间进行{换?/p>
CHARTORWID()
c 使一个字W串Q函数将c转换为RWID数据cd?/p>
SELECT test_id from test_case where rowid=CHARTORWID('AAAA0SAACAAAALiAAA')
CONVERT(,[,])
c֭W串Qdset、sset是两个字W集Q函数将字符串c由sset字符集{换ؓ(f)dset字符集,sset的缺省设|ؓ(f)数据库的字符集?/p>
HEXTORAW()
x?6q制的字W串Q函数将16q制的x转换为RAW数据cd?/p>
RAWTOHEX()
x是RAW数据cd字符Ԍ函数RAW数据c{换ؓ(f)16q制的数据类型?/p>
ROWIDTOCHAR()
函数ROWID数据cd转换为CHAR数据cd?/p>
TO_CHAR([[,)
x是一个data或number数据cdQ函数将x转换成fmt指定格式的char数据cdQ如果x为日期nlsparm=NLS_DATE_LANGUAGE 控制q回的月份和日䆾所使用的语a。如果x为数字nlsparm=NLS_NUMERIC_CHARACTERS 用来指定数位和千分位的分隔W,以及(qing)货币W号?/p>
NLS_NUMERIC_CHARACTERS ="dg", NLS_CURRENCY="string"
TO_DATE([,[,)
c表示字符Ԍfmt表示一U特D格式的字符丌Ӏ返回按照fmt格式昄的c,nlsparm表示使用的语a。函数将字符串c转换成date数据cd?/p>
TO_MULTI_BYTE()
c表示一个字W串Q函数将c的担子截字符转换成多字节字符?/p>
TO_NUMBER([,[,)
c表示字符Ԍfmt表示一个特D格式的字符Ԍ函数q回值按照fmt指定的格式显C。nlsparm表示语言Q函数将q回c代表的数字?/p>
TO_SINGLE_BYTE()
字W串c中得多字节字W{化成{h(hun)的单字节字符。该函数仅当数据库字W集同时包含单字节和多字节字W时才?/p>
7、其它单行函?/p>
BFILENAME(,)
dir是一个directorycd的对象,fileZ文g名。函数返回一个空的BFILE位置值指C符Q函数用于初始化BFILE变量或者是BFILE列?/p>
DECODE(,,[,,,[])
x是一个表辑ּQm1是一个匹配表辑ּQx与m1比较Q如果m1{于xQ那么返回r1,否则,x与m2比较Q依ơ类推m3,m4,m5....直到有返回结果?/p>
DUMP(,[,[,[,]]])
x是一个表辑ּ或字W,fmt表示8q制?0q制?6q制、或则单字符。函数返回包含了(jin)有关x的内部表CZ息的VARCHAR2cd的倹{如果指定了(jin)n1,n2那么从n1开始的长度为n2的字节将被返回?/p>
EMPTY_BLOB()
该函数没有参敎ͼ函数q回 一个空的BLOB位置指示W。函数用于初始化一个BLOB变量或BLOB列?/p>
EMPTY_CLOB()
该函数没有参敎ͼ函数q回 一个空的CLOB位置指示W。函数用于初始化一个CLOB变量或CLOB列?/p>
GREATEST()
exp_list是一列表辑ּQ返回其中最大的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,那么q回的结果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?br /> LEAST()
exp_list是一列表辑ּQ返回其中最的表达式,每个表达式都被隐含的转换W一个表辑ּ的数据类型,如果W一个表辑ּ是字W串数据cd中的M一个,返回的l果是varchar2数据cdQ同时用的比较是非填充I格cd的比较?/p>
UID
该函数没有参敎ͼq回唯一标示当前数据库用L(fng)整数?/p>
USER
q回当前用户的用户名
USERENV()
Zoptq回包含当前?x)话信息。opt的可选gؓ(f)Q?/p>
ISDBA ?x)话中SYSDBA脚色响应Q返回TRUE
SESSIONID q回审计?x)话标示W?/p>
ENTRYID q回可用的审计项标示W?/p>
INSTANCE在会(x)话连接后Q返回实例标C符。该值只用于q行Parallel 服务器ƈ且有 多个实例的情况下使用?/p>
LANGUAGEq回语言、地域、数据库讄的字W集?/p>
LANGq回语言名称的ISO~写?/p>
TERMINAL为当前会(x)话用的l端或计机q回操作pȝ的标C符?/p>
VSIZE() x是一个表辑ּ。返回x内部表示的字节数?/p>
二、SQL中的l函?/p>
l函C叫集合函敎ͼq回Z多个行的单一l果Q行的准数量无法确定,除非查询被执行ƈ且所有的l果都被包含在内。与单行函数不同的是Q在解析时所有的行都是已知的。由于这U差别ɾl函C单行函数有在要求和行Z有微的差异.
1、组(多行)函数
与单行函数相比,oracle提供?jin)丰富的Zl的Q多行的函数。这些函数可以在select或select的having子句中用,当用于select子串时常帔R和GROUP BY一起用?/p>
AVG([{DISYINCT|ALL}])
q回数值的q_倹{缺省设|ؓ(f)ALL
SELECT AVG(sal),AVG(ALL sal),AVG(DISTINCT sal) FROM scott.empAVG(SAL) AVG(ALL SAL) AVG(DISTINCT SAL)1877.94118 1877.94118 1916.071413
COUNT({*|DISTINCT|ALL} )
q回查询中行的数目,~省讄是ALL,*表示q回所有的行?/p>
MAX([{DISTINCT|ALL}])
q回选择列表目的最大|如果x是字W串数据cdQ他q回一个VARCHAR2数据cdQ如果X是一个DATA数据cdQ返回一个日期,如果X是numeric数据cdQ返回一个数字。注意distinct和all不v作用Q应为最大gq两U设|是相同的?/p>
MIN([{DISTINCT|ALL}])
q回选择列表目的最倹{?/p>
STDDEV([{DISTINCT|ALL}])
q回选者的列表目的标准差Q所谓标准差是方差的qx栏V?/p>
SUM([{DISTINCT|ALL}])
q回选择列表目的数值的d?/p>
VARIANCE([{DISTINCT|ALL}])
q回选择列表目的统计方差?/p>
2、用GROUP BYl数据分l?/p>
正如题目暗示的那L(fng)函数是操作那些已经分好l的数据Q我们告诉数据库用GROUP BY怎样l数据分l或者分c,当我们在SELECT语句的SELECT子句中用组函数Ӟ我们必须把ؓ(f)分组或非常数列放|在GROUP BY子句中,如果没有用group byq行专门处理Q那么缺省的分类是将整个l果设ؓ(f)一cR?/p>
select stat,counter(*) zip_count from zip_codes GROUP BY state;ST ZIP_COUNT-- ---------AK 360AL 1212AR 1309AZ 768CA 3982
在这个例子中Q我们用state字段分类;如果我们要将l果按照zip_codes排序,可以用ORDER BY语句QORDER BY子句可以使用列或l函数?/p>
select stat,counter(*) zip_count from zip_codes GROUP BY state ORDER BY COUNT(*) DESC;ST COUNT(*)-- --------NY 4312PA 4297TX 4123CA 3982
3、用HAVING子句限制分组数据
现在你已l知道了(jin)在查询的SELECT语句和ORDER BY子句中用主函数Q组函数只能用于两个子串中,l函C能用于WHERE子串中,例如下面的查询是错误的:(x)
错误SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' AND SUM(sale_amount)>10000 GROUP BY sales_clerk
q个语句中数据库不知道SUM()是什么,当我们需要指C数据库对行分组Q然后限制分l后的行的输出时Q正的Ҏ(gu)是用HAVING语句Q?/p>
SELECT sales_clerk,SUN(sale_amount) FROM gross_sales WHERE sales_dept='OUTSIDE' GROUP BY sales_clerkHAVING SUM(sale_amount)>10000;
4、嵌套函?/p>
函数可以嵌套。一个函数的输出可以是另一个函数的输入。操作数有一个可l承的执行过E。但函数的优先权只是Z位置Q函数遵循由内到外,由左到右的原则。嵌套技术一般用于象DECODEq样的能被用于逻辑判断语句IF....THEN...ELSE的函数?/p>
嵌套函数可以包括在组函数中嵌套单行函敎ͼ或者组函数嵌套入单行函数或l函C。比如下面的例子Q?/p>
SELECT deptno, GREATEST(COUNT(DISTINCT job),COUNT(DISTINCT mgr) cnt,COUNT(DISTINCT job) jobs,COUNT(DISTINCT mgr) mgrsFROM empGROUP BY deptno;DEPTNO CNT JOBS MGRS------ --- ---- ----10 4 4 220 4 3 430 3 3 2
2、Foreach 和For一样?/p>
3、Hiddenlg L多余S的处?br /> <input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/>
4?Insert lg
e.g.
<input type="text" jwcid="name@Insert" value="ognl:user.name"/>
面表现?会(x)到页面类中寻找getUser().getName()Ҏ(gu)获取初值ƈ输出
相当于在面上显C数?
5?TextField lg
e.g.
<input type="text" jwcid="username@TextField" value="ognl:username"/>
面表现?会(x)到页面类中寻找getUsername()Ҏ(gu)获取初?
*如果是修改信息页?通常初始D在页面表C前由setUsername()手动讄从数据库中读取出来的?
表单提交?通过setUsername()写入新?即用戯入?,在类中通过getUsername()获取新?
相当于在修改个h信息?首先d用户名赋予文本框(用户?初?用户修改时填入新?后台获取?
*Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true")
readonly属性设|只?readonly="true"为只?后台可读?
*disabled属性设|是否可?diabled="true"Z可写(后台也不可读?
6?TextArea lg
e.g.
<textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea>
面表现?会(x)到页面类中寻找getContent()Ҏ(gu)获取初?
工作原理同TextField
7?RadioGroup/Radio lg
e.g.
<span jwcid="headImage@RadioGroup" selected="ognl:headImage">
<input jwcid="@Radio" type="radio" value="1"/>头像1
<input jwcid="@Radio" type="radio" value="2"/>头像2
<input jwcid="@Radio" type="radio" value="3"/>头像3
<input jwcid="@Radio" type="radio" value="4"/>头像4
<input jwcid="@Radio" type="radio" value="5"/>头像5
<input jwcid="@Radio" type="radio" value="6"/>头像6
</span>
RadioGroup为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性|q且只有一个Radio能够被选中.
面提交ӞRadioGrouplg利用OGNL表达式向headImage字段写入被选中的Radiolg的value参数?
面表现?修改面),会(x)到页面类中寻找getHeadImage()Ҏ(gu)获取初?然后L@Radiolg中与其相同的lgq勾选上.
8?PropertySelection lg
使用PropertySelectionlg必须要构造一个类来实现IPropertySelectionModel接口Qƈ且重写该接口?个方?
public int getOptionCount() //提供下拉菜单的长?
public Object getOption(int index) //提供select标签的option
public String getLabel(int index) //提供select标签的Label|也就是下拉菜单显C的内容
public String getValue(int index) //提供select标签的value?
public Object translateValue(String value) //selected后的q回|value值未必就是我们需要的q回|可以在这个方法里面对q回的value做对应的转换或修?
e.g.1. 性别下拉?
<select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender">
<option selected>先生</option>
<option>奛_</option>
</select>
代码
GenderSelectionModel.java
public class GenderSelectionModel implements IPropertySelectionModel {
public static final String male = "先生";
public static final String female = "奛_";
public static final String[] genderOptions = { male, female };
public int getOptionCount() {
return genderOptions.length;
}
public Object getOption(int index) {
return this.translateValue(genderOptions[index]);
}
public String getLabel(int index) {
return genderOptions[index].toString();
}
public String getValue(int index) {
return genderOptions[index];
}
public Object translateValue(String value) {
if (value.equals("先生")) {
return "1";
} else {
return "0";
}
}
}
代码
ModUserInfo.java
public IPropertySelectionModel getSupportedGender() {
return new GenderSelectionModel();
}
存入数据库中"1"代表先生,"0"代表奛_,通过translateValue(String value)Ҏ(gu)转换
面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender().
然后通过getGender()Ҏ(gu)获取初?比如获取"0",则在面昄时寻找valuegؓ(f)"0"的选项即ؓ(f)"奛_",q择之作为初始选择?
e.g.2. 日志cd下拉?
<select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType">
<option>?j)情日?lt;/option>
<option>情感天地</option>
<option>生活感触</option>
</select>
代码
TypeSelectionModel.java
public class TypeSelectionModel implements IPropertySelectionModel {
private List typeList = new ArrayList();
public TypeSelectionModel(List typeList) {
this.typeList = typeList;
}
public int getOptionCount() {
return typeList.size();
}
public Object getOption(int index) {
return ((LogType)typeList.get(index)).getValue();
}
public String getLabel(int index) {
return ((LogType) typeList.get(index)).getName();
}
public String getValue(int index) {
return ((LogType) typeList.get(index)).getValue();
}
public Object translateValue(String value) {
return value;
}
}
代码
ModLog.java
public IPropertySelectionModel getSupportedType() {
TypeSelectionModel typeSelectionModel =
new TypeSelectionModel(loadType(getUser().getUserId()));
return typeSelectionModel;
}
private List loadType(int userid) {
...//从数据库载入该用L(fng)日志cd列表
}
面表现?通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType().
然后通过value属性给出的初始值即,getLogType()Ҏ(gu)获取初?比如获取"2",则在面昄时寻找valuegؓ(f)"2"的选项即ؓ(f)"生活感触",q择之作为初始选择?
9?Formlg
e.g.
<form jwcid="logForm@Form">
...
</form>
Form的监?listener)Ҏ(gu)可以有两U方?
1. 在Formlg中声?
<form jwcid="logForm@Form" listener="ognl:listener:onLogin">
...
</form>
2. 在submitcdlg中声?
<input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/>或?
<span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span>
前一U方式当Form中只要有submit׃(x)触发监听Ҏ(gu),后一U方式是Form中有多个submit,各自实现不同的监听方?
G) Foreach lg
e.g.
<span jwcid="@Foreach" source="ognl:logList" value="ognl:item">
循环lg,遍历source参数,在表现其内容前更新value参数,Foreachlg所包含的内定w复表?其中可以通过value参数获取所需昄内容.
本例?面表现旉过getLogList()Ҏ(gu)获取日志列表,循环取出其中数据更新item(日志对象)q予以显C?其中item需要在面规范(.page)文g中声?
<property name="item"/>
*class参数用来LcMCSS的文件对Foreachq行修饰.
Foreachlg: class="ognl:beans.evenOdd.next"
Page文g: <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/>
CSS文g: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}
10?Conditional lg
e.g.
<span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'>先生</span>
<span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'>奛_</span>
conditional参数为true时运行Conditionallg中的HTML模板内容.
在Tapestry4.0以后׃支持该组件了(jin), 可以使用其他lg来实?
1. Contrib:Choose和Contrib:When
<library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文g中引入Contribcd)
<span jwcid="@contrib:Choose">
<span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'>先生</span>
<span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'>奛_</span>
</span>
2. Iflg
<span jwcid="@If" condition='ognl:item.sex.equals("1")'>先生</span>
<span jwcid="@If" condition='ognl:item.sex.equals("0")'>奛_</span>
3. Elselg
<span jwcid="@Else">man</span>
?===========================ts的函数执行顺?=======================================?br />
对之前的该文章进行了(jin)一些修正,主要是针对finishLoad()Ҏ(gu)?
我觉得对初学者会(x)有一些帮助?
下面q几个函数是我在使用的,它们的执行顺序依ơ从上到下?
1.protected void finishLoad() {} ***
2.public void pageValidate(PageEvent event) {}
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
4.public void pageBeginRender(PageEvent event) {}
// 如果有表单提交,则将form中的各字D늚Dl页面类
5. ...... 赋?
6.public void submit() // 表单提交{用listenter:调用的方?
7.protected void prepareForRender(IRequestCycle cycle) {}
----------------------------------------------------
1.protected void finishLoad() {}
q个函数最先执行,但是它实际上没有什么用处(我感觉)(j)。因为:(x)
q个函数只在面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱:(x)如果你的tomcat启动时用了(jin)-Dorg.apache.tapestry.disable-caching=true(Z(jin)调试方便而设)Q那么你每次h面Ӟ它都?x)执行(因?f)每个request都会(x)新生成一个页面类对象Q,造成?jin)它L执行的假象。在实际的部|时Q会(x)使用cachingQ则q个函数执行的机?x)很。所以要注意?
初始化的代码攑֜4 pageBeginRender()?
2.public void pageValidate(PageEvent event) {}
如果实现?jin)PageValidateListener接口Q则可以在这里进行验证,比如讉K权限{。执行完1后,它就开始执行?
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
如果实现?jin)IExternalPage接口Q则可以从这里取得由外面传过来的参数。执?后,执行到这里。在q里可以把那些参数取出,赋给面cR?
4.public void pageBeginRender(PageEvent event) {}
执行?后,执行本函数。但是这时从客户端传q来的参数还没有被赋?如果提交?jin)表单的?。这里可以进行一些初始化操作?
5.执行?后,如果有表单提交,在这里将?x)取出那些|赋给对应的字Dc(din)?注意Q只是将表单中有的Dq来)
6.public void submit()
如果有表单提交的话,在这里将q行对应的操作。因为此时各字段已经取好g(jin)Q所以可以拿来直接用?
7.protected void prepareForRender(IRequestCycle cycle) {}
最后才执行q个Ҏ(gu)。我们可以在其中q行Z(jin)在页面上昄数据而进行的操作Q比如取得什么对象什么的Q因里页面类的属性赋值已l结束,可以直接拿来使用?jin)?
注意Q如果执行了(jin)6Q则q要执行4Q再执行7。如果没?Q?完了(jin)q接是7?
以上是我所ȝ的执行顺序,不当之处h出?nbsp;
-----------------------------------------------------
最开始学tapestry的时候,觉得“怎么有这么多地方需要持久啊”。原来以前只知道pageBeginRenderq个函数Q什么初始化操作都放在它里面。可是它是在赋g前执行,所以拿到的字段多都是空的,却都以ؓ(f)是没有持久化的缘故。所以在客户端里放了(jin)一大堆的@HiddenQ或者session中持久,非常ȝ(ch)Q,Q对tapestry也生的怀疑。现在才知道那些需要取得客L(fng)传来的参数的代码Q最好放在prepareForRender里,很多不必要的持久都可以省掉了(jin)
查询提供?jin)两U方式,一U是使用DAODelegate提供的查询(q和普通的hibernate一L(fng)Q?br />
W二U方式是 装?jin)一个查询类HqlQuery 具体使用例子中有?br />
Ҏ(gu)架提Z下几点:(x)
1、我现在xAbstractService q个cdspring注入的时候设|成为静(rn)态的 可以提高效率 但不知会(x)有别的什么媄(jing)响?Q?q请哪个朋友指点一?十分感谢
2、StudentServer q个接口 和StudentDAOq个c?是一一对应?StudentDAOq个必须实现接口的方?而接口中定义和业务相关的方?StudentDAO在spring中注?调用时候用StudentServer 指向子类
但这L(fng)每在StudentServer 增加一个业务方法就要在dao实现cMd一?不知道这样好不好Q?
q请朋友们帮忙看?
3、因没有涉及(qing)到web开?但查询中~少分页查询Q正在整理,有好的分늻件请大家分n下我的邮?br />
sunxianchao@gmail.com
有什么好的徏议和提议请大家留a 十分感谢!!!
http://exs.mail.qq.com/cgi-bin/downloadfilepart?svrid=12&fid=644bd873e37da73f4ceeef5962b2eeae94fa6298069572c4
提取码:(x)20dc1eb4
希望可以提出(zhn)的宝贵意见
outer-join关键字有3个|分别是true,false,auto,默认是auto?br />
true: 表示使用外连接抓取关联的内容Q这里的意思是当用load(OrderLineItem.class,"id")ӞHibernate只生成一条SQL语句OrderLineItem与他的父亲Order全部初始化?br />
select * from OrderLineItem o left join Order p on o.OrderId=p.OrderId where o.OrderLineItem_Id=?
false:表示不用外q接抓取兌的内容,当load(OrderLineItem.class,"id")ӞHibernate生成两条SQL语句Q一条查询OrderLineItem表,另一条查询Order表。这L(fng)好处是可以设|gq加载,此处要将Orderc设|ؓ(f)lazy=true?br />
select * from OrderLineItem o where o.OrderLineItem_Id=?
select * from Order p where p.OrderId=?
auto:具体是tureq是false?strong>hibernate.cfg.xml中的配置
注意Q如果用HQL查询OrderLineItemQ如 from OrderLineItem o where o.id='id'QL不用外部抓取,?qing)outer-join失效?br />
2、outer-join(集合)
׃集合可以讄lazy="true"Q所以lazy与outer-join不能同时为trueQ当lazy="true"Ӟouter-join一直是falseQ如果lazy="false"Q则outer-join用法??br />
3、HQL语句?x)将POJO配置文g中的兌一q查询,即在HQL语句中没有明?strong>join?/p>
4、In HQL, the "fetch join" clause can be used for per-query specific outer join fetching. One important thing many people miss there, is that HQL queries will ignore the outer-join attribute you specified in your mapping. This makes it possible to configure the default loading behaviour of session.load() and session.get() and of objects loaded by navigating relationship. So if you specify
and then do
MyObject obj = session.createQuery("from MyObject").uniqueResult();
obj.getMySet().iterator().next();
you will still have an additional query and no outer-join. So you must explicily request the outer-join fetching:
MyObject obj = session.createQuery(
"from MyObject mo left join fetch mo.mySet").uniqueResult();
obj.getMySet().iterator().next();
Another important thing to know is that you can only fetch one collection reference in a query. That means you can just use one fetch join. You can however fetch "one" references in addition, as this sample from the Hibernate Docs demonstrates:
from eg.Cat as cat
inner join fetch cat.mate
left join fetch cat.kittens
We have once considered lifting this limitation, but then decided against it, because using more than one fetch-join would be a bad idea generally: The generated ResultSet becomes huge and is a major performance loss.
So alltogether the "fetch join" clause is an important instrument Hibernate users should learn how to leverage, as it allows tuning the fetch behaviour of a certain use case.
5?strong>join fetch ?join 的区?/p>
如果HQL使用?jin)连接,但是没有使?strong>fetch关键字,则生成的SQL语句虽然有连接,但是q没有取q接表的数据Q还是需要单独的sql取数据,也就?select a,b,d...中没有连接表的字D?/p>
6、如果集合被声明为lazy=trueQ在HQL中如果显式的使用 join fetch 则gq加载失效?/p>
7、在one-to-many的one端显式设|fecth="join",则无论如何都采取预先抓取Q生成一个SQlQ,延迟加蝲失效(生成两个SQL)
8、many-to-one的gq加载是在配|文件的class标签讄lazy="true",one-to-many和many-to- many的gq加载是在set标签中设|lazy="true"。而one-to-one不只要在calss标签讄lazy="true",而且要在 one-to-one标签中设|constrained="true".