存档

文章标签 ‘java’

spring2.5+struts2+hibernate3.6 整合心得

2011年3月23日 没有评论

配置log4j属性文件

在tomcat启动的时候,出现这个警告:
log4j:WARN No appenders could be found for logger (org.apache.commons.digester.Digester.sax).
log4j:WARN Please initialize the log4j system properly.

解决办法:
log4j.properties文件需要放到web-inf/class目录下面,在eclipse里面放到src目录下面,会自动拷贝到class目录下面去。

文件:log4j.properties

log4j.rootLogger=CONSOLE,FILE

log4j.addivity.org.apache=true

# 应用于控制台

log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender

log4j.appender.CONSOLE.Threshold=INFO

log4j.appender.CONSOLE.Target=System.out

log4j.appender.CONSOLE.Encoding=GBK

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.A1=org.apache.log4j.DailyRollingFileAppender

log4j.appender.A1.File=C:/log4j/log

log4j.appender.A1.Encoding=GBK

log4j.appender.A1.Threshold=DEBUG

log4j.appender.A1.DatePattern='.'yyyy-MM-dd

log4j.appender.A1.layout=org.apache.log4j.PatternLayout

log4j.appender.A1.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L : %m%n

#应用于文件

log4j.appender.FILE=org.apache.log4j.FileAppender

log4j.appender.FILE.File=C:/log4j/file.log

log4j.appender.FILE.Append=false

log4j.appender.FILE.Encoding=GBK

log4j.appender.FILE.layout=org.apache.log4j.PatternLayout

log4j.appender.FILE.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

# 应用于文件回滚

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.CONSOLE_FILE.Encoding=GBK

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

#自定义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 = yyflyons@163.com

log4j.appender.im.layout=org.apache.log4j.PatternLayout

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

#应用于socket

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

# 发送日志给邮件

log4j.appender.MAIL=org.apache.log4j.net.SMTPAppender

log4j.appender.MAIL.Threshold=FATAL

log4j.appender.MAIL.BufferSize=10

log4j.appender.MAIL.From=yyflyons@163.com

log4j.appender.MAIL.SMTPHost=www.wusetu.com

log4j.appender.MAIL.Subject=Log4J Message

log4j.appender.MAIL.To=yyflyons@126.com

log4j.appender.MAIL.layout=org.apache.log4j.PatternLayout

log4j.appender.MAIL.layout.ConversionPattern=[framework] %d - %c -%-4r [%t] %-5p %c %x - %m%n

Spring配置文件

需要注意xml文件的头部

开启对注解和事务的支持需要加语句

<context:annotation-config />

<tx:annotation-driven/>

文件:applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

 xmlns:aop="http://www.springframework.org/schema/aop"

 xmlns:tx="http://www.springframework.org/schema/tx"

 xmlns:context="http://www.springframework.org/schema/context"

 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd

 http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd 

 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 

 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

<!-- 打开依赖注解方式注入 -->

<context:annotation-config />

<!-- 配置数据源 -->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="com.mysql.jdbc.Driver"/>

<property name="url" value="jdbc:mysql://localhost/ssh"/>

<property name="username" value="root"/>

<property name="password" value="5476"/>

</bean>

<!-- 配置sessionFactory -->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

<property name="dataSource" ref="dataSource" />

<property name="mappingResources">

<list>

<value>com/test/bean/user.hbm.xml</value>

</list>

</property>

<property name="hibernateProperties">

<props>

<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

<prop key="hibernate.hbm2ddl.auto">update</prop>

<prop key="hibernate.show_sql">true</prop>

</props>

</property>

</bean>

<!-- 配置事务管理器 -->

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory">

<ref local="sessionFactory" />

</property>

</bean>

<!-- 配置事务拦截器Bean -->

<bean id="transactionInterceptor"

class="org.springframework.transaction.interceptor.TransactionInterceptor">

<!-- 为事务拦截器bean注入一个事物管理器 -->

<property name="transactionManager" ref="transactionManager"></property>

<property name="transactionAttributes">

<!-- 定义事务传播属性 -->

<props>

<prop key="insert*">PROPAGATION_REQUIRED</prop>

<prop key="update*">PROPAGATION_REQUIRED</prop>

<prop key="save*">PROPAGATION_REQUIRED</prop>

<prop key="add*">PROPAGATION_REQUIRED</prop>

<prop key="remove*">PROPAGATION_REQUIRED</prop>

<prop key="delete*">PROPAGATION_REQUIRED</prop>

<prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="load*">PROPAGATION_REQUIRED,readOnly</prop>

<prop key="change*">PROPAGATION_REQUIRED</prop>

<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>

</props>

</property>

</bean>

<!-- 打开事务支持 -->

<tx:annotation-driven transaction-manager="transactionManager"/>

<!--<import resource=""/>-->

<bean id="userService" class="com.test.service.impl.UserServiceBean" />

<bean id="userAction" class="com.test.action.UserAction">

<property name="userService" ref="userService"/>

</bean></beans>

Spring 需要的jar包

asm-2.2.3.jar

asm-commons-2.2.3.jar

asm-util-2.2.3.jar

aspectjrt.jar

aspectjweaver.jar

cglib-nodep-2.1_3.jar

common-annotations.jar

commons-dbcp.jar

commons-logging.jar

commons-pool.jar

log4j-1.2.15.jar

spring.jar

spring-webmvc-struts.jar //支持struts2

Struts2配置文件

最重要的一句

<!– 把action对象交给spring创建 –>

<constant value=”spring” />

文件:Struts.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<!-- 指定Web应用的默认编码集,相当于调用HttpServletRequest的setCharacterEncoding方法 -->

<constant name="struts.i18n.encoding" value="UTF-8" />

<!-- 设置浏览器是否缓存静态内容,默认值为true(生产环境下使用),开发阶段最好关闭 -->

<constant name="struts.serve.static.browserCache" value="false" />

<!-- 当struts的配置文件修改后,系统是否自动重新加载该文件,默认值为false(生产环境下使用),开发阶段最好打开 -->

<constant name="struts.configuration.xml.reload" value="true" />

<!-- 开发模式下使用,这样可以打印出更详细的错误信息 -->

<constant name="struts.devMode" value="true" />

<!-- 默认的视图主题 -->

<constant name="struts.ui.theme" value="simple" />

<!-- 最关键的参数 -->

<!-- 把action对象交给spring创建 -->

<constant name="struts.objectFactory" value="spring" />

<package name="myDefault" extends="struts-default">

<default-action-ref name="indexPage" />

<global-results>

<result name="exceptionPage">/exceptionPage.jsp</result>

</global-results>

<global-exception-mappings>

<exception-mapping result="exceptionPage" exception="java.lang.Exception" />

</global-exception-mappings>

<action name="indexPage">

<result>/index.jsp</result>

</action>

</package>

<package name="user" namespace="/user" extends="myDefault">

<!-- 这里面的class不是指完整类路径,而是指在spring中定义的bean的名称 -->

<action name="userAction" class="userAction">

<result name="success">/success.jsp</result>

<result name="input">/index.jsp</result>

</action>

</package>

</struts>

Struts需要的jar包

commons-beanutils-1.7.0.jar

commons-chain-1.2.jar

commons-fileupload-1.2.1.jar

commons-io-1.3.2.jar

commons-logging-1.0.4.jar

commons-logging-api-1.1.jar

commons-validator-1.3.1.jar

freemarker-2.3.15.jar

ognl-2.7.3.jar

oro-2.0.8.jar

struts2-core-2.1.8.jar

struts2-spring-plugin-2.1.8.jar

tiles-api-2.0.6.jar

tiles-core-2.0.6.jar

tiles-jsp-2.0.6.jar

xwork-core-2.1.6.jar

Hibernate的配置

Hibernate需要的jar包

antlr-2.7.6.jar

commons-collections-3.1.jar

dom4j-1.6.1.jar

ehcache-1.5.0.jar

hibernate3.jar

hibernate-jpa-2.0-api-1.0.0.Final.jar

javassist-3.12.0.GA.jar

jta-1.1.jar

slf4j-api-1.6.1.jar

slf4j-log4j12-1.6.1.jar

文件:user.hbm.xml

<?xml version="1.0"?>

<!DOCTYPE hibernate-mapping PUBLIC

"-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping

package="com.test.bean">

<class name="User" table="user">

<id name="id">

<generator class="native"/>

</id>

<property name="name" length="10" not-null="true"/>

<property name="password" length="10" not-null="true"/>

</class>

</hibernate-mapping>

自己制作的umd电子书thinking in java中文版下载

2009年11月28日 1 条评论

先说下这本书确实很不错,先是因为朋友的推荐,下了电子版,立即被其中深入透彻的内容吸引了,然后从当当买了纸质的,这也是我买过的最贵的几本书之一了,后来为了方便在上下班路上用手机阅读,又自己根据电子版的pdf文件转成了txt格式的,无奈txt格式的没有目录结构,阅读查找起来实在是很不方便,于是又弄成了umd格式的,目录做到了每一章,呵呵,因为涉及到文件切割,编码问题,这个umd还是花了不少时间,当然好东西怎能一个人分享呢,下面是下载地址,喜欢的朋友可以留个脚印。
Think in java中文版

java学习笔记-快速排序原理及java实现

2008年4月6日 没有评论

快 速排序是对冒泡排序的一种改进。它的基本思想是:通过一躺排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一不部分的所有数据都要 小,然后再按次方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。最坏情况的时间复杂度为O(n2),最好 情况时间复杂度为O(nlog2n)。

   假设要排序的数组是A[1]……A[N],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一躺快速排序。一趟快速排序的算法是:

1)、设置两个变量I、J,排序开始的时候I:=1,J:=N;

2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1];

3)、从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换;

4)、从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换;

5)、重复第3、4步,直到I=J;

例如:待排序的数组A的值分别是:(初始关键数据X:=49)

                  A[1]    A[2]    A[3]    A[4]    A[5]     A[6]    A[7]:

                    49       38      65      97      76      13       27

进行第一次交换后: 27       38      65      97      76      13       49

                  ( 按照算法的第三步从后面开始找)

进行第二次交换后: 27       38      49      97      76      13       65

                 ( 按照算法的第四步从前面开始找>X的值,65>49,两者交换,此时I:=3 )

进行第三次交换后: 27       38      13      97      76      49       65

( 按照算法的第五步将又一次执行算法的第三步从后开始找)

进行第四次交换后: 27       38      13      49      76      97       65

( 按照算法的第四步从前面开始找大于X的值,97>49,两者交换,此时J:=4 )

     此时再执行第三步的时候就发现I=J,从而结束一躺快速排序,那么经过一躺快速排序之后的结果是:27       38      13      49      76      97       65,即所以大于49的数全部在49的后面,所以小于49的数全部在49的前面。

     快速排序就是递归调用此过程——在以49为中点分割这个数据序列,分别对前面一部分和后面一部分进行类似的快速排序,从而完成全部数据序列的快速排序,最后把此数据序列变成一个有序的序列,根据这种思想对于上述数组A的快速排序的全过程如图6所示:

初始状态                       {49    38    65    97    76    13    27}   

进行一次快速排序之后划分为     {27    38    13}    49 {76    97    65}

分别对前后两部分进行快速排序   {13}   27   {38}

                               结束        结束   {49   65}   76   {97}

                                                   49 {65}        结束

                                                       结束

                         图6   快速排序全过程

1)、设有N(假设N=10)个数,存放在S数组中;

2)、在S[1。。N]中任取一个元素作为比较基准,例如取T=S[1],起目的就是在定出 T应在排序结果中的位置K,这个K的位置在:S[1。。K-1]<=S[K]<=S[K+1..N],即在S[K]以前的数都小于S[K], 在S[K]以后的数都大于S[K];

3)、利用分治思想(即大化小的策略)可进一步对S[1。。K-1]和S[K+1。。N]两组数据再进行快速排序直到分组对象只有一个数据为止。

如具体数据如下,那么第一躺快速排序的过程是:

数组下标: 1     2     3     4     5     6     7     8     9     10

          45    36    18    53    72    30    48    93    15     36

           I                                                        J

(1)     36    36    18    53    72    30    48    93    15     45

(2)     36    36    18    45    72    30    48    93    15     53

(3)     36    36    18    15    72    30    48    93    45     53

(4)     36    36    18    15    45    30    48    93    72     53

(5)     36    36    18    15    30    45    48    93    72     53

通过一躺排序将45放到应该放的位置K,这里K=6,那么再对S[1。。5]和S[6。。10]分别进行快速排序。

    /**

    * 交换指定数组a的两个变量的值

    * @param a 数组应用

    * @param i 数组下标

    * @param j 数组下标

    */

    public static void swap(int a[], int i, int j) {

       

        if(i == j) return;

        int tmp = a[i];

        a[i] = a[j];

        a[j] = tmp;

    }

    /**

    *

    * @param array 待排序数组

    * @param low 数组下标下界

    * @param high 数组下标上界

    * @return pivot

    */

    public static int partition(int array[], int low, int high) {

        //当前位置为第一个元素所在位置

        int p_pos = low;

        //采用第一个元素为轴

        int pivot = array[p_pos];

        

        for (int i = low + 1; i <= high; i++) {

            if (array[i] < pivot) {            

               

                p_pos++;

                swap(array, p_pos, i);

            }

        }

        swap(array, low, p_pos);

        return p_pos;

    }

    /**

     * 快速排序实现

     * @param array

     * @param low

     * @param high

     */

    public static void quickSort(int array[], int low, int high) {

        if (low < high) {

            int pivot = partition(array, low, high);

            quickSort(array, low, pivot – 1);

            quickSort(array, pivot + 1, high);

        }

    }v

分类: 全部文章, 学习笔记 标签:

java学习笔记-构建器的调用顺序

2008年4月5日 没有评论
        用于基础类的构建器肯定在一个衍生类的构建器中调用,而且逐渐向上链接,使每个基础类使用的构建器都能得到调用。之所以要这样做,是由于构建器负有一项特殊任务:检查对象是否得到了正确的构建。一个衍生类只能访问它自己的成员,不能访问基础类的成员(这些成员通常都具有private 属性)。只有基础类的构建器在初始化自己的元素时才知道正确的方法以及拥有适当的权限。所以,必须令所有构建器都得到调用,否则整个对象的构建就可能不正确。那正是编译器为什么要强迫对衍生类的每个部分进行构建器调用的原因。在衍生类的构建器主体中,若我们没有明确指定对一个基础类构建器的调用,它就会“默默”地调用默认构建器。如果不存在默认构建器,编译器就会报告一个错误(若某个类没有构建器,编译器会自动组织一个默认构建器)。

下面让我们看看一个例子,它展示了按构建顺序进行合成、继承以及多形性的效果:

//: Sandwich.java
// Order of constructor calls
class Meal {
Meal() { System.out.println(“Meal()”); }
}
class Bread {
Bread() { System.out.println(“Bread()”); }
}

class Cheese {
Cheese() { System.out.println(“Cheese()”); }
}

class Lettuce {
Lettuce() { System.out.println(“Lettuce()”); }
}

class Lunch extends Meal {
Lunch() { System.out.println(“Lunch()”);}
}

class PortableLunch extends Lunch {
PortableLunch() {
System.out.println(“PortableLunch()”);
}
}

class Sandwich extends PortableLunch {
Bread b = new Bread();
Cheese c = new Cheese();
Lettuce l = new Lettuce();

Sandwich() {
System.out.println(“Sandwich()”);
}

public static void main(String[] args) {
new Sandwich();
}
} ///:

这个例子在其他类的外部创建了一个复杂的类,而且每个类都有一个构建器对自己进行了宣布。其中最重要

的类是Sandwich,它反映出了三个级别的继承(若将从Object的默认继承算在内,就是四级)以及三个成

员对象。在 main()里创建了一个Sandwich 对象后,输出结果如下:

Meal()

Lunch()

PortableLunch()

Bread()

Cheese()

Lettuce()

Sandwich()

这意味着对于一个复杂的对象,构建器的调用遵照下面的顺序:

(1) 调用基础类构建器。这个步骤会不断重复下去,首先得到构建的是分级结构的根部,然后是下一个衍生类,等等。直到抵达最深一层的衍生类。

(2) 按声明顺序调用成员初始化模块。

(3) 调用衍生构建器的主体。

构建器调用的顺序是非常重要的。进行继承时,我们知道关于基础类的一切,并且能访问基础类的任何public和protected 成员。这意味着当我们在衍生类的时候,必须能假定基础类的所有成员都是有效的。采用一种标准方法,构建行动已经进行,所以对象所有部分的成员均已得到构建。但在构建器内部,必须保证使用的所有成员都已构建。为达到这个要求,唯一的办法就是首先调用基础类构建器。然后在进入衍生类构建器以后,我们在基础类能够访问的所有成员都已得到初始化。此外,所有成员对象(亦即通过合成方法置于类内的对象)在类内进行定义的时候(比如上例中的b,c 和l),由于我们应尽可能地对它们进行初始化,所以也应保证构建器内部的所有成员均为有效。若坚持按这一规则行事,会有助于我们确定所有基础类成员以及当前对象的成员对象均已获得正确的初始化。

分类: 全部文章, 学习笔记 标签: