본문 바로가기

안녕하세요!

프로그래밍 언어/JSP

JSP_22-11-11

[ 커스텀 태그 ]

○ 사용자 정의 태그

○ 스크립트릿 사용 줄이고 태그와 같은 형태로 프로그램 코드를 대체하거나 재활용 가능한 구조 통해 태그 라이브러리로       활용하고자 개발된 규격

○ 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> 동의&nbsp;&nbsp;
				</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>
728x90
반응형

'프로그래밍 언어 > 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

loading