검색을 아래와 같은 쿼리로 실행할 경우,

SELECT *

FROM
(
SELECT rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <=20
ORDER BY bbsno DESC
)
WHERE rn > 10

낮은 코스트가 나온다

하지만 이 쿼리의 문제점은 데이터 양이 적을 때 풀 스캔을 먹는다는것이다.

- 힌트를 이용하여 강제로 풀스캔을 먹인 경우

SELECT /*+FULL(tbl_bbs)*/ rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE rownum <= 20
ORDER BY bbsno DESC

전체 디비를 검색하고 로우넘을 붙이고 마지막에 소팅을 한다. 코스트가 엄청 커진다.

검색 결과를 보면 처음부터 검색하는지 않고 중간에서 부터 결과가 나온다.

- 인덱스의 단점은 : 인덱스를 이용하여 insert나 delete 작업을 하면 떨어진다.

- 인덱스를 타고 싶은데 오라클 옵티마이저가 스스로 판단해서 full scan을 할때도 있기 때문에 로우넘이 꼬이는 경우가 있다. 그래서 hint를 사용하여 무조건 인덱스를 타게 해준다.

※ order by를 사용하지 않는다! 인덱스를 이용하여 아래에서 부터 검색
SELECT
/*+INDEX_DESC(tbl_bbs pk_bbs)*/ //->order by를 사용하지 않고 DESC를 사용해서
 rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0 
AND rownum <= 20

SELECT
/*+INDEX(tbl_bbs pk_bbs)*/
 rownum rn, bbsno, writer, content, title
FROM TBL_BBS
WHERE bbsno > 0
AND rownum <= 20

■ SwitchAction

 Context 내에 여러 개의 모듈이 있을 때  현재 작업중인 모듈에서 다른 모듈로 전환하고 새로운 모듈내의 포워드 하는 일을 수행
.


일반적인 그룹핑은 web.xml 안에서 설정해 놓은 xml 파일들을 아래와 같이 추가하여 사용한다.

  <!-- groupping module -->
 <init-param>  
  <param-name>config</param-name>  <!-- 이름은 아무거나 -->
  <param-value>
   /WEB-INF/struts-config.xml,
   /WEB-INF/struts-config-dispatch.xml,
   /WEB-INF/struts-config-mapping.xml,
   /WEB-INF/struts-config-lookup.xml  
  </param-value>  <!-- /WEB-INF/(기본베이스 - 다른폴더일때는 경로를 설정해주어야 함)폴더 안에 struts-config.xml파일 위치 지정  - 여기까지 작성후 struts-config.xml파일을 생성 -->
 </init-param>

그러나 SwitchAction을 사용하면 아래와 같이 모듈별로 설정을 할 수 있다.

<!-- switch Action module types -->
  <init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/config/struts-config.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/dispatchModule</param-name>
   <param-value>/WEB-INF/config/struts-dispatchModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/lookupModule</param-name>
   <param-value>/WEB-INF/config/struts-lookupModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/mappingModule</param-name>
   <param-value>/WEB-INF/config/struts-mappingModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/uploadModule</param-name>
   <param-value>/WEB-INF/config/struts-uploadModule.xml</param-value>
  </init-param>
  <init-param>
   <param-name>config/validatorModule</param-name>
   <param-value>/WEB-INF/config/struts-validatorModule.xml</param-value>
  </init-param>
   <init-param>
   <param-name>config/tilesModule</param-name>
   <param-value>/WEB-INF/config/struts-tilesModule.xml</param-value>
  </init-param>

web.xml 에 위와 같이 설정을 해주고 각각의 모듈별 xml을 만든다.

위에 보이는 경로대로

/WEB-INF/config/ 폴더 안에 각각의 모듈 xml 파일을 만든다. 여기서 중요한것은 

<init-param>
   <param-name>config</param-name>
   <param-value>/WEB-INF/config/struts-config.xml</param-value>
  </init-param>

config 가 기본적으로 있어야한다.


그림에서 같이 WEB-INF에(SwitchAction을 사용하지 않은 경우) 있는 xml 파일들이 config 폴더에 모듈별로 들어가 있는 것을 볼 수 있다.

그리고 config 폴더 안에 있는 모든 xml 파일 안에는 아래와 같은 설정이 있어야 한다.

<!-- switchAction을 사용할때는 모든 config파일에 SwitchAction설정이 되어있어야 한다. -->
     <action path="/toModule"
                type="org.apache.struts.actions.SwitchAction"/>

- strus-dispatchModule.xml 파일을 보면.


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

    <!-- Form Bean Definitions -->
    <form-beans>
     <form-bean name="infoBean" type="com.myhome.info.beans.InfoFormBean"/>
    </form-beans>

 <!-- Global Exception Definitions -->
 <global-exceptions>
 </global-exceptions>
 
 <!-- Global Forward Definitions -->
 <global-forwards>
 </global-forwards>
 
    <!-- dispatch action mappings -->
 <action-mappings>
 
    <action path="/toModule"
               type="org.apache.struts.actions.SwitchAction"/>
      
    <action path="/index"
         type="org.apache.struts.actions.ForwardAction"
          parameter="/register.jsp"/>
        
    <action path="/dispatchModule"
            name="infoBean"
          scope="request"
          parameter="method"
          unknown="true"
          type="com.myhome.dispatch.InfoDispatchAction">
       <forward name="result"  path="/result.jsp"/>
       <forward name="list"    path="/list.jsp"/>
       <forward name="query"   path="/modify.jsp"/>
       <forward name="update"  path="/template.jsp"/>
       <forward name="delete"  path="/template.jsp"/>
    </action>       
    </action-mappings>
   
 <!-- Controller Processor Definition --> 
 <controller processorClass="com.myhome.info.processor.InfoRequestProcessor"/>

 <!-- Message Resources Definitions -->
 
 <!-- Plug Ins Configuration -->
 <!-- Tiles plugin -->
 <!-- Validator plugin -->
 
</struts-config>


모듈을 변경하는 방법은 URI가 아래와 같다면

http://localhost:8080/toModule.do?prefix=/moduleB&page=/index.do

prefix 가 어느 모듈을 사용하는지를 결정하고, page가 그 모듈에서 어떤 액션을 사용할지를 결정한다.

- jsp 페이지에서 prefix와 page로 파라미터를 전송한다.

<script type="text/javascript">
    function module(prefix, page){
          document.indexform.prefix.value=prefix;
          document.indexform.page.value=page;
          document.indexform.submit();
    }      
 </script> 

<form method="POST" name="indexform" action="toModule.do">
    <input type="hidden" name="prefix">
    <input type="hidden" name="page">  

이렇게 설정을 하고 사용할 모듈과 액션을 보내주면 그에 맞는 모듈이 실행된다.

'FrameWork > Struts1' 카테고리의 다른 글

struts1 커스터마이징하여 사용하기.  (0) 2009.11.11
Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 3  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05



 LookupDispatchAction은 getKeyMethodMap() 메서드를 구현하고 리소스 번들의 키와 메소드명을 매핑한다.
파라미터로 메소드 이름을 전달하면 그와 같은 메소드 명을 찾아서 실행하는 것이다.
 HTML 폼에서 동일한 이름을 가진 여러 개의 버튼을 사용하는 경우에 유용하다. 이 버튼의 이름은 해당하는 ActionMapping의 매개 변수 속성에 의해 지정된다.

작업 순서

1) mapping 할 메시지번들을 생성한다.
2) LookupDispatchAction을 상속받는 Class를 만들고 getKeyMethodMap() 메소들를 Override한다.
3) struts-config-lookup.xml 파일을 작성한다.
4) web.xml 파일에 struts-config-lookup.xml 파일 설정을 추가한다.

1. mapping 할 메시지 번들 파일(.properties)를 만든다.

메모장에 아래와 같이 추가하고 InfoMessageResource.properties 파일로 저장한다.
#은 주석을 의미한다.

# struts1 lookup message bundle
# file name : InfoMessageResource.properties

lookup.register = 등록
lookup.list = 리스트
lookup.query = 쿼리
lookup.update = 갱신
lookup.delete = 삭제

# 국제회(Locale) 표준코드 (Unicode)로 변환
# native2ascii [-encoding 코드값] 원시파일 대상파일
# 코드값 : euc-kr, ksc5601, ms949, utf-16

# native2ascii -encoding euc-kr InfoMessageResource.properties InfoMessageResource_ko.properties

이 파일을 이클립스 안으로 복사해서 붙여 넣는다.(이클리스 안에서 properties 파일을 오류를 발생하기 때문이 이렇게 한다.)

그리고 이 파일을 이클립스에서 열을 경우 한글이 깨져서 나오는것을 알 수 있다. 이 문제를 해결하기 위해서 인코딩 타입을 euc-kr로 파일을 native2ascii 변환하는 작업을 해주어야 한다.

변화작업은 다음 글을 참조한다.
http://thinkingblog.tistory.com/14

InfoMessageResource.properties 파일이 있는 위치로 이동한다음에 그대로 작업을 진행하면 된다.

변환 작업을 통해 InfoMessageResource_ko.properties 파일을 생성해 낸다.

변환된 내용

# struts1 lookup message bundle
# file name : InfoMessageResource.properties

lookup.register = \ub4f1\ub85d
lookup.list = \ub9ac\uc2a4\ud2b8
lookup.query = \ucffc\ub9ac
lookup.update = \uac31\uc2e0
lookup.delete = \uc0ad\uc81c

# \uad6d\uc81c\ud68c(Locale) \ud45c\uc900\ucf54\ub4dc (Unicode)\ub85c \ubcc0\ud658
# native2ascii [-encoding \ucf54\ub4dc\uac12] \uc6d0\uc2dc\ud30c\uc77c \ub300\uc0c1\ud30c\uc77c
# \ucf54\ub4dc\uac12 : euc-kr, ksc5601, ms949, utf-16

# native2ascii -encoding euc-kr InfoMessageResource.properties InfoMessageResource_ko.properties

2. InfoLookupDispatchAction.java 파일 작성.

package com.myhome.lookup;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.LookupDispatchAction;

import com.myhome.info.beans.InfoFormBean;
import com.myhome.info.dao.InfoDAO;
import com.myhome.info.dto.InfoDTO;

public class InfoLookupDispatchAction  extends LookupDispatchAction {
 
 
@Override
 protected Map<String,String> getKeyMethodMap() {
  
  Map<String,String> map = new HashMap<String, String>();
  map.put("lookup.register", "register");  
//메시지번들에 있는 키와 같아야 한다. 뒤에는 메소드 명이다.
  map.put("lookup.list", "list");
  map.put("lookup.query", "query");
  map.put("lookup.update", "update");
  map.put("lookup.delete", "delete");
  return map;
 }

 public ActionForward register(ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response)
     throws Exception{

 /*form parameter를 bean으로 받는다*/
  InfoFormBean bean = new InfoFormBean();
  bean.setName(request.getParameter("name"));
  bean.setSex(request.getParameter("sex"));
  bean.setTel(request.getParameter("tel"));
  
  /*bean property 를 dto로 복사한다.*/
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  dto.setWdate(this.getWdate());
  
  /*info table에 연동한다.*/
  
  new InfoDAO().register(dto);
  
  /*result.jsp로 포워드하기 위해 리퀘스트 영역에 dto를 binding한다
  * */
  request.setAttribute("dto", dto);
  
  return mapping.findForward("result");
 }
 
 public ActionForward list(ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response)
     throws Exception{
  
  List<InfoDTO> list = null;
  
  list = new InfoDAO().getAllQuery();
  
  request.setAttribute("list", list);
  
  return mapping.findForward("list");
 }
 
 public ActionForward query(ActionMapping mapping,
     ActionForm form,
     HttpServletRequest request,
     HttpServletResponse response)
     throws Exception{
  InfoFormBean bean = (InfoFormBean)form;
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  
  //쿼리된 object를 리퀘스트 영역에 바인딩 한다.
  
  request.setAttribute("dto", new InfoDAO().getQuery(dto));
  
  return mapping.findForward("query");
 }
 
 public ActionForward update(ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception{
  /*form parameter를 InfoFormBean으로 받는다*/
  
  /**
  *  ActionForm의 역할
  *   Form parameter의 정보를 참조하기 위해
  *   ActionForm의 객체를 초기화 한다 - reset()
  * 
  *   form parameter의 정보를 받아 유효성 검사를 실시한다 - validate()
  * 
  *   참조한 폼 정보를 form-bean에 설정도니 bean으로 전달한다.
  * */

 
  InfoFormBean bean = (InfoFormBean)form;
  
  /*bean의 객체를 Entity(DTO)로 property를 복사한다.*/
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  
  new InfoDAO().update(dto);
  
  
  return mapping.findForward("update");
 }
 
 public ActionForward delete(ActionMapping mapping,
      ActionForm form,
      HttpServletRequest request,
      HttpServletResponse response)
      throws Exception{
 
  InfoFormBean bean = (InfoFormBean)form;
  
  /*bean의 객체를 Entity(DTO)로 property를 복사한다.*/
  InfoDTO dto = new InfoDTO();
  BeanUtils.copyProperties(dto, bean);
  new InfoDAO().delete(dto);
  return mapping.findForward("delete");
 }
 protected String getWdate(){
  return new java.text.SimpleDateFormat("yyyy-MM-dd").format(new java.util.Date());
 }

}

3. struts-config-lookup.xml 파일 작성

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC
          "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
          "
http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>
 <action-mappings>
  <action path = "/lookupIndex"
    type = "org.apache.struts.actions.ForwardAction"
    parameter="/lookup/register.jsp"/>
  
  <!--
   unknown은 input속성을 대체하기 위한 속성이다.
   입력폼이 여러개 발생할 때 사용된다.
   template.jsp는 list.do로 보내면 어디로 가야 할지 모르기때문에
  -->

  
  <action path = "/lookup"
    name = "bean"
    scope = "request"
    unknown = "true"
    parameter = "method"
    type = "com.myhome.lookup.InfoLookupDispatchAction">
<!-- method 라는 value를 받아서 type에 선언된 클래스로 이동하고 getKeyMethodMap() 메소드를 통해서 InfoMessageResource.properites 파일안에 맵핑 되는 메소드를 실행하게 된다.-->
   
   <forward name="result" path = "/lookup/result.jsp"/>
   <forward name="list" path = "/lookup/list.jsp"/>
   <forward name="query" path = "/lookup/modify.jsp"/>
   <forward name="update" path = "/lookup/template.jsp"/>
   <forward name="delete" path = "/lookup/template.jsp"/>
  
  </action>
 </action-mappings>
 
 
<!-- Message Resources Definitions -->
 <!-- .property 파일을 설정 -->
 
<message-resources parameter="com.myhome.lookup.InfoMessageResource" />
 
</struts-config>

4. web.xml 에 struts-config-lookup.xml 파일을 추가한다.

<init-param>
 <param-name>config</param-name> 
 <param-value>
 
  /WEB-INF/struts-config-lookup.xml 
</param-value>   /WEB-INF/(기본베이스 - 다른폴더일때는 경로를 설정해주어야 함)폴더 안에 struts-config.xml파일 위치 지정  - 여기까지 작성후 struts-config.xml파일을 생성-->
</init-param>

5. jsp 파일에서 값을 넘겨 줄때

 <form method="POST" name="listform" action="lookup.do">
     <input type="hidden" name="method" value="쿼리">

lookup.query = 쿼리

InfoMessageResource_ko.properties  파일에서 한글로 설정 쿼리 부분과 일치하고, 그 일치한 메소드를 실행한다.

자세한 내용은 파일을 참조 한다.





'FrameWork > Struts1' 카테고리의 다른 글

struts1 커스터마이징하여 사용하기.  (0) 2009.11.11
Struts1 FileDownload  (0) 2009.08.18
Struts1 fileUpload  (0) 2009.08.18
Struts1의 Action 4  (0) 2009.08.16
Struts1의 Action 2  (0) 2009.08.12
Struts1의 Action 1  (0) 2009.07.27
Struts1에서 ActionForm 사용하기.  (0) 2009.07.25
Struts1 에서 iBatis 사용하기  (0) 2009.07.05
Struts 1 을 사용하여 간단한 회원가입, 리스트 불러오기.  (0) 2009.07.05
Struts1 개발환경 설정.  (0) 2009.07.05
■ Static Parameters Interceptor


클라이언트가 보내는 파라미터를 무시하고 미리 설정해 놓은 파라미터로 값을 넣는다.

struts.xml
에 정의된 파라미터 값들을 액션에저장한다. <action> 태그 의 직속 자식으로<param> 태그가 있다.


- xml 파일에 아래와 같이 태그를 추가한다.

 <param name="name">홍길동</param>
          <interceptor-ref name="staticParams"/>

- action class 에서

param 네임으로 getter, setter를 생성한다.

■ 
Timer Interceptor


인터셉터와
처리를 포함하여 액션의 작업 처리 시간을 출력한다.


- xml 파일 안에 아래와 같이 추가

 <interceptor-ref name="timer"/>  <!-- 작업시간에 대한 결과를 출력한다. -->

이렇게 추가해 주고 실행하면 작업 시간이 콘솔 창이 나타난다.

Tomcat 6.0 설치

http://tomcat.apache.org/download-60.cgi 

사이트에서 Core : zip 버전을 다운로드하고 원하는 위치에 압축을 푼다.

1. 환경변수 설정에서 JAVA_HOME 셋팅 되어 있는지 확인한다. 거의 모든 WAS가 JAVA_HOME 경로를 참조하기 때문이다.

2. 오라클이 설치된 경우에는 8080포트는 사용할 수 없다.
- XE버전일 때는 톰캣의 포트를 수정하는 편이 편한다.

3.  아파치-톰캣 conf경로 안에 있는 server.xml 파일을 수정한다. 

C:\apache-tomcat-6.0.20\conf - server.xml

67번째 줄에 있는.

//8080을 -> 다른 포트 번호로 수정한다.

<Connector port="8081" protocol="HTTP/1.1"
 
               connectionTimeout="20000"
               redirectPort="8443" />

4. 콘솔 창으로 접속 한 다음에 C:\apache-tomcat-6.0.20\bin 폴더에서 startup 실행을 한다.



만약 다음과 같이 오류가 발생한다면.

CATALINA_HOME environment variable... 메시지가 떴다면 환경변수를 수정해야 된다.

현재 톰캣의 경로 : C:\apache-tomcat-6.0.20 환경 변수에 셋팅한다.

CATALINA_HOME 추가

환경변수 추가 방법은 http://thinkingblog.tistory.com/42 글을 참조 한다.


환경변수 수정하고 나면 명령프롬프트를 새로 시작하고 다시 

콘솔 창으로 C:\apache-tomcat-6.0.20\bin 폴더에서 접근한 다음에 startup 실행을 한다.

새로운 창이 뜨면서 실행이 성공한다.



http://127.0.0.1:8081 으로 접속해서 창이 뜨는지 확인한다.



창이 제대로 뜬다면 설정 성공!

종료는 shutdown 을 콘솔 창에서 입력한다.

+ Recent posts