본문 바로가기
CLASS/SPRING,JSTL

#8-2 /☔ 통계 data 관련 project 만들기 - selectOne(ajax),insert

by hingu 2024. 7. 23.

[ 쓰기, 출력, 수정, 삭제 ] 다 만들거임

 

1. database table 생성 

(서울, 경기도, 세종, 대전, 강원도)

날짜가 unique key가 되어야함

//강우량 table

create table rainfall(
ridx int(8) not null auto_increment,
today date not null default '0001-01-01',
area_part1 char(3) not null, //int로 하면 강우량이 0일경우 안들어감
area_part2 char(3) not null,
area_part3 char(3) not null,
area_part4 char(3) not null,
area_part5 char(3) not null,
primary key(ridx),
unique key(today)
)

 

2. DAO (rainfall_dao.java)

package api;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class rainfall_dao {
	int ridx;
	String today;
	String area_part1,area_part2,area_part3,area_part4,area_part5;
}

 

 

3. config.xml 의 typeAlias에 dao 추가

<typeAlias alias="rainfalldao" type="api.rainfall_dao"/>

=> server restart 

 

 

4. 강우량 등록 페이지 생성 - rainfall_write.jsp (ECMA + javascript)

    + 등록일자 중복 검토 (Ajax)

<body>
	<!-- name-dao랑 맞춰야함  -->
	<form id="frm">
		등록 일자 : <input type="date" name="today" onchange="date_check(this.value)">
		<font color="red" id="error_red" style="display:none;">* 이미 등록된 일자입니다.</font><br>
		서울 : <input type="text" name="area_part1" value="0" maxlength="3"><br>
		경기도 : <input type="text" name="area_part2" value="0" maxlength="3"><br>
		세종 : <input type="text" name="area_part3" value="0" maxlength="3"><br>
		대전 : <input type="text" name="area_part4" value="0" maxlength="3"><br>
		강원도 :  <input type="text" name="area_part5" value="0" maxlength="3"><br><br>
		<button type="button" id="btn">강수량 등록</button>
	</form>
</body>

<script>
	//Javascript
 	function date_check(day){ //value가 바뀔때마다 ajax 전송
		if(day != ""){
			var ajax = new XMLHttpRequest();
			ajax.onreadystatechange = function(){
				if(ajax.readyState==4 && ajax.status==200){
					//console.log(this.response); //data가 있으면 1 없으면 0
					if(this.response != 0){
						document.getElementById("error_red").style.display = "inline-block";
					}else{
						document.getElementById("error_red").style.display = "none";
					}
				}
			};
			ajax.open("GET","./rainfall_check.do?today="+day,true);
			ajax.send();
		}else{ //이벤트 발생시 값을 못가져왔을 경우
			var dates = frm.today.value;
			if(dates != ""){
				date_check(dates); //재귀함수
			}
		}
	}

	//ECMA
	document.querySelector("#btn").addEventListener("click",function(){
		frm.method="POST";
		frm.action="./rainfall_writeok.do";
		frm.submit();
	})
</script>

 

 

/*--------------------- 입력날짜 중복 체크 (ajax) -----------------------*/

 

날짜 중복시 error msg

 

5. mapper.xml 에 query문 추가 (<mapper>  )

<!-- 입력 날짜 중복 체크  -->
<select id="ajax_select" resultType="String">
    select count(*) as ctn from rainfall where today=#{today}
</select>

resultType : 실행된 결과값을 String으로 return 받겠다 (Integer,int..등 가능)

 

 

6.  Controller - @GetMapping("/rainfall/rainfall_check.do") : 등록일자 중복 검토

@Resource(name = "rainfalls") //rainfalls module 호출
private rainfall_module rm;

//등록일자 중복 체크
@GetMapping("/rainfall/rainfall_check.do")
public String rainfall_check(
            @RequestParam(defaultValue="", required= false) String today,
            HttpServletResponse res
        ) throws Exception{

    try {
        //rainfall/rainfall_check.do?today=test로 강제 접속시 아무것도 뜨면 안됨
        if(!today.equals("")) { 
            String checks = rm.ajax_select(today);
            this.pw = res.getWriter();
            
            //selectOne으로 처리된 module의 결과값을 받아서 front-end로 전달
            this.pw.print(checks); //data가 있으면 1 없으면 0 
        }else {
            this.pw.write("error");
        }
    }catch(Exception e) {
        System.out.println("에러발생");
    }

    return null;
}

Module로부터 인자값을 넘겨받아 mapper로 전달

 

7. Module - rainfall_module.java 파일 생성 및 select 파트 추가

package api;

//~import 생략

@Repository("rainfalls")
public class rainfall_module {
	@Resource(name="template")
	private SqlSessionTemplate tm;
	
	//ajax에 대한 data 체크
	public String ajax_select(String today) {
		String result = tm.selectOne("datadb.ajax_select",today);
		
		return result;
	}
}

❗ 자료형을 String 으로 받음 - mapper.xml에서 resultType을 String으로 설정해두었기 때문 ! (다른걸로 하면 에러)

 

 

/*--------------------- data 등록 insert -----------------------*/

 

8. mapper.xml 에 query문 추가 (<mapper> ~ </mapper> )

<insert id="rain_insert">
    insert into rainfall (ridx,today,area_part1,area_part2,area_part3,area_part4,area_part5)
    values ('0',#{today},#{area_part1},#{area_part2},#{area_part3},#{area_part4},#{area_part5})
</insert>

 

 

8. Controller - @PostMapping("/rainfall/rainfall_writeok.do")

PrintWriter pw = null;

@Resource(name = "rainfalls")
private rainfall_module rm;


@PostMapping("/rainfall/rainfall_writeok.do")
public String rainfall_writeok(
            @ModelAttribute("fall") rainfall_dao dao, 
            HttpServletResponse res
        ) throws Exception{
    res.setContentType("text/html;charset=utf-8");

    this.pw = res.getWriter();
    try {
        //dao로 값을 받아서 module로 전달!
        int callback = rm.rain_insert(dao);
        if(callback > 0) {
            this.pw.write("<script>"
                    + "alert('정상적으로 등록 완료 되었습니다.');"
                    + "location.href='./rainfall_list.do';"
                    + "</script>");
        }

    }catch(Exception e) {
        this.pw.write("<script>"
                + "alert('db 오류로 인하여 등록되지 않았습니다.');"
                + "location.href='./rainfall_write.do';"
                + "</script>");
    }finally {
        this.pw.close();
    }

    return null;
}

 

 

9. Module - rainfall_module.java 파일 생성 및 insert 파트 추가

package api;

//~import 생략

@Repository("rainfalls")
public class rainfall_module {
	@Resource(name="template")
	private SqlSessionTemplate tm;
	
	//데이터 insert - int로 받아도 됨
	public int rain_insert(rainfall_dao dao) {
		int result = tm.insert("datadb.rain_insert",dao);
		
		return result;
	}
}

 

=> insert시 dao를 활용하여 setter값을 mapper로 전달하여 저장함