목표
매개변수를 전달해서 해당하는 매개변수에 대한 정보만 불러오는 상품 상세페이지를 작성한다.
select * from where prd_id=${prd_id}
상황
매개변수 전달하는 부분까지는 코딩이 되었는데 이것을 어떻게 넘겨받는지에 대해서는 이해가 부족하다.
따라서 게시판 상세보기 화면에서 글번호의 매개변수를 어떻게 넘기는지와, 어떻게 받아오는지에 대해서 공부한다.
-
클라이언트 이벤트 이동 시 발생한 매개변수를 통해 쿼리문 실행하는 과정
1. client 측에서 페이지 이동 발생 시 : retrieve.do?num=<%=num%>으로 매개변수 전달
2. RetrieveActionController.java에서 request.getParameter("num")으로 매개변수 받아온 뒤 이를 BoardDAO의 retrieve함수에 해당 매개변수 전달
3. BoardDAO를 상속받은 SqlMapBoardDao에서 받아온 매개변수를 sql 구문(Board.xml)에 사용
4. Board.xml에서 넘겨받은 매개변수를 사용하여 sql 구문 실행한 뒤 board타입으로 리턴
-
처리된 쿼리문을 받아오는 방법
1. SqlMapBoardDao에 메서드로 작성되어있음(list라는 id를 가진 sql 쿼리 구문을 sqlgetsession을 통해서 실행하는 메서드임)
2. 이를 SqlMapBoardDao의 부모 클래스인 BoardDAO의 메서드로서 가져오는 것 (List list=BoardDAO의객체인dao.list())
상황
Detail.jsp의 내용은 쿼리문을 통해서 가져오지 않았고 바로 dao로부터 가져왔다는 것.
해당 상품의 id값을 매개변수로 받아 쿼리문을 실행하고 실행된 쿼리문의 값을 가져와야한다.
1. main.jsp
ㄱ. 페이지 이동 링크에 해당하는 컨트롤러 작성 (DetailSfController.java)
ㄴ. 매개변수로 Sf_prd_id를 전달
<a href="toSf.do?prd_id=<%=Sf_prd_id%>">Sf상품으로 이동</a>
/추가/ 2. board-servlet에서 toSf.do로 요청이 들어올경우 요청에 따른 콘트롤러 지정
<bean name="/toSf.do" class="controller.DetailSfController">
<property name="dao">
<ref bean="detailDAO" />
</property>
</bean>
2. DetailSfController.java
ㄱ. getParameter하여 매개변수 받아옴
ㄴ. 해당 매개변수를 DetailDAO에 넘겨줌
ㄴ-E : List형을 DetailDAO형으로 변환 못한다는 에러가 나와서 DetailDAO로 형변환하였음. ▶ 4-E에서 sql쿼리 값을 가져올 때부터 형변환을 하니 필요가 없어졌다.
3. DetailDAO
ㄱ. Sf항목을 보여주는 메서드 작성 (Mf, Lf도 함께 작성한다)
ㄱ-1. 이 때 매개변수로 (String prd_id)를 받는다.
ㄱ-2. 자료형을 DetailCommand로 준다.
4. SqlMapDetailDao.java
ㄱ. 3-ㄱ의 메서드를 오버라이딩.
ㄴ. id값은 "Sf"로 한다. (Mf, Lf)
ㄷ. ("id"값, 매개변수명)
4-E : 오브젝트형을 DetailDAO형으로 받을 수 없다는 에러 메세지가 나와서 (DetailDAO)(DetailCommand)로 형변환하였다.
5. Detail.xml에서 4번의 매개변수를 받아서 처리하는 sql구문 Sf, Mf, Lf를 작성한다.
ㄱ. where id="id" 부분에서 매개변수 부분을 #{Mf_prd_id}로 바꾼다.
MainActionController에서
----
6. DetailSf.jsp에서 DetailCommand.java(DTO)를 임포트한뒤 그대로 내버려두어도 괜찮은가?
1) 그대로 내버려둔다? Detail.xml의 쿼리문 id="Sf"를 통해서 값을 가져오는 방법
ㄱ. 그 뒤 aft_board로부터 where prd_id="Sf"인 게시글들을 로드해와 게시판을 만들어야한다. ▶
문제
1.자료형 때문에 문제가 생긴 것 같다.
2.MainActionController에서 매개변수를 받아야한다는 에러가 발생? 그러나 메인 페이지에서는 매개변수를 받을 필요가없다.
원인
1.DetailCommand와 DetailDAO를 햇갈려서 적었다 멍청 ㅠㅠ
2.list를 뿌려주는 쿼리문과 상세페이지를 뿌려주는 쿼리문을 같이 사용하려고 했기 때문.
해결
2. list를 뿌려주는 쿼리문을 별도로 작성한다. main을 위해서
ㄱ. DetailDAO.java에서 추가
ㄴ.SqlMapDetailDao.java에서 ㄱ의 추가사항을 오버라이드
ㄷ.Detail.xml에서
ㄹ.MainActionCommand.java에서
ㅁ.main.jsp에서 list를 통째로 받아오게된다.
list의 내용이 존재하는 한, 계속해서 로드한다.
while문이 돌아가는 동안 div를 만들어서 title의 값을 뿌려주게된다.
그런데 버튼을 클릭했을 시, 그 버튼의 매개변수 값으로는 해당하는 id의 값이(Sf btn onclick > Sf prd id값이 넘어가야함) ▶ 어떻게하지?
가설1) 일단 prd_id를 넘어가게 한뒤, DetailSf 컨트롤러에서 prd_id값 중에서 Sf를 찾아낸다.
가설2) main.jsp에서 if문을 사용하여 prd_id값이 Sf인것만 골라서...
잠깐!글번호 넘어가는 것과 구조는 동일하지 않은지?
<td><a href="retrieve.do?num=<%= num %>"><%= title %></a></td>
아하 그냥 prd_id로 넘기면 되는구나. 그러면 while문이 작동되는 동안 해당하는 값의 prd_id가 계속해서(내 경우에는 3개) 로드되므로 알아서 해당 값이 넘어가게된다!
▶ while문을 사용해서 div를 계속해서 로드하는 구조를 작성하면된다.
▶ 일단짰고 성사여부는 내일 확인.
11/11 prd_list가 null떨어짐
1.DetailActionController삭제
2.board-servlet.xml에서 DetailActionController사용하는 부분 삭제
3.MainActionController의 List prd_list=dao.prd_list();에서 에러 발생
Error querying database. Cause: java.lang.IllegalArgumentException: Mapped Statements collection does not contain value for prd_list
prd_list에 적합한 값을 가지고 있지 않다.
prd_list를 관여하는 부분을 살펴보도록한다.
1.DetailDAO 확인
2.SqlMapDetailDao확인
3.Detail.xml확인 ▶id값이 list였음. prd_list로 수정함.
오류 해결
11/11 prd_list가 null떨어짐.
1. MainActionController부분은 모두 잘 작동(main 1,2,3,4)
2. MainActionController에서 Dao의 setter메서드는 잘 작동됨.
3.어디에서 null이 떨어지는지 확인해봄.
main.jsp에서 null이 떨어짐
4. main.jsp 파일 확인
1.▼이부분에서 null이 떨어지는 것인데 생각해보니 당연함. index_main.jsp에서 요청하는 것인데 그 때 매개변수를 넘겨주지 않기 때문임. getAttribute할 것이 없단 소리. 그렇다면 어디서 전달해주는것인지?
2. 일단 main.jsp와 연결되는 부분은 MainActionCotroller.java밖에 없으므로 확인해봄.
▼addObject에 id값을 거지같이 준 것을 찾음
▼수정했다.
5. 재실행 성공!
해결하게 된 추론
공부한 내용
더 이해가 필요한 부분
BoardDAO에서 자료형의 기준이 되는 것이 무엇인지?
어떤 것은 List로 받고 어떤 것은 BoardCommand로 받는 이유가 무엇인지..
생각해볼 때 레코드가 통째로 필요한 것은 BoardCommand를 사용하는 것 같음? 일부분만 필요한 것은 List로 받아와서 일부만 받아오는 것 같구..
List : 레코드 여러개
BoardCommand : 필드 여러개
Integer, String ... : 필드 한개
반환형이 있는 건 select
반환형이 없는건 insert update delete
'X 1인웹개발' 카테고리의 다른 글
[MW] db 칼럼 분류 (2) | 2025.08.05 |
---|---|
가정과 사무실에서 프로젝트를 이어서 작업하는 경우 db연결에 주의할 사항 (0) | 2020.11.10 |
20/11/7 집 컴퓨터와 연동하기 (0) | 2020.11.08 |
20/11/5 1.상품 상세 페이지에 db 레코드를 뿌리려 할 때 classcastexception 발생 (0) | 2020.11.08 |
20/11/4 2. 상품 상세 페이지에 db 레코드를 뿌리려 할 때 classcastexception 발생 (0) | 2020.11.08 |