Tomcat
Tomcat 9.0 다운 받기
Core:64-bit windows zip 다운 받으면 된다.
model이라는 새로운 프로젝트를 생성한다.

Application server에 tomcat 9 설정
JSP에서 자바 코드를 직접 쓰지 않고, 간단한 문법으로 데이터를 표현할 수 있도록 도와주는 언어
<%=request.getAttribute("name")%>
${name}
${user} : 변수
${user.userid} : 객체
${user["userid"]}: 객체
${user[0]} : 배열
${user["key"]} : 맵
${price + 1000} // +, -, *, /, mod, <, >, <=, >=, &&, ||
${price > 10000 ? "비싸다" : "싸다"}
${empty name} // name이 null 또는 빈 문자열이면 true
폴더 구조

1_basic.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el</title>
</head>
<body>
<h2>el</h2>
<p>el 태그는 jsp의 표현식을 대체함</p>
${1+2}<br>
${'안녕하세요, EL'}<br>
${1 >= 2}<br>
${1<2 || 1>2}<br>
${1<2 && 1>2}<br>
${1==1 ? '같다' : '다르다'}<br>
${'김사과' == '김사과'}<br>
${'김사과' eq '김사과'}<br>
${5 gt 3}<br>
${3 lt 4}<br>
</body>
</html>
2_form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el</title>
</head>
<body>
<form method="post" action="2_form_ok.jsp">
<p>아이디: <input type="text" name="userid"></p>
<p>비밀번호: <input type="password" name="userpw"></p>
<p><button type="submit">확인</button></p>
</form>
</body>
</html>
2_form_ok.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<% request.setCharacterEncoding("utf-8");;%>
<html>
<head>
<title>el</title>
</head>
<body>
<h2>파라미터 값을 설정할 때 param 객체를 사용</h2>
<p>${param.userid}</p>
<p>${param.userpw}</p>
</body>
</html>
3_object.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.koreait.model.MemberDTO" %>
<%
request.setAttribute("userid", "apple");
session.setAttribute("name", "김사과");
application.setAttribute("age", 20);
MemberDTO dto = new MemberDTO(1, "apple", "1111", "김사과", "010-1111-1111", "apple@apple.com", "여자", "001011", "4068518", "06774", "서울 서초구 강남대로 27", "AT센터", "(양재동)", "2025-06-10", 1000);
request.setAttribute("dto", dto);
request.getRequestDispatcher("3_object_ok.jsp").forward(request,response);
%>
<html>
<head>
<title>el</title>
</head>
<body>
</body>
</html>
3_object_ok.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>el</title>
</head>
<body>
<p>${userid}(request)</p>
<p>${name}(session)</p>
<p>${age}(application)</p>
<p>${requestScope.userid}</p>
<p>${sessionScope.name}</p>
<p>${applicationScope.age}</p>
<hr>
<p>${requestScope.dto}</p>
<p>${requestScope.dto.idx}</p>
<p>${requestScope.dto.userid}</p>
<p>${requestScope.dto.name}</p>
</body>
</html>
MemberDTO.java
package com.koreait.model;
public class MemberDTO {
private int idx;
private String userid;
private String userpw;
private String name;
private String hp;
private String email;
private String gender;
private String ssn1;
private String ssn2;
private String zipcode;
private String address1;
private String address2;
private String address3;
private String regdate;
private int point;
public MemberDTO() {
}
public MemberDTO(int idx, String userid, String userpw, String name, String hp, String email, String gender, String ssn1, String ssn2, String zipcode, String address1, String address2, String address3, String regdate, int point) {
this.idx = idx;
this.userid = userid;
this.userpw = userpw;
this.name = name;
this.hp = hp;
this.email = email;
this.gender = gender;
this.ssn1 = ssn1;
this.ssn2 = ssn2;
this.zipcode = zipcode;
this.address1 = address1;
this.address2 = address2;
this.address3 = address3;
this.regdate = regdate;
this.point = point;
}
public int getIdx() {
return idx;
}
public void setIdx(int idx) {
this.idx = idx;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getUserpw() {
return userpw;
}
public void setUserpw(String userpw) {
this.userpw = userpw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getHp() {
return hp;
}
public void setHp(String hp) {
this.hp = hp;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getSsn1() {
return ssn1;
}
public void setSsn1(String ssn1) {
this.ssn1 = ssn1;
}
public String getSsn2() {
return ssn2;
}
public void setSsn2(String ssn2) {
this.ssn2 = ssn2;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getAddress1() {
return address1;
}
public void setAddress1(String address1) {
this.address1 = address1;
}
public String getAddress2() {
return address2;
}
public void setAddress2(String address2) {
this.address2 = address2;
}
public String getAddress3() {
return address3;
}
public void setAddress3(String address3) {
this.address3 = address3;
}
public String getRegdate() {
return regdate;
}
public void setRegdate(String regdate) {
this.regdate = regdate;
}
public int getPoint() {
return point;
}
public void setPoint(int point) {
this.point = point;
}
}
<%
if(age > 19){
%><p>성인입니다.</p><% } %>
<c:if test="${age>19}"><p>성인입니다.</p></c:if>
<% for(String item : list) { %>
<p> 반복합니다.</p><% } %>
<c:forEach var "item" items = "${list}"><p> 반복합니다.</p></c:forEach>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
위의 내용을 pom.xml dependencies 안에 추가하고 동기화 시킨다!
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
이것이 있어야 JSTL(JSP Standard Tag Library)을 사용할 수 있다.
폴더 구조

1_core.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page import="java.util.Arrays" %>
<%@ page import="java.util.List" %>
<%
request.setAttribute("userid", "apple");
request.setAttribute("age", 20);
List<String> hobby = Arrays.asList("영화감상", "음악감상", "운동", "게임");
request.setAttribute("hobby", hobby);
%>
<html>
<head>
<title>jstl</title>
</head>
<body>
<h2>안녕하세요! ${userid}님!!</h2>
<%-- 조건문 --%>
<c:if test="${age>19}">
<p>성인입니다.</p>
</c:if>
<c:if test="${age<=19}">
<p>미성년자입니다.</p>
</c:if>
<%-- 반복문 --%>
<h2>취미</h2>
<ul>
<c:forEach var="h" items="${hobby}">
<li>${h}</li>
</c:forEach>
</ul>
<hr>
<%
// 스크립트릿: 1~10까지 합
int sum = 0;
for(int i=1; i<=10; i++){
sum+=i;
}
%>
<p>1~10까지의 합: <%=sum%></p>
<c:set var="sum" value="0"/>
<c:forEach var="i" begin="1" end="10" step="1">
<c:set var="sum" value="${sum + i}"/>
</c:forEach>
<p>1~10까지의 합: <c:out value="${sum}"/></p>
<hr>
<h2>2~9단까지 구구단 출력</h2>
<c:forEach var="n" begin="2" end="9" step="1">
<c:forEach var="i" begin="1" end="9" step="1">
${n} * ${i} = ${n*i}<br>
</c:forEach>
<br>
</c:forEach>
<hr>
<h2>배열</h2>
<c:set var="arr" value="<%=new int[]{10, 20, 30, 40, 50}%>"/>
<c:forEach var="i" items="${arr}" varStatus="stat">
<p>${i}</p>
<p>i의 인덱스: ${stat.index}</p>
<p>i의 카운트: ${stat.count}</p>
</c:forEach>
<hr>
<h2>choose</h2>
<c:choose>
<c:when test="${param.userid == 'apple'}">
<p>apple님 안녕하세요!</p>
</c:when>
<c:when test="${param.userid == 'banana'}">
<p>banana님 안녕하세요!</p>
</c:when>
<c:otherwise>
<p>게스트님 안녕하세요!</p>
</c:otherwise>
</c:choose>
<c:choose>
<c:when test="${param.age > 19}">
<p>성인입니다.</p>
</c:when>
<c:otherwise>
<p>미성년자입니다.</p>
</c:otherwise>
</c:choose>
</body>
</html>
1_form.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>jstl</title>
</head>
<body>
<form method="post" action="1_core.jsp">
<p>아이디: <input type="text" name="userid"></p>
<p>비밀번호: <input type="password" name="userpw"></p>
<p>나이: <input type="number" name="age"></p>
<button type="submit">확인</button>
</form>
</body>
</html>
2_format.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page import="java.util.Date" %>
<html>
<head>
<title>format</title>
</head>
<body>
<h2>문자를 날짜로 형 변환</h2>
<fmt:parseDate var="a" value="2025/06/10" pattern="yyyy/MM/dd"/>
<p>${a}</p>
<h2>날짜형을 문자로 형 변환</h2>
<c:set var="now" value="<%=new Date()%>"/>
<p><fmt:formatDate value="${now}" pattern="yyyy년 MM월 dd일 HH:mm:ss"/></p>
<p><fmt:formatDate value="${now}" pattern="yyyy-MM-dd HH:mm:ss"/></p>
<h2>문자를 숫자로 형 변환</h2>
<fmt:parseNumber value="$3.14" pattern="$0.00"/>
<fmt:parseNumber value="1.123abc" type="number"/>
<h2>숫자를 문자로 형 변환</h2>
<fmt:formatNumber value="2000" pattern="0000.00"/>
</body>
</html>

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
Mysql과 연동하기 위해 이것을 pom.xml dependencies 안에 추가하고 동기화 시킨다!

member 패키지 안에 있는 MemberServlet
package com.koreait.model.member;
import com.koreait.model.db.DBUtil;
import javax.servlet.RequestDispatcher;
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.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@WebServlet("/members")
public class MemberServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public MemberServlet(){}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
List<Map<String, String>> memberList = new ArrayList<>();
try(Connection conn = DBUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement("select * from member"); ResultSet rs = pstmt.executeQuery()){
while(rs.next()){
Map<String, String> member = new HashMap<>();
member.put("idx", rs.getString("idx"));
member.put("userid", rs.getString("userid"));
member.put("name", rs.getString("name"));
member.put("hp", rs.getString("hp"));
member.put("email", rs.getString("email"));
member.put("gender", rs.getString("gender"));
memberList.add(member);
}
}catch(Exception e){
e.printStackTrace();
}
request.setAttribute("memberList", memberList);
RequestDispatcher dispatcher = request.getRequestDispatcher("member/1_member.jsp");
dispatcher.forward(request, response);
}
}

member 폴더 안 1_member.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>회원 목록</title>
</head>
<body>
<table border="1">
<tr>
<th>IDX</th>
<th>아이디</th>
<th>이름</th>
<th>휴대폰</th>
<th>이메일</th>
<th>성별</th>
</tr>
<c:forEach var="member" items="${memberList}">
<tr>
<td>${member.idx}</td>
<td>${member.userid}</td>
<td>${member.name}</td>
<td>${member.hp}</td>
<td>${member.email}</td>
<td>${member.gender}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
MySQL은 이렇게 되어 있다.
use java;
create table member (
idx int auto_increment primary key,
userid varchar(20) unique not null,
userpw varchar(20) not null,
name varchar(20) not null,
hp varchar(20) not null,
email varchar(50) not null,
gender varchar(10) not null,
ssn1 char(6) not null,
ssn2 char(7) not null,
zipcode char(5),
address1 varchar(100),
address2 varchar(100),
address3 varchar(100),
regdate datetime default now(),
point int default 1000
);
desc member;
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('apple', '1111', '김사과', '010-1111-1111', 'apple@apple.com', '여자', '001011', '4068518', '06774', '서울 서초구 강남대로 27', 'AT센터', '(양재동)');
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('banana', '2222', '반하나', '010-2222-2222', 'banana@banana.com', '여자', '950101', '4068518', '12345', '서울 서초구 방배동 27', '111', '(방배동)');
insert into member (userid, userpw, name, hp, email, gender, ssn1, ssn2, zipcode, address1, address2, address3) values
('orange', '3333', '오렌지', '010-3333-3333', 'orange@orange.com', '남자', '910202', '4068518', '06774', '서울 강남구 역삼동 27', '2222', '(역삼동)');
select * from member;

이렇게 실행했는데, 안 나온다면 뭔가 버전이 안 맞아서 그런 것임.
pom.xml dependencies 안에 아래 내용과 비슷한 부분을 아래처럼 수정하고 동기화 시킨다!
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
MemberServlet처럼 HelloServlet 부분도 javax로 수정해야한다.
(처음에는 javax가 아닌 자카르타(?)라고 되어있었음. 이걸 javax로 수정)
import javax.servlet.http.*;
import javax.servlet.annotation.*;
그리고 실행하면 결과가 나온다.
그래도 안 나온다면... 파일 경로를 꼼꼼히 확인해보자.