본문 바로가기

웹개발 수업정리

6_컨트롤러에서 데이터 넘기는 방식 4가지(Map, EgovMap, String, VO)

컨트롤러에 welcomeWebTable, welcomeWebMap 이름으로 li태그 추가.

 

jsp 파일을 복사해서 welcomeWebTable.jsp를 만들고 테이블을 지워준다.

그리고 controller에서 welcomeWebInit을 복사해서 welcomeWebTable, welcomeWebMap 두 개를 만든다.

 

 

tr, 즉 어떤 한 줄을 클릭했을 때 alert창이 뜨도록 한다.

 

빨간 부분을 리터럴이라고 한다.

이벤트 로딩메서드 안에 이벤트 클릭을 만들어서 타겟잡아서 alert(1)을 뜨게 해준다.

 

다음으로는 내가 클릭한 row에 이름을 출력하려고 한다면?

 

현재 this는 tr이다. 이름은 tr 아래에 td에 들어있다.

내가 클릭한 이름을 출력하려고 하기 때문에 시작지점은 this로만 시작이 가능하다.

여기서의 this는 tr이다. this는 리터럴이 아니다. 

this안에 자식 표현하고 싶어서 > 를 사용해서 할 수 없다. 그것은 리터럴에서만 가능하다.

꺽세랑 똑같은 역할이 children()이다.

내가 클릭한 tr의 자식들이 td가 잡힌것이다. 모든 td(컬럼)가 잡힌 것이다.

 

문제!

내가 클릭한 로우에 이름을 userNm이란 키에 담아 Controller에 welcomeWebMapInit메서드에서

userNm키의 값을 sysOut으로 찍어주세요.

 

- form 태그 안에 input태그를 생성해서 userNm이라는 id와 key(name) 이 있는 input태그 생성한다.

 

 

 

leftChk.pageSubmitFm("welcomeWebMap");

이 문자열을 보낸 이유는?

매개변수를 보내야 하는데 left.jsp에 클릭한 li의 부모의 id를 보내주어야 하는데 여기에선 클릭해서 보내질 논리적 주소가 없기때문에 이 부분에 적어주어야 한다.

pageSubmitFn에서 주소를 보내는 역할을 하는데 

거기서 문자열에 .do를 붙여서 논리적주소를 만들어주기 때문이다.

 

 

제이쿼리를 변수에 넣어서도 사용이 가능하다.

 

이 부분을 변수 $obj로 변경하면 아래쪽도 변경하면 된다.

변수명이 중요하다.

저 빨간 부분을 td라는 요소이다. 요소란 객체라고 할 수 있다. 그래서 변수명을 obj라고 했다.

$를 붙이면 변수안에 제이쿼리 객체가 들어간 것 을 알 수 있다.

제이쿼리의 요소를 넣어줄때는 변수명 앞에 $를 붙여준다.

 

현 상황에선 이렇게 만들면 안된다.

이유는 변수에 값을 담는 목적은 이 변수가 두 번 이상 쓰일 때를 대비해서 만든다.

이 변수는 한번만 쓰일것이기 때문에 원래는 안만들어도 된다.

 

WelcomeWebMap

1.

 

2. SQL 파일에서 위의 select 전체를 복붙하고 id를 변경해준다.

   그리고 key는 스트링, 값은 어떤것이 들어올지 몰라서 object   

   parameterType은 데이터를 map으로 값을 받기 때문에 map으로 적어준다.           

 

 

 

mybatis 는 where 문이 <where> / 안에 if문은 jstl에 if문과 동일하다.

맵을 안넘겼을 때 if문을 들어가지 않기 때문에 8줄 나오고 맵을 넘기게 되면 한 줄만 나온다.

(여기서 안넘겼을 때 라는 것은 줄을 누르지 않았을 때를 말한다. 한 줄을 선택하는 순간 where 문을 타서 

 

 

userNm이라는 키 명만 넣으면 값이 빠진다.

 

 

WelcomeWebEgovMap

1. EgovMap은 Map과 같이 put으로 값을 넣어준다. 

            똑같이 인스턴스화를 시켜주고 egovMap을 Mvc작업할 때 적어준다. 

            아래와 같이 이 부분만 변경시켜주면 된다.

2. 파라미터 값이 egovMap이기 때문에 변경해준다. parameterType을 지워도 실행은 된다. egovMap을  map으로 변경해도 실행은 된다. 이유는 mybatis는 기본적으로 String, map, 이런것들을 알아서 찾기 때문에. 하지만 가독성이 좋아지려면 적어주는게 좋다.

 

parameterType을 map으로 변경하면 카멜케이스로 변경되지 않는 키의 컬럼들만 데이터가 나온다.

egovMap으로 pararmeter를 보내면 카멜케이스로 변경되는데 map으로 하기 때문에 콘솔창에 sysout으로 출력해보면 카멜케이스로 키 값이 변경이 안되있는것을 확인할 수 있다.

 

 

 

 

 

 

null이 나오는 이유?

egovMap은 user_nm이라는 키를 userNm인 카멜케이스형식의 키명으로 변경해준다.

그래서 null이 나온다. userNm

 

 

 

카멜케이스 형식으로 sysout을 찍어보면 제대로 출력되는 것을 확인 할 수 있다.

 

 

EgovMap 방식에서 key값 2개 넘기기.

 

user_id 라는 키값에 hanq를 값을 넣어준다.

이렇게 추가를 했다라는 것은 if문을 하나 더 추가 해줘야 한다는 것이다.

 

이렇게 추가하면 에러가 나는데 

그 이유는 

쿼리로 만들어보면 where A.user_nm = '한석현' where A.user_id = 'hanq' 이기 때문에 

두가지 조건을 다 거치게 되면 and가 없다는 것을 확인할 수 있다.

 

그래서 and를 적어주고 실행하면 된다.

 

이렇게 하게 되면 오류는 해결이 된다. 

그런데 전제조건이 userNm을 주석처리하게 되면 

if문 2개 중 두번째 것만 타게 되는 것을 말한다.

 

실행해보면 실행이 된다. 두번째 if만 타게하게 되면 

 

이렇게 결과값이 나오게 된다.

이유는 mybatis에서의 where태그는 and가 붙어있으면 처음 실행될 때 and이던 or이던 지워준다.

 

 

where and 가 될 것 같지만 알아서 where를 지워준다.

 

 

 

where 태그 안쓰고 where로만 쓰면 where and로 오류가 난다.

 

 

<where> 쓰지 않고 

where 1 = 1 로 적어주면 무조건  true이다. 그 다음부터는 무조건 and만 읽는다.

그래서 where라는것은 없애버리고 계속 and만 붙게끔 만들어주는 것이다.

 

 

String

 

  1.  

2.

String 변수하나 선언해서 userNm을 담아서 sysout찍어 본 것이다.

 

String 변수 자체를 넘겼다.

 

 

sql을 보면 parameterType이 String으로 된다.

 

 

그리고 

위에서 아래 모양으로 변경해준다.

 

_parameter라고 적는것이 표준이다.

parameterType에는 _parameter로 적으면 안된다. 

where태그 안에서 _parameter를 사용할 때 대신 value를 사용해도 된다.

(userNm과 같은 값이 오게 되면 sql에러가 난다.)

 

parameterType="String"

 if태그가 없다면 어떤 키네임이 와도 상관없다.

 

 

결과값을 int로 받는 경우.

int 형으로 받으면서 데이터가 여러줄이 아닌 한줄이기 때문에 info로 적었다.

resultType을 Int 로 적어주면 1또는 2가 반환된다.

 

 

console창에 ageInt가 찍히는 것을 볼 수 있다.

 

integer로 받는 경우.

 

 

 

 

resultType이 int일때와 integer 일때의 차이.

주로 integer를 많이 사용한다. 

 

int로 할 때는 인트로 받는 결과값을 정수형으로 그대로 사용하고 싶을때.

integer는 그 안에 클레스안에 메서드를 사용하고 싶을 때 integer로 받으면 되는데

int로 받아도 integer로 변환하면 된다.

integer보다는 int로 사용하는 것이 좋다. 

이유는 int가 기본형이고 속도적인 면에서 좋다.

 

vo로 넘기기(Value Object)

 

vo는 서비스 폴더에 살고있다. class파일이다.

초기값이 필요한 경우에 사용한다.

예를 들어 페이징 처리할 때 초기페이지가 1페이지여야 한다. 0이나 null없다.

무조건 초기값은 페이지 1이다. 이것을 초기값이라고 하는데 이렇게 초기값이 있어야 할때 vo사용한다.

 

이전페이지 다음페이지 를 하려고 하면 이전페이지 초기값 1, 

페이징 처리를 할 때 꼭 필요한 변수들이 있다. 이전페이지담을 변수, 다음페이지 담을 변수, 현재페이지 담을 변수 등등..

row수 (한 화면에 10줄을 보여준다고하면 rows라는 변수가있다면 초기값이 10)

초기값을 가져야하는 변수를 사용할 때 vo를 사용한다.

 

userNm이라는 필드를 하나 만든다.

 

우클릭해서 getter and setters 를 선택하고 userNm 체크하고 ok.

 

 

 

private String userNm; 부분에 데이터를 저장하는 것이다.

그리고 그 아래에 getUserNm(), setUserNm() 으로 데이터를 넣고 빼고 하는 것이다.

이 모양을 캡슐화라고 한다.

 

left.jsp에서 li 태그를 추가하여 VO메뉴를 하나 만든다.

 

 

위의 단계까지만 하면 콘솔에 찍히지 않는다.

 

 

응용

vo로 보낸것을 받아서 받은것을 Map에 넣는다. 그리고 Map으로 보내서 스트링으로 받게 되는데 그럼 또 스트링으로 넣는다. 

 

 

 

 

'웹개발 수업정리' 카테고리의 다른 글

7_@RequestParam, hashMap, modelMap  (1) 2020.05.03
5_sql  (0) 2020.04.30
3_form 태그  (0) 2020.04.30
2_타일즈2(tiles)  (0) 2020.04.13
1_타일즈1(tiles)  (0) 2020.04.07