2015年2月12日 星期四

java.lang.NoClassDefFoundError: net/sf/json/JSONArray



繼上次那篇

JBoss & RESTEasy





這篇可以幫你避免

java.lang.NoClassDefFoundError : net/sf/json/JSONArray

java.lang.NoClassDefFoundError: net/sf/json/JSONArray



在專案中使用 json-lib-2.4 來幫忙物件轉出 json

使用的到的是以下這些

\lib\commons-beanutils.jar
\lib\commons-collections.jar
\lib\commons-lang.jar
\lib\commons-logging.jar
\lib\ezmorph-1.0.6.jar
\lib\json-lib-2.4-jdk15.jar





加到Build Path之後
在WEB-INF資料夾中建立 lib 資料夾
然後把要用到的jar都丟進去lib

接著在pom.xml中加入

<dependency>
    <groupId>net.sf.json-lib</groupId>
    <artifactId>json-lib</artifactId>
    <version>2.4</version>
</dependency>

 這樣就可以開始用

import net.sf.json.JSONArray;




2015年2月8日 星期日

JBoss & RESTEasy



#這篇是翻譯文章,並且補充說明


RESTEasy Hello World Example


開發環境

  • Eclipse Kepler 
  • JBoss 6.x Runtime Server
  • RESTEasy 2.2.1.GA
  • jre7


Download Source Code
Download it – RESTEasy-Hello-World-Example.zip (7 KB)

當把檔案下載回來後


1. Import 進你的專案目錄

2. 找不到這些jar檔嗎?

M2_REPO/org/jboss/resteasy/resteasy-jaxrs/2.2.1.GA/resteasy-jaxrs-2.2.1.GA.jar
M2_REPO/org/jboss/resteasy/jaxrs-api/2.2.1.GA/jaxrs-api-2.2.1.GA.jar
M2_REPO/org/apache/httpcomponents/httpcore/4.0.1/httpcore-4.0.1.jar
M2_REPO/org/apache/httpcomponents/httpclient/4.0.3/httpclient-4.0.3.jar
M2_REPO/commons-codec/commons-codec/1.2/commons-codec-1.2.jar
M2_REPO/commons-httpclient/commons-httpclient/3.1/commons-httpclient-3.1.jar
M2_REPO/commons-logging/commons-logging/1.0.4/commons-logging-1.0.4.jar
M2_REPO/junit/junit/4.8.2/junit-4.8.2.jar


請至 RESTEasy  下載 RESTEasy 2.2.1.GA 

或到 sourceforge 下載 resteasy-jaxrs-2.2.1.GA-all.zip

然後重新修改你import的Libraries
  •  Java Build Path -> Libraries 
 
重新加入你下載回來的這些jar檔

  • resteasy-jaxrs-2.2.1.GA.jar
  • jaxrs-api-2.2.1.GA.jar
  • httpcore-4.0.1.jar
  • httpclient-4.0.3.jar
  • commons-codec-1.2.jar
  • commons-httpclient-3.1.jar
  • commons-logging-1.0.4.jar
junit-4.8.2.jar 用不到就不用加了


接著
  • Run AS-> Run as Server

選擇 
  • JBoss 6.x Runtime Server

確認你的JBoss work 之後

訪問

Test 1 : http://localhost:8080/RESTfulExample/rest/message/mkyong

Test 2 : http://localhost:8080/RESTfulExample/rest/message/hello%20world


Good Luck!

 



 

2015年2月7日 星期六

Class for Dynamic Logger using C# & log4net.



有時候Asp.net 、web service或寫 C# 會需要紀錄程式的log,

自己寫個文字檔當記錄也是可以,但是如果有現成的就不用自己刻。

這裡整理一下log4net的幾種用法,做為參考


本篇介紹Asp.net WebApplication 有IIS的case

如果你有先玩過log4net再來看這篇!!!





網路上教學很多都是需要在Global.asax 上啟用

這會遇到一個問題,如果IIS(機器)在人家手上,可不能給我上線每次說啟用就啟用

有時候軟重啟(ReStart)IIS 都要求人家幫你開,太痛苦了...

正在run 又要同時上新功能的也不可能讓你把IIS停下來

如果你所有的common log都是寫在同一個log file

你也不太可能在新上版的程式裡隨意的加上Shutdown

log.Logger.Repository.Shutdown();
然後每次呼叫方法時,都開開關關這樣,

這樣搞,共用log有可能被你關掉導致其他程式無法寫入


下面提供一個範例,Dyamic Logger動態的產生一個實體Logger

範例中的寫法不需要吃外部Xml config,

要吃也可以啦,看你要吃什麼設定檔什麼參數,

拉出去吃Web.config或自訂XML都可以。





using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using log4net;
using System.Reflection;
//using log4net.Config;
//using log4net.Repository.Hierarchy;
//using log4net.Appender;
//using log4net.Layout;
//using log4net.Core;

namespace WebApp_log4net
{

    public class HandlerforLog : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            Write("Application is starting");
            context.Response.ContentType = "text/plain";
            context.Response.Write("Hello World");
        }

        public void Write(String message)
        {
            ILog myLog = GetDyamicLogger();
            myLog.Info("[Write]:" + message);
        }

        public static ILog GetDyamicLogger()
        {
            log4net.Repository.Hierarchy.Hierarchy hierarchy = 
            (log4net.Repository.Hierarchy.Hierarchy)LogManager.GetRepository();
            log4net.Appender.RollingFileAppender roller = 
              new log4net.Appender.RollingFileAppender();
            roller.LockingModel = new log4net.Appender.FileAppender.MinimalLock();
            roller.AppendToFile = true;
            roller.RollingStyle = 
               log4net.Appender.RollingFileAppender.RollingMode.Composite;
            roller.MaxSizeRollBackups = 29; // 0~29 is 30. 
            roller.MaximumFileSize = "10MB";
            roller.DatePattern = "yyyyMMdd";
            roller.Layout = new log4net.Layout.PatternLayout();
            roller.File = "log\\debug.log";
            roller.StaticLogFileName = true;

            log4net.Layout.PatternLayout patternLayout = 
                  new log4net.Layout.PatternLayout();
            patternLayout.ConversionPattern = 
             @"%date [%thread] %-5level %logger [%property{NDC}] - %message%newline";
            patternLayout.ActivateOptions();

            roller.Layout = patternLayout;
            roller.ActivateOptions();
            hierarchy.Root.AddAppender(roller);

            hierarchy.Root.Level = log4net.Core.Level.All;
            hierarchy.Configured = true;

            DummyLogger dummyILogger = new DummyLogger("LogName");
            dummyILogger.Hierarchy = hierarchy;
            dummyILogger.Level = log4net.Core.Level.All;
            dummyILogger.AddAppender(roller);

            return new log4net.Core.LogImpl(dummyILogger);
        }

        internal sealed class DummyLogger : log4net.Repository.Hierarchy.Logger
        {
            // Methods
            internal DummyLogger(string name)
                : base(name)
            {
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}




參考資料

http://amolgangawane.blogspot.tw/

http://www.howtosolvenow.com/2014/01/log4net-example-in-c-console-application/

http://www.curlette.com/?p=1113

http://interactivelogic.net/wp/2010/02/aspnet-logging-to-output-window-with-log4net/

http://weblogs.asp.net/stevewellens/log4net-log-to-a-javascript-console

http://www.howtosolvenow.com/2014/01/log4net-example-in-c-console-application/


2015年2月6日 星期五

抽獎不重複的小程式


抽獎不重複的小程式 (測試版載點)

功能:

  • 抽獎不重複,使用System.Guid.NewGuid沒有亂數表重複問題。
  • 抽獎的結果可以讓你可以key in 工號或姓名,這功能方便會計或總務作紀錄,直接複製可以貼Excel。
  • 尾牙可以用XD



步驟簡單:

  • 可以自由設定總人數
  • 抽獎有跑動態特效
  • 得獎名單可編輯與複製貼上文字








讓你可以key in 工號或姓名,這功能方便會計或總務作紀錄,直接複製可以貼Excel




 每次抽獎都是重新搖獎,Guid.NewGuid保證亂數隨機









如果你想要完整版本,或提新需求合作
請留言
3Q






2015年2月4日 星期三

RESTful Web Services with Java



#本篇是翻譯文學(X)

RESTful Web Services with Java



J2EE  RESTful的解決方案一大堆

這次將外國人的實作教學翻成中文

自己做一遍,順便當成紀錄這樣

如果你喜歡CCR...不是... 如果你喜歡外國人的文

請直接看原文 3Q





開發環境與使用素材

1. Eclipse Kepler 
2. C:\Program Files (x86)\Java\jre7
3. jersey jersey-archive-1.17.1  (RESTful Web Services in Java.)
4. Apache Tomcat 7.0.x





在Eclipse 新增[其他]專案



選擇 dynamic web project

接著命名為RESTfulWS

那個 選阿帕契的湯姆貓第七版 然後下一步下一步完成


專案開好後

把剛剛Jersey (傑西) 下載回來的壓縮檔打開  jersey-archive-1.17.1 

裡面長這樣




lib資料夾裡面

  • asm-3.1.jar
  • jersey-client-1.17.1.jar
  • jersey-core-1.17.1.jar
  • jersey-json-1.17.1.jar
  • jersey-server-1.17.1.jar
  • jersey-servlet-1.17.1.jar
  • jsr311-api-1.1.1.jar
把這些複製貼上到專案目錄中WEB-INF -> lib

專案目錄右鍵Propertise -> Java build Path 並且加入引用




請在專案目錄中建立web.xml

/RESTfulWS/WebContent/WEB-INF/web.xml






<?xml version="1.0" encoding="UTF-8"?>
<web-app
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee"
    id="WebApp_ID"
    version="2.5">
<display-name>RESTfulWS</display-name>
<servlet>
<servlet-name>Jersey REST Service</servlet-name>
<servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>com.sun.jersey.config.property.packages</param-name>
<param-value>com.eviac.blog.restws</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Jersey REST Service</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>


請在專案目錄中

建立
1.package com.eviac.blog.restclient
2.class UserInfoClient.java

/RESTfulWS/src/com/eviac/blog/restclient/UserInfoClient.java

程式碼如下



package com.eviac.blog.restclient;




import javax.ws.rs.core.MediaType;




import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.ClientResponse;
import com.sun.jersey.api.client.WebResource;
import com.sun.jersey.api.client.config.ClientConfig;
import com.sun.jersey.api.client.config.DefaultClientConfig;




/**
*&nbsp;
* @author pavithra
*&nbsp;
*/
public class UserInfoClient {




public static final String BASE_URI = "http://localhost:8080/RESTfulWS";
public static final String PATH_NAME = "/UserInfoService/name/";
public static final String PATH_AGE = "/UserInfoService/age/";




public static void main(String[] args) {




String name = "Pavithra";
int age = 25;




ClientConfig config = new DefaultClientConfig();
Client client = Client.create(config);
WebResource resource = client.resource(BASE_URI);




WebResource nameResource = resource.path("rest").path(PATH_NAME + name);
System.out.println("Client Response \n"
+ getClientResponse(nameResource));
System.out.println("Response \n" + getResponse(nameResource) + "\n\n");




WebResource ageResource = resource.path("rest").path(PATH_AGE + age);
System.out.println("Client Response \n"
+ getClientResponse(ageResource));
System.out.println("Response \n" + getResponse(ageResource));
}




/**
* Returns client response.
* e.g :&nbsp;
* GET http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra&nbsp;
* returned a response status of 200 OK
*
* @param service
* @return
*/
private static String getClientResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(ClientResponse.class)
.toString();
}




/**
* Returns the response as XML
* e.g : <User><Name>Pavithra</Name></User>&nbsp;
*&nbsp;
* @param service
* @return
*/
private static String getResponse(WebResource resource) {
return resource.accept(MediaType.TEXT_XML).get(String.class);
}
}


請在專案目錄中

建立
1.package com.eviac.blog.restws
2.class UserInfo.java

/RESTfulWS/src/com/eviac/blog/restws/UserInfo.java


程式碼如下





package com.eviac.blog.restws;




import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;




/**
*
* @author pavithra
*
*/




// @Path here defines class level path. Identifies the URI path that
// a resource class will serve requests for.
@Path("UserInfoService")
public class UserInfo {




// @GET here defines, this method will method will process HTTP GET
// requests.
@GET
// @Path here defines method level path. Identifies the URI path that a
// resource class method will serve requests for.
@Path("/name/{i}")
// @Produces here defines the media type(s) that the methods
// of a resource class can produce.
@Produces(MediaType.TEXT_XML)
// @PathParam injects the value of URI parameter that defined in @Path
// expression, into the method.
public String userName(@PathParam("i") String i) {




String name = i;
return "<User>" + "<Name>" + name + "</Name>" + "</User>";
}




@GET
@Path("/age/{j}")
@Produces(MediaType.TEXT_XML)
public String userAge(@PathParam("j") int j) {




int age = j;
return "<User>" + "<Age>" + age + "</Age>" + "</User>";
}
}



在專案上按右鍵 
     run as ->run on server.



按下Finish

別驚慌

http://localhost:8080/

不是你要去的地方

請訪問

http://localhost:8080/RESTfulWS/rest/UserInfoService/name/Pavithra



http://localhost:8080/RESTfulWS/rest/UserInfoService/age/25


age這最後面參數可以自己帶

http://localhost:8080/RESTfulWS/rest/UserInfoService/age/18




評估xxx函式逾時,且需以不安全的方法中止。這可能使目標處理序損毀。

評估xxx函式逾時,且需以不安全的方法中止。這可能使目標處理序損毀。 我選擇直接停用 [啟用屬性評估及其他隱含函式呼叫] --------------------------- Microsoft Visual Studio -------------------...