본문 바로가기
CLASS/SPRING,JSTL

#8-3 / ☔ - 통계차트 출력 페이지(list) , ajax(SPA)+do

by hingu 2024. 7. 23.

강우량 통계차트 출력페이지 (SPA) - ajax (jQuery) 로 핸들링 할거임

 

모든데이터의 날짜값을 가져와서 jsp의 select에 뿌려줌

(최초 접속시 오늘 날짜를 back-end로 전송

backend에서 해당 날짜를 이용해 데이터 추출 -> front로 session storage 세팅 )=> select 가 바뀔때마다 해당 함수 작동 

 

/*--------------------- 일자별 리스트 값을 가져오는 part (select 에 날짜 뿌려주는 용도)-----------------------*/

 

10. mapper.xml  해당 쿼리문 추가 - 모든 데이터의 날짜값만 가져오기

<select id="rain_alldata_select" resultType="rainfalldao"> 
	select today from rainfall order by ridx desc;
</select>

 

11.Controller

//아래 통합버전 확인 넘 헷갈림

List<rainfall_dao> all = rm.ymdlist();
m.addAttribute("all",all);
/..

 

12.Module 일자별 리스트 값을 가져오는 메소드

public List<rainfall_dao> ymdlist(){
    List<rainfall_dao> all = new ArrayList<rainfall_dao>();
    all = tm.selectList("datadb.rain_alldata_select");

    return all;
}

 

↓  요렇게 jsp에 반복문으로  찍어주면됨

일자별 강우량 :
<select style="width : 150px;" id="select_day">
    <cr:forEach var="ymd" items="${all}">
        <option>${ymd.today}</option>
    </cr:forEach>
</select>

select에 싹 뿌려줌

 

 

/*--------------------- select option 선택시 해당 날짜 차트만 출력  : ajax -----------------------*/

backend 에서 sessionStorage 만들어서 printwriter로 찍어주면 

front ajax에서 eval() 로 그대로 가져오기

( *주의 printwriter close if문 밖에다 쓰면 do파일 백지화면 뜸 - jquery 버그 )

 

13. mapper.xml - select query문 추가

<select id="rain_select_ajax" resultType="rainfalldao"> 
	select * from rainfall where today=#{today}
</select>
<!-- resultType : config.xml의 alias 값 -->

 

14. Controller - ajax part (ajax로 값을 전달받음)  : 선택일자의 data 가져오기

//아래 통합버전 확인 넘 헷갈림

if(sdate != null) {
    dao2 = rm.ajax_today(sdate); //해당 일자의 data를 가져오는 형태
    this.pw.print(""
            + "sessionStorage.setItem('area1','"+ dao2.area_part1 +"');"
            + "sessionStorage.setItem('area2','"+ dao2.area_part2 +"');"
            + "sessionStorage.setItem('area3','"+ dao2.area_part3 +"');"
            + "sessionStorage.setItem('area4','"+ dao2.area_part4 +"');"
            + "sessionStorage.setItem('area5','"+ dao2.area_part5 +"');"
            + "");
    System.out.println(sdate);
    this.pw.close();
}

 

15. Module - selectOne ( Controller로 값 던짐 ) 

public rainfall_dao ajax_today(String today) {
    rainfall_dao dao = tm.selectOne("datadb.rain_select_ajax",today);

    return dao;
}

 

session storage 잘찍힘 , select 바뀔때마다 바뀜

 

 

 

❗ ❗ ❗ 알아두셈 -  do와 ajax 동시에 사용(Model 사용)시    ❗ 

@GetMapping("/rainfall/rainfall_list.do")
public String rainfall_list(String sdate) throws Exception{
	this.pw.print(sdate);
    
    return "/rainfall/rainfall_list";
}
// 요런 경우
//ajax로 print로 찍은거 받아오면
success:function($data){
    console.log("${data}")	
},

=> doctype부터 ~~~ 왕창찍힘 

console 창

 

🔽 🔽  🔽  🔽   Controller에서 주는 데이터 바로 받는 형태

@Controller
m.addAttribute("message","우왕"); //Model로 보내주고

ajax 에서
success:function($data){
    console.log("${message}") //jstl 변수로 받으면 됨
},

=> 요런 방식으로 받아야 console에 보내온 값만 딱 찍힌다! 

setAttribute로 보내고 받아도 됨

backend에서 printwriter로 session storage 찍어줘도됨(-> front에서 eval()로 바로 script 때려버림) - 위 예제에서 이러케함 

 

 

/*--------------------- 결과 jsp , controller 최종.. -----------------------*/

 

16. rainfall_list.jsp  :  select=>option 선택시 ajax 로 값을 전송

<body>
    <p>
        일자별 강우량 :
        <select style="width : 150px;" id="select_day">
            <cr:forEach var="ymd" items="${all}">
                <option>${ymd.today}</option>
            </cr:forEach>
        </select> 
    </p>
    <div class="gp">
        <ul>
            <li>서울</li>
            <li>경기도</li>
            <li>세종</li>
            <li>대전</li>
            <li>강원도</li>
        </ul>
        <ul>
        <li id="box0"></li>
        <li id="box1"></li>
        <li id="box2"></li>
        <li id="box3"></li>
        <li id="box4"></li>
        </ul>
    </div>
    <br><br><br>
    <input type="button" value="강우량 등록">
    <input type="button" value="강우량 수정">
    <input type="button" value="강우량 삭제">
</body>

<script>
    $(document).ready(function(){
    	$.fn.dataload = function(ymd){ //확장함수	
    		$.ajax({
    			//현재 url에 파라미터가 붙진 않음 걍 ajax 전송하는 url
    			url :'./rainfall_list.do?sdate='+ymd,
    			cache : false,
    			dataType : "html",
    			thpe : "get",
    			success : function($result){
    				eval($result); //sessionstorage 세팅됨 (backend에서 print로 찍어줌)
    				var $a1 = sessionStorage.getItem("area1"); //storage에 저장된 값을 가져옴
    				var $a2 = sessionStorage.getItem("area2");
    				var $a3 = sessionStorage.getItem("area3");
    				var $a4 = sessionStorage.getItem("area4");
    				var $a5 = sessionStorage.getItem("area5");
    				
    				//animation 확장함수에 sessionstorage에 담긴 값 인자값으로 전달
    				$.fn.gp($a1,$a2,$a3,$a4,$a5); 
    			},
    			error : function(){
    				console.log("data error")
    			}
    				
    		});
    	}
    	
    	//backend가 생성한 storage 값을 이용하여 그래프로 출력하는 확장함수
    	$.fn.gp = function($area1,$area2,$area3,$area4,$area5){ 
	      	var $w = 0;
	        var $time = 3000;    //시간
	        var $width = $area1+"|"+$area2 + "|" + $area3 + "|" + $area4 + "|" +$area5;
	        var $ani_width = $width.split("|");
	                              
	        while($w<5){
	             var $ids = "#box" + $w; 
	             var $ani_time = $time * $w; 
	             $($ids).css({
	            	 "transition" : "2s",
	            	 "width":$ani_width[$w]
	             })        
	             $w++;
	        }
    	}
    	
    	//오늘날짜 알아오는 스크립트
    	let $jdate = new Date(); 
    	let $toString = $jdate.toISOString().substring(0,10);
    	
    	
    	//최초 접속시 오늘 날짜로 띄움
    	if($toString != $("#select_day").val()){ //오늘날짜 데이터가 없다면?
		//확장함수 호출(초기인자값 : select의 맨 마지막날짜값)
	    	$.fn.dataload($("#select_day").val()); 
    	}else{
    		$.fn.dataload($toString); //확장함수 호출(초기인자값 : 오늘날짜)
    	}
    	
    	//select 바꿀때마다 인자값 바꿔서 전달
    	$("#select_day").change(function(){ 
    		$.fn.dataload($(this).val());
    	})
    });
</script>

 

Contoller 최종

@GetMapping("/rainfall/rainfall_list.do")
public String rainfall_list(String sdate,HttpServletResponse res,Model m) throws Exception{
    this.pw = res.getWriter(); 

	//모든 데이터의 날짜 추출해서 front로 보내주는 파트
    List<rainfall_dao> all = rm.ymdlist(); //select option 반복 때리려고 모든 날짜 data 뽑아서 보내줌 
    m.addAttribute("all",all);

	//날짜별 지역별 강우량을 session storate로 세팅해주는 파트
    rainfall_dao dao2 = null;
    //do가 먼저 실행,ajax가 후발로 실행되기 때문에 최초 접속시 null 찍히는 현상 조건문으로 처리
    if(sdate != null) {
        dao2 = rm.ajax_today(sdate); //해당 일자의 data를 가져오는 형태
        this.pw.print(""
                + "sessionStorage.setItem('area1','"+ dao2.area_part1 +"');"
                + "sessionStorage.setItem('area2','"+ dao2.area_part2 +"');"
                + "sessionStorage.setItem('area3','"+ dao2.area_part3 +"');"
                + "sessionStorage.setItem('area4','"+ dao2.area_part4 +"');"
                + "sessionStorage.setItem('area5','"+ dao2.area_part5 +"');"
                + "");
        this.pw.close();
    }

    return "/rainfall/rainfall_list";
}

 

Module 최종 (Controller에게 값 전달)

package api;

//~import

@Repository("rainfalls")
public class rainfall_module {
	@Resource(name="template")
	private SqlSessionTemplate tm;

	public List<rainfall_dao> ymdlist(){
		List<rainfall_dao> all = new ArrayList<rainfall_dao>();
		all = tm.selectList("datadb.rain_alldata_select");
		
		return all;
	}
	
	public rainfall_dao ajax_today(String today) {
		rainfall_dao dao = tm.selectOne("datadb.rain_select_ajax",today);
		
		return dao;
	}
}

 

mapper는 위에서 확인 ^^,,

 

 

우왕ㅎ select 변경시 그래프 바뀜