1.  비밀번호가 아닌 것같았음....역시나 로그인 안되서 수정하여 다시 올림....

2. 그래도 안됨. 

 

DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2 
DEBUG SMTP: Using mechanism LOGIN
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN failed

로그를 자세히 보니 이런 글귀가 있음...메커니즘을 이용하여 로그인을 시도하였으나 안된다는 말........뭐지??ㅋㅋ

 

https://velog.io/@daydream/ReSeller-Project-Spring-Mail-AuthenticationFailedException-%ED%95%B4%EA%B2%B0

이분의 글과 함께 보니 

구글 이메일 작업을 할때 2단계인증만 해서는 안되고 앱 비밀번호 등록해서 이...앱 비밀번호를 받아야 한다...노출하면안됨!!!

그걸 propertice파일로 가서.

여기 뒤에다 이메일 로그인 비밀번호가 아니라 이 앱 비밀번호를 입력하면 에러없이 발송이 된다....

요로게롬 잘 ~~~~~~ 왔다~!! 

 

참고로 코드 정리!!!

 

 

 

 데이터 전송에는 여러 경우가 생기는데 이번에 했던거 또 하게되어서 기억겸 정리!!

1. form 양식에는 summit버튼만 누르면 name만으로 잘 controller에 전송이되는데 할꺼냐 말꺼냐 confirm할경우에 버튼의 속성을 summit아니고 단순 button으로 했더니 잘가던 네임값이 전송이 안되어서 추가했다. 

 

 

function  fn_detailUser(){
    if(confirm(name + "님의 정보를 삭제하시겠습니까? 취소불가합니다.")){
        let form = $("form");
        var action_mode = $("<input>").attr("type", "hidden").attr("name", "action_mode").val("delete");

        form.append(action_mode);
        form.submit();
    }
}

 

 

2. form결과를 후속처리를 해야한다....이럴경우.ajax을 써야하기때문에 양식변경한다.

if(confirm(name + "님의 정보를 수정하시겠습니까? ")){
    var queryString = $("form").serialize() ;
    queryString += "&name=yourName&action_mode=modify"
    $.ajax({
        url: '/admin/user/goUserAction.do',
        type: 'POST',
        data: queryString,
        dataType: 'json',
        success(result){
            console.log("result : ", result);
        },
        error(e){
            console.log(e);
            alert("에러 발생! 잠시후에 재시도 요망");
        }
    });
}

 

 

 

 

 

 

글쓰기는 textarea....에서 했는데

불러오기를 하니......줄바꿈이 안되었다.

난 엔터치며 입력했는데 데이터 불러올때는 엔터 안먹힘...이런 황당한일이....

검색하니 br/을 먹게 해라...&#10; 을 넣어라...등등이 있는데

좀더 검색하니...c:out을 통해 할수 있는방법이 있었다...

<참고로 textarea로 입력한걸 div로 불러오면 엔터 반영안된다...table 디자인때문에 div로 바꿘것이 원인.....>

이미 DB에 입력한걸 /n을 변경하는 것보다  jsp에서 그냥 반영하여 출력하는게 훨씬 편한듯하여

그방법으로 수정하니 한방해결!!!!!

<td >
	${view.content }								
</td>

이부분을 이렇게 수정했다..

<td>
    <textarea ><c:out value="${view.content }"/></textarea>								
</td>

참고로 프로젝트상 부트스트랩을 사용하여 textarea에서 스타일이 따로 있기에 cols, rows 생략....

잊지 않으려고 기록!!!

까먹으면 검색하려고 저장~~^^

 

사실 잘 이해 가지 않는 부분인데...일단은 정리 해놓고 다음에 다시 또 보려고 합니다.

이걸 공부하게 된 계기는

제가 메인//// 메뉴////본문////이렇게 3부분의 jsp파일로 화면 구성을 했고

그중 메인에만  js파일을 넣어서 스크립트를 꾸렸더니

문제는 어쩌다 본문한개를 콜백으로 화면 변경하여 데이터를 불러 왔더니 js가 안먹히는 겁니다.

아무것도.....그 어떤것도.......왜그런줄 몰랐는데 초고수님 말씀!!!

자바스크립트는 순차적으로 로딩~~~메인의 자바스크립트는 이미 불러왔는데 이후 불러온 본문jsp파일을 읽고 처리할 스크립트 적용 처리 없이 그냥 불러오니 이미 적용된 메인의 js가 안먹힌다......였어요..

 

그래서 메인의 js파일에서 본문의 b.jsp파일을 함수로 불러오면 먹히겠금 구성하였는데

그럼 파일을 다시 불러올때 불필요한 가비지 데이터가 생긴다.......... 사실 이부분도 어렵습니다...일단 기록!

이걸 해결하는 것이 클로저!

클로저란 ? 내부 함수가 정의 될 때 외부 함수의 환경을 기억하고 있는 내부함수를 말함/ 외부 함숴 안에서 선언된 내부 함수는 그 외부 함수의 지역 변수나 함수에 접근하여 사용할 수 있음.

 

클로저 함수의 기본 형태.

//외부 함수
function closuer(){	      
    var count = 0;           //변수 정의
    
    function inner(){       // 내부 함수(클로저)선언
    	return count++;
    }    
    return inner();         // 내부 함수 반환
}

//익명 함수를 이용하는 방법
function closure(){
	var count = 0;
    return function(){      //익명 함수(클로저) 반환
    	return count++;
    }
}

클로저 함수 호출 예시

function outter(){   	//외부 함수
	var data = 1;
    function inner(){	//내부 함수
    	return data;
    }
    return inner();
}

var fucnt = outter();
console.log(func)

값은 1이다.

원래는 outter 함수를 호출하지 않았기 때문에 지역변수 data는 사용하지 못하는 것이 일반적이지만  자바스크립트에서는 사용할수 있다는 것이 특이한 점이다.

또한 전역 변수를 대체하여 클로저를 사용할 수 있어서 전역 변수의 남용을 막을 수 있고 변수 값을 은닉하는 용도로도 사용 할 수 있다.

 

어휘적 환경(Lexical Environment)

function makeAddr(x){
	return function(y){
    	retrun x+Y;
    }
}
const add3 = makeAdder(3);  //x = 3
console.log(add3(2));		//5 ;; y = 2  add함수가 생성된 이후에도
									상위함수인 makeAdder의 x에 접근(기억)
                                    
const add10 = makeAdderA(10);	//x = 10
console.log(add10(5));			//15
console.log(add3(1));			//4

add10과 add3은 다른 환경의 함수임으로 결국 결국 두 함수의 x 의 값은 다르다.

하지만 x의 값을 값자기 100이나 99 변경할수는 없다....add함수의 증감만 있을 뿐....이것을 은닉화!... 인것 같다^^

 

 

https://link.coupang.com/a/MtaVw

 

홈플래닛 고급형 알루미늄 노트북 거치대(쿨링홀 + 높이 각도 조절)

COUPANG

www.coupang.com

 

검색은 확실히 정신을 바~앗짝 ! 차리고 해야한다.....안드로메다로 가출하는 정신을 데리고 오느라 너무 힘들다...

1. 검색어 빈칸에 enter만 치면 메세지 없이 그냥 메인 가는거 정상 수정하기

2. 체크박스 값이 여러개 조건에 맞춰서 검색하기

3. 체크박스 없이 검색에 맞게만 또 조회하기...

4. select 옵션에 맞게 또 검색하기......

 

여긴 if문의 전쟁이다.........

검색의 검색...확인의 확인을 거쳐 탄생한~~~~~

<div class="form-body">
<div class="form-group">
        <div class="col-md-11 border-left-0">
            <div class="row">						
                <div class="d-inline-block custom-control custom-checkbox col-md-2">
                    <input type="checkbox" class="form-check-input"
                        name="colorCheck1" id="check11" value="t1"> <label
                        for="check11">답변대기중</label>				
                </div>

                <div class="d-inline-block custom-control custom-checkbox col-md-2 ">
                    <input type="checkbox" class="form-check-input"
                        name="colorCheck1" id="check12" value="t2"> <label
                        for="check12">처리완료</label>
                </div>
                <div class="d-inline-block custom-control custom-checkbox col-md-2 ">
                    <input type="checkbox" class="form-check-input"
                        name="colorCheck1" id="check13" value="t3"> <label
                        for="check13">게시중지</label>
                </div>
            </div>
        </div>
    </div>				
    <div class="form-group last">
        <div class="col-md-12 border-left-0">
            <div class="row">
                <div class="col-md-3">
                    <select id="projectinput2" name="interested3"
                        class="form-control">
                        <option value="none" selected>구분전체</option>
                        <option value="a">제목</option>
                        <option value="b">내용</option>									
                    </select>
                </div>
                <div class="col-md-6">
                    <div class="d-flex align-items-center justify-content-start">
                        <input type="text" id="userinput2" class="form-control"
                            placeholder="검색어를 입력해주세요." name="">
                        <input type="text" style="display:none;">
                    </div>
                </div>
                <div class="col-md-3">									
                     <button type="button" class="btn btn-primary" onclick="admin_qna_search();">
                                      <i class="fa fa-check-square-o"></i> 검색
                     </button>
                </div>
            </div>
        </div>
    </div>
</div>

앞서서  input 1개일때 검색하면 메인으로 후다닥 가버린다.... form 으로 진행할 때 input이 한개이면 그렇다는 검색 결과!////그냥 hidden으로 input 하나더 만들어 준다.

function admin_qna_search(){
    var qna_checked=$('input:checkbox[name="colorCheck1"]:checked').val();
    var qna_s_option = $("#projectinput2 option:selected").val();
    var qna_search = $('#userinput2').val();
    var url = '';

    if(qna_s_option =='none'){
        $('#userinput2').val('');
        url="mg/board/getBoardList.do?s_board_code=QNA";
    }else if(qna_s_option =='a'){
        url="mg/board/getBoardList.do?s_board_code=QNA&s_subject="+qna_search;		    	
    }else if(qna_s_option =='b'){
        url="mg/board/getBoardList.do?s_board_code=QNA&s_content="+qna_search;
    }
    var chkArr=[];
    $('input:checkbox[name="colorCheck1"]:checked').each(function(){
        var chk=$(this).val();
        chkArr.push(chk);
    })

    if((chkArr.indexOf('t2') > -1) && (chkArr.indexOf('t3') > -1)){ 
        url +="&s_reply_yn=Y&s_use_yn=N";

    }else if((chkArr.indexOf('t2') > -1) && (chkArr.indexOf('t3') < 0)){
        url +="&s_reply_yn=Y&s_use_yn=Y";

    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') > -1) && (chkArr.indexOf('t3') > -1)){

        url +="&s_reply_yn=N&s_use_yn=N";
    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') > -1) && (chkArr.indexOf('t3') < 0)){  
        url +="&s_reply_yn=N&s_use_yn=Y";

    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') < 0 ) && (chkArr.indexOf('t3') > -1)){

        url +="&s_use_yn=N";
    }else if((chkArr.indexOf('t2') < 0 ) && (chkArr.indexOf('t1') < 0 )&& (chkArr.indexOf('t3') < 0)){

        url +="&s_use_yn=Y";
    }


    qna_Start(url); 
}

 $('#userinput2').on('keyup',function(key){

        if(key.keyCode==13) {
             var str = $('#userinput2').val();
             if(str==null || str ==""){
                 alert("소분류선택 후 검색어를 입력하세요");
             }else{
                 admin_qna_search();
             }
        }
    });

더 잘 하실 수 있는 분들이 많으시겠지만...오늘의 난 여기가 최선입니다...!! 응원해주세요...^^

 

https://link.coupang.com/a/MtaVw

 

홈플래닛 고급형 알루미늄 노트북 거치대(쿨링홀 + 높이 각도 조절)

COUPANG

www.coupang.com

 

일단...왜그런지 몰라서...다른 에러는 빨간줄도 뜨고 에러창도 뜨고 난리인데 야들은 그러지도 않으니깐 제껴뒀다.

살짝궁 무시하고 넘어가다가.....결국은 tester에 걸렸다.ㅋㅋㅋㅋㅋ

당연한건데 개무시 하고 있었던 것이다...내영혼에...^^

일단 내가 한 작업은 공지사항과 QNA이다.....미친듯이 힘든것 없을것이다....

내가 초보라서 이야기가 다를 뿐^^

난 엔터치면 어디가라고 주문한적이 없는데 지멋대로 막간다.......에러 표시도 없다...못봤나???? 글적.....

아무튼 수정하라고 지시사항이 떨어져서 수정한다....하라면 해야지.....영혼이 "거봐~~~~~~~" 그런다..ㅋㅋㅋ

 

1. 지맘데로 메인가는거

form에 input가 하나인데 submit하면 그런다고 한다......이것의 해결방법은 은근 간단//이유는 알수없어 변경할수 있는 방법보다는 간단한 방법으로 그냥 해결

<input type="text" style="display:none;">

요거 한줄 넣으니깐 간단히 해결////메인으로 안간다...

 

2.새로고침되버린다.

$(document).ready(function () {
   구현코드
  }

이런것도 넣어보고 했는데  ..결론은

<input type="text" id="userinput2" class="form-control"
    placeholder="검색어를 입력해주세요." name=""
    onkeypress="if(event.keyCode=='13'){event.preventDefault();}">

이거였음.......onkeypress="if(event.keyCode=='13'){event.preventDefault();} 한줄 넣으니깐 내가 넣은 코드가 먹힘...^^

아싸 가오리~~~~~~아!!!옛날 사람!!!!ㅠㅠ

공지사항에 첨부파일을 진행하려고 하는데....기존에 배웠던 form으로 한번에 하는게 아니라

먼저 파일을 id화 하고 그 id를 먼저 받은 다음 그다음에 주내용을 공지사항으로 저장 시키는 것이다.

파일 보내는 건 멀티 파일......멀티파일 전송에 대한건 다음에 공부.......^^

<table id="user_data_table" class="table table-striped table-bordered data-custom-button">						
    <tr>
        <td class="col-md-2">제목</td>
        <td class="col-md-10"><input type="text" name="subject"  class="form-control"></td>
    </tr>
    <tr>
        <td>첨부파일</td>
        <td><input type="file"  id="file_in" name="file"></td>
    </tr>

일부만 발최함........ 첨부파일을 저장시 먼저 임시 id를 얻어야 해서 ajax로 진행

 

var formData = new FormData($('form[name=noticeForm]')[0]);
	   formData += $("form[name=noticeForm]").serialize();
		
		$.ajax({
			type : 'post',
			url : 'mg/board/goBoardInfoPop.do',
			enctype : 'multipart/form-data',
			data : formData,
			processData: false,
			contentType:false,
			cache: false,
			timeout: 600000,
			success : function(data){		
				alert('공지사항을 등록하였습니다!');
				Notice_write(data);
			},
			error : function(e){
				alert('파일 등록 실패하였습니다.');
			}
		});   
	}

html form을 대체하는 FormData객체///// jsp본문의 form과는 별개이다.

이걸하면서 몇가지 필요한 함수 더 확인해 본다.

let formData = new FormData(); // 새로운 폼 객체 생성
formData.append('name','hyemin'); // 폼 데이터를 스크립트로 추가
formData.append('item','hi'); // <input name="item" value="hi"> 와 같다.
formData.append('item','hello'); // <input name="item" value="hello">

// 만일 HTML에 미리 form 태그가 있으면 제이쿼리나 자바스크립트로 가져올 수도 있다.
let formData1 = new FormData($("#form Id")); // 제이쿼리인 경우
let formData2 = new FormData(document.getElementById("form Id")); // 자바스크립트로 가져 올 경

formData.append(name, value)
// - form의 name 과 value 를 필드의 추가
// - input의 name 속성과 value 입력값 역할을 한다고 생각 하면 된다.
// 자바스크립트로 직접 form 태그를 생성

 
formData.append(name, blob, fileName)
// - input 의 type 이 'file' 인 경우에 사용
// - fileName은 file의 이름의 해당
 
formData.delete(name)
// - 주어진 name 으로 필드를 제거
 
formData.get(name)
// - 주어진 name 의 해당 하는 필드 value를 반환
 
formData.getAll(name)
// - append 함수로 추가시 name이 중복 가능
// - 따라서 주어진 name 의 해당 하는 필드의 모든 value를 반환
 
formData.has(name)
// - 주어진 name 의 해당하는 필드가 있을 경우 true, 없으면 false를 반환
 
formData.set(name, value)
formData.set(name, blob, fileName)
// - set 함수는 append 함수 처럼 필드를 추가
// - append와 비슷한 set 메소드는 set도 추가를 해주기는 하지만, 기존 key가 있으면 그 key값을 모두 덮어씌워버린다

https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-FormData-%EC%A0%95%EB%A6%AC-fetch-api

 

[JS] 📚 FormData 사용법 & 응용 총정리 (+ fetch 전송하기)

FormData API 보통 서버에 데이터를 전송하기 위해서는 HTML5 의 폼 태그를 사용해 다음과 같이 메뉴를 구성하여 제출 해본 기억들이 있을 것이다. 아이디 비밀번호 성별 남자 여자 응시분야 영어 수

inpa.tistory.com

이분글을 참조하여 정리하였습니다.

이클립스 버전 새로 설치하고 어찌저지 작업 파일 받고 딱하니 일을 하려하니

view의 jsp파일이 안열리고 빨란x 표시만 뜬다....이게 뭐냐냐.....

SSE core task scheduler startup' has encountered a problem 에러...

java.lang.noclassdeffounderror: com/ibm/icu/util/stringtokenizer.....

 

 

https://stackoverflow.com/questions/73817318/sse-core-task-scheduler-startup-problem-in-eclipse

 

SSE core task scheduler startup problem in eclipse

Whenever I'm launching my eclipse IDE with my project workspace, there is one popup window showing some internal error with the task scheduler. I'm attaching the picture of that popup window here. ...

stackoverflow.com

한시간 검색해서 찾아난 귀한 분^^

정말로 버전이 달랐다.....

help -> install new software 가서 버전 업글하니 해결^^

 

 

+ Recent posts