[ 커스텀 태그 ]
○ 사용자 정의 태그
○ 스크립트릿 사용 줄이고 태그와 같은 형태로 프로그램 코드를 대체하거나 재활용 가능한 구조 통해 태그 라이브러리로 활용하고자 개발된 규격
○ taglib 지시어 사용해 커스텀 태그가 어디에 정의되어 있는지 먼저 선언, 태그에 사용할 접두어 지정
○ 프로젝트가 특정 커스텀에 종속될 수 있다는 문제 때문에 커스텀 태그를 직접 만드는 방식 점차 감소
<%@ taglib tagdir="/WEB-INF/tags" prefix="m" %>
<m:printData pid="87459989" />
[ EL ]
○ EL(Expression Language)
- 현재 페이지의 자바 객체 혹은 aaplication, session, request, page와 같은 scope object에 저장된 자바 빈 객체를
손쉽게 접근하고 사용할 수 있게 해줌
- 사칙연산, 비교연산, 논리연산 3항 연상 등 지원
- 핵심 로직의 구현보다는 상황에 따라 촐력값을 변경하는 정도의 용도로 사용하는 것이 좋음
- 자바 빈 객체 참조 방법
${저장이름.변수명}
[ JSTL ]
○ JSTL(JSP Standard Tag Library)
- 자바 코드 블록을 사용하지 않고 HTML 형식을 유지하면서 조건문, 반복문, 간단한 연산 손쉽에 사용 지원
- Impl : taglibs-standard-impl-1.2.5.jar
- Spec : taglibs-standard-spec-1.2.5.jar
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
[ MVC 패턴 ]
○ Model
- 데이터를 처리하는 영역
- 데이터베이스와 연동 위한 DAO(Data Access Object)클래스와 데이터 구조를 표현하는 DO(Data Object),
엔티티 클래스 등으로 구성됨
○ View
- 화면 구성 담당하는 영역
- 뷰에서 데이터를 직접 가져오는 방식은 권장하지 않고 주어진 데이터 출력 용도로만 사용하는 것이 바람직함
○ Controller
- 모든 사용자 요청의 중심에 위치
- 사용자 요청은 특정 뷰에 바로 전달되지 않고 컨트롤러를 통해야 함
- 컨트롤러는 사용자 요청에 따라 모델을 통해 데이터베이스와 연동해 데이터 처리하고 뷰에 전달
- 뷰로 전달하기 위해 데이터가 들어 있는 DO 혹은 List<DO> 형태의 객체를 request에 저장한 후 포워딩
- 컨트롤러는 특정 뷰를 지정해야 하기 때문에 종속관계 불가피함
○ 프론트 컨트롤러 구현
public void init(ServletConfig sc) rhrows ServletException {
Map<String, SubController> contList = new HashMap<>();
contList.put("/create.do", new MemberCreateController());
contList.put("/login.co", new LoginController());
...
}
public void service(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {
String url = request.gerRequestURI();
String contextPath = request.getContextPath();
String path = url.subString(contextPath.length());
SubController subController = conList.get(path);
subController.process(requset, response);
- 처리하고자 하는 요청 URL을 키로 해서 컨트롤러 클래스 인스터스를 맵에 저장
- 사용자 요청을 처리할 때 경로 이름(명령)만 가지고도 처리할 컨트롤러 객체 참조 가능
- init()에서 요청에 따른 컨트롤러 객체 생성한 후 맵에 추가
public interface SubController {
void process(HttpServletRequest request, HttpServletResponse response);
}
public class MemberController implements SubController {
void process(HttpServletRequest request, HttpServletResponse response) {
...
}
}
@Controller
@RequestMapping("/member")
public class MemberController {
@PostMapping("create")
public void createMember() {
...
}
}
○ 입력값 핸들링
doGet(...) {
Member m = new Member();
m.setName(request.getParameter("name"));
m.setTel(request.gerParameter("tel"));
...
dao.create(m);
}
- 서블릿에서 클라이언트의 입력값 처리하기 위해 request.getParameter() 이용
doGet(...) {
Member m = new Member();
BeanUtils.populate(m, request.getParameterMap());
...
dao.create(m)
}
○ 뷰 이동
- 데이터를 포함하지 않는 경우
response.sendRedirect("main.jsp");
- 데이터를 포함하는 경우
doGet(...) {
...
request.setAttribute("member", m);
RequestDispatcher dispatcher = request.getRequestDispatcher("userInfo.jsp");
dispatcher.forward(request, response);
}
- JSP에서의 뷰 이동 구현
<%
request.setAttribute("member", m);
pageContext.forward("userInfo.jsp");
%>
@GetMapping("info")
public String getMemberInfo(int id, Model model) {
...
model.addAtribute("member", m);
return "userInfo";
}
- 리턴되는 문자열 값은 뷰 페이지의 이름이며 확장자는 생략됨
[ 고급 컨트롤러 서블릿 구현 ]
○ 뷰 구현
- ProductList.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<@ taglib uri="http://java/sun/com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>상품 목록</title>
</head>
<body>
<h2>상품 목록</h2>
<hr>
<table border="1">
<tr> <th>번호</th> <th>상품명</th> <th>가격</th> </tr>
<c:forEach var="p" varStatus="i" items="${products}">
<tr>
<td>${i.count}</td>
<td><a href="/jwbook/pcontrol?action=info&id=${p.id}">${p.name}</a></td>
<td>${p.price}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
- productInfo.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>상품정보 조회</title>
</head>
<body>
<h2>상품정보 조회</h2>
<hr>
<ul>
<li>상품코드 : ${p.id}</li>
<li>상품명 : ${p.name}</li>
<li>제조사 : ${p.marker}</li>
<li>가격 : ${p.price}</li>
<li>등록일 : ${p.date}</li>
</ul>
</body>
</html>
○ 모델 구현
- Product.java
public class Product {
private String id;
private String name;
private String maker;
private int price;
private String date;
// 데이터 생성을 쉽게 하기 위한 생성자
public Product(String id, String name, String maker, int price, String date) {
this.id = id;
this.name = name;
this.maker = maker;
this.price = price;
this.date = date;
}
// getter, setter 메서드
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMaker() {
return maker;
}
public void setMaker(String maker) {
this.maker = maker;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
- ProductService.java
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ProductService {
Map<String, Product> products = new HashMap<>();
public ProductService() {
Product p = new Product("101", "애플사과폰 12", "애플전자", 1200000, "2020.12.12");
products.put("101", p);
p = new Product("102", "삼성우주폰", "삼성전자", 1300000, "2021.2.2");
products.put("102", p);
p = new Product("103", "엘스듀얼폰", "엘스전자", 1500000, "2021.3.2");
products.put("103", p);
}
public List<Product> findAll() {
return new ArrayList<>(products.values());
}
public Product find(String id) {
return products.get(id);
}
}
1) findAll() 메서드 : Map의 리스트 형태로 변환해 리턴
2) find() 메서드 : 인자로 받은 킷값으로 상품을 검색해 Product 객체 반환
○ 컨트롤러 구현
- ProductController.java
package com.edu.member.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.edu.member.vo.MemberVO;
//-------------------------------------------------------------------------------------
// public interface MemberController
//-------------------------------------------------------------------------------------
public interface MemberController {
//-------------------------------------------------------------------------------------
// 로그인 처리
//-------------------------------------------------------------------------------------
public ModelAndView login(@ModelAttribute("member") MemberVO member, RedirectAttributes rAttr,
HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 로그아웃 처리
//-------------------------------------------------------------------------------------
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 회원가입 폼
//-------------------------------------------------------------------------------------
public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 회원가입 처리
//-------------------------------------------------------------------------------------
public ModelAndView addMember(@ModelAttribute("member") MemberVO memberVO,
HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 회원 전체 목록 조회
//-------------------------------------------------------------------------------------
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception;
} // End - public interface MemberController
1) 클라이언트 요청을 구분하고 처리 메서드를 호출한 다음 뷰로 이동하는 구조를 service() 메서드에 작성
2) action 파라미터가 null인 경우, 즉 서블릿이 action 파라미터 없이 호출된 경우 컨트롤러에 action 파라미터를 넣어 포워딩
3) list(), info() 메서드 실행 후 문자열로 된 JSP 파일 이름 리턴하고 폴더에 있는 JSP 파일로 포워딩
[ memberController.java ]
package com.edu.member.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.edu.member.vo.MemberVO;
//-------------------------------------------------------------------------------------
// public interface MemberController
//-------------------------------------------------------------------------------------
public interface MemberController {
//-------------------------------------------------------------------------------------
// 로그인 처리
//-------------------------------------------------------------------------------------
public ModelAndView login(@ModelAttribute("member") MemberVO member, RedirectAttributes rAttr,
HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 로그아웃 처리
//-------------------------------------------------------------------------------------
public ModelAndView logout(HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 회원가입 폼
//-------------------------------------------------------------------------------------
public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 회원가입 처리
//-------------------------------------------------------------------------------------
public ModelAndView addMember(@ModelAttribute("member") MemberVO memberVO,
HttpServletRequest request, HttpServletResponse response) throws Exception;
//-------------------------------------------------------------------------------------
// 회원 전체 목록 조회
//-------------------------------------------------------------------------------------
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception;
} // End - public interface MemberController
[ MemberControllerImpl.java ]
package com.edu.member.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;
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.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import com.edu.member.service.MemberService;
import com.edu.member.vo.MemberVO;
//-------------------------------------------------------------------------------------
// public class MemberControllerImpl implements MemberController
//-------------------------------------------------------------------------------------
@Service
@Controller
@RequestMapping("/member") // url에서 /member로 시작하는 요청들을 처리한느 컨트롤러
public class MemberControllerImpl implements MemberController {
private static final Logger logger = LoggerFactory.getLogger(MemberControllerImpl.class);
//-------------------------------------------------------------------------------------
// @Inject : Java에서 지원하는 어노테이션, 특정 Framework에 종속적이지 않다.
// @Autowired : Spring에서 지원하는 어노테이션
//-------------------------------------------------------------------------------------
@Autowired
private MemberVO memberVO;
// private MemberService memberService = new MemberService();
@Autowired
private MemberService memberService;
//-------------------------------------------------------------------------------------
// 로그인 처리
//-------------------------------------------------------------------------------------
@Override
@RequestMapping(value = "/login.do", method = RequestMethod.POST)
public ModelAndView login(@ModelAttribute("member") MemberVO member, RedirectAttributes rAttr, HttpServletRequest request,
HttpServletResponse response) throws Exception {
logger.info("MemberControllImpl login() 시작......");
System.out.println("로그인 정보 => " + member.getId() + " : " + member.getPwd());
ModelAndView mav = new ModelAndView();
// 로그인한 정보를 가지고 데이터베이스에 존재하는지 처리를 하고 그 결과를 가져온다.
memberVO = memberService.login(member);
System.out.println("로그인 처리 결과 ==> " + memberVO);
// 로그인한 정보가 데이터베이스에 존재하는지에 따라 처리를 다르게 한다.
if(memberVO != null) { // 로그인 정보에 해당하는 자료가 있으면
if(member.getPwd().equals(memberVO.getPwd())) {
// 아이디와 비밀번호가 일치하면 세션을 발급한다.
HttpSession session = request.getSession();
session.setAttribute("member", memberVO);
session.setAttribute("isLogOn", true);
// mav.setViewName("redirect:/member/listMembers.do");
mav.setViewName("redirect:/main.do"); // 메인화면으로 이동
} else { // 아이디는 있지만 비밀번호가 틀린 경우
rAttr.addAttribute("result", "PasswordFailed");
mav.setViewName("redirect:/member/loginForm.do");
}
} else { // 로그인한 아이디가 존재하지 않으면
// 로그인 실패 메시지를 가지고 로그인화면으로 이동한다.
rAttr.addAttribute("result", "loginFailed");
mav.setViewName("redirect:/member/loginForm.do");
}
return mav;
} // End - 로그인 처리
//-------------------------------------------------------------------------------------
// 로그아웃 처리
//-------------------------------------------------------------------------------------
@Override
@RequestMapping(value = "/logout.do", method = RequestMethod.GET)
public ModelAndView logout(HttpServletRequest request ,HttpServletResponse response) throws Exception {
HttpSession session = request.getSession();
session.removeAttribute("member");
session.removeAttribute("isLogOn");
ModelAndView mav = new ModelAndView();
mav.setViewName("redirect:/main.do"); // 메인 화면으로 이동
return mav;
} // End - 로그아웃 처리
//-------------------------------------------------------------------------------------
// 회원가입 폼
//-------------------------------------------------------------------------------------
@Override
@RequestMapping(value = "/memberForm.do", method = RequestMethod.GET)
public ModelAndView memberForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("/member/memberForm"); // 회원가입 화면으로 이동
return mav;
} // End - 회원가입 폼
//-------------------------------------------------------------------------------------
// 회원가입 처리
//-------------------------------------------------------------------------------------
@Override
@RequestMapping(value = "/addMember.do", method=RequestMethod.POST)
public ModelAndView addMember(@ModelAttribute("memberVO") MemberVO memberVO,
HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("MemberControllImpl 회원가입 처리() 시작......");
request.setCharacterEncoding("UTF-8");
response.setContentType("test/html;charset=UTF-8");
int result = 0;
// 사용자가 입력한 정보를 서비스에게 넘겨주어 처리하게 된다.
result = memberService.addMember(memberVO);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
} // End - 회원가입 처리
@Override
@RequestMapping(value = "/listMembers.do", method=RequestMethod.GET)
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
logger.info("MemberControllImpl 회원 전체 목록 조회() 시작......");
// 회원 전체 목록을 가져온다.
List<MemberVO> memberLists = memberService.listMembers();
ModelAndView mav = new ModelAndView("/member/listMembers");
mav.addObject("memberLists", memberLists);
return mav;
}
} // End - public class MemberControllerImpl implements MemberController
[ MemberService.java ]
package com.edu.member.service;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.edu.member.vo.MemberVO;
//-------------------------------------------------------------------------------------
// 회원정보 서비스
//-------------------------------------------------------------------------------------
public interface MemberService {
//-------------------------------------------------------------------------------------
// 로그인 처리
//-------------------------------------------------------------------------------------
public MemberVO login(MemberVO memberVO) throws DataAccessException;
//-------------------------------------------------------------------------------------
// 회원가입 처리
//-------------------------------------------------------------------------------------
public int addMember(MemberVO memberVO) throws DataAccessException;
//-------------------------------------------------------------------------------------
// 회원 전체 목록 가져오기
//-------------------------------------------------------------------------------------
public List<MemberVO> listMembers() throws DataAccessException;
} // End - public interface MemberService
[ MemberServiceImpl.java ]
package com.edu.member.service;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import com.edu.member.dao.MemberDAO;
import com.edu.member.vo.MemberVO;
//-------------------------------------------------------------------------------------
// public class MemberServiceImpl implements MemberService
//-------------------------------------------------------------------------------------
@Service("memberService")
public class MemberServiceImpl implements MemberService {
private static final Logger logger = LoggerFactory.getLogger(MemberServiceImpl.class);
@Autowired
private MemberDAO memberDAO;
//-------------------------------------------------------------------------------------
// 로그인 처리
//-------------------------------------------------------------------------------------
@Override
public MemberVO login(MemberVO memberVO) throws DataAccessException {
logger.info("MemberControllImpl login() 시작......");
return memberDAO.loginByID(memberVO);
} // End - public MemberVO login(MemberVO memberVO) throws DataAccessException
//-------------------------------------------------------------------------------------
// 회원가입 처리
//-------------------------------------------------------------------------------------
@Override
public int addMember(MemberVO memberVO) throws DataAccessException {
logger.info("MemberControllImpl 회원가입 처리() 시작......" + memberVO);
return memberDAO.addMember(memberVO);
} // End - 회원가입 처리
//-------------------------------------------------------------------------------------
// 회원 전체 목록 가져오기
//-------------------------------------------------------------------------------------
@Override
public List<MemberVO> listMembers() throws DataAccessException {
logger.info("MemberControllImpl 회원 전체 목록 가져오기() 시작......");
List<MemberVO> memberLists = null;
memberLists = memberDAO.selectAllMemberList();
return memberLists;
} // End -회원 전체 목록 가져오기
} // End - public class MemberServiceImpl implements MemberService
[ MemberDAO.java ]
package com.edu.member.dao;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.edu.member.vo.MemberVO;
//-------------------------------------------------------------------------------------
// 회원정보 DAO
//-------------------------------------------------------------------------------------
public interface MemberDAO {
//-------------------------------------------------------------------------------------
// 로그인 처리
//-------------------------------------------------------------------------------------
public MemberVO loginByID(MemberVO memberVO) throws DataAccessException;
//-------------------------------------------------------------------------------------
// 회원 가입 처리
//-------------------------------------------------------------------------------------
public int addMember(MemberVO memberVO) throws DataAccessException;
//-------------------------------------------------------------------------------------
// 회원 전체 목록 가져오기
//-------------------------------------------------------------------------------------
public List<MemberVO> selectAllMemberList() throws DataAccessException;
} // End - public interface MemberDAO
[ MemberDAOImpl.java ]
package com.edu.member.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
import com.edu.member.vo.MemberVO;
//-------------------------------------------------------------------------------------
// 회원정보 DAO
//-------------------------------------------------------------------------------------
@Repository("memberDAO")
public class MemberDAOImpl implements MemberDAO {
@Autowired
private SqlSession sqlSession;
private static final String Namespace = "com.edu.member";
//-------------------------------------------------------------------------------------
// 로그인 처리
//-------------------------------------------------------------------------------------
@Override
public MemberVO loginByID(MemberVO memberVO) throws DataAccessException {
MemberVO memVO = sqlSession.selectOne(Namespace + ".loginByID", memberVO); // memberVO 데이터 가져와서 처리한 후
return memVO; // memVO 보여주기
} // End - 로그인 처리
//-------------------------------------------------------------------------------------
// 회원가입 처리
// sqlSession.insert(사용할
//-------------------------------------------------------------------------------------
@Override
public int addMember(MemberVO memberVO) throws DataAccessException {
int result = sqlSession.insert(Namespace + ".addMember", memberVO);
return result;
} // End - 회원가입 처리
//-------------------------------------------------------------------------------------
// 회원 전체 목록 조회
//-------------------------------------------------------------------------------------
@Override
public List<MemberVO> selectAllMemberList() throws DataAccessException {
List<MemberVO> memberLists = null;
memberLists = sqlSession.selectList(Namespace + ".selectAllMemberList");
return memberLists;
} // End - 회원 전체 목록 조회
}
[ memberForm.jsp ]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입 폼</title>
</head>
<body>
<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>
<div class="container">
<form class="form-horizontal" method="post" name="memInsForm" action="${contextPath}/member/addMember.do">
<div class="form-group">
<div class="col-sm-offset-2 col-sm-5">
<h2 align="center">회원 가입</h2>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">아이디</label>
<div class="col-sm-2">
<input type="text" class="form-control" id="id" name="id" maxlength="10" placeholder="아이디 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">비밀번호</label>
<div class="col-sm-3">
<input type="password" class="form-control" id="pwd" name="pwd" maxlength="20" placeholder="비밀번호 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">비밀번호 확인</label>
<div class="col-sm-3">
<input type="password" class="form-control" id="repwd" name="repwd" maxlength="20" placeholder="비밀번호 확인"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">이 름</label>
<div class="col-sm-3">
<input type="text" class="form-control" id="name" name="name" maxlength="50" placeholder="이름 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">이메일</label>
<div class="col-sm-5">
<input type="text" class="form-control" id="email" name="email" maxlength="50" placeholder="이메일 입력"/>
</div>
</div>
<div class="form-group">
<label for="id" class="col-sm-3 control-label">회원가입 동의</label>
<div class="col-sm-2">
<label class="radio-inlne">
<input type="radio" id="registerYn" name="registerYn" value="Y" checked> 동의
</label>
<label class="radio-inlne">
<input type="radio" id="registerYn" name="registerYn" value="N"> 동의 안함
</label>
</div>
</div>
<div class="alert alert-info fade in col-sm-offset-1 col-sm-10">
<strong>[도서쇼핑몰의 개인 정보 수집 및 이용 안내]</strong>
<h5>
개인 정보 제3자 제공 동의
<br>① 개인정보를 제공받는 자: BookStore
<br>② 개인정보를 제공받는 자의 개인 정보 이용 목적 : 영업관리,
설문조사 및 프로모션, 이벤트 경품 제공, eDM 발송, 행사 관련 마케팅
<br>③ 제공하는 개인정보항목 : 이름, 이메일주소, 회사명, 직무/직책, 연락처, 휴대전화
<br>④ 개인정보를 제공받는 자의 개인 정보 보유 및 이용 기간 :
개인정보 취급 목적을 달성하여 더 이상 개인정보가 불 필요하게 된 경우이거나
5년이 지나면 지체 없이 해당 정보를 파기할 것입니다.
<br>귀하는 위와 같은 BookStore의 개인정보 수집 및 이용정책에 동의하지
않을 수 있으나, BookStore으로부터 솔루션, 최신 IT정보, 행사초청안내 등의
유용한 정보를 제공받지 못 할 수 있습니다.
<br> 개인 정보 보호에 대한 자세한 내용은 http://www.BookStore.com 을 참조바랍니다.
</h5>
<div class="checkbox" align="center">
<label>
<input type="checkbox" id="is_subscribed" name="is_subscribed" value="o"/>
</label> BookStore의 개인정보 수집 및 이용에 동의합니다.
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-3 col-sm-4">
<button type="reset" class="btn btn-warning">다시 입력</button>
<button type="submit" class="btn btn-primary">회원 가입</button>
<input type="submit" value="회원가입"/>
</div>
</div>
</form>
</div>
<!-- 푸터 -->
<jsp:include page="../common/footer.jsp" flush="false"/>
</body>
</html>
[ listMembers.jsp ]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 전체 목록</title>
</head>
<body>
<%
if(session.getAttribute("isLogOn") == null || session.getAttribute("isLogOn").equals("")) {
response.sendRedirect("/member/loginForm.do");
}
/*
<c:choose>
<c:when test="${isLogOn == true && member != null}">
<p><b>${member.name}님, 즐거운 시간되십시오.</b></p>
<a href="${contextPath}/member/logout.do" class="btn btn-danger">
<span class="glyphicon glyphicon-log-out"></span>로그아웃
</a>
</c:when>
</c:choose>
*/
%>
<!-- 메뉴바 -->
<jsp:include page="../common/topMenu.jsp" flush="false"/>
<div class="container">
<h1 align="center">회원 전체 목록</h1>
<a href="${contextPath}/member/logout.do" class="btn btn-danger"><span class="glyphicon glyphicon-log-out">로그아웃</span></a>
<a class="btn btn-sm btn-primary" href="${contextPath}/member/loginModalForm.do">로그인(Modal)</a>
<table class="table table-bordered table-striped table-hover" style="width:1200px; margin:auto;">
<tr class="info">
<td align="center" width="80"><b>아이디</b></td>
<td align="center" width="80"><b>비밀번호</b></td>
<td align="center" width="80"><b>이 름</b></td>
<td align="center" width="300"><b>이메일</b></td>
<td align="center" width="120"><b>가입일자</b></td>
<td align="center" width="60"><b>수정</b></td>
<td align="center" width="60"><b>삭제</b></td>
</tr>
<c:forEach var="member" items="${memberLists}">
<tr>
<td align="center">${member.id}</td>
<td align="center">${member.pwd}</td>
<td align="center">${member.name}</td>
<td align="center">${member.email}</td>
<td align="center">${member.joinDate}</td>
<td align="center"><a class="btn btn-sm btn-primary" href="${contextPath}/member/updateMemberForm.do?id=${member.id}">수정</a></td>
<td align="center"><a class="btn btn-sm btn-danger" href="${contextPath}/member/removeMember.do?id=${member.id}">삭제</a></td>
</tr>
</c:forEach>
</table>
</div>
<jsp:include page="../common/footer.jsp" flush="false"/>
</body>
</html>
[ topMenu.jsp ]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<% request.setCharacterEncoding("UTF-8"); %>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap-theme.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/js/bootstrap.min.js"></script>
<% /*
sticky-top은 상단 공간을 차지하면서 위에 고정하고,
fixed-top은 상단 공간을 차지하지 않고 위에 고정된다.
일부 내용이 상단 메뉴바에 가려져서 보이지 않을 수 있다.
*/
%>
<nav class="navbar navbar-inverse navbar-sticky-top">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="${contextPath}/main.do">쇼핑몰</a>
</div>
<!-- 실질적인 메뉴를 나열한다. -->
<div class="collapse navbar-collapse" id="myNavbar">
<ul class="nav navbar-nav navbar-left">
<li>
<form class="navbar-form navbar-right" method="post" action="${contextPath}/member/login.do">
<c:choose>
<c:when test="${isLogOn == true && member != null}">
<p class="navbar-text"><b>${member.name}님, 즐거운 시간되십시요.</b></p>
<a href="${contextPath}/member/logout.do" class="btn btn-danger">
<span class="glyphicon glyphicon-log-out"></span> 로그아웃</a>
</c:when>
<c:otherwise>
<div class="form-group">
<input type="text" class="form-control" name="id" size="12" maxlength="12" placeholder="아이디"/>
<input type="password" class="form-control" name="pwd" size="12" maxlength="12" placeholder="비밀번호"/>
</div>
<button type="submit" class="btn btn-primary">
<span class="glyphicon glyphicon-log-in"></span> 로그인
</button>
</c:otherwise>
</c:choose>
</form>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">회원관리 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="${contextPath}/member/loginForm.do?">로그인</a></li>
<li><a href="${contextPath}/member/memberForm.do">회원가입</a></li>
<li><a href="${contextPath}/member/listMembers.do">회원 목록 조회</a></li>
</ul>
</li>
</ul>
</div>
</div>
</nav>
[ 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="com.edu.member">
<resultMap id = "memberResult" type = "com.edu.member.vo.MemberVO">
<result property = "id" column="id"/>
<result property = "pwd" column="pwd"/>
<result property = "name" column="name"/>
<result property = "email" column="email"/>
<result property = "joinDate" column="joinDate"/>
</resultMap>
<!-- 로그인 처리 -->
<select id = "loginByID" parameterType="com.edu.member.vo.MemberVO" resultMap="memberResult">
<![CDATA[
SELECT *
FROM T_MEMBER
WHERE ID = #{id}
]]>
</select>
<!-- 회원가입 처리 -->
<insert id = "addMember" parameterType="com.edu.member.vo.MemberVO">
<![CDATA[
INSERT INTO T_MEMBER (id, pwd, name, email, joindate)
VALUES (#{id}, #{pwd}, #{name}, #{email}, sysdate())
]]>
</insert>
<!-- 회원 전체 목록 추출하기 -->
<select id="selectAllMemberList" resultMap="memberResult">
<![CDATA[
SELECT * FROM T_MEMBER ORDER BY NAME DESC
]]>
</select>
</mapper>
'프로그래밍 언어 > JSP' 카테고리의 다른 글
JSP_22-11-14 (0) | 2022.11.15 |
---|---|
JSP_22-11-11(2) (0) | 2022.11.11 |
JSP_22-11-10 (0) | 2022.11.10 |
JSP_22-11-09 (0) | 2022.11.09 |