Spring으로 CRUD 페이지 만들기
CUD는 유사한 흐름을 가짐
Spring을 사용함으로써 이전과는 다른 부분들이 있다.
MemberController를 생성해서 아래 코드를 입력해줌으로써
Spring이 자동으로 다 해주기때문에 기존에 했던 부분에서 없어지는 것들이 있다.
첫 번째로 insert2.jsp에서 아래 두 가지 코드를 대체해줘서 없애도 된다.
즉 스프링에서 가방만 만들어주면 알아서 넣어주기때문에
useBean 부분의 코드가 필요 없어지는 것이다.
그다음 insert.jsp에서 <form action=""> 사이 연결된 주소를 지워준다.
이걸 대체하기 위해 MemberDAO에 @RequestMapping 어노테이션을 추가해
() 안에는 내 마음대로 주소를 설정한다.
RequestMapping은 if문과 같은 역할을 한다.
그리고 설정한 주소를 insert.jsp에
<form action="insert">로 그대로 입력해준다.
1. Insert
변경 사항을 반영한 코드다.
insert.jsp 코드
<%@ 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>
<script type="text/javascript">
//alert('회원가입 페이지입니다. 반갑습니다.!')
</script>
<style type="text/css">
body { /* 컨트롤 + / - 자동주석, 태그선택! */
background: lightgray;
}
button {
background: white;
}
.t1 { /* .은 클래스 선택!, 여러개선택! */
background: lightblue;
width: 150px;
text-align: center;
}
#b1 { /* #은 아이디 선택!, 특정한 것 한 개만 선택! */
color: red;
}
#b2{
color: blue;
}
</style>
</head>
<body>
<h3>회원가입 페이지</h3>
<hr>
<a href="member.jsp">
<button id="b1">첫페이지로</button>
</a>
<img src="resources/img/gold.png" width="300" height="300">
<!--form의 action은 무조건 jsp파일이되어야만 함. -->
<form action="insert"> <!-- 여기도 연결된 insert2.jsp 주소를 MemberController가 대체해서 지워줌 -->
<table border="1">
<tr>
<td class="t1">아이디 :</td>
<td><input name="id"></td>
</tr>
<tr>
<td class="t1">비밀번호 :</td>
<td><input name="pw" value="1234"></td>
</tr>
<tr>
<td class="t1">회원이름 :</td>
<td><input name="name" value="xia"></td>
</tr>
<tr>
<td class="t1">회원전화 :</td>
<td><input name="tel" value="010"></td>
</tr>
<tr>
<td colspan="2" class="t1">
<button id="b2">회원가입 데이터 전송</button>
</td>
</tr>
</table>
<!-- 입력한 값들이 서버(톰킷)으로 전달될때는 form태그 안에 있어야 함. -->
<!-- 보충내용: <input name="data"> -->
</form>
</body>
</html>
insert2.jsp 코드
<%@page import="com.multi.mvc02.MemberDAO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
// 1. 클라이언트가 입력한 데이터를 받아서
// 2. 가방을 만들어 데이터를 넣는다
// 3. DAO를 만들어서 가방을 주면서 Insert해달라고 요청
%>
<jsp:useBean id="bag" class="com.multi.mvc02.MemberDTO"></jsp:useBean>
<jsp:setProperty property="*" name="bag"/>
<!-- 위 두 가지 부분은 MemberController가 대체하면서 없어도 됨 -->
<%
/* 스크립트릿 */
MemberDAO dao = new MemberDAO();
dao.insert(bag);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
회원가입해달라고 요청함
</body>
</html>
MemberDAO.java 코드
package com.multi.mvc02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class MemberDAO {
//한꺼번에 java파일에서 자동 import
//컨트롤 + 쉬프트 + o
public int insert(MemberDTO dto) {
int result = 0;
try {
// 1.드라이버(커넥터) 설정
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("1.ok----------");
// 2.DB연결(url, id, pw)
String url = "jdbc:mysql://localhost:3306/shop?serverTimezone=UTC";
String user = "root";
String password = "1234";
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("2.ok----------");
// 3.SQL문 결정/생성
String sql = "insert into member values (?,?,?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, dto.getId());
ps.setString(2, dto.getPw());
ps.setString(3, dto.getName());
ps.setString(4, dto.getTel());
System.out.println("3.ok----------");
// 4.DB로 SQL문 전송
result = ps.executeUpdate();
System.out.println("4.ok----------");
}catch(Exception e) {
System.out.println("에러가 발생함.");
}
return result;
}
public boolean login(MemberDTO dto) throws Exception {
// 1.드라이버(커넥터) 설정
Class.forName("com.mysql.jdbc.Driver");
System.out.println("1.ok----------");
// 2.DB연결(url, id, pw)
String url = "jdbc:mysql://localhost:3306/shop?serverTimezone=UTC";
String user = "root";
String password = "1234";
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("2.ok----------");
// 3.SQL문 결정/생성
String sql = "select id from member where id = ? and pw = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, dto.getId());
ps.setString(2, dto.getPw());
System.out.println("3.ok----------");
// 4.DB로 SQL문 전송
ResultSet rs = ps.executeQuery();
System.out.println("4.ok----------");
boolean result = false;
if(rs.next()) {
result = true;
}
return result;
}
}
MemberDTO.java 코드
package com.multi.mvc02;
public class MemberDTO {
private String id;
private String pw;
private String name;
private String tel;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPw() {
return pw;
}
public void setPw(String pw) {
this.pw = pw;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
@Override
public String toString() {
return "MemberDTO [id=" + id + ", pw=" + pw + ", name=" + name + ", tel=" + tel + "]";
}
}
MemberController.java 코드
package com.multi.mvc02;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 상속받아서(Controller) + 싱글톤 만들어줌
@Controller
public class MemberController {
// CRUD 요청 기능 처리
// 멤버변수 + 멤버 메서드
@RequestMapping("insert") // 주소가 정해진 게 없어서 내 맘대로 입력하면 됨
public void insert(MemberDTO bag) {
System.out.println("컨트롤러에서 받은 bag >> " + bag);
}
public void one() {
}
public void update() {
}
public void delete() {
}
}
실행시켜보면 콘솔창에 데이터가 받아진 걸 확인할 수 있다.
이제 DB까지 연결시켜본다.
MemberController에 MemberDAO를 연결해주고
dao.insert(bag);을 해주면
아래와같이 DB에도 데이터가 들어간 걸 확인할 수 있다.
다음으로 데이터 입력 이후에 오류 페이지가 아닌
데이터가 정상적으로 입력됐음을 알려주는 페이지가 뜨도록 한다.
WEB-INF에 가면 views 안에 home.jsp가 있는데
이건 예시 파일이라 지우고
여기에 insert.jsp를 만들어준다.
아까 MemberController에서 내 마음대로 주소를 정할 때 insert라고 설정했기때문에
불러올 수 있도록 insert.jsp로 파일명을 설정한다.
코드는 한눈에 보기 쉽게 백그라운드 컬러만 바꿔주고
요청 내역에 대한 문구가 뜨도록 했다.
<%@ 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 bgcolor="lightblue">
회원가입해달라고 DAO에 요청함
</body>
</html>
실행 결과 데이터를 제출하면 오류 페이지가 아닌 설정한 insert페이지가 불러와진다.
여기까지의 과정을 요약해서 정리하자면 다음과 같다.
클라이언트가 브라우저에서 바로 호출하는 방법 3 가지로 호출 불가
<a href="WEB-INF/views/insert.jsp">호출 불가</a>
<form action="WEB-INF/views/insert.jsp">
location.href="WEB-INF/views/insert.jsp"
위와 마찬가지로 one, update, delete도 만들어야하는데,
각각 insert와 같은 주소가 필요하다.
앞서 했던 @RequestMapping 어노테이션을 복사해서
아래에도 붙여넣고 수정해준다.
보통 메서드 이름과 같게 정해준다.
2. Login
생각해보니 로그인 부분을 안만들어서 추가하고
로그인부터 만들어보겠다.
순서를 다시 정리해보자면
login.jsp에서 브라우저에 표시될 페이지를 만들고
MemberController에서 가방에 담아
DAO를 통해
login.jsp 코드
<%@ 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>
<script type="text/javascript">
//alert('회원가입 페이지입니다. 반갑습니다.!')
</script>
<style type="text/css">
body { /* 컨트롤 + / - 자동주석, 태그선택! */
background: lightgray;
}
button {
background: white;
}
.t1 { /* .은 클래스 선택!, 여러개선택! */
background: lightblue;
width: 150px;
text-align: center;
}
#b1 { /* #은 아이디 선택!, 특정한 것 한 개만 선택! */
color: red;
}
#b2{
color: blue;
}
</style>
</head>
<body>
<h3>회원가입 페이지</h3>
<hr>
<a href="login.jsp">
<button id="b1">첫페이지로</button>
</a>
<img src="resources/img/gold.png" width="300" height="300">
<!--form의 action은 무조건 jsp파일이되어야만 함. -->
<form action="login"> <!-- 여기도 연결된 insert2.jsp 주소를 MemberController가 대체해서 지워줌 -->
<table border="1">
<tr>
<td class="t1">아이디 :</td>
<td><input name="id" value="apple"></td>
</tr>
<tr>
<td class="t1">비밀번호 :</td>
<td><input name="pw" value="1234"></td>
</tr>
<tr>
<td colspan="2" class="t1">
<button id="b2">로그인 데이터 전송</button>
</td>
</tr>
</table>
<!-- 입력한 값들이 서버(톰킷)으로 전달될때는 form태그 안에 있어야 함. -->
<!-- 보충내용: <input name="data"> -->
</form>
</body>
</html>
MemberController.java 업데이트
package com.multi.mvc02;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
// 상속받아서(Controller) + 싱글톤 만들어줌
@Controller // Controller 어노테이션 안에 @RequestMapping이 있어야 실행됨
public class MemberController {
// CRUD 요청 기능 처리
// 멤버변수 + 멤버 메서드
@RequestMapping("insert") // 주소가 정해진 게 없어서 내 맘대로 입력하면 됨
public void insert(MemberDTO bag, MemberDAO dao) {
System.out.println("컨트롤러에서 받은 bag >> " + bag);
dao.insert(bag);
}
@RequestMapping("login")
public void login(MemberDTO bag, MemberDAO dao) throws Exception {
System.out.println("컨트롤러에서 받은 데이터 >> " + bag);
dao.login(bag);
}
@RequestMapping("one")
public void one() {
}
@RequestMapping("update")
public void update() {
}
@RequestMapping("delete")
public void delete() {
}
}
view 아래에 있는 login.jsp 코드
실행 결과
로그인 처리 결과도 만들어볼건데,
Spring에서는 Model이란 객체를 사용해야한다.
코드는 아래와 같이 수정한다.
결과를 보면 로그인 성공/실패 여부에 따라
지정한 값이 출력된다.
로그인 성공/실패 여부에 따라 다른 페이지를 리턴하기 위해서는
조금의 수정이 필요하다.
MemberController 코드를 아래와 같이 수정해준다.
여러 페이지를 리턴할 때는 String을 사용하면 된다.
views 아래에 yes와 no jsp파일을 아래와 같이 생성해준다.
출력 결과
로그인 실패 시 첫 로그인 화면으로 돌아가게 하려면
아래처럼 수정해주면 된다.
3. Update
update.jsp 코드
<%@ 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>
<script type="text/javascript">
//alert('회원가입 페이지입니다. 반갑습니다.!')
</script>
<style type="text/css">
body { /* 컨트롤 + / - 자동주석, 태그선택! */
background: lightgray;
}
button {
background: white;
}
.t1 { /* .은 클래스 선택!, 여러개선택! */
background: lightblue;
width: 150px;
text-align: center;
}
#b1 { /* #은 아이디 선택!, 특정한 것 한 개만 선택! */
color: red;
}
#b2{
color: blue;
}
</style>
</head>
<body>
<h3>회원가입 페이지</h3>
<hr>
<a href="login.jsp">
<button id="b1">첫페이지로</button>
</a>
<img src="resources/img/gold.png" width="300" height="300">
<!--form의 action은 무조건 jsp파일이되어야만 함. -->
<form action="update"> <!-- 여기도 연결된 insert2.jsp 주소를 MemberController가 대체해서 지워줌 -->
<!-- update member set tel = ? where id = ? -->
<table border="1">
<tr>
<td class="t1">아이디 :</td>
<td><input name="id" value="apple"></td>
</tr>
<tr>
<td class="t1">회원전화 :</td>
<td><input name="tel" value="011"></td>
</tr>
<tr>
<td colspan="2" class="t1">
<button id="b2">정보수정 데이터 전송</button>
</td>
</tr>
</table>
<!-- 입력한 값들이 서버(톰킷)으로 전달될때는 form태그 안에 있어야 함. -->
<!-- 보충내용: <input name="data"> -->
</form>
</body>
</html>
업데이트된 MemberController.java
package com.multi.mvc02;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
// 상속받아서(Controller) + 싱글톤 만들어줌
@Controller // Controller 어노테이션 안에 @RequestMapping이 있어야 실행됨
public class MemberController {
// CRUD 요청 기능 처리
// 멤버변수 + 멤버 메서드
@RequestMapping("insert") // 주소가 정해진 게 없어서 내 맘대로 입력하면 됨
public void insert(MemberDTO bag, MemberDAO dao) {
System.out.println("컨트롤러에서 받은 bag >> " + bag);
dao.insert(bag);
}
@RequestMapping("login")
public void login(MemberDTO bag,
MemberDAO dao,
Model model) throws Exception {
System.out.println("컨트롤러에서 받은 데이터 >> " + bag);
boolean result = dao.login(bag);
String text = "로그인 실패";
if(result) {
text = "로그인 성공";
}
// Model은 views 아래까지 값을 전달하고 죽는 코드
model.addAttribute("text", text);
model.addAttribute("tel", bag.getTel());
}
@RequestMapping("one")
public void one() {
}
@RequestMapping("update")
// MemberDTO bag : 가방을 만들고(지역변수), MemberDAO dao : DB를 연동해주고(프로토타입), Model : 결과값을 넘길 Model 만들어줌
// (프로토타입 : 벽돌(부품)) 벽돌틀 별돌1 = new 벽돌틀(); 이런 형식이 프로토타입
public void update(MemberDTO bag,
MemberDAO dao,
Model model) {
System.out.println(bag);
int result = dao.update(bag);
String text = "회원정보 수정 실패";
if(result == 1) {
text = "회원정보 수정 완료";
}
model.addAttribute("text", text);
}
@RequestMapping("delete")
public void delete() {
}
}
업데이트된 MemberDAO.java
package com.multi.mvc02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class MemberDAO {
//한꺼번에 java파일에서 자동 import
//컨트롤 + 쉬프트 + o
public int insert(MemberDTO dto) {
int result = 0;
try {
// 1.드라이버(커넥터) 설정
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("1.ok----------");
// 2.DB연결(url, id, pw)
String url = "jdbc:mysql://localhost:3306/shop?serverTimezone=UTC";
String user = "root";
String password = "1234";
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("2.ok----------");
// 3.SQL문 결정/생성
String sql = "insert into member values (?,?,?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, dto.getId());
ps.setString(2, dto.getPw());
ps.setString(3, dto.getName());
ps.setString(4, dto.getTel());
System.out.println("3.ok----------");
// 4.DB로 SQL문 전송
result = ps.executeUpdate();
System.out.println("4.ok----------");
}catch(Exception e) {
System.out.println("에러가 발생함.");
}
return result;
}
public boolean login(MemberDTO dto) throws Exception {
// 1.드라이버(커넥터) 설정
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("1.ok----------");
// 2.DB연결(url, id, pw)
String url = "jdbc:mysql://localhost:3306/shop?serverTimezone=UTC";
String user = "root";
String password = "1234";
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("2.ok----------");
// 3.SQL문 결정/생성
String sql = "select id from member where id = ? and pw = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, dto.getId());
ps.setString(2, dto.getPw());
System.out.println("3.ok----------");
// 4.DB로 SQL문 전송
ResultSet rs = ps.executeQuery();
System.out.println("4.ok----------");
boolean result = false;
if(rs.next()) {
result = true;
}
return result;
}
public int update(MemberDTO dto) {
int result = 0;
try {
// 1.드라이버(커넥터) 설정
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("1.ok----------");
// 2.DB연결(url, id, pw)
String url = "jdbc:mysql://localhost:3306/shop?serverTimezone=UTC";
String user = "root";
String password = "1234";
Connection con = DriverManager.getConnection(url, user, password);
System.out.println("2.ok----------");
// 3.SQL문 결정/생성
String sql = "update member set tel = ? where id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, dto.getTel());
ps.setString(2, dto.getId());
System.out.println("3.ok----------");
// 4.DB로 SQL문 전송
result = ps.executeUpdate();
System.out.println("4.ok----------");
}catch(Exception e) {
System.out.println("에러가 발생함.");
}
return result;
}
}
views 아래 위치한 update.jsp 코드
<%@ 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 bgcolor="lightpink">
<!-- attribute로 지정한 값을 모두 프린트 할 수 있음 - session, model -->
회원정보 수정 처리 결과 : ${text}<br> <!-- $ : 출력해라, {} : 괄호 안의 값을 -->
업데이트된 전화번호 : ${tel}
</body>
</html>
실행 결과
4. One
one.jsp 코드
<%@ 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>
<!-- Latest compiled and minified CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Latest compiled JavaScript -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style type="text/css">
body { /* 컨트롤 + / - 자동주석, 태그선택! */
background: lightgray;
}
button {
background: pink;
}
.t1 { /* .은 클래스 선택!, 여러개선택! */
background: yellow;
width: 150px;
text-align: center;
}
</style>
</head>
<body>
<form action="one" method="get">
<!-- http://localhost:8898/web002/one.jsp?id=summer
질의문자열, 쿼리스트링!
-->
<!-- http의 header(요청주소+Get방식으로 넘어가는 데이터) -->
<table border="1" class="table table-dark table-hover">
<tr>
<td class="t1">검색할 아이디 :</td>
<td><input name="id" value="summer"></td>
</tr>
<tr>
<td colspan="2" class="t1">
<button id="b2" class="btn btn-danger">검색할 id 데이터 전송</button>
</td>
</tr>
</table>
</form>
</body>
</html>
MemberDAO.java one 부분
public MemberDTO one(MemberDTO bag) {
ResultSet table = null;
MemberDTO bag2 = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("1. 드라이버 설정 성공"); // <---> System.in :기본입력장치로 키보드
String url = "jdbc:mysql://localhost:3306/shop?serverTimezone=UTC";
String user = "root";
String password = "1234";
Connection con = DriverManager.getConnection(url, user, password); // Connection
System.out.println("2. db연결 성공");
String sql = "select * from member where id = ?";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, bag.getId());
System.out.println("3. sql문 생성 성공");
table = ps.executeQuery();
System.out.println("4. sql문 전송 성공");
//table에서 꺼내어 가방을 만들어 넣자.!!!
//System.out.println("결과가 있는지 확인>>" + table.next());
if(table.next()) {
bag2 = new MemberDTO();
bag2.setId(table.getString("id"));
bag2.setPw(table.getString("pw"));
bag2.setName(table.getString("name"));
bag2.setTel(table.getString("tel"));
}
ps.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
return bag2;
}
이 부분은 날코딩으로,
다음 시간에 Spring의 형태로 바꾼다고 한다.
MemberController.java one 부분
@RequestMapping("one")
public void one(MemberDTO bag, MemberDAO dao, Model model) {
System.out.println(bag);
MemberDTO bag2 = dao.one(bag);
// Views/one.jsp 까지 bag2의 값을 전달
// add.Attribute("이름", 값);
model.addAttribute("bag", bag2);
}
views 아래 one.jsp 코드
<%@ 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>
<!-- Latest compiled and minified CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- Latest compiled JavaScript -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
<style type="text/css">
body { /* 컨트롤 + / - 자동주석, 태그선택! */
background: lightgray;
}
button {
background: pink;
}
.t1 { /* .은 클래스 선택!, 여러개선택! */
background: yellow;
width: 150px;
text-align: center;
}
</style>
</head>
<body>
<!-- http://localhost:8898/web002/one.jsp?id=summer
질의문자열, 쿼리스트링!
-->
<!-- http의 header(요청주소+Get방식으로 넘어가는 데이터) -->
<table border="1" class="table table-dark table-hover">
<tr>
<td class="t1">검색할 아이디 :</td>
<td>${bag.id}</td>
</tr>
<tr>
<td class="t1">검색할 비밀번호 :</td>
<td>${bag.pw}</td>
</tr>
<tr>
<td class="t1">검색할 이름 :</td>
<td>${bag.name}</td>
</tr>
<tr>
<td class="t1">검색할 전화번호 :</td>
<td>${bag.tel}</td>
</tr>
</table>
</form>
</body>
</html>
출력 결과
'Back > Spring' 카테고리의 다른 글
Day49_Spring에서 MyBatis 사용하기 위한 세팅 (0) | 2023.07.05 |
---|---|
Day47_Library & Framework 차이점 (0) | 2023.07.04 |
Day42_Spring 정리 (0) | 2023.06.30 |
Day41_[Mac OS]Spring/STS 설치 및 세팅 (0) | 2023.06.30 |
Day33_DAO+VO(DTO)로 회원가입 페이지 생성(DB에 연결) with Exception(오류코드) (0) | 2023.06.21 |