-------------------------------------------------
Spring 환경 설정
1. 다이나믹 웹 프로젝트 생성 후
2. SpringMVC_iBatis 환경 설정(JAR 파일 포함) 폴더에 있는 내용을 덮어쓰기할 것.
-------------------------------------------------
Controller 테스트1(AbstractController)
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>spring</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 한글 인코딩 설정을 euc-kr로 수정할 것 -->
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>euc-kr</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<!-- 서블릿 요청 주소에서 확장자를 *.mvc로 수정할 것 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.mvc</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
//dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".jsp" />
</bean>
<!-- 사용자 요청 서블릿 주소 등록 -->
<bean id="beanNameUrlMapping"
class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"></bean>
<bean name="/msg.mvc" class="com.test.Controller01"></bean>
</beans>
//Controller01.java
package com.test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;
public class Controller01 extends AbstractController {
//매개변수 이름을 req, resp로 수정해서 사용할 것
@Override
protected ModelAndView handleRequestInternal(HttpServletRequest req,
HttpServletResponse resp) throws Exception {
String msg = "Hello, Spring World!";
req.setAttribute("msg", msg);
//뷰 역할을 하는 JSP 페이지 지정할 것.
//확장자 생략
return new ModelAndView("receive01");
}
}
//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>
<h1>Controller 테스트1(AbstractController)</h1>
<div>${msg}</div>
</div>
</body>
</html>
//요청주소
http://localhost:8090/SpringTest/msg.mvc
-------------------------------------------------
Spring Annotation 환경 설정
1. 다이나믹 웹 프로젝트 생성 후
2. SpringMVC_Annotation_iBatis 연동 환경 설정(JAR 파일 포함) 폴더에 있는 내용을 덮어쓰기할 것.
--------------------------------------------------
SpringMVC Annotation 테스트
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>spring</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- 한글 인코딩 설정을 euc-kr로 수정할 것 -->
<filter>
<filter-name>CharacterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>euc-kr</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/dispatcher-servlet.xml,
/WEB-INF/applicationContext.xml
</param-value>
</init-param>
-->
</servlet>
<!-- 서블릿 요청 주소에서 확장자를 *.mvc로 수정할 것 -->
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>*.mvc</url-pattern>
</servlet-mapping>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
//Controller02.java
package com.test;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//@Controller 어노테이션은 현재 클래스를 컨트롤러로 지정하게 됨
//@RequestMapping 어노테이션은 사용자 요청 서블릿 주소 등록함
@Controller
@RequestMapping(value="/msg.mvc")
public class Controller02 {
//사용자 정의 메소드 구성
//메소드 위에 어노테이션을 추가함으로서 자동 호출됨
//메소드 안에 매개변수 지정은 임의로 추가 지정 가능
@RequestMapping(method=RequestMethod.GET)
public String method(HttpServletRequest req,
HttpServletResponse resp) {
String msg = "Hello, Spring World!";
req.setAttribute("msg", msg);
//뷰 역할을 할 JSP 페이지 주소 지정할 것.
return "receive02.jsp";
}
}
//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>
<h1>SpringMVC Annotation 테스트</h1>
<div>${msg}</div>
</div>
</body>
</html>
//요청주소
http://localhost:8090/SpringAnnotationTest/msg.mvc
----------------------------------------------------
SpringMVC Annotation에서 데이터 전송 테스트
//send03.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>
<script type="text/javascript">
function myFunc(obj) {
//데이터 검사
//이름, 전화번호가 비어있는지 검사하는 과정 추가
//이름, 전화번호가 채워진 경우만 데이터 전송
obj.form.submit();
}
</script>
</head>
<body>
<div>
<h2>데이터 송수신 테스트1</h2>
<!-- <form> 태그에서 action, method 속성 필수 -->
<form action="receive03.mvc" method="post">
<!-- JSP에서는 식별자를 name 속성으로 구분 -->
이름 <input type="text" name="name"><br>
전화 <input type="text" name="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>
//receive03.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>
<!-- 데이터 전송시 사용했던 식별자와 EL 표현의 식별자는 동일해야 한다. -->
<h3>name:${name}, tel:${tel}</h3>
</div>
</body>
</html>
//UserDTO.java
package com.test;
//SpringMVC Annotation에서 사용하는 데이터 저장소 객체
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;
}
}
//Controller03.java
package com.test;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//@Controller("컨트롤러ID")
@Controller("controller03")
public class Controller03 {
//@RequestMapping 어노테이션은 사용자 요청 서블릿 주소 등록함
//메소드 단위로 @RequestMapping 어노테이션 지정 가능
//method 인자는 요청 방식 지정하는 부분
@RequestMapping(value="/send03.mvc", method=RequestMethod.GET)
public String send03() {
//뷰 역할을 할 JSP 페이지 주소 지정할 것.
return "send03.jsp";
}
//method 인자는 요청 방식 지정하는 부분
//데이터 전송 전용 객체(UserDTO) 지정은 메소드 인자로 설정한다.
//메소드 안에 매개변수 지정은 임의로 추가 지정 가능
@RequestMapping(value="/receive03.mvc", method={RequestMethod.GET, RequestMethod.POST})
public String receive03(UserDTO dto, HttpServletRequest req) {
//데이터 수신 확인
System.out.println(dto.getName());
System.out.println(dto.getTel());
req.setAttribute("name", dto.getName());
req.setAttribute("tel", dto.getTel());
//뷰 역할을 할 JSP 페이지 주소 지정할 것.
return "receive03.jsp";
}
}
//요청주소
http://localhost:8090/SpringAnnotationTest/send03.mvc
-----------------------------------------
이름과 전화번호를 저장하는 JDBC 프로그램 작성.
오라클, SpringMVC Annotation, 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')
-----------------------------------------
//applicationContext.xml -> 데이터베이스 연결 계정 등록
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<!-- 데이터베이스 연결 계정 등록할 것 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</bean>
<!-- Transaction Manager for a single JDBC DataSource -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlMapClient"
class="org.springframework.orm.ibatis.SqlMapClientFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="WEB-INF/sqlMapConfig/sqlMapConfig.xml"/>
<bean id="sqlMapClientTemplate"
class="org.springframework.orm.ibatis.SqlMapClientTemplate"
p:sqlMapClient-ref="sqlMapClient" />
</beans>
//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>
//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"/>
<!-- iBatis XML 파일 등록 -->
<sqlMap resource="com/spring/dao/sqlMap/mySqlMap.xml"/>
</sqlMapConfig>
//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;
}
}
//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>
//BasicStyle.css
@CHARSET "EUC-KR";
body {
color:#2f3743;
font-size:10pt;
}
a {
text-decoration:none;
color:gray;
}
a:hover {
text-decoration:underline;
color:red;
}
table.style00 td, table.style00 th
{
padding: 3px;
border-right-style: solid;
border-bottom-style: solid;
border-width: 1px;
border-color: #6980b8;
}
table.style00 td:hover
{
background-color:#d2d2d2;
}
#result {
overflow:auto; /* DIV 태그 내부에 스크롤 생성 */
height:100px;
}
//MemberController.java
package com.test;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.spring.dao.CommonDAO;
//@Controller("컨트롤러ID")
@Controller("memberController")
public class MemberController {
//iBatis 연결 객체인 IBatisDaoImpl 클래스를 dao 변수와 연결시킨다.
@Resource(name="dao")
private CommonDAO dao;
//@RequestMapping 어노테이션은 사용자 요청 서블릿 주소 등록함
//데이터 전송 전용 객체(UserDTO) 지정은 메소드 인자로 설정한다.
//메소드 안에 매개변수 지정은 임의로 추가 지정 가능
@RequestMapping(value="/member.mvc", method={RequestMethod.GET, RequestMethod.POST})
public String member(MemberDTO dto, HttpServletRequest req) {
//INSERT 쿼리 실행 액션 수행
if (dto.getName() != null
&& !dto.getName().equals("")) {
try {
dao.insertData("mySql.add", dto);
} catch (Exception e) {
System.out.println(e.toString());
}
}
//SELECT 쿼리 실행 부분
List<Object> arrayList = new ArrayList<Object>();
try {
arrayList = dao.getListData("mySql.lists");
} catch (Exception e) {
System.out.println(e.toString());
}
req.setAttribute("arrayList", arrayList);
//뷰 역할을 할 JSP 페이지 주소 지정할 것.
return "member.jsp";
}
}
//IBatisDaoImpl.java
package com.spring.dao;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.ibatis.SqlMapClientTemplate;
import org.springframework.stereotype.Repository;
@Repository("dao")
public class IBatisDaoImpl implements CommonDAO {
/*
@Repository : 저장소 컴포넌트(DAO 등).
@Service : 상태없는 서비스 컴포넌트.
@Autowired 어노테이션 : Spring에서 의존관계를 자동으로 설정
@Resource 어노테이션 : 의존하는 빈 객체를 전달 할 때 사용
@Resource 는 이름을 지정할 수 있으나 @Autowired는 이름을 지정할 수 없고 id 값과 일치해야한다.
- Service에 있는 @Autowired는 @Repository("dao")에 등로된 dao와 변수명이 같아야 한다.
- @Autowired 어노테이션은 Spring에서 의존관계를 자동으로 설정
*/
@Autowired
private SqlMapClientTemplate sqlMapClientTemplate;
public void setSqlMapClientTemplate(SqlMapClientTemplate sqlMapClientTemplate) {
this.sqlMapClientTemplate = sqlMapClientTemplate;
}
// ******************************************************************
// 데이터 추가
public void insertData(String id, Object value) throws Exception {
try {
// sqlMapClientTemplate.getSqlMapClient().startTransaction();
// sqlMapClientTemplate.getSqlMapClient().getCurrentConnection().setAutoCommit( false );
sqlMapClientTemplate.insert(id, value); // return Object
// sqlMapClientTemplate.getSqlMapClient().getCurrentConnection().commit();
} catch (Exception e) {
System.out.println(e.toString());
throw e;
} finally {
// sqlMapClientTemplate.getSqlMapClient().getCurrentConnection().setAutoCommit( true );
// sqlMapClientTemplate.getSqlMapClient().endTransaction();
}
}
// ******************************************************************
// 데이터 수정
public int updateData(String id, Object value) throws Exception {
int result = 0;
try {
result = sqlMapClientTemplate.update(id, value);
} catch (Exception e) {
System.out.println(e.toString());
throw e;
}
return result;
}
public int updateData(String id, Map<String, Object> map) throws Exception {
int result = 0;
try {
result = sqlMapClientTemplate.update(id, map);
} catch (Exception e) {
System.out.println(e.toString());
throw e;
}
return result;
}
// ******************************************************************
// 데이터 삭제
public int deleteData(String id, Map<String, Object> map) throws Exception {
int result = 0;
try {
result = sqlMapClientTemplate.delete(id, map);
} catch (Exception e) {
System.out.println(e.toString());
throw e;
}
return result;
}
public int deleteData(String id, Object value) throws Exception {
int result = 0;
try {
result = sqlMapClientTemplate.delete(id, value);
} catch (Exception e) {
System.out.println(e.toString());
throw e;
}
return result;
}
public int deleteAll(String id) throws Exception {
int result = 0;
try {
result = sqlMapClientTemplate.delete(id);
} catch (Exception e) {
System.out.println(e.toString());
throw e;
}
return result;
}
// ******************************************************************
// 레 코드 수 / 최대 값 구하기
public int getIntValue(String id, Map<String, Object> map) throws Exception {
int num = 0;
num = ((Integer)sqlMapClientTemplate.queryForObject(id, map)).intValue();
return num;
}
public int getIntValue(String id, Object value) throws Exception {
int num = 0;
num = ((Integer)sqlMapClientTemplate.queryForObject(id, value)).intValue();
return num;
}
public int getIntValue(String id) throws Exception {
int num = 0;
num = ((Integer)sqlMapClientTemplate.queryForObject(id)).intValue();
return num;
}
// ******************************************************************
// 테이블의 레코드를 리스트에 저장
@SuppressWarnings("unchecked")
public List<Object> getListData(String id, Map<String, Object> map) throws Exception {
List<Object> lists = (List<Object>) sqlMapClientTemplate.queryForList(id, map);
return lists;
}
@SuppressWarnings("unchecked")
public List<Object> getListData(String id, Object value) throws Exception {
List<Object> lists = (List<Object>) sqlMapClientTemplate.queryForList(id, value);
return lists;
}
@SuppressWarnings("unchecked")
public List<Object> getListData(String id) throws Exception {
List<Object> lists = (List<Object>) sqlMapClientTemplate.queryForList(id);
return lists;
}
// ******************************************************************
// 해당 레코드 가져오기
public Object getReadData(String id) throws Exception {
return sqlMapClientTemplate.queryForObject(id);
}
public Object getReadData(String id, Object value) throws Exception {
return sqlMapClientTemplate.queryForObject(id, value);
}
public Object getReadData(String id, Map<String, Object> map) throws Exception {
return sqlMapClientTemplate.queryForObject(id, map);
}
}
//요청주소
http://localhost:8090/SpringAnnotationTest/member.mvc
------------------------------------------
문제) 여러명의 국어, 영어, 수학 점수를 입력 받아서
총점, 평균, 판정 결과 출력하는 JDBC 프로그램 작성.
오라클, SpringMVC Annotation, iBatis 이용.
총점 기준 정렬(내림차순) 출력.
판정 기준은
합격 -> 과목별로 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 .. .. 합격
---------------------------------------
---------------------------------------------
--오라클에 성적 저장용 테이블 생성
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;
}
}
//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>
//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"/>
<!-- iBatis XML 파일 등록 -->
<sqlMap resource="com/spring/dao/sqlMap/mySqlMap.xml"/>
<sqlMap resource="com/spring/dao/sqlMap/scoreIbatis.xml"/>
</sqlMapConfig>
//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>성적 처리(SpringMVC Annotation, 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 class="style2"><fmt:formatNumber value="${dto.ave}" pattern="0.0"></fmt:formatNumber></td>
<td class="style1">${dto.grade}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
</body>
</html>
//ScoreController.java
package com.test;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.spring.dao.CommonDAO;
@Controller("scoreController")
public class ScoreController {
//iBatis 연결 객체인 IBatisDaoImpl 클래스를 dao 변수와 연결시킨다.
@Resource(name="dao")
private CommonDAO dao;
//@RequestMapping 어노테이션은 사용자 요청 서블릿 주소 등록함
//데이터 전송 전용 객체(UserDTO) 지정은 메소드 인자로 설정한다.
//메소드 안에 매개변수 지정은 임의로 추가 지정 가능
@RequestMapping(value="/score.mvc", method={RequestMethod.GET, RequestMethod.POST})
public String score(ScoreDTO dto, HttpServletRequest req) {
//INSERT 쿼리 실행 액션 수행
if (dto.getName() != null
&& !dto.getName().equals("")) {
try {
dao.insertData("score.add", dto);
} catch (Exception e) {
System.out.println(e.toString());
}
}
//SELECT 쿼리 실행 부분
List<Object> arrayList = new ArrayList<Object>();
try {
arrayList = dao.getListData("score.lists");
} catch (Exception e) {
System.out.println(e.toString());
}
req.setAttribute("arrayList", arrayList);
return "score.jsp";
}
}
//요청주소
http://localhost:8090/SpringAnnotationTest/score.mvc
------------------------------------------------