沧浪之水

每天进步一点点

Archive for the ‘programing’ tag

JBOSS上部署JOSSO单点登录组件

leave a comment

星期二, 三月 20, 2007


本文主要阐述在编译,打包和在JBOSS上部署和运行JOSSO单点登陆程序的步骤,认证数据存放Mysql数据库

####################################
建立基础数据库

选择认证信息存放介质,本文考虑用mysql数据库


mysql 连接信息为:
“com.mysql.jdbc.Driver”
“jdbc:mysql://localhost/test”
下载mysql jdbc驱动
把驱动程序放到
$JBOSS_HOME/server/default/deploy/jbossweb-tomcat55.sar/ 目录下 或 josso src lib 目录下

建立数据库,执行下列SQL
– Roles

CREATE TABLE JOSSO_ROLE (

NAME VARCHAR(16) NOT NULL,

DESCRIPTION VARCHAR(64) NULL

);

ALTER TABLE JOSSO_ROLE

ADD ( PRIMARY KEY (NAME) ) ;

– Users

CREATE TABLE JOSSO_USER (

LOGIN VARCHAR(16) NOT NULL,

PASSWORD VARCHAR(20) NOT NULL,

NAME VARCHAR(64) NULL,

DESCRIPTION VARCHAR(64) NULL

);

ALTER TABLE JOSSO_USER

ADD ( PRIMARY KEY (LOGIN) ) ;

– Users Properties

CREATE TABLE JOSSO_USER_PROPERTY (

LOGIN VARCHAR(16) NOT NULL,

NAME VARCHAR(255) NOT NULL,

VALUE VARCHAR(255) NOT NULL

);

ALTER TABLE JOSSO_USER_PROPERTY

ADD ( PRIMARY KEY (LOGIN, NAME) ) ;

ALTER TABLE JOSSO_USER_PROPERTY

ADD ( FOREIGN KEY (LOGIN)

REFERENCES JOSSO_USER ) ;

– Roles by user

CREATE TABLE JOSSO_USER_ROLE (

LOGIN VARCHAR(16) NOT NULL,

NAME VARCHAR(255) NOT NULL

);

ALTER TABLE JOSSO_USER_ROLE

ADD ( PRIMARY KEY (LOGIN, NAME) ) ;

ALTER TABLE JOSSO_USER_ROLE

ADD ( FOREIGN KEY (NAME)

REFERENCES JOSSO_ROLE ) ;

ALTER TABLE JOSSO_USER_ROLE

ADD ( FOREIGN KEY (LOGIN)

REFERENCES JOSSO_USER ) ;

– SSO Sessions

CREATE TABLE JOSSO_SESSION

(

SESSION_ID VARCHAR (64) NOT NULL

, USERNAME VARCHAR (128) NOT NULL

, CREATION_TIME INTEGER NOT NULL

, LAST_ACCESS_TIME INTEGER NOT NULL

, ACCESS_COUNT INTEGER NOT NULL

, MAX_INACTIVE_INTERVAL INTEGER NOT NULL

, VALID INTEGER NOT NULL

);

ALTER TABLE JOSSO_SESSION

ADD ( PRIMARY KEY (SESSION_ID) ) ;



INSERT INTO JOSSO_ROLE (NAME,DESCRIPTION) VALUES(‘role1′,’The Role1′);

INSERT INTO JOSSO_ROLE (NAME,DESCRIPTION) VALUES(‘role2′,’The Role2′);

INSERT INTO JOSSO_ROLE (NAME,DESCRIPTION) VALUES(‘role3′,’The Role3′);

INSERT INTO JOSSO_USER (LOGIN,PASSWORD,DESCRIPTION)

VALUES(‘user1′, ‘user1pwd’, ‘The User1′);

INSERT INTO JOSSO_USER_ROLE (LOGIN,NAME) VALUES(‘user1′, ‘role1′);

INSERT INTO JOSSO_USER_ROLE (LOGIN,NAME) VALUES(‘user1′, ‘role2′);

INSERT INTO JOSSO_USER (LOGIN,PASSWORD,DESCRIPTION)

VALUES(‘user2′, ‘user2pwd’, ‘The User2′);

INSERT INTO JOSSO_USER_ROLE (LOGIN,NAME) VALUES(‘user2′, ‘role3′);

INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)

VALUES(‘user1′, ‘user.name’, ‘User1 Name’);

INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)

VALUES(‘user1′, ‘user.lastName’, ‘User1 Last Name’);

INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)

VALUES(‘user1′, ‘user.registrationDate’, ‘User1 Registration Date’);

INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)

VALUES(‘user2′, ‘user.name’, ‘User2 Name’);

INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)

VALUES(‘user2′, ‘user.lastName’, ‘User2 Last Name’);

INSERT INTO JOSSO_USER_PROPERTY(LOGIN,NAME,VALUE)

VALUES(‘user2′, ‘user.registrationDate’, ‘User2 Registration Date’);


—————————————-
设置好环境变量

set JAVA_HOME=c:jdk1.5.0_03
set JBOSS_HOME=c:jboss-4.0.3SP1 类似
—————————————-
#####################################
设置JOSSO配置文件信息 %JOSSO_HOME%srcresources
1.设置网关配置文件 【
Gateway Configuration】josso-gateway-config.xml
<?xml version=”1.0″ encoding=”ISO-8859-1″?>
<domain>
<name>SampleDomain</name>
<type>web</type>
<authenticator>
<class>org.josso.auth.AuthenticatorImpl</class>
<authentication-schemes>
<!– Basic Authentication Scheme –>
<authentication-scheme>
<name>basic-authentication</name>
<class>org.josso.auth.scheme.UsernamePasswordAuthScheme</class>
<!–JDBC Credential Store–>
<credential-store>
<class>org.josso.gateway.identity.service.store.db.JDBCIdentityStore </class>
<credentialsQueryString>SELECT login AS username , password AS password FROM josso_user
WHERE login = ?</credentialsQueryString>
<connectionName>cernet</connectionName>
<connectionPassword>password</connectionPassword>
<connectionURL>jdbc:mysql://localhost/cernet</connectionURL>
<driverName>com.mysql.jdbc.Driver</driverName>
</credential-store>
<credential-store-key-adapter>
<class>org.josso.gateway.identity.service.store.SimpleIdentityStoreKeyAdapter </class>
</credential-store-key-adapter>
</authentication-scheme>
</authentication-schemes>
</authenticator>
<sso-identity-manager>
<class>org.josso.gateway.identity.service.SSOIdentityManagerImpl</class>
<!– JDBC Identity Store –>
<sso-identity-store>
<class>org.josso.gateway.identity.service.store.db.JDBCIdentityStore </class>
<userQueryString>SELECT login FROM josso_user WHERE login = ? </userQueryString>
<rolesQueryString>SELECT josso_role.name FROM josso_role , josso_user_role , josso_user
WHERE josso_user.login = ? AND josso_user.login = josso_user_role.login
AND josso_role.name = josso_user_role.name</rolesQueryString>
<connectionName>cernet</connectionName>
<connectionPassword>password</connectionPassword>
<connectionURL>jdbc:mysql://localhost/cernet</connectionURL>
<driverName>com.mysql.jdbc.Driver</driverName>
</sso-identity-store>
<sso-identity-store-key-adapter>
<class>org.josso.gateway.identity.service.store.SimpleIdentityStoreKeyAdapter</class>
</sso-identity-store-key-adapter>
</sso-identity-manager>
<sso-session-manager>
<class>org.josso.gateway.session.service.SSOSessionManagerImpl</class>
<!–
Set the maximum time interval, in minutes, between client requests
before the SSO Service will invalidate the session. A negative time
indicates that the session should never time out.
–>
<maxInactiveInterval>1</maxInactiveInterval>
<sso-session-store>
<class>
org.josso.gateway.session.service.store.MemorySessionStore
</class>
</sso-session-store>
<sso-session-id-generator>
<class>
org.josso.gateway.session.service.SessionIdGeneratorImpl
</class>
<!–
The message digest algorithm to be used when generating session
identifiers. This must be an algorithm supported by the
java.security.MessageDigest class on your platform.

In J2SE 1.4.2 you can check :
Java Cryptography Architecture API Specification & Reference -
Apendix A : Standard Names
Values are : MD2, MD5, SHA-1, SHA-256, SHA-384, SHA-512
–>
<algorithm>MD5</algorithm>
</sso-session-id-generator>
</sso-session-manager>
<sso-audit-manager>
<class>org.josso.gateway.audit.service.SSOAuditManagerImpl</class>
<handlers>
<!– This handler logs all audit trails using Log4J, under the given category –>
<handler>
<class>org.josso.gateway.audit.service.handler.LoggerAuditTrailHandler</class>
<name>LoggerAuditTrailHandler</name>
<category>org.josso.gateway.audit.SSO_AUDIT</category>
</handler>
</handlers>
</sso-audit-manager>
<!– SSO Event Manager component –>
<sso-event-manager>
<class>org.josso.gateway.event.security.JMXSSOEventManagerImpl</class>
<!–
JMX Name of the EventManager MBean that will send SSO Events as JMX Notifications
The MBean will be registered by the MBeanComponentKeeper.
–>
<oname>josso:type=SSOEventManager</oname>
</sso-event-manager>
</domain>

2.设置智能代理配置文件 【Agent Configuration】josso-agent-config.xml
<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>

<agent>



<!– JOSSO Agent classes –>

<!–class>org.josso.tc50.agent.CatalinaSSOAgent</class–>

<!–class>org.josso.tc55.agent.CatalinaSSOAgent</class–>

<!–class>org.josso.jb32.agent.JBossCatalinaSSOAgent</class–>

<class>org.josso.jb4.agent.JBossCatalinaSSOAgent</class>



<!– Login/Logout URLs –>

<gatewayLoginUrl>http://localhost:8080/josso/signon/login.do</gatewayLoginUrl>

<gatewayLogoutUrl>http://localhost:8080/josso/signon/logout.do</gatewayLogoutUrl>

<!–gatewayLoginErrorUrl>http://localhost:8080/josso/signon/login.do</gatewayLoginErrorUrl–>



<!–

Usefull when working in N-Tier modes behind a reverse proxy or load balancer

Here you should place the reverse proxy or load balancer base URL.



Note : When using this options, the gatewayLoginURL and gatewayLogoutURL should also point to this host.



<singlePointOfAccess>http://reverse-proxy-host:8080</singlePointOfAccess>



<gatewayLoginUrl>http://reverse-proxy-host:8080/josso/signon/login.do</gatewayLoginUrl>

<gatewayLogoutUrl>http://reverse-proxy-host:8080/josso/signon/logout.do</gatewayLogoutUrl>

–>



<!– Mininum interval between sso session access , in milliseconds –>

<sessionAccessMinInterval>1000</sessionAccessMinInterval>



<!– JOSSO Agent service locator configuration –>

<service-locator>

<class>org.josso.gateway.WebserviceGatewayServiceLocator</class>

<endpoint>localhost:8080</endpoint>



<!– Associate an identity to SOAP messages

<username>wsclient</username>

<password>wsclientpwd</password>

–>



<!– Enabled SSL on the SOAP circuit.

<transportSecurity>confidential</transportSecurity>

–>

</service-locator>



<!–

JOSSO Parnter application definicions :



Configure all web applications that should be a josso partner application within this server.

For each partner application you have to define the propper web-context.

–>

<partner-apps>



<partner-app>

<context>/partnerapp</context>

<!– This is an optional feature :

You can reference any web resource collection that should not be subject to SSO protection.

The SSO agent will not provide identity nor demand authentication to requests matching the

security constraint associated to this web resource collections.

In order to work, the security constraint must not contain auth-constraints declarations.

See sample web.xml file from josso partnerapp.

<security-constraint>

<ignore-web-resource-collection>public-resources</ignore-web-resource-collection>

</security-constraint>

–>

</partner-app>



</partner-apps>



</agent>


3.设置 josso-reverseproxy-config.xml 配置文件

4.设置 josso配置文件 josso-config.xml
<?xml version=”1.0″ encoding=”ISO-8859-1″ ?>
<configuration>
<hierarchicalXml fileName=”josso-gateway-config.xml”/>
<hierarchicalXml fileName=”josso-agent-config.xml”/>
<hierarchicalXml fileName=”josso-reverseproxy-config.xml”/>
</configuration>

#####################################################

配置应用服务器文件

—————————————-

编辑server.xml $JBOSS_HOME/server/default/deploy/jbossweb-tomcat55.sar/server.xml

<Server>

<Service>

<Engine>

<Host name=”localhost” …>

<Valve className=”org.josso.tc55.agent.SSOAgentValve” debug=”1″/>

</Host>
</Engine>
</Service>
</Server>


<Server>

<Service>

<Engine name=”Catalina” defaultHost=”localhost” debug=”0″>

<Realm className=”org.josso.jb4.agent.JBossCatalinaRealm”
appName=”josso”
userClassNames=”org.josso.gateway.identity.service.BaseUserImpl”
roleClassNames=”org.josso.gateway.identity.service.BaseRoleImpl”
debug=”1″ />

</Engine>
</Service>
</Server>

—————————————-
编辑 login-config.xml $JBOSS_HOME/server/default/conf

<application-policy name = “josso”>
<authentication>
<login-module code = “org.josso.jb4.agent.JBossSSOGatewayLoginModule”
flag = “required”>
<module-option name=”debug”>true</module-option>
</login-module>
</authentication>
</application-policy>

拷贝文件到$JBOSS_HOME/server/default/conf
josso-config.xml
josso-gateway-config.xml
josso-agent-config.xml
josso-reverseproxy-config.xml

#########################################
执行 Ant Build 任务列表部署和启动JOSSO on JBOSS
—————————————-
//编译War包
build.bat war
—————————————-
//安装josso到jboss
build.bat install-jboss4

—————————————-
//部署 josso应用ear包
build.bat deploy-jboss4
—————————————-
//启动 Jboss 进程
cd $JBOSS_HOME/bin
cd %JBOSS_HOME%bin
run.bat
—————————————-
访问受保护地址验证SSO
http://localhost:8080/partnerapp/protected
user and password is : user1/user1pwd user2/user2pwd
—————————————-


########################################
错误诊断

15:30:15,922 ERROR [UsersRolesLoginModule] Failed to load users/passwords/role files
错误,一般是因为 login-config.xml 没有设置

Written by corlin

十月 12th, 2009 at 9:27 下午

Posted in 04年到09年10月存档

Tagged with

Java[tm] Technology Products Download

leave a comment

最近在改造老旧的计费系统,用的JDK版本都比较老(jdk 1.4.2 05-b04 1.3 …),网上很难找到对应的JDK版本下载,特此提供所有Java相关产品全部版本的下载连接给大家,方便遗留系统的改造和升级。

地址为:http://72.5.124.55/products/archive/index.html


—-8 10 2007

Written by corlin

十月 12th, 2009 at 8:38 上午

Java代码优化,策略与方法

leave a comment

整理了一些影响性能的代码和优化方法,以后希望能陆续补充和优化

1. 如何使用Exception
Exception降低性能。一个异常抛出首先需要创建一个新的对象。Throwable接口中的构造器调用名为fillInStackTrace()的本地方法。这个方法负责巡检栈的整个框架来收集跟踪信息。这样无论何时有异常抛出,它要求虚拟机装载调用栈,因为一个新的对象在中部被创建。
异常应当仅用于有错误发生时,而不要控制流。
2. 不要两次初始化变量
Java通过调用独特的类构造器默认地初始化变量为一个已知的值。所有的对象被设置成null,integers (byte, short, int, long)被设置成0,float和double设置成0.0,Boolean变量设置成false。这对那些扩展自其它类的类尤其重要,这跟使用一个新的关键词创建一个对象时所有一连串的构造器被自动调用一样。
3. 在任何可能的地方让类为Final
标记为final的类不能被扩展。在《核心Java API》中有大量这个技术的例子,诸如java.lang.String。将String类标记为final阻止了开发者创建他们自己实现的长度方法。
更深入点说,如果类是final的,所有类的方法也是final的。Java编译器可能会内联所有的方法(这依赖于编译器的实现)。在我的测试里,我已经看到性能平均增加了50%。
4. 在任何可能的地方使用局部变量
属于方法调用部分的自变量和声明为此调用一部分的临时变量存储在栈中,这比较快。诸如static,实例(instance)变量和新的对象创建在堆中,这比较慢。局部变量的更深入优化依赖于你正在使用的编译器或虚拟机。
5. 停止小聪明
很多开发人员在脑子中编写可复用和灵活的代码,而有时候在他们的程序中就产生额外的开销。曾经或者另外的时候他们编写了类似这样的代码:
public void doSomething(File file) {
FileInputStream fileIn = new FileInputStream(file);
// do something
他够灵活,但是同时他们也产生了更多的开销。这个主意背后做的事情是操纵一个InputStream,而不是一个文件,因此它应该重写如下:
public void doSomething(InputStream inputStream){
// do something
6. 乘法和除法
我有太多的东东适用于摩尔法则–它声明CPU功率每年成倍增长。”摩尔法则”表明每年由开发者所写的差劲的代码数量三倍增加,划去了摩尔法则的任何好处。
考虑下面的代码:
for (val = 0; val < 100000; val +=5) { shiftX = val * 8; myRaise = val * 2; }
如果我们狡猾的利用位移(bit),性能将会六倍增加。这是重写的代码:
for (val = 0; val < 100000; val += 5) { shiftX = val << 3; myRaise = val << 1; }
代替了乘以8,我们使用同等效果的左移3位。每一个移动相当于乘以2,变量myRaise对此做了证明。同样向右移位相当于除以2,当然这会使执行速度加快,但可能会使你的东东以后难于理解;所以这只是个建议
7. 用代码有效处理内存溢出
OutOfMemoryError是由于内存不够后普遍会遇到的问题,下面一段代码能有效判断内存溢出错误,并在内存溢出发生时有效回收内存
通过该方法可以联想到有效管理连接池溢出,道理等同。
import java.util.*;
public class DataServer
{
private Hashtable data = new Hashtable();
public Object get (String key)
{
Object obj = data.get (key);
if (obj == null)
{
System.out.print (key + ” “);
try
{
// simulate getting lots of data
obj = new Double[1000000];
data.put (key, obj);
}
catch (OutOfMemoryError e)
{
System.out.print (“\No Memory! “);
flushCache();
obj = get (key);// try again
}
}
return (obj);
}
public void flushCache()
{
System.out.println (“Clearing cache”);
data.clear();
}
public static void main (String[] args)
{
DataServer ds = new DataServer();
int count = 0;
while (true) // infinite loop for test
ds.get (“” + count++);
}
}
8. Lazy Loading (Lazy evaluation)在需要装入的时候才装入
static public long
factorial( int n ) throws IllegalArgumentException
{
IllegalArgumentException illegalArgumentException =
new IllegalArgumentException( “must be >= 0″ );
if( n < 0 ) {
throw illegalArgumentException ;
} else if( ( n == 0 ) || ( n == 1 ) ) {
return( 1 );
} else (
return( n * factorial( n – 1 ) ) ;
}
优化后代码
static public long
factorial( int n ) throws IllegalArgumentException
{
if( n < 0 ) {
throw new IllegalArgumentException( “must be >= 0″ );
} else if( ( n == 0 ) || ( n == 1 ) ) {
return( 1 );
} else (
return( n * factorial( n – 1 ) ) ;
}
9. 异常在需要抛出的地方抛出,try catch能整合就整合
try {
some.method1(); // Difficult for javac
} catch( method1Exception e ) { // and the JVM runtime
// Handle exception 1 // to optimize this
} // code
try {
some.method2();
} catch( method2Exception e ) {
// Handle exception 2
}
try {
some.method3();
} catch( method3Exception e ) {
// Handle exception 3
}
已下代码 更容易被编译器优化
try {
some.method1(); // Easier to optimize
some.method2();
some.method3();
} catch( method1Exception e ) {
// Handle exception 1
} catch( method2Exception e ) {
// Handle exception 2
} catch( method3Exception e ) {
// Handle exception 3
}
10. For循环的优化
Replace…
for( int i = 0; i < collection.size(); i++ ) {

}
with…
for( int i = 0, n = collection.size(); i < n; i++ ) {

}
11. 字符串操作优化
在对字符串实行+操作时,最好用一条语句
// Your source code looks like…
String str = “profit = revenue( ” + revenue +
“) – cost( ” + cost + “)”;

// 编译方法
String str = new StringBuffer( ).append( “profit = revenue( ” ).
append( revenue ).append( “) – cost( ” ).
append( cost ).append( “)” ).toString( );
在循环中对字符串操作时改用StringBuffer.append()方法
String sentence = “”;
for( int i = 0; i < wordArray.length; i++ ) {
sentence += wordArray[ i ];
}
优化为
StringBuffer buffer = new StringBuffer( 500 );
for( int i = 0; i < wordArray.length; i++ ) {
buffer.append( wordArray[ i ] );
}
String sentence = buffer.toString( );
12. 对象重用(特别对于大对象来说)
public
class Point
{
public int x;
public int y;
public Point( )
{
this( 0, 0 );
}
}
优化为:
public class Component
{
private int x;
private int y;
public Point getPosition( )
{
Point rv = new Point( ); // Create a new Point
rv.x = x; // Update its state
rv.y = y;
return rv;
}
}
// Process an array of Component positions…
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( );
// Process position value…
// Note: A Point object is created for *each* iteration
// of the loop…
}
可再次优化,仅使用一个类对象:)
public
class Component
{
private int x;
private int y;
public Point getPosition( Point rv )
{
if( rv == null) rv = new Point( );
rv.x = x; // Update its state
rv.y = y;
return rv;
}
// Create a single point object and reuse it…
Point p = new Point( );
for( int i = 0; i < componentArray.length; i++ ) {
Point position = componentArray[i].getPosition( p );
// Process position value…
// Note: Only *one* Point object is ever created.
}
13. j2ee相关
a) 尽量不要将大对象放到HttpSession或其他须序列化的对象中,并注意及时清空Session
b) 使用预编译语句prepareStatement代替createStatement
c) 尽可能使用连接池
d) 能使用Cache就使用Cache,具体实现可参考jive(Cache\Cacheable\CacheObject\CacheSizes \DefaultCache\LinkdList\LinkdListNode)或ofbiz(org.ofbiz.core.util. UtilCache.java)


JDBC相关
a) 测试,为应用选择一个最好的JDBC驱动器
b) 调整合适的连接池大小
c) 该关闭连接的时候必须保证关闭连接并回收资源
a) 在finally 块中关闭 JDBC 连接
d) 在where条件中为查询建立索引
e) 用EXPLAIN SELECT 等工具命令查看SQL代码实际的运行过程 ,并关注:
a) 查询是否充分利用了索引字段
b) 避免多路连接(n-way joins )
c) 避免取得海量数据
f) 关闭自动提交功能(Auto-Commit),集合所有更新和插入操作到事物处理或/batch操作中


Technorati :

Written by corlin

十月 12th, 2009 at 3:45 上午

Log4J 最佳实践之全能配置文件

leave a comment

下面给出得Log4J配置文件实现了输出到控制台,文件,回滚文件,发送日志邮件,输出到数据库日志表,自定义标签等全套功能。

log4j.rootLogger=DEBUG,CONSOLE,A1,im
#DEBUG,CONSOLE,FILE,ROLLING_FILE,MAIL,DATABASE

log4j.addivity.org.apache=true


###################
# Console Appender
###################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=DEBUG
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
#log4j.appender.CONSOLE.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD] n%c[CATEGORY]%n%m[MESSAGE]%n%n


#####################
# File Appender
#####################
log4j.appender.FILE=org.apache.log4j.FileAppender
log4j.appender.FILE.File=file.log
log4j.appender.FILE.Append=false
log4j.appender.FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.FILE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n
# Use this layout for LogFactor 5 analysis



########################
# Rolling File
########################
log4j.appender.ROLLING_FILE=org.apache.log4j.RollingFileAppender
log4j.appender.ROLLING_FILE.Threshold=ERROR
log4j.appender.ROLLING_FILE.File=rolling.log
log4j.appender.ROLLING_FILE.Append=true
log4j.appender.ROLLING_FILE.MaxFileSize=10KB
log4j.appender.ROLLING_FILE.MaxBackupIndex=1
log4j.appender.ROLLING_FILE.layout=org.apache.log4j.PatternLayout
log4j.appender.ROLLING_FILE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n


####################
# Socket Appender
####################
log4j.appender.SOCKET=org.apache.log4j.RollingFileAppender
log4j.appender.SOCKET.RemoteHost=localhost
log4j.appender.SOCKET.Port=5001
log4j.appender.SOCKET.LocationInfo=true
# Set up for Log Facter 5
log4j.appender.SOCKET.layout=org.apache.log4j.PatternLayout
log4j.appender.SOCET.layout.ConversionPattern=[start]%d{DATE}[DATE]%n%p[PRIORITY]%n%x[NDC]%n%t[THREAD]%n%c[CATEGORY]%n%m[MESSAGE]%n%n


########################
# Log Factor 5 Appender
########################
log4j.appender.LF5_APPENDER=org.apache.log4j.lf5.LF5Appender
log4j.appender.LF5_APPENDER.MaxNumberOfRecords=2000


########################
# SMTP Appender
#######################
log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender
log4j.appender.MAIL.Threshold=FATAL
log4j.appender.MAIL.BufferSize=10
log4j.appender.MAIL.From=chenyl@hollycrm.com
log4j.appender.MAIL.SMTPHost=mail.hollycrm.com
log4j.appender.MAIL.Subject=Log4J Message
log4j.appender.MAIL.To=chenyl@hollycrm.com
log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout
log4j.appender.MAIL.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n


########################
# JDBC Appender
#######################
log4j.appender.DATABASE=org.apache.log4j.jdbc.JDBCAppender
log4j.appender.DATABASE.URL=jdbc:mysql://localhost:3306/test
log4j.appender.DATABASE.driver=com.mysql.jdbc.Driver
log4j.appender.DATABASE.user=root
log4j.appender.DATABASE.password=
log4j.appender.DATABASE.sql=INSERT INTO LOG4J (Message) VALUES (‘[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n’)
log4j.appender.DATABASE.layout=org.apache.log4j.PatternLayout
log4j.appender.DATABASE.layout.ConversionPattern=[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n


log4j.appender.A1=org.apache.log4j.DailyRollingFileAppender
log4j.appender.A1.File=SampleMessages.log4j
log4j.appender.A1.DatePattern=yyyyMMdd-HH’.log4j’
log4j.appender.A1.layout=org.apache.log4j.xml.XMLLayout

###################
#自定义Appender
###################
log4j.appender.im = net.cybercorlin.util.logger.appender.IMAppender

log4j.appender.im.host = mail.cybercorlin.net
log4j.appender.im.username = username
log4j.appender.im.password = password
log4j.appender.im.recipient = corlin@cybercorlin.net

log4j.appender.im.layout=org.apache.log4j.PatternLayout
log4j.appender.im.layout.ConversionPattern =[framework] %d – %c -%-4r [%t] %-5p %c %x – %m%n


Technorati :

Written by corlin

十月 12th, 2009 at 3:44 上午

汉字转拼音 简拼 Java Pinyin4j 中英文混排

leave a comment

利于 Pinyin4J 函数库,实现了将含有汉字字符的字符串中汉字转换为拼音输出

参考了其他一些资源,以下代码不是我的原创。)

import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType;
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat;
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType;
import net.sourceforge.pinyin4j.format.HanyuPinyinVCharType;
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination;

public static String getPingYin(String src){
char[] t1 ;
t1=src.toCharArray();
String[] t2 = new String[t1.length];
HanyuPinyinOutputFormat t3 = new HanyuPinyinOutputFormat();
t3.setCaseType(HanyuPinyinCaseType.UPPERCASE);
t3.setToneType(HanyuPinyinToneType.WITHOUT_TONE);
t3.setVCharType(HanyuPinyinVCharType.WITH_V);
String t4=”";
int t0=t1.length;
try {
for (int i=0;i<t0;i++)
{
//判断是否为汉字字符函数
if(java.lang.Character.toString(t1[i]).matches(“[\\u4E00-\\u9FA5]+”))
{
t2 = PinyinHelper.toHanyuPinyinStringArray(t1[i], t3);
t4+=t2[0];
}
else
t4+=java.lang.Character.toString(t1[i]);
}
System.out.println(t4);
return t4;
}
catch (BadHanyuPinyinOutputFormatCombination e1) {
e1.printStackTrace();
}
return t4;
}

可以在数据库中存储汉字名称的简拼和全拼信息,方便数据检索,按拼音排序输出。

特别在呼叫中心系统,客服系统中效果显著。


Technorati :

Written by corlin

十月 12th, 2009 at 3:02 上午

在类中取得当前文件所在的相对路径与绝对路径

leave a comment

package io;

import java.net.URL;

/**
* <p>Title: 在类中取得当前文件所在的相对路径与绝对路径</p>
*
* <p>Description: 在类中取得当前文件所在的相对路径与绝对路径</p>
*
* <p>Copyright: Copyright (c) 1997 – 2005</p>
*
* <p>Company: Beyond DayBreak Office</p>
*
* @author YuLimin
* @version 1.0
*/
public class GetClassPath
{
public GetClassPath()
{
super();
}

/**
* main
*
* @param args String[]
*/
public static void main(String[] args)
{
GetClassPath getclasspath = new GetClassPath();
System.out.println(getclasspath.getClassPath());
}

/**
* 在类中取得当前文件所在的相对路径与绝对路径
*
* @return String
*/
public String getClassPath()
{
String strClassName = getClass().getName();
String strPackageName = “”;
if(getClass().getPackage() != null)
{
strPackageName = getClass().getPackage().getName();
}
System.out.println(“ClassName:” + strClassName);
System.out.println(“PackageName:” + strPackageName);

String strClassFileName = “”;
if(!”".equals(strPackageName))
{
strClassFileName = strClassName.substring(strPackageName.length() + 1,strClassName.length());
}
else
{
strClassFileName = strClassName;
}
System.out.println(“ClassFileName:” + strClassFileName);

URL url = null;
url = getClass().getResource(strClassFileName + “.class”);
String strURL = url.toString();
strURL = strURL.substring(strURL.indexOf(‘/’) + 1,strURL.lastIndexOf(‘/’));
return strURL;
}
}


——-

—–

日期: 05-01-19 09:07

Written by corlin

十月 12th, 2005 at 9:31 上午

在Servlet与JSP中取得当前文件所在的相对路径与绝对路径

leave a comment

<%@ page contentType=”text/html;charset=GBK”%>
<%@ page import=”java.io.*” %>
<%
//在Servlet与JSP中取得当前文件所在的相对路径与绝对路径

//JSP中

out.println(“根目录所对应的绝对路径:” + request.getRequestURI() + “<br/>”);

String strPathFile = application.getRealPath(request.getRequestURI());
out.println(“文件的绝对路径:” + strPathFile+ “<br/>”);
out.println(application.getRealPath(request.getRequestURI()));
String strDirPath = new File(application.getRealPath(request.getRequestURI())).getParent();
out.println(“目录的绝对路径:” + strDirPath + “<br/>”);
%>

//Servlet中
//JSP中的application对象就是Servlet中的ServerContext,所以在Servlet中是如此获得
//import java.io.File;

System.out.println(“根目录所对应的绝对路径:” + request.getServletPath() + “<br/>”);

String strPathFile = request.getSession().getServletContext().getRealPath(request.getRequestURI());
System.out.println(“文件的绝对路径:” + strPathFile + “<br/>”);

String strDirPath = new File(request.getSession().getServletContext().getRealPath(request.getRequestURI())).getParent();
System.out.println(“目录的绝对路径:” + strDirPath + “<br/>”);

文件名不能包括以下字符:\/:*?”<>|

Written by corlin

十月 12th, 2005 at 9:30 上午

Delphi 估计方法

leave a comment

鼓励使用此专业估计方法,它可以对软件工作量、软件规模(代码行数)、开发时间、费用等进行估计,其步骤如下:
步骤一:项目经理选择3至5名有经验的估算人员(可以是项目组外的工程师),他们应具备该项目的背景知识;
步骤二:项目经理发给每位估算人员一份软件系统的规格说明书(略去名称和单位)和《估算过程记录表》;
步骤三:每位估算人员仔细研究软件系统的规格说明书的内容,然后对该软件提出估算值,不记名填写表格,并说明做此估算的理由;
步骤四:如果估算人员估算的最大值与最小值误差在10%以内[(max-min)/max<10%], 则结束估算,否则项目经理召集估算会议进行估算;
步骤五:在估算会议中,估算人员与项目经理一起对估算问题进行讨论,填写《估算过程记录表》;
步骤六:重复步骤五,直至估算的最大值与最小值误差在10%以内,或所有估算人员拒绝再次估算为止;
步骤七:项目经理根据估算结果确定估算数据(简单平均,加权平均)。
步骤八:将估计的数据纳入配置管理库中


Technorati :

Written by corlin

十月 12th, 2005 at 3:12 上午