forward (서버주체) : 요청url : "/"로 시작
sendRedirect (클라이언트주체) : 요청url : context 전체 "/mvc0529/"로 시작
lombok
@Data 어노테이션 제대로 적용되어 있는 지 확인하기 위해
>>
window - show view - outline
getter, setter, constructor 생성 잘 되어있는지 확인
JSTLController.java (Controller)
package com.example.mvc0529.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class JSTLController {
@GetMapping("/jstlTest")
public String jstlTest() {
return "jstlTest";
}
}
jstlTest.jsp (View)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- == request.setAttribute() -->
<c:set var="ban" value="GDJ80"></c:set>
<c:out value="${ban}"></c:out>
<a href="/mvc0529/jstlTest">jstlTest</a> <!-- 일반적인 a 태그 -->
<a href="<%=request.getContextPath()%>/jstlTest">jstlTest</a> <!-- JAVA code 사용한 a 태그 -->
<a href="${pageContext.request.contextPath}">jstlTest</a> <!-- EL 사용한 a 태그 -->
<br><br>
<c:set var="path" value="${pageContext.request.contextPath}"></c:set> <!-- JSTL 사용한 a 태그 -->
${pageContext.request.contextPath}<br>
${path}
<br><br>
<c:remove var="path"/>
remove 후 : ${path}
<br><br>
<c:set var="today" value="<%=new java.util.Date()%>"></c:set>
현재 날짜 : ${today}
</body>
</html>
jstlTest.jsp 출력결과

Member.java (DTO)
package com.example.mvc0529.dto;
import lombok.Data;
@Data
public class Member {
private int id;
private String name;
}
TestController.java (Controller)
package com.example.mvc0529.controller;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.example.mvc0529.dto.Member;
import jakarta.servlet.ServletContext;
import jakarta.servlet.http.HttpSession;
@Controller
public class TestController {
@GetMapping("/test")
public String test(Model model) { // Model implements Map
// Model : 사용자가 목적으로 하는 값 (뷰단 출력 대상)
// Servlet API : request.setAttribute(이름, 모델값)
System.out.println(this.getClass() + "test()");
boolean a = false;
model.addAttribute("a", a);
int b = 19;
model.addAttribute("b", b);
double c = 3.14;
model.addAttribute("c", c);
String d = "goodee";
model.addAttribute("d", d);
Object e = null;
model.addAttribute("e", e);
return "test";
}
@GetMapping("/test2")
public String test2(HttpSession session) {
// request, session 은 Model 사용 가능
// --> 수업에서는 request 만 Model 사용
// Servlet API : request.getSession();
session.setAttribute("name", "goodee");
session.setAttribute("sessionName", "구디");
ServletContext application = session.getServletContext();
application.setAttribute("contextYear", 2002);
return "test2";
}
@GetMapping("/test3")
public String test3(Model model, @RequestParam(value = "no") int no) {
System.out.println("no : " + no);
// /test3?no=777
// Servlet API : request.getParameter("no");
// /test3?ck=a&ck=b&ck=c
// Servlet API : request.getParamValues("ck");
model.addAttribute("no", no);
return "test3";
}
// 객체타입
@GetMapping("/test4")
public String test4(Model model) {
Member m = new Member();
m.setId(1);
m.setName("홍길동");
model.addAttribute("member", m);
return "test4";
}
// 컬렉션 타입 (List, Set, Map)
@GetMapping("/test5")
public String test5(Model model) {
ArrayList<String> strList = new ArrayList<>();
strList.add("하영");
strList.add("지원");
strList.add("채영");
HashSet<String> strSet = new HashSet<>();
strSet.add("새롬");
strSet.add("규리");
strSet.add("나경");
HashMap<String, Object> myMap = new HashMap<>();
myMap.put("no", 9);
myMap.put("name", "프미나");
model.addAttribute("strList", strList);
model.addAttribute("strSet", strSet);
model.addAttribute("myMap", myMap);
List<Member> memberList = new ArrayList<>();
Member m1 = new Member();
Member m2 = new Member();
m1.setId(1);
m1.setName("홍길동");
m2.setId(2);
m2.setName("김욱");
memberList.add(m1);
memberList.add(m2);
model.addAttribute("memberList", memberList);
return "test5";
}
}
test.jsp (View)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>JAVA 표현식</h2>
<div>a : <%=request.getAttribute("a")%></div>
<div>b : <%=request.getAttribute("b")%></div>
<div>c : <%=request.getAttribute("c")%></div>
<div>d : <%=request.getAttribute("d")%></div>
<div>e : <%=request.getAttribute("e")%></div>
<h2>EL 표현식</h2>
<div>a : ${a}</div>
<div>b : ${b}</div>
<div>c : ${c}</div>
<div>d : ${d}</div>
<div>e : ${e}</div>
<!-- null 값을 가지고는 있지만 출력은 하지않음 -->
<!-- null 값을 표현하는것에는 위험부담이 있음 ex) NullPointerException 발생 -->
<h2>EL 연산자</h2>
<div>$(b+20) : ${b+20}</div>
<div>$b + $c : ${b} + ${c}</div>
<div>$(b+c) : ${b+c}</div>
<div>a == false ? : ${a == false}</div>
<div>b > 20 ? : ${b > 20}</div>
<div>b / 5 != 3 ? : ${b/5 != 3}</div>
<h2>EL 논리연산자</h2>
<div>${b/5 != 3 && b > 10}</div>
<div>${a || e == null}</div>
<div>${empty e}</div>
<h2>EL 삼항연산자</h2>
<div>${b>0 ? '양수' : '음수'}</div>
</body>
</html>
test.jsp 출력결과

test2.jsp (View)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Session scope</h1>
<div>${sessionScope.name}</div> <!-- EL을 사용하면 Scope 생략가능 -->
<div>${name}</div>
<!-- name 을 찾기위해 request, session, application 검색 -->
<div>${sessionName}</div>
<div>${contextYear}</div>
</body>
</html>
test2.jsp 출력결과

test3.jsp (View)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>no : ${no}</div> <!-- ${requestScope.no}, ${request.getAttribute("no")}-->
<div>no : ${param.no}</div> <!-- ${request.getParameter("no")} -->
</body>
</html>
test4.jsp (View)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>member : ${member}</div>
<div>id = ${member.id}</div>
<div>name = ${member.name}</div>
</body>
</html>
test4.jsp 출력결과

test5.jsp (View)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>List 출력</h2>
<div>${strList}</div>
<div>${strList[0]}</div>
<div>${strList[1]}</div>
<div>${strList[2]}</div>
<div>
<c:forEach var="mList" items="${strList}">
${mList}
</c:forEach>
</div>
<h2>Set 출력</h2> <!-- Set 은 index 나 key 가 없기 때문에 개별출력 불가 -->
<div>${strSet}</div>
<div>
<c:forEach var="mSet" items="${strSet}">
${mSet}
</c:forEach>
</div>
<h2>Map 출력</h2>
<div>${myMap}</div>
<div>${myMap.no}</div>
<div>${myMap.name}</div>
<div>${myMap["name"]}</div>
<div>
<c:forEach var="mMap" items="${myMap}">
${mMap}
</c:forEach>
</div>
<h2>멤버 목록</h2>
<div>${memberList}</div>
<div>${memberList[0].id}</div>
<div>${memberList[0].name}</div>
<div>${memberList[1].id}</div>
<div>${memberList[1].name}</div>
</body>
</html>
test5.jsp 출력결과

employees application.properties
spring.application.name=employees
# 서버설정
server.servlet.context-path=/employees
server.port=80
# 뷰 설정
# /WEB-INF/view/~~~.jsp
spring.mvc.view.prefix=/WEB-INF/view/
spring.mvc.view.suffix=.jsp
# 커넥션 풀
# datasource : 커넥션 풀을 구현하기 위한 데이터타입
# datasource는 Connection의 배열로 구성됨
spring.datasource.driver-class-name=org.mariadb.jdbc.Driver
spring.datasource.url=jdbc:mariadb://localhost:3306/employees
spring.datasource.username=root
spring.datasource.password=java1234
EmployeesDTO.java (DTO)
package com.gd.employees.dto;
import lombok.Data;
@Data
public class EmployeesDTO {
private int empNo;
private String birthDate;
private String firstName;
private String lastName;
private String gender;
private String hireDate;
}
EmployeesController.java (Controller)
package com.gd.employees.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import com.gd.employees.dto.EmployeesDTO;
import com.gd.employees.mapper.EmployeesMapper;
@Controller
public class EmployeesController {
@Autowired
private EmployeesMapper EmployeesMapper;
@GetMapping("/employeesList")
public String employeesList(Model model) {
List<EmployeesDTO> list = EmployeesMapper.selectEmployeesListByPage();
model.addAttribute("list", list);
return "employeesList";
}
}
EmployeesMapper.java (Mapper - Interface)
package com.gd.employees.mapper;
import java.util.List;
import org.apache.ibatis.annotations.Mapper;
import com.gd.employees.dto.EmployeesDTO;
@Mapper
public interface EmployeesMapper {
public List<EmployeesDTO> selectEmployeesListByPage();
}
EmployeesMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gd.employees.mapper.EmployeesMapper">
<select id="selectEmployeesListByPage" resultType="com.gd.employees.dto.EmployeesDTO">
SELECT
emp_no empNo,
birth_date birthDate,
first_name firstName,
last_name lastName,
gender,
hire_date hireDate
FROM
employees
LIMIT 0, 10
</select>
</mapper>
employeesList.jsp (View)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>employees List</h1>
<div>${list}</div>
</body>
</html>
employeesList.jsp 출력결과
