JSP
[JSP] 37. 서블릿과 JSP의 협력
Song hyun
2024. 7. 5. 11:22
728x90
반응형
[JSP] 37. 서블릿과 JSP의 협력
서블릿과 JSP는 서로 협력하여 MVC 패턴을 구현할 수 있다. 서블릿은 컨트롤러 역할을 수행하고, JSP는 뷰 역할을 수행한다.
*insert.jsp: 프레젠테이션 계층으로 활용 -> insertServlet.java로 이동
1. 데이터 삽입하기
(1) MySQL DB 생성
create database demo5;
use demo5;
create table users(
id bigint auto_increment primary key,
name varchar(100) not null comment '사용자 이름',
email varchar(255) not null comment '사용자 이메일'
);
desc users;
(2) insert.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>데이터 삽입</title>
<link rel="stylesheet" type="text/css" href="css/styles.css">
</head>
<body>
<h2>데이터 삽입</h2>
<!-- http://localhost:8080/insert.jsp -->
<form action="insert" method="post">
<label for="name">이름 :</label>
<input type="text" id="name" name="name">
<label for="email">이메일 :</label>
<input type="email" id="email" name="email" value="a@nate.com">
<br>
<button type="submit">저장</button>
</form>
</body>
</html>
(3) InsertServlet.java
package com.tenco.servlet;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
@WebServlet ("/insert")
public class InsertServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public InsertServlet() {
super();
}
@Override
public void init() throws ServletException {
System.out.println("InsertServlet 초기화");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
}
// http://localhost:8080/InsertServlet
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 한글명 깨짐 해결
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("name");
String email=request.getParameter("email");
// 유효성 검사 생략
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/demo5?serverTimezone=Asia/Seoul"
,"root","asd123");
String sql=" INSERT INTO users(name,email) values (?,?)";
PreparedStatement pstmt= conn.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, email);
pstmt.executeUpdate();
pstmt.close();
conn.close();
response.sendRedirect("result.jsp?message=success");
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
response.sendRedirect("result.jsp?message=error");
}
}
}
2. 데이터 조회하기
(4) select.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 정보 조회</title>
<link rel="stylesheet" type="text/css" href="css.styles.css">
</head>
<body>
<h2>데이터 조회</h2>
<form action="select" method="get">
<button type="submit">데이터 조회</button>
</form>
</body>
</html>
(5) selectServlet.java
package com.tenco.servlet;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/select")
public class SelectServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public SelectServlet() {
super();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/demo5?serverTimezone=Asia/Seoul"
,"root","asd123");
String sql=" SELECT * FROM users ";
PreparedStatement pstmt= conn.prepareStatement(sql);
pstmt.executeQuery();
ResultSet rs= pstmt.executeQuery();
// 서블릿에서 다른 JSP 파일로 데이터를 전달할 수 있다.
// WAS 내부에서 새로운 request 생성을 시킬 수 있다.
// (단 외부(=클라이언트)에서는 모름.)
request.getRequestDispatcher("resultSet.jsp").forward(request, response);
pstmt.close();
conn.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
(6) result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ResultSet.jsp 파일</title>
</head>
<body>
<%
out.println("ResultSet.jsp 파일 입니다.");
%>
</body>
</html>
*수정한 resultSet.jsp
<%@page import="java.util.Map"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>ResultSet.jsp 파일</title>
</head>
<body>
<%
out.println("ResultSet.jsp 파일 입니다.");
%>
<h1>사용자 목록</h1>
<table border="1">
<thead>
<tr>
<th>ID</th>
<th>이름</th>
<th>이메일</th>
</tr>
</thead>
<tbody>
<%
List<Map<String, String>> userList
= (List<Map<String, String>>) request.getAttribute("userList");
if (userList != null) {
for(Map<String,String> userMap:userList){ %>
<tr>
<td><%=userMap.get("id") %></td>
<td><%=userMap.get("name") %></td>
<td><%=userMap.get("email") %></td>
</tr>
<%}
} else {
%>
<p>등록된 사용자가 없네요.</p>
<%
}
%>
</tbody>
</table>
</body>
</html>
728x90
반응형