编者按 / 英子 (题图中的照片摄于十年前,来自Flickr)不夸张地说,Kathy Sierra 算是 IT 界传奇人士,她是那种极为罕见的可以在开发、产品、设计之间做到无缝衔接的人。你可能没听说过她,然而她身兼数职,每一个职位都够份量—— 知名IT出版商 O’Reilly 超级畅销技术书 Head First 系列策划人 第一本 Head First 系列图书 Head First Java 作者 大型 Java 开发者社区 JavaRanch.com 创办人 几款游戏主创 加州大学洛杉矶分校新媒体与交互设计课程创办人 …… 另外一个让人比较震惊和遗憾的信息是,Kathy Sierra 是网络暴力受害者。作为知名的创作者、技术人士,2007年之前,她在传播编程技术方面非常活跃。2007年3月,在参加 O’Reilly ETech 会议演讲之前,她的博客和邮件收到了匿名者的死亡威胁,之后她停止了所有公开活动,至今也极少公开露面。目前网上关于她个人的信息大都是2007年之前的,前几年她开了Twitter,但又关了… 距离 Kathy Sierra 淡出公众视线已是十年之久,IT领域可谓日新月异。我们无法猜想,如果十年来她一直活跃在技术一线如今是怎样的光景?目前,她仍然写书,热衷养马…..只是,我们觉得跟 Kathy 的距离很远…… 感谢 Badass: Making Users Awesome 中文版《用户思维+:好产品让用户为自己尖叫》一书即将出版上架,因为这个契机,我们得以跟 Kathy 直接对话 ;感谢图灵访谈负责人六米费劲周折联系到 Kathy ,这篇访谈弥足珍贵。 结尾为大家送出10本《用户思维+:好产品让用户为自己尖叫》。 Kathy Sierra O’Reilly出版社 Head First 系列图书策划人之一,大型Java开发者社区 JavaRanch.com 创办人,多款教育类和娱乐类游戏主要开发人员。加州大学洛杉矶分校新媒体与交互设计课程创始人。她深谙产品交互之道和认知科学理论,多年来,一直帮助大公司、创业公司、非营利组织和教育者重新思考打造用户体验的方法,培养持续忠诚的用户。 O’Reilly Head First 系列图书策划人 Head First 是 O’Reilly Media 推出的一套入门指导型图书系列,由 Kathy Sierra 和 Bert Bates 策划创办。最初,该系列只涵盖编程和软件工程。由于该系列图书的成功,目前已经扩展至其他的主题,像科学、数学和商业等领域。Head First 系列强调图书的“非正统性”,强化读者的视觉感受和读者的参与度。图书增添了很多互动性强的谜题、笑话,摒弃“标准”的设计和布局,推崇会话式的写作风格,让读者可以参与到给定的话题当中。 目前,图灵翻译出版了《嗨翻C语言》《Head First JavaScript 程序设计》。 优秀的技术图书作者 最为知名的作品包括: Head First Java,Head First 系列第一本图书,2005年出版第1版,迄今仍是Java入门书的翘楚。 Badass: Making Users […]
View Details1.Math.Round:四舍六入五取偶
1 2 3 4 5 6 7 8 9 10 |
Math.Round(0.0) //0 Math.Round(0.1) //0 Math.Round(0.2) //0 Math.Round(0.3) //0 Math.Round(0.4) //0 Math.Round(0.5) //0 Math.Round(0.6) //1 Math.Round(0.7) //1 Math.Round(0.8) //1 Math.Round(0.9) //1 |
说明:对于1.5,因要返回偶数,所以结果为2。 2.Math.Ceiling:只要有小数都加1
1 2 3 4 5 6 7 8 9 10 |
Math.Ceiling(0.0) //0 Math.Ceiling(0.1) //1 Math.Ceiling(0.2) //1 Math.Ceiling(0.3) //1 Math.Ceiling(0.4) //1 Math.Ceiling(0.5) //1 Math.Ceiling(0.6) //1 Math.Ceiling(0.7) //1 Math.Ceiling(0.8) //1 Math.Ceiling(0.9) //1 |
说明:例如在分页算法中计算分页数很有用。 3.Math.Floor:总是舍去小数
1 2 3 4 5 6 7 8 9 10 |
Math.Floor(0.0) //0 Math.Floor(0.1) //0 Math.Floor(0.2) //0 Math.Floor(0.3) //0 Math.Floor(0.4) //0 Math.Floor(0.5) //0 Math.Floor(0.6) //0 Math.Floor(0.7) //0 Math.Floor(0.8) //0 Math.Floor(0.9) //0 |
from:https://www.cnblogs.com/rwh871212/p/6962099.html
View Detailspublic enum StringComparison { CurrentCulture, CurrentCultureIgnoreCase, InvariantCulture, InvariantCultureIgnoreCase, Ordinal, OrdinalIgnoreCase } CurrentCulture 使用区域敏感排序规则和当前区域比较字符串。 CurrentCultureIgnoreCase 使用区域敏感排序规则、当前区域来比较字符串,同时忽略被比较字符串的大小写。 InvariantCulture 使用区域敏感排序规则和固定区域比较字符串。 InvariantCultureIgnoreCase 使用区域敏感排序规则、固定区域来比较字符串,同时忽略被比较字符串的大小写。 Ordinal 使用序号排序规则比较字符串。 OrdinalIgnoreCase 使用序号排序规则并忽略被比较字符串的大小写,对字符串进行比较。 1.首先是StringComparison.Ordinal 在进行调用String.Compare(string1,string2,StringComparison.Ordinal)的时候是进行非语言(non-linguistic)上的比较,API运行时将会对两个字符串进行byte级别的比较,因此这种比较是比较严格和准确的,并且在性能上也很好,一般通过StringComparison.Ordinal来进行比较比使用String.Compare(string1,string2)来比较要快10倍左右.(可以写一个简单的小程序验证,这个挺让我惊讶,因为平时使用String.Compare从来就没想过那么多).StringComparison.OrdinalIgnoreCase就是忽略大小写的比较,同样是byte级别的比较.性能稍弱于StringComparison.Ordinal. 2.StringComparison.CurrentCulture 是在当前的区域信息下进行比较,这是String.Compare在没有指定StringComparison的时候默认的比较方式.例子如下: Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); //当前的区域信息是美国 string s1 = "visualstudio"; string s2 = "windows"; Console.WriteLine(String.Compare(s1, s2,StringComparison.CurrentCulture)); //输出"-1" Thread.CurrentThread.CurrentCulture = new CultureInfo("sv-SE"); //当前的区域信息是瑞典 Console.WriteLine(String.Compare(s1, s2,StringComparison.CurrentCulture)); //输出"1" StringComarison.CurrentCultureIgnoreCase指在当前区域信息下忽略大小写的比较. 3.StringComarison.InvariantCulture 使用StringComarison.InvariantCulture来进行字符串比较,在任何系统中(不同的culture)比较都将得到相同的结果,他是使用CultureInfo.InvariantCulture的静态成员CompareInfo来进行比较操作的.例子如下: Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); //当前的区域信息是美国 string s1 = "visualstudio"; string s2 = "windows"; Console.WriteLine(String.Compare(s1, s2,StringComparison.InvariantCulture)); //输出"-1" Thread.CurrentThread.CurrentCulture = new CultureInfo("sv-SE"); //当前的区域信息是瑞典 Console.WriteLine(String.Compare(s1, s2,StringComparison.InvariantCulture)); //输出"-1" 参考文章:http://msdn.microsoft.com/netframework/default.aspx?pull=/library/en-us/dndotnet/html/StringsinNET20.asp from:http://www.cnblogs.com/zhw511006/archive/2010/07/09/1774591.html
View Details一直在使用阿里云云服务器,当然小七博客没有放在阿里云上面,邮箱以及后台总或者经常收到短信提示“WordPress后台插件更新模块任意目录遍历导致DOS的漏洞”,可惜阿里云没有给出解决方案,需要修改可以购买提供的安骑士专业版进行修复。如果你使用其他程序,一会会收到你正在使用程序的漏洞等等,这个亲自实验了一下。 目前wordpress最新的4.6.1系列已经修复了这个漏洞,所以解决方案直接升级到最新版本就行。可是有一些用户的主题在升级到最新版可能出现兼容性问题,所以暂时不会升级,而且后台升级也是非常慢的或者根本就无法升级,嘿嘿。下面说说4.5.4以及以下版本的修复方案,在进行更改代码的时候,建议备份一份,防止修改出错能够马上恢复,最好把整站数据打包备份吧。 WordPress 4.5.4版本 我们只需要将打开WordPress后台文件/wp-admin/includes/ajax-actions.php,搜索以下代码: $plugin = urldecode( $_POST[‘plugin’] ); 然后在这段代码后面添加以下代码即可: $plugin = plugin_basename( sanitize_text_field( wp_unslash( $_POST[‘plugin’] ) ) ); 至此,修改保存上传覆盖后即可成功修复WordPress 4.5.4版本的WordPress后台插件更新模块任意目录遍历导致DOS漏洞。 WordPress 4.5.4版本以下 如果您使用的4.5.4以下的版本,那么可能还需要修改以下两个地方:(PS:如果某版本的以下2点中的代码已经跟修复后一样的就不用修改了): 1、在/wp-admin/includes/ajax-actions.php文件中搜索找以下代码: if ( $plugin_update_data === true ) { wp_send_json_error( $status ); } 直接修改为: if ( $plugin_update_data === true ) { $status[‘error’] = __( ‘Plugin update failed.’ ); wp_send_json_error( $status ); } 2、在/wp-admin/includes/ajax-actions.php文件中搜索找以下代码: if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) { $status[‘error’] = $wp_filesystem->errors->get_error_message(); } wp_send_json_error( $status ); } } 直接修改为: if ( is_wp_error( $wp_filesystem->errors ) && $wp_filesystem->errors->get_error_code() ) { $status[‘error’] = $wp_filesystem->errors->get_error_message(); } wp_send_json_error( $status ); } else { // An unhandled error occured $status[‘error’] = __( ‘Plugin update failed.’ ); wp_send_json_error( $status ); } } 修改保存上传覆盖后即可成功修复WordPress 4.5.4版本以下的WordPress后台插件更新模块任意目录遍历导致DOS漏洞。 当然你也可以忽略,不然阿里云会天天提醒您的,嘿嘿!简单的操作下来也就耽误几分钟的时间。在修复好之后,不要忘了去阿里云后台验证一下哦,不然提醒还在的哦! 其实从另一方面也说明了阿里云在于安全方面的提醒还是不错的,虽说是为了推广他家的安骑士专业版,但是也说明确实有问题呢,嘿嘿。 from:https://www.xqblog.com/7091.html
View Details执行SqlDataReader.Read之后,如果还想用另一个SqlCommand执行Insert或者Update操作的话,会得到一个错误提示:There is already an open DataReader associated with this Command which must be closed first.,然后一般就会产生数据保存失败的异常。 解决方法是在ConnectionString中加上一个参数“MultipleActiveResultSets”, 将其值设置为true。
1 |
SqlConnection conn = new SqlConnection("server=s01;database=MOULTONWEB;uid=sa;pwd=cn1234567890;MultipleActiveResultSets=True |
MultipleActiveResultSets属性详解 ADO.NET 1.x 利用SqlDataReader读取数据,针对每个结果集需要一个独立的连接。当然,你还必须管理这些连接并且要付出相应的内存和潜在的应用程序中的高度拥挤的瓶颈代价-特别是在数据集中的Web应用程序中。 ADO.NET 2.的一个新特征多数据结果集(Multiple Active Result Sets,简称MARS)-它允许在单个连接上执行多重的数据库查询或存储过程。这样的结果是,你能够在单个连接上得到和管理多个、仅向前引用的、只读的结果集。目前实现这个功能的数据库只有Sql Server 2005。所以当我们针对Sql Sever 2005的时候,需要重新审视DataReader对象的使用。使用SqlServer 2005,可以在一个Command对象上同时打开多个DataReader,节约数据库联接所耗费的服务器资源,在实际开发中普遍存在的一种典型的从数据库中读写数据的情形是,你可以使用多重连接而现在只用一个连接就足够了。例如,如果你有一些来自于几个表中的数据-它们不能被联结到一个查询中,那么你就会有多重的连接-每个连接都有一个与之相关连的命令用于读取数据。同样,如果你正在向一个表写数据,那么你需要另外一个连接或连接集合-如果有多个表要被更新的话。 例如下面的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//MultipleActiveResultSets=true打开联接 string connstr = "server=(local);database=northwind;integrated security=true;MultipleActiveResultSets=true"; SqlConnection conn = new SqlConnection(connstr); conn.Open(); SqlCommand cmd1 = new SqlCommand("select * from customers", conn); SqlCommand cmd2 = new SqlCommand("select * from orders", conn); SqlDataReader rdr1 = cmd1.ExecuteReader(); // next statement causes an error prior to SQL Server 2005 SqlDataReader rdr2 = cmd2.ExecuteReader(); // now you can reader from rdr1 and rdr2 at the same time. conn.Close(); |
近期的一个项目是关于不同数据库同步的操作,考虑到数据的及时性,应用程序的性能,在数据库链接字符串中加入MultipleActiveResultSets; MultipleActiveResultSets的作用是指定多活动的结果集是否与指定的链接相互关联;类型是bool类型;true代表与指定的链接关联;false代表与指定的链接不关联;默认是false; from:http://www.cnblogs.com/sdusrz/p/4433108.html
View DetailsDAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。 在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口在逻辑上对应这个特定的数据存储。
View DetailsPOJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans,是为了避免和EJB混淆所创造的简称。 使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其getter setter方法的类,没有业务逻辑,有时可以作为VO(value -object)或dto(Data Transform Object)来使用.当然,如果你有一个简单的运算属性也是可以的,但不允许有业务方法,也不能携带有connection之类的方法。
View DetailsSpring在第三方依赖包中包含了两个数据源的实现类包,其一是Apache的DBCP,其二是 C3P0。可以在Spring配置文件中利用这两者中任何一个配置数据源。 DBCP数据源 DBCP类包位于 /lib/jakarta-commons/commons-dbcp.jar,DBCP是一个依赖 Jakarta commons-pool对象池机制的数据库连接池,所以在类路径下还必须包括/lib/jakarta- commons/commons-pool.jar。下面是使用DBCP配置MySql数据源的配置片断: xml 代码 <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:3309/sampledb" /> <property name="username" value="root" /> <property name="password" value="1234" /> bean> BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method=”close”属性, 以便Spring容器关闭时,数据源能够正常关闭。除以上必须的数据源属性外,还有一些常用的属性: defaultAutoCommit:设置从数据源中返回的连接是否采用自动提交机制,默认值为 true; defaultReadOnly:设置数据源是否仅能执行只读操作, 默认值为 false; maxActive:最大连接数据库连接数,设置为0时,表示没有限制; maxIdle:最大等待连接中的数量,设置为0时,表示没有限制; maxWait:最大等待秒数,单位为毫秒, 超过时间会报出错误信息; validationQuery:用于验证连接是否成功的查询SQL语句,SQL语句必须至少要返回一行数据, 如你可以简单地设置为:“select count(*) from user”; removeAbandoned:是否自我中断,默认是 false ; removeAbandonedTimeout:几秒后数据连接会自动断开,在removeAbandoned为true,提供该值; logAbandoned:是否记录中断事件, 默认为 false; C3P0数据源 C3P0是一个开放源代码的JDBC数据源实现项目,它在lib目录中与Hibernate一起发布,实现了JDBC3和JDBC2扩展规范说明的 Connection 和Statement 池。C3P0类包位于/lib/c3p0/c3p0-0.9.0.4.jar。下面是使用C3P0配置一个 oracle数据源: xml 代码 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close"> <property name="driverClass" value=" oracle.jdbc.driver.OracleDriver "/> <property name="jdbcUrl" value=" jdbc:oracle:thin:@localhost:1521:ora9i "/> <property name="user" value="admin"/> <property name="password" value="1234"/> bean> ComboPooledDataSource和BasicDataSource一样提供了一个用于关闭数据源的close()方法,这样我们就可以保证Spring容器关闭时数据源能够成功释放。 C3P0拥有比DBCP更丰富的配置属性,通过这些属性,可以对数据源进行各种有效的控制: acquireIncrement:当连接池中的连接用完时,C3P0一次性创建新连接的数目; acquireRetryAttempts:定义在从数据库获取新连接失败后重复尝试获取的次数,默认为30; acquireRetryDelay:两次连接中间隔时间,单位毫秒,默认为1000; autoCommitOnClose:连接关闭时默认将所有未提交的操作回滚。默认为false; automaticTestTable: C3P0将建一张名为Test的空表,并使用其自带的查询语句进行测试。如果定义了这个参数,那么属性preferredTestQuery将被忽略。你 不能在这张Test表上进行任何操作,它将中为C3P0测试所用,默认为null; breakAfterAcquireFailure:获取连接失败将会引起所有等待获取连接的线程抛出异常。但是数据源仍有效保留,并在下次调 用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。默认为 false; checkoutTimeout:当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒,默认为0; connectionTesterClassName: 通过实现ConnectionTester或QueryConnectionTester的类来测试连接,类名需设置为全限定名。默认为 com.mchange.v2.C3P0.impl.DefaultConnectionTester; idleConnectionTestPeriod:隔多少秒检查所有连接池中的空闲连接,默认为0表示不检查; initialPoolSize:初始化时创建的连接数,应在minPoolSize与maxPoolSize之间取值。默认为3; maxIdleTime:最大空闲时间,超过空闲时间的连接将被丢弃。为0或负数则永不丢弃。默认为0; maxPoolSize:连接池中保留的最大连接数。默认为15; maxStatements:JDBC的标准参数,用以控制数据源内加载的PreparedStatement数量。但由于预缓存的Statement属 于单个Connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素,如果maxStatements与 maxStatementsPerConnection均为0,则缓存被关闭。默认为0; maxStatementsPerConnection:连接池内单个连接所拥有的最大缓存Statement数。默认为0; numHelperThreads:C3P0是异步操作的,缓慢的JDBC操作通过帮助进程完成。扩展这些操作可以有效的提升性能,通过多线程实现多个操作同时被执行。默认为3; preferredTestQuery:定义所有连接测试都执行的测试语句。在使用连接测试的情况下这个参数能显著提高测试速度。测试的表必须在初始数据源的时候就存在。默认为null; propertyCycle: 用户修改系统配置参数执行前最多等待的秒数。默认为300; testConnectionOnCheckout:因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的时候都 将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable 等方法来提升连接测试的性能。默认为false; testConnectionOnCheckin:如果设为true那么在取得连接的同时将校验连接的有效性。默认为false。 读配置文件的方式引用属性: <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="/WEB-INF/jdbc.properties"/> bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> bean> 在jdbc.properties属性文件中定义属性值: jdbc.driverClassName= com.mysql.jdbc.Driver jdbc.url= jdbc:mysql://localhost:3309/sampledb jdbc.username=root jdbc.password=1234 提示 经常有开发者在${xxx}的前后不小心键入一些空格,这些空格字符将和变量合并后作为属性的值。如: 的属性配置项,在前后都有空格,被解析后,username的值为“ 1234 ”,这将造成最终的错误,因此需要特别小心。 获取JNDI数据源 如果应用配置在高性能的应用服务器(如WebLogic或Websphere等)上,我们可能更希望使用应用服务器本身提供的数据源。应用服务器的数据源 使用JNDI开放调用者使用,Spring为此专门提供引用JNDI资源的JndiObjectFactoryBean类。下面是一个简单的配置: xml 代码 <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> <property name="jndiName" value="java:comp/env/jdbc/bbt"/> bean> 通过jndiName指定引用的JNDI数据源名称。 Spring 2.0为获取J2EE资源提供了一个jee命名空间,通过jee命名空间,可以有效地简化J2EE资源的引用。下面是使用jee命名空间引用JNDI数据源的配置: xml 代码 <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 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> <jee:jndi-lookup id="dataSource" jndi-name=" java:comp/env/jdbc/bbt"/> […]
View Details使用ant从源码构建
1 2 |
ant clean package |
使用maven从源码安装
1 2 |
mvn clean install |
使用maven从jar文件安装
1 2 |
mvn install:install-file -DgroupId=org.csource -DartifactId=fastdfs-client-java -Dversion=${version} -Dpackaging=jar -Dfile=fastdfs-client-java-${version}.jar |
在您的maven项目pom.xml中添加依赖
1 2 3 4 5 |
<<span class="pl-ent">dependency</span>> <<span class="pl-ent">groupId</span>>org.csource</<span class="pl-ent">groupId</span>> <<span class="pl-ent">artifactId</span>>fastdfs-client-java</<span class="pl-ent">artifactId</span>> <<span class="pl-ent">version</span>>1.27-SNAPSHOT</<span class="pl-ent">version</span>> </<span class="pl-ent">dependency</span>> |
.conf 配置文件、所在目录、加载优先顺序
1 2 3 4 5 6 7 8 9 10 |
配置文件名fdfs_client.conf(或使用其它文件名xxx_yyy.conf) 文件所在位置可以是项目classpath(或OS文件系统目录比如/opt/): /opt/fdfs_client.conf C:\Users\James\config\fdfs_client.conf 优先按OS文件系统路径读取,没有找到才查找项目classpath,尤其针对linux环境下的相对路径比如: fdfs_client.conf config/fdfs_client.conf |
1 2 3 4 5 6 7 8 9 10 11 |
connect_timeout = 2 network_timeout = 30 charset = UTF-8 http.tracker_http_port = 80 http.anti_steal_token = no http.secret_key = FastDFS1234567890 tracker_server = 10.0.11.247:22122 tracker_server = 10.0.11.248:22122 tracker_server = 10.0.11.249:22122 |
1 2 3 |
注1:tracker_server指向您自己IP地址和端口,1-n个 注2:除了tracker_server,其它配置项都是可选的 |
.properties 配置文件、所在目录、加载优先顺序
1 2 3 4 5 6 7 8 9 10 |
配置文件名 fastdfs-client.properties(或使用其它文件名 xxx-yyy.properties) 文件所在位置可以是项目classpath(或OS文件系统目录比如/opt/): /opt/fastdfs-client.properties C:\Users\James\config\fastdfs-client.properties 优先按OS文件系统路径读取,没有找到才查找项目classpath,尤其针对linux环境下的相对路径比如: fastdfs-client.properties config/fastdfs-client.properties |
1 2 3 4 5 6 7 8 9 |
fastdfs.connect_timeout_in_seconds = 5 fastdfs.network_timeout_in_seconds = 30 fastdfs.charset = UTF-8 fastdfs.http_anti_steal_token = false fastdfs.http_secret_key = FastDFS1234567890 fastdfs.http_tracker_http_port = 80 fastdfs.tracker_servers = 10.0.11.201:22122,10.0.11.202:22122,10.0.11.203:22122 |
1 2 3 4 |
注1:properties 配置文件中属性名跟 conf 配置文件不尽相同,并且统一加前缀"fastdfs.",便于整合到用户项目配置文件 注2:fastdfs.tracker_servers 配置项不能重复属性名,多个 tracker_server 用逗号","隔开 注3:除了fastdfs.tracker_servers,其它配置项都是可选的 |
加载配置示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
加载原 conf 格式文件配置: ClientGlobal.init("fdfs_client.conf"); ClientGlobal.init("config/fdfs_client.conf"); ClientGlobal.init("/opt/fdfs_client.conf"); ClientGlobal.init("C:\\Users\\James\\config\\fdfs_client.conf"); 加载 properties 格式文件配置: ClientGlobal.initByProperties("fastdfs-client.properties"); ClientGlobal.initByProperties("config/fastdfs-client.properties"); ClientGlobal.initByProperties("/opt/fastdfs-client.properties"); ClientGlobal.initByProperties("C:\\Users\\James\\config\\fastdfs-client.properties"); 加载 Properties 对象配置: Properties props = new Properties(); props.put(ClientGlobal.PROP_KEY_TRACKER_SERVERS, "10.0.11.101:22122,10.0.11.102:22122"); ClientGlobal.initByProperties(props); 加载 trackerServers 字符串配置: String trackerServers = "10.0.11.101:22122,10.0.11.102:22122"; ClientGlobal.initByTrackers(trackerServers); |
检查加载配置结果:
1 2 |
System.out.println("ClientGlobal.configInfo(): " + ClientGlobal.configInfo()); |
1 2 3 4 5 6 7 8 9 10 |
ClientGlobal.configInfo(): { g_connect_timeout(ms) = 5000 g_network_timeout(ms) = 30000 g_charset = UTF-8 g_anti_steal_token = false g_secret_key = FastDFS1234567890 g_tracker_http_port = 80 trackerServers = 10.0.11.101:22122,10.0.11.102:22122 } |
from:https://github.com/happyfish100/fastdfs-client-java
View Details转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生)。 访问GitHub下载最新源码:https://github.com/gaussic/SpringMVCDemo 文章已针对IDEA 2016做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码。 另外:文中的附图部分仍然为旧版本,请参照自身版本进行配置。 前言 由于近期一直在做学术方面的工作,项目开发相关工作并没有花太多的时间,导致这篇文章的更新停步了很长一段时间。现在应大家的要求,补上剩余部分,望能给大家带来一些帮助。由于时间的原因,在开发环境上面有了一定的更新,但是并不造成太大的影响。 一、相关环境 – Intellij IDEA 2016.2 Ultimate – Tomcat 8.0.35 – JDK 1.8.0_92 – Spring 4.2.6 – MySql 5.7 – Maven 3.3.9 – Bootstrap 3.3.5 以上是我要做的这个demo所需要的东西,当然有些是可选的,版本也是可控的。比如说如果你用不惯Maven的话可以自行去官网下载jar包然后导入自己的工程中,如果想要学习下Maven可以看看《Maven视频教程》(偶然找到,这个老师做的视频都挺好,推荐以下),不用完全的去学习Maven,懂大概意思后再去找找IntelliJ IDEA如何配置maven的相关文章就足够了。 还有Bootstrap,纯粹是个人洁癖,不需要这可以去之。 事先声明,请确保IntelliJ IDEA、Tomcat、MySql和JDK都已经安装好。Maven和Bootstrap的话能有则有。前者为了让导包更容易,后者为了让页面更美观。此外,由于jdk以及mysql的安装网上已经有了很多教程,在此为节省篇幅不做介绍。 二、本地Maven与Tomcat的安装 注:如果使用IntelliJ IDEA集成的maven 3.0.5的话,可以忽略此步安装。 1、下载并安装本地maven 点击“Apache-Maven官方网站”进入官网,点击左侧Download选项: 进入了下载页面,往下拉可发现当前版本是3.3.3,点击下面红框中的apache-maven-3.3.9-bin.zip就可下载,下载后解压缩到相应目录下: 新增系统变量MAVEN_HOME:即MAVEN安装目录: 在Path中加入:%MAVEN_HOME%\bin; 在cmd中输入mvn -v,若显示如下,则说明本地maven配置完成: 2、下载并安装本地Tomcat 进入Tomcat官网,点击左侧Download的Tomcat8.0,进入Tomcat的下载页面: 64位Windows版本下载64-bit Windows zip (pgp, md5, sha1),解压到所需目录下: 解压后到\bin\目录下运行startup.bat,如图下所示,如果出现Server startup in xxxx ms说明Tomcat安装成功。 三、创建Maven Web项目 前面说了这么多,差不多基本的东西都保障了(前提保证你已经安装了jdk)。现在进入正题,如何来创建一个Web项目。对于不使用Maven的开发者,可以直接建一个简单的Web项目。使用Maven的话,请按照图进行操作。 菜单File->New Project可进入上图界面,首先选择左边栏Maven,再配置JDK(一般如果之前添加了JDK的话会自动填充,如未添加的话点击旁边的New将JDK目录导入即可)。勾选“Create from archetype“,然后选中4处蓝色位置webapp,点Next,进入如下界面: 这里需要填写GroupId和ArtifactId还有Version,这三个属性目的是标识你的项目的唯一性,比如Tomcat的GroupId是org.apache,即它是apache组织的项目,ArtifactId是tomcat,项目名为tomcat,而我当前使用的Version是7.0.68。这些只在发布时有用,在此可以随便填写,填好后点Next,到如下界面。 打开Maven home directory,可以发现IntelliJ IDEA已经集成了Maven 2和Maven 3两个版本,如果使用默认集成的maven的话,选择Buldled(Maven 3),直接点击Next。 我们也可以导入本地新安装的较新的Maven版本,点击蓝色箭头右边的 … 按钮将Maven路径导入即可,点击Next: 填写项目名,选择项目保存路径,点击Finish: 进入如下界面,maven会在后台生成web项目,这需要等待一定的时间,视网络环境而定,经验发现用较新版本的maven项目生成更快,使用IDEA集成的maven可能会等待很长一段实践。 左边红框中展示了该项目的文件结构。可以发现,它在src/main下创建了一个recources文件夹,该文件夹一般用来存放一些资源文件,还有一个webapp文件夹,用来存放web配置文件以及jsp页面等,这已经组成了一个原始的web应用。选择右边红框的Enable-Auto-Import,可以在每次修改pom.xml后,自动的下载并导入jar包,这一点在后面详述。 注:如果这一步生成实在太慢的话,建议看一下以下两篇(感谢26楼 wintersun2 同学的提出): 文章1: http://www.cnblogs.com/beiyeren/p/4566485.html 文章2:http://blog.csdn.net/cleverlzc/article/details/50864582 四、Maven自动导入jar包 既然我们要用SpringMVC开发,那肯定少不了SpringMVC的相关jar包。如果不使用Maven的话,那就需要去官网下载相关的jar包,然后导入到项目中。现在使用maven的话,就不需要上网找jar包了。具体容我一一道来。 Maven所做的工作其实很简单,就是自动把你需要的jar包下载到本地,然后关联到项目中来。maven的所有jar包都是保存在几个中央仓库里面的,其中一个最常用的是Maven Repository,即,你需要什么jar包,它就会从仓库中拿给你。那么如何告诉maven需要什么jar包呢?我们看看工程目录,能找到一个pom.xml文件(这个文件在刚创建好项目时就已经展现在了大家面前),maven就是靠它来定义需求的,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.gaussic</groupId> <artifactId>springmvcdemo</artifactId> <packaging>war</packaging> <version>1.0-SNAPSHOT</version> <name>springmvcdemo Maven Webapp</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>springmvcdemo</finalName> </build> </project> |
我们可以看到这个文件包含了我们之前定义的本项目的gropId等信息,这些信息是该项目的标识,我们不要去改动它们。重点看<dependencies>标签,翻译过来是”依赖“的意思,也就是说把对每个包的需求都称为一个依赖<depedency>,定义在<dependencies>中。在每个<depedency>中,你需要提供的是所需jar包的groupId、artifactId、version这三个必要信息。比如上面我们看到引入可一个junit包,格式如下: […]
View Details