Struts2, iBatis Framework



iBATIS 2.x와 스트럿츠_2 환경 설정(JAR 파일 포함).rar


iBATIS 2.x와 스트럿츠_2 환경 설정.txt


스트럿츠 2.hwp


아이바티스 프레임 워크.hwp



1. 프로젝트 생성 후에 아래 파일들을 WebContent>WEB-INF>lib 폴더에 복사할 것.


ojdbc14.jar

jstl.jar

standard.jar

ibatis-2.3.4.726.jar


log4j-1.2.15.jar // 콘솔창에서 작업진행상태를 info 로 찍어주는 jar


//이하 스트러츠 환경설정파일.

commons-beanutils-1.7.0.jar

commons-digester-2.0.jar

commons-fileupload-1.2.1.jar

commons-io-1.3.2.jar

commons-logging-1.0.4.jar

commons-logging-api-1.1.jar

freemarker-2.3.16.jar

ognl-3.0.jar

struts2-core-2.2.1.1.jar

struts2-dojo-plugin-2.2.1.1.jar

struts2-tiles-plugin-2.2.1.1.jar

tiles-api-2.0.6.jar

tiles-core-2.0.6.jar

tiles-jsp-2.0.6.jar

xwork-core-2.2.1.1.jar


javassist-3.7.ga.jar


2. 아래 파일을 Java Resources>src 폴더 하위에 복사할 것.

log4j.properties


3. 수업 자료의 Framework\struts 2\4. 프로그램 작성 방법\iBATIS 2.x와 스트럿츠_2\환경 설정 파일

안에 있는 src 폴더와 WebContent 폴더의 내용을 복사할 것.


4. 이클립스에서 프로젝트 새로고침.




-----------------------------------------------------------------------------------

스트러츠2에서 데이터 전송 테스트(ActionSupport 클래스 이용)


* 실행순서

- struts.properties에서 인코딩 및 url 확장자 설정을 해둠.

- 사용자가 브라우저에 send01.action 입력

- struts.xml 에서 환경설정에 의해 myStruts.xml 를 실행

- myStruts.xml에서 주소창에 입력된 send01.action과 매칭되는 action 엘리먼트를 찾은다음

- result 엘리먼트의 목적 주소인 send01.jsp로 이동함.

- send01.jsp에서 회원가입버튼을 눌렀을때 폼의 action 속성의 목적 주소로 이동

- myStruts.xml에서 주소창에 입력된 send01.jsp의 폼 액션 주소인 receive01.action과 매칭되는 action 엘리먼트를 찾은다음

- class 속성의 액션처리용 java 파일(ActionSupport 상속) 내 오버라이딩한 execute() 를 실행한 후 리턴값이 SUCCESS 일 경우

- result 엘리먼트의 목적 주소인 receive01.jsp로 이동함.

- receive01.jsp 실행(EL표현 사용)


struts.properties -> 사용자 주소 입력 -> struts.xml -> myStruts.xml -> send01.jsp -> myStruts.xml -> TestAction.java -> receive01.jsp




//send01.jsp -> 입력 페이지 역할. 입력된 데이터를 서버로 전송.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트1</h2>

<!-- <form> 에서 action 속성과 method 속성 필수 -->

<form action="receive01.action" method="post">

<!-- JSP에서는 식별자를 name 속성으로 구분 -->

이름 <input type="text" name="name">

전화 <input type="text" name="tel">

<!-- submit 버튼을 클릭하면 데이터 전송됨 -->

<input type="submit" value="회원가입">

</form>

</div>

</body>

</html>



//receive01.jsp -> 처리, 출력 페이지 역할. 클라이언트가 전송한 데이터 수신 및 처리. 결과 메세지를 클라이언트에게 전송.

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트1</h2>

<h3>

<!-- 데이터 전송시 사용했던 식별자와 EL 표현의 식별자는 동일해야 한다. -->

name:${name}, tel:${tel}

</h3>

</div>

</body>

</html>



//TestAction.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;


//스트러츠2에서 사용하는 데이터 전송 전용 객체

public class TestAction extends ActionSupport{


private static final long serialVersionUID = 1L;


//멤버변수 선언

private String name, tel;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}


//execute() 메소드 오버라이딩 할 것.

@Override

public String execute() throws Exception {


//액션 처리 과정 필요. 

//약속된 상수 리턴 필수

//메소드 실행 결과를 스트러츠2에게 알려주는 값

return SUCCESS; //  = "success"

}

}



//struts.xml

<?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>

<!-- Configuration for the default package. -->

<package name="default" extends="struts-default" namespace="">

<global-results>

<result name="error">/exception/error.jsp</result>

</global-results>

</package>

<!-- 스트러츠2 환경 설정 파일 등록 -->

<include file="myStruts.xml"></include>


</struts>




//MyStruts.xml

<?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 속성은 유일하게 작성할 것 -->

<!-- package 엘리먼트에서 namespace 속성은 빈칸으로 처리 -->

<package name="temp01" extends="struts-default" namespace="" >


<!-- 서블릿 주소 분석 과정을 추가할 것 -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 되며, 확장자는 .action으로 설정되어 있다. -->

<action name="send01">

<!-- result 엘리먼트는 JSP 페이지 연결시 사용 -->

<result>/send01.jsp</result>

</action>

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스 지정할 때 사용 -->

<action name="receive01" class="com.test.TestAction">

<result>/receive01.jsp</result>

</action>


</package>

</struts>




//struts.properties

struts.i18n.encoding=EUC-KR

struts.action.extension=action

struts.multipart.saveDir=c:\\temp

struts.configuration.files=struts-default.xml,struts.xml.


-----------------------------------------------

스트러츠2에서 데이터 전송 테스트2(도메인 오브젝트 클래스 이용)


//send02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<script type="text/javascript">

function myFunc(obj) {

//데이터 검사

//이름, 전화번호가 비어있는지 검사하는 과정 추가

//이름, 전화번호가 채워진 경우만 데이터 전송

obj.form.submit();

}

</script>


</head>

<body>

<div>

<h2>데이터 송수신 테스트2</h2>

<!-- <form> 태그에서 action, method 속성 필수 -->

<form action="receive02.action" method="post">

<!-- 식별자 name 속성에서 dto.변수명 형태로 작성 -->

이름 <input type="text" name="dto.name"><br>

전화 <input type="text" name="dto.tel"><br>

<!-- submit 버튼을 클릭하면 데이터 전송됨 -->

<!-- <input type="submit" value="회원가입"><br> -->

<!-- 자바스크립트 연동시 submit 대신 button 으로 처리 -->

<input type="button" value="회원가입"

onclick="myFunc(this)"><br>

<span id="msg" style="color:red; display:none;">이름, 전화번호를 채워야 합니다.</span>

</form>

</div>

</body>

</html>





//receive02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트2</h2>

<!-- 데이터 전송시 사용했던 식별자와 EL 표현의 식별자는 동일해야 한다. --> 

<h3>name:${dto.name}, tel:${dto.tel}</h3>

</div>

</body>

</html>





//UserDTO.java

package com.test;


//스트러츠2에서 사용하는 데이터 저장소 객체

public class UserDTO {

//사용자가 사용하는 식별자와 멤버변수는 동일한 명칭 사용할 것.

private String name, tel;


public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public String getTel() {

return tel;

}


public void setTel(String tel) {

this.tel = tel;

}


}






//TestAction02.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;


//스트러츠2에서 사용하는 데이터 전송 전용 객체

//UserDTO 객체가 별도로 작성된 경우

public class TestAction02 extends ActionSupport {

private static final long serialVersionUID = 1L;

//스트러츠2에서 사용하는 데이터 저장소 객체를 지정하는 부분 추가

//클라이언트가 전송한 데이터를 자동 수신하게 된다.

private UserDTO dto;

public UserDTO getDto() {

return dto;

}

public void setDto(UserDTO dto) {

this.dto = dto;

}


//execute() 메소드 오버라이딩 할 것.

@Override

public String execute() throws Exception {

//액션 처리 과정 필요

//약속된 상수 리턴 필수

//메소드 실행의 결과를 스트러츠2에게 알려주는 값

return SUCCESS;

}

}






//myStruts02.xml

<?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 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="temp02" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<action name="send02">

<!-- result 엘리먼트는 JSP 페이지 연결시 사용 -->

<result>/send02.jsp</result>

</action>

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<action name="receive02" class="com.test.TestAction02">

<result>/receive02.jsp</result>

</action>

</package>

</struts>





//struts.xml

<?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>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>

   

   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts02.xml"></include>


</struts>





//struts.properties

struts.i18n.encoding=EUC-KR

struts.action.extension=action

struts.multipart.saveDir=c:\\temp

struts.configuration.files=struts-default.xml,struts.xml




//요청주소

http://localhost:8090/Struts2Test/send02.action



-----------------------------------------------

스트러츠2에서 데이터 전송 테스트3(모델 드리븐 이용)



//send03.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<script type="text/javascript">

function myFunc(obj) {

//데이터 검사

//이름, 전화번호가 비어있는지 검사하는 과정 추가

//이름, 전화번호가 채워진 경우만 데이터 전송

obj.form.submit();

}

</script>


</head>

<body>

<div>

<h2>데이터 송수신 테스트3</h2>

<!-- <form> 태그에서 action 속성을 send나 receive가 아닌 통합 식별자로 작성 -->

<form action="sample03.action" method="post">

<!-- 모델 드리븐 방식 이용을 위한 값 지정 -->

<input type="hidden" name="mode" value="insert">

<!-- 식별자 name 속성에서 dto.변수명 형태로 작성 -->

이름 <input type="text" name="dto.name"><br>

전화 <input type="text" name="dto.tel"><br>

<!-- submit 버튼을 클릭하면 데이터 전송됨 -->

<!-- <input type="submit" value="회원가입"><br> -->

<!-- 자바스크립트 연동시 submit 대신 button 으로 처리 -->

<input type="button" value="회원가입"

onclick="myFunc(this)"><br>

<span id="msg" style="color:red; display:none;">이름, 전화번호를 채워야 합니다.</span>

</form>

</div>

</body>

</html>





//receive02.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>

</head>

<body>

<div>

<h2>데이터 송수신 테스트3</h2>

<!-- 데이터 전송시 사용했던 식별자와 EL 표현의 식별자는 동일해야 한다. --> 

<h3>name:${dto.name}, tel:${dto.tel}</h3>

</div>

</body>

</html>




//UserDTO03.java

package com.test;


//스트러츠2에서 사용하는 데이터 저장소 객체

public class UserDTO03 {

//사용자가 사용하는 식별자와 멤버변수는 동일한 명칭 사용할 것.

private String name, tel;

//모델 드리븐 방식에서 사용하는 전용 멤버변수 추가

private String mode;

public String getMode() {

return mode;

}

public void setMode(String mode) {

this.mode = mode;

}

public String getName() {

return name;

}


public void setName(String name) {

this.name = name;

}


public String getTel() {

return tel;

}


public void setTel(String tel) {

this.tel = tel;

}


}





//TestAction03.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;


public class TestAction03 extends ActionSupport

implements Preparable, ModelDriven<UserDTO03> {

private static final long serialVersionUID = 1L;

//스트러츠2에서 사용하는 데이터 저장소 객체를 지정하는 부분 추가

//클라이언트가 전송한 데이터를 자동 수신하게 된다.

private UserDTO03 dto;

public UserDTO03 getDto() {

return dto;

}

public void setDto(UserDTO03 dto) {

this.dto = dto;

}


@Override

public UserDTO03 getModel() {

return dto;

}


@Override

public void prepare() throws Exception {

dto = new UserDTO03();

}

//execute() 메소드 오버라이딩 대신

//사용자 정의 메소드 추가함.

public String sample03() {

if (dto == null

|| dto.getMode() == null

|| dto.getMode().equals("")) {

return INPUT;

}

//액션 코드 추가

return SUCCESS;

}


}





//myStruts03.xml

<?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 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="temp03" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<!-- action 엘리먼트에서 method 속성은

사용자 정의 메소드 호출하는 부분 -->

<action name="sample03" class="com.test.TestAction03"

method="sample03">

<!-- result 엘리먼트에서 name 속성은 

메소드 리턴값에 대한 결과 페이지를 결정하는 부분 -->

<result name="input">/send03.jsp</result>

<result name="success">/receive03.jsp</result>

</action>

</package>

</struts>





//struts.xml

<?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>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>

   

   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts02.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts03.xml"></include>


</struts>




//struts.properties

struts.i18n.encoding=EUC-KR

struts.action.extension=action

struts.multipart.saveDir=c:\\temp

struts.configuration.files=struts-default.xml,struts.xml



//요청주소

http://localhost:8090/Struts2Test/sample03.action


-----------------------------------------

이름과 전화번호를 저장하는 JDBC 프로그램 작성. 

오라클, Struts2, iBatis, JSP 이용.

데이터 입력과 출력을 동시 실행. 


실행 예)

이름 [홍길동        ]

전화번호 [010-123-1234   ]

[ 등록 ]


----------------------------

전체 회원수 : 2명

----------------------------

회원번호 이름   전화번호

----------------------------

1        홍길동 010-123-1234

2        김길동 010-222-3333

----------------------------



--------------------------------

//회원 테이블 생성. 회원번호, 이름, 전화번호. 시퀀스 객체 생성.

CREATE TABLE member (

mid NUMBER --PK

,name VARCHAR2(10)

,tel VARCHAR2(20)

);


ALTER TABLE member

ADD CONSTRAINT member_mid_pk PRIMARY KEY(mid);


CREATE SEQUENCE memberSeq;



//회원 테이블에 자료 입력. INSERT 쿼리.

//쿼리문의 끝에 ; 표시하지 말것.

//INSERT INTO member (mid, name, tel) VALUES (memberSeq.nextval, 'hong', '111-1111')


-----------------------------------------


//MemberDTO.java

package com.test;


public class MemberDTO {


private int mid;

private String name, tel;

public int getMid() {

return mid;

}

public void setMid(int mid) {

this.mid = mid;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getTel() {

return tel;

}

public void setTel(String tel) {

this.tel = tel;

}

}






//MemberAction.java

package com.test;


import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;


import com.util.dao.*;


import java.sql.SQLException;

import java.util.*;


import javax.servlet.http.HttpServletRequest;


import org.apache.struts2.ServletActionContext;


public class MemberAction extends ActionSupport

implements Preparable, ModelDriven<MemberDTO> {

private static final long serialVersionUID = 1L;


private MemberDTO dto;


@Override

public MemberDTO getModel() {

return dto;

}


@Override

public void prepare() throws Exception {

dto = new MemberDTO();

}

public String member() {

//액션 코드 추가

CommonDAO dao = CommonDAOImpl.getInstance();

//INSERT 쿼리 실행 액션 수행

if (dto.getName() != null

&& !dto.getName().equals("")) {

try {

dao.insertData("mySql.add", dto);

} catch (SQLException e) {

System.out.println(e.toString());

}

}

List<Object> arrayList = dao.getListData("mySql.lists");

HttpServletRequest req = ServletActionContext.getRequest();

req.setAttribute("arrayList", arrayList);

return SUCCESS;

}

}






//member.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>회원 관리</title>


<link rel="stylesheet" type="text/css" href="BasicStyle.css">

<style type="text/css">

.style1 {

text-align: center;

}

</style>


<script type="text/javascript">

function myFunc() {

var obj = document.getElementById("myForm");

//데이터 검사 과정 추가

//데이터 전송

obj.submit();

}

</script>


</head>

<body>

<div>

<div>

<h3>-회원 등록-</h3>

<form method="post" id="myForm">

<table>

<tbody>

<tr>

<td>이름</td>

<td><input type="text" name="name" id="name"></td>

</tr>

<tr>

<td>전화</td>

<td><input type="text" name="tel" id="tel"></td>

</tr>

<tr>

<td></td>

<td>

[<a href="javascript:myFunc()">등록</a>]

<span id="msg" style="font-size:10pt; color:red; display:none;">이름, 전화를 입력해야 합니다.</span>

</td>

</tr>

</tbody>

</table>

</form>

</div>



<div>



<table style="width:400px;" class="style00">

<tbody>

<tr><th>번호</th><th>이름</th><th>전화</th></tr>

<c:forEach var="dto" items="${arrayList}">

<tr>

<td class="style1">${dto.mid}</td>

<td class="style1">${dto.name}</td>

<td class="style1">${dto.tel}</td>

</tr>

</c:forEach>

</tbody>

</table>

</div>

</div>

</body>

</html>








//struts.xml

<?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>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>

   

   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts02.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="myStruts03.xml"></include>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="member.xml"></include>


</struts>





//member.xml

<?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 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="member" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<!-- action 엘리먼트에서 method 속성은

사용자 정의 메소드 호출하는 부분 -->

<action name="member" class="com.test.MemberAction"

method="member">

<result>/member.jsp</result>

</action>

</package>

</struts>




//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="false"

    useStatementNamespaces="true"/>


  <!-- Configure a built-in transaction manager.  If you're using an 

       app server, you probably want to use its transaction manager 

       and a managed datasource -->

   <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:@220.76.176.101:1521:xe"/>

         <property name="JDBC.Username" value="scott"/>

         <property name="JDBC.Password" value="tiger"/>

      </dataSource>

  </transactionManager>


  <!-- List the SQL Map XML files. They can be loaded from the 

       classpath, as they are here (com.domain.data...) -->

  

  <sqlMap resource="com/util/sqlMap/mySqlMap.xml"/>

  

  <!-- List more here...

  <sqlMap resource="com/mydomain/data/Order.xml"/>

  <sqlMap resource="com/mydomain/data/Documents.xml"/>

  -->


</sqlMapConfig>





//mySqlMap.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 엘리먼트에서 namespace의 값을 유일하게 지정할 것 -->    

<sqlMap namespace="mySql">

<!-- id 속성은 쿼리 객체 접근시 식별자로 사용된다. -->

<!-- resultClass 속성은 쿼리 실행 결과를 저장하는 저장소 객체 -->

<!-- SELECT 쿼리의 컬럼 리스트는 MemberDTO의 변수명과 일치해야 한다. -->

<select id="lists" resultClass="com.test.MemberDTO">

SELECT mid, name, tel FROM member ORDER BY mid

</select>

<!-- parameterClass 속성은 외부 데이터를 쿼리에 전달하는 저장소 객체 -->

<!-- #변수명#은 MemberDTO의 변수명과 일치해야 한다. -->

<insert id="add" parameterClass="com.test.MemberDTO">

INSERT INTO member (mid, name, tel) 

VALUES (memberSeq.nextval, #name#, #tel#)

</insert>


</sqlMap>




//요청주소

http://localhost:8090/Struts2Test/member.action



-----------------------------------------------

문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서 

총점, 평균, 판정 결과 출력하는 JDBC 프로그램 작성. 

오라클, Struts, iBatis 이용. 

총점 기준 정렬(내림차순) 출력.

ScoreDTO 작성 추가.



판정 기준은

합격 -> 과목별로 40점 이상이면서, 평균이 60점 이상

과락 -> 과목중에 40점 미만이 있고, 평균은 60점 이상

불합격 -> 평균이 60점 미만


평균이 60점 이상 -> 합격

평균이 60점 미만 -> 불합격


합격 또는 과락 구분은 -> 국어, 영어, 수학 점수가 모두 40점 이상인 확인.


실행 예)

성적 입력 ----------------

이름 [kim   ]

국어 [80    ]

영어 [90    ]

수학 [80    ]

[ 등록 ]


---------------------------------------

    이름 국어 영어 수학 총점 평균 판정

---------------------------------------

1등 hong 100  100  100  300  100.0 합격

2등 kim   80   90   80  ..    ..   합격

---------------------------------------




//ScoreDTO.java


//ScoreAction.java -> 액션 처리 전용 클래스. 모델 드리븐 방식


//scoreIbatis.xml -> 쿼리문 등록


//scoreStruts.xml -> 서블릿 주소 등록


//sqlMapConfig.xml -> scoreIbatis.xml 파일명 등록


//struts.xml -> scoreStruts.xml 파일명 등록


//Score.jsp -> 인터페이스 JSTL/EL 문법 사용


--------------- 정답 소스

---------------------------------------------

--오라클에 성적 저장용 테이블 생성

CREATE TABLE score (

sid NUMBER --PK, 자동 번호 부여

,name VARCHAR2(10)

,kor NUMBER(3) --CK (0~100)

,eng NUMBER(3) --CK (0~100)

,mat NUMBER(3) --CK (0~100)

);


--제약 조건 추가

ALTER TABLE score

ADD CONSTRAINT score_sid_pk PRIMARY KEY (sid);

ALTER TABLE score

ADD CONSTRAINT score_kor_ck CHECK (kor BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_eng_ck CHECK (eng BETWEEN 0 AND 100);

ALTER TABLE score

ADD CONSTRAINT score_mat_ck CHECK (mat BETWEEN 0 AND 100);


--자동 번호 부여 시퀀스 객체 생성

CREATE SEQUENCE scoreSeq;



--INSERT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)

INSERT INTO score (sid, name, kor, eng, mat)

VALUES (scoreSeq.nextval, 'hong', 100, 100, 100)


--SELECT 쿼리 샘플 (쿼리 끝 부분에 ; 표시하지 말 것)

SELECT sid, name, kor, eng, mat

, (kor+eng+mat) AS tot

, (kor+eng+mat)/3 AS ave


--, 조건검사 쿼리 추가 ->합격, 불합격, 과락 출력

, CASE

WHEN ((kor+eng+mat)/3 >= 60) AND (kor<40 OR eng<40 OR mat<40) THEN '과락'

WHEN ((kor+eng+mat)/3 >= 60) THEN '합격'

ELSE '불합격'

END AS grade


FROM score

ORDER BY tot DESC


--scoreView 생성

CREATE OR REPLACE VIEW scoreView

AS

SELECT sid, name, kor, eng, mat

, (kor+eng+mat) AS tot

, (kor+eng+mat)/3 AS ave


--, 조건검사 쿼리 추가 ->합격, 불합격, 과락 출력

, CASE

WHEN ((kor+eng+mat)/3 >= 60) AND (kor<40 OR eng<40 OR mat<40) THEN '과락'

WHEN ((kor+eng+mat)/3 >= 60) THEN '합격'

ELSE '불합격'

END AS grade


FROM score

ORDER BY tot DESC;



--scoreView를 이용한 SELECT 쿼리

SELECT sid, name, kor, eng, mat, tot, ave, grade 

FROM scoreView 

ORDER BY tot DESC


-----------------------------------------

//ScoreDTO.java

package com.test;


public class ScoreDTO {


private String name;

private int kor, eng, mat;


private int tot;

private double ave;

private String grade;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getKor() {

return kor;

}

public void setKor(int kor) {

this.kor = kor;

}

public int getEng() {

return eng;

}

public void setEng(int eng) {

this.eng = eng;

}

public int getMat() {

return mat;

}

public void setMat(int mat) {

this.mat = mat;

}

public int getTot() {

return tot;

}

public void setTot(int tot) {

this.tot = tot;

}

public double getAve() {

return ave;

}

public void setAve(double ave) {

this.ave = ave;

}

public String getGrade() {

return grade;

}

public void setGrade(String grade) {

this.grade = grade;

}

}




//ScoreAction.java -> 액션 처리 전용 클래스. 모델 드리븐 방식.

package com.test;


import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;


import com.util.dao.*;

import java.sql.*;

import java.util.*;


import javax.servlet.http.HttpServletRequest;


import org.apache.struts2.ServletActionContext;


public class ScoreAction extends ActionSupport

implements Preparable, ModelDriven<ScoreDTO> {

private static final long serialVersionUID = 1L;


private ScoreDTO dto;


@Override

public ScoreDTO getModel() {

return dto;

}


@Override

public void prepare() throws Exception {

dto = new ScoreDTO();

}

public String score() {

//액션 코드 추가

CommonDAO dao = CommonDAOImpl.getInstance();

//INSERT 쿼리 실행 액션 수행

if (dto.getName() != null

&& !dto.getName().equals("")) {

try {

dao.insertData("score.add", dto);

} catch (SQLException e) {

System.out.println(e.toString());

}

}

List<Object> arrayList = dao.getListData("score.lists");

HttpServletRequest req = ServletActionContext.getRequest();

req.setAttribute("arrayList", arrayList);

return SUCCESS;

}

}





//scoreIbatis.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 엘리먼트에서 namespace의 값을 유일하게 지정할 것 -->    

<sqlMap namespace="score">

<!-- id 속성은 쿼리 객체 접근시 식별자로 사용된다. -->

<!-- resultClass 속성은 쿼리 실행 결과를 저장하는 저장소 객체 -->

<!-- SELECT 쿼리의 컬럼 리스트는 ScoreDTO의 변수명과 일치해야 한다. -->

<select id="lists" resultClass="com.test.ScoreDTO">

SELECT sid, name, kor, eng, mat, tot, ave, grade 

FROM scoreView 

ORDER BY tot DESC

</select>

<!-- parameterClass 속성은 외부 데이터를 쿼리에 전달하는 저장소 객체 -->

<!-- #변수명#은 ScoreDTO의 변수명과 일치해야 한다. -->

<insert id="add" parameterClass="com.test.ScoreDTO">

INSERT INTO score (sid, name, kor, eng, mat)

VALUES (scoreSeq.nextval, #name#, #kor#, #eng#, #mat#)

</insert>


</sqlMap>





//scoreStruts.xml -> 서블릿 주소 등록

<?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 속성은 유일하게 작성할 것 --> 

<!-- package 엘리먼트에서 namespace 속성은 빈 값으로 처리할 것 -->

<package name="score" extends="struts-default" namespace="" >        

<!-- 서블릿 주소 분석 과정을 추가할 것. -->

<!-- action 엘리먼트에서 name 속성이 URL 요청 주소가 된다.

확장자는 .action으로 설정되어 있다. -->

<!-- action 엘리먼트에서 class 속성은 액션 처리용 클래스를 지정할 때 사용 -->

<!-- action 엘리먼트에서 method 속성은

사용자 정의 메소드 호출하는 부분 -->

<action name="score" class="com.test.ScoreAction"

method="score">

<result>/score.jsp</result>

</action>

</package>

</struts>





//sqlMapConfig.xml -> scoreIbatis.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="false"

    useStatementNamespaces="true"/>


  <!-- Configure a built-in transaction manager.  If you're using an 

       app server, you probably want to use its transaction manager 

       and a managed datasource -->

   <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="scott"/>

         <property name="JDBC.Password" value="tiger"/>

      </dataSource>

  </transactionManager>


  <!-- List the SQL Map XML files. They can be loaded from the 

       classpath, as they are here (com.domain.data...) -->

  

  <sqlMap resource="com/util/sqlMap/scoreIbatis.xml"/>

  

  <!-- List more here...

  <sqlMap resource="com/mydomain/data/Order.xml"/>

  <sqlMap resource="com/mydomain/data/Documents.xml"/>

  -->


</sqlMapConfig>





//struts.xml -> scoreStruts.xml 파일명 등록

<?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>

   <!-- Configuration for the default package. -->

    <package name="default" extends="struts-default" namespace="" >        

        <global-results>

            <result name="error">/exception/error.jsp</result>

        </global-results>

   </package>


   <!-- 스트러츠2 환경 설정 파일 등록 -->

   <include file="scoreStruts.xml"></include>


</struts>




//score.jsp -> 인터페이스

<%@ page language="java" contentType="text/html; charset=EUC-KR"

    pageEncoding="EUC-KR"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>    

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>    

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">

<title>Insert title here</title>


<style type="text/css">

.subject {

width:80px;

}

.style1 {

text-align: center;

}

.style2 {

text-align: right;

}

</style>


<script type="text/javascript">

function myFunc(obj){

var name = document.getElementById('name');

var kor = document.getElementById('kor');

var eng = document.getElementById("eng");

var mat = document.getElementById("mat");

var msg = document.getElementById("msg");

msg.style.display = "none";

//빈칸 검사

if(name.value == "" || kor.value == "" || eng.value =="" || mat.value==""){

msg.style.display = "inline";

return;

//숫자 검사

if (kor.value.match(/[^0-9]/) || eng.value.match(/[^0-9]/) ||mat.value.match(/[^0-9]/)){

msg.style.display = "inline";

return;

//범위 검사

if(parseInt(kor.value)>100 ||parseInt(eng.value)>100 ||parseInt(mat.value)>100 ){

msg.style.display = "inline";

return;

}

//데이터 전송

obj.form.submit();

}

</script>


</head>

<body>

<div>

<h2>성적 처리(Struts2, iBatis)</h2>

<form method="post">

이름 <input type="text" name="name" id="name"><br> 

국어 <input type="text" name="kor" id="kor" class="subject"><br>

영어 <input type="text" name="eng" id="eng" class="subject"><br>

수학 <input type="text" name="mat" id="mat" class="subject"><br>

<input type="button" value=" 등록 "

onclick="myFunc(this)"><br>

<span id="msg" style="color:red; display:none;">이름, 국어, 영어, 수학을 입력해야 합니다.<br>국어, 영어, 수학을 0~100 사이의 숫자를 입력해야 합니다.</span>

</form>

<h3>출력 ------------</h3>

<div>

<table border="1" style="width:500px;">

<tbody>

<tr>

<th>등수</th>

<th>이름</th>

<th>국어</th>

<th>영어</th>

<th>수학</th>

<th>총점</th>

<th>평균</th>

<th>판정</th>

</tr>

<c:set var="sid" value="0"></c:set>

<c:forEach var="dto" items="${arrayList}">

<c:set var="sid" value="${sid+1}"></c:set>

<tr>

<td class="style1">${sid}</td>

<td class="style1">${dto.name}</td>

<td class="style2">${dto.kor}</td>

<td class="style2">${dto.eng}</td>

<td class="style2">${dto.mat}</td>

<td class="style2">${dto.tot}</td>

<td><fmt:formatNumber value="${dto.ave}" maxFractionDigits="1"></fmt:formatNumber></td>

<td class="style1">${dto.grade}</td>

</tr>

</c:forEach>

</tbody>

</table>

</div>

</div>

</body>

</html>





//요청주소

http://localhost:8090/Struts2Test/score.action



WRITTEN BY
빨강꼬마

,