这种是什么怎样字体变大

springSide3框架的笔记
我的图书馆
springSide3框架的笔记
首先,从官网下载的springSide3并不具备我所需要的jar包,几个列子和我的编写习惯有很大冲突。
仔细观察目录结构发现无法像struts2.0一样,把列子改一下就可以架设成功了。
没办法,下载包用处不是很大,还是看文档把——http://wiki./display/springside3/Home。
在文档中,首先看到了“快速开发指南”,进去看看。
一键式安装,唉,没兴趣,看看别的。
还是看看“完全技术参考手册”吧,进去后看到。
3&企业服务
4.常见事项
5 开发过程
不用说先看看前四项把,只是看看而已。
好了,5分钟到了 看完了把。开始实践把。
开始看第五项“
重点在这里:
1. SpringSide风格项目
&&& SpringSide使用
进行项目生成,新版的archetype2.0插件比以往有了大幅提升。
&&& SpringSide3.0在archtypes目录里存放使用Velocity语法的项目模板。
&&& 新生成的项目中将包含保证能跑起来的项目骨架、配置文件与示例代码。
二、预要求
设置环境变量JAVA_HOME指向JDK5.0安装目录。
(all in one版已自带),并在环境变量PATH中添加 maven下载目录/bin。
初始化SpringSide,双击bin/install.bat安装springside-core.jar 和两个archetype项目。
双击bin/new-project.bat,按提示输入参数。
在tools/generator/generated-project目录下将生成新项目。
进行必要的配置,如修改数据源,参考
将项目加入版本管理系统向团队分发项目。
&&&&&& 如果不打算在团队中使用maven,使用copy-jar.bat命令初始化依赖的jar到/webapp/WEB-INF/lib中,并将这些jar加入版本管理系统。&
五、生成结果
maven的pom.xml 及maven格式的目录结构。
Eclipse 3.4.1 for JavaEE 项目文件,含符合maven格式的目录设置,UTF-8及JDK1.5设置等。
配置文件范例
源代码范例
SpringSide使用
进行项目生成的,不过我可不喜欢用
开发项目,没办法先生成个例子项目把(Struts真好,复制,粘贴,项目就是我的了 哈哈)。
按照步骤三的方法,经过漫长的等待,终于生成了一个例子项目。
导入到eclipse,晕死 目录还真乱,我要改造他,当然也可以不改造,我只是想让他看起来更舒服。
刚生成时的目录结构:
改造后的目录结构。
好了,顺眼了,看看他都有什么东西吧。
1.user增删改差示例。
2.权限的示例。
先不管这些,先看看配置文件:
1.applicationContext.xml
&version="1.0"&encoding="UTF-8"&&
&xmlns="http://www.springframework.org/schema/beans"&xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&&
&&&&xmlns:jee="http://www.springframework.org/schema/jee"&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.5.xsd&http://www.springframework.org/schema/tx&http://www.springframework.org/schema/tx/spring-tx-2.5.xsd&http://www.springframework.org/schema/jee&http://www.springframework.org/schema/jee/spring-jee-2.5.xsd&http://www.springframework.org/schema/context&http://www.springframework.org/schema/context/spring-context-2.5.xsd"&&
&&&&default-lazy-init="true"&&
&&&&Spring公共配置文件&&
&&&&&class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&&
&&&&&&&&&name="systemPropertiesModeName"&value="SYSTEM_PROPERTIES_MODE_OVERRIDE"&&&
&&&&&&&&&name="ignoreResourceNotFound"&value="true"&&&
&&&&&&&&&name="locations"&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&classpath:application.properties&&
&&&&&&&&&&&&&&&&classpath:application.local.properties&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&base-package="cn.xxn"&&&
&&&&&id="dataSource"&class="org.springframework.jdbc.datasource.DriverManagerDataSource"&&
&&&&&&&&&name="driverClassName"&value="org.gjt.mm.mysql.Driver"&&&
&&&&&&&&&name="url"&value="jdbc:mysql://localhost:3306/FMS?generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=UTF-8"&&&
&&&&&&&&&name="username"&value="root"&&&
&&&&&&&&&name="password"&value="123456"&&&
&&&&&id="sessionFactory"&class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&&
&&&&&&&&&name="dataSource"&ref="dataSource"&&&
&&&&&&&&&name="namingStrategy"&&
&&&&&&&&&&&&&class="org.hibernate.cfg.ImprovedNamingStrategy"&&&
&&&&&&&&&&
&&&&&&&&&name="hibernateProperties"&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&key="hibernate.dialect"org.hibernate.dialect.MySQLDialect&&
&&&&&&&&&&&&&&&&&key="hibernate.show_sql"${hibernate.show_sql}&&
&&&&&&&&&&&&&&&&&key="hibernate.cache.provider_class"org.hibernate.cache.EhCacheProvider&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&key="hibernate.cache.provider_configuration_file_resource_path"${hibernate.ehcache_config_file}&&
&&&&&&&&&&&&&&&&&key="hibernate.hbm2ddl.auto"update&&
&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&name="packagesToScan"&value="cn.xxn.entity.*"&&&
&&&&&id="transactionManager"&class="org.springframework.orm.hibernate3.HibernateTransactionManager"&&
&&&&&&&&&name="sessionFactory"&ref="sessionFactory"&&&
&&&&&!--&&
&&&&&&&&&id="transactionManager"&class="org.springframework.transaction.jta.JtaTransactionManager&or&&
&&&&&&&&WebLogicJtaTransactionManager"&&&
&&&&&transaction-manager="transactionManager"&&&
&?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:jee="http://www.springframework.org/schema/jee" 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.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"
default-lazy-init="true"&
&description&Spring公共配置文件&/description&
&!-- 定义受环境影响易变的变量 --&
&bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"&
&property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /&
&property name="ignoreResourceNotFound" value="true" /&
&property name="locations"&
&value&classpath:application.properties&/value&
&value&classpath:application.local.properties&/value&
&!-- &value&file:/var/myapp/application.server.properties&/value& --&
&/property&
&!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 --&
&context:component-scan base-package="cn.xxn" /&
&!-- 数据源配置,在开发测试环境直连数据库 --&
&bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"&
&property name="driverClassName" value="org.gjt.mm.mysql.Driver" /&
&property name="url" value="jdbc:mysql://localhost:3306/FMS?generateSimpleParameterMetadata=true&useUnicode=true&characterEncoding=UTF-8" /&
&property name="username" value="root" /&
&property name="password" value="123456" /&
&!-- 数据源配置,在生产环境使用应用服务器的数据库连接池 --&
&!--&jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" /&--&
&!-- Hibernate配置 --&
&bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"&
&property name="dataSource" ref="dataSource" /&
&property name="namingStrategy"&
&bean class="org.hibernate.cfg.ImprovedNamingStrategy" /&
&/property&
&property name="hibernateProperties"&
&prop key="hibernate.dialect"&org.hibernate.dialect.MySQLDialect&/prop&
&prop key="hibernate.show_sql"&${hibernate.show_sql}&/prop&
&prop key="hibernate.cache.provider_class"&org.hibernate.cache.EhCacheProvider
&prop key="hibernate.cache.provider_configuration_file_resource_path"&${hibernate.ehcache_config_file}&/prop&
&prop key="hibernate.hbm2ddl.auto"&update&/prop&
&/property&
&property name="packagesToScan" value="cn.xxn.entity.*" /&
&!-- 事务管理器配置,单数据源事务 --&
&bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&
&property name="sessionFactory" ref="sessionFactory" /&
&!-- 事务管理器配置,多数据源JTA事务--&
&bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager or
WebLogicJtaTransactionManager" /&
&!-- 使用annotation定义事务 --&
&tx:annotation-driven transaction-manager="transactionManager" /&
&生成的很完美,我只需要改下数据源配置就可以了。
注意:在sessionFactory中
&name="packagesToScan"&value="cn.xxn.entity.*"&&&
&property name="packagesToScan" value="cn.xxn.entity.*" /&
恩,太爽了,这个目录下实体文件都会被映射,不用像以前一样添加实体了。这样一来,这个文件我们以后不用动他了。
2.struts.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"&&
&&&&&name="struts.convention.default.parent.package"&value="crud-default"&&&
&&&&&name="struts.convention.package.locators"&value="web"&&&
&&&&&name="crud-default"&extends="convention-default"&&
&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&&&&&name="crudStack"&&
&&&&&&&&&&&&&&&&&name="store"&&
&&&&&&&&&&&&&&&&&&&&&name="operationMode"AUTOMATIC&&
&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&&name="paramsPrepareParamsStack"&&&
&&&&&&&&&&&&&&
&&&&&&&&&&
&&&&&&&&&name="crudStack"&&&
&&&&&!--&&&
&&&&&&&&使用ZeroConfig&+&CodeBehind插件,实现约定大于配置的零配置文件风格.&&
&&&&&&&&&&&&&&&特殊的Result路径在Action类中使用@Result设定.&&&
&?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"&
&constant name="struts.convention.default.parent.package" value="crud-default" /&
&constant name="struts.convention.package.locators" value="web" /&
&package name="crud-default" extends="convention-default"&
&!-- 基于paramsPrepareParamsStack,增加store interceptor --&
&interceptors&
&interceptor-stack name="crudStack"&
&interceptor-ref name="store"&
&param name="operationMode"&AUTOMATIC&/param&
&/interceptor-ref&
&interceptor-ref name="paramsPrepareParamsStack" /&
&/interceptor-stack&
&/interceptors&
&default-interceptor-ref name="crudStack" /&
&/package&
使用ZeroConfig + CodeBehind插件,实现约定大于配置的零配置文件风格.
特殊的Result路径在Action类中使用@Result设定.
这个配置也很强大,在不用对Action进行配置了。
疑问1,如何跳转。简单,例如:UserAction中有方法
public&String&school()&throws&Exception&{&&
&&&&return&"school";&&
public String school() throws Exception {
return "school";
&他就会跳转到user-school.jsp中。
哪么为什么会这样呢?
你会在lib中发现struts2-convention-plugin-2.1.6.jar,没错就是他干的。怎么实现的?我怎么知道。
从struts2.1版本开始,Convention&Plugin作为替换替换Codebehind&Plugin来实现Struts2的零配置。&&
&&&&*&包命名习惯来指定Action位置&&
&&&&*&命名习惯制定结果(支持JSP,FreeMarker等)路径&&
&&&&*&类名到URL的约定转换&&
&&&&*&包名到命名空间(namespace)的约定转换&&
&&&&*&遵循SEO规范的链接地址(即:使用my-action&来替代&MyAction)&&
&&&&*&基于注解的Action名&&
&&&&*&基于注解的拦截机(Interceptor)&&
&&&&*&基于注解的命名空间(Nameespace)&&
&&&&*&基于注解的XWork包&&
&&&&*&默认action以及默认的结果(比如:/products&将会尝试寻找com.example.actions.Products&或&&
&com.example.actions.products.Index进行处理)&&
无需配置Convention即可使用Convention,Convention的某些约束习惯可以通过配置属性来控制,&&
您也可以在类中覆写其中的方法来达到扩展目地。&&
从struts2.1版本开始,Convention Plugin作为替换替换Codebehind Plugin来实现Struts2的零配置。
* 包命名习惯来指定Action位置
* 命名习惯制定结果(支持JSP,FreeMarker等)路径
* 类名到URL的约定转换
* 包名到命名空间(namespace)的约定转换
* 遵循SEO规范的链接地址(即:使用my-action 来替代 MyAction)
* 基于注解的Action名
* 基于注解的拦截机(Interceptor)
* 基于注解的命名空间(Nameespace)
* 基于注解的XWork包
* 默认action以及默认的结果(比如:/products 将会尝试寻找com.example.actions.Products 或
&com.example.actions.products.Index进行处理)
无需配置Convention即可使用Convention,Convention的某些约束习惯可以通过配置属性来控制,
您也可以在类中覆写其中的方法来达到扩展目地。
疑问2,我要是跳转到别的ACTION去,不到页面怎么办。
嘻嘻,当然可以,不过这些东西不会让你去改变配置文件的。
你可以写在这里:
@Results({&&&
&&&&@Result(name&=&CRUDActionSupport.RELOAD,&location&=&"user.action?page.pageParam=${page.pageParam}",&type&=&"redirect")&,&&
public&class&UserAction&extends&CRUDActionSupport&User&&{&&
@Results({
@Result(name = CRUDActionSupport.RELOAD, location = "user.action?page.pageParam=${page.pageParam}", type = "redirect") ,
public class UserAction extends CRUDActionSupport&User& {
&不要说你不知道这是什么位置。
你可以写多个
@Result(name&=&CRUDActionSupport.RELOAD1,&location&=&"user.action?page.pageParam=${page.pageParam}",&type&=&"redirect")&,&&
@Result(name&=&CRUDActionSupport.RELOAD2,&location&=&"user.action?page.pageParam=${page.pageParam}",&type&=&"redirect")&,&&
@Result(name = CRUDActionSupport.RELOAD1, location = "user.action?page.pageParam=${page.pageParam}", type = "redirect") ,
@Result(name = CRUDActionSupport.RELOAD2, location = "user.action?page.pageParam=${page.pageParam}", type = "redirect") ,
其中,name:方法的返回值。 location:跳转的方法或页面。
TA的最新馆藏SpringSide的Hibernate封装 - benx - ITeye技术网站
博客分类:
下面的代码是SpringSide的Hibernate简单封装,使用这个封装Dao层基本只需要声明,而不需要写任何代码(当然如果有复杂的SQl还是需要手写方法),对于查询的逻辑都可以放置Service.
package org.springside.modules.orm.
import java.io.S
import java.util.C
import java.util.L
import java.util.M
import org.hibernate.C
import org.hibernate.H
import org.hibernate.Q
import org.hibernate.S
import org.hibernate.SessionF
import org.hibernate.criterion.CriteriaS
import org.hibernate.criterion.C
import org.hibernate.criterion.O
import org.hibernate.criterion.R
import org.hibernate.metadata.ClassM
import org.slf4j.L
import org.slf4j.LoggerF
import org.springframework.beans.factory.annotation.A
import org.springframework.util.A
import org.springside.modules.utils.reflection.ReflectionU
* 封装Hibernate原生API的DAO泛型基类.
* 可在Service层直接使用, 也可以扩展泛型DAO子类使用, 见两个构造函数的注释.
* 参考Spring2.5自带的Petlinc例子, 取消了HibernateTemplate, 直接使用Hibernate原生API.
* @param &T& DAO操作的对象类型
* @param &PK& 主键类型
* @author calvin
@SuppressWarnings("unchecked")
public class SimpleHibernateDao&T, PK extends Serializable& {
protected Logger logger = LoggerFactory.getLogger(getClass());
protected SessionFactory sessionF
protected Class&T& entityC
* 用于Dao层子类使用的构造函数.
* 通过子类的泛型定义取得对象类型Class.
* public class UserDao extends SimpleHibernateDao&User, Long&
public SimpleHibernateDao() {
this.entityClass = ReflectionUtils.getSuperClassGenricType(getClass());
* 用于用于省略Dao层, 在Service层直接使用通用SimpleHibernateDao的构造函数.
* 在构造函数中定义对象类型Class.
* SimpleHibernateDao&User, Long& userDao = new SimpleHibernateDao&User, Long&(sessionFactory, User.class);
public SimpleHibernateDao(final SessionFactory sessionFactory, final Class&T& entityClass) {
this.sessionFactory = sessionF
this.entityClass = entityC
* 取得sessionFactory.
public SessionFactory getSessionFactory() {
return sessionF
* 采用@Autowired按类型注入SessionFactory, 当有多个SesionFactory的时候在子类重载本函数.
@Autowired
public void setSessionFactory(final SessionFactory sessionFactory) {
this.sessionFactory = sessionF
* 取得当前Session.
public Session getSession() {
return sessionFactory.getCurrentSession();
* 保存新增或修改的对象.
public void save(final T entity) {
Assert.notNull(entity, "entity不能为空");
getSession().saveOrUpdate(entity);
logger.debug("save entity: {}", entity);
* 删除对象.
* @param entity 对象必须是session中的对象或含id属性的transient对象.
public void delete(final T entity) {
Assert.notNull(entity, "entity不能为空");
getSession().delete(entity);
logger.debug("delete entity: {}", entity);
* 按id删除对象.
public void delete(final PK id) {
Assert.notNull(id, "id不能为空");
delete(get(id));
logger.debug("delete entity {},id is {}", entityClass.getSimpleName(), id);
* 按id获取对象.
public T get(final PK id) {
Assert.notNull(id, "id不能为空");
return (T) getSession().load(entityClass, id);
* 按id列表获取对象列表.
public List&T& get(final Collection&PK& ids) {
return find(Restrictions.in(getIdName(), ids));
获取全部对象.
public List&T& getAll() {
return find();
获取全部对象, 支持按属性行序.
public List&T& getAll(String orderByProperty, boolean isAsc) {
Criteria c = createCriteria();
if (isAsc) {
c.addOrder(Order.asc(orderByProperty));
c.addOrder(Order.desc(orderByProperty));
return c.list();
* 按属性查找对象列表, 匹配方式为相等.
public List&T& findBy(final String propertyName, final Object value) {
Assert.hasText(propertyName, "propertyName不能为空");
Criterion criterion = Restrictions.eq(propertyName, value);
return find(criterion);
* 按属性查找唯一对象, 匹配方式为相等.
public T findUniqueBy(final String propertyName, final Object value) {
Assert.hasText(propertyName, "propertyName不能为空");
Criterion criterion = Restrictions.eq(propertyName, value);
return (T) createCriteria(criterion).uniqueResult();
* 按HQL查询对象列表.
* @param values 数量可变的参数,按顺序绑定.
public &X& List&X& find(final String hql, final Object... values) {
return createQuery(hql, values).list();
* 按HQL查询对象列表.
* @param values 命名参数,按名称绑定.
public &X& List&X& find(final String hql, final Map&String, ?& values) {
return createQuery(hql, values).list();
* 按HQL查询唯一对象.
* @param values 数量可变的参数,按顺序绑定.
public &X& X findUnique(final String hql, final Object... values) {
return (X) createQuery(hql, values).uniqueResult();
* 按HQL查询唯一对象.
* @param values 命名参数,按名称绑定.
public &X& X findUnique(final String hql, final Map&String, ?& values) {
return (X) createQuery(hql, values).uniqueResult();
* 执行HQL进行批量修改/删除操作.
* @param values 数量可变的参数,按顺序绑定.
* @return 更新记录数.
public int batchExecute(final String hql, final Object... values) {
return createQuery(hql, values).executeUpdate();
* 执行HQL进行批量修改/删除操作.
* @param values 命名参数,按名称绑定.
* @return 更新记录数.
public int batchExecute(final String hql, final Map&String, ?& values) {
return createQuery(hql, values).executeUpdate();
* 根据查询HQL与参数列表创建Query对象.
* 与find()函数可进行更加灵活的操作.
* @param values 数量可变的参数,按顺序绑定.
public Query createQuery(final String queryString, final Object... values) {
Assert.hasText(queryString, "queryString不能为空");
Query query = getSession().createQuery(queryString);
if (values != null) {
for (int i = 0; i & values. i++) {
query.setParameter(i, values[i]);
* 根据查询HQL与参数列表创建Query对象.
* 与find()函数可进行更加灵活的操作.
* @param values 命名参数,按名称绑定.
public Query createQuery(final String queryString, final Map&String, ?& values) {
Assert.hasText(queryString, "queryString不能为空");
Query query = getSession().createQuery(queryString);
if (values != null) {
query.setProperties(values);
* 按Criteria查询对象列表.
* @param criterions 数量可变的Criterion.
public List&T& find(final Criterion... criterions) {
return createCriteria(criterions).list();
* 按Criteria查询唯一对象.
* @param criterions 数量可变的Criterion.
public T findUnique(final Criterion... criterions) {
return (T) createCriteria(criterions).uniqueResult();
* 根据Criterion条件创建Criteria.
* 与find()函数可进行更加灵活的操作.
* @param criterions 数量可变的Criterion.
public Criteria createCriteria(final Criterion... criterions) {
Criteria criteria = getSession().createCriteria(entityClass);
for (Criterion c : criterions) {
criteria.add(c);
* 初始化对象.
* 使用load()方法得到的仅是对象Proxy, 在传到View层前需要进行初始化.
* 如果传入entity, 则只初始化entity的直接属性,但不会初始化延迟加载的关联集合和属性.
* 如需初始化关联属性,需执行:
* Hibernate.initialize(user.getRoles()),初始化User的直接属性和关联集合.
* Hibernate.initialize(user.getDescription()),初始化User的直接属性和延迟加载的Description属性.
public void initProxyObject(Object proxy) {
Hibernate.initialize(proxy);
* Flush当前Session.
public void flush() {
getSession().flush();
* 为Query添加distinct transformer.
* 预加载关联对象的HQL会引起主对象重复, 需要进行distinct处理.
public Query distinct(Query query) {
query.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
* 为Criteria添加distinct transformer.
* 预加载关联对象的HQL会引起主对象重复, 需要进行distinct处理.
public Criteria distinct(Criteria criteria) {
criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
* 取得对象的主键名.
public String getIdName() {
ClassMetadata meta = getSessionFactory().getClassMetadata(entityClass);
return meta.getIdentifierPropertyName();
* 判断对象的属性值在数据库内是否唯一.
* 在修改对象的情景下,如果属性新修改的值(value)等于属性原来的值(orgValue)则不作比较.
public boolean isPropertyUnique(final String propertyName, final Object newValue, final Object oldValue) {
if (newValue == null || newValue.equals(oldValue)) {
Object object = findUniqueBy(propertyName, newValue);
return (object == null);
浏览: 178687 次
来自: 北京
代码都差不多贴出来了,为啥不直接提供下载呢
我猜它应该有个算法,当出现长时间处理的情况的,它自动会启动另外 ...
很好, 学习了,

我要回帖

更多关于 一字体设计 的文章

 

随机推荐