MVC 패턴에서 Model을 좀 더 자세히 배움. 이제 컨트롤러에서 메소드 매개변수에 뭘 써야될 지 제법 헷갈림ㅋㅋㅋ 뭐가 많어..
이 두 가지에 대해 살펴봄
JSP에서는 Java 코드를 사용할 수 있음. 단, <% %>
(scriptlet)을 통해 명시를 해야 함
값을 출력하려면 별도의 출력구문을 사용해야 함(Java와 HTML 영역이 구분되기 때문)
<% %>
(expression, 표현식)로 변수명을 감싸면 출력이 됨
장점: Java의 코드를 그대로 쓸 수 있음
단점: 가독성이 떨어짐
Java 코드를 쓸 수 있는 Controller가 있으므로 scriptlet은 사용하지 않음
MVC 패턴에 따라 C: Java, V: HTML 규칙을 유지하려고 함
View에서 자바 코드 효과를 내는 태그인 JSTL
사용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<% for(int i=0; i<10; i++){ %>
<h1>Hello <%=i%></h1>
<% } %>
자바 코드 효과
를 내기 위해서 존재등록
이 필요함<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:forEach var="변수명" begin="초기값" end="반복횟수" step="증감식">
<!-- 반복할 내용 --!>
</c:forEach>
EL
)를 사용${변수명}
<c:forEach var="변수명" begin="초기값" end="반복횟수" step="증감식">
<h1>JSTL 반복 ${i}</h1>
</c:forEach>
Controller(C)에서 JSP(V)로 데이터를 넘기는 방법
현재 컨트롤러 구조에서 화면으로 데이터를 보낼 수 있는 방법
import org.springframework.ui.Model;
)model.addAttribute("이름", 값);
//Controller.java
@GetMapping("/test01")
public String test01(Model model) {
//임의의 PocketMonsterDto를 3개 생성, View에 전달
PocketMonsterDto a = new PocketMonsterDto();
a.setNo(9); a.setName("피카츄"); a.setType("전기");
PocketMonsterDto b = new PocketMonsterDto();
b.setNo(10); b.setName("파이리"); b.setType("불꽃");
PocketMonsterDto c = new PocketMonsterDto();
c.setNo(11); c.setName("꼬부기"); c.setType("물");
List<PocketMonsterDto> list= List.of(a,b,c);
model.addAttribute("list", list);
return "dynamic/test01";
}
컨트롤러에서 전달받은 데이터 출력
${requestScope.name}
${name}
var
=”변수 이름”items
=”컨트롤러에서 전달받은 데이터”<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
for(PocketMonserDto dto : list){
System.out.println(dto);
}를 jstl로 작성
--%>
<c:forEach var="dto" items="${list}">
<h1>${dto}</h1>
</c:forEach>
//Dao
List<PocketMonsterDto> selectList();
//DaoImpl
private RowMapper<PocketMonsterDto> mapper = (rs, idx) -> {
PocketMonsterDto dto = new PocketMonsterDto();
dto.setNo(rs.getInt("no"));
dto.setName(rs.getString("name"));
dto.setType(rs.getString("type"));
return dto;
};
@Override
public List<PocketMonsterDto> selectList() {
String sql="select * from pocket_monster order by no asc";
return jdbcTemplate.query(sql, mapper);
}
//PocketMosnterController
@GetMapping("/list")
public String list(Model model) {
List<PocketMonsterDto> list = pocketMonsterDao.selectList();
model.addAttribute("list", list);
return "pocketmon/list";
}
추론
기능 지원(매핑할 변수명과 컬럼명을 맞춰야 함)[var].[column]()
<!-- pocketmon/list.jsp -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8">
<title>포켓몬 목록</title>
</head>
<body>
<div align="center">
<h1>포켓몬 목록</h1>
<table border="1" width="400">
<thead>
<tr>
<th>번호</th>
<th>이름</th>
<th>속성</th>
</tr>
</thead>
<tbody align="center">
<c:forEach var="dto" items="${list}">
<tr>
<!--
<td>${dto.getNo()}</td>
<td>${dto.getName()}</td>
<td>${dto.getType()}</td>
-->
<td>${dto.no()}</td>
<td>${dto.name()}</td>
<td>${dto.type()}</td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</body>
</html>
목록에 검색 기능 추가
//Controller
@GetMapping("/list")
public String list(Model model,
@RequestParam(required=false) String type,
@RequestParam(required=false) String keyword) {
boolean isSearch = type!=null && keyword!=null;
if(isSearch) {
model.addAttribute("list", guestBookDao.selectList(type, keyword));
}else {
model.addAttribute("list", guestBookDao.selectList());
}
return "guestbook/list";
}
JSP 파일에 검색바 추가
<!-- guestbook/list.jsp -->
<select name="type">
<option value="name">이름</option>
<option value="memo">내용</option>
</select>