url 에서 경로 안보이게 처리 하기.
join에 접속하면 reg-form에 접근 하도록 처리 하기
요 경로에 있는 reg-form.jsp 에 접근하도록 join 서블릿 만들기
/reg_form.jsp 로 수정 해야합니다.
== reg_process.jsp 처리 하기
-> html 태그가 없으므로 views에서 이 jsp는 삭제
상대 경로로 설정하기 / url에서 결과 확인
컨트롤러 만들기
-- 회원가입하기 mvc버전 처리 완료
== mvc버전 으로 회원목록 보기 처리 하기
jsp로 처리 할때 html 처리는 편한데 자바 코드 작성은 힘들고
package com.spring.webmvc.chap01.controller;
import com.spring.webmvc.member.model.Member;
import com.spring.webmvc.member.repository.MemberRepository;
import com.spring.webmvc.member.repository.MemoryMemberRepo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/members")
public class MembersServlet extends HttpServlet {
private MemberRepository repository = MemoryMemberRepo.getInstance();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//회원 정보를 서버에서 html을 렌더링하여 응답
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/html");
PrintWriter w = resp.getWriter();
w.write("<!DOCTYPE html>\n");
w.write("<html>\n");
w.write("<head>\n");
w.write("<meta charset='utf-8'>\n");
w.write("<title>회원 목록 보기</title>\n");
w.write("<style>label { display: block; }</style>\n");
w.write("</head>\n");
w.write("<body>\n");
// 회원 한명 정보당 li태그 하나씩 만들 것임
w.write("<ul>\n");
// 회원의 수에 따라 작성되는 li의 수가 달라짐. 동적 HTML
// 회원 목록을 저장소로부터 받아와야 함.
List<Member> memberList = repository.findAll();
for (Member member : memberList) {
w.write("<li>\n");
w.write(String.format("회원번호: %s, 아이디 : %s, 이름" , member.getUserNum(), member.getAccount(), member.getUserName()));
w.write("</li>\n");
}
w.write("</ul>\n");
w.write("</body>\n");
w.write("</html>\n");
}
}
서블릿으로 할때는 html 작성이 어려웠는데
mvc코드로 하면 어떻게 될까 ......?
리스트에 회원정보 저장까지는 처리가 됐고 보여줘야 하는데
jsp에 members 데이터를 어떻게 보낼까?
보여줘!!
forward 를 쓸때 request가 운송 수단이 된다.
데이터가 jsp에 전달된것 까지 확인 되었다.
데이터를 jsp파일에서 html 로 화면으로 출력 될수 있도록 하기.
jsp에 자바코드를 태그화 해서 써야지~
===== jstl 실습예제======
먼저 blah 서블릿과 blah.jsp 를 통해서 자바에서 추출한 데이터가 jsp에 연동되는 것을 예시로 확인해 보겠습니다.
서블릿 setAttribute 로 등록했던 데이터가 jsp에 읽힌 것을 확인 할 수 있다. "안뇽하세요~"
서버 재실행 했을 때 이상 잘 실행 된 것을 확인 할수 있다.
소스에도 자바 코드는 보이지 않는다.
- 다시 한번 실습. 서버에서 온 숫자 100 이라는 데이터 가지고 오기
- 다시 한번 실습. 서버에서온 리스트 데이터 가지고 오기
list.toString 했을 때 처럼 웹브라우저에 출력 된다.
jsp 에서 ${ } 안에서 메서드 활용 가능한 것 확인.
== jsp에서 리스트의 반복문 처리 [jstl]
== for 문으로 돌렸지만 페이지소스 보기로 했을 때 자바 언어가 보이지 않는 것을 확인 할 수 있다.
fori문 실습
== if문 실습
== else if 문 실습
=== jstl 실습 종료 ===
다시 MVC로 돌아와서 데이터를 넣어서 회원목록을 출력해보자.
아까 추출해놨던 mList 데이터를 활용 하여 html에 출력 되도록 코드 작성
코드 작성 완료!
웹에서 서버 접속 했을 때 예상했던 대로 잘 나온다.!
============================================================
* MVC Model 2 Architecture
- 모델2 구조는 웹 브라우저의 요청을 하나의 서블릿이 받으며 서블릿은 그 요청을 알맞게 처리한 후, 그 결과를 보여줄 JSP 페이지로 포워딩합니다.
하나의 서블릿으로 리팩터링..... [프론트 컨트롤러 패턴]
3개의 서블릿으로 나눠서 처리하던 것을 하나의 서블릿으로 만들도록 하겠습니다.... 왔다갔다 헷갈리당
v1 패키지에 FrontControllerV1 클래스 만들기
유일한 서블릿을 만들겠다. 모든 요청을 다 처리할 것임.
모든 요청이 들어온 것을 확인 로그를 볼 것.
===
FrontController 서블릿이 무슨 요청인지 구분을 해야 하는데 어떻게 할까?
/mvc/v1 으로 시작하는 모든 요청을 처리 하는 것으로 수정.
그래도 요청을 구분해서 처리 해야 하는 건 변함이 없다.
1. 프론트컨트롤러 서블릿은 요청 정보로 구분한다.
요청 정보를 받는 객체
URI로 요청 정보를 확인 할수 있는 것을 확인했다.
요청 받은 정보 확인 하도록 코드 작성 후 로그 확인
= # 요청 정보 확인이 되는 것을 확인 했다. 진입점에서 처리할 업무를 뿌려줄 것이다.
# 하위 컨트롤러에 대한 인터페이스를 만들어주자.
== 회원가입 입력 / 회원가입 처리 / 회원목록 조회 // 3개의 요청을 처리할 클래스가 필요.
구현체 만들기
서블릿이 아닌 클래스로 구현체를 만들었다.
index.html 수정 후
테스트 실행
실행 문제 없다. 서블릿을 하나로 실행 한 결과 이상이 없다.
=========================== 여기서 끝이 아니다! ㅠㅠㅠㅠ =========================================
// 어떤 나쁜놈이 주소창에 아무렇게나 입력해서 서버요청을 실행했을 때...
status = 500 : JAVA 코드 에러
// 예외 처리를 해서 에러 방지
if(controller == null) {
resp.setStatus(404); // 404 : page not found
return;
}
404는 주소창에 잘못 입력되어서 발생한 에러
500은 자바 코드에 문제가 있어서 발생한 에러 [ 주의! ]
=========== 윽.. v2 버전
v1 버전에서 중복 코드 리팩토링 하기
테스트 완료.
==========================
1. 서블릿에 대한 종속성 해결
2. 경로 문제 (경로 수정시 각 코드마다 수정해야하는 번거로움)
V3 로 리팩토링.............
=========================
// 요청 파라미터를 전부 읽어서 하위 컨트롤러들에게 보내줌
57번 행에 View view = controller.process(req, resp); -> req, resp 에 Map을 넣어주기로 하였다.
쿼리 파라미터가 무엇인지 정확히 알아야 한다.
파라미터란... 서버에 전송하기 위해 입력된 값??
맵의 주소값이 출력 되었다.
parameterNames : 파라미터의 키값들만 뽑아서 컬렉션에 담아준다. [Enumeration]
ex) food, hobby, age
parameterMap :....?
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// 요청 파라미터(query parameter)를 전부 읽어서 하위 컨트롤러들에게 보내줌
// key: 파라미터의 key, value: 파라미터의 value
Map<String, String> paramMap = new HashMap<>();
Enumeration<String> parameterNames = req.getParameterNames();
while (parameterNames.hasMoreElements()) {
System.out.println(parameterNames.nextElement());
}
while(parameterNames.hasMoreElements()) {
String key = parameterNames.nextElement();
String value = req.getParameter(key);
paramMap.put(key, value);
}
System.out.println("paramMap = " + paramMap);
????
메서드로 만들어서 리팩터링 했을때 여러 사람들이 알아보기 쉽게 구분 ↑
모델처리와 뷰를 통 합 시키려고 한다.
view의 확장 클래스 생성
====== 내일 이어서 다시...
'Spring' 카테고리의 다른 글
Spring_ MVC 구현 [마지막 버전] [스압주의]_22.07.08(day05) (0) | 2022.07.08 |
---|---|
Spring_ MVC 구현 [V3버전 마무리] [스압주의]_22.07.08(day05) (0) | 2022.07.08 |
Spring_ JSP 직접 접근 차단_22.07.07(day04) (0) | 2022.07.07 |
Spring_ JSP MVC [이론] + sendRedirect / forward _22.07.07(day04) (0) | 2022.07.07 |
vsCode html.json 간편한 설정 (0) | 2022.07.06 |