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
반응형