'Language/JAVA'에 해당되는 글 57건

  1. 2013.08.01 자바(java)에서 사용하는 정규표현식(Regular expression)(02)
  2. 2013.08.01 자바(java)에서 사용하는 정규표현식(Regular expression)(01)
  3. 2013.07.18 JAXB : IllegalAnnotationExceptions - Class has two properties of the same name
  4. 2013.07.10 Using JAX-RS With JAXB
  5. 2012.12.26 Code Examples of POIFSFileSystem
  6. 2010.10.19 toJSONString()
  7. 2010.10.19 ajax post/get 방식

자바(java)에서 사용하는 정규표현식(Regular expression)(02)

Language/JAVA 2013. 8. 1. 20:08

 java.util.regex 패키지에 있는 Match 클래스와 Pattern 클래스를 사용하여 문자열을 정규표현식으로 검증할 수 있다.

 

boolean bln = Pattern.matches("^[a-zA-Z0-9]*$", this.input);

 


정규표현식은 다음과 같은 문법으로 되어 있다. 

^ : 문자열의 시작을 나타냄. 

$ : 문자열의 종료를 나타냄. 

. : 임의의 한 문자를 나타냄. (문자의 종류는 가리지 않는다)

| : or를 나타냄. 


? : 앞 문자가 없거나 하나있음을 나타냄. 

+ : 앞 문자가 하나 이상임을 나타냄. 

* : 앞 문자가 없을 수도 무한정 많을 수도 있음을 나타냄. 


 만약, .* 으로 정규식이 시작한다면 시작하는 문자열과 같은 문자열이 뒤에 없거나 많을 수도 있는 경우에만 일치를 시킨다. 즉, abc 일 경우 시작문자인 a를 기준으로 a가 없을경우와 a가 무한정 많은 경우에도 true를 반환하기 때문에 abc의 경우는 true를 반환한다. 


[] : 문자 클래스를 지정할 때 사용한다. 문자의 집합이나 범위를 나타내면 두 문자 사이는 '-' 기호로 범위를 나타낸다. []내에서 ^ 가 선행하여 나타나면 not 를 나타낸다. 


{} : 선행문자가 나타나는 횟수 또는 범위를 나타낸다. 

a{3} 인 경우 a가 3번 반복된 경우를 말하며, a{3,}이면 a가 3번 이상 반복인 경우를 말한다. 또한 a{3,5}인 경우 a가 3번 이상 5번 이하 반복된 경우를 나타낸다. 



\w : 알파벳이나 숫자

\W : 알파벳이나 숫자를 제외한 문자

\d : 숫자 [0-9]와 동일

\D : 숫자를 제외한 모든 문자


 

기본적인 문자열 검증 정규식)

^[0-9]*$  :  숫자만

^[a-zA-Z]*$  :  영문자만

^[가-힣]*$  :  한글만

^[a-zA-Z0-9]*$  :  영어/숫자만


 

정규식 표현 예제)

이메일 : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$  or  ^[_0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[_0-9a-zA-Z-]+)*$ 


휴대폰 :  ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$ 


일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$


주민등록번호 : \d{6} \- [1-4]\d{6}


IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})



:

자바(java)에서 사용하는 정규표현식(Regular expression)(01)

Language/JAVA 2013. 8. 1. 20:06

문자열에 대한 값을 체크 할 때 간단한 길이계산 정도야 if (String.length() > 0) 등을 이용해 작성할 수 있다.  하지만 복잡한 문자열(예를들어 주민등록 번호, 혹은 이메일 형식)등을 점검하고자 할땐 조건문이 꽤 복잡해 진다.

이런 경우를 대비해 java에선 '정규표현식(Regular expression)을 1.4부터 제공한다. 

정규표현식?
문자열에 매치여부를 확인할 수 있고, 치환(replace)할 수 있는 문자열 형식
(필자 임의로 작성했습니다. 정확한 해석은 검색을 통해 ..)


그대로 해석하자면 '정규표현식'이란 문자열에 대한 형식이 있다. 그리고 우리가 검증하고자 하는 문자열이 '작성된 정규 표현식에 매치여부를 확인'할 수 있고, 특정 부분을 '치환할 수 있다'는 뜻이다.  
더 쉽게 보자면 이것은 '틀을 짜 놓고, 이 안에 들어가나?'를 보는 것 이다. 

그렇게 되면 복잡한 조건문을 통해 검증해야 하는 문자열도 정해진 식을 통해 단번에 매치여부를 확인할 수 있는 것이다.

이제 정규표현식에 사용되는 식을 살펴보자.


 정규식 설명예제 
 .임의의 한 문자(필수)를 의미 합니다.
ab.(abc, abd,abe) .. 
 ?바로 앞에 문자가 없거나 하나가 있음을 의미 합니다.a?c (ac, abc, bc) .. 
 *바로 앞에 문자가 없거나 하나이상 반복을 의미 합니다.ab* (a, ab, aaa) .. 
 +바로 앞에 문자가 하나이상 반복을 의미 합니다.ab+ (ab, abb, abbb) ..
 ^문자열의 시작을 의미 합니다.^ab (abc, abcd, abcde) ..
 [^]^이후의 괄호안 형식을 제외함을 의미 합니다.[^ab]cd (ecd, fcd, gcd) ..

문자열의 끝을 의미 합니다. 
abc$ (pupu abc, story abc) ..
 [][]안의 형식 일치를 의미 합니다.[abc] (a, b, c, ab, bc, abc) ...
 {}{}앞 문자열(혹은 문자) 반복 갯수를 의미 합니다.ab{2} (abab) 
ab{2,} (2개이상) 
ab{1,2} (1부터 2까지)
 ()()안의 내용 을 하나의 묶음으로 사용 함을 의미 합니다.(ab){2} (abab)
(ab)+ (ab, abab, ababab ..)
 |or연산을 의미 합니다.(a|b|c)  (a, b, c, ab,abc ..)
 [0-9](부터 - 까지)의 숫자를 의미 합니다.[0-9] (0, 1, 2, 3, 4 ..)
[a-z]
(부터 - 까지)의 소문자를 의미 합니다.[a-z] (a, b, c, d ..)
 [a-zA-Z](부터 - 까지)의 대,소문자를 의미 합니다. [a-zA-Z] (a, b, A, B ..)
 \p(Alpha)대,소문자 아파벳을 의미 합니다.(a, b, c, D, E, F ..) 
\p(Digit) 
숫자를 의미 합니다.(1, 2, 3 ..)
 \p{Alnum}대,소문자 아파벳, 숫자를 의미 합니다.(a, b, c, d, e, 1, 2, 3 ..) 
\d
숫자를 의미 합니다.(1, 2, 3, 4 ..) 
 \D숫자가 아닌 것을 의미 합니다.  
 (a, b, d, E ..)


그냥 보기엔 복잡하기만 하다. 필자도 처음봤을땐 '외계어'로 보여서 도무지 손대고 싶지 않았다. 그런데 이게 .. 계속 왜 안되는지 이해를 못하면서 헤딩하다 보니 .. '특별한 매력'을 느끼게 되었다. --b 

우리가 처음 자바(그 외 다른 언어 등등)을 배울때 생각해 보자. public ? static ? void ? main ? request ? response ? session ? 어느것 하나 생소하지 않은것이 없었다. 영어는 어떠한가 ? 영어 알파벳을 처음 봤을 땐 '문자' 가 아닌 '기호'로 받아드리는게 맞는것 같다. 왜냐면 처음 보는거니까 .. 

이제 사용법을 살펴보자. 몇가지 예제를 살펴보면 더욱 쉽게 이해할 수 있다.

RegexSample .java

  1. package pupustory.regex.sample;  
  2. public class RegexSample {  
  3.     public static void main(String ar[]) throws java.io.IOException{  
  4.        //정규표현식 적용 a로 시작하며, a다음 아무문자1개만,  마지막은c로 끝남  
  5.         final String regex = "^a.c$";   
  6.         String useStr = "a1c";  
  7.         System.out.println(useStr.matches(regex));  
  8.     }  
  9. }  



별로 길지 않은 코드다. regex에 형식을 지정하고 useStr의 내용이 맞는지 여부를 확인했다. 정규표현식은 자바에서 제공하는(1.4 이후) java.util.regex.* 패키지가 있다. 그리고 String 에서도 손쉽게 사용할 수 있다. 만약 사용시 좀 더 강력한 정규표현식(예를들면 매치되는 문자열의 그룹이라던가 하는)을 이용하고자 할땐 패키지를 사용하는 것이 좋다.

이번엔 좀 더 난이도 있는 표현식을 살펴보자.

RegexSample .java

  1. package pupustory.regex.sample;  
  2. public class RegexSample {  
  3.     public static void main(String ar[]) throws java.io.IOException{  
  4.         final String regex = "\\p{Alnum}+@\\p{Alnum}+\\.\\p{Alnum}+";  
  5.         String[] useStr = {"pupustory@gmail.com"  
  6.                             ,"pupu한글@gmail.net"  
  7.                             ,"pupu@gmail.net.net"  
  8.                             ,"@.net"  
  9.         };  
  10.         for (int i=0; i<useStr.length; i++) {  
  11.             System.out.println(useStr[i].matches(regex));  
  12.         }  
  13.     }  
  14. }  




이것은 이메일을 검증하는 코드다. 표현식이 좀 복잡해 보이지만 하나하나 살펴보자.

// 숫자, 혹은 영문자가 오게된다. 마지막에 +가 있으므로 반드시 하나 이상의 문자가 와야 한다.
\p{Alnum}+ 
// @문자가 온 뒤 위와 같은 형식이다.
@\p{Alnum}+
// .문자가 온 뒤 위와 같은 형식이다. '.'앞에 \가 온 이유는 정규표현식에서 '.'문자를 사용한다.
// 따라서 '이것은 정규표현식이 아닌 그냥 내가 원하는 특수 문자'임을 뜻한다.
\.\p{Alnum}+

결과는 처음 배열 문자만 통과되고 나머지는 false를 반환한다. 실제로 아주 쉽다. 단지 처음보는 문자열을 코드로 사용함에 있어 복잡해 보이는것은 사실이다. 이것은 점점 많은 예제를 통해 익숙해질 수 있다. 

이제 좀 더 고급 표현식을 사용하기 위해 패키지에 포함된 라이브러리를 이용해 보자.

RegexSample .java

  1. package pupustory.regex.sample;  
  2. import java.util.regex.*;  
  3. public class RegexSample {  
  4.     public static void main(String ar[]) throws java.io.IOException{  
  5.           
  6.         // 정규표현식 형식 정의  
  7.         // 2009/07/28 pupustory@gmail.co.kr 의 패턴에 대응하도록 변경함.  
  8.         //final String regex = "\\p{Alnum}+@\\p{Alnum}+.\\p{Alnum}+";   
  9.         final String regex = "^[A-Za-z]+@[A-Za-z]+(.[A-Za-z]+){1,2}$";        
  10.         // 정규표현식에 맞춰볼 문자열  
  11.         String useStr = "pupustory@gmail.com";  
  12.           
  13.         // 패턴 정의 ( 주의할점은 인스턴스 생성이 아니라는 점이다.  
  14.         // 실제 소스를 열어보면 다음과 같이 되어있다.  
  15.         // return new Pattern(regex, 0);  
  16.         // 하지만 본 생성자는 private로 구성되어 있다.  
  17.         Pattern pattern = Pattern.compile(regex);  
  18.           
  19.         // 패턴에 대해 맞춰볼 문자열을 넘겨 Matcher 객체로 받는다.  
  20.         Matcher match = pattern.matcher(useStr);  
  21.         // 패턴 일치사항을 발견할 경우 true를 반환한다.  
  22.         System.out.println(match.find());  
  23.     }  
  24. }  



주석 내용만 살펴봐도 별 부담없는 소스다. 이제 패키지를 이용한 강력한 기능을 살펴보자. 만약 사용자가 txt형식의 큰 문서 파일을 받았다고 가정 하자. 그 문서 파일 중 '특정 규약에 맞는 문자열이 몇번이나 반복되어 나오는가?'를 분석하고자 한다. 우리가 지금까지 알아본 방법은 '임의의 하나 문자열이 지정된 형식에 맞는가?'에 대한 방법을 알아왔다. 즉. '단건'에 대한 정보를 넘겨 그 '단건'정보가 일치하는지를 알아본 것이다.

큰 문서에 대해서 '얼마나 많이 지정된 패턴이 반복되는가?'를 알아보려고 한다면 어떻게 해야할까 ? 우리가 DAO등을 사용할 때 row를 가져오는 방법으로 루프돌린 방법은 다음과 같다.

  1. // other code ..  
  2. ResultSet record = PreparedStatment.executeQery();  
  3. while(record.next()) {  
  4. // order code ..  
  5. }  
  6. // other code ..  



간단히 위와같이 사용한다. 우리가 위에 살펴본 .find()메소드도 같은 역할이다. 정규표현식에 대해 문서를 검색하고, 매치되는 부분을 찾는다. 후에 다음 부분을 차자게되고 끝까지 찾아 더이상 없다면 false를 반환하는 것 이다. 이제 좀 복잡한 코드를 만들어 보자.

RegexSample .java

  1. package pupustory.regex.sample;  
  2. import java.util.regex.*;  
  3. public class RegexSample {  
  4.     public static void main(String ar[]) throws java.io.IOException{  
  5.         final int MAX_STRING_SIZE = 1000;  
  6.         java.util.Random random = new java.util.Random();  
  7.         // 정규표현식 형식 정의  
  8.         final String regex = "\\p{Alnum}+@\\p{Alnum}+.\\p{Alnum}+";  
  9.         // 정규표현식에 맞춰볼 문자열  
  10.         StringBuffer useStr = new StringBuffer();  
  11.         // 정규표현식에 맞춰볼 문자열을 생성 합니다.  
  12.           
  13.         for (int i=0;i<MAX_STRING_SIZE;i++ ) {  
  14.             useStr.append("pupustory"+i);  
  15.             // 랜덤으로  @gmail.com을 추가합니다.   
  16.             // @gmail.com이 추가되면 정규표현식에 맞으므로 후에 찾게 될 것 입니다.  
  17.             // 추가되지 않으면 틀렸으므로 pass할 것 입니다.  
  18.             if (random.nextBoolean()) useStr.append("@gmail.com");  
  19.             useStr.append(" ");  
  20.         }  
  21.         Pattern pattern = Pattern.compile(regex);  
  22.         Matcher match = pattern.matcher(useStr);  
  23.         // 매치된 문자열 갯수를 샙니다.  
  24.         int matchCount=0;  
  25.         while(match.find()) {  
  26.             System.out.println(match.group());  
  27.             matchCount++;  
  28.         }  
  29.         System.out.println("정규표현식에 맞는 문자열 갯수 > " + matchCount);  
  30.     }  
  31. }  



복잡해 보이지만 간단하다. for문을 통해 반복하며 문자열을 만드는데 '@gmail.com'을 추가할지 안할지 정한다. 추가되면 정규표현식에 맞게되고, 그렇지 않으면 맞지 않게된다. while(boolean) 돌며 매치되는 문자열을 검색하고, 더이상 내용이 없으면 false를 반환하므로 빠져나온다.

지금까지 살펴본 예제는 단순하다. 정규표현식이 어려운것은 바로 '처음 손대기가 까다로워 보인다'라는 것이 가장 큰게 아닌가 싶다. 표현식을 만드는게 복잡해 보이지만 익숙해지면 매력이 있고, 또 벨리데이션 체크에 있어 여러개의 조건이 들어갈 필요도 없다. 라이브러리 추가도 필요없다. String에서 바로 사용하거나 패키지를 사용하면 된다.

필자도 처음에 어려워서 그만둘까 했지만 하다보니 정말 재미있어서 계속 빠지게 되었다. 이글을 보고 있고, 정규표현식에 관심있는 많은 개발자들이 허접한 이 글을 통해서 코드작성에 좀더 빠르게, 좀더 아름답게 하는데 보템이 되었으면 한다.


출처 - http://pupustory.tistory.com/132

:

JAXB : IllegalAnnotationExceptions - Class has two properties of the same name

Language/JAVA 2013. 7. 18. 17:30

just developing a test jaxb application and wanted to let getters and setters be created automatically with Lombok.
As I was attempting to assign annotations of private field members, got this exception:


Exception in thread "main" com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
Class has two properties of the same name "name"
this problem is related to the following location:
at public java.lang.String de.domain.jaxbtest.model.Book.getName()
at de.domain.jaxbtest.model.Book
at private java.util.List de.domain.jaxbtest.model.Bookstore.bookList
at de.domain.jaxbtest.model.Bookstore


the solution was easy as just adding @XmlAccessorType(XmlAccessType.FIELD) to defined class:

@Data
@XmlRootElement(name = "book")
@XmlAccessorType(XmlAccessType.FIELD)
public class Book {
@XmlElement(name = "title")
private String name;
private String author;
private String publisher;
private String isbn;
}



출처 - http://hoomb.blogspot.kr/2012/12/jaxb-illegalannotationexceptions-class.html

:

Using JAX-RS With JAXB

Language/JAVA 2013. 7. 10. 13:11

Using JAX-RS With JAXB

Java Architecture for XML Binding (JAXB) is an XML-to-Java binding technology that simplifies the development of web services by enabling transformations between schema and Java objects and between XML instance documents and Java object instances. An XML schema defines the data elements and structure of an XML document. You can use JAXB APIs and tools to establish mappings between Java classes and XML schema. JAXB technology provides the tools that enable you to convert your XML documents to and from Java objects.

By using JAXB, you can manipulate data objects in the following ways:

  • You can start with an XML schema definition (XSD) and use xjc, the JAXB schema compiler tool, to create a set of JAXB-annotated Java classes that map to the elements and types defined in the XSD schema.

  • You can start with a set of Java classes and use schemagen, the JAXB schema generator tool, to generate an XML schema.

  • Once a mapping between the XML schema and the Java classes exists, you can use the JAXB binding runtime to marshal and unmarshal your XML documents to and from Java objects and use the resulting Java classes to assemble a web services application.

XML is a common media format that RESTful services consume and produce. To deserialize and serialize XML, you can represent requests and responses by JAXB annotated objects. Your JAX-RS application can use the JAXB objects to manipulate XML data. JAXB objects can be used as request entity parameters and response entities. The JAX-RS runtime environment includes standard MessageBodyReader and MessageBodyWriterprovider interfaces for reading and writing JAXB objects as entities.

With JAX-RS, you enable access to your services by publishing resources. Resources are just simple Java classes with some additional JAX-RS annotations. These annotations express the following:

  • The path of the resource (the URL you use to access it)

  • The HTTP method you use to call a certain method (for example, the GET or POST method)

  • The MIME type with which a method accepts or responds

As you define the resources for your application, consider the type of data you want to expose. You may already have a relational database that contains information you want to expose to users, or you may have static content that does not reside in a database but does need to be distributed as resources. Using JAX-RS, you can distribute content from multiple sources. RESTful web services can use various types of input/output formats for request and response. The customer example, described in The customer Example Application, uses XML.

Resources have representations. A resource representation is the content in the HTTP message that is sent to, or returned from, the resource using the URI. Each representation a resource supports has a corresponding media type. For example, if a resource is going to return content formatted as XML, you can useapplication/xml as the associated media type in the HTTP message. Depending on the requirements of your application, resources can return representations in a preferred single format or in multiple formats. JAX-RS provides @Consumes and @Produces annotations to declare the media types that are acceptable for a resource method to read and write.

JAX-RS also maps Java types to and from resource representations using entity providers. AMessageBodyReader entity provider reads a request entity and deserializes the request entity into a Java type. AMessageBodyWriter entity provider serializes from a Java type into a response entity. For example, if a Stringvalue is used as the request entity parameter, the MessageBodyReader entity provider deserializes the request body into a new String. If a JAXB type is used as the return type on a resource method, theMessageBodyWriter serializes the JAXB object into a response body.

By default, the JAX-RS runtime environment attempts to create and use a default JAXBContext class for JAXB classes. However, if the default JAXBContext class is not suitable, then you can supply a JAXBContext class for the application using a JAX-RS ContextResolver provider interface.

The following sections explain how to use JAXB with JAX-RS resource methods.

Using Java Objects to Model Your Data

If you do not have an XML schema definition for the data you want to expose, you can model your data as Java classes, add JAXB annotations to these classes, and use JAXB to generate an XML schema for your data. For example, if the data you want to expose is a collection of products and each product has an ID, a name, a description, and a price, you can model it as a Java class as follows:

@XmlRootElement(name="product")
@XmlAccessorType(XmlAccessType.FIELD)
public class Product {

    @XmlElement(required=true) 
    protected int id;
    @XmlElement(required=true) 
    protected String name;
    @XmlElement(required=true) 
    protected String description;
    @XmlElement(required=true) 
    protected int price;
    
    public Product() {}
    
    // Getter and setter methods
    // ...
}

Run the JAXB schema generator on the command line to generate the corresponding XML schema definition:

schemagen Product.java

This command produces the XML schema as an .xsd file:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <xs:element name="product" type="product"/>

  <xs:complexType name="product">
    <xs:sequence>
      <xs:element name="id" type="xs:int"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="description" type="xs:string"/>
      <xs:element name="price" type="xs:int"/>
    </xs:sequence>
  <xs:complexType>
</xs:schema>

Once you have this mapping, you can create Product objects in your application, return them, and use them as parameters in JAX-RS resource methods. The JAX-RS runtime uses JAXB to convert the XML data from the request into a Product object and to convert a Product object into XML data for the response. The following resource class provides a simple example:

@Path("/product")
public class ProductService {
    @GET
    @Path("/get")
    @Produces("application/xml")
    public Product getProduct() {
        Product prod = new Product();
        prod.setId(1);
        prod.setName("Mattress");
        prod.setDescription("Queen size mattress");
        prod.setPrice(500);
        return prod;
    }

    @POST
    @Path("/create")
    @Consumes("application/xml")
    public Response createProduct(Product prod) {
        // Process or store the product and return a response
        // ...
    }
}

Some IDEs, such as NetBeans IDE, will run the schema generator tool automatically during the build process if you add Java classes that have JAXB annotations to your project. For a detailed example, see The customerExample Application. The customer example contains a more complex relationship between the Java classes that model the data, which results in a more hierarchical XML representation.

Starting from an Existing XML Schema Definition

If you already have an XML schema definition in an .xsd file for the data you want to expose, use the JAXB schema compiler tool. Consider this simple example of an .xsd file:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://xml.product" 
           xmlns:xs="http://www.w3.org/2001/XMLSchema"    
           elementFormDefault="qualified"
           xmlns:myco="http://xml.product">

  <xs:element name="product" type="myco:Product"/>

  <xs:complexType name="Product">
    <xs:sequence>
      <xs:element name="id" type="xs:int"/>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="description" type="xs:string"/>
      <xs:element name="price" type="xs:int"/>
    </xs:sequence>
  </xs:complexType>
</xs:schema>

Run the schema compiler tool on the command line as follows:

xjc Product.xsd

This command generates the source code for Java classes that correspond to the types defined in the .xsd file. The schema compiler tool generates a Java class for each complexType defined in the .xsd file. The fields of each generated Java class are the same as the elements inside the corresponding complexType, and the class contains getter and setter methods for these fields.

In this case the schema compiler tool generates the classes product.xml.Product andproduct.xml.ObjectFactory. The Product class contains JAXB annotations, and its fields correspond to those in the .xsd definition:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Product", propOrder = {
    "id",
    "name",
    "description",
    "price"
})
public class Product {
    protected int id;
    @XmlElement(required = true)
    protected String name;
    @XmlElement(required = true)
    protected String description;
    protected int price;

    // Setter and getter methods
    // ...
}

You can create instances of the Product class from your application (for example, from a database). The generated class product.xml.ObjectFactory contains a method that allows you to convert these objects to JAXB elements that can be returned as XML inside JAX-RS resource methods:

@XmlElementDecl(namespace = "http://xml.product", name = "product")
public JAXBElement<Product> createProduct(Product value) {
  return new JAXBElement<Product>(_Product_QNAME, Product.class, null, value);
}

The following code shows how to use the generated classes to return a JAXB element as XML in a JAX-RS resource method:

@Path("/product")
public class ProductService {
    @GET
    @Path("/get")
    @Produces("application/xml")
    public JAXBElement<Product> getProduct() {
        Product prod = new Product();
        prod.setId(1);
        prod.setName("Mattress");
        prod.setDescription("Queen size mattress");
        prod.setPrice(500);
        return new ObjectFactory().createProduct(prod);
    }
}

For @POST and @PUT resource methods, you can use a Product object directly as a parameter. JAX-RS maps the XML data from the request into a Product object.

@Path("/product")
public class ProductService {
    @GET
    // ...

    @POST
    @Path("/create")
    @Consumes("application/xml")
    public Response createProduct(Product prod) {
        // Process or store the product and return a response
        // ...
    }
}

Some IDEs, such as NetBeans IDE, will run the schema compiler tool automatically during the build process if you add an .xsd file to your project sources. For a detailed example, see Modifying the Example to Generate Entity Classes from an Existing Schema. The modified customer example contains a more hierarchical XML schema definition, which results in a more complex relationship between the Java classes that model the data.

Using JSON with JAX-RS and JAXB

JAX-RS can automatically read and write XML using JAXB, but it can also work with JSON data. JSON is a simple text-based format for data exchange derived from JavaScript. For the examples above, the XML representation of a product is:

<?xml version="1.0" encoding="UTF-8"?>
<product>
  <id>1</id>
  <name>Mattress</name>
  <description>Queen size mattress</description>
  <price>500</price>
</product>

The equivalent JSON representation is:

{
    "id":"1",
    "name":"Mattress",
    "description":"Queen size mattress",
    "price":500
}

You can add the format application/json to the @Produces annotation in resource methods to produce responses with JSON data:

@GET
@Path("/get")
@Produces({"application/xml","application/json"})
public Product getProduct() { ... }

In this example the default response is XML, but the response is a JSON object if the client makes a GET request that includes this header:

Accept: application/json

The resource methods can also accept JSON data for JAXB annotated classes:

@POST
@Path("/create")
@Consumes({"application/xml","application/json"})
public Response createProduct(Product prod) { ... }

The client should include the following header when submitting JSON data with a POST request:

Content-Type: application/json


출처 - http://docs.oracle.com/javaee/6/tutorial/doc/gkknj.html

:

Code Examples of POIFSFileSystem

Language/JAVA 2012. 12. 26. 11:49

/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */

package org.apache.poi.hpsf.examples;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;

import org.apache.poi.hpsf.CustomProperties;
import org.apache.poi.hpsf.DocumentSummaryInformation;
import org.apache.poi.hpsf.MarkUnsupportedException;
import org.apache.poi.hpsf.NoPropertySetStreamException;
import org.apache.poi.hpsf.PropertySet;
import org.apache.poi.hpsf.PropertySetFactory;
import org.apache.poi.hpsf.SummaryInformation;
import org.apache.poi.hpsf.UnexpectedPropertySetTypeException;
import org.apache.poi.hpsf.WritingNotSupportedException;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.DocumentEntry;
import org.apache.poi.poifs.filesystem.DocumentInputStream;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

/**
 * <p>This is a sample application showing how to easily modify properties in
 * the summary information and in the document summary information. The
 * application reads the name of a POI filesystem from the command line and
 * performs the following actions:</p>
 *
 * <ul>
 *
 * <li><p>Open the POI filesystem.</p></li>
 *
 * <li><p>Read the summary information.</p></li>
 *
 * <li><p>Read and print the "author" property.</p></li>
 *
 * <li><p>Change the author to "Rainer Klute".</p></li>
 *
 * <li><p>Read the document summary information.</p></li>
 *
 * <li><p>Read and print the "category" property.</p></li>
 *
 * <li><p>Change the category to "POI example".</p></li>
 *
 * <li><p>Read the custom properties (if available).</p></li>
 *
 * <li><p>Insert a new custom property.</p></li>
 *
 * <li><p>Write the custom properties back to the document summary
 * information.</p></li>
 *
 * <li><p>Write the summary information to the POI filesystem.</p></li>
 *
 * <li><p>Write the document summary information to the POI filesystem.</p></li>
 *
 * <li><p>Write the POI filesystem back to the original file.</p></li>
 *
 * </ol>
 *
 * @author Rainer Klute <a
 *         href="mailto:klute@rainer-klute.de">klute@rainer-klute.de</a>
 */
public class ModifyDocumentSummaryInformation {

    /**
     * <p>Main method - see class description.</p>
     *
     * @param args The command-line parameters.
     * @throws IOException
     * @throws MarkUnsupportedException
     * @throws NoPropertySetStreamException
     * @throws UnexpectedPropertySetTypeException
     * @throws WritingNotSupportedException
     */
    public static void main(final String[] args) throws IOException,
            NoPropertySetStreamException, MarkUnsupportedException,
            UnexpectedPropertySetTypeException, WritingNotSupportedException
    {
        /* Read the name of the POI filesystem to modify from the command line.
         * For brevity to boundary check is performed on the command-line
         * arguments. */
        File poiFilesystem = new File(args[0]);

        /* Open the POI filesystem. */
        InputStream is = new FileInputStream(poiFilesystem);
        POIFSFileSystem poifs = new POIFSFileSystem(is);
        is.close();

        /* Read the summary information. */
        DirectoryEntry dir = poifs.getRoot();
        SummaryInformation si;
        try
        {
            DocumentEntry siEntry = (DocumentEntry)
                dir.getEntry(SummaryInformation.DEFAULT_STREAM_NAME);
            DocumentInputStream dis = new DocumentInputStream(siEntry);
            PropertySet ps = new PropertySet(dis);
            dis.close();
            si = new SummaryInformation(ps);
        }
        catch (FileNotFoundException ex)
        {
            /* There is no summary information yet. We have to create a new
             * one. */
            si = PropertySetFactory.newSummaryInformation();
        }

        /* Change the author to "Rainer Klute". Any former author value will
         * be lost. If there has been no author yet, it will be created. */
        si.setAuthor("Rainer Klute");
        System.out.println("Author changed to " + si.getAuthor() + ".");


        /* Handling the document summary information is analogous to handling
         * the summary information. An additional feature, however, are the
         * custom properties. */

        /* Read the document summary information. */
        DocumentSummaryInformation dsi;
        try
        {
            DocumentEntry dsiEntry = (DocumentEntry)
                dir.getEntry(DocumentSummaryInformation.DEFAULT_STREAM_NAME);
            DocumentInputStream dis = new DocumentInputStream(dsiEntry);
            PropertySet ps = new PropertySet(dis);
            dis.close();
            dsi = new DocumentSummaryInformation(ps);
        }
        catch (FileNotFoundException ex)
        {
            /* There is no document summary information yet. We have to create a
             * new one. */
            dsi = PropertySetFactory.newDocumentSummaryInformation();
        }

        /* Change the category to "POI example". Any former category value will
         * be lost. If there has been no category yet, it will be created. */
        dsi.setCategory("POI example");
        System.out.println("Category changed to " + dsi.getCategory() + ".");

        /* Read the custom properties. If there are no custom properties yet,
         * the application has to create a new CustomProperties object. It will
         * serve as a container for custom properties. */
        CustomProperties customProperties = dsi.getCustomProperties();
        if (customProperties == null)
            customProperties = new CustomProperties();

        /* Insert some custom properties into the container. */
        customProperties.put("Key 1", "Value 1");
        customProperties.put("Schl\u00fcssel 2", "Wert 2");
        customProperties.put("Sample Number", new Integer(12345));
        customProperties.put("Sample Boolean", Boolean.TRUE);
        customProperties.put("Sample Date", new Date());

        /* Read a custom property. */
        Object value = customProperties.get("Sample Number");

        /* Write the custom properties back to the document summary
         * information. */
        dsi.setCustomProperties(customProperties);

        /* Write the summary information and the document summary information
         * to the POI filesystem. */
        si.write(dir, SummaryInformation.DEFAULT_STREAM_NAME);
        dsi.write(dir, DocumentSummaryInformation.DEFAULT_STREAM_NAME);

        /* Write the POI filesystem back to the original file. Please note that
         * in production code you should never write directly to the origin
         * file! In case of a writing error everything would be lost. */
        OutputStream out = new FileOutputStream(poiFilesystem);
        poifs.writeFilesystem(out);
        out.close();
    }
}


출처 - http://massapi.com/class/po/POIFSFileSystem.html

:

toJSONString()

Language/JAVA 2010. 10. 19. 16:34

<script type="text/javascript" src="json2.js"></script>

<script language="JavaScript">
<!--
 var people =
   { "programmers": [
  { "firstName": "Brett", "lastName":"McLaughlin", "email": "brett@newInstance.com" },
  { "firstName": "Jason", "lastName":"Hunter", "email": "jason@servlets.com" },
  { "firstName": "Elliotte", "lastName":"Harold", "email": "elharo@macfaq.com" }
    ],
   "authors": [
  { "firstName": "Isaac", "lastName": "Asimov", "genre": "science fiction" },
  { "firstName": "Tad", "lastName": "Williams", "genre": "fantasy" },
  { "firstName": "Frank", "lastName": "Peretti", "genre": "christian fiction" }
    ],
   "musicians": [
  { "firstName": "Eric", "lastName": "Clapton", "instrument": "guitar" },
  { "firstName": "Sergei", "lastName": "Rachmaninoff", "instrument": "piano" }
    ]
   }

   document.write(people.toJSONString());


//-->
</script>

:

ajax post/get 방식

Language/JAVA 2010. 10. 19. 12:09
//post
 name = encodeURIComponent(document.getElementById("myName").value);
 xmlHttp.open("POST", "quickstart.php", true);

xmlHttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charaset=UTF-8");
data = "name="+name;
xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(data);

//get
name = encodeURIComponent(document.getElementById("myName").value);
xmlHttp.open("POST", "quickstart.php?name="+name, true);

xmlHttp.onreadystatechange = handleServerResponse;
xmlHttp.send(null);
 
: