2015年4月15日 星期三

javax.smartcardio無法正常在eclpise import的問題

因為工作關係所以需要透過java smart api去讀卡機…

在eclipse 中要import時…發現 javax.smartcardio會無法import進來…

被eclipse檔掉這類的class

所以需另外的給rule…讓eclipse accept可以使用這類的api...加入方法如下:
  1. create a java project or open an existing project
  2. right-click the project and open the properties dialog
  3. select build path -> libraries tab and unfold the "JRE System Library" tree
  4. select the entry "Access Rules" and push the "edit" button on the right
  5. you can apply a rule with the "add" button: set the drop down to "accessible" and enter the value “javax/smartcardio/**
喵的…讓我找好久解法…

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日 星期五

    Sublime text 2

    教學
    http://net.tutsplus.com/articles/news/perfect-workflow-in-sublime-text-free-course/
    教學內的影片
    http://www.youtube.com/watch?v=5AV9zJH2n_Y&list=PLmJpVU-TdmVtTLooKvX3jcrOziPjlWrD4

    [Plugin]
    先裝
    Package Control
    再裝透過Package Control裝其他的Plugin

    EasyMotion
    BracketHighlighter
    SideBarEnhancements
    SublimeLinter
    gist
    git



    [config]

    // 把 tab 換空白
    "translate_tabs_to_spaces": true,
    
    // 高亮所在行
    "highlight_line": true,
    
    // 存檔時移除多餘的空白
    "trim_trailing_white_space_on_save": true,

    在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日 星期五

    Lotus Notes 加速大絕

    其實這是在找相關的資料時看到的,只要修改"{notes}\framework\rcp\deploy"中的jvm.properties打開後將vmarg.Xmx=-Xmx256m改為 vmarg.Xmx=-Xmx512m,並且重開Notes,應該就會快很多。

    PS.修改前請先確認本身的記憶體大小,不然Notes會當掉。

    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