반응형

boardType 변수는 String[] 타입

String[] 타입을 map에 넣었다.

String[] boardType; //checkbox 선택지 가져올 배열 생성
boardType=request.getParameterValues("boardType"); //checkbox 선택지 가져오기
map.put("boardType", boardType);

 

이 map을 파라미터로 받아서 select 쿼리를 하려고 함 

   <select id="boardTypeList"  parameterType="hashmap" resultMap="boardVo">
   		select 
   			board_type
   			,board_num
   			,board_title
   			,board_comment
   			,total_cnt 
   		from (select 
				board_num
				,board_type
				,board_title
				,board_comment
				,row_number() over(order by board_num desc) as numrow
				,count(*) over() as total_cnt
			from board
			<if test="boardType!=null">
				where 
				<foreach collection="boardType" item="arr" separator="or">
					board_type= #{arr}
				</foreach>	
			</if>
				
			)
		where NUMROW BETWEEN (#{pageVo.pageNo}-1)*10 + 1 AND (#{pageVo.pageNo})*10

    </select>


<foreach collection = "boardType" item="arr" separator="or">

collection : 전달받은 인자. List or Array 형태만 가능
item : 전달받은 인자 값을 alias 명으로 대체
open : 구문이 시작될때 삽입할 문자열
close : 구문이 종료될때 삽입할 문자열
separator : 반복 되는 사이에 출력할 문자열
index : 반복되는 구문 번호이다. 0부터 순차적으로 증가

 

 

아래 블로그의 글을 참고하였음!

java119.tistory.com/85

 

[MyBatis] 동적 쿼리 foreach문 문법 총 정리

시작하기에 앞서 참고 자료 *ibatis iterate문 지원 태그 property : 파라미터명 prepend : 쿼리로 쓰일 문자 open : 구문이 시작될때 삽입할 문자열 close : 구문이 종료될때 삽입할 문자열 conjunction :..

java119.tistory.com

 

반응형
반응형

일반/Q&A/익명/자유 중 게시글 타입(전체선택/일반/Q&A/익명/자유)을 check하여 조회하면

빨간 네모 친 부분(게시글 표시 부분)만 동적으로 바뀌도록 구현 

 

1. checked된 값을 serilalize

var $frm = $j("input[class=checktype]:checked");
var param = $frm.serialize();

 

2. AJAX를 이용하여 전송 

$j.ajax({
	    url : "/board/boardTypeList.do",
	    dataType: "json",
	    type: "POST",
	    data : param

 

3. Controller에서 getParameterValues를 이용해 파라미터를 받는다. 

controller 전체 코드는 글 마지막부분 참고

String[] boardType; //checkbox 선택지 가져올 배열 생성
boardType=request.getParameterValues("boardType"); //checkbox 선택지 가져오기
map.put("boardType", boardType);//checkbox 선택지 map에 담기 

 

4. 게시글을 List에 담고 hashmap을 통해 반환하려고함 

List<BoardVo> boardList = new ArrayList<BoardVo>(); //글 가져올 List 생성
boardList = boardService.selectBoardType(map);//pageVo와 checkbox 선택지 넘김
		
int totalCnt = 0; //totalCnt 초기화
totalCnt = boardService.boardTypeListCount(boardType); //checkbox 선택지 넘김

HashMap<String, Object> result = new HashMap<String, Object>();
CommonUtil commonUtil = new CommonUtil();
result.put("list", boardList);
result.put("totalCnt", totalCnt);
result.put("codeMap", codeMap);
String result1 = commonUtil.getJsonCallBackString(" ", result);
return result1;

 

result 해쉬맵에 담겨진 값은 JSON타입으로 view(jsp)에 반환된다.

반환되는 값은 이렇게 생김

result1 : {"totalCnt":3,"list":[{"boardType":"a04","boardNum":10,"boardTitle":"4444","boardComment":"4444","creator":null,"modifier":null,"totalCnt":3,"boardVoList":null},{"boardType":"a04","boardNum":9,"boardTitle":"3","boardComment":null,"creator":null,"modifier":null,"totalCnt":3,"boardVoList":null},{"boardType":"a04","boardNum":7,"boardTitle":"123123","boardComment":null,"creator":null,"modifier":null,"totalCnt":3,"boardVoList":null}],"codeMap":{"a02":"Q&A","a01":"일반","a04":"자유","a03":"익명"}}

 

5. result1 값을 반환받은 view(jsp)에선 그 값을 table에 뿌려주면 됨.

 success: function(data){

	//데이터를 새로 뿌리기 위해 이전 표를 지움 
	var trlength = $j('#boardTest tr').length;
	for(var t=trlength-1;t>0;t--){
	 	table.deleteRow(t);
     }
     
 	//데이터 뿌리기 
	for(var i=0;i<data.list.length;i++){
		$j('#boardTest').append("<tr><td align='center'>" 
			+ data.codeMap[data.list[i].boardType] + "</td>" +
			"<td>" + data.list[i].boardNum + "</td>" +
			"<td><a href= '/board/" + data.list[i].boardType 
			+ "/" + data.list[i].boardNum 
			+ "/boardView.do?pageNo=";  
 	}
 }

 

반응형

[전체 코드]

<javascipt > 

//게시판 글 조회 AJAX
$j("#search").on("click",function(){
	var ch = $j('input:checked').val();
	if(ch==null){
	  alert("체크 하세요");
	    return false;
	}
	
	
	var $frm = $j("input[class=checktype]:checked");
	var param = $frm.serialize();
	var table = document.getElementById('boardTest');
	
	$j.ajax({
	   url : "/board/boardTypeList.do",
	   dataType: "json",
	   type: "POST",
	   data : param,
	   success: function(data)
	   {
	     console.log(data.list.length)
	     $j('#cntbox').html("total : " + data.totalCnt);
         
	     //데이터를 새로 뿌리기 위해 이전 표를 지움 
	     var trlength = $j('#boardTest tr').length;
	     for(var t=trlength-1;t>0;t--){
	       table.deleteRow(t);
	     }

	     //데이터 뿌리기 
	     for(var i=0;i<data.list.length;i++){
		$j('#boardTest').append("<tr><td align='center'>" + data.codeMap[data.list[i].boardType] + "</td>" 
		+"<td>" + data.list[i].boardNum + "</td>" 
		+"<td><a href= '/board/" + data.list[i].boardType 
		+ "/" + data.list[i].boardNum 
		+ "/boardView.do?pageNo=" ;
	     }
	   },
	   error: function (){alert("검색실패");}
	});	
});

 

<Controller>

	//글 타입 조회 AJAX처리
	@RequestMapping(value="/board/boardTypeList.do", method=RequestMethod.POST, produces = "application/json; charset=utf8")
	@ResponseBody
	public String BoardTypeList(HttpServletRequest request,Model model) throws Exception {
		
		//page와 checkbox 선택지 담을 변수
		HashMap<String, Object> map = new HashMap<String, Object>(); 
		
		//checkbox 선택지 가져올 배열 생성
		String[] boardType; 
        
		//checkbox 선택지 가져오기
		boardType=request.getParameterValues("boardType"); 
        
		for(int i=0; i<boardType.length;i++) {
		   System.out.println("선택한 checkbox[" + i + "] : " + boardType[i] );
		}
        
		//checkbox 선택지 map에 담기 
		map.put("boardType", boardType);
		
				
		PageVo pageVo = new PageVo();
		pageVo.setPageNo(1);
        
		//pagevo map에 담기
		map.put("pageVo",pageVo); 
		
		//글 가져올 List 생성
		List<BoardVo> boardList = new ArrayList<BoardVo>();
        
		//pageVo와 checkbox 선택지 넘김
		boardList = boardService.selectBoardType(map);
		
		//totalCnt 초기화
		int totalCnt = 0; 
        
		//checkbox 선택지 넘김
		totalCnt = boardService.boardTypeListCount(boardType); 
		
		//타입 id - name 짝 map 생성
		HashMap<String, String> codeMap = new HashMap<String, String>(); 
        
		//타입 가져올 List 생성
		List<CodeVo> codeList = new ArrayList<CodeVo>(); 
        
		//타입id, 타입 이름 가져오기	
		codeList = boardService.selectCode("menu");
        
		//타입id, 타입 이름List Map에 담기
		for(int i=0; i<4;i++) {
		   codeMap.put(codeList.get(i).getCodeId(),codeList.get(i).getCodeName());
		}
		
		
		HashMap<String, Object> result = new HashMap<String, Object>();
		CommonUtil commonUtil = new CommonUtil();
		result.put("list", boardList);
		result.put("totalCnt", totalCnt);
		result.put("codeMap", codeMap);
		
		String result1 = commonUtil.getJsonCallBackString(" ", result);
		
		model.addAttribute("codeMap",codeMap);
		model.addAttribute("totalCnt", totalCnt);
        
		return result1;
	}
반응형
반응형

한글 유니코드를 이용하는 방법은 

아래 한글 가상키보드 만들기 페이지를 참고하였음! 

note.heyo.me/%ED%95%9C%EA%B8%80-%EA%B0%80%EC%83%81%ED%82%A4%EB%B3%B4%EB%93%9C-%EB%A7%8C%EB%93%A4%EA%B8%B0-1/

 

한글 가상키보드 만들기 (1) - {}.cook(c, c#, java, php, js, asm);

한글 가상키보드 만들기 한글 가상키보드를 만들기위해 간단하게 유니코드 한글에 대해서 공부해보자. 유니코드 한글 유니코드에서 한글은 1100 ~ 11FF (256) 한글 자모 3130 ~ 318F (96) 호환용 한글 자

note.heyo.me

 

대충 알고리즘은 이렇슴

* 자음, 모음 판별 함수 필요

* 자음, 모음,  겹자음&쌍자음, 겹모음이 있는 배열 변수 필요

 

1. 바로 앞에 문자가 없으면 그냥 누르는 거 출력

1. 바로 앞에 문자가 있으면 앞문자의 초성, 중성, 종성, 각각의 인덱스를 구한다. 

   1.1 앞 문자가 하나의 자음인 경우 ex) ㄱ or ㄳ or ㅆ  

   1.2 앞 문자가 하나의 모음인 경우 ex) ㅏ or ㅢ 

   1.3 앞 문자가 하나의 모음이나 자음이 아닌 경우

2.  앞 문자와 새로 입력한 문자를 고려하여 재조합하여 출력 

             1) 앞 문자가 하나의 자음 + 입력문자 자음인 경우

                 a) 앞문자 + 입력문자 = 겹자음 or 쌍자음인경우 ex) ㄱ + ㅅ = ㄳ

                 b) 앞문자 + 입력문자 = 겹자음 or 쌍자음 아닌 경우 ㄱ+ ㅂ = ㄱㅂ

             2) 앞 문자가 하나의 자음 + 입력문자 모음인 경우 

                 a) 앞문자가 겹문자인 경우 ex) ㄳ + ㅏ  = ㄱ사

                 b) 앞문자가 겹문자가 아닌 경우 ex) ㅂ + ㅏ = 바

             3) 앞 문자가 하나의 모음 + 입력문자 자음인 경우 ex) ㅏ + ㅂ = ㅏㅂ -> 걍 출력

             4) 앞 문자가 하나의 모음 + 입력문자 모음인 경우

                 a) 앞 자음 + 입력 자음 = 겹자음인 경우 ex) ㅡ+ㅣ = ㅢ

                 b) 앞 자음 + 입력 자음 = 겹자음 아닌 경우 ex) ㅓ+ㅏ = ㅓㅏ

            5) 앞 문자에 종성이 있는 경우 + 입력문자 자음

                 a) 앞 종성 + 입력 자음 = 겹자음인 경우 ex) 갑+ㅅ = 값

                 b) 앞 종성 + 입력 자음 = 겹자음 아닌 경우 ex) 갖 + ㄱ = 갖ㄱ

            6) 앞 문자에 종성이 있는 경우 + 입력문자 모음 

                 a) 앞 종성이 겹자음인경우 + 입력 모음  ex) 갉 + ㅏ = 갈가

                 b) 앞 종성이 겹자음이 아닌 경우 + 입력 모음 ex ) 간 + ㅏ = 가나

            7) 앞 문자에 종성이 없는 경우 + 입력문자 자음

                 a) 입력한 자음이 받침이 될 수 있는 경우 ex) 가 + ㅇ = 강

                 b) 입력한 자음이 받침이 될 수 없는 경우 ex) 생각해보니 이 경우는 없는 것 같다.

            8) 앞 문자에 종성이 없는 경우 + 입력문자 모음 

                 a) 앞 문자 모음 + 입력문자 모음 = 겹모음인 경우 ex) 구 + ㅓ = 궈

                 b) 앞 문자 모음 + 입력문자 모음 = 겹모음이 아닌 경우 ex) 구 + ㅏ = 구ㅏ

 

재조합한 경우 

앞문자를 지우고 재조합한 문자와 입력한 문자를 고려해 모두 출력해야 되는데 

경우의 수가 너무 많아 넘 복잡 

 

 

키보드 버튼 생성

 

자음, 모음, 겹자음&쌍자음 인덱스 

//index
var chosung_index = ["ㄱ","ㄲ","ㄴ","ㄷ","ㄸ","ㄹ","ㅁ","ㅂ","ㅃ","ㅅ","ㅆ","ㅇ","ㅈ","ㅉ","ㅊ","ㅋ","ㅌ","ㅍ","ㅎ"]; //19개
var joongsung_index = ["ㅏ","ㅐ","ㅑ","ㅒ","ㅓ","ㅔ","ㅕ","ㅖ","ㅗ","ㅘ","ㅙ","ㅚ","ㅛ","ㅜ","ㅝ","ㅞ","ㅟ","ㅠ","ㅡ","ㅢ","ㅣ"]; //22개
var jongsung_index = ["", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ", "ㄹ","ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ", "ㅁ", //28개
      "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ", "ㅋ", "ㅌ", "ㅍ", "ㅎ"];
      
var Jcombo_index=["ㄳ","ㄵ","ㄶ","ㄺ","ㄻ","ㄼ","ㄽ","ㄾ","ㄿ","ㅀ","ㅄ"]; //11개 
var Jcombo=["ㄱㅅ","ㄴㅈ","ㄴㅎ","ㄹㄱ","ㄹㅁ","ㄹㅂ","ㄹㅅ","ㄹㅌ","ㄹㅍ","ㄹㅎ","ㅂㅅ"];
var Mcombo_index =['ㅘ','ㅙ','ㅚ','ㅝ','ㅞ','ㅟ','ㅢ']; //7개 
var Mcombo=['ㅗㅏ','ㅗㅐ','ㅗㅣ','ㅜㅓ','ㅜㅔ','ㅜㅣ','ㅡㅣ'];

 

자음 모음 판별 함수 

var JM = function(char_uni){ // 글자가 자음인가 모음인가? 
	if(char_uni >= 12593 && char_uni <= 12622){
		return "J";
	}else if(char_uni >= 12623 && char_uni <= 12643){
		return "M";
	}else{
		return "";
	}
}

 

글자 출력 함수 

$j('.key').on("click",function(){
	
	//버튼 입력 값 
	var key=$j(this).val(); 
	
	//합쳐서 나올 값
	var hangeul="";
	
	// input란에 있는 값
	var text=$j('#test').val(); 
	
	
	//input란에 있는 마지막 문자
	var lasttext = text.substring(text.length-1);
	
	
	if(key==" space "){
		key=" ";
		$j('#test').val(text+key);
		$j('#test').focus();
	}
	
	else if(key=="◀-"){
		text=text.substring(0,text.length-1);
		$j('#test').val(text);
		$j('#test').focus();
	}
	else{
	if(lasttext!=""){//마지막 문자가 공백이 아닐 경우만 실행 

		//마지막 문자의 유니코드 
		var lasttext_uni=lasttext.charCodeAt(0);
	
		//1. 마지막 글자의 초성,중성,종성과 인덱스 구하기
		var chosung;
		var joongsung;
		var jongsung;
		
		var jong_idx;
		var joong_idx;
		var cho_idx;
		
		//마지막 문자가 하나의 자음만 있는 경우 
		if(JM(lasttext_uni)=="J"){
			chosung=lasttext;
			joongsung="";
			jongsung="";
		
		//마지막 문자가 하나의 모음만 있는 경우 
		}else if(JM(lasttext_uni)=="M"){
			chosung="";
			joongsung=lasttext;
			jongsung="";
			
		}else{//마지막 문자가 하나의 자음이나 모음이 아닌경우 

			//마지막 문자에서 AC00을 뺀다
			var lastchar_uni_cal = lasttext_uni-44032; 
	
			//마지막 문자의 초성, 중성, 종성의 인덱스 구하기 
			//한글음절위치 = ((초성index * 21) + 중성index) * 28 + 종성index
			jong_idx = lastchar_uni_cal % 28;
			joong_idx = (Math.floor(lastchar_uni_cal/28)) % 21;
			cho_idx = Math.floor((Math.floor(lastchar_uni_cal / 28)) / 21);
	
			//마지막 문자의 초성, 중성, 종성 구하기 
			chosung = chosung_index[cho_idx];
			joongsung = joongsung_index[joong_idx];
			jongsung = jongsung_index[jong_idx];
		
			

	
		}//마지막 문자가 하나의 자음이나 모음이 아닌경우  초,중,종 구하기 끝 
		
		console.log("마지막문자 :  " + lasttext);
		console.log("마지막 문자의 초성,index : " + chosung + cho_idx);
		console.log("마지막 문자의 중성,index : " + joongsung + joong_idx);
		console.log("마지막 문자의 종성,index : " + jongsung + jong_idx);
		//2. 방금 친 글자 모음인지 자음인지 구별 
		var key_jm = JM(key.charCodeAt(0));
		console.log("방금 친 글자 : " + key +  " / 자음모음 : " + key_jm);
	
		var str_uni;
		var key_idx;
		
		//3. 글자 재조합
		
		//앞에 자음만 있는 경우 + 자음
		if(lasttext==chosung&&key_jm=="J"){
			console.log("앞에 자음만 있는 경우 + 자음");
			var newja = chosung+key;
			
			//앞자음 + 뒷자음 = 콤보인경우
			if(Jcombo.indexOf(newja)!=-1){
				newja = Jcombo_index[Jcombo.indexOf(newja)];
					
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+newja);
				$j('#test').focus();
			
			//앞자음+ 뒷자음 = 콤보 아님 	
			}else{
				$j('#test').val(text+key);
				$j('#test').focus();
			}
			

		//앞에 자음만 있는경우 + 모음 
		}else if(lasttext==chosung&&key_jm=="M"){
			console.log("앞에 자음만 있는 경우 + 모음");
			key_idx = joongsung_index.indexOf(key);
			//앞 자음이 콤보인경우
			if(Jcombo_index.indexOf(lasttext)!= -1){
				var newja = Jcombo[Jcombo_index.indexOf(lasttext)];
				var newja1 = newja.substring(0,1);
				var newja2 = newja.substring(1,newja.length);
				console.log("앞 자음의 콤보 쪼개기 : " + newja1 + ", " + newja2);
				
				var newja2_idx = chosung_index.indexOf(newja2);
				
				var str_uni =( (newja2_idx*21) + key_idx ) * 28  + 44032;
				var str=String.fromCharCode(str_uni);
				
				hangeul = newja1+str;
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+hangeul);
				$j('#test').focus();	

			
			}else{//앞 자음이 콤보가 아닌 경우 ex) ㄱ + ㅏ  가 
				cho_idx = chosung_index.indexOf(chosung);
				var str_uni =( (cho_idx*21) + key_idx ) * 28  + 44032;
				
				var hangeul=String.fromCharCode(str_uni);
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+hangeul);
				$j('#test').focus();	
				
			}
				
		//앞에 모음만 있는 경우 + 자음
		}else if(lasttext==joongsung&&key_jm=="J"){
			console.log("앞에 모음만 있는 경우 + 자음");
	
			$j('#test').val(text+key);
			$j('#test').focus();	
		
		//앞에 모음만 있는 경우 + 모음 
		}else if(lasttext==joongsung&&key_jm=="M"){
			console.log("앞에 모음만 있는 경우 + 모음 ");
			var newchar = lasttext+key;
			
			//모음이 콤보인 경우
			if(Mcombo.indexOf(newchar)!=-1){
				newchar = Mcombo_index[Mcombo.indexOf(newchar)];
				
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+newchar);
				$j('#test').focus();	
				
			//모음이 콤보 아닌 경우
			}else{
		
				$j('#test').val(text+key);
				$j('#test').focus();
				
			}
			
			
			
			
		//3-1 이전글자 종성이 있는경우 + 자음
		}else if(jongsung!="" && key_jm=="J"){
			console.log("이전글자 종성이 있는 경우 + 자음");
			var newjong_idx = Jcombo.indexOf(jongsung+key);
			console.log(newjong_idx);
	
			//이전글자 종성 + 입력한 자음이 Combo에 있는 경우ex) 갈+ㄱ = 갉 
			if(newjong_idx!=-1){
				newjong=Jcombo_index[newjong_idx];
				newjong_idx=jongsung_index.indexOf(newjong);
				
				str_uni = ((cho_idx * 21) + joong_idx) * 28 + newjong_idx + 44032;
				hangeul= String.fromCharCode(str_uni);
				console.log("새로 조합한 문자 : " + hangeul);
				
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+hangeul);
				$j('#test').focus();	
			
			//이전글자 종성 + 입력한 자음이 Combo에 없는 경우  ex) 각+ㅇ =각ㅇ
			}else{
				$j('#test').val(text+key);
				$j('#test').focus();			
			}
			
				

		//3-2 이전글자 종성이 있는 경우 + 모음  ex) 강 + ㅏ  = 가아   값 + ㅏ + 갑 사
		}else if(jongsung!="" && key_jm=="M"){ 
			console.log("이전글자 종성이 있는경우 + 모음");
			var newjong_idx = Jcombo_index.indexOf(jongsung);
			key_idx=joongsung_index.indexOf(key);
			
			//종성이 콤보인경우			
			if(newjong_idx!=-1){
				var newjong = Jcombo[newjong_idx];
				var newjong1 = newjong.substring(0,1);
				var newjong2 = newjong.substring(1,newjong.length);
				
				var newjong1_idx = jongsung_index.indexOf(newjong1);
				var newjong2_idx = chosung_index.indexOf(newjong2);
				
				var str_uni1 =( (cho_idx*21) + joong_idx ) * 28 + newjong1_idx + 44032;
				var str_uni2 = ((newjong2_idx * 21) + key_idx ) * 28 + 44032;

				
				hangeul = String.fromCharCode(str_uni1) + String.fromCharCode(str_uni2);
				console.log("새로 조합한 문자 : " + hangeul);
				
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+hangeul);
				$j('#test').focus();	
				
			
				//종성이 콤보가 아닌경우 ex 강+ㅏ  가 아 
			}else{
				var newcho_idx = chosung_index.indexOf(jongsung);

				var str_uni1 =( (cho_idx*21) + joong_idx ) * 28 + 44032;
				var str_uni2 =( (newcho_idx*21) + key_idx ) * 28 + 44032;
				console.log(jong_idx);
				
				hangeul = String.fromCharCode(str_uni1) + String.fromCharCode(str_uni2);
				console.log("새로 조합한 문자 : " + hangeul);
				
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+hangeul);
				$j('#test').focus();				
				
			}
			
			
			
		//3-3 이전글자 종성이 없는 경우 + 자음 ex) 가 + ㅇ = 강, 가 + ㅉ = 가ㅉ
		}else if(jongsung=="" && key_jm=="J"){
			console.log("이전글자 종성이 없는 경우 + 자음");
			key_idx = jongsung_index.indexOf(key);
			
			//입력한 자음이 받침이 될 수 있는 경우
			if(key_idx!=-1){
			str_uni = ( (cho_idx*21)+joong_idx ) * 28 +key_idx + 44032;
			hangeul = String.fromCharCode(str_uni);
			
			console.log("새로 조합한 문자 : " + hangeul);
			
			text=text.substring(0,text.length-1);		
			$j('#test').val(text+hangeul);
			$j('#test').focus();	
			
			//입력한 자음이 받침이 될 수 없는 경우 
			}else{
				$j('#test').val(text+key);
				$j('#test').focus();
			}
			
		//3-4 이전글자 종성이 없는 경우 + 모음
		}else if(jongsung=="" && key_jm=="M"){
			console.log("이전글자 종성이 없는 경우 + 모음");
			var mcom = joongsung+key; // ㅜㅣ
			var mcom_idx = Mcombo.indexOf(mcom);	

			//이전글자 모음(중성) + 친 글자(모음) = 콤보인경우 ex. 구 + ㅣ = 귀
			 if(mcom_idx!=-1){

				mcom=Mcombo_index[mcom_idx];
				mcom_idx=joongsung_index.indexOf(mcom);
				str_uni = ((cho_idx*21 )  + mcom_idx ) * 28 + 44032;			 
				hangeul = String.fromCharCode(str_uni);
				console.log("새로 조합한 문자 : " + hangeul);
					
				text=text.substring(0,text.length-1);		
				$j('#test').val(text+hangeul);
				$j('#test').focus();	
				 
				//이전글자 모음(중성) + 친글자(모음) 콤보 아닌경우 ex.구 + ㅏ = 구ㅏ
			 }else{
				 console.log("이전글자 모음 + 친글자 모음 ");
				$j('#test').val(text+key);
				$j('#test').focus();
			 }
				
		}
		

	}//마지막 문자가 공백이 아닌경우 끝 
	
	else{//마지막 문자가 공백이면 
		//input란에  바로 출력
		$j('#test').val(text+key);
		$j('#test').focus();
	}
}

	
});

 

str.indexOf(char) str 배열에서 char의 index값을 반환 
String.fromCharCode(unicode) 입력한 유니코드에 해당하는 문자를 반환함
str.substring(0,str.length-1 ) str문자열에서 맨 마지막 글자를 제외하고 반환함
(시작 index, 끝 index)
str.charCodeAt(index) str문자열의 index에 해당하는 문자의 유니코드를 반환함 
Math.floor(int) 소수점 버리기 

 

끝 

졸라고생

반응형
반응형

아파치 POI 라이브러리를 이용한 VO LIST 엑셀파일로 출력하기

 

1. 라이브러리 다운

http://poi.apache.org/download.html

 

Apache POI - Download Release Artifacts

Apache POI - Download Release Artifacts Available Downloads This page provides instructions on how to download and verify the Apac

poi.apache.org

 

2. 압축 해제 및 프로젝트에 넣기

(상위에 있는 jar 파일들 포함하여 ooxml-lib, lib 하위의 jar 파일 모두 WEB-INF>lib 에 넣어주기)

3. 컨트롤러에 엑셀 출력을 위한 코드 작성

//엑셀로 출력하기
	@RequestMapping(value="/board/excelDown.do")
	public void excelDown(HttpServletResponse response) throws Exception {
		
		//게시판 목록조회
		List<BoardVo> boardList = boardService.selectAll();
		
        
		//1. 워크북 생성(생성하고자 하는 엑셀 형태에 따른 선언)
		Workbook wb = new XSSFWorkbook(); //xlsx 엑셀 2007 이상


		
		//2. 시트 생성 및 시트명 설정(매개변수를 비우면 default)
		Sheet sheet1 = wb.createSheet("test");
		
        
        
		//3. 열 너비 설정
		sheet1.setColumnWidth(0, 5500);
		sheet1.setColumnWidth(1, 5500);
		sheet1.setColumnWidth(2, 5500);
		sheet1.setColumnWidth(3, 5500);
		sheet1.setColumnWidth(4, 5500);
		
        
        
		//4.테이블 헤더 스타일 지정
		CellStyle headStyle = wb.createCellStyle();
			//데이터 가운데 정렬
		headStyle.setAlignment(HorizontalAlignment.CENTER);
			//경계선
	   	headStyle.setBorderTop(BorderStyle.THIN);
	   	headStyle.setBorderBottom(BorderStyle.THIN);
	   	headStyle.setBorderLeft(BorderStyle.THIN);
	   	headStyle.setBorderRight(BorderStyle.THIN);
	   		// 배경색은 연두색
	   	headStyle.setFillForegroundColor(HSSFColorPredefined.LIGHT_GREEN.getIndex());
	   	headStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
	
    
		
		//5. 헤더 생성
		Row row = null;
		Cell cell = null;
		int rowNo = 0;
		
		row = sheet1.createRow(rowNo++);
		
		cell = row.createCell(0);
		cell.setCellStyle(headStyle);
		cell.setCellValue("boardType");
		
		cell = row.createCell(1);
		cell.setCellStyle(headStyle);
		cell.setCellValue("boardNum");
		
		cell = row.createCell(2);
		cell.setCellStyle(headStyle);
		cell.setCellValue("boardTitle");
		
		cell = row.createCell(3);
		cell.setCellStyle(headStyle);
		cell.setCellValue("boardComment");
		
		cell = row.createCell(4);
		cell.setCellStyle(headStyle);
		cell.setCellValue("Creator");
		
        
        
        
		//6. 테이블 바디 스타일 지정
		CellStyle bodyStyle = wb.createCellStyle();
			//데이터 가운데 정렬
		bodyStyle.setAlignment(HorizontalAlignment.CENTER);
			//경계선
		bodyStyle.setBorderTop(BorderStyle.THIN);
		bodyStyle.setBorderBottom(BorderStyle.THIN);
		bodyStyle.setBorderLeft(BorderStyle.THIN);
		bodyStyle.setBorderRight(BorderStyle.THIN);
		
        
        
        
		//7. 데이터 부분 생성
		for(BoardVo vo : boardList) {
		row = sheet1.createRow(rowNo++);
			
		cell = row.createCell(0);
		cell.setCellStyle(bodyStyle);
		cell.setCellValue(vo.getBoardType());
		
		cell = row.createCell(1);
		cell.setCellStyle(bodyStyle);
		cell.setCellValue(vo.getBoardNum());
		
		cell = row.createCell(2);
		cell.setCellStyle(bodyStyle);
		cell.setCellValue(vo.getBoardTitle());
		
		cell = row.createCell(3);
		cell.setCellStyle(bodyStyle);
		cell.setCellValue(vo.getBoardComment());
		
		cell = row.createCell(4);
		cell.setCellStyle(bodyStyle);
		cell.setCellValue(vo.getCreator());
		
		}
		
        
        
		//8. 컨텐츠 타입과 파일명 지정
		response.setContentType("ms-vnd/excel");
		 response.setHeader("Content-Disposition", "attachment;filename=test.xlsx");

		//9. 엑셀 출력
		  wb.write(response.getOutputStream());
		  wb.close();
		

 

출력 예시

setColumnWidth에서 너비 5500을 줬을 때

단위가 뭔지는 모르겠음. . . 

반응형
반응형

테이블의 행 번호 구하기

테이블의 행번호는 0부터 시작

tr의 번호를 구하는것 

 

테이블 한 행의 코드

<tr>
	<td height="300" align="center">
		Comment<br>
        <input type="button" value="행 지우기"  onclick="deleteRow(this)">
	</td>
	<td valign="top">
		<textarea name="boardVoList[0].boardComment"  rows="20" cols="55" id="boardComment0" maxlength="499">${board.boardComment}</textarea>
	</td>
</tr>

 

this를 함수로 넘겨서 index를 구한다.

 

테이블 행 인덱스 구하는 script

function deleteRow(obj){

 	alert($j(obj).parent().parent().index());
	alert(obj.parentNode.parentNode.rowIndex);
	var tr=$j(obj).parent().parent();
	
	//tr.prev().remove();
	//tr.prev().remove();
	//tr.remove();

}

함수에서 넘겨받은 인자 obj = input(button)객체

obj.parentNode = td객체

obj.parentNode.parentNode = tr객체

 

jQuery의 경우 index()를 사용,

javascript의 경우 rowIndex()를 사용한다.

반응형
반응형

 

1. github > repositories 에서 new 를 통해 repository를 하나 생성한다.

 

 

 

생성이 되면 URI를 복사해둔다.

 

2. 이클립스에서

Window > Perspective > Open Perspective > Other > Git

> Clone a Git Repository

아까 복사해둔 respository 주소를 붙여넣는다.

 

난 Branches가 없어서 아무것도 안 나옴.

이 부분은 정확히 뭔지 잘 모르겠음. Next

 

3. 로컬에서 코드를 저장할 디렉터리 경로를 넣는다.

로컬 repository에 소스가 commit되고 git에 올라가는 걸로 알고있음

git hub의 repository가 이클립스에 생겼다.

잎사귀를 눌러 작업중인 내 Spring 프로젝트가 있는 페이지로 돌아간다.

 

4. 프로젝트 이름 우클릭 > Team > Share Project

타입은 git 선택

repository 경로를 선택

완료가 되면 내 스프링 프로젝트 폴더에 ?가 붙은것이 보이는데 

5. 프로젝트 우클릭 > Team > Add to index , 이어서 Commit

add to index하면 ?가 사라짐

Commit을 누르면 아래 메뉴가 보이고 업로드 시 보일 메시지도 넣을 수 있음 

아래 메뉴는 이클립스에서 ctrl+shift+3 으로 호출 가능 

 

 

완료되면 Github의 Repository에 업로드 되어있는 걸 볼 수 있음 

 

반응형
반응형

JSP Form에서 VO가 여러개로, 즉 list로  넘기고 controller에서 받아야 하는 경우

List를 사용하면 됨

 

1. VO객체

BoardVo 클래스 안에 List<BoardVO>를 선언하고 getter와 setter도 만들었음!

public class BoardVo {
	
	private String 	boardType;
	private int 	boardNum;
	private String 	boardTitle;
	private String 	boardComment;
	private String 	creator;
	private String	modifier;
	private int totalCnt;

	
	private List<BoardVo> boardVoList;
	

	
	public List<BoardVo> getBoardVoList() {
		return boardVoList;
	}
	public void setBoardVoList(List<BoardVo> boardVoList) {
		this.boardVoList = boardVoList;
	}
	
	

 

2. JSP의 Form 

name은  List객체이름[index].property 이름 

<form:form commandName="boardVo" class="boardWrite" action="/board/boardWriteAction.do">
		<select name="boardVoList[0].boardType" >
				<c:forEach items="${codeList}" var="list">
				<option value="${list.codeId}">${list.codeName}</option>
				</c:forEach>
		</select>
 <input name="boardVoList[0].boardTitle" type="text" size="50" value="${board.boardTitle}"  maxlength="24">

 

반응형

 

 

3. Controller

파라미터를 전달받을땐 List가 아닌 Vo로 받음

//글등록 수행
	@RequestMapping(value = "/board/boardWriteAction.do", method = RequestMethod.POST)
	@ResponseBody
	public String boardWriteAction(Locale locale, BoardVo boardVo) throws Exception{
	
		
		HashMap<String, String> result = new HashMap<String, String>();
		CommonUtil commonUtil = new CommonUtil();
		int resultCnt = 0;
		
		System.out.println(boardVo.getBoardVoList().get(0).getBoardType());
		System.out.println(boardVo.getBoardVoList().get(0).getBoardTitle());
		System.out.println(boardVo.getBoardVoList().get(0).getCreator());
		
		
		resultCnt=boardService.boardInsert(boardVo);

List에 담긴 값(프로퍼티) 호출 시에는

Vo이름.get리스트이름().get(index).get프로퍼티()

 

4. Service Impl

List를 호출할 때는 vo이름.getlist이름().get(인덱스) 해서 사용하면 됨!

@Override
	public int boardInsert(BoardVo boardVo) throws Exception {
		
		int[] results= new int[boardVo.getBoardVoList().size()];
		int result=1;
		
		for(int i=0; i<boardVo.getBoardVoList().size();i++) {
			results[i]=boardDao.boardInsert(boardVo.getBoardVoList().get(i));

			result *= results[i];
		}
		
		return result;
	}
반응형
반응형

메소드에 @ResponseBody를 추가해주고,

이런식으로 script를 포함한 string을 return 해주면 댐

반응형
반응형

 

에러 내용

심각: 경로 []의 컨텍스트 내의 서블릿 [appServlet]을(를) 위한 Servlet.service() 호출이, 근본 원인(root cause)과 함께, 예외 [Request processing failed; nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [java.util.List]: Specified class is an interface]을(를) 발생시켰습니다.

 

컨트롤러에서 파라미터를 List 형태로 명시했는데 ArrayList로 고치면 해결됨 

List는 인터페이스라 그렇슴 

수정 전

 

수정 후

반응형
반응형

StringTokenizer 사용 시 발생 

 

반복 한 번 할 때 nextToken을 두 번 써서 그렇습

 

 

없애버리니까 잘 됨 

반응형

+ Recent posts