상세 컨텐츠

본문 제목

74일 - POJO에서 model 만들어서 전달하는 방법 2가지 (ModelAndView, Model model //직접 포워딩은 하지 못한다는거), tiles.xml 집중화(*)

수업 일지/Spring

by NayC 2021. 6. 4. 09:34

본문

728x90

다른 결과물들도 (edit, reg,..) 합치는 작업을 해보자.

 

간단히 data 이용하는 방법을 봐보자.

 

 

예전에는 리퀘스트로 보냈는데, 지금은 중간에 뭐가 끼어져있음. 

- 예전 방식은 모델 심어서 포워딩 해주는 

 

지금은

POJO는 포워딩 못함

포워딩은 서블릿끼리만 가능

그래서 프론트 컨트롤러 -> POJO 가면 -> view로 포워딩을 못함

 

그래서 포워딩 해달라고 POJO가 부탁해야함

- 그래서 request에 담을 필요 없음

출처 : JH님

 

POJO에서는 model 만들어서 주면 됨

- 그럼 프론트 컨트롤러가 view 단에 포워딩 해준다. 

 

POJO -> 스프링에 전달 방법 

1) 반환값 이용해서 return 

- 예전에는 모델, 뷰 정보 받아서 반환했었음

근데 클릭하면 detail로 안넘어가고 오류남

 

detail 페이지를 만들어보자.

- 정-말 <mian>만 남기고 다 지우기 

 

컨트롤러에서 url 맵핑해보자

 

이건 선생님거

 

// 

 

이제 tiles를 쓰자.

- 어제는 list만을 위한 이름이었음

현재는 오직 list만을 위한

detail을 위한 이름은 어떻게 줄까! 

-> 패턴을 만들어보자

 

별을 여러개 올 수 있는데, 순서로 활용 가능

9. 첫 번째 별의 값 ~ 이렇게 사용 된 것

중괄호임

 

나는 57번째줄에서 "WEB-INF/..." 이런식으로 '문서'를 호출해줘가지고 계속 이전 페이지 모습이 나왓었음 

- 잘 실행해준거지

근데 우리는 지금 뭘 하는 중이야? 

tiles한테도 detail 페이지 페이지 하라고 일을 주라는거지

 

// 

 

reg.jsp도 main만 남기고 다 지우기

 

reg 페이지 정상적으로 나올 수 있도록 

-> NoticeController에 수정하기

 

어제 한 예제 때문에 저 인자를 지워줘야 제대로 나온다 :) 


사실 ModelAndView 만드는 방법 .. 요즘은 다른거로

이거 최종 완성본 아님. 아래 사진 보기! 

 

모델

리턴하지 않고 반환하는 방법도 있다. 

 

Pojo 안에서

변수 선언 가능 Model model 

- 객체 만든게 아니라 선언만 한건데...! 

  프론트 컨트롤러가 모델 만들어서 전달함

 

프론트 컨트롤러가 -> 참조 만들어서 pojo한테 전달

- 참조된거로 값을 받으면

저절로 값은 프론트 컨트롤러가 가진..

 

요지는 변수 선언만 하면 된다. 

L 이전 위에 방법. R 다른 방법

모델 정보는 이렇게 26번째

 

뷰 정보는 45번째

 

// 이렇게 많이 쓴다. 

 

'글쓰기' 페이지에서 -> '목록'을 가려면


한 단계 더.

 

tiles 쓸 때 * 두 개 올 때의 상황.

 

admin 폴더 아래 notice 뿐만 아니라 event 폴더도 존재하지.

여기에 별을 줘보자!

//

 

만약 앞의 admin도 다르게 하고 싶다면? 

Q. 만약 admin이 아니라 일반 사용자 url이라면?

-> 따로 만들어줘야

이러면 큰 일남

 

3단계짜리 오면 R의 위에거로 매칭됨

- *이 몇 개냐로 매칭되는게 아님

이렇게 이상한 url들도 다 걸려버리게 되는 것

-> 엉망징창 됨

 

범위가 넓은 녀석은 아래로 내려야 함! 

//

 

Q. admin의 index는? 

- 애는 tiles를 어떻게 써줘야 하나

admin index는 위에거로 매칭 되어야 하는데 ㅠ (admin의 레이아웃을 줘야 하니)

아래거로 매칭되서는 또 엉망징창

-> 별도로 적어준다. 

대신 특화된 녀석은 반드시 위에! 

 

그런데 하다보니 member가 또 등장.

admin, member 레이아웃 다른 상황

 

흠... index 하나 때문에 이렇게 따로 적어줘야하다니..

-> 그렇다고 앞에를 *로 묶고.index로 해주면 안 됨

 

-> 반복을 줄여보는 방법을 알아보자.

 

만~약에 layout이 admin, member가 같다면 (내용은 다르지만 구조가 같다면)

-> layout은 모~든 사용자가 사용가능한게 되서 

    공통 레이아웃 정의해서, root에다가 레이아웃 하나만 있으면 되겠지. 그리고 name="common"이라고 해보자. 

   aside, main은 다르다고 하고 2개만 두면

- 아래쪽에서 extends "common"하면 됨 

근데 이건 layout이 같을 경우! 

 

//

 

우리는 extens 안할거니까 이거로
이렇게. 이게 틀리거 고친 버전

순서 


ex) 관리자 공지사항에서

뭘 클릭하면 제목이 떠야

 

layout에서 

12번째줄에서 제목이 오는것

detail 페이지 내용을 가지고 12번째줄을 바꿔야

저기 동그라미 부분을 바꾸고 싶은 것

 

// 먼저 적용하는 것부터 알아보자. 

 

레이아웃에서 뭘 바꾸려고 한다면 tiles.xml 거를 가지고 바꾸는거지

 

// 무식한 방법ㅎㅎ 

자바스크립트도 이렇게 할 수 있지~~ 

 

js 수정 전 

Q. JS 없는 것들은 이렇게 오류가... (페이지는 잘 나오더라도)

-> 위에처럼 js 가져다가 쓴 건 매우 무식한 방법

아까는 src="<tiles...>" 이렇게 있었었지.

 

//

 

Q. js 파일 없을 경우 포함되지 말아야

-  비관적인 얘기지만 그럴 방법은 없다. 그냥 넣는것. 

- js 없을 때는 그냥 (console)에 404 뜨게 방치하는 수밖에 없다.

 

//

 

Q. 제목으로 들어오는 title이 사용 중. 근데 문제는 "제목"이라고 박혀있는걸 사용중이지.

NoticeController 가기

- 모델을? tiles.xml로 보내줄 수 있음

원하는거 뽑아 쓸 수있음

 

Q. 근데 NoticeController에서가 아니라 Event에서 값을 가지고 오고 싶다면??

-> R은 패턴 쓰는 곳인데 저렇게 적으면 안되는

R은 저렇게

 

대신 L에서 줄지 말지 결정하도록 해야함. 가능함!

- 제목을 넘겨야할 페이지에서는 넘기고, 안넘길 페이지는 안넘기면 됨

 

detail 페이지에서는 제목 심어주고 나머지 페이지는 필요없음을 확인

 

대신 제목 안 주면, tiles에서 제목 안 받으면 기본값으로 뭘 줘야할지도 추가해줘야하고.

+ 추가로 필요한 라이브러리가 있음

 

${title} 이렇게 나오는게 우선 정상

// 라이브러리 하나만 추가해주면 된다. 

 

R이 정상화면

이걸 누르면 목록이 촤~악 떠야지 다운받아진거...

나 어제 다운 안받아졌나보다 ㅜㅜ

 

dependencies

> tiles 검색 > org.apache... 가 공신력 있음 - el 라이브러리 추가 > 그럼 저절로 pom 에 추가가 된 것을 볼 수 있음

서버 재시작

 

cf) 근데 지금 라이브러리 너무 많아서 그런지 자꾸 다운됨

R에서 맨 아래거 우클릭해서 메모장으로 열어서 > 맨 아랫줄 지워주면 됨

- 저 의미는 : 설치된거 모두 한 번씩 훓어보라는(?) 거라서. 

 

 

 

 

 

 

 

 

 

 

 

 

 

cf) 이전 tiles 코드

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN"
       "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
  <definition name="*.*.*" template="/WEB-INF/view/{1}/inc/layout.jsp">
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/{1}/inc/aside.jsp" />
    <put-attribute name="main" value="/WEB-INF/view/{1}/{2}/{3}.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>
</tiles-definitions>

 

728x90
반응형

관련글 더보기