7.2 Struts 사용하기

작성자 : 진은영 ( 2004-08-05)

[메인] [목록]

목차

7.2.1 Struts 커스텀 태그

스트러츠 프레임워크는 뷰를 쉽게 생성하도록 돕기 위하여 많은 커스텀 태그를 제공한다. 이 커스텀 태그들을 전 강좌에서 strutsTest\WEB-INF\tld 폴더에 복사했다. 이 태그들을 사용하기 위하여 web.xml에서 다음과 같이 설정한다. 스트러츠에서 제공한 모든 tld파일에 대하여 다음과 같이 설정하면 된다.
<?xml version="1.0" encoding="euc-kr"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

    <taglib>
        <taglib-uri>struts/bean</taglib-uri>
        <taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>struts/html</taglib-uri>
        <taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>struts/logic</taglib-uri>
        <taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>struts/nested</taglib-uri>
        <taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>struts/template</taglib-uri>
        <taglib-location>/WEB-INF/tld/struts-template.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>struts/tiles</taglib-uri>
        <taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>
    </taglib>
</web-app>

커스텀 태그를 사용해본 개발자들이라면 web.xml에 커스텀 태그의 사용을 위한 tld파일을 설정하는 부분에 대하여 쉽게 이해할 수 있을 것이다. web.xml에서 위와 같이 설정한 다음 JSP에서 다음과 같이 사용할 커스텀 태그를 지정하는 것이 가능하게 된다.
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>

커스텀 태그를 사용하는 방법은 나중에 다시 다루겠다.


7.2.2 스트럿츠 흐름

클라이언트로부터 값을 입력받아 해당 아이디와 패스워드가 맞다면, 원하는 페이지로 이동하는 스트러츠 구조는 아래와 같다.


좀더 구체적인 내용을 살펴보자.
  • 웹애플리케이션이 시작할 때 ActionServlet의 init()가 호출되고 web.xml에 선언되어 있는대로 struts-config.xml를 로드한다. struts-config.xml은 Struts프레임워크에서 사용하는 모든 설정 정보를 담고 있는 파일이라고 생각하면 된다. config 이름은 꼭 struts-config.xml이 아닌 다른 이름을 가지는 XML파일이어도 상관없다.
    ActionServlet클래스는 struts에서 제공하고 있다.

  • 클라이언트가 id와 pw를 입력한 후 submit를 누르면 action=login.do 로 이동한다.
    web.xml에 *.do 는 전부 org.apache.struts.action.ActionServlet로 이동하게끔 mapping 시켜놨다.

  • 클라이언트가 입력한 id와 pw는 ActionForm 클래스를 상속받는 클래스의 객체에 자동으로 저장된다.
    이러한 형식은 struts-config.xml <form-beans> 태그에 지정한다.

  • 클라이언트의 입력값을 저장한 객체를 가지고 어떤 동작을 취할것인가를 지정한 부분은 struts-config.xml의 <action-mappings>태그이다. 이 태그에서 지정한 클래스로 객체를 전달한다. 해당 클래스는 Action클래스를 상속한 클래스로 DB에 직접 연결하는 클래스를 호출하는 부분이 들어 있다.

  • 처리한 후 <action> 태그에서 지정한 문서로 mapping한다. 전달하는 클래스의 타입은 ActionForward이다.

7.2.3 예제

위에서 사용했던 예제를 가지고 직접 실행해보자.

① web.xml
호출하려는 서블릿의 별칭과 매칭에 대한 정보, struts-config.xml을 메모리에 로드하려는 정보가 들어있다.
<?xml version="1.0" encoding="euc-kr"?>

<!DOCTYPE web-app
    PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
    "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
	<servlet>
	<servlet-name>action</servlet-name>
	<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
	<init-param>
	    <param-name>config</param-name>
	    <param-value>/WEB-INF/tld/struts-config.xml</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
	</servlet>
	<servlet-mapping>
	    <servlet-name>action</servlet-name>
	    <url-pattern>*.do</url-pattern>
	</servlet-mapping>

	<taglib>
		<taglib-uri>struts/bean</taglib-uri>
		<taglib-location>/WEB-INF/tld/struts-bean.tld</taglib-location>
	</taglib>
	<taglib>
		<taglib-uri>struts/html</taglib-uri>
		<taglib-location>/WEB-INF/tld/struts-html.tld</taglib-location>
	</taglib>
	<taglib>
		<taglib-uri>struts/logic</taglib-uri>
		<taglib-location>/WEB-INF/tld/struts-logic.tld</taglib-location>
	</taglib>
	<taglib>
		<taglib-uri>struts/nested</taglib-uri>
		<taglib-location>/WEB-INF/tld/struts-nested.tld</taglib-location>
	</taglib>
	<taglib>
		<taglib-uri>struts/template</taglib-uri>
		<taglib-location>/WEB-INF/tld/struts-template.tld</taglib-location>
	</taglib>
	<taglib>
		<taglib-uri>struts/tiles</taglib-uri>
		<taglib-location>/WEB-INF/tld/struts-tiles.tld</taglib-location>
	</taglib>
</web-app>


② struts-config.xml
클라이언트로부터 입력받은 정보를 저장하는 내용과 처리해야 하는 내용을 담고 있는 파일이다.
<?xml version="1.0" encoding="euc-kr"?>

<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_1.dtd">

<struts-config>
        <form-beans>
                <form-bean name="loginForm" type="kr.co.a.LoginForm" />
        </form-beans>

        <action-mappings>
                <action name="loginForm" path="/login" type="kr.co.a.LoginAction" input="/login.jsp">
                        <forward name="main" path="/main.jsp" />
                </action>
        </action-mappings>

        <controller />
        <message-resources  parameter=""/>
</struts-config>


③ LoginForm.java
클라이언트가 입력하는 정보를 저장하는 클래스이다.
package kr.co.a ; 

import javax.servlet.http.*;

import org.apache.struts.action.*;

public class LoginForm extends ActionForm{
        private String id ;
        private String password ;

        public LoginForm(){
                System.out.println( "LoginForm" ) ; 
        }

        public String getPassword() {
                return password;
        }

        public void setPassword(String password) {
                this.password = password;
        }

        public String getId() {
                return id;
        }

        public void setId(String id) {
                this.id = id;
        }

}


④ LoginAction.java
클라이언트로부터 입력한 값을 가지고 비교하여 해당 jsp문서로 매핑하는, 즉 직접 처리를 하는 문서이다.
package kr.co.a ; 

import javax.servlet.http.*;
import org.apache.struts.action.*;

public class LoginAction extends Action{
        public ActionForward execute ( ActionMapping mapping , ActionForm form , 
                HttpServletRequest request , HttpServletResponse response ) throws Exception {
        
                LoginForm loginForm = ( LoginForm ) form ; 
                String inputId = loginForm.getId().trim() ; 
                String inputPassword = loginForm.getPassword().trim() ; 

                return ( mapping.findForward( "main" )) ; 
        }
}


⑤ login.jsp
<%@page contentType="text/html;charset=euc-kr" %>
<FORM METHOD=POST ACTION="login.do">
아이디 : <INPUT TYPE="text" NAME="id"><br>
비밀번호 : <INPUT TYPE="password" NAME="password"><br>
<INPUT TYPE="submit">
</FORM>


⑥ main.jsp
<%@page contentType="text/html;charset=euc-kr" %>
main


⑦ build.xml
클래스패스를 따로 잡지 않아도 패키지 컴파일을 할 수 있다. (부록 강좌의 ant를 확인한다.)
<?xml version="1.0" encoding="euc-kr"?>
<project basedir="." default="compile">
        <property name="catalina.home" value="D:\01.program\01.java\02.ee\01.Tomcat 4.1" />
        <property name="dist.servlet.jar" value="${catalina.home}/common/lib/servlet.jar" />

        <path id="classpath">
                <fileset dir="${basedir}/lib" includes="*.jar" />
                <pathelement location="${dist.servlet.jar}" />
        </path>

        <target name="compile">
                <echo message="Compiling the java source files..." />
                <javac srcdir="${basedir}/src/Login" destdir="${basedir}/classes" debug="on" >
                        <classpath refid="classpath" />
                </javac>
        </target>
</project>


⑧ 컴파일 command창을 띄운 후 해당 컨텍스트의 WEB-INF까지 이동한다.

ant라고 명령을 쓰면 build.xml이 실행되면서 패키지 컴파일이 된다.

⑨ 실행
톰캣을 실행시킨후 브라우저를 띄우고 아래와 같은 주소를 입력한다.


아이디와 패스워드를 입력한 후 전송버튼을 누르면 아래와 같이 창이 나타나면 성공이다.

참고문헌