struts2.1 + spring 3.1 + hibernate 4.1.4 集成
使用以下jar包。
myeclipse2014版本自带这些包。eclipse推荐使用maven管理jar包,方便使用。
antlr-2.7.7.jar
aopalliance-1.0.jar
asm-3.1.jar
aspectjweaver-1.6.9.jar
c3p0-0.9.1.2.jar
cglib-nodep-2.2.jar
classworlds-1.1.jar
commons-beanutils-1.7.0.jar
commons-chain-1.2.jar
commons-collections-3.2.jar
commons-dbcp-1.4.jar
commons-digester-2.0.jar
commons-fileupload-1.2.1.jar
commons-httpclient-3.1.jar
commons-io-1.3.2.jar
commons-lang-2.5.jar
commons-logging-1.1.1.jar
commons-logging-api-1.1.jar
commons-pool-1.5.3.jar
commons-validator-1.3.1.jar
dom4j-1.6.1.jar
freemarker-2.3.16.jar
hibernate-commons-annotations-4.0.1.Final.jar
hibernate-core-4.1.4.Final.jar
hibernate-entitymanager-4.1.4.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.15.0-GA.jar
javassist-3.7.ga.jar
javax.servlet.jsp.jstl.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.0.Final.jar
jersey-core-1.4.jar
jersey-server-1.4.jar
json-lib-2.1-jdk15.jar
jsr311-api-1.1.1.jar
jstl-impl.jar
log4j-1.2.16.jar
mysql-connector-java-5.1.13.jar
ognl-3.0.jar
org.springframework.aop-3.1.1.RELEASE.jar
org.springframework.asm-3.1.1.RELEASE.jar
org.springframework.aspects-3.1.1.RELEASE.jar
org.springframework.beans-3.1.1.RELEASE.jar
org.springframework.context-3.1.1.RELEASE.jar
org.springframework.context.support-3.1.1.RELEASE.jar
org.springframework.core-3.1.1.RELEASE.jar
org.springframework.expression-3.1.1.RELEASE.jar
org.springframework.instrument-3.1.1.RELEASE.jar
org.springframework.instrument.tomcat-3.1.1.RELEASE.jar
org.springframework.jdbc-3.1.1.RELEASE.jar
org.springframework.jms-3.1.1.RELEASE.jar
org.springframework.orm-3.1.1.RELEASE.jar
org.springframework.oxm-3.1.1.RELEASE.jar
org.springframework.transaction-3.1.1.RELEASE.jar
org.springframework.web-3.1.1.RELEASE.jar
org.springframework.web.portlet-3.1.1.RELEASE.jar
org.springframework.web.servlet-3.1.1.RELEASE.jar
org.springframework.web.struts-3.1.1.RELEASE.jar
oro-2.0.8.jar
proxool-0.9.1.jar
proxool-cglib.jar
slf4j-api-1.6.1.jar
sslext-1.2-0.jar
struts2-convention-plugin-2.2.1.jar
struts2-core-2.2.1.jar
struts2-embeddedjsp-plugin-2.2.1.jar
struts2-json-plugin-2.2.1.jar
struts2-spring-plugin-2.2.1.jar
xwork-core-2.2.1.jar
配置:
web.xml
加入spring ContextLoaderListener 监听和struts2 StrutsPrepareAndExecuteFilter 过滤器
<?xml version="1.0" encoding="UTF-8"?>
<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 [url]http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd[/url]" version="3.0">
<display-name>weiwo</display-name>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
</web-app>
applicationContext.xml 其中action service dao都分开管理
<?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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans-3.1.xsd[/url]">
<import resource="applicationContext-action.xml" />
<import resource="applicationContext-service.xml" />
<import resource="applicationContext-dao.xml" />
</beans>
struts.xml struts的action交由spring管理。所以一定要使用struts2-spring-plugin-2.2.1.jar插件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd" >
<struts>
<!-- 开启使用开发模式,详细错误提示 -->
<constant name="struts.devMode" value="true" />
<!-- 指定资源编码 -->
<constant name="struts.i18n.encoding" value="UTF-8" />
<!-- 默认后缀名 -->
<constant name="struts.action.extension" value="action" />
<!-- 将对象交给spring管理 -->
<!-- <constant name="struts.objectFactory" value="spring" /> -->
<!-- <constant name="struts.objectFactory.spring.autoWire" value="name" /> -->
<!-- 设置Web应用的默认Locale为zh_CN -->
<constant name="struts.locale" value="zh_CN" />
<!-- struts配置文件更改后是否重新加载 -->
<constant name="struts.configuration.xml.reload" value="true" />
<!-- 设置浏览器是否缓存静态内容 -->
<constant name="struts.serve.static.browserCache" value="true" />
<package name="pan-default" extends="struts-default" namespace="/">
</package>
<!--这是一个测试action,class配置的不是类名,而是spring中对应bean的id-->
<package name="admin" namespace="/a" extends="pan-default">
<action name="user_*" class="test" method="{1}">
<result name="success">/page/test/test.jsp</result>
<result name="loginsuccess">/page/test/loginsuccess.jsp</result>
</action>
</package>
</struts>
applicationContext-action.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans-3.1.xsd[/url]">
<!--这里的bean是struts的action,id是struts中配置的class属性,scope一定要用prototype,而且最好加上autowire 属性,会自动注入依赖bean-->
<bean id="test" class="com.weiwo.billing.test.TestAction" scope="prototype" autowire="byName"/>
</beans>
jdbc.properties 配置一些属性,使用key value形式,可以在spring中引入。
proxool.maxConnCount=10
proxool.minConnCount=5
proxool.statistics=1m,15m,1h,1d
proxool.simultaneousBuildThrottle=30
proxool.trace=false
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/xjb?useUnicode=true&characterEncoding=utf8&autoReconnect=true&rewriteBatchedStatements=true
jdbc.username=root
jdbc.password=root
applicationContext-dao.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans-3.1.xsd[/url]">
<!-- 引入配置文件 -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:jdbc.properties</value>
</list>
</property>
</bean>
<!-- 数据源,使用的是proxool连接池 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
<property name="targetDataSource">
<bean class="org.logicalcobwebs.proxool.ProxoolDataSource">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="driverUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maximumConnectionCount" value="${proxool.maxConnCount}" />
<property name="minimumConnectionCount" value="${proxool.minConnCount}" />
<property name="statistics" value="${proxool.statistics}" />
<property name="simultaneousBuildThrottle" value="${proxool.simultaneousBuildThrottle}" />
<property name="trace" value="${proxool.trace}" />
</bean>
</property>
</bean>
<!--mappingDirectoryLocations属性可以直接部署一个目录下的所有 .hbm.xml文件,不需要一个一个定义。value为空时,会部署整个项目下的所有vo文件-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingDirectoryLocations">
<list>
<value></value>
</list>
</property>
<!--配置一些hibernate参数,如,显示sql,方言等等,如果hibernate3有一些类型不支持,可以使用自定义方言映射,貌似4里面不能了,不知道是不是要使用其它方法-->
<property name="hibernateProperties">
<value>
hibernate.dialect=com.weiwo.orm.base.MyselfSQLDialect
hibernate.show_sql=true
</value>
</property>
</bean>
<!--配置dao,hibernate3里面是使用继承 HibernateTemplate来使用的,但是hibernate4不再有这个,需要傅sessionFactory.getCurrentSession()来获取并使用-->
<bean id="dao" class="com.weiwo.orm.dao.base.GeneralDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
</beans>
applicationContext-service.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:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans [url]http://www.springframework.org/schema/beans/spring-beans-3.1.xsd[/url]">
<!-- hibernate事务类声名 -->
<bean id="hibernateTransactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- Spring代理事务 -->
<bean id="springTransactionProxyFactoryBean" abstract="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref bean="hibernateTransactionManager" />
</property>
<property name="transactionAttributes">
<props>
<prop key="create*">
PROPAGATION_REQUIRED,-java.lang.Exception
</prop>
<prop key="save*">
PROPAGATION_REQUIRED,-java.lang.Exception
</prop>
<prop key="remove*">
PROPAGATION_REQUIRED,-java.lang.Exception
</prop>
<prop key="update*">
PROPAGATION_REQUIRED,-java.lang.Exception
</prop>
<prop key="del*">
PROPAGATION_REQUIRED,-java.lang.Exception
</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
<!-- 基础service定义 -->
<bean id="service" class="com.weiwo.business.service.GeneralService" autowire="byName" />
<bean id="generalService" class="com.weiwo.business.service.GeneralService" autowire="byName" />
<!-- 其它service定义 -->
<bean id="userServiceImp" class="com.weiwo.business.service.user.imp.UserServiceImp" autowire="byName" />
<bean id="userService" parent="springTransactionProxyFactoryBean" autowire="byName">
<property name="target" ref="userServiceImp"></property>
</bean>
</beans>
再加上一个log4j的定义(详细定义见其它文章)
log4j.properties
log4j.rootCategory=INFO, stdout , R
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=[WO] %p [%t] %C.%M(%L) | %m%n
log4j.appender.R=org.apache.log4j.DailyRollingFileAppender
log4j.appender.R.DatePattern='.'yyyy-MM-dd
log4j.appender.R.File=/logs/weiwo_logs/notify-subscription.log
log4j.appender.R.layout=org.apache.log4j.PatternLayout
log4j.appender.R.layout.ConversionPattern=%d-[WO] %p %t %c - %m%n
log4j.appender.R.Append=true
到这里,所有的配置文件就定义完成了,到此需要做的就是测试一下是不是能用了。
测试需要新建数据库
users表
CREATE TABLE `users` (
`uid` mediumint(9) NOT NULL AUTO_INCREMENT,
`loginid` varchar(64) NOT NULL COMMENT '登录名',
`username` varchar(64) NOT NULL COMMENT '用户名,默认等于登录名,可修改',
`password` varchar(32) NOT NULL,
`realname` varchar(32) NOT NULL DEFAULT '',
`identity_card_number` varchar(18) NOT NULL DEFAULT '',
`email` varchar(64) NOT NULL DEFAULT '',
`avatarstatus` tinyint(1) NOT NULL DEFAULT '0',
`adminid` tinyint(1) NOT NULL DEFAULT '0',
`telephone` char(11) DEFAULT '',
PRIMARY KEY (`uid`),
UNIQUE KEY `loginid_index` (`loginid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Users.hbm.xml
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
<class name="com.weiwo.orm.vo.Users" table="users" catalog="xjb" dynamic-insert="true" dynamic-update="true">
<id name="uid" type="integer">
<column name="uid" />
<generator class="native"></generator>
</id>
<property name="loginid" type="string">
<column name="loginid" length="64" not-null="true" />
</property>
<property name="username" type="string">
<column name="username" length="64" not-null="true" />
</property>
<property name="password" type="string">
<column name="password" length="32" not-null="true" />
</property>
<property name="realname" type="string">
<column name="realname" length="32" not-null="false" />
</property>
<property name="identityCardNumber" type="string">
<column name="identity_card_number" length="18" not-null="false" />
</property>
<property name="email" type="string">
<column name="email" length="64" not-null="false" />
</property>
<property name="avatarstatus" type="boolean">
<column name="avatarstatus" not-null="false" />
</property>
<property name="adminid" type="boolean">
<column name="adminid" not-null="false" />
</property>
<property name="telephone" type="string">
<column name="telephone" length="11" not-null="false" />
</property>
</class>
</hibernate-mapping>
Users.java vo类
package com.weiwo.orm.vo;
import com.weiwo.orm.vo.base.GeneralVo;
/**
* users entity. @author MyEclipse Persistence Tools
*/
public class Users extends GeneralVo implements java.io.Serializable {
// Fields
private Integer uid;
private String loginid;
private String username;
private String password;
private String realname;
private String identityCardNumber;
private String email;
private boolean avatarstatus;
private boolean adminid;
private String telephone;
// Constructors
/** default constructor */
public Users() {
}
/** full constructor */
public Users(Integer uid, String loginid, String username, String password, String realname, String identityCardNumber, String email, boolean avatarstatus, boolean adminid,
String telephone) {
super();
this.uid = uid;
this.loginid = loginid;
this.username = username;
this.password = password;
this.realname = realname;
this.identityCardNumber = identityCardNumber;
this.email = email;
this.avatarstatus = avatarstatus;
this.adminid = adminid;
this.telephone = telephone;
}
// Property accessors
public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getLoginid() {
return loginid;
}
public void setLoginid(String loginid) {
this.loginid = loginid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getRealname() {
return realname;
}
public void setRealname(String realname) {
this.realname = realname;
}
public String getIdentityCardNumber() {
return identityCardNumber;
}
public void setIdentityCardNumber(String identityCardNumber) {
this.identityCardNumber = identityCardNumber;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public boolean getAvatarstatus() {
return avatarstatus;
}
public void setAvatarstatus(boolean avatarstatus) {
this.avatarstatus = avatarstatus;
}
public boolean getAdminid() {
return adminid;
}
public void setAdminid(boolean adminid) {
this.adminid = adminid;
}
public String getTelephone() {
return telephone;
}
public void setTelephone(String telephone) {
this.telephone = telephone;
}
}
Dao.java 这个只是接口,基础generalDao需要实现这个类,其它的dao要继承generalDao (service层同理)
package com.weiwo.orm.dao.base;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
/**
* A data access object (DAO) providing persistence and search support for T
* entities. Transaction control of the save(), update() and delete() operations
* can directly support Spring container-managed transactions or they can be
* augmented to handle user-managed Spring transactions. Each of these methods
* provides additional information for how to configure it for the desired type
* of transaction control.
*
* @see com.hibernate.voDao.T
* @author MyEclipse Persistence Tools
*/
public interface Dao<T> {
public T save();
public T delete(T instance);
public int executeBySql(String sql);
public int executeByHql(String hql);
public List getBySql(String sql);
public List getByHql(String hql);
public List<T> getByDetachedCriteria(DetachedCriteria dc);
}
GeneralDao.java 常用的方法都写在这个基础的dao里面,其它dao继承自此类
package com.weiwo.orm.dao.base;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.DetachedCriteria;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.weiwo.orm.vo.base.GeneralVo;
/**
* A data access object (DAO) providing persistence and search support for T
* entities. Transaction control of the save(), update() and delete() operations
* can directly support Spring container-managed transactions or they can be
* augmented to handle user-managed Spring transactions. Each of these methods
* provides additional information for how to configure it for the desired type
* of transaction control.
*
* @see com.hibernate.voDao.T
* @author MyEclipse Persistence Tools
*/
public class GeneralDao implements Dao<GeneralVo> {
private static final Logger log = LoggerFactory.getLogger(GeneralDao.class);
private SessionFactory sessionFactory;
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
/**
* @return
* @createTime 2014-11-22 下午9:33:57
*/
private Session getSession() {
return getSessionFactory().getCurrentSession();
}
@Override
public GeneralVo save() {
// TODO Auto-generated method stub
return null;
}
@Override
public GeneralVo delete(GeneralVo instance) {
// TODO Auto-generated method stub
return null;
}
@Override
public int executeBySql(String sql) {
// TODO Auto-generated method stub
return 0;
}
@Override
public int executeByHql(String hql) {
// TODO Auto-generated method stub
return 0;
}
@Override
public List getBySql(String sql) {
// TODO Auto-generated method stub
return null;
}
@Override
public List getByHql(String hql) {
// TODO Auto-generated method stub
return null;
}
@Override
public List<GeneralVo> getByDetachedCriteria(DetachedCriteria dc) {
return dc.getExecutableCriteria(getSession()).list();
}
}
UserDao.java 用户dao,用户操作处理,如果不需要做bo,则可以把常用的几个增删改查写入到基础dao里面,然后所有的service都调用它,不需要为每一个类都写一个dao,因为在一般不是很复杂的系统中,数据库操作都是相似,只是业务逻辑不同,可以在service层区分
/**
*
* @auther wuwang
* @createTime 2014-11-22 下午12:37:52
*/
package com.weiwo.orm.dao;
import com.weiwo.orm.dao.base.GeneralDao;
/**
*
*
* @author peaches
*/
public class UserDao extends GeneralDao {
}
Service.java 和 GeneralService.java都是空对象。测试的时候没写内容,这里就不贴出来了
UserService.java
/**
*
* @auther wuwang
* @createTime 2014-11-22 下午8:23:46
*/
package com.weiwo.business.service.user;
/**
*
*
* @author peaches
*/
public interface UserService {
public String login(String loginid, String password);
}
UserServiceImp.java
/**
*
* @auther wuwang
* @createTime 2014-11-22 下午8:23:46
*/
package com.weiwo.business.service.user.imp;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import com.weiwo.business.service.GeneralService;
import com.weiwo.business.service.user.UserService;
import com.weiwo.orm.dao.base.Dao;
import com.weiwo.orm.vo.Users;
/**
*
*
* @author peaches
*/
public class UserServiceImp extends GeneralService implements UserService {
Dao dao;
public Dao getDao() {
return dao;
}
public void setDao(Dao dao) {
this.dao = dao;
}
@Override
public String login(String loginid, String password) {
DetachedCriteria dc = DetachedCriteria.forClass(Users.class);
dc.add(Restrictions.eq("loginid", loginid));
List<Users> list = getDao().getByDetachedCriteria(dc);
if (list != null && list.size() > 0 && list.get(0) != null) {
return list.get(0).getPassword();
}
return null;
}
}
TestAction.java
/**
*
* @auther wuwang
* @createTime 2014-11-18 ����10:52:34
*/
package com.weiwo.billing.test;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.weiwo.business.service.user.UserService;
/**
*
*
* @author peaches
*/
public class TestAction extends ActionSupport {
private String test;
private UserService userService;
private String username;
public String getTest() {
return test;
}
public void setTest(String test) {
this.test = test;
}
public UserService getUserService() {
return userService;
}
public void setUserService(UserService userService) {
this.userService = userService;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String me() {
test = "Spring+Struts+Success";
System.out.println(test);
System.out.println(ServletActionContext.getRequest().getServerName());
System.out.println(ServletActionContext.getRequest().getParameter("a"));
return "success";
}
public String login() {
String passwd = getUserService().login(getUsername(), "");
System.out.println("---" + passwd);
return test;
}
}
test.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'test.jsp' starting page</title>
</head>
<body>
${test} <br>
<s:property value="{#this.test}"/>
</body>
</html>
启动项目:
1. 浏览器输入:http://127.0.0.1:8080/项目名/a/user_me.action
可以看到输出
Spring+Struts+Success
[Spring+Struts+Success]
2. 浏览器输入:http://127.0.0.1:8080/项目名/a/user_login.action?usename=数据库里面的用户名
可以看到控制台输出的密码信息
到此就结束了~
希望能够帮到一些刚学习的人。
我的同学和我一起上班的,他说他现在还不能把ssh框架搭起来。我觉得这些都是很正常的。在忙碌的工作中,很少有时间去关注这个环境是怎么配置起来的,下班以后,也很少有人会再去做工作相关的事情,以前的我也不会。但是现在实在是太闲了,没有其它事情可以做,除了编程,貌似没有什么更好的事情可以做了,而且编程也是一件很快乐的事情。