prepare() 기본 사용법


안녕하세요.
고코더 입니다.


com.opensymphony.xwork2.Preparable 속한 prepare 인터페이스는 Action의 prepare() 메소드를 실행 합니다.
이 인터셉터는 Client로 부터 전달된 모든 데이터를 가로채는 역할을 합니다. 그렇기에 
Action이 실행되기전에 특정 메소드를 실행 시킬 수 있습니다. 



implements 구현

 1. 사용법은 implements 속성으로 구현해야 합니다.
기존에 저희가 만든 TestAction에 Preparable를 구현합니다. 

1
public class TestAction extends ActionSupport implements  Preparable {
cs


 2. 그럼 아래와 같은 오류가 발생 합니다. 인터페이스를 구현했으니 prepare()를 오버라이드 해야 합니다.


 3. 아래 소스처럼 prepare()를 오버라이드 해줍니다. 이렇게 하면 이 액션이 호출될때 가장 먼저 실행되게 됩니다. 

1
2
3
4
@Override
public void prepare() throws Exception {
  
}
cs


예제 소스 수정 / TestAction



 4. 이제 지금까지 만들어온 예제에 해당 코드들을 삽입하였습니다. 
String Content에 변수를 미리 선언합니다.
하지만 해당 변수는 getContent()을 통해 파라미터 변수를 입력 받습니다.
만약 prepare가 액션보다 먼저 호출된다면 Pretxt안에 "미리 선언한 내용"이 입력될 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package test;
 
import java.sql.SQLException;
 
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.Preparable;
 
public class TestAction extends ActionSupport implements Preparable {
 
    String Title;
    String Content = "미리 선언한 내용";
    String Pretxt;
 
    // Preparable 인터페이스 가장 먼저 실행 된다.
    @Override
    public void prepare() throws Exception {
        // CONTENT 변수안에 있는 텍스트가 SET 담기기전에 가져온다.
        this.Pretxt = this.Content;
    }
 
    public String getTitle() {
        return Title;
    }
 
    public void setTitle(String Title) {
        this.Title = Title;
    }
 
    public String getPretxt() {
        return Pretxt;
    }
 
    public void setPretxt(String pretxt) {
        Pretxt = pretxt;
    }
 
    public String getContent() {
        return Content;
    }
 
    public void setContent(String Content) {
        this.Content = Content;
    }
 
    public String getView() {
        // this.Title = "제목";
        // this.Content = "내용";
        return SUCCESS;
    }
 
    /* 데이터베이스 연결 테스트를 위한 */
 
    TestDao dao = new TestDao();
    String ConYN;
 
    public String getConYN() {
        return ConYN;
    }
 
    public String conTest() throws SQLException {
        this.ConYN = dao.conTest();
        return SUCCESS;
    }
 
}
cs



결과 화면



 5. 결과화면을 보겠습니다. 파라미터에 담긴 제목과 내용이 출력되고 prepare에는 contet초기 변수를 담아둔 "미리 선언한 내용"
이라는 글자가 나타납니다. 이는 액션에서 가장 먼저 동작했기에 Content에 담긴 내용이 사라지기전에 변수에 담아 표현 할 수 있었습니다.


 6. 다시 한번 설명 드리면 prepare()는 인터페이스은 Preparable을 오버라이드 되어 실행됩니다. 이 기능을 테스트 하기 위해 Content에 초기 선언한 변수를 Pretxt로 먼저 가져올 수 있는지 테스트 하였습니다.




마무리


참 쉽죠?


댓글을 달아 주세요





스트럿츠2 아이바티스 데이터베이스 연결 소스


안녕하세요.
고코더 입니다.


오늘은 ibatis를 이용해 오라클 데이터베이스를 연결하는 방법을 알아보겠습니다.
ibatis를 이용한 이유는 스트럿츠2에서 가장 많이 사용하는 프레임워크 입니다. 
실무에서도 이 두 조합은 쉽게 볼 수 있습니다. 
그래서 최대한 쉽게 ibatis를 스트럿츠2를 이용해 데이터베이스를 연결해서 select 쿼리를 날려보겠습니다.

학습전에 제가 남겨둔 이전 스트럿츠 강의를 보고 오시길 바랍니다. 해당 소스를 활용할 예정입니다.

그리고 오라클 데이터베이스도 설치하시면 좋을거 같습니다
-> 

Oracle - 오라클 오류 "ora-28000 the account is locked" / 계정이 잠겨 있습니다.

오라클 - scott 계정은 첫 로그인 후 비번을 바꿔야 합니다. / the password has expired




 1. SqlMapConfig.xml 생성


src 폴더 아래 SqlMapConfig.xml 를 생성해주세요. 데이터베이스 연결을 위한 config 파일 입니다.

내용은 아래처럼 채워주세요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig      
    PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"      
    "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
  <transactionManager type="JDBC" commitRequired="false">
    <dataSource type="SIMPLE">
      <property name="JDBC.Driver" value="oracle.jdbc.OracleDriver"/>
      <property name="JDBC.ConnectionURL"  value="jdbc:oracle:thin:@localhost:1521:orcl"/>
      <property name="JDBC.Username" value="scott"/>
      <property name="JDBC.Password" value="tiger"/>
    </dataSource>
  </transactionManager>
       
       <sqlMap resource="map/db_test.xml" />
</sqlMapConfig>
cs

 2. SqlMapLocator.java 생성


util 패키지를 생성하여 SqlMapLocator.java 파일을 만듭니다. ibatis를 사용하기 위한 기본 파일입니다.

내용은 아래처럼 채웁니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package util;
import java.io.IOException;
import java.io.Reader;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
public class SqlMapLocator {
       public static SqlMapClient getMapper()
       {
             SqlMapClient sqlMapper;
             
           try
           {
              Reader reader = Resources.getResourceAsReader(
                      "SqlMapConfig.xml");
              sqlMapper = SqlMapClientBuilder.buildSqlMapClient(reader);
              
              reader.close();
           }
           catch (IOException e)
           {
              // Fail fast.
              throw new RuntimeException(
                      "Something bad happened while building the SqlMapClient  instance." +
                      e, e);
           }
           return sqlMapper;
       }
}
cs

해당 예제는 ibatis를 사용할때 거의 공통으로 쓰는 방식입니다. 우선 작성해보세요.



 3. db_test.xml


이번엔 이전에 생성한 map 패키지 안에 db_test.xml을 만듭니다. 
이 파일은 게시판을 만들때 사용하기 위해 test 라는 이름으로 만들었습니다.
해당 xml은 모든 쿼리를 작성하여 사용합니다. 

내용은 아래처럼 채웁니다.
1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap>
       <select id="conTest" resultClass="String">
       select 'Database Connection Test' as conTest from DUAL
       </select>
</sqlMap>
cs
5번째 라인 : 해당 쿼리에 id를 지정합니다. 반환 클래스는 스트링 문자로 반환합니다.
6번째 라인 : select 문을 작성하였습니다. 오라클 기본 테이블을 이용하여 데이터베이스 연결 테스트 입니다.


 4. TestDao.java 생성 


이제는 쿼리를 끌어와 실행시킬 DAO(Data Access Object) 파일을 생성합니다. 이 파일은 DB를 사용해 데이터를 조화하거나 조작하는 기능을 전담하는 오브젝트입니다.

내용은 이렇게 작성합니다. 데이터 베이셔 연결을 위한 쿼리만 하나만 가져옵니다.
1
2
3
4
5
6
7
8
9
10
package test;
import java.sql.SQLException;
import util.SqlMapLocator;
public class TestDao {
       public String conTest() throws SQLException
       {      
             //데이터베이스 연결 테스트
             return   (String)SqlMapLocator.getMapper().queryForObject("conTest");
       }
}
cs

8번째 라인 : ibatis에 queryForObject 를 사용해 연결되어 있는 XML에 conTest 쿼리를 가져옵니다.


 5. TestAction.java 수정


해당 Action 파일을 수정 합니다. 이전에 함께 따라 하신분은 코드를 추가하면 됩니다.

내용은 이렇게 기록 합니다. 기존 액션 클래스에 내용을 추가했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package test;
import java.sql.SQLException;
import com.opensymphony.xwork2.ActionSupport;
public class TestAction extends ActionSupport {
     String Title;
     String Content;
     public String getTitle() {
           return Title;
     }
     public void setTitle(String Title) {
           this.Title = Title;
     }
     
     public String getContent() {
           return Content;
     }
     public void setContent(String Content) {
           this.Content = Content;
     }
     
     public String getView() {
           //this.Title = "제목";
           //this.Content = "내용";
           return SUCCESS;
     }
     
     /*데이터베이스 연결 테스트를 위한*/
     
     TestDao dao = new TestDao();
     String ConYN;    
     public String getConYN() {
        return ConYN;    
     }
  
     public String conTest() throws SQLException {
         this.ConYN = dao.conTest();
         return SUCCESS;
     }
}
cs
9번 라인 : 위에서 생성한 dao를 생성합니다.
15번 라인 : 위에서 작성한 conTest() 메소드를 가져옵니다.



 6. struts2_test.xml 추가


이제는 URI에서 맵핑이 되도록 struts2_test.xml를 수정해보겠습니다. 

아래에 내용을 추가합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
     <package name="struts2_test" namespace="/test"  extends="struts-default">
           <action name="hello" class="hello.HelloAction">
                <result name="success" >/WEB-INF/hello.jsp</result>
           </action>
           <action name="view" class="test.TestAction" method="getView">
                <result name="success" >/WEB-INF/test/view.jsp</result>
           </action>
             <!-- 데이터 베이스 연결 테스트 -->       
           <action name="conTest" class="test.TestAction"  method="conTest">
                <result name="success"  >/WEB-INF/test/conTest.jsp</result>
           </action>            
     </package>
</struts>
cs



 7. WEB-INF/test/conTest.jsp 파일 생성


뷰를 작성하기 위해 test 폴더 아래 해당 파일을 생성합니다. 

아래에 내용을 기입합니다. 
1
2
3
4
5
6
7
8
9
10
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
</head>
       <body>
       접속 : ${ConYN}
       </body>
</html>
cs

${ConYN}을 이용해 데이터베이스 액세스를 체크 합니다.


 8. 결과 화면 


해당 URL에 접속하면 데이터베이스가 연결된걸 확인 가능합니다.


마무리



최대한 쉽게 가르켜드리려고 합니다.!

댓글을 달아 주세요


스트럿츠 인코딩을 UTF-8로 해야하는 필수적인 4가지 파일


안녕하세요.
고코더 입니다.




제 게시물을 보면서 스트럿츠 학습 하고 있는 분에게 질문이 들어와 한번 짚고 넘어가려 합니다. 
프로그래밍 언어는 서양에서 만들어졌고 영어가 모든 명령어의 기본이라 그런지
언제나 영어를 기본으로 인코딩이 되어 있습니다. 한글을 사용하려면 euc-kr 이상이필요한데 말이죠
그리고 요즘은 글로벌 사이트가 많아서 utf-8로 하는게 정석입니다.
스트럿츠2도 역시 영어 인코딩에서 UTF-8로 바꿔줘야 합니다.

강의를 따라오신분은 제가 작성한 모든 파일이 UTF-8인코딩을 기본으로 하지만
한글깨짐으로 학습에 못따라오는 분을 위해 다시 한번 설명드립니다.



 1. JSP에서 UTF-8을 명시


JSP 파일 최상단에는 이 소스는 UTF-8이라고 명시를 해줘야 합니다.
아래 코드가 JSP 파일 맨위에 있는지 확인해보세요.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>


 2. web.xml 에서 encoding 설정


web.xml 안에 UTF-8로 필터가 걸려있는지 확인해보세요.
스트럿츠 디스패처를 사용할 경우 UTF-8이 기본 인코딩라고 알려줘야 합니다. 

  <filter>
     <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
     <init-param>
     <param-name>struts.i18n.encoding</param-name>
     <param-value>UTF-8</param-value>
    </init-param>    
  </filter>




 3. server.xml 에도 URIEncoding 설정이 필요합니다.


각 아파치 톰캣으로 만든 파일에서 설정파일인 sever.xml에도 수정이 필요합니다.
이 부분은 스트럿츠 강의에 다루지 않았는데요. 처음 개발하는 분들이 여기에 많이 헤매시는거 같습니다.
중간에 보시면 아래 태그에 맨뒤에URIEncoding을 UTF-8로 지정해보세요

<Connector connectionTimeout="20000" port="8080"  protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>


 4. struts.properties 파일에 옵션 추가


스트럿츠 프로퍼티 파일에도 인코딩을 설정하는 파일이 있습니다. 위 3가지만 지키면 한글이 깨지지 않을텐데요.
혹시나 몰라서 이부분도 다시 기재드립니다. 프로퍼티 파일에 UTF-8을 지정하세요.
struts.i18n.encoding=UTF-8


마무리


영어권 나라가 부럽습니다.

댓글을 달아 주세요


스트럿츠2 struts.properties 파일로 프로젝트 설정 하기 


안녕하세요.
고코더 입니다.


오늘은 struts.xml 만큼 중요한 설정 파일을 알아봅니다. 프로젝트에 상세한 설정을 할 수 있는 properties 파일에 대해 알아봅니다. 모든 언어에는 해당 언어에 대한 옵션을 변경 가능한 설정 파일이 존재합니다. 스트럿츠2에서도 당연히 존재합니다.
말그대로 속성을 지정하는 이 파일을 생성하고 옵션을 입력해보겠습니다.



 1. struts.properties 대해


struts.properties 는 프레임워크에 대한 상세 설정은 변경 가능합니다. 그런데 가끔 스트럿츠를 가르킬때
해당 파일을 작성하지 않고 하는 경우도 많은데 해당 파일이 없다면 기본설정으로 작동하게 됩니다.
속성을 바꾸면 설정을 오버라이드 하는 방식입니다. 
스트럿츠2의 기본 확장자는 action이지만 액션을 그대로 쓰는 한국 웹사이트는 거의 없습니다.
해당 확장자를 바꾸는 것도 이 파일에서 진행 됩니다. 
그리고 다양한 디버그 옵션들도 이 파일에서 사용할 수 있도록 설정이 가능합니다. 


 2. struts.properties 생성 방법


해당 파일 역시 src 아래에 struts.xml에 입력합니다. 이 파일 역시 struts.xml과 동일하게 src에 파일이 서버 작동시 자동으로 classes로 배포 되기 때문입니다. 
해당 파일은 이클립스 기본 파일 만들기에 존재하지 않으므로 메모장으로 만든 후에 붙혀넣기 형식으로 입력 합니다. 



 3. struts.properties 설정 


실무에서 많이 사용하는 내용 중심으로 개발을 진행합니다.
해당 영어 이외에 문자가 들어가지 못하므로 한글로 주석 처리를 할 수 없습니다.
struts.i18n.reload=true : 소스 파일을 수정후에 리스타트 없이 적용 시켜줍니다
struts.configuration.xml.reload = true : 설정 XML을 새로고쳐질때마다 로딩 합니다.
struts.devMode = false : 스트럿츠 개발 모드를 on 합니다. 하지만 보안 취약점때메 보통 on을 금합니다. 
struts.custom.i18n.resources=globalMessages,globalConfig :  resource properties파일을 지정합니다.
struts.action.extension=action : 기본 확장자를 변경합니다. action이 기본입니다. 보통 .do로 많이 변경합니다.
struts.ognl.allowStaticMethodAccess=true : static 변수나 메소드 사용할 수 있게 해줍니다.
struts.i18n.encoding=UTF-8 : 인코딩 설정을 바꿉니다. 한글이 깨지면 이걸 수정


마무리


뭔가 필요하다 싶으면 이 파일 옵션을 찾아보세요.

댓글을 달아 주세요