Spring

Spring_ MVC 구현 + jstl 실습예제 [스압주의]_22.07.07(day04)

양빵빵 2022. 7. 7. 14:41

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의 확장 클래스 생성

 

 

 

====== 내일 이어서 다시...