땅콩북스프로젝트

검색시 날짜값이 null일때 매핑과 if문

나이많은 초보 2022. 11. 1. 15:03

/////////////////////////////10.31일 데이터...

지금 하는건 날짜로 검색할수 있는 부분을 코딩중!!! 날짜도 기본일테니깐 만들어봐야지...

input  type=date가 있어서 값구하기는 쉬울껏 같은데

문제는 처음에 date값이 들어오지 않을 때 즉 null 일때 mapping 어떻게 해야하는것인가????

controller에서 날짜를 어떻게 줘야하나....

요즘은 계속 date와 싸우고 있다..ㅠㅠ

//		if(csDate==null) { 
//			SimpleDateFormat sdf=new SimpleDateFormat("yy/MM/ss HH:mm:ss"); 
//			cs.setCsDate(sdf.parse("00/00/00")); 
//			System.out.println(cs.getCsDate());
//		}else {
			cs.setCsDate(csDate); 
//		}

처음에 사실 이렇게 date값을 지정하고 싶었는데 아니 먹힘다......안먹힐 줄은 알았는데 똥도 먹어봐야 하니깐ㅋㅋ

string으로 변환될때는 simpledateformat이 먹히는데 그걸 다시 date할때는 그냥 null

null을 어떻게 매핑에 연결하는냐가 나왔는데......

<if test="csMemberId.toString()!='notId' and csDate.toString()=='00-00-00'"> 했는데 아닌 것 같고
<if test="csMemberId.toString()!='notId' and csDate=='null'">

1은 어쨋든 아니고........2번도 안되고......

 

일딴 결과는 이렇게 결론이 났음당!

		cs.setCsDate(csDate);

컨트롤러에서는 어차피 null도 받고 날짜 값도 받을거라서 그냥 둔다.

/* 	$('input[type="date"]').val(); ==>	'2022-10-24' */

이렇게 받을꺼니깐~~

	  		<if test="csDate==null and csMemberId.toString()=='notId'">CS_RESULT !='N'</if>
	  		<if test="csDate!=null and csMemberId.toString()=='notId'">TO_CHAR((CS_DATE),'YYYY-MM-DD')=${csDate } AND CS_RESULT !='N'</if>
	  		<if test="csDate==null and csMemberId.toString()!='notId'">CS_MEMBERID=${csMemberId } AND CS_RESULT !='N'</if>

mapping에서 이렇게 조건을 달아줍니다....

나의 무식은 ==null에서 ' ' 자꾸 붙였다는것!    null에서는 붙일 필요가 없었다.....

간단히 해결되었음..........오라클 나빳어!!!!

 

///////////////////////////////10월31일 미완성...

 

다음날 다시보니 글 속에 이해될만 한걸 넣은게 없다.......다시 봐도 잘 모르겠다.....일단 전날에 null값을 확인하는건 매핑에서 'null'로 넣었던걸 그냥 null로 넣었더니 해결되었다가 결론이다.

근데 문제들이 생겼다...데이터가 계속 null이 아닌 것이다.

id값도 주고 받아야하고 date 값도 주고 받아야 하는데

controller에서 되면 jsp에서 안되고 jsp에서 되면 다시 controller에서 안된다....여기다 page도 하려니 돌아가시겄다.

막고 수정하고 교정하고 다시 수정하고 했더니....내가 뭐하던 중이였지~~~~~ 싶다.

일단 1차 정리 한다.....

 

1. jsp화면에서 검색은 전체/ 아이디/ 날짜 로 검색한다.

<div id="searchbtn">
			<label for="select"></label>
			<select name="chatEndList" id="select">
				<option value="all" checked>전체</option>
				<option value="id">아이디</option>
				<option value="date">날짜</option>
			</select> 
			<%-- <c:if test="${empty param.csMemberId } ">
				<input type="text" style="display:none" placeholder="ID를 입력하세요" 	>	
			</c:if> --%>
			
			<input type="text" style="display:none" >						
			<input type="date" style="display:none">				
			<button onclick="chatsearch();">검색</button>

		</div>

일단 저기서 넘어온 param값으로 뭔가 해보려고 c:if를 썼는데 결론은 아무 의미 없었다....다 삭제 !!

 

/* 검색창 display  */
	$('#select').on('change',function(){
		if($('#select option').eq(1).is(':checked')){
			$('input[type="text"]').show();
			$('input[type="date"]').hide();
		}else if($('#select option').eq(2).is(':checked')){
			$('input[type="date"]').show();
			$('input[type="text"]').hide();
		}else{
			$('input[type="text"]').hide();
			$('input[type="date"]').hide();
		}
	});
	

		var csDate=$('input[type=date]').val();
		var memberId=$('input[type=text]').val();
	
	/* 페이징  */
	function pageChatSearch(page){
	//var csDate=$('input[type=date]').prop('defaultValue'); 	
		var csDate=$('input[type=date]').val();		
		//var memberId=$('input[type=text]').val();
		var memberId="${csMemberId}";
		
		location.href="/consult/endList.kh?page="+page+"&csMemberId="+memberId+"&searchDate="+csDate;
	}
	/* 검색버튼  */
	function chatsearch(){
		var csDate=$('input[type=date]').val();
		var memberId=$('input[type=text]').val();
		if($('#select option').eq(1).is(':checked')){	
			location.href="/consult/endList.kh?csMemberId="+memberId;
		}else if($('#select option').eq(2).is(':checked')){
			location.href="/consult/endList.kh?searchDate="+csDate;
		}else{
			location.href="/consult/endList.kh";
		};
			
	}

검색창에서 뭘 선택했느냐에 따라 input이 보이게 하고 싶어서 해보고...

검색버튼이 누르면 그 데이터를 가지고 가는 것이다.

//var csDate=$('input[type=date]').prop('defaultValue'); 오론짓도 해봤다....

dafaultValue가 기본값을 가져오는건데 이러면 입력값을 못가져 와서 삭제 해부렸다.

<div class="page_wrap">
    <div class="pagination">

        <c:if test="${pm.startNavi !=1}">
            <a href="javascript:void(0);"
                onclick="pageChatSearch(${1});
                    title=" firstpage"><svg
                    fill="currentColor">
    <path
                        d="M17.59 18L19 16.59 14.42 12 19 7.41 17.59 6l-6 6zM11 18l1.41-1.41L7.83 12l4.58-4.59L11 6l-6 6z" /></svg>
                First</a>
            <a href="javascript:void(0);"
                onclick="pageChatSearch(${pm.startNavi -1});										
                    title="
                previouspage"><svg fill="currentColor">
        <path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z" /></svg> </a>
        </c:if>
        <c:forEach begin="${pm.startNavi}" end="${pm.endNavi }" var="p">

            <a class="page-active" href="javascript:void(0);"
                onclick="pageChatSearch(${p});"> <%-- 	href="/consult/endList.kh?page=${p }&memberId=${memberId}&csDate=$('input[type=date]').prop('defaultValue') "> --%>
                ${p}
            </a>

        </c:forEach>


        <c:if test="${pm.maxPage > pm.currentPage }">
            <a title="next page" href="javascript:void(0);"
                onclick="pageChatSearch(${pm.endNavi+1});"><svg
                    fill="currentColor">
        <path d="M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z" /></svg></a>
        </c:if>
        <c:if test="${(pm.endNavi %5)==0 && pm.maxPage != pm.endNavi }">
            <a href="javascript:void(0);"
                onclick="pageChatSearch(${pm.maxPage});" title="last page">Last<svg
                    fill="currentColor">
    <path
                        d="M6.41 6L5 7.41 9.58 12 5 16.59 6.41 18l6-6zM13 6l-1.41 1.41L16.17 12l-4.58 4.59L13 18l6-6z" /></svg></a>
        </c:if>
    </div>

페이징 구민이다....사실 여기서 중요한건 a링크에 처음에 그냥

href="/peanut/listStart.kh?page=${pm.endNavi+1}&memberId=${loginMember.memberId}"

넣었으나 이런형식으로 역시null처리가 어려워서 함수 넣는 걸로 바꾸기 위해 onclick으로 변환!

더불어서 저형태에서는 csDate가  null도 안되고 날짜 형식이 아니어도 안보내줬다

...사실 뒤돌아 보면 처음에 null처리가 안되서 그렇치 가능도 했을것 같다...중간에 방향성을 잃어서 못한듯.....하다보면 잡히것지.

 

<% String csDate= request.getParameter("csDate")==null?"":request.getParameter("csDate");%>

중간에 csDate땜시 이런것도 했는데....의미 없는듯.....

 

2번째 controller

null값을 어떻게 처리 하는지 열심히 검색하였다....짝꿍이 새로운걸 알려 줘서 혹시나 해서 기록을 일단 남겨둔다.

@RequestParam(value="csDate") Optional <Date> date,
@RequestParam(value = "searchDate", required = false) String csDate

if(date.ofNullable(csDate) != null) {
	//	if(csDate != null) {
//			cs.setCsDate(csDate); 
//		}else if(csDate.equals("9999-01-01")){
//			cs.setCsDate(null); 
//		} else {
//			cs.setCsDate(null); 
//		}

 

optional은 null값을 처리하는 새로운 객체인데.....검색결과 이걸로 뭔 데이터를 얻으려하면 안된다...그냥 비교만 해야한다.

중간에 9999부분에서 역시나 다시 막혀버렸다.......

나의 구세주 샘찬스 에서 요 부분은 날려버렸다.!! 혹시나 해서 일단 기록 만 남겨둔다.

 

	// 관리자가 종료건 검색 화면으로 이동
	@RequestMapping(value = "/consult/endList.kh", method = RequestMethod.GET)
	public ModelAndView endListSearch(ModelAndView mv,
			@RequestParam(value = "searchDate", required = false) String csDate,
	    	@RequestParam(value = "page", required = false) Integer page,
	    	@ModelAttribute ConsultServer cs) throws ParseException {
		Pagemarker pm = new Pagemarker();
		SimpleDateFormat smf = new SimpleDateFormat("yyyy-MM-dd");
		if(csDate != null && !csDate.equals("")) {
			cs.setCsDate(smf.parse(csDate));
		}

		int totalCount = cService.getTotalCount(cs);
		int currentPage = (page != null) ? page : 1;		
		
		pm.pageInfo(currentPage, totalCount);
		mv.addObject("pm", pm);
		
		List<ConsultServer> chatList = cService.printEndListChat(pm, cs);
		mv.addObject("chatList", chatList);
		mv.addObject("csMemberId", cs.getCsMemberId());
		mv.addObject("csDate", csDate);		
		mv.setViewName("/consult/chatEndList");
		return mv;
	}

요렇게 정리했다..

 

이제 마지막 매핑이 남았다....

여기서 문제가 남아 있다......마지막 검색창에서 입력된  ex) 2022-10-28 string값을 다시 넣어줘서 매핑으로 보내줘야 하지 않는가????

cs.setCsDate(smf.parse(csDate));

(이넘이 날 젤로 개롭힌다....뭔가 될것같은 희망만 넣어주고는 암것도 안되는 이상한넘....

정리하면서 string 으로 변환할때는 괜찮은데 이걸 다시 date화 할때는 아무짝도 쓸모없다.!!!)

.문제는 야가 다시 데이터화가 되면 줫던 형태가  아닌 .'Fri Oct 28 00:00:00 KST 2022'  요론 형태로 오는 것이다.......

이걸 다시 어떻게 비교 처리 하느냐가 남는것이다.

요까지가 어제 4~부서 다음날 오후 3시까지 한 작업이다.....

//////////////////////////////////////////////////////////////////////////////////////////////////////// 결과 두~둥!!!!!

매핑에서 내가 원하는 날짜값을 바꿀 검색이 안된다!!!!!!!!

내가 요즘 date형색땜시 폭풍검색.....까진 아니다...난 좀 느리니깐....ㅋㅋ

 

암튼 바꿀 지식검색이 안되서 포기한다...ㅠㅠ controller뒤엎기...참고로 뒤엎고 한시간만에 해결!!!

@RequestMapping(value = "/consult/endList.kh", method = RequestMethod.GET)
	public ModelAndView endListSearch(ModelAndView mv,
			@RequestParam(value = "searchDate", required = false) String csDate,
	    	@RequestParam(value = "page", required = false) Integer page,
	    	@RequestParam(value = "csMemberId", required = false) String csMemberId) {
		Pagemarker pm = new Pagemarker();
		int totalCount = cService.getTotalCount(csMemberId,csDate);
		int currentPage = (page != null) ? page : 1;
		pm.pageInfo(currentPage, totalCount);
		mv.addObject("pm", pm);
		
		List<ConsultServer> chatList = cService.printEndListChat(pm, csMemberId,csDate);
		mv.addObject("chatList", chatList);
		mv.addObject("csMemberId", csMemberId);
		mv.addObject("csDate", csDate);		
		mv.setViewName("/consult/chatEndList");
		return mv;
	}

 

근데 바꾸고 보니깐 전보다 심플해짐..ㅋㅋ

 

  	<!-- 종료 상담건 조회 -->
  	<select id="chatEndList"  resultMap="ChatResultMap">
  		SELECT * FROM CHATSERVER_TBL 
  		 	<where>
	  		<if test="(csDate==null or csDate == '') and (csMemberId == null or csMemberId == '' )">CS_RESULT !='N'</if>
	  		<if test="(csDate!=null and csDate != '') and (csMemberId == null or csMemberId == '')">TO_CHAR((CS_DATE),'YYYY-MM-DD')=#{csDate } AND CS_RESULT !='N'</if>
	  		<if test="(csDate==null or csDate == '') and (csMemberId !=null and csMemberId != '') ">CS_MEMBERID=#{csMemberId } AND CS_RESULT !='N'</if>
	  		</where>
  		ORDER BY TITLE_NO DESC
  	</select>
  		
  	<!--채팅 종료 리스트 전체 카운트 조회  -->
	<select id="chatListcount"  resultType="_int">
  		SELECT count(*) FROM CHATSERVER_TBL 
  		 	<where>
	  		<if test="(csDate==null or csDate == '') and (csMemberId == null or csMemberId == '' )">CS_RESULT !='N'</if>
	  		<if test="(csDate!=null and csDate != '') and (csMemberId == null or csMemberId == '')">TO_CHAR((CS_DATE),'YYYY-MM-DD')=#{csDate } AND CS_RESULT !='N'</if>
	  		<if test="(csDate==null or csDate == '') and (csMemberId !=null and csMemberId != '') ">CS_MEMBERID=#{csMemberId } AND CS_RESULT !='N'</if>
	  		</where>
  		ORDER BY TITLE_NO DESC
  	</select>

날짜 값이 반영될때까지 수많은 헛타이핑을 그 얼마나 해대었던가~~~~~~~~~~~~~~~~~~~~~~~손구락!!!보다 손목아프다

이제 버튼 꾸미러 값니다!!!!!! 좀 셨다가.........