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