'개발자의 길'에 해당되는 글 195건

Struts 1 - ActionForm 사용하기 2009.06.26
iBatis - 기본 설정 2009.06.25
Struts 1 - 기본 2009.06.25
Spring - 초기 설정 2009.04.17
SiteMesh - 초기 설정 방법 & 설정 2009.04.17

Struts 1 - ActionForm 사용하기

Published on: 2009. 6. 26. 16:31 by louis.dev


1.ActionForm Class를 상속받아 FormBean Class를 만든다.
ex)InfoFormBean.java
package com.myhome.info.beans;

import org.apache.struts.action.ActionForm;

@SuppressWarnings("serial")
public class InfoFormBean extends ActionForm{
 
 private int num;
 private String name;
 private String sex;
 private String tel;

 //사용자 jsp페이지에서 파라미터로 넘어오는 파라미터 네임과 같아야 한다.
 public int getNum() {
  return num;
 }
 public void setNum(int num) {
  this.num = num;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getSex() {
  return sex;
 }
 public void setSex(String sex) {
  this.sex = sex;
 }
 public String getTel() {
  return tel;
 }
 public void setTel(String tel) {
  this.tel = tel;
 }
 
}

2.struts-config.xml 에서 form-bean을 설정한다.

1) 기본적인 ActionForm을 사용할때
<form-beans> 

        <form-bean
            name="bean"  
            type="com.myhome.info.beans.InfoFormBean"/>
</form-beans>

- name : 다른 config파일에서 사용할 이름을 사용자 편의 대로 정의 한다.
- type: 처음의 ActionForm Class를 상속받은 클래스의 패키지명과 클래스 이름을 설정한다.(InfoFormBean은 사용자 임의의 Class)

2) DynaActionForm 을 사용할때

- 사용자로 부터 파라미터로 넘어오는 값이 bean Class안에 정의 되어 있지 않거나 사용자로부터 어떠한 값이 넘어 올지 알 수 없을때 사용한다.
- ActionForm 처럼 ActionForm Bean Class를 만들 필요는 없고 xml 상에 선언만 해주면 된다.

<form-beans> 
        <!--
         DynaActionForm은 예측할 수 없는 파라미터를 참조할때 사용한다.
        -->
        <form-bean
         name="dyna"
         type = "org.apache.struts.action.DynaActionForm">
         <!--
          form bean에 존재하지 않는 파라미터를 참조하기 위해 property를 설정한다.
          -->
          <form-property name="num" type="java.lang.Integer"/>
          <form-property name="name" type="java.lang.String"/>
          <form-property name="sex" type="java.lang.String"/>
          <form-property name="tel" type="java.lang.String"/>
          <form-property name="wdate" type="java.lang.String"/>
        </form-bean>
         
    </form-beans>

- name : ActionForm 와 같은 용도
- type : struts에서 제공되는 클래스를 사용하는 것이기 때문에 직접 DynaActionForm을 설정해 준다.
- <form-property> : 저장될 이름을 선언해 준다.



3.struts-config.xml 파일의 <action-mapping>에 <action>태그와 함께 설정한다.

1) ActionForm을 상속한 bean을 사용할때
예)
<action path = "/update"
          name = "bean"
          scope = "request"
          input = "/info/modify.jsp"
          type = "com.myhome.info.actions.InfoUpdateAction">
     <forward name="success" path="/list.do" redirect="true"/>
</action>

- path : 주소창에 들어오는 URL 패턴, 이때 web.xml에 선언한 .do는 제거 하고 선언한다.
- name : 상단의 <form-beans>태그에 선언된 form-bean중 사용할 form-bean name을 적어 준다.
- scope : "request|session|application" - 다음의 영역으로 들어오는 정보
- input : 입력받은 폼 페이지 명 명시 - 정의된 곳에서 들어오는 데이터를 사용하겠다.
- type: Bussiness Logic을 수행할 Action Class 선언
- <forward> : Action class에서 actionForward로 'success' 를 보내면 path로 선언된 곳으로 보내겠다.
                    redirect = forward 부분에서 path만 잡아 주면 주소창은 변하지 않고 페이지만 변경 시킨다. 그래서 redirect를 true를 설정하면 주소 까지 바뀌어 버린다.

2)DynaActionForm 을 사용할 때
예)
<action path="/delete"
          name = "dyna"
          scope = "request"
          input= "/info.modify.jsp"
          type = "com.myhome.info.actions.InfoDeleteAction">
   <forward name = "success" path = "list.do" redirect="true" />
</action>

※참고 : ActionForm 을 사용할때 꼭 필요한 attribute 들은 name, scope, input 이다.

 4. Action에서 사용 방법

public ActionForward execute(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("success");
 }


만약 ActionForm을 상속한 form객체를 사용하면 위와 같은 방식으로 하되 config.xml파일에서 bean을 DynaActionForm으로 구현 했다면 물론 위의
코드중
InfoFormBean bean = (InfoFormBean) form;
이코드는
DynaActionForm bean = (DynaActionForm)form;

으로 타입 케스팅을 해주어야 캐스팅 에러가 나지 않는다.

iBatis - 기본 설정

Published on: 2009. 6. 25. 16:42 by louis.dev


1. iBatis Library를 추가한다.

2. SqlMapConfig.xml 파일을 생성한다.

<?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>
    <settings
  cacheModelsEnabled="true"
  enhancementEnabled="true"
  lazyLoadingEnabled="true"
  maxRequests="32"
  maxSessions="10"
  maxTransactions="5"
  useStatementNamespaces="false"
 />
 
<!-- JNDI사용 -->
   <transactionManager type="JDBC" >
 <dataSource type="JNDI">
   <property name="DataSource"
      value="java:comp/env/jdbc/XE"/>
 </dataSource>
   </transactionManager>
 <sqlMap resource="com/myhome/info/sql/SqlMap.xml" />
</sqlMapConfig>

/////////////////////////////////////////////////////////////////
위의 설정은 JNDI를 사용하기 때문에 JNDI설정을 해 주어야 한다.

1. Server 의 server.xml파일에 다음을 추가한다.
(33번째 줄 <GlobalNamingResources> 태그 안에 선언한다)

<Resource auth="Container"
        driverClassName="oracle.jdbc.driver.OracleDriver"
        factory="org.apache.commons.dbcp.BasicDataSourceFactory"
        maxActive="20"
        maxIdle="10" 
        maxWait="-1"
        name="jdbc/XE"
        username="user01"
        password="user01"
        type="javax.sql.DataSource"
        url="jdbc:oracle:thin:@localhost:1521:XE" />

2. Server 의 context.xml 파일의 가장 하단에 다음을 추가 한다.

<ResourceLink global="jdbc/XE"
                  name="jdbc/XE"
                  type="javax.sql.DataSource"/>


※JNDI말고 다른 방법으로 사용 할 수 있다. SqlMapConfig.xml 파일에 다음을 추가 한다.
1.simple datasource type  사용
<transactionManager type="JDBC" commitRequired="false">
        <dataSource type="SIMPLE">
            <property name="JDBC.Driver"
                      value="oracle.jdbc.driver.OracleDriver"/>
            <property name="JDBC.ConnectionURL"
                      value="jdbc:oracle:thin:@localhost:1521:XE"/>
            <property name="JDBC.Username" value="user01"/>
            <property name="JDBC.Password" value="user01"/>
        </dataSource>
    </transactionManager>

2.DBCP datasource type 사용
<properties resource=" info/model/dao/db.properties " />
     
   <transactionManager type="JDBC" >
  <dataSource type="SIMPLE">
  <property name="JDBC.Driver" value="${driver}"/>
  <property name="JDBC.ConnectionURL" value="${url}"/>
  <property name="JDBC.Username" value="${username}"/>
  <property name="JDBC.Password" value="${password}"/>
  <property name="JDBC.DefaultAutoCommit" value="true" />
  <property name="Pool.MaximumActiveConnections" value="10"/>
  <property name="Pool.MaximumIdleConnections" value="5"/>
  <property name="Pool.MaximumCheckoutTime" value="120000"/>
  <property name="Pool.TimeToWait" value="500"/>
  </dataSource>
  </transactionManager> 
////////////////////////////////////////////////////////////////

3.SqlMap.xml 파일을 생성 한다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
 "http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap>
  <typeAlias alias="Info" type="com.myhome.info.dto.InfoDTO"/><!-- alias : 별칭을 잡겠다는 의미 -->
 
  <insert id="infoInsert" parameterClass="Info"><!-- typeAlias한 Info를 넣는다 없으면 com.. 그대로 넣어도 된다. -->
   INSERT INTO INFO
    (NUM, NAME, SEX, TEL, WDATE)
   VALUES
    (NUMSEQ.NEXTVAL, #name#, #sex#, #tel#, #wdate#)<!-- ## Info 안에 가지는 프로퍼티 대소문자가 정확하게 맞아야 한다. -->
  </insert>
 
  <statement id="infoList" resultClass="Info">
   SELECT NUM, NAME, SEX, TEL, WDATE
   FROM INFO
  </statement>
 
</sqlMap>

4.SQLManager.java 파일 생성
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/info/sql/SqlMapConfig.xml"));
  }catch(java.io.IOException ie){
   ie.printStackTrace();
  }
 }
 
 public SqlMapClient getSqlMap(){
  return sc;
     }
}

5.DAO에서 다음과 같이 사용
package com.myhome.info.dao;

import com.myhome.info.dto.InfoDTO;
import com.myhome.manager.SQLManager;
import java.sql.SQLException;
import java.util.List;

public class InfoDAO extends SQLManager{
 /*등록부분*/
 public void register(InfoDTO dto) throws SQLException{
  this.getSqlMap().insert("infoInsert",dto);
 }
 
 /*회원 리스트 부분*/
 @SuppressWarnings("unchecked")
 public List<InfoDTO> getAllQuery(){
  List<InfoDTO> list = null;
  try {
   list = (List<InfoDTO>)this.getSqlMap().queryForList("infoList");
  } catch (SQLException e) {
   e.printStackTrace();
  }
  return list;
 }
}


☆SqlMapConfig.xml의 추가 사항

1.전체적인 내용
 
<?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>

    <settings/>

    <properties resource=" db.properties " />

    <transactionManager></transactionManager>

    <sqlMap></sqlMap>

</sqlMapConfig>

위에서 가장 중요한 것은 transactionManager 와 sqlMap부분이며 setting과 properties resource 는 선택 사항이다.

2. settings의 내용들
cacheModelsEnalbe ="true" : SqlMapClient를 위한 모든 캐쉬모델을 가능하게 하거나 가능하지 않게 한다.
이것은 디버깅시 도움이 된다.
enhancernetEnable="true" : 향상된 lazy로딩처럼 최적화된 자바빈즈 속성 접근을 위해 런타임시 바이트코드 향상을 가능하게 한다.
lazyLoadingEnabled="true" : SqlMapClient 를 위한 모든 lazy로딩ㅇ르 가능하게 하거나 가능하지 않게 한다.
maxRequests="32" : 한꺼번에 SQL을 실행할 스래드 수이고 2에n승으로 확장할 수 있고 128이 맥시멈이다.
maxSession="10" : 주어진 시간동안 활성화 될 수 있는 세션 수
maxTransaction="5" : 한꺼번에 SqlMapClient.startTransaction()에 들어갈 수 있는 스레드의 최대 갯수
useStatementNamespaces ="false"
 

3. db.properties 파일 설정
 


driver=oracle.jdbc.driver.OracleDriver


url=jdbc:oracle:thin:@localhost:1521:XE


username=user01

password=mypwd

Struts 1 - 기본

Published on: 2009. 6. 25. 16:10 by louis.dev



기본 흐름

Client는 주소창에 register.do를 입력을 하면 맨처음으로 web.xml을 로딩한다.

web.xml은

<servlet>
   <servlet-name>action</servlet-name> <!-- 아무이름이나 하면 된다. -->
   <servlet-class>  <!-- 클래스 지정 -->
    org.apache.struts.action.ActionServlet
   </servlet-class>
 
 <init-param> <!-- struct-config.xml 설정 -->
  <param-name>config</param-name> <!-- 이름은 아무거나 -->
  <param-value>/WEB-INF/struts-config.xml</param-value>  <!-- /WEB-INF/(기본베이스 - 다른폴더일때는 경로를 설정해주어야 함)폴더 안에 struts-config.xml파일 위치 지정  - 여기까지 작성후 struts-config.xml파일을 생성-->
 </init-param>
  </servlet>
 
  <servlet-mapping> <!-- url 패턴 설정 -->
   <servlet-name>action</servlet-name> <!-- *.do로 들어오면 servlet-name이 action 실행 -->
   <url-pattern>*.do</url-pattern>
  </servlet-mapping>

다음과 같은 코드로 되어있다.
servlet mapping을 통해서 *.do로 들어오는 모든것들을  ActionServlet을 로드하고 struts-config.xml을 로딩하게 된다.

struts-config.xml은 로딩을 통해서 action 태그에 있는 내용을 로드하게 된다.

ActionServlet은 Servlet에서 init() 메소드의 역할을 하고 RequestProcess 는 service()메소드의 역할을 하게 된다.

RequestProcess에서 RequestProcessor class를 상속받아 다양한 method를 override해서 구현 할 수 있는데

위에 말한 Servlet의 Service() 메소드 역할을 하는것들이 RequestProcessor class의 process*()메소드 이다.

RequestProcessor class에서 process메소드 들을 상속하지 않으면 기본적인 메소드가 실행 된다.

ActionServlet에서 입력된 데이터들은 RequestProcess로 넘어가기 전에 RequestProcessor class 의 processPreprocess()를 오버라이드 함으로서 한글 인코딩 설정을 할 수 있다.

그리고 RequestProcessor class를 선언하고 사용할 때는 반드시 struts-config.xml 파일에서 다음과 같이 선언 해 주어야 한다.

<controller processorClass="com.myhome.info.processor.InfoRequestProcessor" />    //다읨의 경로는 패키지 경로와 클래스 파일 이름이다.

RequestProcess로 넘어온 데이터는 ActionForm에 저장되어 Action class를 상속받은 RegistAction class의 execute() 메소드에서 사용 할 수 있다.

RegistAction class 의 비지니스 로직을 통해 로직을 수행한 후 ActionForward를 통해 ViewPage로 이동을 돕는다. 이 결과값이 다시 RequestProcess로 돌아와 Client에서 뿌려지게 된다.

Spring - 초기 설정

Published on: 2009. 4. 17. 11:40 by louis.dev

1.web.xml 설정


    -context-param 설정
    -listener 설정
    -servlet&servlet-mapping 설정(Spring MVC 쓸때 설정)
2.context-param 에서 지정한 xml 파일 생성(여기서는 /WEB-INF/config/applicationContext.xml)

    <applicationContext.xml>
        -bean 초기화

3.    <spring MVC를 사용할때>
<servlet>
        <servlet-name>action</servlet-name>        <!-- action이란 servlet은 DispatcherServlet.class를 실행 시킴 -->
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>        <!-- 초기(init) action이 불러 들여 올때 config/action-servlet.xml이 불러들여짐 -->
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/action-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
   
    <servlet-mapping>    <!-- url로 *.do로 들어오면 action servlet(위에것) 실행 -->
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    여기서 맵핑한 /WEB-INF/config/action-servlet.xml 설정

4.action-servlet.xml  에서

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <!--InernalResourceViewResolver viewResolver=new InernalResourceViewResolver()  -->
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
        <property name="prefix" value="/WEB-INF/jsp/spring/" /> <!-- 주소 창 앞에 들어갈 내용 -->
        <property name="suffix" value=".jsp" />                    <!-- 파일명 뒤에 들어갈 확장자 -->
    </bean>

   
    <!-- url 맵핑시킴(ex./index.do로 접근하면 indexController 로 사용 -->
<bean id="boardUrlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">        <!-- setMappings()랑 똑같은것 -->
        <props>
            <prop key="/index.do">indexController</prop>   
            <prop key="/board.do">boardMultiActionController</prop>
            <prop key="/board_edit.do">boardSimpleFormController</prop>
            <prop key="/board/delete.do">boardDeleteController</prop>
            <prop key="/board/write_form.do">boardWriteFormController</prop>
            <prop key="/board/write.do">boardWriteController</prop>
            <prop key="/board/edit_form.do">boardEditFormController</prop>
            <prop key="/board/edit.do">boardEditController</prop>
           
        </props>
    </property>
</bean>

두군대 설정

-맵핑을 시키는 것이 너무 많아 지면 힘들어 짐으로 Spring web flow 라는 새로운 것을 사용하여 쓸수 있다.


SiteMesh - 초기 설정 방법 & 설정

Published on: 2009. 4. 17. 09:41 by louis.dev
sitemesh.war


0. Library
commons-collections.jar
sitemesh-2.4.1.jar 추가

1. web.xml 설정


<context-param>                                     <!-- SiteMesh 설정 파일인 sitemesh.xml파일의 경로를 지정한다. -->
        <param-name>sitemesh.configfile</param-name>
        <param-value>/WEB-INF/config/sitemesh.xml</param-value>
    </context-param>
   
<filter>                                                    <!-- SiteMesh의 필터를 설정한다.  -->
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
</filter>
   
 
<filter-mapping>                                         <!-- url 패턴이 .jsp로 들어오면 위의 sitemesh 필터를 실행한다.  -->
        <filter-name>sitemesh</filter-name>
        <url-pattern>*.jsp</url-pattern>
        <dispatcher>REQUEST</dispatcher>     <!-- jsp에 대한 요청이 REQUEST,FORWARD 일때 sitemesh 필터를 실행한다. -->
        <dispatcher>FORWARD</dispatcher>
</filter-mapping>

2. sitemesh.xml 설정

<sitemesh>
     <!-- decorators.xml 의 위치를 지정 -->
    <property name="decorators-file" value="/WEB-INF/config/decorators.xml"/>
   
    <!-- 아래는 붙여 넣기 하기 -->
    <excludes file="${decorators-file}"/>

    <page-parsers>
        <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    </page-parsers>

    <decorator-mappers>

        <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
            <param name="property.1" value="meta.decorator" />
            <param name="property.2" value="decorator" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper">
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.AgentDecoratorMapper">
            <param name="match.MSIE" value="ie" />
            <param name="match.Mozilla [" value="ns" />
            <param name="match.Opera" value="opera" />
            <param name="match.Lynx" value="lynx" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
            <param name="decorator" value="printable" />
            <param name="parameter.name" value="printable" />
            <param name="parameter.value" value="true" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.RobotDecoratorMapper">
            <param name="decorator" value="robot" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
            <param name="decorator.parameter" value="decorator" />
            <param name="parameter.name" value="confirm" />
            <param name="parameter.value" value="true" />
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper">
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}" />
        </mapper>

    </decorator-mappers>

</sitemesh>

3. decorators.xml 설정
<?xml version="1.0" encoding="UTF-8"?>

<decorators defaultdir="/decorators">                 <!-- WebContent 폴더 아래 decorators라는 폴더를 default directory로 한다.  -->
    <decorator name="main" page="main.jsp">      
        <pattern>/index.jsp</pattern>                     <!-- index.jsp로 url 패턴이 들어오면 main.jsp를 실행한다  -->
    </decorator>
   
    <decorator name="panel" page="panel.jsp"/>
</decorators>


4. main.jsp 에각 모듈 붙여 넣기

<?xml version="1.0" encoding="EUC-KR" ?>
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %> <!-- 태그 라이브러리 설정 -->
<%@ taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %>              <!-- 태그 라이브러리 설정 -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR" />
<title>Insert title here</title>
</head>
<body>
<table>
   
    <tr>
        <td><page:applyDecorator name="panel" page="/include/top.jsp"/></td>   <!--  decorators 에서 panel 이라고 이름 붙여진 곳
                                                                                                                  의 경로에 있는 페이지로 이동하여 설정을 가지고 오고
                                                                                                                  page에 정의된 top.jsp로 이동하여 panel에 선언된 설정
                                                                                                                  부분을 긁어와 가져 온다. -->
    </tr>
   
    <tr>
        <td><decorator:body/></td>                                                                   <!--  index.jsp로 main.jsp에 접근 하였음 으로
                                                                                                                          index.jsp의 body내용을 가져온다.
                                                                                                                          decorator:title 하면 title의 설정을 가져 온다 -->
    </tr>
   
    <tr>
        <td><page:applyDecorator name="panel" page="/include/bottom.jsp"/></td>
    </tr>
   
</table>
</body>
</html>


5. panel.jsp 설정하기

<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<%@ taglib prefix="page" uri="http://www.opensymphony.com/sitemesh/page" %> 
<decorator:body/>

'Framework > Site Mesh' 카테고리의 다른 글

SiteMesh - SiteMesh란?  (0) 2009.04.17