struts2 - struts 2의 Exception 처리

Published on: 2009. 8. 9. 15:47 by louis.dev


struts 2에서는 action mapping이 되어있는 xml파일에 익셉션을 선언하여 Exception을 처리 할 수 있다.

exception의 선언 방법에는 두가지가 있는데.

1. mapping된 xml 파일의 상단에 선언하여(package 아래 action 태그 위에 선언) global-exception을 처리 하는 방법
2. mapping된 xml 파일의 중간(action 태그 내부에 선언) 하여 특정한 action에서의 exception을 처리 하는 방법

이렇게 두가지 방법을 들을 수가 있다.

1. mapping xml파일의 상단에 선언하는 global-exception처리방법

다음과 같이 Action Mapping을 수행하는 xml 파일의 상단에 선언한다.
위에서 말했듯이 Global-exception은 그림과 같이 <package/> 태그의 시작부분 그리고 <action/>태그보다 위에 위치해 있어야 한다.

<global-exception-mapping/> 에서 선언한 종류의 익셉션이 발생했을 경우 result ="exception" 이 실행이 되는디 이 exception이란 result는 상단에 <global-result/>라고 선언된 곳의 result name을 따라가게 된다. 그리고 선언된 page를 요청하여 사용자에게 보여주게 된다.

물론 <global-result/>에서 여러가지 종료의 exception result를 선언하여 다양한 Exception에 마춰 다양한 에러페이지로 이동할 수도 있다.
당연히 <global-exception-mapping/>도 여러개가 선언되어 있어야 할 것이다.


2. 특정 action 에 대한 Exception을 처리 하는 방법


다음과 같이 <action/>태그 내에 <excpetion-mapping/>을 선언한다. 위와 같은 코드는 NullPointerException이 발생되었을때 <action/>태그내에 선언되어 있는 result name="exception" 인 에러 페이지로 이동하게 된다.(exception-mapping result와 result name="exception" 이 같아야 한다.)

<공통>
Exception이 발생하였을때 보여지는 jsp페이지에서는 struts2에서 제공하는 태그라이브러리를 통해 에러 내용을 출력 할 수 있다.

<%@ taglib prefix="s" uri="/struts-tags" %>

tag lib을 추가 하고
<s:actionerror/>
<s:actionmessage/>
<s:fielderror/>
다음과 같은 테그로 에러 내용을 표시 할 수 있다. 또한
${exception.message}
이렇게 선언할 수 도 있고

예외 상세 정보를 확인 하려면
${exceptionStack}

선언하여 exceptionStack에 쌓여있는 에러 정보를 확인 할 수도 있다

'Framework > STRUTS 2' 카테고리의 다른 글

struts 2 - 스트러츠2 + spring 연동하기  (2) 2009.07.12
struts 2 - JFree Chart plugin  (0) 2009.07.08
struts 2 - Tiles Plug in  (6) 2009.07.08
struts 2 - Interceptor  (3) 2009.07.06
struts 2 - properties 파일  (1) 2009.07.05

iBatis - SqlMapClient class 만들어 주는 util

Published on: 2009. 8. 8. 03:17 by louis.dev


iBatis를 사용할때 template를 쓰지 않을때는 항상 SqlMapConfig파일을 통해 SqlMapClient를 생성해야 한다. 그것을 쉽게 해주기 위한 Abstract class이다.

package com.myhome.manager;

import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;

public abstract class SQLManager {
 
 private SqlMapClient sc = null;
 
 public SQLManager(){
  try{
   sc = SqlMapClientBuilder.buildSqlMapClient(
            Resources.getResourceAsReader(
              "com/myhome/manager/SqlMapConfig.xml"));           //sql설정이 들어가 있는 SqlMapConfig파일 위치 지정
                                                                                            //classes 폴더에 있으면 SqlMapClient.xml로 바로 지정 해도 됨
  }catch(java.io.IOException ie){
   ie.printStackTrace();
  }
 }
 
 public SqlMapClient getSqlMap(){
  return sc;
     }
}

사용방법은 extends로 다음 클래스 파일을 확장 받은다음에 getSqlMap을 통해 SqlMapCleint를 생성한다.

예)

public class UploadDAO extends SQLManager{
 
 public void insert(UploadDTO dto) throws SQLException{
           this.getSqlMap().insert("uploadInsert",dto);
 }

JSTL - fmt를 사용해서 데이터 format 변경하기.

Published on: 2009. 7. 29. 03:56 by louis.dev

jstl의 fmt를 사용하면 날자 데이터를 사용자가 원하는 표기법으로 표기한다던지(yyyy-mm-dd) 숫자 형식에서 소수점을 몇째짜리 까지 표현할 것인지를 정의 할 수 있다.

작업 순서
1. jsp 상단에 fmt 를 선언해 준다.
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>

2. 원하는 위치에 <fmt:~~ 이용해서 포맷을 변경한다.


다양한 fmt의 Attribute

1. fmt:formatNumber Attributes
Name Required Request-time Type Description
value false true java.lang.String Numeric value to be formatted.
type false true java.lang.String Specifies whether the value is to be formatted as number, currency, or percentage.
pattern false true java.lang.String Custom formatting pattern.
currencyCode false true java.lang.String ISO 4217 currency code. Applied only when formatting currencies (i.e. if type is equal to "currency"); ignored otherwise.
currencySymbol false true java.lang.String Currency symbol. Applied only when formatting currencies (i.e. if type is equal to "currency"); ignored otherwise.
groupingUsed false true java.lang.String Specifies whether the formatted output will contain any grouping separators.
maxIntegerDigits false true java.lang.String Maximum number of digits in the integer portion of the formatted output.
minIntegerDigits false true java.lang.String Minimum number of digits in the integer portion of the formatted output.
maxFractionDigits false true java.lang.String Maximum number of digits in the fractional portion of the formatted output.
minFractionDigits false true java.lang.String Minimum number of digits in the fractional portion of the formatted output.
var false false java.lang.String Name of the exported scoped variable which stores the formatted result as a String.
scope false false java.lang.String Scope of var.

 

2. fmt:parseNumber Attributes
Name Required Request-time Type Description
value false true java.lang.String String to be parsed.
type false true java.lang.String Specifies whether the string in the value attribute should be parsed as a number, currency, or percentage.
pattern false true java.lang.String Custom formatting pattern that determines how the string in the value attribute is to be parsed.
parseLocale false true java.lang.String Locale whose default formatting pattern (for numbers, currencies, or percentages, respectively) is to be used during the parse operation, or to which the pattern specified via the pattern attribute (if present) is applied.
integerOnly false true java.lang.String Specifies whether just the integer portion of the given value should be parsed.
var false false java.lang.String Name of the exported scoped variable which stores the parsed result (of type java.lang.Number).
scope false false java.lang.String Scope of var.

 

ex) 패턴 예제

  <fmt:formatNumber value="123456.78" pattern=",###"/> 3자리 기준으로 "," 찍기 (금액 / 소수점 제거)

  <fmt:formatNumber value="123456.78" pattern=".##"/> #의 갯수에 따라 소수점을 출력함 (반올림)

 

3. fmt:formatDate Attributes
Name Required Request-time Type Description
value true true java.lang.String Date and/or time to be formatted.
type false true java.lang.String Specifies whether the time, the date, or both the time and date components of the given date are to be formatted.
dateStyle false true java.lang.String Predefined formatting style for dates. Follows the semantics defined in class java.text.DateFormat. Applied only when formatting a date or both a date and time (i.e. if type is missing or is equal to "date" or "both"); ignored otherwise.
timeStyle false true java.lang.String Predefined formatting style for times. Follows the semantics defined in class java.text.DateFormat. Applied only when formatting a time or both a date and time (i.e. if type is equal to "time" or "both"); ignored otherwise.
pattern false true java.lang.String Custom formatting style for dates and times.
timeZone false true java.lang.String Time zone in which to represent the formatted time.
var false false java.lang.String Name of the exported scoped variable which stores the formatted result as a String.
scope false false java.lang.String Scope of var.

 

4. fmt:parseDate Attributes
Name Required Request-time Type Description
value false true java.lang.String Date string to be parsed.
type false true java.lang.String Specifies whether the date string in the value attribute is supposed to contain a time, a date, or both.
dateStyle false true java.lang.String Predefined formatting style for days which determines how the date component of the date string is to be parsed. Applied only when formatting a date or both a date and time (i.e. if type is missing or is equal to "date" or "both"); ignored otherwise.
timeStyle false true java.lang.String Predefined formatting styles for times which determines how the time component in the date string is to be parsed. Applied only when formatting a time or both a date and time (i.e. if type is equal to "time" or "both"); ignored otherwise.
pattern false true java.lang.String Custom formatting pattern which determines how the date string is to be parsed.
timeZone false true java.lang.String Time zone in which to interpret any time information in the date string.
parseLocale false true java.lang.String Locale whose predefined formatting styles for dates and times are to be used during the parse operation, or to which the pattern specified via the pattern attribute (if present) is applied.
var false false java.lang.String Name of the exported scoped variable in which the parsing result (of type java.util.Date) is stored.
scope false false java.lang.String Scope of var.

 

ex) 표기법 예제

  <fmt:formatDate value="timstamp" type="both" pattern="yy-MM-dd hh:mm"/> 날짜 및 시간

  <fmt:formatDate value="timstamp" type="date" pattern="yy-MM-dd"/> 날짜

  <fmt:formatDate value="timstamp" type="time" pattern="hh:mm"/> 시간


'Web > JSTL' 카테고리의 다른 글

JSTL - <c:import> , <c:redirect>  (0) 2009.04.15
JSTL - <c:url>  (0) 2009.04.15
JSTL - get 방식으로 넘어온 파라미터 값을 JSTL로 받기  (3) 2009.04.07
JSTL - 라이브러리 다운받기  (0) 2009.04.03

JSON - JSON API 사용하여 JSON표기 쉽게 처리 하기

Published on: 2009. 7. 15. 01:02 by louis.dev

앞에서 살펴본 JSON표기법을 기본으로 하여 사용자가 직접 JSON의 표기법을 선언해 사용할 수 있다. 하지만 전달될 데이터가 복잡해 지고 다양해 지면서 개발자가 직접 JSON 표기법에 맞추어 제작하기는 매우 힘들다. 그렇기 때문에 www.json.org 에서 제공하는 API를 통해 개발자 들은 직접 JSON표기법으로 JSON데이터를 구성하지 않고 만들수 있다.

1. JSON API 다운로드 받기

http://www.json.org 페이지의 하단 부분의 json-simple 이란 부분을 클릭한다.

상단의 download를 클릭하면 json Library를 다운 받을 수 있다.
JSON의 document를 보려면 org.json 을 클릭하면 문서를 확인 할 수 있다.

2. JSON의 구조

Ajax방식으로 스크립트에서 JSON ENGINE을 호출하면 JSON ENGINE은 DB에 접근 하는 java class를 호출 하여 DB에서 데이터를 가져오게 된다.
이때 가져온 데이터를 JSON API를 통해 JSON방식으로 데이터를 생성하고 view페이지로 텍스트 방식으로 넘긴다. 그리고 그 데이터를 다시 자바스크립트로 보내게 되는 루트를 가진다.
여기서 가장 중요한 것은 view 페이지의 json데이터는 반드시 text 형식으로 설정되어야 한다는 것이다.

<%@ page  contentType="text/plain; charset=EUC-KR"%>

3. 작성방법
1) object 형식으로 데이터를 받아 사용하는 방식

① 블로그에 올린 HttpRequest.js 파일의 sendRequest function을 통해 Ajax방식으로 JavaClass로 접근한다.
sendRequest("cartjson.action", param, jsonCartObject, "POST");
cartjson.cation : javaclass파일 호출
jsonCartObject : callback 함수 호출

② javaClass에서 JSON API를 통해 JSON객체 생성
public String createJSONObject(){
   SalesCartBean bean = getCartBean();
   
   JSONObject obj = new JSONObject();  //json을 사용하기 위한 객체 생성
   obj.put("goods", bean.getGoods());   //앞은 key 뒤는 value
   obj.put("qty", bean.getQty());
   obj.put("cost", bean.getCoststr());
   obj.put("amount", bean.getAmountstr());
  
   JSONObject outer = new JSONObject(); //
   outer.put("cartlist", obj);      //session의 cartlist를 obj에 넣는다.
   System.out.println(outer);
   return outer.toString();
 }

다음과 같이 JSONObject 인스턴스를 생성하여 put() method로 key와 value를 넣어주고 있다.
그리고 하단에서 outer라는 이름의 JSONObject 인스턴스를 생성해 위에서 생성한 obj를 넣어주고 있다. 즉 다음과 같이 하면 JSON의 표기법은
cartlist : {
"obj" : {
          "goods" : "bean.getGoods()데이터",
          "qty" : "bean.getQty() 데이터",
          "cost" : "bean.getCoststr()의 데이터",
          "amount" : "bean.getAmountstr()의 데이터"
          }
}


다음과 같은 형태가 된다.

③ 데이터를 전달 받은 view page는

<%@ page  contentType="text/plain; charset=EUC-KR"%>

${jsoncart}

이런식으로 설정해 주고 다시 callback method를 실행 시켜 JSON데이터를 끄집어 낸다.

function jsonCartObject(){
   if(httpRequest.readyState == 4) {
      if (httpRequest.status == 200) {
        var json = eval('(' + httpRequest.responseText + ')');  //json정보는 text로 가져온다. eval의 ()안의 것은 method가 된다.
        var tableID = document.all.salesbody;
        var row=tableID.insertRow(1);
        row.bgColor="ffffff";
        row.height="24";
        row.align="center";
        row.insertCell().innerText=json.cartlist.goods;  //insertCell() : 행을 나눈다(javascript function).전달받은 json데이터의 데이터를 가져온다.
        row.insertCell().innerText=json.cartlist.qty;
        row.insertCell().innerText=json.cartlist.cost;
        row.insertCell().innerText=json.cartlist.amount;
       }
     }
  } 

다음과 같은 방식으로 json데이터를 가져온다.

2) Array를 사용하여 JSON데이터 생성
① 블로그에 올린 HttpRequest.js 파일의 sendRequest function을 통해 Ajax방식으로 JavaClass로 접근한다.
sendRequest("cartjson.action", param, jsonCartArray, "POST");

② JAVA Class에서 데이터를 전송받아 JSON객체 생성

public String createJSONArray(){
  JSONArray inner = new JSONArray();
   for(int i = 0; i < cartlist.size(); i++){
     SalesCartBean bean = cartlist.get(i);
     JSONObject obj = new JSONObject();
     obj.put("goods", bean.getGoods());
     obj.put("qty", bean.getQty());
     obj.put("cost", bean.getCoststr());
     obj.put("amount", bean.getAmountstr());
     inner.add(obj);
  }
  JSONObject outer = new JSONObject();
  outer.put("cartlist", inner);
  System.out.println(outer);
  return outer.toString();
 }

JSONArray 객체를 생성한다. 그리고 list형인 cartlist라는 collection을 가져와서 JSONObject 형에 넣어주고 inner라는 Array형에다가 넣어준다.
또 마지막으로 Object형으로 선언한 outer에다가 inner를 넣어주면서 배열형식으로 변환한다.

즉 다음과 같은 형태는 JSON표기법으로 다음과 같이 표현된다.
 {cartlist : 
       [ 
         {
          "goods" : "노트북",
          "gty" : 2,
          ...
         },
         {
           "goods" : "노트북",
            "gty" : 2,
            ...
          },
        ]
   }

③ callback function에서 전송된 json객체를 처리한다.

function jsonCartArray(){
     if(httpRequest.readyState == 4) {
      if (httpRequest.status == 200) {
     var json = eval('(' + httpRequest.responseText + ')');
        var sid  = document.getElementById("salesbody");
        if(sid.rows.length>1){
      for (k=sid.rows.length-1; k >= 1 ; k--){
       sid.deleteRow(k);  //노드를 삭제 한다.
      }
     }
     for(i=0; i< json.cartlist.length; i++){
      oRow = document.createElement('tr');        
      oCel0 = document.createElement('td');
      oCel1 = document.createElement('td');
      oCel2 = document.createElement('td');
      oCel3 = document.createElement('td');
       
      //oRow.style.textAlign='center';
      oRow.height='24';
      oRow.bgColor="ffffff";
            
      oCel0.className='cel0';
      oCel1.className='cel1';
      oCel2.className='cel2';
      oCel3.className='cel3';
      
      oRow.appendChild(oCel0);
      oRow.appendChild(oCel1);
      oRow.appendChild(oCel2);
      oRow.appendChild(oCel3);
      
      oCel0.style.textAlign='center';
      oCel1.style.textAlign='center';
      oCel2.style.textAlign='right';
      oCel3.style.textAlign='right';
      
      oCel0.innerHTML=json.cartlist[i].goods;
      oCel1.innerHTML=json.cartlist[i].qty;
      oCel2.innerHTML=json.cartlist[i].cost+'&nbsp;&nbsp;';
      oCel3.innerHTML=json.cartlist[i].amount+'&nbsp;&nbsp;';
      
      document.getElementById('salesbody').children(0).appendChild(oRow);
     }
       }
     }
    }
  
다른부분은 로직부분이기때문에 볼 필요 없고 색 있는 곳을 보면 cartlist를 배열형식으로 접근하고 있다.

JSON - JSON 표기법의 기본

Published on: 2009. 7. 15. 00:24 by louis.dev


1. object 방식
1) object 출력
<script language="JavaScript">
<!--
  var myJSONObject = {
    "test" : "hello"
  }
//-->
</script>
<form>
  <input type = "button" onclick="alert(typeof myJSONObject)" value="click">
</form>

출력결과 : object형태이기 때문에 "object" 가 출력된다.

2) property 출력
<script language = "JavaScript">
<!--
  var myJSONObject2 = {
    "test": "hello"
  }
//-->
</script>
<form>
  <input type = "button" onclick = "alert( myJSONObject2 )" value = "click">           <!-- 출력결과 : object Object -->
  <input type = "button" onclick = "alert( myJSONObject2.test )" value = "click">     <!-- 출력결과 : hello -->
  <input type = "button" onclick = "myJSONObject2.test = 'new test' ; alert(myJSONObject2.test )" value = "click">  <!--출력결과 : new test -->
  <input type = "button" onclick="alert(myJSONObject2.test)" value="click"/>          <!-- 출력결과 : hello -->
</form>

세번째줄과 같이 myJSONObject2.test에 새로운 문자열 new test를 입력하고 출력하면 new test가 출력 되지만 다시 출력하면 JSON에서 선언한 기본 데이터인 hello가 출력된다.

3) property가 두개 이상인 경우

<script language="JavaScript">
<!--
  var myJSONObject3 = {
    "test1": "hello1",
    "test2": "hello2", 
    "test3":"hello3"
  }
//-->
</script>
<form>
  <input type="button" onclick="alert(myJSONObject3.test1)" value="click">     <!-- 출력결과 : hello1 -->
  <input type="button" onclick="alert(myJSONObject3.test2)" value="click">     <!-- 출력결과 : hello2 -->
  <input type="button" onclick="alert(myJSONObject3.test3)" value="click">     <!-- 출력결과 : hello3 -->
</form>

각각의 property들은 ,(콤마) 로 구분한다.

4) 메소드 방식
<script language="JavaScript">
<!--
  var myJSONObject4 = {
    "test1" : "function() { alert('This is method test1') }"
  }
//-->
</script>

<form>
  <input type="button" onclick="eval('a=' + myJSONObject4.test1); a()" value="click">  <!-- 출력결과 : This is method test1 -->
</form>

eval은 javascript 메소드로서 전달인자를 function 으로 사용할 수 있게 한다.  a= 에 test1의 메소드가 대입되고 a(); 란 명령으로 json의 test1 function을 호출한다.

5) 메소드 방식(전달 인자가 있을 때)
<script language="JavaScript">
<!--
  var myJSONObject5 = {
    "test2" : "function(arg) { alert('This is argument : ' + arg) } "
  }
//-->
</script>
<form>
  <input type="button" onclick="eval('var a=' + myJSONObject5.test2 + ''); a('hello');" value="click">
  <input type="button" onclick="eval('(' + myJSONObject5.test2+')(\'hello\')');" value="click">
</form>

둘다 모두 hello가 출력된다.

6) 중첩된 object
<script language="JavaScript">
var obj7 = {
    "test" : {
      "name" : "k2club",
      "id" : 123
    }
  }
</script>
<input type="button" onclick="alert(typeof obj7.test)" value="click"> 
<input type="button" onclick="alert(obj7.test.name)" value="click">     <!-- 출력결과 : k2club -->
<input type="button" onclick="alert(obj6.test.id)" value="click">           <!-- 출력결과 : 123 -->

object는 name/value 쌍들의 비순서화된 SET이다. object는 { (좌 중괄호)로 시작하고 } (우 중괄호)로 끝내어 표현한다. 각 name 뒤에 : (colon)을 붙이고 , (comma)로 name/value 쌍들 간을 구분한다.

2. Array 방식
1)1차원 배열
<script language="JavaScript">
<!--
  var obj5 = [
    "test"
  ]
//-->
</script>

<input type="button" onclick="alert(typeof obj5[0])" value="click">
<input type="button" onclick="alert(obj5[0])" value="click">


2) 2차원 배열
<script language="JavaScript">
<!--
  var obj6 = {
    "test" : [
      "ccc", "ddd"
   
  }
//-->
</script>

<input type="button" onclick="alert(obj6.test[0])" value="click">   <!-- 출력결과 : ccc -->
<input type="button" onclick="alert(obj6.test[1])" value="click">   <!-- 출력결과 : ddd -->
다음과 같이 배열은 [] 으로 표현하며 [index]로 접근할 수 있다.