亚洲色成人网站www永久,亚洲欧美人成视频一区在线,亚洲国产成人高清在线观看,亚洲精品久久久久久动漫,亚洲国产精品久久电影欧美

數(shù)據(jù)專欄

智能大數(shù)據(jù)搬運(yùn)工,你想要的我們都有

科技資訊

科技學(xué)院

科技百科

科技書籍

網(wǎng)站大全

軟件大全

HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
自己搭建圖片服務(wù)器成本低一些還是直接用云服務(wù)器低一些?
技術(shù)問答
2018-06-27 16:53:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
目前搭了一個fastdfs集群,多group,一個group兩臺機(jī)器,通過nginx進(jìn)行負(fù)載反向代理到group服務(wù)器上,再過nginx的mod找圖片。

現(xiàn)在的問題是,程序上傳圖片后立刻就要通過生成的url去查看圖片,但因?yàn)橥降膯栴},group里的兩臺機(jī)器有一臺可能還沒有這張圖片,于是就會返回404。有沒有什么辦法避免這個問題,nginx層重試也行
技術(shù)問答
2018-04-09 11:32:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@余慶 你好,想跟你請教個問題:
Fastdfs的tracker服務(wù)器在5000并發(fā)下,出現(xiàn)明顯的響應(yīng)時間周期性變長,然后出現(xiàn)大量的java.net.ConnectException: Connection timed out。此時服務(wù)器的內(nèi)存和cpu均未跑滿(配置:16核CPU,32G內(nèi)存)
并且我們在較低并發(fā)(1000并發(fā))的持久測試中也發(fā)現(xiàn),有一定概率的 java.net.ConnectException: Connection timed out。
tracker.conf如下:
disabled=false
bind_addr=
port=22122
connect_timeout=30
network_timeout=30
base_path=/home/yuqing/fastdfs
max_connections=10000
work_threads=32
store_lookup=0
store_group=group2
store_server=0
store_path=0
download_server=0
reserved_storage_space = 10%
log_level=debug
run_by_group=
run_by_user=
allow_hosts=*
sync_log_buff_interval = 10
check_active_interval = 120
thread_stack_size = 256KB
storage_ip_changed_auto_adjust = true
storage_sync_file_max_delay = 86400
storage_sync_file_max_time = 300
use_trunk_file = false
slot_min_size = 256
slot_max_size = 16MB
trunk_file_size = 64MB
trunk_create_file_advance = false
trunk_create_file_time_base = 02:00
trunk_create_file_interval = 86400
trunk_create_file_space_threshold = 20G
trunk_init_check_occupying = false
trunk_init_reload_from_binlog = false
use_storage_id = false
storage_ids_filename = storage_ids.conf
id_type_in_filename = ip
store_slave_file_use_link = false
rotate_error_log = false
error_log_rotate_time=00:00
rotate_error_log_size = 0
use_connection_pool = false
connection_pool_max_idle_time = 3600
http.server_port=8080
http.check_alive_interval=30
http.check_alive_type=tcp
http.check_alive_uri=/status.html

技術(shù)問答
2014-06-09 13:56:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
服務(wù)器上搭建好環(huán)境,安裝了nginx代理模塊,在服務(wù)器上使用fdfs_upload_file能上傳,瀏覽器也能下載,
可是本機(jī)用java客戶端連接上傳死活都不行。連接超時。
不知道這可能是哪里的原因?
技術(shù)問答
2014-12-14 20:52:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
如圖,如果使用ueditor的多圖上傳組件的話,返回上傳狀態(tài)為成功,但結(jié)果會報(bào)IO異常,而后臺的fastdfs 會報(bào)一些莫名其妙的異常,一時找不到原因啊
日志如下:
2017-07-27 16:12:14 [http-bio-80-exec-2] ERROR com.yhq.fasfdfs.client.manager.FastDFSFileManager.upload(FastDFSFileManager.java:100) - Non IO Exception when uploadind the file: 1501143134393040943.jpg
java.lang.NullPointerException
at org.csource.fastdfs.StorageClient.do_upload_file(StorageClient.java:754)
at org.csource.fastdfs.StorageClient.upload_file(StorageClient.java:162)
at org.csource.fastdfs.StorageClient.upload_file(StorageClient.java:180)
at com.yhq.fasfdfs.client.manager.FastDFSFileManager.upload(FastDFSFileManager.java:93)
at com.yhq.pfsc.utils.file.FileManager.baseUpFile(FileManager.java:141)
at com.yhq.pfsc.utils.file.FileManager.uploadFile(FileManager.java:63)
at com.yhq.pfsc.utils.ueditor.upload.StorageManager.saveTmpFile(StorageManager.java:134)
at com.yhq.pfsc.utils.ueditor.upload.StorageManager.saveFileByInputStream(StorageManager.java:72)
at com.yhq.pfsc.utils.ueditor.upload.BinaryUploader.save(BinaryUploader.java:71)
at com.yhq.pfsc.utils.ueditor.upload.Uploader.doExec(Uploader.java:26)
at com.yhq.pfsc.utils.ueditor.ActionEnter.invoke(ActionEnter.java:92)
at com.yhq.pfsc.utils.ueditor.ActionEnter.exec(ActionEnter.java:55)
at com.yhq.pfsc.admin.base.controller.UeditorController.ueditorUpload(UeditorController.java:49)
at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:232)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
java.lang.NullPointerException
at com.yhq.fasfdfs.client.manager.FastDFSFileManager.upload(FastDFSFileManager.java:112)
at com.yhq.pfsc.utils.file.FileManager.baseUpFile(FileManager.java:141)
at com.yhq.pfsc.utils.file.FileManager.uploadFile(FileManager.java:63)
at com.yhq.pfsc.utils.ueditor.upload.StorageManager.saveTmpFile(StorageManager.java:134)
at com.yhq.pfsc.utils.ueditor.upload.StorageManager.saveFileByInputStream(StorageManager.java:72)
at com.yhq.pfsc.utils.ueditor.upload.BinaryUploader.save(BinaryUploader.java:71)
at com.yhq.pfsc.utils.ueditor.upload.Uploader.doExec(Uploader.java:26)
at com.yhq.pfsc.utils.ueditor.ActionEnter.invoke(ActionEnter.java:92)
at com.yhq.pfsc.utils.ueditor.ActionEnter.exec(ActionEnter.java:55)
at com.yhq.pfsc.admin.base.controller.UeditorController.ueditorUpload(UeditorController.java:49)
at sun.reflect.GeneratedMethodAccessor53.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:953)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:855)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:829)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:61)
at org.apache.shiro.web.servlet.AdviceFilter.executeChain(AdviceFilter.java:108)
at org.apache.shiro.web.servlet.AdviceFilter.doFilterInternal(AdviceFilter.java:137)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.apache.shiro.web.servlet.ProxiedFilterChain.doFilter(ProxiedFilterChain.java:66)
at org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449)
at org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365)
at org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90)
at org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83)
at org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:383)
at org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362)
at org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:343)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:260)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:123)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:232)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
技術(shù)問答
2017-07-27 16:13:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
比如數(shù)據(jù)庫分庫、分布式文件系統(tǒng)等。假設(shè)原本一個數(shù)據(jù)庫連接數(shù)上限為500。現(xiàn)在分庫為2臺數(shù)據(jù)庫,然后有5臺應(yīng)用服務(wù)器做負(fù)載均衡。由于每臺應(yīng)用服務(wù)器需要連接每個數(shù)據(jù)庫,因此每臺應(yīng)用服務(wù)器上的連接數(shù)為200(對每臺數(shù)據(jù)庫連100)。
但是這樣也很難繼續(xù)水平擴(kuò)充數(shù)據(jù)庫數(shù)目啊。因?yàn)槭艿竭B接數(shù)限制啊。沒接觸這方面,有做過的可以說說嗎,謝謝了。
技術(shù)問答
2015-02-27 21:42:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
上傳下載時有時候會出現(xiàn)如下異常:
java.io.IOException: recv package size -1 != 10
請教如何處理
技術(shù)問答
2017-03-10 18:14:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
根據(jù)之前的經(jīng)驗(yàn),應(yīng)用軟件的網(wǎng)絡(luò)通信無非就是Socket和HTTP,其中Socket又可以用TCP和UDP,HTTP的話就衍生出很多方式,基礎(chǔ)的HTTP GET和POST請求,然后就是WebService的SOAP。
在這些方式中,Socket當(dāng)然是最基礎(chǔ)的。因此先從Socket開始。
服務(wù)端就不需要過多的說明了,無論采用什么語言什么平臺都可以,只要遵循基本的Socket監(jiān)聽模式就行。
實(shí)際上Android的Socket開發(fā)就是Java的Socket開發(fā),因此學(xué)習(xí)過Java的開發(fā)人員也許覺得并沒有什么難度,不過依然有一些不同于PC開發(fā)的地方需要注意
首先是說說TCP開發(fā)
JAVA里的TCP開發(fā)感覺比C#里簡單多了,實(shí)現(xiàn)方法幾句話就能完成。 Socket socket = new Socket("192.168.3.119",7628);//創(chuàng)建Socket實(shí)例,并綁定連接遠(yuǎn)端IP地址和端口 OutputStream ops = socket.getOutputStream();//定義一個輸出流,來自于Socket輸出流 byte[] bytes = b.getBytes(); ops.write(bytes);//向輸出流中寫入數(shù)據(jù) ops.flush();//刷行輸出流 //至此,在連接成功的情況下,服務(wù)端應(yīng)該就能收到發(fā)送過去的流了。 //接下來是接收服務(wù)器發(fā)送過來的數(shù)據(jù) InputStream ips = socket.getInputStream();//定義輸入流,來自于socket的輸入流 byte[] bytes2 = new byte[20]; ips.read(bytes2);//讀取輸入流數(shù)據(jù) String str = new String(bytes2);//轉(zhuǎn)換成字符串 btn.setText(str);//顯示出來(我是現(xiàn)實(shí)在button上,當(dāng)然,這個方法不正規(guī),不過可以讓我少放點(diǎn)空間,看上去界面干凈點(diǎn),只要能看到效果就行) socket.close();
服務(wù)端代碼就不多說明了,只要實(shí)現(xiàn)了Socket監(jiān)聽和接收,發(fā)送就行。這樣Android上Tcp的Socket就完成了,很簡單。
接下來是UDP的,理論上來說,UDP的實(shí)現(xiàn)應(yīng)該更簡單,不過,由于使用模擬器來調(diào)試的關(guān)系,出了一點(diǎn)小問題,郁悶了很久,另外,Java用UDP Socket對應(yīng)使用的類是DatagramSocket,與C#不同,c#是在創(chuàng)建Socket的時候制定參數(shù)來制定協(xié)議類型,先看代碼。 DatagramSocket dgs = new DatagramSocket();//建立一個Socket,這個Socket將作為一個發(fā)送器,將Socket包發(fā)送出去 InetAddress inet = InetAddress.getByName("192.168.3.119");//創(chuàng)建一個InetAddress,ip地址為要發(fā)動到的遠(yuǎn)端的服務(wù)器IP DatagramPacket dgp = new DatagramPacket("test2".getBytes(), "test2".getBytes().length,inet,7628);//創(chuàng)建一個UDP數(shù)據(jù)包,數(shù)據(jù)包包含遠(yuǎn)端的IP地址及端口 dgs.send(dgp);//發(fā)送 dgs.close(); DatagramSocket dgs2 = new DatagramSocket(9997);//創(chuàng)建另一個UDPSocket, DatagramPacket dgp2 = new DatagramPacket(new byte[20],20); //創(chuàng)建一個空報(bào)文包 dgs2.receive(dgp2);//接收數(shù)據(jù)并填充到報(bào)文包中 String str = new String(dgp2.getData());//獲取報(bào)文包里的數(shù)據(jù)并轉(zhuǎn)換成字符串 btn.setText(str);//顯示獲得的數(shù)據(jù) dgs2.close();//關(guān)閉Socket
需要特別注意的地方,在不做端口映射的情況下,UDP可能無法接受到服務(wù)器端發(fā)送過來的數(shù)據(jù),原因是使用eclipse開發(fā)的時候,調(diào)試程序是用的模擬環(huán)境,模擬環(huán)境下,接收數(shù)據(jù)是要做端口映射的,因?yàn)槟M環(huán)境下,沒有自己真實(shí)的IP地址和端口,模擬器是使用5554來運(yùn)行的,發(fā)送數(shù)據(jù)到PC沒問題,但是 PC發(fā)送到模擬器的時候,需要把本機(jī)的端口映射到模擬器上,真機(jī)環(huán)境不需要,具體操作方式如下
1、運(yùn)行模擬器
2、打開DOS命令行窗口
執(zhí)行:telnet localhost 5554
5554是模擬器的端口,執(zhí)行之后會進(jìn)入android console
3、 在console下執(zhí)行:
redir add udp :8000:9000
其中,第一個端口號是PC的端口,第二個端口號是模擬器端口。
執(zhí)行此命令之后,會把PC 8000端口接收到的數(shù)據(jù)轉(zhuǎn)到模擬器的9000端口,模擬器就能從9000端口接收UDP數(shù)據(jù)包了
另外,要實(shí)現(xiàn)Socket,必須在 AndroidManifest.xml 中加入權(quán)限如下 文章出處: http://blog.sina.com.cn/s/blog_685790700100xjuo.html
技術(shù)問答
2011-10-31 16:16:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 需求大致如下1、a b c 3臺服務(wù)器 2、在a上ssh到b上,b在ssh到c,查找到c上面特定的進(jìn)程pid
3、在a上ssh到b上,b在ssh到c,kill掉上面步驟中找到的進(jìn)程
需求1和2 已經(jīng)實(shí)現(xiàn),需求3 kill會有問題
執(zhí)行kill命令的時候,是在b機(jī)器而不是c機(jī)器了
xargs和管道前面的,卻都是在c執(zhí)行的,進(jìn)程號也能獲取到了
大家看看有什么改進(jìn)辦法

shell腳本代碼
執(zhí)行過程
b、c機(jī)器都不方便放腳本遠(yuǎn)程調(diào)用執(zhí)行,所以只能這樣搞

腳本代碼片段和嘗試過的辦法順便也列舉一下,以下都不行 #遠(yuǎn)程ssh執(zhí)行片段代碼 echo -e "\n\n\n\n" PID1=$(ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "ps -ef | grep -v grep | grep tail | grep "$PWD/$PROJECT/$FILE" | awk '{print \$2}'") echo -e ">>>>>>>>>>>>>>>>$PID1" ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "echo $PID1 | xargs kill -9" echo -e "status is >>>>>>>>>>$?" #嘗試kill進(jìn)程代碼片段,注釋行都無法kill進(jìn)程 #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "ps -ef | grep -v grep | grep tail | grep "$PWD/$PROJECT/$FILE" | cut -d' ' -f 5 | xargs -i kill {}" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "ps -ef | grep -v grep | grep tail | grep "$PWD/$PROJECT/$FILE" | cut -d' ' -f 5 | xargs kill" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "kill -9 $(echo $PID1)" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "echo $PID1 | xargs kill -9" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "kill -9 $PID1" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP kill -9 "$PID1" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh tomcat@$IP "kill -9 ${PID1}" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh tomcat@$IP ". /etc/profile && kill -9 ${PID 1}" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "kill -9 $(ps -ef | grep -v g rep | grep tail | grep "$PWD/$PROJECT/$FILE" | awk '{print \$2}')" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "kill -9 `ps -ef | grep -v gr ep | grep tail | grep "$PWD/$PROJECT/$FILE" | awk '{print \$2}'`" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "source /home/tomcat/.bash_pr ofile && /bin/kill -9 "$PID1"" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "source /home/tomcat/.bash_pr ofile && ps -ef | grep -v grep | grep tail | grep "$PWD/$PROJECT/$FILE" | awk '{print \$2}' | xargs kill -9" #$(ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "ps -ef | grep -v grep | gr ep tail | grep "$PWD/$PROJECT/$FILE" | awk '{print \$2}' | xargs kill -9") #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "ps -ef | grep -v grep | grep tail | grep "$PWD/$PROJECT/$FILE" | awk '{print \$2}' | xargs kill -9" #ssh -A -t -oUserKnownHostsFile=/dev/null -oStrictHostKeyChecking=no tomcat@192.168.10.56 ssh -A tomcat@$IP "ps -ef | grep -v grep | grep tail | grep "$PWD/$PROJECT/$FILE" | awk '{print \$2}' | xargs -i kill {}"




技術(shù)問答
2015-10-21 11:59:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 有兩串shell命令,是一系列命令管道,執(zhí)行類似的操作:前半部分不同,后半部分是完全相同的,大概如下cmd_a1 | cmd_a2 | cmd_a3 | cmd_c5 | cmd _c6 .... cmd_b1 | cmd_b2 | cmd_c5 | cmd_c6 ..... 如果相同的部分,如上例中的cmd_c5..... 實(shí)現(xiàn)代碼非常繁瑣,維護(hù)起來會很麻煩,修改時很容易忘掉同步復(fù)制。
請教大家,像這樣的相同的部分,如何實(shí)現(xiàn)代碼復(fù)用?
------------------------------------------
[答案/方案]
實(shí)現(xiàn)方案:封閉,把共用部分寫成獨(dú)立的shell腳本文件,在主腳本里當(dāng)外部命令直接運(yùn)行。
要保證正確的搜尋路徑,最好計(jì)算出(或直接指定)腳本所在的絕對路徑
技術(shù)問答
2015-10-20 17:19:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@紅薯 你好,想跟你請教個問題:最近使用birt做圖標(biāo)導(dǎo)出,導(dǎo)出為pdf的時候,出現(xiàn)了中文標(biāo)題,xy軸混亂情況,至于非圖表的中文我已經(jīng)設(shè)置了宋體,并且在unix安裝了宋體字體,可以正常導(dǎo)出顯示,現(xiàn)在就是chart導(dǎo)出pdf會有title中文混亂,網(wǎng)上查了可能是unix jdk生成圖片時候沒有字體導(dǎo)致,我也在jdk中做了相關(guān)配置,折騰了兩天也沒有搞定,沒得進(jìn)展,希望你可以給我一點(diǎn)幫助。再三感謝。
技術(shù)問答
2013-03-11 22:28:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
比如一個汽車商城需要做年度統(tǒng)計(jì)時,遇到如下問題:
1、用2017年和2018年兩個年度舉例。
2、比如某汽車商城一共有如下品牌:奔馳、寶馬、奧迪、大眾、奇瑞、寶駿、豐田,7種車型可以售賣。
3、17年時,把(奔馳、寶馬、奧迪、大眾)這些車作為B級車、把(奇瑞、寶駿、豐田)作為C級車
4、18年時,把(奔馳、寶馬、奧迪、大眾、豐田)這些車作為B級車、把(奇瑞、寶駿)作為C級車、注意18年把豐田車的等級變更了,變?yōu)锽級車的類目
問題:當(dāng)我統(tǒng)計(jì)B級車和C級車的年度銷量時,怎么能做到按照17年和18年不同的分類來統(tǒng)計(jì)B級和C級車的銷量,可定不能用把“豐田”車納入了B級車的類目,來統(tǒng)計(jì)17年的銷量。
========================================================================================================
簡單的考慮,就是統(tǒng)計(jì)18年和17年分別用不同的類別分類。比如用SQL分別統(tǒng)計(jì)17年和18年。
但是感覺不合理,因?yàn)檫@只是一個很簡單的舉例,實(shí)際業(yè)務(wù)上由于分類的劃分會很復(fù)雜,所以想問問有經(jīng)驗(yàn)的大佬都是怎么管理此類問題。
技術(shù)問答
2019-03-28 18:34:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
@CrossChen 你好,想跟你請教個問題:Birt報(bào)表自動分頁后,我不想讓它分頁,只讓它在一個頁面顯示。run、preview模式不能用,因?yàn)槲疫€需要frameset的打印、導(dǎo)出功能,還有其中的page break 功能也不能用了。
技術(shù)問答
2019-02-21 14:38:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 報(bào)表實(shí)現(xiàn)分組后。birt自動就分頁了,我不想讓它分頁,只在一個頁面顯示,不要告訴我用run,preview,模式,我還需要frameset的打印功能,還有其中的page break 功能也不能用了,簡單點(diǎn)就不要分頁顯示
技術(shù)問答
2014-05-28 15:16:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
打算近期出版一本全面介紹BIRT使用的書籍,能夠幫助大家全面了解BIRT的方方面面,用豐富的案例和源碼,例子,詮釋這個報(bào)表設(shè)計(jì)工具,展現(xiàn)工具,開源框架,擴(kuò)展框架的種種優(yōu)點(diǎn)特性。 初稿內(nèi)容如下,書寫正在進(jìn)行中~
歡迎大家光臨我的主頁: http://blog.csdn.net/birtbird ~
BIRT的世界-BIRT技術(shù)漫談
目錄
第一章 BIRT簡介 3 
1.1 BIRT初識 3
1.2 BIRT安裝 6
第二章 BIRT設(shè)計(jì)器概述及本地化支持 10
2.1 BIRT設(shè)計(jì)器概述 10
2.2 BIRT本地化之漢化 21
2.3 BIRT Runtime配置詳解 25
2.4一個簡單的BIRT的報(bào)表案例 36
第三章 數(shù)據(jù)源的配置 47 3.1 JDBC數(shù)據(jù)源 48 3.2在BIRT中使用存儲過程 55
3.3 XML數(shù)據(jù)源 62
3.4腳本化數(shù)據(jù)源 64
3.5 WebServices數(shù)據(jù)源 71
3.6 文本數(shù)據(jù)源 80 
3.7 平面文件數(shù)據(jù)源 81 3.8 Excel數(shù)據(jù)源 97
3.9 profile數(shù)據(jù)源 99 
3.10在BIRT中訪問Hibernate POJO 105
3.11 birt script數(shù)據(jù)源pojo配置 115
3.12 數(shù)據(jù)源的屬性綁定 124 
第四章 數(shù)據(jù)集和參數(shù)的建立 127
4.1 數(shù)據(jù)集的設(shè)置 127
4.2 參數(shù)的設(shè)置 141 
第五章 文本類報(bào)表 155
5.1 基本的文本報(bào)表 155
5.2 交互式文本報(bào)表 160 
5.3 文本運(yùn)用導(dǎo)航欄數(shù)據(jù) 174  第六章 普通網(wǎng)格報(bào)表 178 6.1 屬性,布局 178
6.2 數(shù)據(jù)項(xiàng)的過濾 192
6.3 數(shù)據(jù)項(xiàng)的排序 195
6.4 數(shù)據(jù)項(xiàng)的突出顯示和可視性 199 6.5 鉆取,書簽和目錄 201
6.6 數(shù)據(jù)項(xiàng)上的鼠標(biāo)事件 212
6.7 外部腳本的使用,樣式,模板,庫,與資源 226 第七章 分組報(bào)表 232
7.1 分組的建立,插入,刪除 232
7.2 分組的排序與過濾 237
7.3 分組的間隔,聚合,可視性,映射,突出顯示,書簽 239
第八章 交叉報(bào)表 252
8.1 創(chuàng)建交叉報(bào)表和統(tǒng)計(jì) 252
8.2 多維交叉報(bào)表和維度過濾 265 
8.3 表頭的設(shè)計(jì) 269
第九章 嵌套報(bào)表以及參數(shù)的傳遞 273 
9.1 表內(nèi)的嵌套 273  9.2 表外的嵌套 274 
9.3 參數(shù)的傳遞 277
第十章 圖表 279
10.1 圖表的選擇數(shù)據(jù) 279
10.2 圖表的格式 287
10.3 圖表的交互 293
10.4 圖表的動態(tài)設(shè)置與異步刷新 310
第十一章 數(shù)據(jù)綁定與腳本,事件機(jī)制詳解 336
11.1 事件機(jī)制詳解 336
11.2 javascript事件綁定 357
11.3 Java事件綁定 368
11.4 表達(dá)式生成器 390 第十二章 報(bào)表的部署與配置
12.1 報(bào)表的工作模式
12.2 報(bào)表的環(huán)境參數(shù)配置 
12.3 報(bào)表jsp標(biāo)簽用法詳解
12.4 文檔的導(dǎo)出和打印設(shè)置 
第十三章 報(bào)表引擎API及報(bào)表API 
13.1 報(bào)表引擎詳解,API結(jié)構(gòu) 13.2 使用BIRT API創(chuàng)建List 13.3 使用BIRT API創(chuàng)建Grid
13.4 使用BIRT API創(chuàng)建Table 
13.5 使用BIRT API創(chuàng)建Chart
13.6 使用BIRT API打開顯示報(bào)表
第十四章 高級特性-報(bào)表的擴(kuò)展
14.1報(bào)表開放式接口
14.2數(shù)據(jù)源的擴(kuò)展
14.3數(shù)據(jù)項(xiàng)的擴(kuò)展
14.4 數(shù)據(jù)展示的擴(kuò)展
技術(shù)問答
2013-01-10 17:10:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
大家好!
  請教一下。
  使用java語言的報(bào)表開源工具,大家用什么?需要支持圖形、餅狀、曲線,支持csv、pdf導(dǎo)出,最重要的是性能好,不像Birt是內(nèi)存分面,而且支持中文(utf-8)。
  謝謝大家的推薦!
技術(shù)問答
2012-08-13 13:11:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 連接mysql數(shù)據(jù)庫時報(bào) class "org.eclipse.datatools.connectivity.oda.IBlob"'s signer information does not match signer information of other classes in the same package (連接數(shù)據(jù)庫的jar包我放WIN-INF/lib下面了),請問這個錯誤怎么解決??
技術(shù)問答
2017-01-14 10:54:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
各位大神,有人遇過這個問題嗎?
A BIRT exception occurred. Plug-in Provider:Eclipse BIRT Project Plug-in Name:BIRT Model Plug-in ID:org.eclipse.birt.report.model Version:4.5.0.v201506092134 Error Code:Error.PropertyValueException.CHOICE_NOT_FOUND Error Message:The choice value "any" is not found.
Eclipse配置好數(shù)據(jù)源之后,配置數(shù)據(jù)集的時候報(bào)的錯
技術(shù)問答
2016-09-12 11:37:07
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 最近項(xiàng)目需要做報(bào)表開發(fā),主要在看開源的,不知道現(xiàn)在業(yè)內(nèi)都在用哪一款,JasperReport or BIRT?
技術(shù)問答
2016-07-08 14:42:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
根據(jù)Birt的幫助文檔進(jìn)行本地化設(shè)置,在報(bào)表的同級目錄下建立中文、英文的properties files(如Test_zh_CN.properties,Test_en_US.properties),同時在Properties-Resources中增加資源文件,并在報(bào)表的Properties-Localization中定義Text key "wi_testview",其中文值為“測試視圖”,英文值為"Test View",但預(yù)覽和在運(yùn)行環(huán)境報(bào)表始終顯示properties files里面的第一個資源文件的語言(URL為:http://localhost:8080/BirtViewer/frameset?__report=new_report.rptdesign,報(bào)表只顯示為Test View),想顯示中文(測試視圖),在URL中使用__locale參數(shù)(URL為http://localhost:8080/BirtViewer/frameset?__report=new_report.rptdesign&__locale=zh_CN)不生效,報(bào)表仍然顯示為英文的Test View。但頁腳中的日期、時間會隨著這個參數(shù)顯示為相應(yīng)的中或英文。
如下圖,將Test_zh_CN移到第一位,會顯示為"測試視圖"。
加參數(shù)__locale=zh_CN的預(yù)覽效果:
技術(shù)問答
2016-04-28 13:21:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> birt里獲取到數(shù)據(jù)庫的數(shù)據(jù),0和1分別表示男和女,但是獲取出來的只是0和1,讓它在報(bào)表上顯示的時候顯示男女
技術(shù)問答
2015-12-01 20:38:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> 請問java桌面應(yīng)用怎么調(diào)用birt報(bào)表來顯示數(shù)據(jù)?
技術(shù)問答
2013-01-30 16:51:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
birt 4.2版本,圖表的交互功能有些不能用,比如:為折線圖的圖注提供可視化切換,該功能不能使用。不知是咋回事?
技術(shù)問答
2013-07-03 18:28:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
我的數(shù)據(jù)庫是ORACLE 10G ,數(shù)據(jù)庫表的字符集是SIMPLIFIED CHINESE_CHINA.ZHS16GBK。
在eclipse中新建的BIRT報(bào)表中文顯示都是亂碼,把字體改成宋體也沒用。在新建數(shù)據(jù)集里寫入SQL之后,預(yù)覽結(jié)果里中文也是顯示的是亂碼。
數(shù)據(jù)庫的字符集最好不要改。請問大家有沒有辦法解決這個亂碼問題啊?謝謝大家了。
技術(shù)問答
2012-03-23 16:13:07
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
BIRT報(bào)表算是比較常用的報(bào)表開發(fā)工具,但是近年來,BIRT報(bào)表在企業(yè)中的使用率卻遠(yuǎn)遠(yuǎn)低于FineReport(以下簡稱FR),那么這是出于什么原因呢?通過對BIRT的學(xué)習(xí)途徑、報(bào)表功能和技術(shù)支持等方面的各項(xiàng)熟悉,我們來一起探索這個問題的答案。
BIRT
百度百科對BIRT上對BIRT的解釋如下:BIRT報(bào)表是一款非常流行的開源報(bào)表開發(fā)工具。擁有和Dreamweaver一般的操作界面,可以像畫table一樣畫報(bào)表,生成圖片,導(dǎo)出word,html分頁樣樣齊全,樣式和script設(shè)置簡單。
BIRT的安裝
birt project的安裝分為兩種,一種是下載已經(jīng)安裝好birt的eclipseIDE環(huán)境,配置環(huán)境變量之后使用; 另外一種是插件安裝方法,需要配置環(huán)境變量,下載eclipse環(huán)境以及下載birt所需要的插件,將插件安裝到eclipse中使用。安裝相對負(fù)責(zé),相對而言,FR的安裝包是一個exe【Mac系統(tǒng)為dmg格式安裝包】,無需配置環(huán)境,雙擊即可安裝。
如何學(xué)習(xí)BIRT
一般企業(yè)級用戶比較多的產(chǎn)品都有相對豐富的產(chǎn)品學(xué)習(xí)資源和學(xué)習(xí)途徑,反觀報(bào)表工具FR、商業(yè)智能工具FineBI都是如此,有非常詳細(xì)的幫助文檔、教學(xué)視頻,活躍度很高的技術(shù)交流論壇、以及及時響應(yīng)用戶需求的在線技術(shù)支持人員。
反觀BIRT,在學(xué)習(xí)資源、學(xué)習(xí)途徑和技術(shù)交流平臺上的表現(xiàn)卻很差強(qiáng)人意:谷歌搜索BIRT的學(xué)習(xí)資源,發(fā)現(xiàn)供國內(nèi)BIRT使用者使用的資源很少,比較容易獲得的資源是一個網(wǎng)友自己翻譯成中文的BIRT開發(fā)手冊【各種錯漏就不必說了,關(guān)鍵是資料不齊全】;視頻資料更少,官方視頻是老外錄的Flash格式的視頻【由于英語不太好,又沒有字幕,基本上聽不懂在說什么】。國內(nèi)沒有BIRT的官方技術(shù)交流平臺和技術(shù)支持人員,僅有的幾個網(wǎng)友自發(fā)組件平臺上,問題的更新還停留在2012年以前,活躍度很低。
BIRT具體功能解析
數(shù)據(jù)源
以FR為例,看看企業(yè)需要的數(shù)據(jù)源支持:
數(shù)據(jù)庫數(shù)據(jù)集:以JDBC或者JNDI的方式來連接數(shù)據(jù)庫,FR中內(nèi)置了主流數(shù)據(jù)庫的JDBC驅(qū)動,包括oracle,mysql,sqlserver,sybase等等。
EXCEL數(shù)據(jù)集:Excel數(shù)據(jù)集。
文本數(shù)據(jù)集:存儲在文件中的數(shù)據(jù)
XML數(shù)據(jù)集:數(shù)據(jù)源是一系列的XML文件。
程序數(shù)據(jù)集:因?yàn)镕R是通過AB/StractTableData接口來讀取數(shù)據(jù)源的,而上述所有的數(shù)據(jù)來源都實(shí)現(xiàn)了該接口,因此用戶只要實(shí)現(xiàn)了AB/StractTableData接口,也就可以用自定義類型的數(shù)據(jù)源(程序數(shù)據(jù)集),FR報(bào)表引擎就能夠讀取自定義的數(shù)據(jù)源作為報(bào)表數(shù)據(jù)源使用。
內(nèi)置數(shù)據(jù)集:FR內(nèi)置數(shù)據(jù)集
SAP數(shù)據(jù)集:通過JCO方式連接SAP系統(tǒng),通過調(diào)用BAPI FUNCTION來直接取數(shù)。
多維數(shù)據(jù)庫:多維數(shù)據(jù)庫
BIRT支持?jǐn)?shù)據(jù)源:
?Classic Models Inc.Sample DataBase ———BIRT樣本數(shù)據(jù)庫。
?Flat File Data Source ———從CSV、SSV、TSV、PSV四種格式的文件獲取數(shù)據(jù)源,不支持XLS格式文件
?JDBC Data Source ——— 通過配置jdbc連接數(shù)據(jù)庫,連接時需要添加驅(qū)動
?Script Data Source ——— 通過編寫腳本獲取數(shù)據(jù)源。
?Web Services Data Source ——— 通過web service方式獲取數(shù)據(jù)源。
?XML Data Source ——— 從xml文件獲取數(shù)據(jù)源。
通過以上對比可知,BIRT對很多數(shù)據(jù)源支持度不夠,而隨著企業(yè)對于信息化的要求提高,系統(tǒng)中所存儲的數(shù)據(jù)格式復(fù)雜度也會更加增高,對報(bào)表工具的數(shù)據(jù)源支持度要求會越來越高,BIRT在這方面遠(yuǎn)遠(yuǎn)達(dá)不到很多企業(yè)的要求。
報(bào)表具體布局對比
企業(yè)在選擇報(bào)表解決方案時,不僅要考慮報(bào)表工具的功能和服務(wù),還要考慮它是否易學(xué)、易用。國內(nèi)用戶都非常熟悉Excel,也經(jīng)常用它做些簡單的報(bào)表。
FR的報(bào)表設(shè)計(jì)如下:
FR報(bào)表的設(shè)計(jì)風(fēng)格和Excel相似(當(dāng)然二者本質(zhì)并不一樣),整個設(shè)計(jì)窗口是格子式的可視化編輯界面。用戶可以借助這個界面所見即所得的設(shè)計(jì)出任意復(fù)雜的表樣,免去了傳統(tǒng)條帶式設(shè)計(jì)數(shù)據(jù)對齊的繁瑣。
BIRT的報(bào)表設(shè)計(jì)界面如下:
BIRT的報(bào)表設(shè)計(jì)界面是傳統(tǒng)的條帶式界面,在設(shè)計(jì)報(bào)表樣式,需要的行和列需要畫出;對表頭比較復(fù)雜的中國式報(bào)表來說,各種行列對齊也比較復(fù)雜;不支持excel的行列無限擴(kuò)展,表現(xiàn)之一是不支持XLS,這對習(xí)慣了excel的用戶不甚友好。
權(quán)限功能模塊
BIRT沒有權(quán)限方面的輔助功能,想要實(shí)現(xiàn)權(quán)限,需要費(fèi)力氣自己寫實(shí)現(xiàn)語句。一般對企業(yè)級用戶來講,出于文件機(jī)密性的考慮,在企業(yè)員工訪問企業(yè)平臺時,需要通過角色對員工的權(quán)限進(jìn)行限制。在BIRT中,這個功能實(shí)現(xiàn)起來比較困難。
移動端
蘋果Ipad、iphone、 Android的流行加速了移動互聯(lián)網(wǎng)時代的到來,人們用在移動端的時間越來越多,觸摸式手機(jī)、平板電腦,使用手機(jī)、平板電腦進(jìn)行商務(wù)處理已經(jīng)成為了一種不可阻擋的趨勢,報(bào)表的移動化也成了一個必然的企業(yè)用戶需求。
FR基于此提出了 移動決策平臺 的概念,并取得了一些不俗的成果,使得報(bào)表可以在手機(jī)上進(jìn)行展示,方便快捷:FR移動端采用原生渲染技術(shù),專為移動處理器加速優(yōu)化,相比傳統(tǒng)的HTML報(bào)表,渲染的速度、交互操作的流暢度均有大幅提升。支持IOS、Android,可以進(jìn)行設(shè)備管理。移動端動態(tài)效果好,美觀度高,可根據(jù)不同屏幕分辨率、不同類型的設(shè)備自適應(yīng)布局顯示,支持?jǐn)?shù)據(jù)填報(bào)和校驗(yàn),支持縮放、聯(lián)動、鉆取、翻頁等交互效果。支持二維碼掃描添加服務(wù)器。
相對于FR成熟的移動端,BIRT至今為止未開發(fā)出移動端平臺。
填報(bào)
FR作為國內(nèi)企業(yè)最親睞報(bào)表產(chǎn)品,對填報(bào)的支持度則非常高:FR支持表單補(bǔ)錄、回填、導(dǎo)入自匹配、行式添加刪除、非行式添加刪除、批量增加刪除、綜合報(bào)表增刪改、數(shù)據(jù)補(bǔ)錄匯總(即時計(jì)算)等樣式,支持Excel導(dǎo)入、數(shù)據(jù)批量導(dǎo)入、在線錄入、離線錄入。可以進(jìn)行及時校驗(yàn)、提交校驗(yàn)、強(qiáng)制提交和js校驗(yàn)。
BIRT作為國外報(bào)表產(chǎn)品,更多的側(cè)重點(diǎn)在數(shù)據(jù)的展示上面,沒有填報(bào)功能。而在國內(nèi),在國內(nèi)的企業(yè)級用戶匯總,沒有填報(bào)功能的報(bào)表產(chǎn)品基本上無法使用。
打印
眾所周知,多數(shù)報(bào)表展現(xiàn)瀏覽之后是需要打印出來的,打印報(bào)表需要調(diào)整比例、水平對齊方式、分欄數(shù)、打印頁和打印縮放等等功能。
FR提供了直接打印的功能,很好的解決了各種打印的可視化配置,讓用戶可以隨心所欲的打印出需要的紙面報(bào)表。FR的打印功能是相當(dāng)強(qiáng)大的,獨(dú)創(chuàng)Flash打印,并且支持PDF、Applet、Activex等多種打印方式。其中由于目前幾乎所有的網(wǎng)頁都安裝了flash插件,所以幾種打印方式中,Flash顯得尤為便捷。
BIRT做為開源報(bào)表工具,出于工作量等等考慮,只提供間接的pdf方式打印。這樣的問題是客戶端還要安裝pdf軟件,而且用戶定制、自由配置打印的需求基本不太可能實(shí)現(xiàn)了,讓BIRT的易用性大打折扣。
中文支持
對于報(bào)表工具,對于中文的支持不僅表現(xiàn)在支持中文數(shù)據(jù)庫和中文報(bào)表,也表現(xiàn)在設(shè)計(jì)器對于中文的支持。
FR是國內(nèi)廠商的產(chǎn)品,對中文數(shù)據(jù)、報(bào)表的支持沒有任何問題,設(shè)計(jì)器對中文的支持也很完美。而BIRT做為國外開發(fā)的開源報(bào)表工具,雖然提供了中文插件的補(bǔ)丁包,還是難免會有細(xì)節(jié)上的瑕疵。
比如說,BIRT報(bào)表和快逸報(bào)表都提供了表達(dá)式編輯器,但是BIRT報(bào)表表達(dá)式編輯器對中文的支持卻有些問題。當(dāng)我們輸入concat(”訂單狀態(tài)”,dataSetRow[“STATUS”])這樣的表達(dá)式,保存之后再打開表達(dá)式編輯器的時候,卻變成了亂碼,如下圖:
這樣的細(xì)節(jié)會給報(bào)表用戶帶來很大的不便:簡單的表達(dá)式還好,復(fù)雜的表達(dá)式有上百上千個字符,面對一堆亂碼如何是好?
技術(shù)服務(wù)支持
FR廠商為帆軟軟件有限公司,總部在南京,服務(wù)網(wǎng)絡(luò)遍及全國,設(shè)有如下服務(wù)網(wǎng)點(diǎn):京津區(qū):北京、天津;東北區(qū):沈陽、長春、哈爾濱;蘇皖區(qū):南京、無錫、蘇州、合肥;華北區(qū):濟(jì)南、青島、太原、鄭州、石家莊;上海區(qū):上海;華中區(qū):武漢、長沙;西北區(qū):西安、烏魯木齊、銀川;閩浙區(qū):杭州、福州;西南區(qū):成都、昆明、貴州;華南區(qū):深圳、廣州、南寧。線下定期還會有免費(fèi)培訓(xùn)。
線上則有免費(fèi)騰訊課堂培訓(xùn)、QQ技術(shù)支持、技術(shù)論壇【即帆軟論壇】、報(bào)表交流群【I群370362224,Ⅱ群166295690,Ⅲ群165887890,在線培訓(xùn)群30515661】。
BIRT由于是國外開源產(chǎn)品,國內(nèi)只有代理,無直接技術(shù)支持服務(wù)。
產(chǎn)品下載
BIRT下載地址:http://download.eclipse.org/birt/downloads/
FR下載地址: http://www.finereport.com/products/trial
技術(shù)問答
2015-05-12 17:12:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
報(bào)表中固定的文字想使用properties文件來定義
通過birt的resource選項(xiàng)把properties文件導(dǎo)入,
然后在需要顯示的地方,拖拽一個label控件,選擇“Localization”屬性,就可以把properties中的內(nèi)容顯示到頁面上了,預(yù)覽都沒有問題,但是在tomcat下運(yùn)行,就看不到文件中的內(nèi)容,這是怎么回事呢?
技術(shù)問答
2011-09-15 14:17:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
birt數(shù)據(jù)源用了庫,可是每次把庫改完之后,再刷新,引用庫的報(bào)表的數(shù)據(jù)源卻沒有變
birt 分頁表頭怎樣設(shè)置
技術(shù)問答
2013-07-15 10:40:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
可以在一張圖上表示三個變量的關(guān)系,比如時間、頻率、功率,Birt能做這種圖嗎?
技術(shù)問答
2013-11-30 21:21:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
使用mybatis批量更新數(shù)據(jù),用mybatis操作一直報(bào)錯,但是把日志里的sql語句復(fù)制出來,就可以執(zhí)行.
另外,如果我只傳一個對象過來,是可以操作成功的.如果傳2個對象就報(bào)下面這個錯誤.
xml配置文件:


update v_compress_video

task_id = ${item.taskId}
,video_name = ${item.videoName}
,video_path = ${item.videoPath}
,rstp_driver = ${item.rstpDriver}
,rstp_ip = ${item.rstpIp}
,rstp_port = ${item.rstpPort}
,rstp_account = ${item.rstpAccount}
,rstp_pwd = ${item.rstpPwd}
,status = ${item.status}


id = ${item.id}




錯誤信息:
2016-09-27 19:35:46,904 [DEBUG]:[org.mybatis.spring.transaction.SpringManagedTransaction.openConnection(SpringManagedTransaction.java:85)] JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6a8c256f] will be managed by Spring
2016-09-27 19:35:46,904 [DEBUG]:[org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:132)] ooo Using Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6a8c256f]
2016-09-27 19:35:46,919 [DEBUG]:[org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:132)] ==> Preparing: update v_compress_video SET task_id = 3812808338727632896 ,video_name = 'vName1' ,video_path = 'vPath1' ,rstp_driver = 'vDriver1' ,rstp_ip = 'vIP1' ,rstp_port = 'vPort1' ,rstp_account = 'vAccount1' ,rstp_pwd = 'vPwd1' ,status = 1 WHERE id = 3812808338790547456 ; update v_compress_video SET task_id = 3812808338727632896 ,video_name = 'vName2' ,video_path = 'vPath2' ,rstp_driver = 'vDriver2' ,rstp_ip = 'vIP2' ,rstp_port = 'vPort2' ,rstp_account = 'vAccount2' ,rstp_pwd = 'vPwd2' ,status = 1 WHERE id = 3812808338857656320
2016-09-27 19:35:46,919 [DEBUG]:[org.apache.ibatis.logging.jdbc.BaseJdbcLogger.debug(BaseJdbcLogger.java:132)] ==> Parameters:
2016-09-27 19:35:46,919 [DEBUG]:[org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.logTranslation(SQLErrorCodeSQLExceptionTranslator.java:397)] Translating SQLException with SQL state '42000', error code '1064', message [You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'update v_compress_video
SET task_id = 3812808338727632896
,video_name =' at line 13]; SQL was [] for task [
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'update v_compress_video
SET task_id = 3812808338727632896
,video_name =' at line 13
### The error may involve com.zhixin.dao.compress.impl.CompressVideoDaoImpl.updateList-Inline
### The error occurred while setting parameters
### SQL: update v_compress_video SET task_id = 3812808338727632896 ,video_name = 'vName1' ,video_path = 'vPath1' ,rstp_driver = 'vDriver1' ,rstp_ip = 'vIP1' ,rstp_port = 'vPort1' ,rstp_account = 'vAccount1' ,rstp_pwd = 'vPwd1' ,status = 1 WHERE id = 3812808338790547456 ; update v_compress_video SET task_id = 3812808338727632896 ,video_name = 'vName2' ,video_path = 'vPath2' ,rstp_driver = 'vDriver2' ,rstp_ip = 'vIP2' ,rstp_port = 'vPort2' ,rstp_account = 'vAccount2' ,rstp_pwd = 'vPwd2' ,status = 1 WHERE id = 3812808338857656320
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'update v_compress_video
SET task_id = 3812808338727632896
,video_name =' at line 13

日志里面復(fù)制出來的sql
UPDATE
v_compress_video
SET
task_id = 3812808338727632896,
video_name = 'vName1',
video_path = 'vPath1',
rstp_driver = 'vDriver1',
rstp_ip = 'vIP1',
rstp_port = 'vPort1',
rstp_account = 'vAccount1',
rstp_pwd = 'vPwd1',
STATUS = 1
WHERE id = 3812808338790547456 ;
UPDATE
v_compress_video
SET
task_id = 3812808338727632896,
video_name = 'vName2',
video_path = 'vPath2',
rstp_driver = 'vDriver2',
rstp_ip = 'vIP2',
rstp_port = 'vPort2',
rstp_account = 'vAccount2',
rstp_pwd = 'vPwd2',
STATUS = 1
WHERE id = 3812808338857656320
數(shù)據(jù)庫信息

Create Table
CREATE TABLE `v_compress_video` (
`id` bigint(20) NOT NULL COMMENT '主鍵',
`task_id` bigint(20) NOT NULL COMMENT '任務(wù)id',
`video_name` varchar(50) DEFAULT NULL COMMENT '視頻名稱',
`video_path` varchar(100) DEFAULT NULL COMMENT '視頻文件存放地址;視頻文件使用',
`rstp_driver` varchar(20) DEFAULT NULL COMMENT '實(shí)時視頻驅(qū)動類型;',
`rstp_ip` varchar(32) DEFAULT NULL COMMENT '實(shí)時視頻ip',
`rstp_port` varchar(10) DEFAULT NULL COMMENT '實(shí)時視頻端口',
`rstp_account` varchar(20) DEFAULT NULL COMMENT '實(shí)時視頻登錄賬號',
`rstp_pwd` varchar(20) DEFAULT NULL COMMENT '實(shí)時視頻登錄密碼',
`status` int(2) DEFAULT NULL COMMENT '狀態(tài)',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='視頻濃縮&壓縮任務(wù)關(guān)聯(lián)視頻表'

技術(shù)問答
2016-09-27 21:24:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
今天看到了一篇非常有意思的調(diào)查,看完才知道原來我們程序員小哥哥們的生活是這樣的....
那怎么才能改善現(xiàn)在的生活呢,我們一起來看吧。


看到這里躺槍的小哥哥打個1,嘻嘻。
大家可以點(diǎn)擊加入群:580230636【JAVA大牛學(xué)習(xí)交流】里面有Java高級大牛直播講解知識點(diǎn) 走的就是高端路線(如果你想跳槽換工作 但是技術(shù)又不夠 或者工作上遇到了瓶頸 我這里有一個JAVA的免費(fèi)直播課程 講的是高端的知識點(diǎn)基礎(chǔ)不好的誤入喲 只要你有1-5年的開發(fā)經(jīng)驗(yàn)可以加群找我要課堂鏈接 注意:是免費(fèi)的 沒有開發(fā)經(jīng)驗(yàn)誤入哦)
技術(shù)問答
2017-06-12 14:09:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
請問各位 北京有沒有不加班的互聯(lián)網(wǎng)公司 偏傳統(tǒng)點(diǎn)也沒問題 最近這幾年找的工作沒有不加班的 都是996 要不995 還有997的 累趴了 有沒有不加班的。。。。。。
技術(shù)問答
2018-04-17 09:43:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
現(xiàn)在springboot項(xiàng)目使用繼承AbstractRoutingDataSource的方法
動態(tài)切換數(shù)據(jù)源,ORM使用mybatis
嘗試使用事務(wù)注解會造成切數(shù)據(jù)庫失敗的情況,
請問這個時候如何使用事務(wù)處理,還有springboot能否直接使用
txmanager管理所有的service層
技術(shù)問答
2017-11-01 18:53:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
作為Java程序員來說,最痛苦的事情莫過于可以選擇的范圍太廣,可以讀的書太多,往往容易無所適從。我想就我自己讀過的技術(shù)書籍中挑選出來一些,按照學(xué)習(xí)的先后順序,推薦給大家,特別是那些想不斷提高自己技術(shù)水平的Java程序員們。此外,大家可以加入457036818交流群,互相分享一下關(guān)于JAVA方面的知識。
一、Java編程入門類
  對于沒有Java編程經(jīng)驗(yàn)的程序員要入門,隨便讀什么入門書籍都一樣,這個階段需要你快速的掌握J(rèn)ava基礎(chǔ)語法和基本用法,宗旨就是“囫圇吞棗不求甚解”,先對Java熟悉起來再說。用很短的時間快速過一遍Java語法,連懵帶猜多寫寫代碼,要“知其然”。
1 、《Java編程思想》
  在有了一定的Java編程經(jīng)驗(yàn)之后,你需要“知其所以然”了。這個時候《Java編程思想》是一本讓你知其所以然的好書,它 對于基本的面向?qū)ο笾R有比較清楚的交待,對Java基本語法,基本類庫有比較清楚的講解,可以幫你打一個良好的Java編程基礎(chǔ)。這本書的缺點(diǎn)是實(shí)在太 厚,也比較羅嗦,不適合現(xiàn)代人快節(jié)奏學(xué)習(xí),因此看這本書要懂得取舍,不是每章每節(jié)都值得一看的,挑重點(diǎn)的深入看就可以了。
2 、《Agile Java》中文版
  這本書是出版社送給我的,我一拿到就束之高閣,放在書柜一頁都沒有翻過,但 是前兩天整理書柜的時候,拿出來一翻,竟然發(fā)現(xiàn)這絕對是一本好書!這本書一大特點(diǎn)是以單元測試和TDD來貫穿全書的,在教你Java各種重要的基礎(chǔ)知識的 過程中,潛移默化的影響你的編程思維走向敏捷,走向TDD。另外這本書成書很新,以JDK5.0的語法為基礎(chǔ)講解,要學(xué)習(xí)JDK5.0的新語法也不錯。還 有這本書對于內(nèi)容取舍也非常得當(dāng),Java語言畢竟類庫龐大,可以講的內(nèi)容太多,這本書選擇的內(nèi)容以及內(nèi)容的多寡都很得當(dāng),可以讓你以最少的時間掌握 Java最重要的知識,順便培養(yǎng)出來優(yōu)秀的編程思路,真是一本不可多得的好書。
  雖然作者自己把這本書定位在入門級別,但我不確定這本書用來入門是不是稍微深了點(diǎn),我自己也準(zhǔn)備有空的時候翻翻這本書,學(xué)習(xí)學(xué)習(xí)。
二、Java編程進(jìn)階類
  打下一個良好的Java基礎(chǔ),還需要更多的實(shí)踐經(jīng)驗(yàn)積累,我想沒有什么捷徑。有兩本書值得你在編程生涯的這個階段閱讀,培養(yǎng)良好的編程習(xí)慣,提高你的代碼質(zhì)量。
1 、《重構(gòu) 改善既有代碼的設(shè)計(jì)》
  這本書名氣很大,不用多介紹,可以在閑暇的時候多翻翻,多和自己的實(shí)踐相互印證。這本書對產(chǎn)生影響是潛移默化的。
2 、《測試驅(qū)動開發(fā) by Example》
  本書最大特點(diǎn)是很薄,看起來沒有什么負(fù)擔(dān)??梢哉乙粋€周末的下午,一邊看,一邊照做,一個下午就把書看完,這本書的所有例子跑完了。這本書的作用是通過實(shí)戰(zhàn)讓你培養(yǎng)TDD的思路。
三、Java架構(gòu)師之路
  到這個階段,應(yīng)該已經(jīng)非常嫻熟的運(yùn)用Java編程,而且有了一個良好的編程思路和習(xí)慣了,但是可能還缺乏對應(yīng)用軟件整體架構(gòu)的把握,現(xiàn)在就是邁向架構(gòu)師的第一步。
1 、《Expert One-on-One J2EE Design and Development》
  這本書是Rod Johnson的成名著作,非常經(jīng)典,從這本書中的代碼誕生了springframework。但是好像這本書沒有中譯本。
2 、《Expert One-on-One J2EE Development without EJB》
  這本書由gigix組織翻譯,多位業(yè)界專家參與,雖然署名譯者是JavaEye,其實(shí)JavaEye出力不多,實(shí)在是忝居譯者之名。
  以上兩本書都是Rod Johnson的經(jīng)典名著,Java架構(gòu)師的必讀書籍。在所推薦的這些書籍當(dāng)中,是看過的最仔細(xì),最認(rèn)真的書,當(dāng)時讀這本書幾乎是廢寢忘食的一氣讀完的, 有小時候挑燈夜讀金庸武俠小說的勁頭,書中所講內(nèi)容和自己的經(jīng)驗(yàn)知識一一印證,又被無比精辟的總結(jié)出來,讀完這本書以后,有種被打通經(jīng)脈,功力爆增的感 覺。
  但是后來看過一些其他人的評價(jià),似乎閱讀體驗(yàn)并沒有那么high,也許是因?yàn)槊總€人的知識積累和經(jīng)驗(yàn)不同導(dǎo)致的。那個時候剛好是經(jīng)驗(yàn)知識積累已經(jīng)足夠豐富,但是還沒有系統(tǒng)的整理成型,讓這本書一梳理,立刻形成完整的知識體系了。
3 、《企業(yè)應(yīng)用架構(gòu)模式》
Martin的又一本名著,但這本書只是泛泛的看了一遍,并沒有仔細(xì)看。這本書 似乎更適合做框架的人去看,例如如果打算自己寫一個ORM的話,這本書是一定要看的。但是做應(yīng)用的人,不看貌似也無所謂,但是如果有空,還是推薦認(rèn)真看 看,會讓知道框架為什么要這樣設(shè)計(jì),這樣的層次可以晉升到框架設(shè)計(jì)者的角度去思考問題。Martin的書向來都是推崇,但是從來都沒有像Rod Johnson的書那樣非常認(rèn)真去看。
4 、《敏捷軟件開發(fā)原則、模式與實(shí)踐》
  Uncle Bob的名著,敏捷的經(jīng)典名著,這本書比較特別,與其說是講軟件開發(fā)過程的書,不如說講軟件架構(gòu)的書,本書用了很大篇幅講各種面向?qū)ο筌浖_發(fā)的各種模式,個人以為看了這本書,就不必看GoF的《設(shè)計(jì)模式》了。
四、軟件開發(fā)過程
  了解軟件開發(fā)過程不單純是提高程序員個人的良好編程習(xí)慣,也是增強(qiáng)團(tuán)隊(duì)協(xié)作的基礎(chǔ)。
1 、《UML精粹》
UML其實(shí)和軟件開發(fā)過程沒有什么必然聯(lián)系,卻是軟件團(tuán)隊(duì)協(xié)作溝通,撰寫軟件文檔需要的工具。但是UML真正實(shí)用的圖不多,看看這本書已經(jīng)足夠了,完全沒有必要去啃《UML用戶指南》之類的東西。要提醒大家的是,這本書的中譯本翻譯的非常之爛,建議有條件的看英文原版。
2 、《解析極限編程 擁抱變化》XP
  這是Kent Beck名著的第二版,中英文對照。沒什么好說的,必讀書籍。
3 、《統(tǒng)一軟件開發(fā)過程》UP
  其實(shí)UP和敏捷并不一定沖突,UP也非常強(qiáng)調(diào)迭代,測試,但是UP強(qiáng)調(diào)的文檔和過程驅(qū)動卻是敏捷所不取的。不管怎么說,UP值得去讀,畢竟在中國真正接受敏捷的企業(yè)很少,還是需要用UP來武裝一下自己的,哪怕是披著UP的XP。
4 、《敏捷建?!稟M
Scott Ambler的名著,這本書非常的progmatic,告訴怎么既 敏捷又UP,把敏捷和UP統(tǒng)一起來了,又提出了很多progmatic的建議和做法??梢园选督馕鰳O限編程擁抱變化》、《統(tǒng)一軟件開發(fā)過程》和《敏捷建 ?!愤@三本書放在一起讀,看XP和UP的不同點(diǎn),再看AM是怎么統(tǒng)一XP和UP的,把這三種理論融為一爐,形成自己的理論體系,那么也可以去寫書了。
五、軟件項(xiàng)目管理
  如果突然被領(lǐng)導(dǎo)提拔為項(xiàng)目經(jīng)理,而完全沒有項(xiàng)目管理經(jīng)驗(yàn),肯定會心里沒底;如果覺得自己管理項(xiàng)目不善,很想改善項(xiàng)目管理能力,那么去考PMP肯定是遠(yuǎn)水不解近渴的。
1 、《快速軟件開發(fā)》
  這也是一本名著??梢赃@樣說,有本書在手,就有了一個項(xiàng)目管理的高級參謀給 你出謀劃策,再也不必?fù)?dān)心自己不能勝任的問題了。這本書不是講管理的理論的,在實(shí)際的項(xiàng)目管理中,講這些理論是不解決問題的,這本書有點(diǎn)類似于“軟件項(xiàng)目 點(diǎn)子大全”之類的東西,列舉了種種軟件項(xiàng)目當(dāng)中面臨的各種問題,以及應(yīng)該如何解決問題的點(diǎn)子,只需要稍加變通,找方抓藥就行了。
六、總結(jié)
  在這份推薦閱讀書籍的名單中,沒有列舉流行的軟件框架類學(xué)習(xí)書籍,例如Struts,Hibernate,Spring之類,也沒有列舉AJAX方面的書籍。是因?yàn)檫@類書籍容易過時,而上述的大半書籍的生命周期都足夠長,值得去購買和收藏。
【二.Java書籍Top 10】
下面是Java Inside上推薦的十本不錯的Java書籍。
1)Java Language Specification, Third Edition ( by James Gosling )
本書由Java技術(shù)的發(fā)明者編寫,是Java TM編程語言的權(quán)威性技術(shù)指南。如果你想知道語言之構(gòu)造的精確含義,本書是最好的資源。
2) Effective Java , Second Edition ( by Joshua Bloch )
本書介紹了在Java編程中78條極具實(shí)用價(jià)值的經(jīng)驗(yàn)規(guī)則,這些經(jīng)驗(yàn)規(guī)則涵蓋了大多數(shù)開發(fā)人員每天所面臨的問題的解決方案。通過對Java平臺設(shè)計(jì)專家所使用的技術(shù)的全面描述,揭示了應(yīng)該做什么,不應(yīng)該做什么才能產(chǎn)生清晰、健壯和高效的代碼。.
本書中的每條規(guī)則都以簡短、獨(dú)立的小文章形式出現(xiàn),并通過例子代碼加以進(jìn)一步說明。本書內(nèi)容全面,結(jié)構(gòu)清晰,講解詳細(xì)??勺鳛榧夹g(shù)人員的參考用書?!?
3) Java Concurrency in Practice ( by Brian Goetz )
隨著多核處理器的普及,使用并發(fā)成為構(gòu)建高性能應(yīng)用程序的關(guān)鍵。Java 5以及6在開發(fā)并發(fā)程序取得了顯著的進(jìn)步,提高了Java虛擬機(jī)的性能,提高了并發(fā)類的可伸縮性,并加入了豐富的新并發(fā)構(gòu)建塊。在本書中,這些便利工具的創(chuàng)造者不僅解釋了它們究竟如何工作、如何使用,同時,還闡釋了創(chuàng)造它們的原因,及其背后的設(shè)計(jì)模式。 本書既能夠成為讀者的理論支持,又可以作為構(gòu)建可靠的,可伸縮的,可維護(hù)的并發(fā)程序的技術(shù)支持。本書并不僅僅提供并發(fā)API的清單及其機(jī)制,本書還提供了設(shè)計(jì)原則,模式和思想模型,使我們能夠更好地構(gòu)建正確的,性能良好的并發(fā)程序。
本書的讀者是那些具有一定Java編程經(jīng)驗(yàn)的程序員、希望了解Java SE 5,6在線程技術(shù)上的改進(jìn)和新特性的程序員,以及Java和并發(fā)編程的愛好者。
4)Java Puzzles: Traps, Pitfalls and Corner Cases ( by Joshua Bloch )
Java教父的又一經(jīng)典名著–Java Puzzlers,Amazon五星圖書。認(rèn)為你到底有多了解Java?你是一個代碼神探嗎?你是否曾經(jīng)花費(fèi)過數(shù)天時間去追蹤一個由Java或其類庫的陷阱和缺陷而導(dǎo)致的bug?你喜歡智力測驗(yàn)嗎?那么這本書正好適合你!
5) Thinking in Java ( by Bruce Eckel )
本書贏得了全球程序員的廣泛贊譽(yù),即使是最晦澀的概念,在Bruce Eckel的文字親和力和小而直接的編程示例面前也會化解于無形。從Java的基礎(chǔ)語法到最高級特性(深入的面向?qū)ο蟾拍?、多線程、自動項(xiàng)目構(gòu)建、單元測試和調(diào)試等),本書都能逐步指導(dǎo)你輕松掌握。
從本書獲得的各項(xiàng)大獎以及來自世界各地的讀者評論中,不難看出這是一本經(jīng)典之作。本書的作者擁有多年教學(xué)經(jīng)驗(yàn),對C、C++以及Java語言都有獨(dú)到、深入的見解,以通俗易懂及小而直接的示例解釋了一個個晦澀抽象的概念。本書共22章,包括操作符、控制執(zhí)行流程、訪問權(quán)限控制、復(fù)用類、多態(tài)、接口、通過異常處理錯誤、字符串、泛型、數(shù)組、容器深入研究、Java I/O系統(tǒng)、枚舉類型、并發(fā)以及圖形化用戶界面等內(nèi)容。這些豐富的內(nèi)容,包含了Java語言基礎(chǔ)語法以及高級特性,適合各個層次的Java程序員閱讀,同時也是高等院校講授面向?qū)ο蟪绦蛟O(shè)計(jì)語言以及Java語言的絕佳教材和參考書。

6) Better, faster, lighter Java ( by Justin Gehtland, Bruce A. Tate )
Java的開發(fā)者正深陷于復(fù)雜性的泥沼中而無法自拔。我們的經(jīng)驗(yàn)和能力正接近極限,程序員為了編寫支持所選框架的程序所花的時間比解決真正問題的時間要多得多。我們不禁要問,有必要把Java搞得這么復(fù)雜嗎?.
答案是否定的。本書給你指引了一條出路。無論是維護(hù)應(yīng)用程序,還是從頭開始設(shè)計(jì),你都能夠超越成規(guī),并大幅精簡基本框架、開發(fā)過程和最終代碼。你能重新掌握一度失控的J2EE應(yīng)用程序。..
在本書中,原作者Bruce A.Tate與Justin Gehtland將循序漸進(jìn)、娓娓道來。首先,他們列出了五項(xiàng)基本法則。他們展示了如何構(gòu)建簡單、解耦的代碼,并告訴你如何選擇技術(shù)。他們還對兩種被廣泛運(yùn)用的開源程序如何迎合這些概念進(jìn)行了剖析。最后,作者還將利用這些基本概念構(gòu)建一個簡單但內(nèi)涵豐富的應(yīng)用程序來解決現(xiàn)實(shí)世界中所遇到的問題。
7) Core Java (vol. 1, 2) ( by Cay S. Horstmann, Gary Cornell )
《Java核心技術(shù)》出版以來一直暢銷不衰,深受讀者青睞,每個新版本都盡可能快地跟上Java開發(fā)工具箱發(fā)展的步伐,而且每一版都重新改寫了部分內(nèi)容,以便適應(yīng)Java的最新特性。本版也不例外,它反映了Java SE 6的新特性。全書共14章,包括Java基本的程序結(jié)構(gòu)、對象與類、繼承、接口與內(nèi)部類、圖形程序設(shè)計(jì)、事件處理、Swing用戶界面組件、部署應(yīng)用程序和Applet、異常日志斷言和調(diào)試、泛型程序設(shè)計(jì)、集合以及多線程等內(nèi)容。.
全書對Java技術(shù)的闡述精確到位,敘述方式深入淺出,并包含大量示例,從而幫助讀者充分理解Java語言以及Java類庫的相關(guān)特性。
8) The Java Virtual Machine Specification ( by Tim Linholm, Frank Yellin )
如果你需要了解Java虛擬機(jī)的byte code,或者是一些編譯方面的東西,這本書絕對讓你得償所愿。其不但包含了機(jī)器碼的規(guī)范說明,同時它也是Java編譯器和運(yùn)行環(huán)境的規(guī)格說明書。

9)Robust Java: Exception Handling, Testing, and Debugging ( by Stephen Stelting )
處理異常涉及開發(fā)、設(shè)計(jì)和體系結(jié)構(gòu)等方面的知識。本書共分3個部分。
  第Ⅰ部分介紹Java異常的產(chǎn)生機(jī)理和用法,介紹一些最佳實(shí)踐,講述各類異常處理使用的一般API和技術(shù)。
  第Ⅱ部分闡述可測試性設(shè)計(jì),介紹故障模式分析,討論常見API的異常及起因,分析J2EE體系結(jié)構(gòu)和分布式API的異常模式。
  第Ⅲ部分討論在軟件開發(fā)周期執(zhí)行異常和錯誤處理,分析軟件體系結(jié)構(gòu)、設(shè)計(jì)模式、測試和調(diào)試,列舉成熟的設(shè)計(jì)模式,介紹處理策略對系統(tǒng)體系結(jié)構(gòu)的影響,講述如何構(gòu)建健壯系統(tǒng)。
10)Java Code Convention
最后一本當(dāng)然是Java編碼規(guī)范,這是由Sun公司官方出品的。這也是每個程序員為了得供程序的易讀性,可維護(hù)性需要知道的。
【三.Java 專業(yè)人士必備的書籍】
每個程序員都會有一些由于經(jīng)常被當(dāng)作專業(yè)資料參閱而磨壞的書。下列書籍應(yīng)該是 Java 語言程序員的書架上必備的。書很貴,所以我有意將這份列表弄得很短,僅限于重要書籍。
Thinking in Java (Bruce Eckel)
Thinking in Java, 3rd edition (Bruce Eckel; Prentice Hall PTR,2002 年)
Java 編程思想:第3版 (陳昊鵬 等譯; 機(jī)械工業(yè)出版社,2005 年)
Eckel 的書對于學(xué)習(xí)如何在 Java 語言環(huán)境中使用好面向?qū)ο蠹夹g(shù)極其實(shí)用。書中大量的代碼樣例解釋了他所介紹的概念。文字出自一個并不認(rèn)為 Java 技術(shù)總是正確答案的人,所以相當(dāng)?shù)貙?shí)用。Eckel 具有多種語言的大量經(jīng)驗(yàn),還有用面向?qū)ο蠓绞竭M(jìn)行思考的扎實(shí)技能。本書將這些技能放到實(shí)用的 Java 語言環(huán)境中。他還在寫一本新書,名為 Thinking in Enterprise Java 。
Effective Java (Joshua Bloch)
Effective Java: Programming Language Guide(Joshua Bloch; Addison-Wesley,2001 年)
Effective Java 中文版 (潘愛民 譯; 機(jī)械工業(yè)出版社,2003 年)
本書是理解優(yōu)秀 Java 程序設(shè)計(jì)原則的最佳書籍。大多數(shù)材料從其他的 “學(xué)習(xí) Java ” 的書中根本找不到。例如,Bloch 書中關(guān)于覆蓋equals() 這一章是我讀過的最好的參考資料之一。他也在書中包括了很實(shí)用的建議:用接口替代抽象類和靈活使用異常。Bloch 是 Sun 公司 Java 平臺庫的架構(gòu)師,所以他透徹地了解這門語言。事實(shí)上,他編寫了該語言中大量有用的庫。本書必讀!
The Java Programming Language (Ken Arnold, James Gosling, David Holmes)
The Java Programming Language(Ken Arnold,James Gosling,David Holmes; Addison-Wesley,2000 年)
Java 編程語言(第 3 版) (虞萬榮 等譯,中國電力出版社,2003 年)
這也許是能弄到的最好的 Java 入門讀物。它并不是一個標(biāo)準(zhǔn)規(guī)范,而是一本介紹每門語言特性的可讀書籍。這本書在嚴(yán)謹(jǐn)性和教育性方面權(quán)衡得很好,能夠讓懂編程的人迅速被 Java 語言(和其豐富的類庫)所吸引。
Concurrent Programming in Java: Design Principles and Patterns (Doug Lea)
Concurrent Programming in Java: Design Principles and Patterns, 2nd edition(Doug Lea; Addison-Wesley,1999 年)
Java 并發(fā)編程—設(shè)計(jì)原則與模式(第二版) (趙涌 等譯,中國電力出版社,2004 年)
不是每個開發(fā)人員都需要如此細(xì)致地了解并發(fā)性,也不是每個工程師都能達(dá)到本書的水準(zhǔn),但卻沒有比本書更好的關(guān)于并發(fā)性編程的概述了。如果您對此感興趣,請從這里開始。Lea 是 SUNY 的一名專業(yè)程序員,他的和并發(fā)性有關(guān)的作品和想法都包含在了 JDK 5.0 規(guī)范(引自 JSR166)中,所以您大可放心,他所說的關(guān)于有效使用 Java 語言的建議是值得一聽的。他是一個很善于溝通的人。
Expert One-On-One J2EE Design and Development (Rod Johnson)
Expert One-On-One J2EE Design and Development(Rod Johnson)
WROX: J2EE 設(shè)計(jì)開發(fā)編程指南 (魏海萍 譯,電子工業(yè)出版社,2003 年)
對于剛接觸 J2EE 的人來說,這是唯一的一本如實(shí)反映這項(xiàng)技術(shù)的書。本書收錄了多年的成功經(jīng)驗(yàn)和失敗經(jīng)驗(yàn),不同于其他許多作者,Johnson 樂于將失敗的經(jīng)驗(yàn)公諸于眾。J2EE 常常都被過度使用。Johnson 的書能幫您避免這一點(diǎn)。
Refactoring (Martin Fowler, Kent Beck, John Brant, William Opdyke, Don Roberts)
Refactoring: Improving the Design of Existing Code(Martin Fowler,Kent Beck,John Brant,William Opdyke,Don Roberts; Addison-Wesley,1999 年)
重構(gòu):改善既有代碼的設(shè)計(jì)(中文版) (侯捷 等譯,中國電力出版社 ,2003 年)
Fowler 寫了幾本現(xiàn)已出版的最流行的編程書,包括 Analysis Patterns 。他的關(guān)于 重構(gòu) 的書是這一主題的基本書籍。重構(gòu)代碼是被程序員忽略的訓(xùn)練,但卻是程序員最直觀的想法。重構(gòu)是在不改變代碼結(jié)果的前提下改進(jìn)現(xiàn)有代碼的設(shè)計(jì)。這是保持代碼整潔的最佳方式,用這種方法設(shè)計(jì)的代碼總是很容易修改。什么時候進(jìn)行重構(gòu)呢?當(dāng)代碼“散發(fā)出味道”時。Fowler 的書里滿是 Java 語言代碼的例子。許多 Java 語言集成開發(fā)環(huán)境(IDE)(包括了 IBM 的 Eclipse)都將 Fowler 的重構(gòu)包含了進(jìn)去,每一個都使用他的重構(gòu)名命名,所以熟悉如 extract method 等重構(gòu)方法還是很值得的。
Design Patterns (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides)
Design Patterns: Elements of Reusable Object Oriented Software(Erich Gamma,Richard Helm,Ralph Johnson,John Vlissides; Addison-Wesley,1997 年)
設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ) (李英軍 等譯,機(jī)械工業(yè)出版社 ,2005 年)
這是一本在專業(yè)程序員圈子里更為有名的書,基于作者共同的綽號,這本書被認(rèn)為是 “四人幫(GOF)之書”。模式是思考和解決普通編程問題時可以重用的方式。學(xué)習(xí)模式是一門學(xué)科。使用好模式(或知道什么時候 不 使用模式)是一項(xiàng)技能。忽略模式則是錯誤的。書中所有的例子都以 C++ 表示,但 Java 語言是從那里誕生的,讓 Java 語言程序員由此聯(lián)系到如何在 Java 語言中實(shí)現(xiàn)這些模式相對簡單一些。熟悉模式并了解如何使用好模式使編程更加簡單。這使得和其他程序員交流也更簡單,因?yàn)樵卺槍νㄓ脝栴}的通用解決方案中,模式是描述解決方案中彼此協(xié)作的大量相關(guān)編程概念的快捷方式。一些更為通用的方式,如 工廠方法 則是普便存在的,甚至存在于 Java 語言本身。關(guān)于明智使用模式的這個主題,也可以閱讀 Joshua Kerievsky 的 Refactoring to Patterns ,該書稱可以讓代碼來告訴您何時實(shí)現(xiàn)模式。
Patterns of Enterprise Application Architecture (Martin Fowler)
Patterns of Enterprise Application Architecture(Martin Fowler; Addison-Wesley,2002 年)
企業(yè)應(yīng)用架構(gòu)模式 (王懷民 等譯,機(jī)械工業(yè)出版社 ,2004 年)
比起小型、一次性項(xiàng)目來說,企業(yè)開發(fā)當(dāng)然代表了更大的挑戰(zhàn)。那并不意味著企業(yè)開發(fā)帶來的所有挑戰(zhàn)都是新挑戰(zhàn)。事實(shí)上有些時候,這項(xiàng)開發(fā) 已經(jīng) 是以前完成過的了。Fowler 做了很多個這樣的項(xiàng)目。他的書提到了一些通用解決方案,并提供了關(guān)于使用、折中和可選方案的指導(dǎo)。Fowler 在書中包含了一些熟悉的模式,如模型視圖控制器(MVC),他也提供了一些您也許不了解的模式,如處理 Web 站點(diǎn)上特定頁面請求或行為請求的 Page Controller 模式。正如您對待大多數(shù)模式一樣,一旦您讀過許多模式,您就會認(rèn)為 “我已經(jīng)知道那個模式了” 。也許是這樣,但有一個用來引用模式的通用表達(dá)方式還是很有幫助的。在有多個組件(由不同人開發(fā))的大型項(xiàng)目中,該類引用是一項(xiàng)很好的幫助。
UML Distilled (Martin Fowler)
UML Distilled: A Brief Guide to the Standard Object Modeling Language(Martin Fowler; Addison-Wesley 2003 年)
UML精粹:標(biāo)準(zhǔn)對象語言簡明指南(第3版) (徐家福 譯,清華大學(xué)出版社 ,2005 年)
對于專業(yè)的程序員來說,UML 是一門很重要的通用可視化溝通語言,但是它被過度使用和草率地濫用了。您無需對使用 UML 溝通了解太多。Martin 對 UML 的提煉為您提供了最核心的東西。事實(shí)上,前后的封頁提供了常規(guī)基礎(chǔ)上可能使用到的所有東西。該書中 UML 例子的代碼都是 Java 代碼。
Test-Driven Development: By Example (Kent Beck)
Test-Driven Development: By Example(Kent Beck; Addison-Wesley 2002 年)
測試驅(qū)動開發(fā)(中文版) (崔凱 譯,中國電力出版社 ,2004 年)
測試優(yōu)先編程將使編程發(fā)生革命性變化,能助您成為更好的程序員。在寫代碼之前編寫測試開始很難,但卻是一項(xiàng)威力強(qiáng)大的技能。通過優(yōu)先編寫測試,可使代碼更加簡單,并確保從一開始它就能工作(Beck 實(shí)踐著他提倡的測試優(yōu)先,與人合寫了 JUnit,這是 Java 語言最流行的測試框架)。Beck 的書是權(quán)威的參考資料,擴(kuò)展了的 Money 例子也用 Java 語言寫成。Beck 詳述了如何用測試優(yōu)先進(jìn)行 思考 (這也許是許多程序員首先遇到的障礙)。
The Pragmatic Programmer: From Journeyman to Master (Andy Hunt and Dave Thomas)
The Pragmatic Programmer: From Journeyman to Master(Andrew Hunt 和 David Thomas; Addison-Wesley 1999 年)
程序員修煉之道——從小工到專家 (馬維達(dá) 譯,電子工業(yè)出版社 ,2004 年)
做一個純粹的面向?qū)ο箝_發(fā)人員有其優(yōu)勢所在。在當(dāng)今復(fù)雜的社會中,作為 Java 語言開發(fā)人員,為完成任務(wù)常要妥協(xié)。Hunt 和 Thomas 探討了如何不將真正重要的東西妥協(xié)掉而完成任務(wù)。這不是一本關(guān)于 Java 語言的書,而是 Java 語言開發(fā)人員重要的思想讀物。例如,我認(rèn)為沒從“要解決問題,而不是推卸責(zé)任”這句忠言中受益的程序員,不能像個自豪的藝術(shù)家一樣在他的杰作上簽上大名。
Peopleware: Productive Projects and Teams (Tom DeMarco and Timothy Lister)
Peopleware: Productive Projects and Teams(Tom DeMarco,Timothy Lister; Dorset House,1999 年)
人件(第2版) (UMLChina 翻譯組 譯,清華大學(xué)出版社 ,2003 年)
這份列表中的其他所有書籍都至少和技術(shù)有些相關(guān)。這本書卻不是。在所有技術(shù)行話和首字母縮略詞的海洋中,有時軟件開發(fā)人員和經(jīng)理們會忘記:是 人 制造了軟件。DeMarco 和 Lister 向我們提醒了這一事實(shí),也向我們提醒了形成這一區(qū)別的原因。這不是一本關(guān)于一門特定編程語言的書籍,但卻是每個 Java 語言程序員都應(yīng)該讀的書。關(guān)于 “累死程序員如何讓經(jīng)理們適得其反” 還有許多其他的好書,但這是最好的一本。
【四.推薦給初級Java程序員的3本進(jìn)階書 】
原作者在這篇文章中介紹3本不錯的技術(shù)書籍。作者認(rèn)為這些書籍對新手或者學(xué)生而言尤其有幫助。通過一些基礎(chǔ)性的教程入門后,我們可以使用Java做基礎(chǔ)性的編程。然而,當(dāng)我們需要從初級提升更高的一個層次時,大多數(shù)的人卻不知道從何入手。一些好的書籍在這個階段可以很好地幫助初級開發(fā)人員。
《Head First設(shè)計(jì)模式》
這本書介紹 GoF 常用設(shè)計(jì)模式的方式引人入勝。如果只看封面很難看出來這是一本技術(shù)書籍,更不用說這本技術(shù)書籍介紹的還是面向?qū)ο缶幊痰囊恍┖苡杏玫募记?。這本書采用 Kathy Sierra 式編寫風(fēng)格:雖然她的博客已經(jīng)關(guān)了,但是還是能從前面這個鏈接看到一些她的文章,建議讀一讀。如果你周圍有人認(rèn)為設(shè)計(jì)模式?jīng)]有什么用處,這本書倒是能夠讓他們改變看法。個人而言,我認(rèn)為經(jīng)典的 GoF 手冊是一個很好的參考,但它并不是專為新手準(zhǔn)備的。因此強(qiáng)烈推薦在校生(包括那些不清楚組合模式是什么的程序員們)閱讀此書。
書中介紹的設(shè)計(jì)模式是程序開發(fā)中比較基本的編程模式,也是面向?qū)ο缶幊痰某绦騿T應(yīng)該了解和掌握的。接下來要介紹的這本書則更偏向于Java語言本身,這也是我日常使用的編程語言。
《Effective Java中文版》第二版
每個Java程序員的書桌上都應(yīng)該放有這本書。讓我們先了解下作者:
Joshua Bloch是Google公司的首席Java設(shè)計(jì)師,并且也是一位Jolt 獎獲得者。他之前是Sun的一位杰出工程師(distinguished engineer),也是Transarc公司的一個資深系統(tǒng)設(shè)計(jì)師。Bloch主導(dǎo)了眾多基于Java平臺的軟件系統(tǒng)的設(shè)計(jì)和實(shí)現(xiàn),包括JDK5.0的功能加強(qiáng)以及獲得過獎項(xiàng)的Java集合框架的設(shè)計(jì)實(shí)現(xiàn)。他同時也參與編寫了《Java解惑 | Java Puzzlers》 和《Java并發(fā)編程實(shí)戰(zhàn) | Java Concurrency in Practice》這兩本技術(shù)書。
就憑“Java集合框架開發(fā)者”這個稱號,我們就應(yīng)該認(rèn)真聽取這位值得尊敬的程序員的建議。這些建議在這本書中組織成78個點(diǎn):讀者可以按照自己的速度進(jìn)行閱讀。 在復(fù)寫equals和hashcode方法時,我們應(yīng)該遵循什么規(guī)則? 不可變類(immutable class)是什么? 在特定的情況下,應(yīng)當(dāng)選用哪種最相關(guān)的異常類型?運(yùn)行時異常(Runtime exception)還是可捕獲異常(checked exception)? 對于一個托管語言(managed language,詳細(xì)請參考 wiki介紹),如何在混淆編譯時保留(preserve)類的成員?
上面所有的問題(也包括其他74個)都有實(shí)用主義者Joshua Bloch的詳細(xì)解釋。讀完這本書,程序員應(yīng)該能意識到使用Findbugs、Checkstyle這些工具的必要性了。
《Java并發(fā)編程實(shí)戰(zhàn)》
一年前我正努力在做 UI 開發(fā)工作時(在Eclipse 插件中使用SWT/JFace,其他一些項(xiàng)目則使用Swing ),就看了這本書。那時,我想了解如何實(shí)現(xiàn)一個快速響應(yīng)的UI,從而能給用戶更好的使用體驗(yàn)。我知道自己寫線程安全的代碼是非常復(fù)雜的,盡管運(yùn)行時間長的操作通常是一個獨(dú)立的線程。UI開發(fā)和多核系統(tǒng)應(yīng)用開發(fā)是學(xué)習(xí)如何開發(fā)線程安全的軟件系統(tǒng)的一個很好的理由。
這本書的作者如下:Brian Goetz,Joshua Bloch(又出現(xiàn)這位大牛了,我們剛提到過,還記得嗎?), Doug Lea(java.util.concurrent包的開發(fā)者), David Holmes,Tim Peierls 和Joseph Bowbeer。
這本書的風(fēng)格非常直接,有的代碼在非線程安全的環(huán)境下表現(xiàn)不錯,可一旦到了線程安全的環(huán)境下就變得十分的危險(xiǎn)。接著,這本書介紹了基本的保證線程安全的機(jī)制:同步機(jī)制,volatile關(guān)鍵字等。本書還有對java.util.concurrent接口的介紹,你可以根據(jù)自己的需要來選擇適合的并發(fā)集合類。這本書也介紹了程序運(yùn)行時的錯誤管理,以及如何測試代碼是否是線程安全的。而且書中還提供了說明性的注釋(Annotation)(下載),這些注釋通過了FindBugs的檢查!
技術(shù)問答
2015-05-16 15:03:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
大神們,請幫忙看看。添加了 useGeneratedKeys="true" keyProperty="id"到這個SQL中,如下:

dao層方法中使用注解add(@Param(“teacher”) Teacher teacher ),在調(diào)用時,就報(bào)錯。如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.ExecutorException: Error getting generated key or setting result to parameter object. Cause: org.apache.ibatis.binding.BindingException: Parameter 'id' not found. Available parameters are [telecomOrder, param1]
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:73)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:364)
at com.sun.proxy.$Proxy17.insert(Unknown Source)
為什么會把 keyProperty="id"中的id當(dāng)做參數(shù)?
技術(shù)問答
2016-06-07 16:02:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
java基礎(chǔ)是學(xué)習(xí)java第一步,扎實(shí)的學(xué)習(xí)基礎(chǔ)有利于理解這么語音更有利于后續(xù)的學(xué)習(xí)。小編整理了30多張java的思維導(dǎo)圖,一目了然,讓java不再難懂。 前15張思維導(dǎo)圖
java簡介
java主要特性
java發(fā)展歷史
java環(huán)境配置
java基礎(chǔ)語法
java基本概念
來個美女幫你舒緩一下眼睛哈
java面對對象
java三大特性
java面對對象
java基本數(shù)據(jù)類型
java基本數(shù)據(jù)類型
java變量
哎呦,還不錯哦,看到這里了
java修飾符
java運(yùn)算符
java運(yùn)算符
大家可以點(diǎn)擊加入群:580230636【JAVA大牛學(xué)習(xí)交流】里面有Java高級大牛直播講解知識點(diǎn) 走的就是高端路線(如果你想跳槽換工作 但是技術(shù)又不夠 或者工作上遇到了瓶頸 我這里有一個JAVA的免費(fèi)直播課程 講的是高端的知識點(diǎn)基礎(chǔ)不好的誤入喲 只要你有1-5年的開發(fā)經(jīng)驗(yàn)可以加群找我要課堂鏈接 注意:是免費(fèi)的 沒有開發(fā)經(jīng)驗(yàn)誤入哦)
技術(shù)問答
2017-06-10 19:33:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
css畫蒙娜麗莎效果圖 :

8000行css代碼預(yù)覽:

大家可以點(diǎn)擊加入群:580230636【JAVA大牛學(xué)習(xí)交流】里面有Java高級大牛直播講解知識點(diǎn) 走的就是高端路線(如果你想跳槽換工作 但是技術(shù)又不夠 或者工作上遇到了瓶頸 我這里有一個JAVA的免費(fèi)直播課程 講的是高端的知識點(diǎn)基礎(chǔ)不好的誤入喲 只要你有1-5年的開發(fā)經(jīng)驗(yàn)可以加群找我要課堂鏈接 注意:是免費(fèi)的 沒有開發(fā)經(jīng)驗(yàn)誤入哦)
技術(shù)問答
2017-06-10 18:57:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>> Java開源報(bào)表工具有哪些?大公司一般都用什么報(bào)表工具?數(shù)據(jù)庫是oracle,后臺使用Java
技術(shù)問答
2016-02-22 17:56:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
吸取了教訓(xùn),在不影響結(jié)構(gòu)的前提下把它盡量截圖小一點(diǎn),這樣就不會失真太多。手機(jī)看不清楚的可以收藏后在電腦上看哈。 思維導(dǎo)圖



大家可以點(diǎn)擊加入群:580230636【JAVA大牛學(xué)習(xí)交流】里面有Java高級大牛直播講解知識點(diǎn) 走的就是高端路線(如果你想跳槽換工作 但是技術(shù)又不夠 或者工作上遇到了瓶頸 我這里有一個JAVA的免費(fèi)直播課程 講的是高端的知識點(diǎn)基礎(chǔ)不好的誤入喲 只要你有1-5年的開發(fā)經(jīng)驗(yàn)可以加群找我要課堂鏈接 注意:是免費(fèi)的 沒有開發(fā)經(jīng)驗(yàn)誤入哦)
技術(shù)問答
2017-06-12 15:40:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
目前想要一個應(yīng)用需要APP跟H5.選定了兩個uni-app,ionic.框架選擇vue
這兩個都是可以一次開發(fā)同時發(fā)布多端的。體驗(yàn)上這兩個框架哪個更好?
技術(shù)問答
2019-07-27 18:03:00
HDC調(diào)試需求開發(fā)(15萬預(yù)算),能者速來!>>>
我在使用的是ionic CLI 4.8.0. 我想在發(fā)送http請求時帶上cookie信息,用于登錄狀態(tài)保持。
我的做法是在http post請求的headers里面添加“Cookie”屬性,值為字符串sessionid=xxxxxxxxxxxxxx.
ts文件的代碼如下: (我使用的是Angular的HttpClient)
import {HttpClient, HttpParams} from '@angular/common/http';
import { HttpHeaders } from '@angular/common/http';
構(gòu)造函數(shù)里面初始化對象public http: HttpClient
事務(wù)代碼:
//設(shè)置header
const headers = new HttpHeaders().set("Access-Control-Request-Method", "POST")
.set("Access-Control-Request-Headers", "accept, content-type")
.set("Cookie", "sessionid=tlikemu4syawevedarpir2my3pii23we"); //在header信息里添加Cookie屬性
let options = { // HttpClient的post方法的第三個參數(shù)是options
withCredentials:true,
headers:headers
}
this.http.post('http://my/url/', {}, options).subscribe( // 發(fā)送post請求,body沒有字段
data => this.ProcessLoginResponse(JSON.stringify(data)) ,
err => this.ProcessLoginError(JSON.stringify(err))
)
但是服務(wù)器處理到該請求時,請求的headers里面沒有這個Cookie,我使用wireshark抓包,發(fā)現(xiàn)請求包的headers里面確實(shí)沒有Cookie字段。
Hypertext Transfer Protocol
POST /user/login/ HTTP/1.1\r\n
Host: 192.168.1.108:8000\r\n
Connection: keep-alive\r\n
Content-Length: 2\r\n
Accept: application/json, text/plain, */*\r\n
Origin: file://\r\n
x-wap-profile: http://wap1.huawei.com/uaprof/HUAWEI_SOPHIA_L07_UAProfile.xml\r\n
User-Agent: Mozilla/5.0 (Linux; Android 4.4.2; HUAWEI P7-L07 Build/HuaweiP7-L07) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36\r\n
Content-Type: application/json\r\n
Accept-Encoding: gzip,deflate\r\n
Accept-Language: zh-CN,en-US;q=0.8\r\n
X-Requested-With: com.ionicframework.vp2342525\r\n
\r\n
[Full request URI: http://192.168.1.108:8000/user/login/]
[HTTP request 1/1]
[Response in frame: 233]
File Data: 2 bytes
我試了下將headers.set替換為headers.append,請求頭部也沒有看到添加的字段。
請問該怎么才能正確添加信息到http請求的header里面
技術(shù)問答
2019-06-07 22:56:00