내가 이해한 한도내에서의 스프링에서의 ajax 구현시 데이터 흐름도는

1. ajax 함수 호출 



2.  - ajax함수내에서 데이터 조회에 참조할 데이터변수
     - 요청주소(컨트롤러에 맵핑해서 실행할 url 주소) 설정



3. 2번항목에서 지정한 컨트롤러에 실행되는 메소드내에서는 getParameter로 해당 변수를 받아온 후
    해당 변수를 사용하여 쿼리를 날려 결과값을 setAttribute 를 사용하여 jsp 단으로 전달한다. (return "abc.jsp";)



4. jsp에서는
        - 
responseText 인 경우 예를 들어
        <%  String result = (String) request.getAttribute("result");  out.write(result);         %>

과 같은 처리.

  - responseXML 인 경우

ArrayList<자료형> abc = (캐스팅 변환)request.getAttribute("속성명");

형대로 받아 StringBuilder를 사용해서 XML 형대로 문자열을 누적 처리.

다만, jsp에서 XML 형태로 가공할때 가공 후 응답은 

response.setContentType("text/xml; charset=euc-kr");

response.getWriter().write(result.toString()); 

을 사용하여 리턴.

EX) 간단한 XML 형태

<?xml version="1.0" encoding="utf-8"?>
<users>
<user>
<name>HyunWook Kim</name>
</user>
<user>
<name>redccoma</name>
</user>
</users>



5.    out.write(result) 구문이 실행되면 ajax 관련 함수중 콜백 함수를 실행하면서 응답확인을 하고 에러검출이 안될 경우

지정한 액션 혹은 지정한 함수를 실행. 예를 들어 xmlReq.status == 200 과 같은 조건일 경우 정상응답이므로 해당 조건하에서

사용자 정의 액션처리를 바로 하거나 printData(); 와 같은 사용자 지정함수를 호출.



6. printData() 와 같은 함수를 호출한다고 가정할 경우 var result = xmlReq.responseText; 

   혹은 var result = xmlReq.responseXML;  형태로 결과 데이터를 저장.

   당연히 TEXT와 같은 경우 단일 데이터이므로 재처리할 필요 없이 원하는 액션처리를 하면 되고,

   XML의 경우 아래의 코드처럼 xml값을 분석하여 가져온 후 동적으로 html 소스생성하고 innerHTML을 통해 문서로

   최종반환하여 처리를 종료.


  ex) 간단한 XML 분석 및 HTML 동적 소스 생성

var users = result.getElementsByTagName("user");

for(var i=0;i<users.length;i++){

result += users[i].getElementsByTagName("name")[0].firstChild.nodeValue + "<br>";

}

document.getElementById("str").innerHTML = str;


아래 영문내용과는 다르게 구현된 AJAX 소스 (어차피 같은 의미임-.-)

//AjaxSend02.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">


//전역변수

var xmlReq; 

//전송 역할 함수

function myFunc() {

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

//ajax 객체

xmlReq = new XMLHttpRequest(); //IE 7.0 이상

//서버 요청주소

var url = "AjaxReceive02.jsp";

//서버요청시 데이터 전송하는 부분

//데이터가 두개 이상인 경우는

//식별자=값&식별자=값&.... 형태로 작성

var postString = "data=" + data.value;

//응답이 돌아온다면 callback 함수 호출

//이벤트 등록 부분

xmlReq.onreadystatechange = callBack;

//ajax 요청 형식 // true는 비동기

xmlReq.open("POST", url, true);

//전송하는 데이터 안에 한글이 있는 경우 인코딩방식을 알려주어야 함.

xmlReq.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=euc-kr");

//ajax 요청

xmlReq.send(postString);

}

//응답 확인 함수

function callBack() {

//state는 1, 2, 3, 4의 총 4가지 상태가 있음.

//1은 요청전

//2는 요청후

//3은 서버로 응답을 보낸 상태

//4는 최종 응답을 받은 상태를 의미

if(xmlReq.readyState == 4) {

//status는 서버 응답의 종류를 의미

//200은 정상적인 처리가 되었음을 의미

//500은 JSP 실행은 했지만 오류가 발생함.

//404는 요청 주소에 해당하는 파일이 없음.

if(xmlReq.status == 200) {

//정상적인 응답을 화면에 출력하는 함수 호출

printData();

} else {

alert("처리 불가!");

}

}

}

//결과 출력 함수

function printData() {

//응답은 두가지 종류가 존재

//responseText, responseXML

var result = xmlReq.responseText;

//alert(result);

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

msg.innerHTML = result;

}


</script>

</head>

<body>

<div>

<h2>데이터 송수신 테스트2(ajax 방식)</h2>

<form>

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

전화번호 <input type="text" name="tel" id="tel"><br>

아이디 <input type="text" name="data" id="data"><br>

<input type="button" value="중복체크" onclick="myFunc()">

</form>

<div>결과 데이터 : <span id="msg"></span></div>

</div>

</body>

</html>




//AjaxReceive02.jsp

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

    pageEncoding="EUC-KR"%>

<%


String data = request.getParameter("data");

String result = "OK";

if(data.equals("test") || data.equals("admin") || data.equals("hong")) {

result = "Cancel";

}


//ajax 방식에서 데이터를 처리후 재전송할때 out.write(값); 을 사용해야 함.

out.write(result);

%>



JSPAndAJAXExamples


Example 1 - Server side JSP encoding

service.jsp:

  <%@page contentType="text/html; charset=UTF-8"%>
 
<%@page import="org.json.simple.JSONObject"%>
 
<%
   
JSONObject obj=new JSONObject();
    obj
.put("name","foo");
    obj
.put("num",new Integer(100));
    obj
.put("balance",new Double(1000.21));
    obj
.put("is_vip",new Boolean(true));
    obj
.put("nickname",null);
   
out.print(obj);
   
out.flush();
  %>

Please note that you need to place json_simple-1.1.jar in WEB-INF/lib before running the JSP. Then the client side will get the resulting JSON text.

Example 2 - Client side XMLHttpRequest

client.html:

<html>
<head>
 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>

<script type="text/javascript">
function createXMLHttpRequest(){
 
// See http://en.wikipedia.org/wiki/XMLHttpRequest
 
// Provide the XMLHttpRequest class for IE 5.x-6.x:
 
if( typeof XMLHttpRequest == "undefined" ) XMLHttpRequest = function() {
   
try { return new ActiveXObject("Msxml2.XMLHTTP.6.0") } catch(e) {}
   
try { return new ActiveXObject("Msxml2.XMLHTTP.3.0") } catch(e) {}
   
try { return new ActiveXObject("Msxml2.XMLHTTP") } catch(e) {}
   
try { return new ActiveXObject("Microsoft.XMLHTTP") } catch(e) {}
   
throw new Error( "This browser does not support XMLHttpRequest." )
 
};
 
return new XMLHttpRequest();
}

var AJAX = createXMLHttpRequest();

function handler() {
 
if(AJAX.readyState == 4 && AJAX.status == 200) {
     
var json = eval('(' + AJAX.responseText +')');
      alert
('Success. Result: name => ' + json.name + ',' + 'balance => ' + json.balance);
 
}else if (AJAX.readyState == 4 && AJAX.status != 200) {
    alert
('Something went wrong...');
 
}
}

function show(){
  AJAX
.onreadystatechange = handler;
  AJAX
.open("GET", "service.jsp");
  AJAX
.send("");
};
</script>

<body>
 
<a href="#" onclick="javascript:show();"> Click here to get JSON data from the server side</a>
</html>

Please place client.html and service.jsp (see Example 1) in the same directory and then open client.html in IE or Firefox, click the link and you'll get result.



출처 : https://code.google.com/p/json-simple/wiki/JSPAndAJAXExamples


WRITTEN BY
빨강꼬마

,

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

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



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






WRITTEN BY
빨강꼬마

,