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

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

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

科技資訊

科技學院

科技百科

科技書籍

網(wǎng)站大全

軟件大全

HDC調試需求開發(fā)(15萬預算),能者速來!>>>
初接觸ireport,用的5.6.0版本
我要對一些項目進行合并,合并前如下圖

          圖1
左邊是科室,右邊是項目,要根據(jù)科室合并,合并后實現(xiàn)如下效


  圖2

圖1是我java傳參得到的,代碼如下

    ·          圖3

圖2 是我在ireport中直接寫sql語句得到的

                     圖4


請問,如何通過圖3的方式,即java代碼傳參實現(xiàn)圖2的效果?如能幫助不勝感激
技術問答
2019-12-11 09:16:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
使用IReport開發(fā)報表,現(xiàn)遇到問題啦??!
獲取的數(shù)據(jù)如下,客戶要求如下格式,想讓數(shù)值大的顯示為紅色,不知道如何搞啊?。。∠M赖闹笇б幌?感謝????
技術問答
2013-06-06 13:55:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
使用Ireport制作的模板,想在某個值為空的時候刪除整行,下面的行自動調整位置。
困擾了很久,麻煩大神們,指導一下。怎么解決這個問題
技術問答
2017-09-15 09:18:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
公司的支付系統(tǒng)后臺一直用birt報表生成統(tǒng)計報表,近日感覺birt對內存的利用很不好,速度很慢,且容易耗盡內存;所以看了下其他工具,網(wǎng)上有很多人推薦jasperReorts+ireport開發(fā),可是發(fā)現(xiàn)ireport可視化操作很難實現(xiàn)復雜的“中國式報表”,復雜的表頭設計太難了,弄個合并單元格都很麻煩;網(wǎng)上的工具種類太多,看了一天實在無精力一個個去嘗試開發(fā),因此想請教各位牛人,有沒有用過適合的軟件可以推薦,以下是目前條件的限制:
1、免費,開源更佳;
2、能適應復雜表頭的設計,樣式設計盡可能簡單,比如excel開發(fā)、所見即所得的網(wǎng)格式、兼容比較好的拖拽式…
3、最好輕量點,方便集成到web環(huán)境;
4、能支持基本的會計報表樣式,及基本的導出格式支持;
總之birt除了性能不好外其他都很好,唉,請教有經(jīng)驗的同仁推薦!感謝閱讀討論
技術問答
2015-01-06 18:04:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 有份報表,主表是豎屏的,子表要是橫屏的,求解高手
技術問答
2016-11-25 17:05:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 就是做成枚舉類型的參數(shù),在下拉框里面將這個參數(shù)對應的數(shù)據(jù)庫中的那一列內容呈現(xiàn)給用戶,然后可以讓用戶選擇這個參數(shù)可以輸入哪些值,直接點擊就好,跪謝大神, 必須要在代碼層實現(xiàn)嗎?可以不編寫代碼嗎?,本人java瞎
技術問答
2016-11-04 13:41:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> avax.servlet.ServletException: Servlet execution threw an exception
root causejava.lang.ExceptionInInitializerError net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:124) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:89) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:104) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:62) net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179) net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108) net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668) net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984) com.desuntech.action.XCWTServlet.xcwtdPrint(XCWTServlet.java:290) com.desuntech.action.XCWTServlet.doPost(XCWTServlet.java:87) javax.servlet.http.HttpServlet.service(HttpServlet.java:643) javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
root causenet.sf.jasperreports.engine.JRRuntimeException: java.awt.FontFormatException: java.nio.BufferUnderflowException net.sf.jasperreports.engine.fonts.SimpleFontFace.setTtf(SimpleFontFace.java:178) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFace(SimpleFontExtensionHelper.java:357) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFamily(SimpleFontExtensionHelper.java:290) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFamilies(SimpleFontExtensionHelper.java:254) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:215) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:184) net.sf.jasperreports.engine.fonts.FontExtensionsRegistry.getExtensions(FontExtensionsRegistry.java:56) net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:110) net.sf.jasperreports.engine.util.JRStyledTextParser.(JRStyledTextParser.java:83) net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:124) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:89) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:104) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:62) net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179) net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108) net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668) net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984) com.desuntech.action.XCWTServlet.xcwtdPrint(XCWTServlet.java:290) com.desuntech.action.XCWTServlet.doPost(XCWTServlet.java:87) javax.servlet.http.HttpServlet.service(HttpServlet.java:643) javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
root causejava.awt.FontFormatException: java.nio.BufferUnderflowException sun.font.TrueTypeFont.init(TrueTypeFont.java:523) sun.font.TrueTypeFont.(TrueTypeFont.java:162) sun.font.FontManager.createFont2D(FontManager.java:2255) java.awt.Font.(Font.java:570) java.awt.Font.createFont(Font.java:896) net.sf.jasperreports.engine.fonts.SimpleFontFace.setTtf(SimpleFontFace.java:174) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFace(SimpleFontExtensionHelper.java:357) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFamily(SimpleFontExtensionHelper.java:290) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.parseFontFamilies(SimpleFontExtensionHelper.java:254) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:215) net.sf.jasperreports.engine.fonts.SimpleFontExtensionHelper.loadFontFamilies(SimpleFontExtensionHelper.java:184) net.sf.jasperreports.engine.fonts.FontExtensionsRegistry.getExtensions(FontExtensionsRegistry.java:56) net.sf.jasperreports.extensions.DefaultExtensionsRegistry.getExtensions(DefaultExtensionsRegistry.java:110) net.sf.jasperreports.engine.util.JRStyledTextParser.(JRStyledTextParser.java:83) net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:124) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:89) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:104) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:62) net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179) net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108) net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668) net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984) com.desuntech.action.XCWTServlet.xcwtdPrint(XCWTServlet.java:290) com.desuntech.action.XCWTServlet.doPost(XCWTServlet.java:87) javax.servlet.http.HttpServlet.service(HttpServlet.java:643) javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
note The full stack trace of the root cause is available in the Apache Tomcat/6.0.44 logs.

javax.servlet.ServletException: Servlet execution threw an exception
root causejava.lang.NoClassDefFoundError: Could not initialize class net.sf.jasperreports.engine.util.JRStyledTextParser net.sf.jasperreports.engine.fill.JRBaseFiller.(JRBaseFiller.java:124) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:89) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:104) net.sf.jasperreports.engine.fill.JRVerticalFiller.(JRVerticalFiller.java:62) net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:179) net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:108) net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:668) net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:984) com.desuntech.action.XCWTServlet.xcwtdPrint(XCWTServlet.java:290) com.desuntech.action.XCWTServlet.doPost(XCWTServlet.java:87) javax.servlet.http.HttpServlet.service(HttpServlet.java:643) javax.servlet.http.HttpServlet.service(HttpServlet.java:723)
技術問答
2016-10-20 13:56:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 背景:我在某汽車制造企業(yè)工作,前幾年在質量部門工作用自己的框架開發(fā)了幾個管理信息系統(tǒng),隨著工作時間的增長這個開發(fā)平臺性框架也逐漸成熟,后來被整合到IT部門因為有新的框架不允許再用自己的框架,原來開發(fā)的系統(tǒng)也趨于穩(wěn)定,這個平臺框架眼看就要廢棄了。因為工作十年來一直在制造業(yè)工作,希望能造出一個快速開發(fā)制造業(yè)管理信息系統(tǒng)的平臺性框架,現(xiàn)在不能應用這個平臺了有些心灰意冷,但敝帚自珍啊,不開源豈不是龜玉毀于櫝中?這個平臺采用的開發(fā)技術為ZK+Nutz+MySQL+iReport。內置了權限、流程、圖表管理功能,可以實現(xiàn)不編程構建簡單的系統(tǒng)模型。 問題:我是否需要把這個平臺開源?開源能否找到知音?在不編程構建管理軟件或者說面向非程序員建系統(tǒng)這個方向是否有需求?ZK作為前端是否太冷門,使大多數(shù)程序員卻步? 不是這個平臺多牛B,實在是覺得簡單實用。想聽聽大家的意見!
技術問答
2016-04-15 11:05:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
xml文件如下:



china
14


america
5


england
1


數(shù)據(jù)源配置如下:

報表如下:
預覽報表:

為什么符合該XPath的數(shù)據(jù)有3筆,但是報表中只能查詢出一筆?
技術問答
2012-11-30 14:32:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
我通過傳參數(shù)來讓ireport自己生成條碼 ,可是老是報這樣的錯誤,提示少包,可是我又不知道要導入哪個包,求大神解決
以下是錯誤信息:
log4j:WARN No appenders could be found for logger (net.sf.jasperreports.extensions.ExtensionsEnvironment).
log4j:WARN Please initialize the log4j system properly.
net.sf.jasperreports.engine.fill.JRExpressionEvalException: Error evaluating expression :
Source text : it.businesslogic.ireport.barcode.BcImage.getBarcodeImage(26,$P{AirWayBillBarCode},false,false,null,2,140)
at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:203)
at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:591)
at net.sf.jasperreports.engine.fill.JRCalculator.evaluate(JRCalculator.java:559)
at net.sf.jasperreports.engine.fill.JRFillElement.evaluateExpression(JRFillElement.java:966)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluateImage(JRFillImage.java:483)
at net.sf.jasperreports.engine.fill.JRFillImage.evaluate(JRFillImage.java:463)
at net.sf.jasperreports.engine.fill.JRFillElementContainer.evaluate(JRFillElementContainer.java:259)
at net.sf.jasperreports.engine.fill.JRFillBand.evaluate(JRFillBand.java:459)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillColumnBand(JRVerticalFiller.java:2044)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillDetail(JRVerticalFiller.java:778)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReportStart(JRVerticalFiller.java:288)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:151)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:909)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:841)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:88)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:653)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:969)
at com.dhl.sop.label.LabelReportController.generateSOPLabel(LabelReportController.java:417)
at com.dhl.sop.label.LabelReportHandler.generateByContent(LabelReportHandler.java:62)
at com.dhl.sop.label.LabelReportHandler.run(LabelReportHandler.java:38)
at com.baiqian.web.dax.CompinePDF.process(CompinePDF.java:38)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.internal.runners.TestMethodRunner.executeMethodBody(TestMethodRunner.java:99)
at org.junit.internal.runners.TestMethodRunner.runUnprotected(TestMethodRunner.java:81)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestMethodRunner.runMethod(TestMethodRunner.java:75)
at org.junit.internal.runners.TestMethodRunner.run(TestMethodRunner.java:45)
at org.junit.internal.runners.TestClassMethodsRunner.invokeTestMethod(TestClassMethodsRunner.java:71)
at org.junit.internal.runners.TestClassMethodsRunner.run(TestClassMethodsRunner.java:35)
at org.junit.internal.runners.TestClassRunner$1.runUnprotected(TestClassRunner.java:42)
at org.junit.internal.runners.BeforeAndAfterRunner.runProtected(BeforeAndAfterRunner.java:34)
at org.junit.internal.runners.TestClassRunner.run(TestClassRunner.java:52)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.NoClassDefFoundError: it/businesslogic/ireport/barcode/BcImage
at SOPLabel_1432100220589_480341.evaluate(SOPLabel_1432100220589_480341:405)
at net.sf.jasperreports.engine.fill.JREvaluator.evaluate(JREvaluator.java:190)
... 40 more
Caused by: java.lang.ClassNotFoundException: it.businesslogic.ireport.barcode.BcImage
at java.lang.ClassLoader.findClass(ClassLoader.java:359)
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)
at java.lang.ClassLoader.loadClass(ClassLoader.java:252)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320)
... 42 more

技術問答
2015-05-20 13:53:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> jasperreport報表展示在頁面上好丑,有什么好的教程或者方法,把頁面顯示做得美化點,還有就是PDF導出中文不顯示問題,依照網(wǎng)上的方法改了,還是不行,不知道為什么??
技術問答
2016-03-01 20:36:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 使用iReport中用sql查詢出來的字段,根據(jù)其中一個字段的值,進行判斷顯示另一個值,怎么處理?
技術問答
2016-01-21 15:45:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
@fanyongwei3 你好,想跟你請教個問題:
想請教大神IREPORT怎么添加鼠標事件呀?
技術問答
2013-06-14 11:37:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> ireport已經(jīng)對很多數(shù)據(jù)庫進行了適配,國產(chǎn)達夢數(shù)據(jù)庫還沒有了?怎么進行一個新的數(shù)據(jù)庫的適配了?
技術問答
2011-11-02 08:57:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
我想在ireport的主表報住中做一個table,該table 關聯(lián)一個subdataset,問題就是該 subdataset怎么關聯(lián)主報表的parameter,這樣到時候外面?zhèn)饕粋€參數(shù),兩個sql查詢語句可以用同一個parameter
在線等啊~~~~~~
技術問答
2011-12-31 12:09:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
調用webservice 參數(shù)是一個String xml ,為什么 SOAP body中 xml 的標簽 會變掉
例如
aa

會變成
<a> aa</a>
技術問答
2011-04-01 15:18:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 通過webservice下載服務器端的文件,現(xiàn)在是如果客戶端過多,就要對每個客戶端的下載速度做限制,webservice能控制么?
技術問答
2013-11-21 17:24:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
大師,幫忙啊……
用play framework 怎樣設置webservice 呢,就是讓.net 調用java……
網(wǎng)上有用Axis的,不會用啊……play framework 能與Axis使用嗎?
在網(wǎng)上搜了一下,都是英文的,英文不好,請大家指教……
http://groups.google.com/group/play-framework/browse_thread/thread/c9047591c883d785/2a85c09634e1ab75?q=play+framework++webservice
http://stackoverflow.com/questions/4512836/how-to-use-play-framework-to-develop-webservice?answertab=votes
謝謝大家了……
技術問答
2011-08-30 17:59:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 準備實現(xiàn)一個sso系統(tǒng),但每個子系統(tǒng)該通過什么方式與sso系統(tǒng)進行交互呢?用http接口是否可以?還是用webservice?
技術問答
2014-09-01 15:39:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 當我在客戶端用php調用基于java的服務端wsdl時發(fā)生如下問題:Exception code=0 msg=Unknown error in login: org.apache.xerces.dom.ElementNSImpl cannot be cast to java.lang.String; Fault: S:Server: Unknown error in login: org.apache.xerces.dom.ElementNSImpl cannot be cast to java.lang.String object(SoapFault)#5
該如何處理數(shù)據(jù)轉換的問題?謝謝
技術問答
2014-08-18 11:59:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
安全,可是說是個老生常談的話題,也可以說是個永恒的話題,無論是在那個領域,那個行業(yè),安全都是非常的重要,寫本文時正好看到一些礦難和香港游客 在印尼發(fā)生災難的新聞,可見我們周圍到處都需要安全保駕護航,盡管安全是相對的,但不采取任何措施來應對安全問題帶來的挑戰(zhàn),其后果將是慘不忍睹的,因此 我們要重視安全性問題,無論是在生活中,還是在軟件領域,畢竟生活幸福,使用的軟件安全,都是我們希望的。閑話少說,下面我們就針對 Web Services 的安全問題逐一分析,講解;首先我們要介紹下 Acegi(Spring Security)。
Acegi(Spring Security) 介紹
Acegi 是一個用于 Spring Framework 的安全框架,能夠和目前流行的 Web 容器無縫集成。它使用了 Spring 的方式提供了安全和認證安全服務服務,包括使用 Bean Context,攔截器和面向接口的編程方式。因此,Acegi 安全系統(tǒng) 能夠輕松地適用于復雜的安全需求。
Acegi 的出現(xiàn)是令軟件開發(fā)人員興奮,激動,歡呼的,用福音來形容一點不為過呀。解決了 Java EE 安全性編程模型下的眾多弊端,比如:便攜性差,因 Java EE 應用必須使用容器提供的一些專有描述符 ; 開發(fā)人員要理解大量的專有描述符也不是一件容易的事情,畢竟不同的容器的描述符存在一定的差別的,有時候就是寫錯了一點,都需要好長時間的調試才能得以解 決 ; 還有就是使用 Java EE 安全性編程模型的應用測試工作很難進行,尤其是在 TDD 流行的當下,不能方便,順利的進行測試的開發(fā)可謂是一大弊端呀。Acegi 就是一名神醫(yī),將這些弊病統(tǒng)統(tǒng)解決,尤其是 Spring Security 的出現(xiàn)使應用 Acegi 更加方便,快捷,下面我們就進入 Spring Security 的旅程。
第一眼 Spring Security
準備環(huán)境 下載 spring-security-3.0.3.RELEASE.zip 包從 http://www.springsource.com/download/community 這個鏈接 ; 將 spring-security-samples-contacts-3.0.3.RELEASE.war 和 spring-security-samples-tutorial-3.0.3.RELEASE.war 復制到 apache-tomcat-6.0.18 的 webapps 下;
步驟 2 中的兩個 war 包是 spring-security-3.0.3.RELEASE.zip 解壓后包含的兩個 Demo,下面我們就是通過這兩個 Demo 來看看 Spring Security 給我們帶來的快感,每個的 Demo 我們都會做詳細的解釋,以使讀者能很清楚的了解 Spring Security 的工作過程。
用戶場景
下面我們模擬下經(jīng)常應用的場景,比如用戶登錄后可以操作業(yè)務方法,我們知道業(yè)務方法不是隨意讓用戶可以調用的,有些業(yè)務方法很敏感,比如電信的計費方法, 涉及分成,結算等關鍵業(yè)務,所以需要有足夠權限的用戶才可以調用,因此我們通常在業(yè)務方法前加入一層來攔截用戶請求,根據(jù)用戶權限來判斷是否可以訪問。
圖 1. 用戶場景實例圖
下面我們主要來研究下在 security 層是怎樣實現(xiàn)業(yè)務方法保護的。
初識 Acegi(contacts Demo)
找到 TOMCAT_HOME 下的 bin 目錄然后點擊 startup.bat 來完成啟動 tomcat 的操作,然后我們在瀏覽器中輸入 http://localhost:8080/spring-security-samples-contacts-3.0.3.RELEASE URL, 我們就可以看到應用的主頁了,從主頁內容中我們能夠知道這個 Demo 所應用的 Spring Security 的功能,比如:Remember-me 認證服務,form-based 認證,BASIC 認證和 Database-sourced security data 等。然后點擊 Manage 超鏈接將會轉到登錄界面,在登錄界面中列出了數(shù)據(jù)庫中的所有用戶信息,包括用戶名,密碼和是否可用字段。我們可以清楚的看到 Contacts Demo 使用的是 HTTP 表單認證,使用自定義 Web 表單頁面來收集用戶憑證信息的這一認證機制由于用戶交互性友好等方面受到廣大用戶的青睞。大家應該很熟悉 HTTP BASIC 認證吧,下面我們就通過修改 applicationContext-security.xml 文件來體驗一下這種認證方式,將 applicationContext-security.xml 文件中清單 3 列出的內容注釋掉。
清單 1. 注釋掉的內容

注:上面的內容是指定了登錄的頁面,用戶登錄時將顯示這個指定的頁面的。
然后我們重新啟動 tomcat 容器,輸入 http://localhost:8080/spring-security-samples-contacts-3.0.3.RELEASE/hello.htm URL. 然后點擊 Manage 超鏈接,顯示的這個界面是由瀏覽器生成的,和 XP 系統(tǒng)登錄界面很像吧。
另外一個 Demo spring-security-samples-tutorial-3.0.3.RELEASE.war 我們不做過多的解釋了,有興趣的讀者可以自行研究下,如有疑問可以和我聯(lián)系的。我們知道 Acegi 即可以保護 Web 資源,又可以保護服務層的業(yè)務方法,還可以保護領域對象。保護服務層的業(yè)務方法的這個功能和本文要講解的 Web Service 密切相關,所以下面我們將通過一個例子來詳細講解下 Acegi 是怎樣來保護服務層的業(yè)務方法的,以使大家有一個全面的理解。
Spring security(Acegi) 保護服務層的業(yè)務方法
首先新建一個 java project 命名為 acegi-method-project,然后新建一個接口命名為 EmployeeManager,接口內容如清單 2 所示:
清單 2. EmployeeManager.java 類代碼
package org.ibm.acegi.beans; import java.util.List; public interface EmployeeManager { /** * Delete employee by employee Id * @param id */ public void deleteEmployeeById(int id); /** * get all employees * @param id * @return List */ public List findAllEmployees(); }

可以看出我們需要兩個方法 deleteEmployeeById 和 findAllEmployees, 然后新建一個實現(xiàn)類 implement 接口 EmployeeManager,命名為 EmployeeManagerImpl,代碼內容如清單 4 所示:
清單 3. EmployeeManagerImpl.java 類代碼
package org.ibm.acegi.beans; import java.util.ArrayList;import java.util.List;import org.apache.log4j.Logger; public class EmployeeManagerImpl implements EmployeeManager { private static Logger logger = Logger.getLogger(EmployeeManagerImpl.class); @Override public void deleteEmployeeById(int id) { System.out.println("deleteEmployeeById()"); } @Override public List findAllEmployees() { List list = new ArrayList(); list.add("findEmployeeById"); System.out.println("findEmployeeById()"); r eturn list; }}

方法 deleteEmployeeById 通過員工 Id 來做刪除操作,這里我們只是打印一條信息而已,沒有實現(xiàn)具體過程 ; 同樣 findAllEmployees 方法也是打印一條信息。上面我們說過了,我們要做的是服務層的業(yè)務方法的保護,所以要添加清單 5 所示的內容到 applicationContext.xml,applicationContext.xml 中,大家都很熟悉吧? spring 的配置文件,這里不詳細介紹了。
清單 4. MethodSecurityInterceptor 業(yè)務方法保護
true org.ibm.acegi.beans.EmployeeManager.delete*=ROLE_SUPERVISOR,RUN_AS_SERVER org.ibm.acegi.beans.EmployeeManager.findAllEmployees = ROLE_TELLER,ROLE_SUPERVISOR,RUN_AS_SERVER

從上面我們可以看到 MethodSecurityInterceptor 攔截器暴露的 objectDefinitionSource 屬性類似與 FilterSecurityInterceptor 過濾器暴露的 objectDefinitionSource 屬性,不過前者是針對服務層的業(yè)務方法的,而后者針對的是 Web 資源,HTTP URL。我們來簡單介紹下 objectDefinitionSource 屬性的定義形式,“=”左邊的以全包路徑列出的為方法名,而“=”右邊的內容代表了此方法需要的角色集合,我們需要用逗號來間隔多個角色。
我們再來看下上面需要的 authenticationManager 屬性,內容見清單 6 所示:
清單 5. authenticationManager 內容

清單 6 的內容很關鍵,我們看到 ProviderManager 這個類,他是認證管理器的實現(xiàn),可以配置多種認證管理源來認證用戶的,通過 list 屬性我們可以很容易的明白這一點。我們再來看一下這里面提供的一種認證源 daoAuthenticationProvider,內容見清單 7 所示:
清單 6. daoAuthenticationProvider 內容

userDetailsService 屬性也是一個很關鍵的,詳細配置見清單 8 所示:
清單 7. userDetailsService 內容

它提供用戶的核心信息,包括用戶名,用戶密碼,賬戶狀態(tài)等信息,這是用戶信息的入口。
單元測試 - 保護業(yè)務方法
對于一個開發(fā)者來說,單元測試永遠是必不可少的,尤其是在 TDD 流行的今天來說,下面我們新建一個測試類命名為EmployeeManagerImplTest繼承自TestCase, 然后加入一個方法用來設置認證源命名為createSecureContext,源碼內容見清單 10 所示:
清單 8. createSecureContext 內容
private static void createSecureContext(final BeanFactory bf, final String username, final String password) { AuthenticationProvider provider = (AuthenticationProvider) bf.getBean("daoAuthenticationProvider"); Authentication auth = provider.authenticate( new UsernamePasswordAuthenticationToken(username, password)); SecurityContextHolder.getContext().setAuthentication(auth); }

這個方法提供了需要驗證的基礎信息,包括用戶名,密碼。
單元測試類的teardown方法內容如清單 11 所示:
清單 9. teardown 內容
public void teardown() { SecurityContextHolder.setContext(new SecurityContextImpl()); }

加入我們需要測試類EmployeeManagerImpl的本次需要測試的方法,代碼內容見清單 12 所示:
清單 10. EmployeeManagerImpl 的測試方法
/** * test deleteEmployeeById method. */ public void testDeleteEmployeeById() { EmployeeManager employeeManager = (EmployeeManager) factory.getBean("employeeManager"); createSecureContext(factory, "administrator", "administrator"); employeeManager.deleteEmployeeById(1011); } /** * test findAllEmployees method. */ public void testFindAllEmployees() { EmployeeManager employeeManager = (EmployeeManager) factory.getBean("employeeManager"); createSecureContext(factory, "sale_user", "sale_user"); employeeManager.findAllEmployees(); }

測試類EmployeeManagerImplTest依賴的淚如清單 13 所示:
清單 11. 測試類 EmployeeManagerImplTest 需要導入的依賴類
import junit.framework.TestCase; import org.acegisecurity.Authentication; import org.acegisecurity.context.SecurityContextHolder; import org.acegisecurity.context.SecurityContextImpl; import org.acegisecurity.providers.AuthenticationProvider; import org.acegisecurity.providers.UsernamePasswordAuthenticationToken; import org.ibm.acegi.beans.EmployeeManager; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource;

至此我們的測試類全部完成了,我們可以運行該類,看一下效果,右鍵然后選擇Run as然后選擇Junit test,result見清單 14 所示:
清單 12. 測試結果
Test-begin test deleteEmployeeById() method! test findEmployeeById() method! ---sucess---- Test-end

重寫部分方法 - 了解整個工作過程
為了使大家更清楚的了解 Acegi 的工作過程,我們重寫了 AfterInvocationProvider 和 ApplicationEventPublisher 這兩個接口的方法,新建兩個類,AfterInvocationProviderImpl 實現(xiàn)了 AfterInvocationProvider 接口,ApplicationEventPublisherImpl 實現(xiàn)了 ApplicationEventPublisher 接口,代碼內容分別見清單 15 和清單 16 所示:
清單 13. AfterInvocationProviderImpl 類代碼
public class AfterInvocationProviderImpl implements AfterInvocationProvider { private static Logger logger = Logger .getLogger(AfterInvocationProviderImpl.class); @Override public boolean supports(ConfigAttribute attribute) { System.out.println("ConfigAttribute value is: " + attribute); if (attribute.getAttribute().equals("EMPLOYEESECURITY_CUSTOMER")) {return true;}return false;} @Override public boolean supports(Class clazz) { System.out.println("Security Type: " + clazz); if (clazz == MethodInvocation.class) {return true;} return false;}

可以看出我們重寫了 supports 方法,如果屬性值存在的話返回真,否則返回假。并打印一些信息。
清單 14. ApplicationEventPublisherImpl 類代碼
public class ApplicationEventPublisherImpl implements ApplicationEventPublisher { private static Logger logger = Logger.getLogger(ApplicationEventPublisherImpl.class); @Override public void publishEvent(ApplicationEvent event) { System.out.println("Security method: " + event); } }

publishEvent 方法我們加入了一些輸出信息,這樣有助于我們更好的了解 Spring Security 的工作過程,以使我們能更好的控制它。
然后我們修改下 applicationContext.xml 文件,在 bean employeeManagerSecurity 中添加屬性內容見清單 17 所示:
清單 15. applicationContext 文件修改的內容

然后再添加一個 bean 名稱為 afterInvocationManager,內容見清單 18 所示:
清單 16. afterInvocationManager bean 內容

接下來我們在運行下單元測試文件 EmployeeManagerImplTest,運行結果如清單 19 所示:
清單 17. 重構后的單元測試運行結果
Test-begin Security Type: interface org.aopalliance.intercept.MethodInvocation ConfigAttribute value is: EMPLOYEESECURITY_CUSTOMER Security method: org.acegisecurity.event.authorization .AuthorizedEvent[source=ReflectiveMethodInvocation: public abstract void org.ibm.acegi.beans.EmployeeManager.deleteEmployeeById(int); target is of class [org.ibm.acegi.beans.EmployeeManagerImpl]] test deleteEmployeeById() method! Security method: org.acegisecurity.event.authorization .AuthorizedEvent[source=ReflectiveMethodInvocation: public abstract java.util.List org.ibm.acegi.beans.EmployeeManager.findAllEmployees(); target is of class [org.ibm.acegi.beans.EmployeeManagerImpl]] test findEmployeeById() method! ---sucess---- Test-end

從結果中我們能很清晰的知道 Acegi 的加載過程,有助于我們更好的理解,使用好 Acegi。通過上面的學習我們對 Spring security(Acegi) 有了一個初步的了解,并對其是怎樣來對服務層的業(yè)務方法進行保護有了更清晰的認識,為我們接下來的知識講解鋪平了道路,下面我們就介紹下 Acegi 是怎樣為 Web Service 提供保護的,首先我們新建一個 Web Service,我們知道開發(fā) Web Service 的方法有很多種,我還是比較喜歡用 CXF 的。
開發(fā) Web Services
新建一個 Java project 工程,命名為 ws _example, 創(chuàng)建 service 類,CXFService.java 和 CXFServiceImpl.java, 代碼分別見清單 7 和清單 8 所示:
清單 18. CXFService.java
package org.ibm.cxf.service; public interface CXFService { public String sayHello(String name); }

清單 19. CXFServiceImpl.java
package org.ibm.cxf.service.impl; import org.ibm.cxf.service.CXFService; public class CXFServiceImpl implements CXFService{ public String sayHello(String name) {return "Hello "+name;}}

接下來,我們要新建一個 cxf-servlet.xml 和 web.xml 文件,文件內容分別如清單 9 和清單 10 所示:
清單 20. cxf-servlet.xml

注意一下,simple:server 后的 serviceClass 指定的是接口的名稱而 simple:serviceBean 后指定的是實現(xiàn)類的名稱,這個地方費了我好多時間呀,郁悶。
清單 21. web.xml
cxf cxf cxf cxf Apache CXF Endpoint org.apache.cxf.transport.servlet.CXFServlet 1 cxf /services/* 30

上面代碼配置了一個 servlet,名稱為 cxf。
最后我們還是需要新建一個 ant 腳本來打包,build.xml,其腳本如清單 11 所示:
清單 22. build.xml for CXFService

運行 ant 腳本,將生成的 cxf.war 包放到 tomcat 的部署目錄下,啟動 tomcat,待啟動完成后,我們在瀏覽器中輸入 http://localhost:8080/cxf/services/CXFService?wsdl 將顯示如下信息:
- - - ……

出現(xiàn)如上信息表示 service 發(fā)布成功了,關于 service 的詳細信息在這個 WSDL 文件中都有定義,如出現(xiàn)問題請仔細檢查以上步驟。
下面我們測試下 service 是否可用。
單元測試
新建一個 JUnit 測試類 CXFServiceTest,代碼如清單 12 所示:
清單 23. CXFServiceTest.java
package org.ibm.axis.service.client; import junit.framework.Assert; import org.apache.cxf.frontend.ClientProxyFactoryBean; import org.ibm.cxf.service.CXFService; import org.junit.Test; public class CXFServiceTest { @Test public void testSayHello(){ ClientProxyFactoryBean factory = new ClientProxyFactoryBean(); factory.setServiceClass(CXFService.class); factory.setAddress("http://localhost:8080/cxf/services/CXFService"); CXFService client = (CXFService) factory.create(); String response = client.sayHello("jack"); Assert.assertEquals("Hello jack", response); } }

其中 Address 可以從上面的 WSDL 文件中得到。
運行 JUnit test, 結果如圖 6 所示:
圖 2. Junit service 測試結果
可見這個 Web Service 方法是可用的,對于這個 Web Service 的保護我們將采取攔截器的方式。
對于 Interceptor 更多知識請大家自行查看相關資料,下面我們新建一個攔截器 SecurityInInterceptor 繼承自 AbstractPhaseInterceptor 類,代碼見清單 26 所示:
清單 24. SecurityInInterceptor 攔截器代碼
public class SecurityInInterceptor extends AbstractPhaseInterceptor { private static Log logger = LogFactory.getLog(SecurityInInterceptor.class); private AuthenticationManager authenticationManager; public void setAuthenticationManager( AuthenticationManager authenticationManager) { this.authenticationManager = authenticationManager; } public SecurityInInterceptor() { super(Phase.INVOKE);} public void handleMessage(Message message) throws Fault { String baseAuth = null; Map> reqHeaders = CastUtils .cast((Map)message.get(Message.PROTOCOL_HEADERS)); if (reqHeaders != null) { for (Map.Entry> e : reqHeaders.entrySet()) { if ("Authorization".equalsIgnoreCase(e.getKey())) baseAuth = e.getValue().get(0);} } if ((baseAuth != null) && baseAuth.startsWith("Basic ")) { byte[] base64Token;String username = "";String password = ""; try { base64Token = baseAuth.substring(6).getBytes("UTF-8"); String token=new String(Base64.decodeBase64(base64Token),"UTF-8"); int delim = token.indexOf(":"); if (delim != -1) {username = token.substring(0, delim); password = token.substring(delim + 1);} Authentication authResult = authenticationManager.authenticate (new UsernamePasswordAuthenticationToken(username, password)); if(logger.isDebugEnabled()){logger. debug("Authentication success:"+ authResult.toString());}SecurityContextHolder.getContext() .setAuthentication(authResult);} catch (AuthenticationException failed) {if (logger.isDebugEnabled()) {logger.debug("Authentication request for user '" + username+ "' failed: " + failed.toString());} SecurityContextHolder.clearContext();throw new Fault(failed); } catch (Exception e){SecurityContextHolder.getContext().setAuthentication(null); throw new Fault(e);}}}}

再建一個 SecurityOutInterceptor 攔截器,代碼見清單 26 所示:
清單 25. SecurityOutInterceptor 攔截器內容
public class SecurityOutInterceptor extends AbstractPhaseInterceptor { public SecurityOutInterceptor() { super(Phase.SEND);} public void handleMessage(Message message) throws Fault { SecurityContextHolder.clearContext();}}

然后我們修改 cxf-servlet.xml 文件,修改內容如清單 27 所示:
清單 26. 修改 cxf-servlet.xml 的內容

這樣當我們訪問Web Service時候將會被這個攔截器攔截,我們看下authenticationManager這個屬性很熟悉吧?對,我們上面講解服務層的業(yè)務方法保護那部分提到了,最后根據(jù)applicationContext.xml文件做相應的修改后,我們就可以使用spring security(Acegi)為我們開發(fā)的Web Service方法提供保護了,以上對業(yè)務方法保護的過程我們可以用圖 7 來簡單概括下。
圖 3. 業(yè)務保護方法時序圖 mywang2011-03-22T11:17:00 圖片順序不對
總結
本文首先通過 Spring Security(Acegi) 自帶的兩個例子帶領大家認識一下 Spring Security(Acegi) 的面貌,然后通過一個具體實例來講解 Spring Security(Acegi) 是怎樣來保護服務層的業(yè)務方法的,然后用 CXF 開發(fā)了一個 Web Service 并實現(xiàn)了 Spring Security(Acegi) 對它的保護。每一個實例都是通過從新建工程開始一步一步的帶領大家來繼續(xù)的,我們知道僅僅通過一片文章來很詳細的將 Spring Security(Acegi) 保護 Web Services 的方方面面都闡述的很清楚,那是不可能的。
本文提供了最基本,最基礎的開發(fā)過程,任何復雜的事務歸根結底還是源于基礎,有句話是這樣說的,“授之以魚,不如授之以漁”,我想只要方向對了,知道如何下手了,就不會有大的失誤,
文章出處: IBM developerWorks
技術問答
2011-04-22 22:08:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> Caused by: java.net.ConnectException: ConnectException invoking http://localhost:8880/cxf2/webServices/userService: Connection refused: connect at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.mapException(HTTPConduit.java:1422) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1407) at org.apache.cxf.transport.AbstractConduit.close(AbstractConduit.java:56) at org.apache.cxf.transport.http.HTTPConduit.close(HTTPConduit.java:640) at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:62) ... 9 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:195) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:182) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:366) at java.net.Socket.connect(Socket.java:529) at sun.net.NetworkClient.doConnect(NetworkClient.java:158) at sun.net.www.http.HttpClient.openServer(HttpClient.java:394) at sun.net.www.http.HttpClient.openServer(HttpClient.java:529) at sun.net.www.http.HttpClient.(HttpClient.java:233) at sun.net.www.http.HttpClient.New(HttpClient.java:306) at sun.net.www.http.HttpClient.New(HttpClient.java:323) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:860) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:801) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:726) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:904) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.handleHeadersTrustCaching(HTTPConduit.java:1359) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.onFirstWrite(HTTPConduit.java:1301) at org.apache.cxf.io.AbstractWrappedOutputStream.write(AbstractWrappedOutputStream.java:42) at org.apache.cxf.io.AbstractThresholdOutputStream.write(AbstractThresholdOutputStream.java:69) at org.apache.cxf.transport.http.HTTPConduit$WrappedOutputStream.close(HTTPConduit.java:1379) ... 12 more Exception in thread "main" javax.xml.ws.WebServiceException: Could not send Message. at org.apache.cxf.jaxws.JaxWsClientProxy.invoke(JaxWsClientProxy.java:145) at $Proxy29.add(Unknown Source) at server.Client.main(Client.java:16) Caused by: java.net.ConnectException: ConnectException invoking http://localhost:8880/cxf2/webServices/userService: Connection refused: connect
技術問答
2011-10-09 15:42:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
google地圖在一個div1里面,當點擊某個按鈕增加一個div2將google地圖的div1覆蓋,然后操作完之后將div2隱藏,div1的google地圖就不能顯示,并且出現(xiàn)js錯誤。
或者
goole地圖的div開始可以正常顯示,然后將這個div隱藏一下,再顯示出來,地圖就開不到,并且出現(xiàn)js錯誤。請問高手如何解決google地圖的div隱藏的問題。
技術問答
2012-07-14 12:51:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 在網(wǎng)頁開發(fā)中使用google map,但是存在偏差問題,也查到需要糾偏,到底怎樣糾偏呢?
技術問答
2013-07-15 16:11:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
始終像是加載一樣 只能顯示marker的標記 別的都不現(xiàn)實 不知道為何,從官網(wǎng)上下的demo
而且 我也申請了Key 但是 還是提示我的key 和bundle ID 貌似不匹配
Your key may be invalid for your bundle ID: com.example.SDKDemos
技術問答
2013-07-12 09:44:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
像這樣: http://www.yarrmaps.com/#lt=14.5819|ln=-104.1761|z=6
技術問答
2013-06-10 15:06:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
我需要開發(fā)一個GOOGLE MAP,
GOOGLE API KEY 已經(jīng)申請完成,在MAIN.XML中已經(jīng)添加進去了
在AndroidManifest.xml中已經(jīng)添加





在java代碼中也繼承了MapActivity.
public class MainActivity extends MapActivity

但是為什么現(xiàn)在出來的還是白色的格子,網(wǎng)上的問題也都查了,無非就是APIKEY的申請和XML的權限。
哪位大神能幫忙解決下,已經(jīng)弄了好長時間了。


技術問答
2013-05-29 07:42:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 平臺android2.3.3 因為在goole map上顯示不出我們學校的平面圖。所以我想自己往goole map上添加一幅我們學校的2D圖,但是怎樣實現(xiàn)添加的2D圖和goole map一起縮放呢?
技術問答
2013-04-30 14:05:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
不帶G的引用:不需要key

帶G的引用:需要key


請問有什么區(qū)別。。用那種比較好點???
技術問答
2012-11-07 14:29:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> mysql中存儲了公交站點路線經(jīng)緯度,怎樣通過php在googlemap中顯示這條路線
技術問答
2013-03-20 16:28:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> php 調用googlemap,并根據(jù)客戶端發(fā)送的經(jīng)緯度顯示位置,怎樣實現(xiàn)?
技術問答
2013-03-18 14:33:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
最近與一專門做地圖的哥們聊了聊關于地圖上面的內容,在他看來現(xiàn)在android上的google map api只能是用來玩玩,根本無法進行具體應用:
- API BUG過多
- 地圖不準(這點好象是這樣)
- 地圖慢
- 標量圖,消耗流量大
真是這樣么?
技術問答
2013-02-27 20:26:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> 以前是在http://code.google.com/android/maps-api-signup.html申請,但是現(xiàn)在好像不是了,一進去就跳轉
技術問答
2013-02-20 17:03:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
如題所述,在 MySQL 存儲過程里怎么才能觸發(fā)遠程的 HTTP 服務呢?
技術問答
2017-05-17 10:40:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
報的錯誤:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: Hibernate-related JDBC operation; bad SQL grammar []; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: FUNCTION cr_debug.ENTER_MODULE does not exist org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:659) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:552) javax.servlet.http.HttpServlet.service(HttpServlet.java:617) javax.servlet.http.HttpServlet.service(HttpServlet.java:717) org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:198) org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76) common.filter.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:141)
我感覺是mysql的版本問題,這個錯誤好像是那個函數(shù)不存在,但是我本地上就寫了3個函數(shù)都拷貝到服務器上了?。?!
希望給點意見是什么問題,這個功能模塊在本地上可以使用,但是發(fā)布到服務器上就不能用了??!那位知道的給點意見,謝謝
技術問答
2013-03-15 11:27:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
新人剛寫一個分頁的存儲過程,但是查詢數(shù)據(jù)時,越到后面效率越低,應該怎么去做優(yōu)化,大神們給看看 SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO ALTER PROCEDURE [dbo].[MyPageRead] ( @TblName nvarchar(3000) --連接的表名,即FROM后面的內容 ,@FldName nvarchar(3000)='*' --要查詢的字段名稱,默認為全部 ,@FldSort nvarchar(3000)=NULL --排序字段,不需要ORDER BY,排序自行設置 ,@strCondition nvarchar(3000)=NULL --要查詢的語句,不需要WHERE,前面不要跟AND ,@strGroup nvarchar(3000)=NULL --要聚合的語句,不需要GROUP BY ,@strHaving nvarchar(3000)=NULL --HAVING語句,不需要HAVING ,@Dist bit=0 --是否添加查詢字段的DISTINCT,0不添加/1添加 ,@strOrder nvarchar(1000)=NULL --一個排序字段,當@FldSort為空時必須指定,而且作為聚合 ,@PageSize int=10 --每頁要顯示的數(shù)量 ,@Page int=1 --要顯示那一頁的數(shù)據(jù) ,@Counts int=1 output --返回總條數(shù) ,@PageCounts int=1 output --返回總頁數(shù) ) AS SET NOCOUNT ON --不返回計數(shù) --定義變量 DECLARE @tmpFldSort nvarchar(3000) --構成的ORDER BY語句存放處 DECLARE @tmpstrCondition nvarchar(3000) --WHERE語句存放處 DECLARE @tmpstrGroup nvarchar(3000) --GROUP BY語句存放處 DECLARE @tmpstrfirst nvarchar(3000) --1.開頭存放處,控制Dist DECLARE @tmpstrfirstCount nvarchar(3000) --2.開頭存放處,控制Dist /*計算時間*/ DECLARE @StartTime datetime=GETDATE() /**/ IF (@FldSort IS NULL OR @FldSort='') AND (@strOrder IS NULL OR @strOrder='') RETURN --如果有問題,直接跳出 IF @FldSort IS NULL OR @FldSort='' SET @tmpFldSort=@strOrder+' ASC ' ELSE SET @tmpFldSort=@FldSort --以上為設置ORDER BY語句 IF @strCondition IS NULL OR @strCondition='' SET @tmpstrCondition='' ELSE SET @tmpstrCondition=' WHERE '+@strCondition --以上為設置WHERE語句 IF @strGroup IS NULL OR @strGroup='' SET @tmpstrGroup='' ELSE BEGIN SET @tmpstrGroup=' GROUP BY '+@strGroup IF @strHaving IS NOT NULL AND @strHaving<>'' SET @tmpstrGroup+=' HAVING '+@strHaving END --以上為設置GROUP BY語句 DECLARE @tmpFldsubstr nvarchar(1000) DECLARE @tmpFldsubIndex int SET @tmpFldsubIndex=CHARINDEX(CHAR(32),LTRIM(@FldSort)) SET @tmpFldsubstr=LEFT(LTRIM(@FldSort),@tmpFldsubIndex) --以上取出排序字段的第一個字段作為聚合方式 IF @Dist=0 BEGIN SET @tmpstrfirst=' SELECT ' IF @strOrder IS NULL OR @strOrder='' SET @tmpstrfirstCount=' SELECT @Counts=COUNT('+@tmpFldsubstr+')' ELSE SET @tmpstrfirstCount=' SELECT @Counts=COUNT('+@strOrder+')' END ELSE BEGIN SET @tmpstrfirst=' SELECT DISTINCT ' IF @strOrder IS NULL OR @strOrder='' SET @tmpstrfirstCount=' SELECT @Counts=COUNT(DISTINCT '+@tmpFldsubstr+')' ELSE SET @tmpstrfirstCount=' SELECT @Counts=COUNT(DISTINCT '+@strOrder+')' END --以上判斷聚合Dist DECLARE @sqlStr nvarchar(3000) --查詢的sql語句 SET @sqlStr=@tmpstrfirstCount+' FROM '+@TblName+@tmpstrCondition EXEC sp_executesql @sqlStr,N'@Counts int out ',@Counts out --返回查找到的總數(shù) DECLARE @tmpCounts int IF @Counts=0 SET @tmpCounts=1 ELSE SET @tmpCounts=@Counts SET @PageCounts=(@tmpCounts+@PageSize-1)/@PageSize --以上獲得分頁總數(shù) IF @Page<1 SET @Page=1 IF @Page>@PageCounts SET @Page=@PageCounts --以上設置分頁 DECLARE @tmpsql nvarchar(3000) SET @tmpsql='WITH temptbl AS(SELECT TOP '+CAST(@Page*@PageSize AS nvarchar(50))+' ROW_NUMBER() OVER(ORDER BY '+@tmpFldSort+') AS Row,'+@FldName+' FROM '+@TblName+' '+@tmpstrCondition+' '+@tmpstrGroup+') ' SET @tmpsql+='SELECT * FROM temptbl WHERE [Row] BETWEEN '+CAST((@Page-1)*@PageSize+1 AS nvarchar(50))+' AND '+CAST((@Page-1)*@PageSize+@PageSize AS nvarchar(50))+' ORDER BY '+@tmpFldSort SELECT @tmpsql 查看拼接的字符串 EXEC sp_executesql @tmpsql /*計算時間*/ SELECT DATEDIFF(MS,@StartTime,GETDATE()) AS [Time] /**/ SET NOCOUNT OFF
技術問答
2013-03-27 12:19:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
mysql中的存儲過程是這樣的:call proc2(10,10,@out1);我想在mybatis中調用,并且想去的調用后的值,有人告訴我這么寫,但是還是得不到值:
技術問答
2015-01-07 08:54:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> mysql存儲過程你們用得多不多呀?發(fā)現(xiàn)很多開源的都不用。另外,復制整個數(shù)據(jù)庫文件的時候也不能將存儲過程復制過來。
技術問答
2014-12-16 14:47:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>>
自己剛開始寫存儲過程,面對幾百萬幾千萬的數(shù)據(jù)量,執(zhí)行存儲過程速度特別的慢。自己對索引的用法也不是很熟練,通常不知道哪里該加,哪里不該加。求指點。
以下下是存儲過程:
CREATE OR REPLACE PROCEDURE PRO_UW_APPLY_INFO_KZ(IN_START_SPAN IN DATE, --任務開始區(qū)間
IN_END_SPAN IN DATE, --任務結束區(qū)間
OUT_MSG_CODE OUT VARCHAR2, --0 代表任務執(zhí)行成功,其他代表失敗
OUT_MSG OUT VARCHAR2 --返回信息
) AS
BEGIN
OUT_MSG_CODE := '0';
OUT_MSG := '執(zhí)行成功' || TO_CHAR(IN_START_SPAN, 'yyyy-MM-dd') || TO_CHAR(IN_END_SPAN, 'yyyy-MM-dd');
--Step 1 :刪除目標表所有數(shù)據(jù)
EXECUTE IMMEDIATE 'TRUNCATE TABLE UW_APPLY_INFO_KZ';
--Setp 2 : 同步源表所有數(shù)據(jù)
INSERT INTO UW_APPLY_INFO_KZ(
APPLY_BAR_CODE ,
POLICY_NO ,
AGENT_NO ,
AGENT_NAME ,
AGENT_SEX ,
AGENT_HIRE_DATE,
BRANCH_CODE ,
BRANCK_FULL_NAME ,
APPLICANT_NO ,
APPLY_STATUS ,
CHANNEL_TYPE ,
SIGNED_DATE ,
FREQUENCY ,
PREM_TYPE ,
APPLICANT_ADDR_CONTACT ,
APPLICANT_ADDR_CONTACT_NAME ,
APPLICANT_CONTACT_PHONE ,
APPLICANT_CONTACT_PHONE_NAME ,
CLIENT_NAME ,
CLIENT_SEX ,
CLIENT_ID_TYPE ,
CLIENT_ID_NAME ,
EFFECT_DATE ,
CHNL_DETAIL ,
RE_PREM_TYPE ,
BANK_CODE ,
DESCRIPTION
)SELECT
ai.APPLY_BAR_CODE ,
ai.POLICY_NO ,
ai.AGENT_NO ,
(select EMP_NAME FROM staff_info st where st.emp_no=ai.AGENT_NO),
(select SEX_DESC FROM SEX s,staff_info st where s.sex_code=st.SEX_CODE and st.emp_no=ai.AGENT_NO),
(select HIRE_DATE FROM staff_info st where st.emp_no=ai.AGENT_NO),
ai.BRANCH_CODE ,
(SELECT BRANCH_FULL_NAME FROM BRANCH_INFO b where b.BRANCH_CODE = ai.BRANCH_CODE),
ai.APPLICANT_NO ,
ai.APPLY_STATUS ,
ai.CHANNEL_TYPE ,
ai.SIGNED_DATE ,
ai.FREQUENCY ,
ai.PREM_TYPE ,
ai.APPLICANT_ADDR_CONTACT ,
(SELECT DETAIL_ADDRESS FROM CLIENT_ADDRESS WHERE ADDRESS_SEQ=ai.APPLICANT_ADDR_CONTACT),
ai.APPLICANT_CONTACT_PHONE ,
(SELECT PHONE_NO FROM CLIENT_PHONE WHERE PHONE_SEQ=ai.APPLICANT_CONTACT_PHONE),
(SELECT CLIENT_NAME from CLIENT_INFORMATION c where c.CLIENT_NO=ai.APPLICANT_NO ),
(SELECT SEX_DESC FROM SEX s,CLIENT_INFORMATION c where s.sex_code=c.SEX_CODE and c.CLIENT_NO=ai.APPLICANT_NO),
(select ID_TYPE from CLIENT_INFORMATION c where c.CLIENT_NO=ai.APPLICANT_NO ),
(select ID_TYPE_NAME from ID_TYPE i,CLIENT_INFORMATION c where i.id_type=c.ID_TYPE and c.CLIENT_NO=ai.APPLICANT_NO ),
ai.EFFECT_DATE ,
ai.CHNL_DETAIL ,
ai.RE_PREM_TYPE ,
ai.BANK_CODE ,
(select DESCRIPTION from BANK_CATEGORY b where b.BANK_CATEGORY=ai.BANK_CODE)
FROM UW_APPLY_INFO ai;
--提交
COMMIT;
--捕獲命令支持異常
EXCEPTION
WHEN OTHERS THEN
OUT_MSG_CODE := SQLCODE;
OUT_MSG := SQLERRM;
--回滾
ROLLBACK;
IF OUT_MSG_CODE = '0' THEN
COMMIT;
END IF;
END;

技術問答
2014-10-24 14:12:00
HDC調試需求開發(fā)(15萬預算),能者速來!>>> create or replace procedure pro_user_type( OUT_Msg_CODE out varchar2, --0 成功必須返回;1失敗 OUT_Msg out varchar2 --返回的信息 )as begin OUT_Msg_CODE :='0'; OUT_Msg :='執(zhí)行成功'; INSERT INTO USER_TYPE( ID, EMAIL, JOB, TELEPHONE, TYPE, gender, STATUS, NAME )select id, email, job, telephone, type, decode(type,3,'男',2,'女','其他')gender, status, name from user_dept; --提交 COMMIT; --捕獲異常 EXCEPTION WHEN OTHERS THEN OUT_Msg_CODE := SQLCODE; OUT_Msg := SQLERRM; --回滾 ROLLBACK; end; 現(xiàn)在有兩張表,USER_TYPE表當中比user_dept當中對一個gender的字段,通過decode判斷如果type為3把gender設置值為‘男’,如果type為2gender設置為‘女’
技術問答
2014-10-14 22:09:00