顯示具有 java 標籤的文章。 顯示所有文章
顯示具有 java 標籤的文章。 顯示所有文章

2014年11月28日 星期五

JAX-WS 的大小事

最近這一個星期到客戶那解Web Service的問題,在這邊記錄一下查到的相關資訊...
教學的話有空再來寫....
這邊提供幾個找到的資料注意事項


AXIS2
這次用裡面的wsdl2java 讀取wsdl的內容來產生相關所需要的檔案
注意事項:-g 這個參數很重要,有這個才有辦法根據WSDL產生完整的Class

Rampart
用來在SOAP message中加上Secrity 相關的內容

IBM Web Service系列文章
裡面的內容其實都說明的滿詳細的...有需要的朋友可以參考一下

keytool
主要是用來處理憑證或是金鑰的Java Tool,主要是將相關的內容存放到JKS的管理庫中...

其他部分
透過Rampart可以很方便的對出去的SOAP Message的Header來處理Secrity相關的問題...
不過對方回來的訊息如果是Error 相關的話,就不會在SOAP 的Header上加上Secrity相關的回應,結果得到的Exception都會說Header不完整或是沒有權限之類的回應....可透過fidder來取得request和response來確定得到的SOAPMessage來確認得到的封包是否正確

如果對方提供的不是https的話,可用eclipse提供的TCP moniter就夠用了....(很不巧的這次對方提供的是https= =)

還有,可將Rampart 的.mar改為zip檔後移除model.xml檔中的的部分,讓得到response時,就算沒有加上安全相關的header也能正常的收進來...
model.xml檔如果沒有修改,Rampart預設出去的request會加上security token…回來的response也會做相關的驗證…但如果對方回應的response,header沒加的話就會無法驗證…Message也會因為被rampart包起來說是驗證錯誤或沒權限無法解析…然後就不知道是否有正常回應…



2014年11月17日 星期一

Tiles3.0.5 中的ViewPreparer在Spring MVC的使用

之前在找能從DB中抓資料出來組成網站的主選單的辦法…
先看了tiles管網上的用法 也找到好幾個用Tiles View Preparer+Spring MVC的辦法…但發現好像用的Tiles的版本是不太一樣的…原本很開心的以為有找到解法…但實做了以後才發現跟現有的method上有差異…也試了好一段時間…最後才確定用法…在這邊說明一下:

環境:
Tiles 3.0.5
Spring 4.1.1

在Spring 的bean file中的TilesConfigurer 加上preparerFactoryClass,相關設定如下:

 
    
        
            
                /WEB-INF/defaulttemplate.xml
                        
        
        
     

讓TilesConfigurer可以知道我們要使用Preparer的class
再來就是將navigation的部分拉出來,並加上我們寫好的NavigationViewPreparer ViewPreparer API
 

    
        
        
        
        
    
    
    


NavigationViewPreparer 的內容如下:
 
package syscom.web.controllers.preparer;

public class NavigationViewPreparer implements ViewPreparer{
 
 @Autowired 
 private INavigationService navigationServices;

 @Override
 public void execute(Request tilesContext, AttributeContext attributeContext) {
  attributeContext.putAttribute("navigationlist", new Attribute(navigationServices.getAllNavigation()));
 }

}

這邊要說明一個比較特別的地方…
用上面的putAttribute放入的部分,是無法透過${}取出Attribute的,需透過tags-tiles-extras來取得tiles相關的Attribute...
 
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> 
<%@ taglib uri="http://tiles.apache.org/tags-tiles-extras" prefix="tilesx" %>


    
                 
  • ${nav.title}

  • tilesx:useAttribute的用法

    2014年11月7日 星期五

    在Maven中使用ProGuard plugin的方法

    設定Maven 的plug-in如下:

     
       
                 com.github.wvengen
                 proguard-maven-plugin
                 2.0.6
                 
                     
                         net.sf.proguard
                         proguard-base
                         5.1
                     
                 
                 
                    
                        package
                        proguard
                    
                 
                 
                     5.1            
                     
                         
                          
                         
                      
                     
                     
                         ${java.home}/lib/rt.jar
                         ${java.home}/lib/jsse.jar
                     
                 
             
    
    如此一來,做出來的jar檔都會被混淆(obfuscator)
    可以減少從class中去猜出相關method內的做法…
    但有心人事還是有機會被反解回來喔…

    原來在Android sdk2.3以後就有將proguard加入其中了

    Reference:
    Pro Guard
    Progard maven plugin

    2012年10月5日 星期五

    LotusNotes的LS2J

    最近公司使用LotusNotes(以下簡稱Notes)從R5升到R8.5.3,其中就有個新的功能LS2J(其實在R6版本就開始有)。由於先前需寫WebSphere MQ的Java程式,剛好就發現了這項功能的好處與缺點。其實國外的相關文件滿多可以參考的,以下就做個簡要的說明與實做。

     在LotusDomino Designer(以下簡稱Designer)中建立一個資料庫。 Notes會自動將所需要的內容建起來。

    在來就是在"程式碼\Script程式庫" 中"新增Script程式庫",名稱暫時叫"testJava",類型記得改成"Java",確定後,Designer就會幫我們做相關的配置。再來就是在Src中建立所需要的Package與Class啦…也可以在別的地方寫好的Java做匯入的動作,就能將寫好的程式直接載入進來。這邊放入個簡單回傳的code。
    package my;
    
    public class javaMain {
        public String getMessage(){
            return "This is Message from Java";
        }
    } 
    

     
    "我有相關用到的Jar檔要用,怎麼辦" ,解法有二。
    1. 選"匯入"到"保存"中(存到Server中)
    2. 放在"{NotesPath}\jvm\lib\ext"中(存在Clinet中)
    這兩個差在那?讀取資料庫的效率!!如果Jar檔過大,在JVM開始載入相關的Jar檔,在保存中的Jar,需讀取下來,所以需要網路傳送的時間,所以效能較存在Clinet中慢。但如果存在Clinet中,會有發布的問題,因為是每個Clinet都要放置這個Jar檔,不然Notes會直接當給你看。

    再來就可以寫LotusScript(LSX)的部分了 ,這邊用代理程式來測試,首先,新增一個代理程式,名稱就叫"testJAVAFromAgent",類型選"LotusScript",建立後,在"Options"中加入下述兩行
    Use "testJava"
    UseLSX "*javacon"
    
    第一行就是上面寫的Script程式庫的名稱
    第二行就是等一下會使用到的LS2J的元件

    選Initialize,並加入下述程式碼

    Sub Initialize
        Dim jsession As JavaSession
        Dim jclass As JavaClass
        Dim jObject As JavaObject
        Dim jerr As JavaError
        On Error GoTo Catch   
        Set jsession = New JavaSession
        Set jclass = jsession.GetClass("my.javaMain")   
        Set jObject = jclass.Createobject()   
        MesssageBox jObject.getMessage()
        Catch:   
        MessageBox "LS Error: " & Error
        Set jerr = jsession.GetLastJavaError()   
        ret=ErrorHandling1(jerr.ErrorMsg())
        MessageBox " Stack trace: " & jerr.Stacktrace()
        jsession.Clearjavaerror    
    End Sub
    


    建立JavaSession,再由JavaSession取得要使用的Class名稱並給JavaClass,再由JavaClass產生Object出來,最後就是呼叫該Object有的method。最後Catch的部分則是當如果程式在Java中有throw exception時,可以透過catch來抓取問題出來,以利問題的排除

    其他
    1. JVM在第一次載入時會慢
    2. 一個JavaSeasion同名的Class只能有一個,先載入的為主,以Clinet為單位,所以只要JVM一將Class Load進來開不同的資料庫Seasion都會是同一個所Loading進來的Class也是共用
    3. 在Java 中寫System.out.println會出現在那?在NotesLotusClinet的工具列中的"工具\顯示JAVA偵錯控制台"所有的System.out.println都會出現在這
    4. 寫Java程式時,由於JVM已經起來,所以不會重新載入重寫過的Class,所以需將Notes重開,讓JVM重新載入新寫的Class

    2012年5月30日 星期三

    如何知道Java Class檔是使用那種版本的JDK complier出來的?

    最近在試WebService的程式,希望能用來讓ERP系統串接其他系統使用,不過由於系統使用的是1.4.2的JDK…所以如果是太新的third party jar檔就無法使用
    所以就引發了一個問題…如果什麼都沒寫連META-INF也都沒有…要怎麼知道這個Class是用那個Version的JDK生的?
    Google了一下,其實方法不難…將該class檔用16進位的軟體讀出來就可以知道
    查到的wiki中有說…找到第八個byte…
    詳見下方的內容
    J2SE 7    = 51 (0x33 hex),
    J2SE 6.0 = 50 (0x32 hex),
    J2SE 5.0 = 49 (0x31 hex),
    JDK 1.4   = 48 (0x30 hex),
    JDK 1.3   = 47 (0x2F hex),
    JDK 1.2   = 46 (0x2E hex),
    JDK 1.1   = 45 (0x2D hex).
    要看的是0x後面紅色的部分(因為是使用16進位來看)
    如果找到的是2E…那對應過去就是JDK 1.2版的依此類推…
    如此一來就算只有class檔…也能分辨出來是使用那個版本的JDK 生出來的

    reference
    http://en.wikipedia.org/wiki/Class_%28file_format%29#General_layout

    2012年3月5日 星期一

    透過JDBC存取AS400的資料

    在某天上班時,逛JavaWorld時正好看到這篇,發現到內有存取AS400的JDBC可使用,就去google了一下,找到了JTOpen這個IBM提供的tool...以下為實做與說明
    自上述連接中下載 ,並解壓縮。裡面會有個lib的folder...這次需要的是jt400.jar這個jar 檔
    將這個jar 檔放入專案中的Build path中
    再來只要import進來

    import com.ibm.as400.access.AS400JDBCDriver;
    

    下面是連接AS400的語法

    DriverManager.registerDriver(new AS400JDBCDriver());
    Class.forName("com.ibm.as400.access.AS400JDBCConnection");
    Connection conn = DriverManager.getConnection("jdbc:as400://"+YOUR AS400 IP, UserName, Password);
    

    做完上述就能取得Connection,接下來就是和平常使用資料庫控制的方式一樣

    其實設定的方式和一般資料庫的設定沒什麼差別,比較特別的地方應該是在對於table 控制的名稱 說明如下:
    在AS400中
    Library / Filename  <=來指定一個Table
    
    
    而在JTOpen中
    Library . Filename  <=來指定一個Table
    
    
    此外…如果要對AS400中的某個member做讀寫,必需透過alias來完成
    create alias AliasName For  Library.Filename(Member) 
    
    
    當然,使用完後最好drop掉…不然AS400中會多一堆DDM File

    2010年7月16日 星期五

    星期三看完Struts2 in Action

    由於是看原文的…所以後半段看得有點一知半解
    實作的部分只做到ch9…就停下來…
    原因是因為不知道為什麼照著書上方式做實做…結果弄不出來
    出現了NullPointerExpection.只知道有物件找不到…但一直查不出為什麼
    這本書看了那麼久…之前做的實作也不太記得了…
    唉~我想還是要有案子實做出來才會正真知道這個Framework到底在做啥吧!!

    現在正在看這位大大的實作…
    希望看了以後能解出Ch9實作的問題!!

    再來就是Spring了