-
[JSTL] CSS 추가한 loginWEB/JSTL 2022. 9. 9. 20:44
sql로 테이블 생성
create table member( name varchar2(30), userid varchar2(30), pwd varchar2(30), email varchar2(30), phone varchar2(15), admin number(1) default 0, -- 0:일반사용자 , 1:관리자 primary key(userid) ); create table board( num number(5) primary key, pass varchar2(30), --게시물의 수정 삭제를 위한 비번 userid varchar2(30), email varchar2(30), title varchar2(50), content varchar2(1000), readcount number(4) default 0, --조회수 writedate date default sysdate --작성일자 ); insert into member values('이소미', 'somi','1234','somi@anver.com','010-1234-1234',1); insert into member values('하상오', 'sang','1234','sang@naver.com','010-5555-6666',0); insert into member values('김하나', 'hana','1234','hana@daum.net','010-1111-1111',0); insert into member values('김두울','do', '1234','do@naver.com','010-2222-2222',0); insert into member values('홍길동','hong','1234','hong@daum.net','010-8888-9999',1); create sequence board_seq start with 1 increment by 1; insert into board(num, userid, email, pass, title, content) values(board_seq.nextVal, 'hong', 'abc@naver.com','1234', '첫방문입니다','반갑습니다. 앞으로 많은 격려와 지도 부탁드립니다.'); insert into board(num, userid, email, pass, title, content) values(board_seq.nextVal, 'somi', 'add@naver.com','1234', '게시판 개설','축하드립니다. 무궁한 발전을 기원할게요.'); insert into board(num, userid, email, pass, title, content) values(board_seq.nextVal, 'hana', 'bnbn@naver.com','1234', '돼지골마을','돼지삼겹살 맛있어요.'); insert into board(num, userid, email, pass, title, content) values(board_seq.nextVal, 'hana', 'hana@daum.net','1234', '코로나바이러스','사회적 거리두기가 끝나갑니다.'); insert into board(num, userid, email, pass, title, content) values(board_seq.nextVal, 'hana', 'hana@daum.net','1234', '1월 겨울','몹시 추울 것 같아요.'); insert into board(num, userid, email, pass, title, content) values(board_seq.nextVal, 'hong', 'hana@daum.net','1234', '범죄도시2','마동석이 주연인 영화입니다.'); insert into board(num, userid, email, pass, title, content) values(board_seq.nextVal, 'somi', 'hana@daum.net','1234', '원숭이두창','국내에 첫 확진자가 발생했습니다.'); create table reply( replynum number(7) primary key, --댓글 순번 boardnum number(5), --댓글의 해당 게시물 번호 userid varchar2(30), --댓글 쓰니 writedate date default sysdate, --작성일 content varchar2(1000) --작성 내용 ); -- 댓글은 board 테이블에 저장되지 않음. -- 한두개의 댓글만 달리고 말거라면 -- board 테이블에 댓글 필드를 두세개 생성하고 저장해도 되지만 -- 게시판에 있는 각 게시물들에 대한 댓글은 -- 작성될 수 있는 갯수 제한이 없기 때문에 -- 모든 댓글을 하나의 테이블에 저장함. -- 이때 반드시 저장되는 댓글에는 -- 어느 게시물의 댓글인지 게시물 번호를 같이 저장해야 함. -- 그래야 해당 게시물이 화면에 표시될 때 그 게시물의 댓글만 -- 조회(검색)해서 따로 화면에 표시할 수 있음. create sequence reply_seq start with 1 increment by 1; insert into reply values(reply_seq.nextVal,1,'somi',sysdate, '게시판 개설을 축하드립니다'); insert into reply values(reply_seq.nextVal,2,'light',sysdate, '첫 게시글 작성 감사합니다'); insert into reply values(reply_seq.nextVal,3,'scott',sysdate, '맛있게 보입니다.');
*Action 코드 배경색 - 검정
*ActionFactory 안 command될 Action 코드 배경색 - 줄무늬
로그인 첫 시작화면
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>index.jsp</title> </head> <body> <% response.sendRedirect("board.do?command=loginForm"); %> </body> </html>
main Servlet 생성
package com.model.board.controller; import java.io.IOException; 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 com.model.board.controller.action.Action; @WebServlet("/board.do") public class BoardServlet extends HttpServlet { private static final long serialVersionUID = 1L; public BoardServlet() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 전달될 command 값을 추출함 String command=request.getParameter("command"); // 추출할 command 값에 따라 해당 기능을 담고 있을 클래스의 // new 인스턴스를 인터페이스 래퍼런스 변수에 저장함. // 이를 위해서 ActionFactory 클래스의 // getAction이라는 메서드 사용됨. // Action ac=new LoginFormAction(); // 이 동작을 ActionFactory 클래스의 // getAction이라는 메서드에서 실행. // 클래스에 인스턴스 생성 ActionFactory af=ActionFactory.getInstance(); // 메서드 실행 후 리턴되는 ac 값을 래퍼런스 변수에 저장함 Action ac=af.getAction(command); if(ac==null) System.out.println("ac==null"); else ac.execute(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); doGet(request, response); } }
Action interface 생성
package com.model.board.controller.action; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface Action { public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException; }
ActionFactory 생성
package com.model.board.controller; import com.model.board.controller.action.Action; public class ActionFactory { private ActionFactory() {} private static ActionFactory itc=new ActionFactory(); public static ActionFactory getInstance() {return itc;} public Action getAction(String command) { Action ac=null; // 이 안에 command될 Action 생성 return ac; } }
로그인 화면
if(command.equals("loginForm")) ac=new LoginFormAction();
package com.model.board.controller.action; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LoginFormAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url = "member/loginForm.jsp"; request.setAttribute("message", request.getParameter("message")); HttpSession session = request.getSession(); if( session.getAttribute("loginUser") != null ) url = "board/main.jsp"; RequestDispatcher dp = request.getRequestDispatcher(url); dp.forward(request, response); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>loginForm.jsp</title> <link rel="stylesheet type=text/css" href="css/board.css"> <script src="script/board.js"></script> </head> <body> <form action="board.do" method="post" name="frm"> <input type="hidden" name="command" value="login"> <div class="box">LOG IN</div> <div class="box"> <div class="label">아이디</div> <div class="item"> <input type="text" name="userid" id="loginid" size="20"> </div> </div> <div class="box"> <div class="label">비밀번호</div> <div class="item"> <input type="password" name="pwd" id="loginpwd" size="20"> </div> </div> <div class="box"> <input type="submit" value="로그인" onClick="return loginCheck();"> <input type="button" value="회원가입" onClick="location.href='board.do?command=joinForm'"> </div> <div class="box">${message}</div> </form> </body> </html>
board.css 파일 - 로그인 화면을 꾸며줌
@charset "UTF-8"; .box{position:relative; width:500px; height:50px; margin:0 auto; text-align:center; line-height:50px; font-weight:bold;} .label{position:relative; width:248px; height:48px; float:left; background:yellowgreen; font-size:110%; text-align:center; line-height:50px; border:1px solid yellowgreen;} .item{position:relative; width:248px; height:48px; float:left; border:1px solid yellowgreen; font-size:110%; text-align: left; line-height:50px;} #loginid{width:200px; height:20px; border:0px; font-size:110%; border:0; outline:none;} #loginpwd{width:200px; height:20px; border:0px; font-size:110%; border:0; outline:none;}
board.js 파일 생성 - loginCheck()
function loginCheck(){ if( document.frm.userid.value.length==0 ){ alert("아이디를 입력하세요"); document.frm.userid.focus(); return false; } if( document.frm.pwd.value.length==0){ alert("암호를 입력하세요"); document.frm.pwd.focus(); return false; } return true; }
connection 클래스 생성
package com.model.board.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Dbman { static String driver="oracle.jdbc.driver.OracleDriver"; static String url="jdbc:oracle:thin:@localhost:1521:xe"; public static Connection getConnection() { Connection con=null; try { Class.forName(driver); con=DriverManager.getConnection(url,"scott","tiger"); } catch(ClassNotFoundException e) {e.printStackTrace(); } catch(SQLException e) {e.printStackTrace();} return con; } public static void close(Connection con, PreparedStatement pstmt, ResultSet rs) { try { if(con!=null) con.close(); if(pstmt!=null) pstmt.close(); if(rs!=null) rs.close(); } catch(SQLException e) {e.printStackTrace();} } }
MemberDto 생성
package com.model.board.dto; public class MemberDto { private String name; private String userid; private String pwd; private String email; private String phone; private int admin; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public int getAdmin() { return admin; } public void setAdmin(int admin) { this.admin = admin; } }
MemberDao 생성
package com.model.board.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class MemberDao { private MemberDao() {} private static MemberDao itc=new MemberDao(); public static MemberDao getInstance() {return itc;} Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; }
MemberDto 생성
package com.model.board.dto; import java.sql.Timestamp; public class BoardDto { private int num; private String pass; private String userid; private String email; private String title; private String content; private int readcount; private Timestamp writedate; private int replycnt; // java.sql.date: 날짜와 시간 형식 사용 // java.sql.timestamp: 날짜, 시간, 밀리초 형식 사용 // 좀 더 세밀한 시간 사용을 위해 timestamp를 사용함 public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getPass() { return pass; } public void setPass(String pass) { this.pass = pass; } public String getUserid() { return userid; } public void setUserid(String userid) { this.userid = userid; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getReadcount() { return readcount; } public void setReadcount(int readcount) { this.readcount = readcount; } public Timestamp getWritedate() { return writedate; } public void setWritedate(Timestamp writedate) { this.writedate = writedate; } public int getReplycnt() { return replycnt; } public void setReplycnt(int replycnt) { this.replycnt = replycnt; } }
MemberDao 생성
package com.model.board.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; public class BoardDao { private BoardDao() {} private static BoardDao itc=new BoardDao(); public static BoardDao getInstance() {return itc;} Connection con=null; PreparedStatement pstmt=null; ResultSet rs=null; }
로그인 실행하기
else if(command.equals("login")) ac=new LoginAction();
package com.model.board.controller.action; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.model.board.dao.MemberDao; import com.model.board.dto.MemberDto; public class LoginAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userid = request.getParameter("userid"); String pwd = request.getParameter("pwd"); MemberDao mdao = MemberDao.getInstance(); MemberDto mdto = mdao.getMember( userid ); String url = "member/loginForm.jsp"; if( mdto == null ) { request.setAttribute("message","아이디가 없음"); }else if( mdto.getPwd() == null ) { request.setAttribute("message","database 오류"); }else if( !mdto.getPwd().equals( pwd ) ) { request.setAttribute("message","비밀번호 틀림"); }else if( mdto.getPwd().equals( pwd ) ) { url = "board.do?command=main"; HttpSession session = request.getSession(); session.setAttribute("loginUser", mdto); }else { request.setAttribute("message", "관리자에게 문의"); } RequestDispatcher dp = request.getRequestDispatcher(url); dp.forward(request, response); } }
MemberDao에 getMember 실행
public MemberDto getMember(String userid) { MemberDto mdto=null; String sql="select*from member where userid=?"; con=Dbman.getConnection(); try { pstmt=con.prepareStatement(sql); pstmt.setString(1, userid); rs=pstmt.executeQuery(); if(rs.next()) { mdto=new MemberDto(); mdto.setName(rs.getString("name")); mdto.setUserid(rs.getString("userid")); mdto.setPwd(rs.getString("pwd")); mdto.setEmail(rs.getString("email")); mdto.setPhone(rs.getString("phone")); mdto.setAdmin(rs.getInt("admin")); } } catch(SQLException e){e.printStackTrace(); } finally{Dbman.close(con, pstmt, rs);} return mdto; }
로그인 후 화면
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%> <c:if test="${empty loginUser}"> <jsp:forward page='../board.do?command=loginForm' /> </c:if> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>main.jsp</title> <link rel="stylesheet" type="text/css" href="css/board.css"> </head> <body> <div id="wrap" align="center"> <h1>게시글 리스트</h1> <table> <tr> <td colspan="5" style="border:white;"> <div style="float:left;"> ${loginUser.name}(${loginUser.userid})님 로그인 <input type="button" value="회원정보수정" onClick="location.href='board.do?command=updateMemberForm'"/> <input type="button" value="로그아웃" onClick="location.href='board.do?command=logout'"> </div> <div style="float:right;"> <a href="board.do?command=boardWriteForm"> 게시글 등록</a></div> </td> </tr> <tr><th>번호</th><th>제목</th><th>작성자</th> <th>작성일</th><th>조회</th></tr> <c:forEach items="${bList}" var="board"> <tr align="center"> <td width="100">${board.num}</td> <td align="left"> <a href="board.do?command=boardView&num=${board.num}"> ${board.title} </a> </td> <td width="100">${board.userid}</td> <td width="200">${board.writedate}</td> <td width="100">${board.readcount}</td> </tr> </c:forEach> </table> </div> </body> </html>
board.css 파일 - 로그인 후 화면을 꾸며줌
#wrap{width:971px; margin:0 auto; } h1{color:green;} table{width:100%; border-collapse: collapse; font-size:12px; line-height:24px;} table td, th{border:#d3d3d3 solid 1px; padding:5px;} th{background:yellowgreen;} a{text-decoration:none; color:balck;} a:HOVER{text-decoration:underline; color:green;}
로그아웃
else if(command.equals("logout")) ac=new LogoutAction();
package com.model.board.controller.action; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class LogoutAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); session.invalidate(); RequestDispatcher dp = request.getRequestDispatcher("member/loginForm.jsp"); dp.forward(request, response); } }
회원가입 화면
else if(command.equals("joinForm")) ac=new JoinForm();
package com.model.board.controller.action; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class JoinForm implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { RequestDispatcher dp = request.getRequestDispatcher("member/joinForm.jsp"); dp.forward(request, response); } }
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>joinForm.jsp</title> <link rel="stylesheet" type="text/css" href="css/board.css"> <script src="script/board.js"></script> </head> <body> <div id="wrap" align="center"> <h1>사용자 등록</h1> <form name="frm" method="post" action="board.do"> <input type="hidden" name="command" value="join"> <table> <tr><th>아이디</th><td> <input type="text" name="userid" size="20"> * <input type="button" value="중복체크" onClick="idCheck();"> <input type="hidden" name="reid"></td></tr> <tr><th>이름</th><td> <input type="text" size="20" name="name"> *</td></tr> <tr><th>비밀번호</th><td> <input type="password" name="pwd" size="20"> *</td></tr> <tr><th>비밀번호</th><td> <input type="password" name="pwd_check" size="20"> *</td></tr> <tr><th>이메일</th><td> <input type="text" size="30" name="email"></td></tr> <tr><th>전화번호</th><td> <input type="text" size="20" name="phone"></td></tr> <tr><th>등급</th><td> <input type="radio" name="admin" value="0" checked="checked">일반회원 <input type="radio" name="admin" value="1">관리자</td></tr> </table><br><br> <input type="submit" value="등록" onclick="return joinCheck()"> <input type="reset" value="다시 작성"> <input type="button" value="로그인페이지로" onclick="location.href='board.do?command=loginForm'"> </form> </div> </body> </html>
board.js에 idCheck() 추가
function idCheck(){ if( document.frm.userid.value==""){ alert("아이디를 입력해주세요"); document.from.userid.focus(); return; } var inputid = document.frm.userid.value; var opt = "toolbar=no, menubar=no, scrollbars=yes, " + "resizable=no, width=500, height=200"; window.open("board.do?command=idcheck&userid=" + inputid , "idcheck", opt); }
아이디 중복 확인
else if( command.equals("idcheck") ) ac = new IdCheckAction();
package com.model.board.controller.action; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.model.board.dao.MemberDao; import com.model.board.dto.MemberDto; public class IdCheckAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String userid = request.getParameter("userid"); MemberDao mdao = MemberDao.getInstance(); MemberDto mdto = mdao.getMember(userid); int result = 1; if( mdto == null )result = -1; request.setAttribute("userid", userid); request.setAttribute("result", result); RequestDispatcher rd = request.getRequestDispatcher("member/idcheck.jsp"); rd.forward(request, response); } }
<%@ 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>idcheck.jsp</title> <link rel="stylesheet" type="text/css" href="CSS/board.css"> <script src="script/board.js" type="text/javascript"></script> </head> <body> <form action="board.do" method="post" name="frm"> <input type="hidden" name="command" value="idcheck"> 아이디 <input type="text" name="userid" value="${userid}"> <input type=submit value="중복 체크"><br> <!-- 아이디재검색 --> </form><br><br><br> <c:if test="${result==1}"> <script type="text/javascript"> opener.document.frm.userid.value = ""; </script> ${userid}는 이미 사용 중인 아이디입니다. </c:if> <c:if test="${result==-1}"> ${userid}는 사용 가능한 아이디입니다. <input type="button" value="사용" class="cancel" onclick="idok('${userid}')"> </c:if> </body> </html>
board.js에 idok(), joinCheck() 추가
function idok( userid ){ opener.frm.userid.value = userid; opener.frm.reid.value = userid; self.close(); } function joinCheck(){ if( document.frm.userid.value.length==0){ alert("아이디는 필수입력사항입니다"); document.frm.userid.focus(); return false; }else if( document.frm.userid.value.length<4){ alert("아이디는 4글자 이상이어야 합니다."); document.frm.userid.focus(); return false; }else if( document.frm.userid.value != document.frm.reid.value){ alert("아이디 중복체크를 하지 않았습니다"); document.frm.userid.focus(); return false; }else if( document.frm.name.value.length==0){ alert("이름은 필수입력사항입니다"); document.frm.name.focus(); return false; }else if( document.frm.pwd.value==""){ alert("비밀번호는 반드시 입력하여야 합니다"); document.frm.pwd.focus(); return false; }else if( document.frm.pwd.value != document.frm.pwd_check.value){ alert("비밀번호와 확인이 일치하지 않습니다"); document.frm.pwd_check.focus(); return false; }else{ return true; } }
회원가입 실행
else if( command.equals("join") ) ac = new JoinAction();
package com.model.board.controller.action; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.model.board.dao.MemberDao; import com.model.board.dto.MemberDto; public class JoinAction implements Action { @Override public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 전달인수들을 모두 Dto 에 넣고 insertMember 에 보내줍니다 MemberDto mdto = new MemberDto(); mdto.setUserid(request.getParameter("userid")); mdto.setName(request.getParameter("name")); mdto.setPwd(request.getParameter("pwd")); mdto.setEmail(request.getParameter("email")); mdto.setPhone(request.getParameter("phone")); mdto.setAdmin(Integer.parseInt( request.getParameter("admin"))); MemberDao mdao = MemberDao.getInstance(); int result = mdao.insertMember( mdto ); String message = ""; if( result==1) message= "회원가입이 완료되었습니다. 로그인하세요"; else message= "회원가입이 실패했습니다. 관리자에게 문의하세요"; // forward 메서드로 이동한 최종 도착 페이지에서는 새로 고침을 하면 // 데이터도 한번 더 추가되려고 시도함 // 새로고침에 의해 포워딩 이전 코드가 다시 실행되지 않으려면 // sendRedirect를 이용함 response.sendRedirect( "board.do?command=loginForm&message=" + URLEncoder.encode(message, "UTF-8" ) ); } }
MemberDao에 insertMember 생성
public int insertMember(MemberDto mdto) { int result = 0; String sql = "insert into " + "member(userid, pwd, name, phone, email, admin)" + " values( ? , ? , ? , ? , ? , ? )"; con = Dbman.getConnection(); try { pstmt = con.prepareStatement(sql); pstmt.setString(1, mdto.getUserid()); pstmt.setString(2, mdto.getPwd()); pstmt.setString(3, mdto.getName()); pstmt.setString(4, mdto.getPhone()); pstmt.setString(5, mdto.getEmail()); pstmt.setInt(6, mdto.getAdmin()); result = pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { Dbman.close(con, pstmt, rs); } return result; }
.'WEB > JSTL' 카테고리의 다른 글
[JSTL] file upload (0) 2022.09.10 [JSTL] interface를 이용한 login (0) 2022.09.09 [JSTL] 정보수정, 회원&관리자 변화, 탈퇴 (0) 2022.09.09 [JSTL] 로그인, 회원가입, 로그아웃 (0) 2022.09.09 [JSTL] import, redirect, format, form, checkbox (1) 2022.09.09