나의 수업일지

인천 일보 아카데미 43일차 -1- 프로젝트 다시 만들기 / Model 알아보기 / Model - 객체를 출력 / Model - List를 출력

GUPING 2023. 4. 23. 22:19
  • 1. 프로젝트 만들기

    1. project name: spring_02
    2. base-package: com.icia.ex2

 

 

인천 일보 아카데미 42일차 -1- IntelliJ - Spring Framework 프로젝트 만들어보기

IntelliJ 를 사용하여 Spring Framework -프로젝트 만들어보기 IntelliJ에서는 스프링 부트 프로젝트 자동생성은 지원하기 때문에 말들기 정말 쉽지만 스프링 프라임워크는 자동 생성을 지원하지 않습니

guping.tistory.com

 

 

 

 

  • 2. 주요 동작 

        1. 모든 요청은 HomeController에서 처리함 
        2. 프로젝트 시작하면 index.jsp 출력 

 

 

  • 3. index.jsp

1. hello1.jsp를 출력하기 위한 링크 있음(요청주소: /hello1)
2. hello2.jsp를 출력하기 위한 버튼 있음(요청주소: /hello2)

 

 

  •         4. hello1.jsp

1. index.jsp로 가기위한 링크 있음 

 

 

  • 5. hello2.jsp

1. 버튼을 클릭하면 js 함수로 /hello-param1 로 이름과 나이 파라미터를 전송한다. 

 

 


2. 전송된 값은 HomeController 메서드에서 콘솔에 출력한다.

 

실행 결과

여기까지가 전날 배운 내용의 실습입니다

 

 

  • Model - 사용해보기

Model은 스프링 프레임워크에서 제공하는 인터페이스입니다

 

사용 문법

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@controller
public class HomeController {
    @GetMapping("/hello3")
    public String hello3(Model model){
        Model을 매개변수로 받아 사용합니다
        String s1 = "안녕하세요";
        출력하고 싶은 문자열을 s1에 넣어주었습니다
        model.addAttribute("m1",s1);
        m1로 속성이름을 설정하고 s1을 속성값으로 view에 넘겨줍니다
        return "hello3";
    }
}

hello3에는 안녕하세요라는 문구가 없지만

${m1}로 model에 받아온 값을 출력했습니다

이렇게 Model에 담긴 값을 꺼내 출력할때는 ${속성이름} 을 사용합니다

 

요약 :

Model은 Controller에서 매개변수로 가져와 사용한다

model.addAttribute("속성이름",속성값); < 값을 넣음

${속성 이름} < model의 속성값을 출력

 

 

  • Model - 응용 객체 출력

StudentDTO 객체를 만들고 객체에 담긴 값을

Model을 사용하여 객체에 담긴 값을 출력해봅시다

 

사용 문법

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
    @GetMapping("/hello4")
    public String hello4(Model model){
        StudentDTO studentDTO = new StudentDTO();
        studentDTO객체를 만들었습니다
        studentDTO.setId(1L);
        studentDTO.setStudentName("학생1");
        studentDTO.setStudentNumber("12341234");
        set메소드를 사용하여 정보를 넣어줍니다
        model.addAttribute("student",studentDTO);
        Model 인터페이스로 student라는 속성이름에 속성값으로 객체를 담습니다
        return "hello4";
    }
}

요약

    <h3>학생정보</h3>
    학번: ${student.id}<br>
    이름: ${student.studentName}<br>
    학번: ${student.studentNumber}<br>
    객체로 담았을 때 객체안의 필드 이름으로
    각각 출력이 가능하다
    
    한방에: ${student}
    Model로 담은 속성이름만 작성하면
    한번에 모든 값이 출력된다

 

 

  • Model - 응용 List 출력
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {

    private StudentDTO newStudent(int i){
        StudentDTO studentDTO = new StudentDTO();
        studentDTO.setId((long)i);
        studentDTO.setStudentName("학생"+i);
        studentDTO.setStudentNumber("1111110"+i);
        return studentDTO;
        특정 학생의 정보를 담는게 아니기 때문에
        사용하기 쉽게 메소드로 만들었습니다
    }

    @GetMapping("/hello5")
    public String Hello5(Model model){
        List<StudentDTO> sList = new ArrayList<>();
        StudentDTO를 담는 ArrayList를 만들어줍니다
        
        for (int i = 1 ; i<=10 ; i++){
            sList.add(newStudent(i));
            위에서 만든 메소드를 이용하여
            i가 1씩 증가하며 리스트에 저장됩니다
        }
        model.addAttribute("sList",sList);
        Model 인터페이스를 사용하여 sList라는 속성이름에
        위에서 저장한 sList를 속성값으로 담았습니다
        return "hello5";
    }
}

실행 결과

<body>
<h2>hello5.jsp</h2>
<h3>학생정보</h3>
<table class="table table-dark table-hover" style="text-align: center">
    <tr>
        <th>id</th>
        <th>이름</th>
        <th>학번</th>
    </tr>
   보기좋게 테이블태그로 만들어주고 tr태그와 th태그를 이용하여
   첫번째 줄에는 각항목의 주제를 넣어줍니다

<c:forEach items="${sList}" var="s">
Core Tag Library로 포이치문을 사용하였습니다
	items: 반복할 대상 , var:반복변수
	//for(StudentDTO s: sList)

    <tr>
        <td>${s.id}</td>
        <td>${s.studentName} </td>
        <td>${s.studentNumber} </td>
    </tr>
    포이치문이 반복되며 한줄씩 출력합니다
</c:forEach>

</table>
</body>

 

 

  • 자투리

1. 메인주소는 같지만 전송 방식이 다르기 때문에 다르다고 판단되어 같은 주소로 사용 가능하다

1.    
    @GetMapping ("/form-param1") 와 @PostMapping ("/form-param1")는

 

2. 파라미터의 변수 이름과 메소드에서 사용하는 변수의 이름이 같으면 생략 가능하다 

2.    
    <form action="/form-param1" method="post">
        <input type="text" name="p3"> <br>
        <input type="text" name="p4"> <br>
        <input type="submit" value="전송">
    </form>
    
    @PostMapping("/form-param1")
    public String formParam2(@RequestParam String p3,@RequestParam String p4) {
        System.out.println("p3 = " + p3 + ", p4 = " + p4);
        return "index";
    }
    
    원래는 이렇게 써야한다
    @PostMapping("/form-param1")
    public String formParam1(@RequestParam("p3") String p3,@RequestParam("p4") String p4){
        System.out.println("p3 = " + p3 + ", p4 = " + p4);
        return "index";
    }