프로젝트 구성
Spring기본적인 환경설정은 이전 글을 참고해주세요.
예제로 들어가기 전에 파악해야 할 Spring mvc의 흐름
View : 사용자가 보는 웹페이지
Controller : 사용자의 요청을 받아 Service로 넘겨주고 그 뒤로 처리된 값을 다시 받아와 요청을 사용자에게 다시 준다.
Service : 실제 비즈니스 로직을 처리하는 곳
DAO : DB에 접근하기 위한 로직을 처리하는 곳
예제로 들어가기 전에 파악해야 할 Spring 코드 설명
컨트롤러에서 @Autowired를 통해 DI(의존성 주입)으로 Service와 연결해줍니다.
서비스에서도 마찬가지로 dao와 연결해줍니다.
DAO에선 DB에 접근하기 위해 SqlSessionTemplate와 연결해줍니다.
Controller에서 메소드의 리턴 타입이 String이면 @RequestMapping의 value는 표시될 url을 의미하고
리턴값은 jsp파일의 이름을 의미합니다.
Controller에서 리턴값이 String이 아닌 ModelAndView일때
@RequestMapping의 value는 form의 action이나 location.href의 값과 같아야 합니다.
@ModelAttribute를 이용해
DTO와 FORM의 name이 같으면 매핑이 됩니다.
서비스로 fMember값을 넘겨줍니다.
컨트롤러에서 받아온 값을 dao로 넘겨주며 dao에서 처리되고 난 값을
잘 받아왔는지 체크 후 ModelAndView의 setViewName으로 이동할 페이지(JSP)를 설정합니다.
또한 어떠한 경우에는 ModelAndView의 addObject("jsp에서 사용할 이름", jsp에서 사용할 데이터); 을 통해
JSP에서 ${설정된이름.dto필드변수명}을 통해 바로 사용가능합니다.
mybatis-config.xml의 name-sapce와 id가 DAO의 각 CRUD 부분의 첫번째 인자로 들어갑니다.
sql.insert("네임스페이스.아이디", 넘겨줄 값); 으로 DAO에서 리턴값으로 작성해주며
MemberMapper.xml에서 쿼리문을 작성해 처리해줍니다.
parameterType은 받아오는 값의 타입을 의미하고
resultType은 쿼리문의 결과값의 타입을 의미합니다.
parameterType에 써있는 타입은 원래 com.icia.fmember.dto.FmemberDTO 이런식으로 가져와야 하는 것을
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.icia.member.dto.MemberDTO" alias="member"/>
<!-- com.icia.member.dto.MemberDTO 대신 alias 별칭으로 member로 사용한다고 변경 -->
</typeAliases>
</configuration>
src/main/resources 폴더에 mybatis-config.xml을 통해
위와같이 <typeAlias>를 통해 별칭(alias) 설정이 가능합니다.
FmemberController.java
package com.icia.fmember.controller;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.icia.fmember.dto.FmemberDTO;
import com.icia.fmember.service.FmemberService;
@Controller
public class FmemberController {
ModelAndView mav = new ModelAndView();
@Autowired
FmemberService fmsvc;
@Autowired
private HttpSession session;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String index() {
return "index";
}
@RequestMapping(value = "/registForm", method = RequestMethod.GET)
public String registForm() {
return "registForm";
}
// memberRegist 회원가입
@RequestMapping(value = "/memberRegist", method = RequestMethod.POST)
public ModelAndView memberRegist(@ModelAttribute FmemberDTO fMember) {
System.out.println("[1]Controller : "+fMember);
mav = fmsvc.memberRegist(fMember);
System.out.println("[5]Controller : "+fMember);
return mav;
}
//memberList 회원목록
@RequestMapping(value = "/memberList", method = RequestMethod.GET)
public ModelAndView memberList() {
System.out.println("[1]Controller : ");
mav = fmsvc.memberList();
System.out.println("[5]Controller : ");
return mav;
}
//memberInfo 특정 회원정보
@RequestMapping(value = "/memberInfo", method = RequestMethod.GET)
public ModelAndView memberInfo(@RequestParam("fId") String fId) {
System.out.println("[1]Controller : "+fId);
mav = fmsvc.memberInfo(fId);
System.out.println("[5]Controller : "+fId);
return mav;
}
@RequestMapping(value = "/modifyForm", method = RequestMethod.GET)
public ModelAndView modifyForm(@RequestParam("fId") String fId) {
System.out.println("[1]Controller : "+fId);
mav = fmsvc.modifyForm(fId);
System.out.println("[5]Controller : "+fId);
return mav;
}
// memberModify
@RequestMapping(value = "/memberModify", method = RequestMethod.POST)
public ModelAndView memberModify(@ModelAttribute FmemberDTO fMember) {
System.out.println("[1]Controller : "+fMember);
mav = fmsvc.memberModify(fMember);
System.out.println("[5]Controller : "+fMember);
return mav;
}
@RequestMapping(value = "/memberDelete", method = RequestMethod.GET)
public ModelAndView memberDelete(@RequestParam("fId") String fId) {
mav = fmsvc.memberDelete(fId);
return mav;
}
@RequestMapping(value = "/memberLogin", method = RequestMethod.POST)
public ModelAndView memberLogin(@ModelAttribute FmemberDTO fMember) {
System.out.println("[1] 로그인"+fMember);
mav = fmsvc.memberLogin(fMember);
System.out.println("[5] 로그인"+fMember);
return mav;
}
@RequestMapping(value = "/logout", method = RequestMethod.GET)
public String logout() {
session.invalidate();
return "index";
}
}
FmemberDAO.java
package com.icia.fmember.dao;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import com.icia.fmember.dto.FmemberDTO;
@Repository
public class FmemberDAO {
@Autowired
SqlSessionTemplate sql;
public int memberRegist(FmemberDTO fMember) {
// TODO Auto-generated method stub
System.out.println("[3]DAO : "+fMember);
return sql.insert("Fmember.regist",fMember);
}
public List<FmemberDTO> memberList() {
// TODO Auto-generated method stub
System.out.println("[3]DAO : ");
return sql.selectList("Fmember.list");
}
public FmemberDTO memberInfo(String fId) {
// TODO Auto-generated method stub
System.out.println("[3]DAO : "+fId);
return sql.selectOne("Fmember.info",fId);
}
public int memberModify(FmemberDTO fMember) {
// TODO Auto-generated method stub
System.out.println("[3]DAO : "+fMember);
return sql.update("Fmember.modify",fMember);
}
public int memberDelete(String fId) {
// TODO Auto-generated method stub
return sql.delete("Fmember.del",fId);
}
public String memberLogin(TmemberDTO fMember) {
// TODO Auto-generated method stub
System.out.println("[3] 로그인"+fMember);
return sql.selectOne("Fmember.login",fMember);
}
}
FmemberDTO.java
package com.icia.fmember.dto;
public class FmemberDTO {
private String fId;
private String fPw;
private String fName;
private String fBirth;
private String fGender;
private String fPhone;
private String fAddr;
private String fEmail;
// Controller에서
// 파라미터 값으로 (@ModelAttribute MemberDTO member) 해주고
// jsp의 form으로 넘겨주는 input값들의 name과 DTO의 변수명이 동일하면 자동으로 input의 값이 여기로 넘어온다!!
public String getfId() {
return fId;
}
public void setfId(String fId) {
this.fId = fId;
}
public String getfPw() {
return fPw;
}
public void setfPw(String fPw) {
this.fPw = fPw;
}
public String getfName() {
return fName;
}
public void setfName(String fName) {
this.fName = fName;
}
public String getfBirth() {
return fBirth;
}
public void setfBirth(String fBirth) {
this.fBirth = fBirth;
}
public String getfGender() {
return fGender;
}
public void setfGender(String fGender) {
this.fGender = fGender;
}
public String getfPhone() {
return fPhone;
}
public void setfPhone(String fPhone) {
this.fPhone = fPhone;
}
public String getfAddr() {
return fAddr;
}
public void setfAddr(String fAddr) {
this.fAddr = fAddr;
}
public String getfEmail() {
return fEmail;
}
public void setfEmail(String fEmail) {
this.fEmail = fEmail;
}
@Override
public String toString() {
return "FmemberDTO [fId=" + fId + ", fPw=" + fPw + ", fName=" + fName + ", fBirth=" + fBirth + ", fGender="
+ fGender + ", fPhone=" + fPhone + ", fAddr=" + fAddr + ", fEmail=" + fEmail + "]";
}
}
FmemberService.java
package com.icia.fmember.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.ModelAndView;
import com.icia.fmember.dao.FmemberDAO;
import com.icia.fmember.dto.FmemberDTO;
@Service
public class FmemberService {
ModelAndView mav = new ModelAndView();
@Autowired
FmemberDAO dao;
public ModelAndView memberRegist(FmemberDTO fMember) {
// TODO Auto-generated method stub
System.out.println("[2]Service : "+fMember);
int result = dao.memberRegist(fMember);
System.out.println("[4]Service : "+fMember);
if(result>0) {
mav.setViewName("index");
}else {
mav.setViewName("registForm");
}
return mav;
}
public ModelAndView memberList() {
// TODO Auto-generated method stub
System.out.println("[2]Service : ");
List<FmemberDTO> member = dao.memberList();
System.out.println("[4]Service : "+member);
mav.setViewName("memberList");
mav.addObject("memberList",member);
return mav;
}
public ModelAndView memberInfo(String fId) {
// TODO Auto-generated method stub
System.out.println("[2]Service : "+fId);
FmemberDTO member = dao.memberInfo(fId);
mav.setViewName("memberInfo");
mav.addObject("view",member);
System.out.println("[4]Service : "+member);
return mav;
}
public ModelAndView modifyForm(String fId) {
// TODO Auto-generated method stub
System.out.println("[2]Service : "+fId);
FmemberDTO member = dao.memberInfo(fId);
mav.setViewName("modifyForm");
mav.addObject("modi",member);
System.out.println("[4]Service : "+member);
return mav;
}
public ModelAndView memberModify(FmemberDTO fMember) {
// TODO Auto-generated method stub
System.out.println("[2]Service : "+fMember);
int result = dao.memberModify(fMember);
if(result > 0) {
mav.setViewName("redirect:/memberInfo?fId="+fMember.getfId());
}else {
mav.setViewName("modifyForm");
}
System.out.println("[4]Service : "+fMember);
return mav;
}
public ModelAndView memberDelete(String fId) {
// TODO Auto-generated method stub
int result = dao.memberDelete(fId);
if(result > 0) {
mav.setViewName("redirect:/memberList");
mav.addObject("memberList",fId);
}else {
mav.setViewName("redirect:/memberList");
mav.addObject("memberList",fId);
}
return mav;
}
public ModelAndView memberDelete(String fId) {
// TODO Auto-generated method stub
int result = dao.memberDelete(fId);
if(result > 0) {
mav.setViewName("redirect:/memberList");
mav.addObject("memberList",fId);
}else {
mav.setViewName("redirect:/memberList");
mav.addObject("memberList",fId);
}
return mav;
}
public ModelAndView memberLogin(TmemberDTO fMember) {
// TODO Auto-generated method stub
System.out.println("[2] 로그인"+fMember);
String memberId = dao.memberLogin(fMember);
if(memberId!=null) {
mav.setViewName("index");
session.setAttribute("loginId", memberId);
}else {
mav.setViewName("loginForm");
}
System.out.println("[4] 로그인"+fMember);
return mav;
}
}
MemberMapper.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="Fmember">
<insert id="regist" parameterType="member">
INSERT INTO MEMBER VALUES(#{fId},#{fPw},#{fName},#{fBirth},#{fGender},#{fPhone},#{fAddr},#{fEmail})
</insert>
<select id="list" resultType="member">
SELECT * FROM MEMBER
</select>
<select id="info" parameterType="String" resultType="member">
SELECT * FROM MEMBER WHERE FID = #{fId}
</select>
<update id="modify" parameterType="member">
UPDATE MEMBER SET FPW = #{fPw}, FNAME = #{fName}, FBIRTH = #{fBirth}, FGENDER = #{fGender}, FPHONE = #{fPhone}, FADDR = #{fAddr}, FEMAIL = #{fEmail} WHERE FID = #{fId}
</update>
<delete id="del">
DELETE FROM MEMBER WHERE FID = #{fId}
</delete>
<select id="login" parameterType="member" resultType="String">
SELECT FID FROM MEMBER WHERE FID = #{fId} AND FPW =#{fPw}
</select>
</mapper>
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<typeAliases>
<typeAlias type="com.icia.fmember.dto.FmemberDTO" alias="member"/>
<!-- com.icia.member.dto.MemberDTO 대신 alias 별칭으로 member로 사용한다고 변경 -->
</typeAliases>
</configuration>
index.jsp
<%@ 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>
<h1>Index페이지</h1>
<c:choose>
<c:when test="${not empty loginId}">
<p>${loginId}님! 안녕하세요!</p>
<button onclick="location.href='logout'">로그아웃</button>
</c:when>
<c:otherwise>
<p>안녕하세요!</p>
<!-- 회원가입 페이지로 이동하는 방법1 -->
<!--<a href="joinForm"><p>회원가입1</p></a> -->
<!-- 회원가입 페이지로 이동하는 방법2 -->
<button onclick="location.href='registForm'">회원가입</button>
<br/>
<br/>
<!-- 회원목록 페이지로 이동하는 방법3 -->
<input id="btn" type="button" value="회원목록">
<br/>
<br/>
<!-- include예제 확인하기 -->
<!-- <button onclick="location.href='directive'">include</button> -->
<button onclick="location.href='loginForm'">로그인</button>
<br/>
<br/>
</c:otherwise>
</c:choose>
</body>
<script type="text/javascript">
const btn = document.querySelector("#btn");
function mList(){
location.href="memberList";
}
btn.addEventListener("click",mList);
</script>
</html>
registForm.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>
<h1>회원가입 페이지</h1>
<!-- action : Controller로 보낼 주소 -->
<!-- name 값은 DTO와 일치해야 한다. -->
<form action="memberRegist" method="POST">
<p>아이디 : <input type="text" name="fId"/></p>
<p>비밀번호 : <input type="password" name="fPw"/></p>
<p>이름 : <input type="text" name="fName"/></p>
<p>생년월일 : <input type="date" name="fBirth"/></p>
<p>성별 : 여자<input type="radio" name="fGender" value="여자"/>
남자<input type="radio" name="fGender" value="남자"/>
</p>
<p>연락처: <input type="text" name="fPhone"/></p>
<p>주소: <input type="text" name="fAddr"/></p>
<p>이메일: <input type="text" name="fEmail"/></p>
<input type="submit" value="가입"/>
<input type="reset" value="다시작성"/>
</form>
</body>
</html>
modifyForm.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>
<h1>회원가입 페이지</h1>
<!-- action : Controller로 보낼 주소 -->
<!-- name 값은 DTO와 일치해야 한다. -->
<form action="memberModify" method="POST">
<p>아이디 : ${modi.fId}</p>
<input type="hidden" name="fId" value="${modi.fId}"/>
<p>비밀번호 : <input type="password" name="fPw"/></p>
<p>이름 : <input type="text" name="fName" placeholder="${modi.fName}"/></p>
<p>생년월일 : <input type="date" name="fBirth" placeholder="${modi.fBirth}"/></p>
<p>성별 : 여자<input type="radio" name="fGender" value="여자"/>
남자<input type="radio" name="fGender" value="남자"/>
</p>
<p>연락처: <input type="text" name="fPhone" placeholder="${modi.fPhone}"/></p>
<p>주소: <input type="text" name="fAddr" placeholder="${modi.fAddr}"/></p>
<p>이메일: <input type="text" name="fEmail" placeholder="${modi.fEmail}"/></p>
<input type="submit" value="정보수정"/>
<input type="reset" value="다시작성"/>
</form>
</body>
</html>
memberList.jsp
<%@ 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>회원목록 페이지</title>
<style>
table, tr, td, th {
border: 1px solid;
border-collapse: collapse;
padding: 5px;
}
@media all and (min-width: 768px) and (max-width: 1024px) {
.regist-box > div > input{
font-size: 25px;
}
.regist-box > :nth-child(5){
margin-left: -90px;
}
}
@media all and (min-width: 1025px) {
.regist-box > div > input{
font-size: 35px;
}
.regist-box > :nth-child(5){
margin-left: -130px;
}
}
body,p{
padding: 0px auto;
margin: 0px auto;
}
.submit button{
width: 142px;
}
.userid{
ime-mode:disabled;
}
.modal{
/* display: none; Hidden by default */
position: fixed; /* Stay in place */
z-index: 1; /* Sit on top */
left: 0;
top: 0;
width: 100%; /* Full width */
height: 100%; /* Full height */
overflow: auto; /* Enable scroll if needed */
background-color: rgb(0,0,0); /* Fallback color */
background-color: rgba(0,0,0,0.5); /* Black w/ opacity */
}
#message-box{
/* background-color: #fefefe;
border: 1px solid black;
width: 100px;
height: 100px;
justify-content: center;
align-items: center;
*/
display: flex;
background-color: #fefefe;
margin: 15% auto;
padding: 20px;
border: 1px solid darkgray;
width: 300px;
border-radius: 7px;
align-items: center;
justify-content: center;
flex-direction: column;
}
#popup-button{
width: 100px;
height: 35px;
display: inline;
}
#popup-button2{
width: 100px;
height: 35px;
}
</style>
</head>
<body>
<content class="regist-frame">
<table>
<tr>
<th>아이디</th>
<th>이름</th>
<th>생년월일</th>
<th>수정</th>
<th>삭제</th>
</tr>
<!-- c태그
taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" 추가해야 사용가능 -->
<c:forEach var="mem" items="${memberList}">
<!-- memberList의 크기만큼 forEach 돌아감 var는 memberList의 이름을 mem으로 변경해서 사용가능-->
<!-- service에서 mav.addObject("jsp에서 사용할 이름 ", jsp에서 사용할 데이터);로 설정해준
이름으로 items="{jsp에서 사용할 이름}"으로 사용한다.
-->
<tr>
<td><a href="memberInfo?fId=${mem.fId}">${mem.fId}</a></td>
<td>${mem.fName}</td>
<td>${mem.fBirth}</td>
<td><button
onclick="popUpMessage('${mem.fId}','modiBtn')">수정</button></td>
<%-- <td><button
onclick="location.href='memberDelete?fId=${mem.fId}'">삭제</button></td> --%>
<td><button
onclick="popUpMessage('${mem.fId}','delBtn')">삭제</button></td>
</tr>
</c:forEach>
</table>
</content>
</body>
<script type="text/javascript">
const modal = document.createElement("div");
const messageBox = document.createElement("div");
const messageBtn = document.createElement("button");
const messageBtn2 = document.createElement("button");
const message = document.createElement("span");
const content = document.querySelector(".regist-frame");
/* modiBtn.addEventListener("click",()=>{
});
delBtn.addEventListener("click",()=>{
});
*/
function popUpMessage(id,name){
modal.className = "modal";
messageBox.id = "message-box";
messageBtn.id = "popup-button";
messageBtn2.id = "popup-button2";
//messageBtn.setAttribute("value","확인");
messageBtn.innerText = "확인";
messageBtn2.innerText = "취소";
content.appendChild(modal);
modal.appendChild(messageBox);
messageBox.appendChild(message);
messageBox.appendChild(messageBtn);
messageBox.appendChild(messageBtn2);
if(name=='modiBtn'){
message.innerText = "수정 하시겠습니까?";
messageBtn.addEventListener("click",()=>location.href="modifyForm?fId="+id);
messageBtn2.addEventListener("click",()=>modal.remove());
}else if(name=='delBtn'){
message.innerText = "삭제 하시겠습니까?";
messageBtn.addEventListener("click",()=>location.href="memberDelete?fId="+id);
messageBtn2.addEventListener("click",()=>modal.remove());
}
}
</script>
</html>
memberInfo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원목록 페이지</title>
<style>
table,tr,td,th{
border : 1px solid;
border-collapse: collapse;
padding: 5px;
}
</style>
</head>
<body>
<table>
<tr>
<th>아이디</th>
<td>${view.fId}</td>
</tr>
<tr>
<th>비밀번호</th>
<td>${view.fPw}</td>
</tr>
<tr>
<th>이름</th>
<td>${view.fName}</td>
</tr>
<tr>
<th>생년월일</th>
<td>${view.fBirth}</td>
</tr>
<tr>
<th>성별</th>
<td>${view.fGender}</td>
</tr>
<tr>
<th>연락처</th>
<td>${view.fPhone}</td>
</tr>
<tr>
<th>주소</th>
<td>${view.fAddr}</td>
</tr>
<tr>
<th>이메일</th>
<td>${view.fEmail}</td>
</tr>
</table>
</body>
</html>
Create
Read
로그인 기능은 HttpSession을 @Autowired로 연결해 처리해줍니다.
Service에서 session.setAttribute로 값을 설정해준 다음
c태그 사용방법은 jsp파일 위에 taglib를 선언해줍니다.
c태그는 jsp 지시어중 하나로 Taglib 지시어에 속합니다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
Taglib 지시어
- ex) <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
- prefix : 어떤 타입의 태그 라이브러리를 작성할 것인가.
- uri : 실제 존재하고 있는 TLD파일의 위치정보
- TLD파일 : 커스텀 태크 정보를 담고 있는 라이브러리 파일
(1) 출력태그 : <c:out>
(2) 변수설정 태그 : <c:set>
(3) 삭제태그 : <c:remove>
(4) 예외처리 태그 : <c:catch>
(5) 조건처리 태그 : <c:if>, <c:choose>, <c:when>, <c:otherwise>
(6) 반복처리 태그 : <c:foreach>
(7) 페이지처리 태그 : <c:import>, <c:redirect>, <c:param>
c:choose는 c:when과 c:otherwise와 같이 사용되며
<c:choose>
<c:when> // if와 같음
</c:when>
<c:otherwise> // else와 같음
</c:otherwise>
</c:choose>
같은 방식으로 사용됩니다.
Update
alter대신 modal창을 직접 만들어 사용하였습니다.
Delete
'Spring' 카테고리의 다른 글
SpringBoot 스프링부트 프로젝트 설정방법 (0) | 2022.05.23 |
---|---|
스프링(Spring ) Security 비밀번호 암호화 (0) | 2022.05.04 |
스프링(Spring) 비동기 Ajax 아이디 중복확인 및 로그인 예제와 @RequestParam , @RequestBody, @ModelAttribute 차이점 (0) | 2022.05.01 |
스프링 페이징 처리 (0) | 2022.04.26 |
Spring 기본 환경 설정 방법 (0) | 2022.04.12 |