写android有段时间了,感觉思维越写越狭窄,考虑问题越来越局限了,看不到一个项目整体的设计和构架,觉得很有必要多多写一些大型的框架性的东西来提高自己的视野。

从接触java到现在一年多了,在我的印象里,struts好像是用来接收请求然后处理,将处理结果在跳转到jsp上显示的;spring就是一个 大型的工厂,专门生产业务的类;hibernate就是负责和数据库勾结,然后提供数据的。惭愧啊,我居然从来都没有用过SSH三大框架,居然我也能鬼使 神差的工作了,而且工作了这么长时间了,趁现在空暇和还未在被公司开掉之前,赶紧学习学习,也为将来复习记录一笔。

工欲善其事,必先利其器。首先要把所有的jar文件找好,查了一下百度,发现需要的jar文件如下:

  1. <strong>*Spring2.5 jar文件</strong>
  2. dist\spring.jar
  3. dist\modules\spring-webmvc-struts.jar
  4. lib\jakarta-commons\commons-logging.jar
  5. lib\aspectj\aspectjweaver.jar、aspectjrt.jar
  6. lib\cglib\cglib-nodep-2.1_3.jar
  7. lib\j2ee\common-annotations.jar
  8. <strong>*Struts1.3 jar文件</strong>
  9. apps\struts-blank-1.3\WEB-INF\lib 下有所有的jar文件
  10. <strong>*Hibernate3.3 jar文件</strong>
  11. hibernate3.jar
  12. lib\required\*.jar
  13. lib\optional\ehcache-1.2.3.jar
  14. hibernate 注解安装包下的
  15. lib\test\slf4j-log4j12.jar
  16. Struts
  17. 下 载struts-1.3.8-lib.zip,需要使用到解压目录下的所有jar,建议把jstl-1.0.2.jar和standard- 1.0.2.jar更换为1.1版本。Spring中已经存在一个antlr-2.7.6.jar,所以把struts中的antlr- 2.7.2.jar删除,避免jar冲突。
  18. <strong>*数据库驱动jar</strong>

看到上面N多的jar是不是感觉脑袋都大了,上面列出来的只是为了让自己更明白到底使用了哪些东西?属于谁的?分别有什么用?如果你没有把它一个一个从下载好的包里面把它们挑选出来,那么就点击这里下载吧,这里我已经把上面所提到和未提到但是也需要的jar都选了出来。

当然,其他的比如Tomcat和jdk环境配置以及数据库神马的(说到数据库,因为我使用的是ubuntu系统,使用mysql数据库,一直用的是
一个叫emma的图标是一个海豚的图形管理工具,感觉用起来很不错,ubuntu软件中心就有的下,搜索关键字:mysql),我就不多说了。默认都是可
用的。

三大框架大体的整合思路应该是先写好spring,然后把hibernate弄进来,最后在写struts。在这里,就整一个小小的人员管理。好吧,整合开始!

1,新建一个web项目SSH,将上面下载的jar一股脑的放到WEB-INF中的lib目录下

2,在类路径下新建beans.xml文件,并且定义Person.java类,里面包含三个id,name,age字段

beans.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xsi:schemaLocation="http://www.springframework.org/schema/beans
  6. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
  7. <bean id="personService" class="com.pccw.service.impl.PersonServiceImpl"/>
  8. </beans>

Person.java:

  1. public class Person {
  2. private Integer id;
  3. private String name;
  4. private Integer age;
  5. public Person() {}
  6. public Person(String name,Integer age){
  7. this.name = name;
  8. this.age = age;
  9. }
  10. public Integer getId() {
  11. return id;
  12. }
  13. public void setId(Integer id) {
  14. this.id = id;
  15. }
  16. public String getName() {
  17. return name;
  18. }
  19. public void setName(String name) {
  20. this.name = name;
  21. }
  22. public Integer getAge() {
  23. return age;
  24. }
  25. public void setAge(Integer age) {
  26. this.age = age;
  27. }
  28. @Override
  29. public String toString() {
  30. return "name:"+this.name+",age:"+age;
  31. }
  32. }

3,定义一个接口PersonService,里面包含对人员的增删改查方法,并写一个实现类PersonServiceImpl来实现他

PersonService:

  1. public interface PersonService {
  2. public void save(Person person);
  3. public void delete(Integer personId);
  4. public void update(Person person);
  5. public Person getPerson(Integer personId);
  6. public List<Person> getPersons();
  7. }

PersonServiceImpl:

  1. public class PersonServiceImpl implements PersonService {
  2. private SessionFactory sessionFactory;
  3. @Override
  4. public void save(Person person) {
  5. }
  6. @Override
  7. public void delete(Integer personId) {
  8. }
  9. @Override
  10. public void update(Person person) {
  11. }
  12. @Override
  13. public Person getPerson(Integer personId) {
  14. return null;
  15. }
  16. @SuppressWarnings("unchecked")
  17. @Override
  18. public List<Person> getPersons() {
  19. return null;
  20. }
  21. }

4,加入hibernate的一些元素,在2中定义好的beans.xml中加入数据源,hinernate的SessionFactory,hinernate的事务管理器,以及配置注解和各种的命名空间地址

beans.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:context="http://www.springframework.org/schema/context"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  9. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
  10. http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  11. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
  12. <context:annotation-config />
  13. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
  14. <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
  15. <property name="url" value="jdbc:mysql://localhost:3306/duan?useUnicode=true&characterEncoding=UTF-8"/>
  16. <property name="username" value="root"/>
  17. <property name="password" value="19891126"/>
  18. <!-- 连接池启动时的初始值 -->
  19. <property name="initialSize" value="1"/>
  20. <!-- 连接池的最大值 -->
  21. <property name="maxActive" value="500"/>
  22. <!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
  23. <property name="maxIdle" value="2"/>
  24. <!--  最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请去一些连接,以免洪峰来时来不及申请 -->
  25. <property name="minIdle" value="1"/>
  26. </bean>
  27. <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  28. <property name="dataSource" ref="dataSource"/>
  29. <property name="mappingResources">
  30. <list>
  31. <value>com/pccw/damon/Person.hbm.xml</value>
  32. </list>
  33. </property>
  34. <property name="hibernateProperties">
  35. <value>
  36. hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
  37. hibernate.hbm2ddl.auto=update
  38. hibernate.show_sql=false
  39. hibernate.format_sql=false
  40. </value>
  41. </property>
  42. </bean>
  43. <bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  44. <property name="sessionFactory" ref="sessionFactory"/>
  45. </bean>
  46. <tx:annotation-driven transaction-manager="txManager"/>
  47. <bean id="personService" class="com.pccw.service.impl.PersonServiceImpl"/>
  48. </beans>

5,根据SessionFactory中的属性,还需要定义一个Person.hbm.xml文件,该文件为Person类与数据库中的表对应关系的一个文件

Person.hbm.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping package="com.pccw.damon">
  6. <class name="Person" table="person">
  7. <id name="id">
  8. <generator class="native"/>
  9. </id>
  10. <property name="name" length="20" not-null="true"/>
  11. <property name="age" type="integer" not-null="true"/>
  12. </class>
  13. </hibernate-mapping>

可以看到该文件对应的数据库中的表为person,三个字段。

6,当上面的步骤都完成之后,在第3步中的实现类PersonServiceImpl中补全所有的方法

PersonServiceImpl:

  1. @Transactional  //事务注解
  2. public class PersonServiceImpl implements PersonService {
  3. @Resource private SessionFactory sessionFactory;  //注解注入
  4. @Override
  5. public void save(Person person) {
  6. sessionFactory.getCurrentSession().persist(person);
  7. }
  8. @Override
  9. public void delete(Integer personId) {
  10. sessionFactory.getCurrentSession().delete(sessionFactory.getCurrentSession().load(Person.class, personId));
  11. }
  12. @Override
  13. public void update(Person person) {
  14. sessionFactory.getCurrentSession().merge(person);
  15. }
  16. @Override
  17. public Person getPerson(Integer personId) {
  18. return (Person)sessionFactory.getCurrentSession().get(Person.class, personId);
  19. }
  20. @SuppressWarnings("unchecked")
  21. @Override
  22. public List<Person> getPersons() {
  23. return (List<Person>)sessionFactory.getCurrentSession().createQuery("from Person").list();  //这里的Person为大写的P,及第5步里面的class的name
  24. }
  25. }

7,确定无误之后,测试一下spring于hibernate的整合效果,新建一个测试单元SSHTest.java,测试PersonServiceImpl中的所有的方法。

  1. public class SHTest {
  2. private static PersonService personService;
  3. @BeforeClass
  4. public static void setUpBeforeClass() throws Exception {
  5. ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");    //实例化spring容器
  6. personService = (PersonService)ctx.getBean("personService");                 //得到PersonService
  7. }
  8. @Test
  9. public void testSave() {
  10. for(int i = 0;i<10;i++){
  11. personService.save(new Person("canmeng"+(i+1),20+i));
  12. }
  13. }
  14. @Test
  15. public void testDelete() {
  16. personService.delete(1);
  17. }
  18. @Test
  19. public void testUpdate() {
  20. Person person = personService.getPerson(2);
  21. person.setName("canmeng2");
  22. person.setAge(21);
  23. personService.update(person);
  24. }
  25. @Test
  26. public void testGetPerson() {
  27. System.out.println(personService.getPerson(2).toString());
  28. }
  29. @Test
  30. public void testGetPersons() {
  31. List<Person> list = personService.getPersons();
  32. for(Person person : list){
  33. System.out.println(person.toString());
  34. }
  35. }
  36. }

8,以上测试无误后,开始整合struts,在web.xml中注册spring配置文件,也就是在web容器中实例化spring容器,并在web.xml中指定struts的Servlet和请求格式

web.xml:

  1. <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  2. <display-name>SSH</display-name>
  3. <!-- 指定spring的配置文件,默认从web根目录寻找配置文件,我们可以通过spring提供的classpath:前缀指定从类路径下寻找 -->
  4. <context-param>
  5. <param-name>contextConfigLocation</param-name>
  6. <param-value>classpath:beans.xml</param-value>
  7. </context-param>                                                                                                                                          <!-- 对Spring容器进行实例化 -->
  8. <listener>
  9. <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  10. </listener>
  11. <servlet>
  12. <servlet-name>action</servlet-name>
  13. <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  14. <init-param>
  15. <param-name>config</param-name>
  16. <param-value>/WEB-INF/struts-config.xml</param-value>
  17. </init-param>
  18. <load-on-startup>2</load-on-startup>
  19. </servlet>
  20. <servlet-mapping>
  21. <servlet-name>action</servlet-name>
  22. <url-pattern>*.do</url-pattern>
  23. </servlet-mapping>
  24. </web-app>

9,从上面的配置文件中可以看出,需要在WEB-INF目录下建立struts-config.xml的配置文件,在这里,整合struts有三种方法,先讲第一种。

struts-config.xml:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE struts-config PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
  4. "http://struts.apache.org/dtds/struts-config_1_3.dtd">
  5. <struts-config>
  6. <span style="white-space:pre">  </span><form-beans>
  7. </form-beans>
  8. <span style="white-space:pre">  </span><action-mappings>
  9. <span style="white-space:pre">      </span><action path="/person/list" type="com.pccw.action.PersonAction">
  10. <span style="white-space:pre">          </span><forward name="list" path="/WEB-INF/page/personlist.jsp"></forward>
  11. <span style="white-space:pre">      </span></action>
  12. <span style="white-space:pre">  </span></action-mappings>
  13. <span style="white-space:pre">  </span>
  14. </struts-config>

可以看到访问路径/person/list,对应的Action为PersonAction,跳转的jsp为WEB-INF下的page目录下的personlist.jsp

10,web.xml定义好之后,着手写Action,定义PersonAction,继承Action,实现其中的excute方法,这里要小
鑫,excute在这里有两个方法,需要实现方法里面参数是HttpServletRequest request,
HttpServletResponse response的才能接收到请求

PersonAction:

  1. public class PersonAction extends Action {
  2. @Override
  3. public ActionForward execute(ActionMapping mapping, ActionForm form,
  4. HttpServletRequest request, HttpServletResponse response)
  5. throws Exception {                                                                                                                 //---------------------------------------  1  ---------------------------------------------------------------
  6. System.out.println("request come ~~~~~");
  7. WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());    //为了获得业务服务,使用 WebApplicationContextUtils获得一个 ApplicationContext。可以查找一个 Spring bean。
  8. PersonService personService = (PersonService)ctx.getBean("personService");
  9. request.setAttribute("persons", personService.getPersons());
  10. System.out.println("get size:"+personService.getPersons().size());
  11. return mapping.findForward("list");
  12. }
  13. }


显然,这种写法简单并且易于理解。不幸的是,它将 Struts 动作与 Spring 框架耦合在一起。如果您想替换掉
Spring,那么您必须重写代码。并且,由于 Struts 动作不在 Spring 的控制之下,所以它不能获得 Spring AOP
的优势。当使用多重独立的 Spring 环境时,这种技术可能有用,但是在大多数情况下,这种方法不如另外两种方法合适。
于是,第二种方式就是可以把Action也交给spring容器来管理,通过把业务bean注入的方式注入到Action中,这样可以大大的简化Action,而且可以使得struts和spring解耦。第9步中的struts-config可以改成如下:

  1. <struts-config>
  2. <form-beans>
  3. </form-beans>
  4. <action-mappings>
  5. <action path="/person/list" type="org.springframework.web.struts.DelegatingActionProxy">
  6. <forward name="list" path="/WEB-INF/page/personlist.jsp"></forward>
  7. </action>
  8. </action-mappings>
  9. </struts-config>

DelegatingActionProxy这个类的作用就是在struts接收到请求之后,会直接交给spring容器处理,spring容器会
根据一开是就在beans.xml中注册的bean来寻找是否对应的bean,beans.xml中一开始需要把Action注册进去:

beans.xml中加入:

  1. <bean name="/person/list" class="com.pccw.action.PersonAction"/>

这里的name必须跟签名struts-config中的path规则一样,当beans.xml中这样配置之后,根据name属性找到该bean,就可以产生相应的Action对象,于是Action中的代码可以改成:

PersonAction.java:

  1. public class PersonAction extends Action {
  2. @Resource private PersonService personService;  //注解注入
  3. @Override
  4. public ActionForward execute(ActionMapping mapping, ActionForm form,
  5. HttpServletRequest request, HttpServletResponse response)
  6. throws Exception {
  7. //------------------------------  1 ---------------------------------------------
  8. //      System.out.println("request come ~~~~~");
  9. //      WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(this.getServlet().getServletContext());
  10. //      PersonService personService = (PersonService)ctx.getBean("personService");
  11. //      request.setAttribute("persons", personService.getPersons());
  12. //      System.out.println("get size:"+personService.getPersons().size());
  13. //      return mapping.findForward("list");
  14. // ------------------------------ 2 ---------------------------------------------
  15. request.setAttribute("persons", personService.getPersons());
  16. return mapping.findForward("list");
  17. }
  18. }

第三种方式跟第二种差不多,在struts-config.xml中加入一个控制器属性:

struts-config.xml:

  1. <struts-config>
  2. <form-beans>
  3. </form-beans>
  4. <action-mappings>
  5. <action path="/person/list">
  6. <forward name="list" path="/WEB-INF/person/person_list.jsp" />
  7. </action>
  8. </action-mappings>
  9. <controller processorClass="org.springframework.web.struts.DelegatingRequestProcessor"/>
  10. <message-resources parameter="MessageResources" />
  11. </struts-config>

其作用跟第二种方式中的type类差不多,其他的配置和第二种方式一样,这样的方式称为:动作委托方式。

11,当上面的配置都完成之后,把jsp准备好:

personlist.jsp:

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
  2. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
  4. <html>
  5. <head>
  6. <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  7. <title>人员列表</title>
  8. </head>
  9. <body>
  10. <c:forEach items="${persons}" var="person">
  11. id=${person.id },name=${person.name },age=${person.age}<br>
  12. </c:forEach>
  13. </body>
  14. </html>

12,启动tomcat,把项目加载进去,打开浏览器,输入:http://localhost:8080/SSH/person/list.do,便可以在页面上看到所有的数据库中的数据了。(这里只实现了查询数据库所有数据的功能)。

web学习:Spring2.5+Hibernate3.3+Struts1.3整合小例子的更多相关文章

  1. Java Web 学习路线

    实际上,如果时间安排合理的话,大概需要六个月左右,有些基础好,自学能力强的朋友,甚至在四个月左右就开始找工作了.大三的时候,我萌生了放弃本专业的念头,断断续续学 Java Web 累计一年半左右,总算 ...

  2. Web学习之css

    CSS指层叠样式表(Cascading Style Sheets),CSS 是标准的布局语言,用来控制元素的尺寸.颜色.排版.CSS 由 W3C 发明,用来取代基于表格的布局.框架以及其他非标准的表现 ...

  3. web学习第一章

    web学习第一章   我是大概9月10日开始走上IT之路的,一开始学习了小段时间的自动化办公软件, 昨天我开始学习客户端网页编程,我了解什么是WEB,一些比较老古董的计算模式和发展历史,印象最让我深刻 ...

  4. [原创]java WEB学习笔记95:Hibernate 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. Java Web学习系列——Maven Web项目中集成使用Spring、MyBatis实现对MySQL的数据访问

    本篇内容还是建立在上一篇Java Web学习系列——Maven Web项目中集成使用Spring基础之上,对之前的Maven Web项目进行升级改造,实现对MySQL的数据访问. 添加依赖Jar包 这 ...

  6. Java Web学习系列——Maven Web项目中集成使用Spring

    参考Java Web学习系列——创建基于Maven的Web项目一文,创建一个名为LockMIS的Maven Web项目. 添加依赖Jar包 推荐在http://mvnrepository.com/.h ...

  7. Java web 学习之旅

    java web学习之旅 来公司十天了,感觉已经慢慢地融入了这个环境中,几个学长人都很好,都是在他们帮助下,我才能比较顺利的开始了学习java web的旅途. 来这里学习的第一个阶段是做一个简单的用户 ...

  8. [原创]java WEB学习笔记75:Struts2 学习之路-- 总结 和 目录

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  9. [原创]java WEB学习笔记66:Struts2 学习之路--Struts的CRUD操作( 查看 / 删除/ 添加) 使用 paramsPrepareParamsStack 重构代码 ,PrepareInterceptor拦截器,paramsPrepareParamsStack 拦截器栈

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

随机推荐

  1. Ubuntu+Django+mod_wsgi+Apache配置过程

    Ubuntu15.10 Apache2.4( sudo apt-get install apache2 ) Python3.4( sudo apt-get install apache2 ),  [系 ...

  2. Struts2如何传值到jsp页面

    Struts2如何传值到jsp页面 不是action传值到jsp页面,而是jsp页面获取action中的属性值,或者范围(如request,session,application等)里的值.所以,有两 ...

  3. HDU 5765 Bonds

    比赛时候想了好久,不会.看了官方题解才会...... Bond是极小割边集合,去掉一个Bond之后,只会将原图分成两个连通块. 假设某些点构成的集合为 s(点集中的点进行状压后得到的一个十进制数),那 ...

  4. Windows进程间通信(上)

    一.管道 管道(pipe)是用于进程间通信的共享内存区域.创建管道的进程称为管道服务器,而连接到这个管道的进程称为管道客户端.一个进程向管道写入信息,而另外一个进程从管道读取信息. 异步管道是基于字符 ...

  5. TCP/IP,http,socket,长连接,短连接

    TCP/IP TCP/IP是个协议组,可分为三个层次:网络层.传输层和应用层. 在网络层有IP协议.ICMP协议.ARP协议.RARP协议和BOOTP协议. 在传输层中有TCP协议与UDP协议. 在应 ...

  6. MFC中获取系统当前时间

    1.使用CTime类 CString str; //获取系统时间 CTime tm; tm=CTime::GetCurrentTime(); str=tm.Format("现在时间是%Y年% ...

  7. MFC中修改默认启动对话框方法

    // CMyAppEApp 初始化 BOOL CMyAppEApp::InitInstance(){// 如果一个运行在 Windows XP 上的应用程序清单指定要// 使用 ComCtl32.dl ...

  8. 关于prototype属性的理解

    众所周知,prototype是一个属性对象,只要创建一个新函数,就会根据特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象.在默认情况下,所有原型对象都会自动获得一个cons ...

  9. kindle使用参考

    转载链接:http://blog.sina.com.cn/nuanfengjia 今天买的kindle499刚刚到货了,体验略差,还有一个就是无按键,完全不会玩,只能自己慢慢摸索了. [新Kindle ...

  10. log4cxx 使用代码进行配置

    (1)官网的一个例子 #include <log4cxx/logger.h> #include <log4cxx/helpers/pool.h> #include <lo ...