이전글 (관리자 기능)

https://amongthestar.tistory.com/149

 

JSP 개인프로젝트-영어 학습 사이트 만들기 (관리자 기능)

이전글 (로그인, 회원가입) https://amongthestar.tistory.com/148 JSP 개인프로젝트-영어 학습 사이트 만들기 (로그인, 회원가입) 학원에서 일주일간 JSP로 개인프로젝트를 했다. 주제는 영어 학습 사이트. ��

amongthestar.tistory.com


이번에 포스팅할 내용은 회원 비회원 상관없이 볼 수 있는 소개화면과 강의목록화면, 관련 기능구현이다.

시작페이지에서 두번째 탭은 "와이저"라 명명했다. 이 사이트에 대해 간략하게 소개하는 페이지이다.

 

about.jsp

(소개 페이지. 내용은 캠블리에서 복사 붙여넣기 했다.)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/include/header.jsp" %>
<style>
h2{
	color:#484848;
	font-size: 1.4em;
}
</style>
<!-- Image Showcases -->
  <section class="showcase">
    <div class="container-fluid p-0">
      <div class="row no-gutters">
        <div class="col-lg-6 order-lg-2 text-white showcase-img" style="background-image: url('/Tutoring/img/about1.jpg'); background-position: center center"></div>
        <div class="col-lg-6 order-lg-1 my-auto showcase-text">
          <h2>복습으로 학습 효과 2배!</h2>
          <p class="lead mb-0"><b>수업 동영상</b> 모든 수업은 영상파일로 저장 되며, 튜터 피드백과 함께 효과적으로 복습할 수 있습니다.</p>
        </div>
      </div>
      <div class="row no-gutters">
        <div class="col-lg-6 text-white showcase-img" style="background-image: url('/Tutoring/img/about2.jpg');"></div>
        <div class="col-lg-6 my-auto showcase-text">
          <h2>영어회화 두려움 떨쳐내기</h2>
          <p class="lead mb-0"><b>번역기</b> 영어로 생각나지 않을 땐 채팅창에 한국어로! 자동 번역 기능이 있어 걱정 없어요</p>
        </div>
      </div>
      <div class="row no-gutters">
        <div class="col-lg-6 order-lg-2 text-white showcase-img" style="background-image: url('/Tutoring/img/about3.jpg'); background-position: center center""></div>
        <div class="col-lg-6 order-lg-1 my-auto showcase-text">
          <h2>내 일정에 딱 맞는 수업</h2>
          <p class="lead mb-0"><b>예약</b> 마음에 드는 튜터와 내가 원하는 시간에 미리 예약해 만들어 나가는 유연한 학습 스케쥴</p>
        </div>
      </div>
    </div>
  </section>
<%@ include file="/include/footer.jsp" %>

특별하게 서블릿으로 이동하여 구현해야할 기능은 없다.

 

 


시작페이지에서 세번째 탭에 해당하는 "과정"이다. 강의목록을 카드형식으로 볼 수 있다.

jsp가 먼저 실행되는 것이 아니라 링크를 통해 서블릿으로 이동하면 다시 카드형식의 jsp로 내보낸다.

 

WClassCourseList.java

(강의목록을 보여주는 서블릿으로 DB에 있는 강의를 ArrayList에 담아 courseList.jsp로 이동하여 뿌린다. 서블릿의 경로는 "/Tutoring/class/courseList"이다. )

 

package com.wclass.action;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
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.wmember.model.WClassDAO;
import com.wmember.model.WClassDTO;

/**
 * Servlet implementation class WClassCourseAction
 */
@WebServlet("/class/courseList")
public class WClassCourseList extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WClassCourseList() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WClassDAO dao=WClassDAO.getInstance();
		ArrayList<WClassDTO> arr= dao.classList();
		request.setAttribute("dto", arr);
		RequestDispatcher rd=request.getRequestDispatcher("courseList.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

  • WClassDAO.java의 classList메소드를 수행하는데, 앞선 관리자의 강의목록 페이지와 다르게 인자값이 없다. 
  • 이용자가 강의 목록을 검색을 하여 뽑거나 강의를 수정하지 않고 현재 존재하는 강의만 보기 때문이다. 다만 테이블 형식으로 출력할 것인지, 카드 형식으로 출력할 것인지 jsp의 양식에 따라 다르다.
  • 강의목록을 들고 courseList.jsp로 다시 이동한다.

 


<WClassDAO.java의 classList메소드>

 

//과정 메뉴 클릭시 전체보기
		public ArrayList<WClassDTO> classList() {
			Connection con=null;
			Statement st=null;
			ResultSet rs=null;
			ArrayList<WClassDTO>arr=new ArrayList<WClassDTO>();
			
			try {
				con=getConnection();
				String sql="select * from wclass";
				st=con.createStatement();
				rs=st.executeQuery(sql);
				while(rs.next()) {
					WClassDTO dto=new WClassDTO();
					dto.setClassnum(rs.getInt("classnum"));
					dto.setClassname(rs.getString("classname"));
					dto.setStu_num(rs.getInt("stu_num"));
					dto.setStu_regdate(rs.getString("stu_regdate"));
					dto.setTopic(rs.getString("topic"));
					dto.setContent(rs.getString("content"));
					dto.setClevel(rs.getString("clevel"));
					dto.setUploadFile((rs.getString("uploadfile")));
					arr.add(dto);
				}
			} catch (Exception e) {
				e.printStackTrace();
			} finally {
				closeConnection(con, st, rs);
			}
			return arr;
		}

courseList.jsp

(WClassCourseList.java에서 넘어온 값들을 카드형식으로 뿌린다.)

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/include/header.jsp" %>
<style>
html, body, div, span, applet, object, iframes,
	p, blockquote, pre, abbr, acronym, address, big, quotes, code, del,
	dfn, em, img, ins, kbd, q, s, samp, small, strike, sub, sup, tt, var, u,
	i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table,
	caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas,
	details, embed, figure, figcaption, footer, header, hgroup, menu, nav,
	output, ruby, section, summary, time, mark, audio, video {
	margin: 0;
	padding: 0;
	border: 0;
	font-size: 100%;
	do: inherit;
	vertical-align: baseline;
}
article, aside, details, figcaption, figure, footer, header, hgroup,
	menu, nav, section {
	display: block;
}
blockquote, q {
	quotes: none;
}
blockquote : before, blockquote : after, q : before, q : after {
	content: '';
	content: none;
}
table {
	border-collapse: collapse;
	border-spacing: 0;
}
a{
	text-decoration: none;
	color: black;
}
a:hover{
	text-decoration: none;
	color: black;
}
.card:hover{
    background-color: #eee;
}
.card {
	height: 400px;
	width: 350px;
	border-radius: 15px;
	display: inline-block;
	margin-top: 30px;
	margin-bottom: 30px;
	position: relative;
	box-shadow: 0 6px 0px 0 rgba(0, 0, 0, 0.2);
	overflow: hidden;
}
.card-header {
	-webkit-transition: 0.5s; /*사파리 & 크롬*/
    -moz-transition: 0.5s;  /*파이어폭스*/
    -ms-transition: 0.5s;	/*인터넷 익스플로러*/
    -o-transition: 0.5s;  /*오페라*/
    transition: 0.5s;
	width: 100%;
	height: 230px;
	border-radius: 15px 15px 0 0;
	background-color: gray;
	background-size: 100% 230px;
	background-repeat: no-repeat;	
}
.card-header-is_closed{
    background-color: #EF5A31 ;
    color: #FFF ;
    font-weight: bold ;
    text-align: center ;
    float: right;
    margin: 15px 15px 0 0;
    border-radius: 50%;
    font-weight: bold;
    padding: 10px 10px;
    line-height: 20px;
}
.card-body-header{
	line-height: 25px;
	margin: 10px 20px 0px 20px;
}
.card:hover .card-body-description {
    opacity: 1;
    -webkit-transition: .5s ease-in-out;
    -moz-transition: .5s ease-in-out;
    -ms-transition: .5s ease-in-out;
    -o-transition: .5s ease-in-out;
    transition : .5s ease-in-out;
    overflow: scroll;
    text-decoration: none;
}
.card-columns{
	overflow: auto;
	flex-wrap: nowrap;
}
</style>
<body>
<br/>
<div class="container">
<h3>과정 둘러보기</h3>
<hr>
<p style="font-size:1.25em;">유창한 영어의 기본 요소</p>
<p style="font-size:0.9em;">유창한 영어로 대화하며 자신감을 키워보세요. 간단한 대화부터 복잡한 시사 문제에 대해 논리정연한 의견을 표현하는 것까지, 다양한 레벨의 과정을 통해 모두가 무언가를 배울 수 있습니다.</p>
<div class="card-columns" style="column-count:4;">
	<c:forEach items="${dto}" var="dto">
		<c:if test="${dto.clevel eq 'basic'}">
		<a href="CourseDetail?num=${dto.classnum}">
			<div class="card">
				<div class="card-header" style="background-image: url('/Tutoring/upload/${dto.uploadFile}');">
				</div>
				<div class="card-body">
					<div class="card-body-header" >
						<h5>${dto.classname}</h5>
						<p class = "card-body-nickname" style="font-size:0.9em;">${dto.topic}</p>
					</div>
				</div>
			</div>
		</a>
		</c:if>
	</c:forEach>
</div>
<br/><br/>

<p style="font-size:1.25em;">경력 개발</p>
<p style="font-size:0.9em;">해외 환경에서 비즈니스 관련 대화를 하려면 유창한 영어 실력만으로는 부족합니다. 언어와 비언어로 이루어진 다문화 커뮤니케이션은 경력 개발의 강력한 도구입니다.</p>
<div class="card-columns" style="column-count:4;">
	<c:forEach items="${dto}" var="dto">
		<c:if test="${dto.clevel eq 'career'}">
		<a href="CourseDetail?num=${dto.classnum}">
			<div class="card">
				<div class="card-header" style="background-image: url('/Tutoring/upload/${dto.uploadFile}');">
				</div>
				<div class="card-body">
					<div class="card-body-header" >
						<h5>${dto.classname}</h5>
						<p class = "card-body-nickname" style="font-size:0.9em;">${dto.topic}</p>
					</div>
				</div>
			</div>
		</a>
		</c:if>
	</c:forEach>
</div>
<br/><br/>

<p style="font-size:1.25em;">자신을 표현해보세요</p>
<p style="font-size:0.9em;">영어를 배우면 전 세계 사람들과 더 쉽게 교류할 수 있습니다. 요즘 화두가 되는 다양한 주제를 탐색하면서 특정 분야 어휘를 확장하고, 다른 문화와 관점에 대해 배워보세요!</p>
<div class="card-columns" style="column-count:4;">
	<c:forEach items="${dto}" var="dto">
		<c:if test="${dto.clevel eq 'expression'}">
		<a href="CourseDetail?num=${dto.classnum}">
			<div class="card">
				<div class="card-header" style="background-image: url('/Tutoring/upload/${dto.uploadFile}');">
				</div>
				<div class="card-body">
					<div class="card-body-header" >
						<h5>${dto.classname}</h5>
						<p class = "card-body-nickname" style="font-size:0.9em;">${dto.topic}</p>
					</div>
				</div>
			</div>
		</a>
		</c:if>
	</c:forEach>
</div>
<br/><br/>

<p style="font-size:1.25em;">시험 준비</p>
<p style="font-size:0.9em;">최신 시험 기출 문제를 연습해 다가오는 영어 말하기 시험에 대비하세요.</p>
<div class="card-columns" style="column-count:4;">
	<c:forEach items="${dto}" var="dto">
		<c:if test="${dto.clevel eq 'test'}">
		<a href="CourseDetail?num=${dto.classnum}">
			<div class="card">
				<div class="card-header" style="background-image: url('/Tutoring/upload/${dto.uploadFile}');">
				</div>
				<div class="card-body">
					<div class="card-body-header" >
						<h5>${dto.classname}</h5>
						<p class = "card-body-nickname" style="font-size:0.9em;">${dto.topic}</p>
					</div>
				</div>
			</div>
		</a>
		</c:if>
	</c:forEach>
</div>
<br/><br/>

</div>
</body>
</html>
<%@ include file="/include/footer.jsp" %>

 

강의분류에 따라 카드를 정렬시키기 위해 c:if 문에 조건을 써주었다.

강의 이미지들은 freepik.com에서 받았다. 카드를 클릭하면 강의 상세페이지로 이동한다.

 

 


WClassCourseDetail.java

(courseList.jsp에서 courseDetail로 강의번호를 달고 넘어간 서블릿. 경로는 "/Tutoring/class/CourseDetail"이다.)

 

package com.wclass.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;

import com.wmember.model.WClassDAO;
import com.wmember.model.WClassDTO;

/**
 * Servlet implementation class WClassCourseDetail
 */
@WebServlet("/class/CourseDetail")
public class WClassCourseDetail extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WClassCourseDetail() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WClassDAO dao=WClassDAO.getInstance();
		int num=Integer.parseInt(request.getParameter("num"));
		WClassDTO dto=dao.classView(num);
		request.setAttribute("dto", dto);
		
		RequestDispatcher rd=request.getRequestDispatcher("courseDetail.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

  • a링크로 넘어갔기 때문에 doGet 내에서 처리된다.
  • 파라미터 값으로 받아온 num을 들고 WClassDAO의 classView메소드를 수행한다.
  • 그리고 courseDetail.jsp로 이동한다.

<WClassDAO의 classView메소드>

 

관리자 페이지에서 강의목록을 누르고, 제목을 누르면 떴던 classView 메소드와 동일하다. (다만 값을 뿌려줄때의 양식이 다르기에 jsp가 다른것이고, jsp로 넘어가는 서블릿도 분리한 것이다. 전자는 ClassDetail.jsp와 WClassDetailAction.java이고 지금은 courseDetail.jap와 WClassCourseDetail.java이다.)

 

 

//강의 상세보기
	public WClassDTO classView (int classnum) {
		Connection con=null;
		Statement st=null;
		ResultSet rs=null;
		WClassDTO dto=null;
		try {
			con=getConnection();
			st=con.createStatement();
			String sql="select * from wclass where classnum="+classnum;
			rs=st.executeQuery(sql);
			if(rs.next()) {
				dto=new WClassDTO();
				dto.setClassnum(rs.getInt("classnum"));
				dto.setClassname(rs.getString("classname"));
				dto.setClevel(rs.getString("clevel"));
				dto.setContent(rs.getString("content"));
				dto.setStu_num(rs.getInt("stu_num"));
				dto.setStu_regdate(rs.getString("stu_regdate"));
				dto.setTopic(rs.getString("topic"));
				dto.setUploadFile((rs.getString("uploadfile")));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, rs);
		}
		return dto;
	}

 


courseDetail.jsp

 

강의소개영역, 강의별 수강후기 게시판 영역, 게시글 검색 영역, 글쓰기폼 영역으로 이루어져있다.

수강후기와 관련된 기능들은 다음 포스팅에서 소개하고, 지금은 강의소개 영역만 보겠다.

 

WClassCourseDetail.java에서 dto이름으로 저장한 dto객체를 뿌린다. 

 

<!-- 강의 소개 -->
	<div><a href="/Tutoring/class/courseList"><b></b> 모든 과정</a></div>
	<div class="card">
		<form action="/Tutoring/class/cartInsert" method="post" id="frm">
		 	<!-- 등록하고자 하는 강의 번호 -->
			    <input type="hidden" id="classnum" name="classnum" value="${dto.classnum}">
			    <input type="hidden" id="classname" name="classname" value="${dto.classname}">
			    <input type="hidden" id="userid" name="userid" value="${sessionScope.userid}">
			<!-- 카드 영역 -->
			<div class="card-header" style="background-image: url('/Tutoring/upload/${dto.uploadFile}');">
			</div>
			<div class="card-body">
				<div class="card-body-header" >
					<h5>${dto.classname}</h5>
					<p class = "card-body-nickname" style="font-size:0.9em;">${dto.topic}</p>
				</div>
				<div class="button">
					<input type="button" class="btn btn-info" value="등록하기" id="subscribe" style="width: 100%;">
				</div>
			</div>
			<!-- 카드 영역 끝 -->
			<br/>
		</form>
	</div>
	<br/>
	<div class="content">
		<p style="font-size: 1.25em;">개요</p><br/>
		<p>왜 이런 과정을 수강해야 하나요?</p>
		<br/>
		<span style="color: gray;">${dto.content}</span>
	</div>
<!-- 강의 소개 끝 -->

 


https://github.com/kkj0712/JspProject_Tutoring

 

kkj0712/JspProject_Tutoring

Contribute to kkj0712/JspProject_Tutoring development by creating an account on GitHub.

github.com

 

이전글 (로그인, 회원가입)

https://amongthestar.tistory.com/148

 

JSP 개인프로젝트-영어 학습 사이트 만들기 (로그인, 회원가입)

학원에서 일주일간 JSP로 개인프로젝트를 했다. 주제는 영어 학습 사이트. 벤치마킹?할 사이트는 캠블리로 선정했다. 강의 구매와 튜터 매칭 시스템, 캘린더에서 날짜를 골라서 수업을 듣는 기능

amongthestar.tistory.com

 


회원가입시 admin 컬럼의 값을 무조건 0으로 주고 DB에서 관리자를 선정하여 admin 값을 1로 고친다.

이번 포스팅은 관리자가 로그인했을 경우 어떤 기능들을 수행할 수 있는지에 대한 내용이다.

 

관리자로 로그인을 하면 먼저 관리자 페이지로 이동한다.

 


<login.jsp 중 ajax 부분>

 

$.ajax({
		type : "post",
		url  : "login",
		data : {"userid":$("#userid").val(), "pwd":$("#pwd").val()},
		success : function(value){
			switch(value.trim()){
			case "0" : alert("로그인 성공"); location.href="/Tutoring/index.jsp"; break;
			case "1" : alert("관리자 로그인"); location.href="/Tutoring/member/Adminview"; break;
			case "2" : alert("비밀번호 오류"); break;
			case "-1": alert("회원이 아닙니다"); location.href="/Tutoring/member/insert"; break;
			default: alert(value.trim());
			}
		},
		error: function(e){
			alert("error:"+e);
		}
	})

 


WMemberAdminViewAction.java

(관리자 화면으로 이동하는 서블릿으로 "/Tutoring/member/AdminView" 경로에 해당한다.)

 

package com.wmember.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;

import com.wmember.model.WMemberDAO;
import com.wmember.model.WMemberDTO;

/**
 * Servlet implementation class WMemberAdminViewAction
 */
@WebServlet("/member/Adminview")
public class WMemberAdminViewAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WMemberAdminViewAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session=request.getSession();
		String userid=(String)session.getAttribute("userid");
		WMemberDAO dao=WMemberDAO.getInstance();
		WMemberDTO dto=dao.memberView(userid);
		request.setAttribute("member", dto);
		
		RequestDispatcher rd=request.getRequestDispatcher("Adminview.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

 

  • a href로 이동하였으므로 doGet 내에서 처리되며 doPost에는 내용이 없다.
  • 로그인으로 인해 생긴 seesion userid값으로 WMemberDAO.java의 memberVIew 메소드를 실행한다.
  • WMemberDTO형의 dto 객체에 member라는 이름으로 담고 AdminView.jsp로 이동한다. 자신의 회원정보를 수정할 수 있는 화면이다.

<WMemberDAO.java의 memberView 메소드)>

 

//회원 상세보기
	public WMemberDTO memberView(String userid) {
		Connection con=null;
		Statement st=null;
		ResultSet rs=null;
		WMemberDTO dto=null;
		try {
			con=getConnection();
			String sql="select * from wmember where userid='"+userid+"'";
			st=con.createStatement();
			rs=st.executeQuery(sql);
			if(rs.next()) {
				dto=new WMemberDTO();
				dto.setNum(rs.getInt("num"));
				dto.setEmail(rs.getString("email"));
				dto.setName(rs.getString("name"));
				dto.setPwd(rs.getString("pwd"));
				dto.setUserid(rs.getString("userid"));
				dto.setAddress(rs.getString("address"));
				dto.setPostcode(rs.getInt("postcode"));
				dto.setDetailAddress(rs.getString("detailaddress"));
				dto.setExtraAddress(rs.getString("extraaddress"));
				dto.setAdmin(rs.getInt("admin"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, rs);
		}
		return dto;
	}

 

 


AdminView.jsp

회원가입할때 폼 양식과 똑같다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp" %>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
a{
	text-decoration: none;
}
a:hover{
	text-decoration: none;
}
.back2{
	margin-top: 20px;
	background-color: #f8f9fa;
	border-radius: 20px;
}
#frm{
	margin: 0 auto;
	width: 50%;
}
.button{
	text-align: center;
	margin: 0 auto;
	padding: 20px;
}
.sidebar{
	float: left;
	width: 200px;
	height:200px;
	margin-top: 60px;
	margin-left: 60px;
}
.sidebar ul{
	list-style: none;
}
.sidebar ul a{
	line-height: 2em;
}
</style>

<aside class="sidebar">
	<ul id="menu">
        <li><h5><a href="/Tutoring/class/ClassInsert.jsp"> 강의입력</a></h5></li>
        <li><h5><a href="/Tutoring/class/ClassList.jsp"> 강의목록</a></h5></li>
        <li><h5><a href="/Tutoring/member/Adminview"> 계정설정</a></h5></li>
	</ul>
</aside>

<div class="container" id="userInfo">
<br/>
<h5>계정설정</h5>
<div class="back2">
<form action="Adminupdate" method="post" id="frm">
  <br/><br/>
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">아이디</span>
    </div>
      <input type="text" class="form-control" name="userid" id="userid" value="${member.userid}" readonly="readonly">
  </div>
  <br/>
   
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">이름</span>
    </div>
    <input type="text" class="form-control" id="name" value="${member.name}" name="name">
  </div>
  <br/>
  
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">비밀번호</span>
    </div>
    <input type="password" class="form-control" id="pwd" value="${member.pwd}" name="pwd">
  	<input type="password" class="form-control" placeholder="비밀번호 확인" id="pwd_check" name="pwd_check">
  </div>
  <br/>
  
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">이메일</span>
    </div>
    <input type="text" class="form-control" id="email" value="${member.email}" name="email">
  </div>
  <br/>
    
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">우편번호</span>
    </div>
      <input type="text" id="sample6_postcode" name="sample6_postcode" value="${member.postcode}" readonly="readonly" class="form-control">
    <div class="col align-self-end" >
      <input type="button" onclick="sample6_execDaumPostcode()" value="우편번호" class="btn btn-secondary"><br>
   	</div>
  </div>
  <br/>  

  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">주소</span>
    </div>
    <input type="text" id="sample6_address" name="sample6_address" value="${member.address}" placeholder="주소" class="form-control"><br>
  </div>

  <div class="input-group mb-3">
	<input type="text" id="sample6_detailAddress" name="sample6_detailAddress" value="${member.detailAddress}" placeholder="상세주소" class="form-control">
	<input type="text" id="sample6_extraAddress" name="sample6_extraAddress" value="${member.extraAddress}" placeholder="참고항목" class="form-control">
  </div>
  <div class="button">
  	<button  id="send"  class="btn btn-info">저장</button>
	<input type="button" class="btn btn-danger" value="회원탈퇴" onclick="delCheck('${member.userid}')">
  </div>
</form>
</div>

</div>
<br/><br/>
<%@ include file="../include/footer.jsp" %>
<script>
function delCheck(userid){
    if(confirm("탈퇴하시겠습니까? 삭제된 회원정보는 되돌릴 수 없습니다.")){
    	location.href="delete?userid="+userid;
    }
}
</script>
<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
    function sample6_execDaumPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                // 각 주소의 노출 규칙에 따라 주소를 조합한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
                var addr = ''; // 주소 변수
                var extraAddr = ''; // 참고항목 변수

                //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
                if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                    addr = data.roadAddress;
                } else { // 사용자가 지번 주소를 선택했을 경우(J)
                    addr = data.jibunAddress;
                }

                // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
                if(data.userSelectedType === 'R'){
                    // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                    // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                    if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                        extraAddr += data.bname;
                    }
                    // 건물명이 있고, 공동주택일 경우 추가한다.
                    if(data.buildingName !== '' && data.apartment === 'Y'){
                        extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                    }
                    // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                    if(extraAddr !== ''){
                        extraAddr = ' (' + extraAddr + ')';
                    }
                    // 조합된 참고항목을 해당 필드에 넣는다.
                    document.getElementById("sample6_extraAddress").value = extraAddr;
                
                } else {
                    document.getElementById("sample6_extraAddress").value = '';
                }

                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('sample6_postcode').value = data.zonecode;
                document.getElementById("sample6_address").value = addr;
                // 커서를 상세주소 필드로 이동한다.
                document.getElementById("sample6_detailAddress").focus();
            }
        }).open();
    }
</script>
<script>
var reg_email = /^([0-9a-zA-Z_\.-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,2}$/;
$(document).ready(function(){
	$("#send").click(function(){
		//이름이 공백일때
		if($("#name").val()==""){
			alert("이름을 입력하세요");
			return false;
		}
		//암호가 공백일때
		if($("#pwd").val()==""){
			alert("암호를 입력하세요");
			$("#pwd").focus();
			return false;
		}
		//암호확인이 공백일때
		if($("#pwd_check").val()==""){
			alert("암호확인 필수");
			$("#pwd_check").focus();
			return false;
		}
		//암호 일치확인
		if($("#pwd").val()!=$("#pwd_check").val()){
			alert("암호 불일치");
			$("#pwd_check").focus();
			return false;
		}
		if($("#pwd").val().length<6){
	        alert("비밀번호는 6글자 이상이어야 합니다.");
	        pw1.value="";
	        pw1.focus();
	    }
		//이메일이 공백일때
		if($("#email").val()==""){
			alert("이메일을 입력하세요");
			return false;
		}
		//이메일 양식
		if(!$("#email").val().match(reg_email)){
			alert("이메일을 정확하게 입력하세요");
			$("#email").focus();
			return false;
		}
		$("#frm").submit();
	})//send
});//document
</script>

 

  • 주소를 고칠 수 있도록 다음 우편번호 API 자바스크립트 코드를 붙여넣었다.
  • 저장버튼을 누르면 form이 post방식으로 Adminupdate로 이동한다.
  • 삭제버튼을 누르면 자바스크립트 delCheck 함수로 이동하고 userid값을 가지고 delete로 이동한다.

 


WMemberAdminUpdateAction.java 

("저장"버튼을 눌렀을때 회원정보 수정할 수 있는 서블릿. 경로는 "/Tutoring/member/Adminupdate"에 해당)

package com.wmember.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;

import com.wmember.model.WMemberDAO;
import com.wmember.model.WMemberDTO;


/**
 * Servlet implementation class MemberUpdate
 */
@WebServlet("/member/Adminupdate")
public class WMemberUpdateAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WMemberUpdateAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WMemberDTO member=new WMemberDTO();
		member.setName(request.getParameter("name"));
		member.setUserid(request.getParameter("userid"));
		member.setPwd(request.getParameter("pwd"));
		member.setEmail(request.getParameter("email"));
		member.setPostcode(Integer.parseInt(request.getParameter("sample6_postcode")));
		member.setAddress(request.getParameter("sample6_address"));
		member.setDetailAddress(request.getParameter("sample6_detailAddress"));
		member.setExtraAddress(request.getParameter("sample6_extraAddress"));
		
		WMemberDAO dao=WMemberDAO.getInstance();
		int flag=dao.memberUpdate(member);
		if(flag==1) {
			response.sendRedirect("/Tutoring/member/Adminview");
		}

	}
}

 

  • member객체에 파라미터 값으로 받아온 변수들을 저장하고 WMemberDAO.java의 memberUpdate메소드를 실행
  • 업데이트가 여부에 따라 flag 변수 값을 달리하고, 업데이트가 되었다면 상세정보 화면으로 다시 이동

 


 

<WMemberDAO.java의 memberUpdate메소드>

 

//회원정보 수정
	public int memberUpdate(WMemberDTO vo) {
		Connection con=null;
		PreparedStatement ps=null;
		int flag=0;
		try {
			con=getConnection();
			String sql="update wmember set name=?, pwd=?, email=?, postcode=?, address=?, detailaddress=?, extraaddress=? where userid=?";
			ps=con.prepareStatement(sql);
			ps.setString(1, vo.getName());
			ps.setString(2, vo.getPwd());
			ps.setString(3, vo.getEmail());
			ps.setInt(4, vo.getPostcode());
			ps.setString(5, vo.getAddress());
			ps.setString(6, vo.getDetailAddress());
			ps.setString(7, vo.getExtraAddress());
			ps.setString(8, vo.getUserid());
			flag=ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, ps);
		}
		return flag;
	}

 

 


WMemberDeleteAction.java

("회원탈퇴"버튼을 눌렀을때 회원정보를 삭제할 수 있는 서블릿. 경로는 "/Tutoring/member/delete"에 해당)

 

package com.wmember.action;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;
import com.wmember.model.WMemberDAO;


/**
 * Servlet implementation class MemberDelete
 */
@WebServlet("/member/delete")
public class WMemberDeleteAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WMemberDeleteAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String userid=request.getParameter("userid");
		WMemberDAO dao=WMemberDAO.getInstance();
		dao.memberDel(userid);
		HttpSession session=request.getSession();
		session.invalidate();
		response.sendRedirect("login");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request,response);
	}
}

 

  • 파라미터 값으로 받아온 userid를 이용하여 WMemberDAO.java의 memberDel 메소드를 수행한다.

<WMemberDAO.java의 memberDel 메소드>

 

//삭제
	public void memberDel(String userid) {
		Connection con=null;
		Statement st=null;
		try {
			con=getConnection();
			String sql="delete from wmember where userid='"+userid+"'";
			st=con.createStatement();
			st.executeUpdate(sql);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, null);
		}
	}

 


관리자로 로그인을 하면 계정설정 외에도 강의입력과 강의목록 탭이 보인다. 각각 jsp로 링크를 걸었다.

강의에 관련된 작업은 DB의 WClass 테이블을 활용한다.

 

강의 DB관련 DTO (WClassDTO.java)

package com.wmember.model;

public class WClassDTO {
	private String clevel;
	private int classnum;
	private String classname;
	private int stu_num;
	private String stu_regdate;
	private String topic;
	private String content;
	private String uploadFile;
	
	public String getUploadFile() {
		return uploadFile == null ? "" : uploadFile.trim();
	}
	public void setUploadFile(String uploadFile) {
		this.uploadFile = uploadFile;
	}
	public String getClevel() {
		return clevel == null ? "" : clevel.trim();
	}
	public void setClevel(String clevel) {
		this.clevel = clevel;
	}
	public int getClassnum() {
		return classnum;
	}
	public void setClassnum(int classnum) {
		this.classnum = classnum;
	}
	public String getClassname() {
		return classname == null ? "" : classname.trim();
	}
	public void setClassname(String classname) {
		this.classname = classname;
	}
	public int getStu_num() {
		return stu_num;
	}
	public void setStu_num(int stu_num) {
		this.stu_num = stu_num;
	}
	public String getStu_regdate() {
		return stu_regdate == null ? "" : stu_regdate.trim();
	}
	public void setStu_regdate(String stu_regdate) {
		this.stu_regdate = stu_regdate;
	}
	public String getTopic() {
		return topic == null ? "" : topic.trim();
	}
	public void setTopic(String topic) {
		this.topic = topic;
	}
	public String getContent() {
		return content == null ? "" : content.trim();
	}
	public void setContent(String content) {
		this.content = content;
	}
}

 


ClassInsert.jsp

강의 입력폼

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp" %>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
a{
	text-decoration: none;
}
a:hover{
	text-decoration: none;
}
.back2{
	margin-top: 20px;
	background-color: #f8f9fa;
	border-radius: 20px;
}
#frm{
	margin: 0 auto;
	width: 50%;
}
.button{
	text-align: center;
	margin: 0 auto;
	padding: 20px;
}
.sidebar{
	float: left;
	width: 200px;
	height:200px;
	margin-top: 60px;
	margin-left: 60px;
}
.sidebar ul{
	list-style: none;
}
.sidebar ul a{
	line-height: 2em;
}
.thumb-image{
 float:left;
 width:200px;
 position:relative;
 padding:5px;
}
</style>
<aside class="sidebar">
	<ul id="menu">
        <li><h5><a href="/Tutoring/class/ClassInsert"> 강의입력</a></h5></li>
        <li><h5><a href="/Tutoring/class/ClassList.jsp"> 강의목록</a></h5></li>
        <li><h5><a href="/Tutoring/member/Adminview"> 계정설정</a></h5></li>
	</ul>
</aside>
<div class="container">
<br/>
<h5>강의입력</h5>
<div class="back2">
<form action="ClassInsert" method="post" id="frm" enctype="multipart/form-data">
  <br/><br/>
  	<div id="image-holder"></div>
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의 이미지</span>
    </div>
      <input type="file" class="form-control" id="uploadFile" name="uploadFile"><br>
  </div>
  <br/>
  
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의분류</span>
    </div>
      <select name="clevel" id="clevel" name="clevel">
      	<option value="basic" class="form-control">유창한 영어의 기본 요소</option>
      	<option value="career" class="form-control">경력 개발</option>
      	<option value="expression" class="form-control">자신을 표현해보세요</option>
      	<option value="test" class="form-control">시험 준비</option>
      </select>
  </div>
  <br/>
  
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의명</span>
    </div>
      <input type="text" class="form-control" id="classname" name="classname">
  </div>
  <br/>
   
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의 주제</span>
    </div>
      <input type="text" class="form-control" id="topic" name="topic">
  </div>
  <br/>
  
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의설명</span>
    </div>
      <textarea rows="5" cols="20" class="form-control" id="content" name="content"></textarea>
  </div>
  
  <div class="button">
 	  <input type="reset" class="btn btn-gray" value="취소">
 	  <button  id="send"  class="btn btn-primary">강의등록</button>
  </div>
</form>
</div>
</div>
<br/><br/>
<%@ include file="../include/footer.jsp" %>
<script>
$(document).ready(function(){
	$("#send").click(function(){
		if($("#classname").val()==""){
			alert("강의명을 입력하세요");
			$("#classname").focus();
			return false;
		}
		if($("#topic").val()==""){
			alert("강의주제를 입력하세요");
			$("#topic").focus();
			return false;
		}
		if($("#content").val()==""){
			alert("강의설명을 입력하세요");
			$("#content").focus();
			return false;
		}
		$("#frm").submit();
	})//send
	$("#uploadFile").on('change', function () {
        if (typeof (FileReader) != "undefined") {
            var image_holder = $("#image-holder");
            image_holder.empty();
            var reader = new FileReader();
            reader.onload = function (e) {
                $("<img />", {
                    "src": e.target.result,
                    "class": "thumb-image"
                }).appendTo(image_holder);
            }
            image_holder.show();
            reader.readAsDataURL($(this)[0].files[0]);
        } else {
            alert("이 브라우저에서 지원하지 않는 확장자 입니다.");
        }
    });
});//document
</script>

 

  • 입력 후 send 버튼을 누르면 form이 ClassInsert로 이동한다.
  • 강의 이미지를 넣어야하기 때문에 form태그 안에 enctype="multipart/form-data" 를 추가하였다.
  • 이미지 입력 프리뷰는 javascript image preview를 구글링하여 복사 붙여넣기 했다.

 

(이미지는 freepic.com에서 찾았다.)


WClassInsertAction.java 

(강의입력 폼에서 넘어온 서블릿. 경로는 "/Tutoring/class/ClassInsert" 이다.)

 

package com.wclass.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import com.wmember.model.WClassDAO;
import com.wmember.model.WClassDTO;
import com.wmember.model.WMemberDAO;
import com.wmember.model.WMemberDTO;

/**
 * Servlet implementation class WClassInsertAction
 */
@WebServlet("/class/ClassInsert")
public class WClassInsertAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WClassInsertAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd=request.getRequestDispatcher("ClassInsert.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WClassDAO dao=WClassDAO.getInstance();
		int uploadFileSizeLimit=5*1024*1024;
		String encType="UTF-8";
		String savePath="upload";
		ServletContext context=getServletContext();
		String uploadFilePath=context.getRealPath(savePath);
		
		//multipart/form 방식은 request.getParameter로 받아올 수 없음
		MultipartRequest multi=new MultipartRequest(
				request, //request객체
				uploadFilePath, //서버상의 실제 디렉토리
				uploadFileSizeLimit, //최대 업로드 파일 크기
				encType, //인코딩 방법
				new DefaultFileRenamePolicy()); //동일 파일 새이름 부여
		
		//업로드된 파일이름 구하기
		String fileName=multi.getFilesystemName("uploadFile");
		
		if(fileName==null) { //파일 업로드 안됨
			System.out.println("파일 업로드 되지 않았음");
		}
		
		WClassDTO wclass=new WClassDTO();
		wclass.setUploadFile(fileName);
		wclass.setClassname(multi.getParameter("classname"));
		wclass.setClevel(multi.getParameter("clevel"));
		wclass.setContent(multi.getParameter("content"));
		wclass.setTopic(multi.getParameter("topic"));
		
		int flag=dao.classInsert(wclass);
		if(flag==1) {
			response.setContentType("text/html; charset=utf-8");
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('강의가 등록되었습니다');");
			out.println("history.back(-1);");
			out.println("</script>");
		}
	}

}

 

  • multipart로 값들을 받아왔기 때문에 request 파라미터로 받아올 수 없다.
  • 업로드한 이미지의 파일 이름을 구하고 wclass 객체에 담는다. 
  • WClassDAO.java의 classInsert 메소드를 수행하고 입력이 되었다면 return 된 flag 값을 판단하여 alert창을 띄운다.
  • 여기서 오류가 많이 났는데.. 이유는 WClassDTO의 객체 이름을 처음에 class로 설정했었기 때문이다. 예약어로 변수명을 설정할 수 없다. 

<WClassDAO.java의 classInsert 메소드>

 

//디비셋팅
	private static WClassDAO instance=new WClassDAO();
	public static WClassDAO getInstance() {
		return instance;
	}
	private Connection getConnection() throws Exception{
		Context initCtx=new InitialContext();
		Context envCtx=(Context) initCtx.lookup("java:comp/env");
		DataSource ds=(DataSource) envCtx.lookup("jdbc/wiser");
		return ds.getConnection();
	}
	
	//강의등록
	public int classInsert(WClassDTO vo) {
		Connection con=null;
		PreparedStatement ps=null;
		int flag=0;
		
		try {
			con=getConnection();
			String sql="INSERT INTO wclass(classnum, classname, stu_num, stu_regdate, topic, content, "
					+ "clevel, uploadfile)"
					+ "VALUES(wclass_seq.nextval,?,0,0,?,?,?,?)";
			ps=con.prepareStatement(sql);
			ps.setString(1, vo.getClassname());
			ps.setString(2, vo.getTopic());
			ps.setString(3, vo.getContent());
			ps.setString(4, vo.getClevel());
			ps.setString(5, vo.getUploadFile());
			flag=ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, ps);
		}
		return flag;
	}
    
    //닫기 closeConnection
	private void closeConnection(Connection con, PreparedStatement ps) {
		try {
			if(ps!=null) ps.close();
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
	}
	private void closeConnection(Connection con, Statement st, ResultSet rs) {
		try {
			if(st!=null) st.close();
			if(con!=null) con.close();
			if(rs!=null) rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
	}

 

 


강의목록 탭을 클릭하면 ClassList.jsp으로 이동한다.

 

 

ClassList.jsp

  • 강의목록에 관련된 jsp는 ClassList.jsp와 ClassListResult.jsp로 jsp로 나뉜다.
  • ClassList.jsp는 $.get 방식으로 WClassListAction.java에서 받아온 강의목록을 정해진 영역에 뿌려주는 기능과, 검색 영역을 포함하고 있다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/include/header.jsp" %>
<script>
$(document).ready(function(){
	getData(1,"","");
	$("#btnSearch").on("click",function(){//검색버튼 클릭
		getData(1,$("#field").val(),$("#word").val());
	})
})//document
function getData(pageNum, field, word){
	$.get("ClassList",
		  {"pageNum":pageNum, "field":field, "word":word}, 
		  function(d){
		  $("#result").html(d);
	})
}
</script>
</head>
<body>
<div id="result"></div>
<div align = "center">
<form name = "search" id = "search" class="selectpicker" data-live-search="true">
	<select name = "field" id = "field">
		<option value = "classname">강의명</option>
	</select>
	<input type = "text" name = "word" id = "word">
	<input type = "button" value = "검색" id = "btnSearch"> 
</form>
</div>
<br/>
</body>
</html>
<%@ include file="/include/footer.jsp" %>

 


WClassListAction.java

(ClassList.jsp와 ClassListResult.jsp로 값을 넘기는 서블릿. 경로는 "/Tutoring/class/classList"이다.)

 

package com.wclass.action;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
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.wmember.model.PageUtil;
import com.wmember.model.WClassDAO;
import com.wmember.model.WClassDTO;

/**
 * Servlet implementation class WClassListAction
 */
@WebServlet("/class/ClassList")
public class WClassListAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WClassListAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WClassDAO dao=WClassDAO.getInstance();
		
		String pageNum=request.getParameter("pageNum")==null? "1":request.getParameter("pageNum");
		int currentPage=Integer.parseInt(pageNum);
		int pageSize=5;
		int startRow=(currentPage-1)*pageSize+1;
		int endRow=currentPage*pageSize;
		
		int count=0;
		String field=request.getParameter("field")==null? "":request.getParameter("field");
		String word=request.getParameter("word")==null? "":request.getParameter("word");
		count=dao.getCount(field,word);
		
		int totPage=(count/pageSize)+(count%pageSize==0?0:1);
		int pageBlock=3;
		int startPage=((currentPage-1)/pageBlock)*pageBlock+1;
		int endPage=startPage+pageBlock-1;
		if(endPage>totPage) endPage=totPage;
		
		PageUtil pu=new PageUtil();
		pu.setCurrentPage(currentPage);
		pu.setEndPage(endPage);
		pu.setField(field);
		pu.setPageBlock(pageBlock);
		pu.setStartPage(startPage);
		pu.setTotPage(totPage);
		pu.setWord(word);
		
		ArrayList<WClassDTO> arr=null;
		if(word.equals("")) {
			arr=dao.classList(startRow,endRow);
		}else {
			arr=dao.classList(field, word, startRow, endRow);
		}
		
		int rowNo=count-((currentPage-1)*pageSize);
		
		request.setAttribute("rowNo", rowNo);
		request.setAttribute("pu", pu);
		request.setAttribute("wclass", arr);
		request.setAttribute("count", count);
		
		RequestDispatcher rd=request.getRequestDispatcher("ClassListResult.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}

 

  • if else문으로 검색일때와 검색이 아닐때를 나누어서 WClassDAO.java의 classList 메소드를 수행한다.
  • 페이징을 위해 PageUtil.java를 만들었다. 게터세터 생성.
  • 페이징 관련 객체들, 강의 수 출력 관련 객체들, 강의목록을 request.setAttribute 메소드에 담고 ClassListResult.jsp에서 뿌려준다.

<PageUtil.java>

package com.wmember.model;

public class PageUtil {
	private int currentPage;
	private int endPage;
	private int startPage;
	private int totPage;
	private int pageBlock;
	private String field;
	private String word;
	private int classnum;
	
	public int getClassnum() {
		return classnum;
	}
	public void setClassnum(int classnum) {
		this.classnum = classnum;
	}
	public int getCurrentPage() {
		return currentPage;
	}
	public void setCurrentPage(int currentPage) {
		this.currentPage = currentPage;
	}
	public int getEndPage() {
		return endPage;
	}
	public void setEndPage(int endPage) {
		this.endPage = endPage;
	}
	public int getStartPage() {
		return startPage;
	}
	public void setStartPage(int startPage) {
		this.startPage = startPage;
	}
	public int getTotPage() {
		return totPage;
	}
	public void setTotPage(int totPage) {
		this.totPage = totPage;
	}
	public int getPageBlock() {
		return pageBlock;
	}
	public void setPageBlock(int pageBlock) {
		this.pageBlock = pageBlock;
	}
	public String getField() {
		return field == null ? "" : field.trim();
	}
	public void setField(String field) {
		this.field = field;
	}
	public String getWord() {
		return word == null ? "" : word.trim();
	}
	public void setWord(String word) {
		this.word = word;
	}
}

 


<WClassDAO.java의 classList 메소드> (검색 아닐때)

//검색 아닌 전체보기
	public ArrayList<WClassDTO> classList(int startRow, int endRow) {
		Connection con=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		ArrayList<WClassDTO>arr=new ArrayList<WClassDTO>();
		
		try {
			con=getConnection();
			StringBuilder sb=new StringBuilder();
			sb.append("select * from");
			sb.append(" (select aa.*, rownum rn from");
			sb.append(" (select * from wclass order by classnum desc) aa");
			sb.append(" where rownum<=?) where rn>=?");
			ps=con.prepareStatement(sb.toString());
			ps.setInt(1, endRow);
			ps.setInt(2, startRow);
			rs=ps.executeQuery();
			while(rs.next()) {
				WClassDTO dto=new WClassDTO();
				dto.setClassnum(rs.getInt("classnum"));
				dto.setClassname(rs.getString("classname"));
				dto.setStu_num(rs.getInt("stu_num"));
				dto.setStu_regdate(rs.getString("stu_regdate"));
				dto.setTopic(rs.getString("topic"));
				dto.setContent(rs.getString("content"));
				dto.setClevel(rs.getString("clevel"));
				dto.setUploadFile((rs.getString("uploadfile")));
				arr.add(dto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, ps, rs);
		}
		return arr;
	}

 


<WClassDAO.java의 classList 메소드> (검색했을때)

//검색 전체보기
	public ArrayList<WClassDTO> classList(String field, String word, int startRow, int endRow) {
		Connection con=null;
		PreparedStatement ps=null;
		ResultSet rs=null;
		ArrayList<WClassDTO>arr=new ArrayList<WClassDTO>();
		
		try {
			con=getConnection();
			StringBuilder sb=new StringBuilder();
			sb.append("select * from");
			sb.append(" (select aa.*, rownum rn from");
			sb.append(" (select * from wclass where upper ("+field+") like upper ('%"+word+"%')");
			sb.append(" order by classnum desc) aa");
			sb.append(" where rownum<=?) where rn>=?");
			ps=con.prepareStatement(sb.toString());
			ps.setInt(1, endRow);
			ps.setInt(2, startRow);
			rs=ps.executeQuery();
			while(rs.next()) {
				WClassDTO dto=new WClassDTO();
				dto.setClassnum(rs.getInt("classnum"));
				dto.setClassname(rs.getString("classname"));
				dto.setStu_num(rs.getInt("stu_num"));
				dto.setStu_regdate(rs.getString("stu_regdate"));
				dto.setTopic(rs.getString("topic"));
				dto.setContent(rs.getString("content"));
				dto.setClevel(rs.getString("clevel"));
				dto.setUploadFile((rs.getString("uploadfile")));
				arr.add(dto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, ps, rs);
		}
		return arr;
	}

 

 


<WClassDAO.java의 getCount 메소드> (if else를 이용해 검색과 검색아닌 경우를 분리)

 

//강의수 출력
	public int getCount(String field, String word) {
		Connection con=null;
		Statement st=null;
		ResultSet rs=null;
		int count=0;
		String sql="";
		
		try {
			con=getConnection();
			st=con.createStatement();
			if(word.equals("")) {
				sql="select count(*) from wclass";
			}else {
				sql="select count(*) from wclass where upper ("+field+") like upper ('%"+word+"%')";
			}
			rs=st.executeQuery(sql);
			if(rs.next()) {
				count=rs.getInt(1);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, rs);
		}
		return count;
	}

ClassListResult.jsp

  • ClassListResult.jsp는 WClassListAction.java에서 넘어온 강의목록과 페이징 영역을 포함하고 있다.
  • 강의목록을 클릭했을때 ClassList.jsp->WClassListAction.java->ClassResult.jsp로 이동한다. 
  • 나중에 설명할 장바구니 cartList.jsp와는 차이점이 있다. (cartList.jsp에는 페이징과 검색기능이 없다. $.getJSON으로 cartList.java에 가고 JSONObject과 JSONArray객체를 만들어서 뿌릴 값들을 저장한다. 그다음 다시 cartList.jsp로 돌아와서 $.each로 뿌린다.)
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<style>
h5 a{
 	text-decoration: none;
 	color: black;
 }
.back2{
	margin-top: 20px;
	background-color: #f8f9fa;
}
.sidebar{
	float: left;
	width: 200px;
	height:200px;
	margin-top: 60px;
	margin-left: 60px;
}
.sidebar ul{
	list-style: none;
}
.sidebar ul a{
	line-height: 2em;
}
</style>
</head>
<body>
<aside class="sidebar">
	<ul id="menu">
        <li><h5><a href="/Tutoring/class/ClassInsert"> 강의입력</a></h5></li>
        <li><h5><a href="/Tutoring/class/ClassList.jsp"> 강의목록</a></h5></li>
        <li><h5><a href="/Tutoring/member/Adminview"> 계정설정</a></h5></li>
	</ul>
</aside>
<div class="container">
<br/>
<h5><a href="ClassList.jsp">강의목록(<span id="cntSpan">${count}</span>)</a></h5>
<div class="back2">
<table class="table table-hover">
	<thead>
		<tr>
			<th>번호</th>
			<th>강의분류</th>
	        <th>강의명</th>
	        <th>강의 주제</th>
		</tr>
	</thead>
	<tbody>
		<c:forEach items="${wclass}" var="wclass" varStatus="st">
		<tr>
			<td>${rowNo-st.index}</td>
			<c:if test="${wclass.clevel eq 'basic'}">
				<td>유창한 영어의 기본 요소</td>
			</c:if>
			<c:if test="${wclass.clevel eq 'career'}">
				<td>경력 개발</td>
			</c:if>
			<c:if test="${wclass.clevel eq 'expression'}">
				<td>자신을 표현해보세요</td>
			</c:if>
			<c:if test="${wclass.clevel eq 'test'}">
				<td>시험 준비</td>
			</c:if>
      		<td><a href="ClassDetail?num=${wclass.classnum}">${wclass.classname}</a></td>
      		<td>${wclass.topic}</td>
      	</tr>
		</c:forEach>
	</tbody>
</table>
</div>
</div>
<div align="center" class="text-success">
	<c:if test="${pu.startPage>pu.pageBlock }"> <!-- 이전 -->
		<a href="javascript:getData(${pu.startPage-pu.pageBlock},'${pu.field}','${pu.word}')">[이전]</a>
	</c:if>
	<c:forEach begin="${pu.startPage}" end="${pu.endPage}" var="i"><!-- 페이지 출력 -->
		<c:if test="${i==pu.currentPage}"> <!-- 현재 페이지 -->
			<c:out value="${i}"/>
		</c:if>
		<c:if test="${i!=pu.currentPage}"> <!-- 현재 페이지 아닌 경우 링크 부여-->
			<a href="javascript:getData(${i},'${pu.field}','${pu.word}')">${i}</a>
		</c:if>
	</c:forEach>
	<c:if test="${pu.endPage<pu.totPage}"> <!-- 다음-->
		<a href="javascript:getData(${pu.endPage+1},'${pu.field}','${pu.word}')">[다음]</a>
	</c:if>
</div>
<br/>

 

제목을 클릭하면 다음 코드에 의해 강의 상세보기 페이지로 이동한다.

<td><a href="ClassDetail?num=${wclass.classnum}">${wclass.classname}</a></td>

 


WClassDetail.java

(강의 상세보기 서블릿. 경로는 "/Tutoring/class/ClassDetail")

 

package com.wclass.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import com.wmember.model.WClassDAO;
import com.wmember.model.WClassDTO;

@WebServlet("/class/ClassDetail")
public class WClassDetailAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WClassDetailAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WClassDAO dao=WClassDAO.getInstance();
		int num=Integer.parseInt(request.getParameter("num"));
		WClassDTO dto=dao.classView(num);
		request.setAttribute("dto", dto);
		RequestDispatcher rd=request.getRequestDispatcher("ClassDetail.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

  • ClassListResult.jsp에서 받아온 num값을 이용하여 WClassDAO.java의 classView 메소드를 실행한다.
  • dto객체를 dto 이름으로 저장하여 ClassDetail.jsp로 내보낸다.

 


 

<WClassDAO.java의 classView 메소드>

//강의 상세보기
	public WClassDTO classView (int classnum) {
		Connection con=null;
		Statement st=null;
		ResultSet rs=null;
		WClassDTO dto=null;
		try {
			con=getConnection();
			st=con.createStatement();
			String sql="select * from wclass where classnum="+classnum;
			rs=st.executeQuery(sql);
			if(rs.next()) {
				dto=new WClassDTO();
				dto.setClassnum(rs.getInt("classnum"));
				dto.setClassname(rs.getString("classname"));
				dto.setClevel(rs.getString("clevel"));
				dto.setContent(rs.getString("content"));
				dto.setStu_num(rs.getInt("stu_num"));
				dto.setStu_regdate(rs.getString("stu_regdate"));
				dto.setTopic(rs.getString("topic"));
				dto.setUploadFile((rs.getString("uploadfile")));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, rs);
		}
		return dto;
	}

 


ClassDetail.jsp

회원정보 수정과 마찬가지로 강의를 수정하고 삭제할 수 있는 폼을 포함하고 있다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp" %>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<style>
a{
	text-decoration: none;
}
a:hover{
	text-decoration: none;
}
.back2{
	margin-top: 20px;
	background-color: #f8f9fa;
	border-radius: 20px;
}
#frm{
	margin: 0 auto;
	width: 50%;
}
.button{
	text-align: center;
	margin: 0 auto;
	padding: 20px;
}
.sidebar{
	float: left;
	width: 200px;
	height:200px;
	margin-top: 60px;
	margin-left: 60px;
}
.sidebar ul{
	list-style: none;
}
.sidebar ul a{
	line-height: 2em;
}
.thumb-image{
	float:left;
	width:200px;
	position:relative;
	padding:5px;
}
img{
	width:200px;
}
</style>
<aside class="sidebar">
	<ul id="menu">
        <li><h5><a href="/Tutoring/class/ClassInsert.jsp"> 강의입력</a></h5></li>
        <li><h5><a href="/Tutoring/class/ClassList.jsp"> 강의목록</a></h5></li>
        <li><h5><a href="/Tutoring/member/Adminview"> 계정설정</a></h5></li>
	</ul>
</aside>
<div class="container">
<br/>
<h5>강의입력</h5>
<div class="back2">
<form action="ClassUpdate" method="post" id="frm" enctype="multipart/form-data">
  <br/><br/>
  	<div id="image-holder"></div>
      <img src="/Tutoring/upload/${dto.uploadFile}">
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의 이미지</span>
    </div>
      <input type="file" class="form-control" id="uploadFile" name="uploadFile">
      <input type="text" class="form-control" value="${dto.uploadFile}">
  </div>
  <br/>
  
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의분류</span>
    </div>
      <select name="clevel" id="clevel" name="clevel">
      	<option value="basic" class="form-control" >유창한 영어의 기본 요소</option>
      	<option value="career" class="form-control">경력 개발</option>
      	<option value="expression" class="form-control">자신을 표현해보세요</option>
      	<option value="test" class="form-control">시험 준비</option>
      </select>
  </div>
  <br/>
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의명</span>
    </div>
      <input type="text" class="form-control" id="classname" name="classname" value="${dto.classname}">
  </div>
  <br/>
   
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의 주제</span>
    </div>
      <input type="text" class="form-control" id="topic" name="topic" value="${dto.topic}">
  </div>
  <br/>
  
  <div class="input-group mb-3">
    <div class="input-group-prepend">
      <span class="input-group-text">강의설명</span>
    </div>
      <textarea rows="5" cols="20" class="form-control" id="content" name="content">${dto.content}</textarea>
  </div>
  <br/>
  
  <div class="button">
 	  <button  id="send"  class="btn btn-info">저장</button>
 	  <input type="button" class="btn btn-danger" value="강의삭제" onclick="delClassCheck('${dto.classnum}')">
  </div>
<input type="hidden" id="classnum" name="classnum" value="${dto.classnum}">
</form>
</div>
</div>
<br/><br/>
<%@ include file="../include/footer.jsp" %>
<script>
$("select[name=clevel] option").each(function(){
	if($(this).val()=='${dto.clevel}'){
		 $(this).prop("selected", true);
	}
});
function delClassCheck(classnum){
	 if(confirm("삭제하시겠습니까? 삭제된 강의정보는 되돌릴 수 없습니다.")){
    	location.href="delete?classnum="+classnum;
    }
}
$(document).ready(function(){
	$("#send").click(function(){
		if($("#classname").val()==""){
			alert("강의명을 입력하세요");
			$("#classname").focus();
			return false;
		}
		if($("#topic").val()==""){
			alert("강의주제를 입력하세요");
			$("#topic").focus();
			return false;
		}
		if($("#content").val()==""){
			alert("강의설명을 입력하세요");
			$("#content").focus();
			return false;
		}
		$("#frm").submit();
	})//send
	
	$("#uploadFile").on('change', function () {
        if (typeof (FileReader) != "undefined") {
            var image_holder = $("#image-holder");
            image_holder.empty();
            var reader = new FileReader();
            reader.onload = function (e) {
                $("<img />", {
                    "src": e.target.result,
                    "class": "thumb-image"
                }).appendTo(image_holder);
            }
            image_holder.show();
            reader.readAsDataURL($(this)[0].files[0]);
        } else {
            alert("이 브라우저에서 지원하지 않는 확장자 입니다.");
        }
    });
});//document
</script>

 

  • send버튼을 누르면 ClassUpdate로 post방식으로 넘어간다. 강의 이미지를 포함하고 있기 때문에 form 태그 안에 enctype="multipart/form-data"를 포함하고 있다.


WClassUpdate.java

(ClassDetail.jsp에서 넘어온 서블릿. 경로는 "/Tutoring/class/ClassUpdate"이다.)

 

package com.wclass.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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 javax.servlet.http.HttpSession;

import com.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import com.wmember.model.WClassDAO;
import com.wmember.model.WClassDTO;

/**
 * Servlet implementation class MemberUpdate
 */
@WebServlet("/class/ClassUpdate")
public class WClassUpdateAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WClassUpdateAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WClassDAO dao=WClassDAO.getInstance();
		int uploadFileSizeLimit=5*1024*1024;
		String encType="UTF-8";
		String savePath="upload";
		ServletContext context=getServletContext();
		String uploadFilePath=context.getRealPath(savePath);
		
		//multipart/form 방식은 request.getParameter로 받아올 수 없음
		MultipartRequest multi=new MultipartRequest(
				request, //request객체
				uploadFilePath, //서버상의 실제 디렉토리
				uploadFileSizeLimit, //최대 업로드 파일 크기
				encType, //인코딩 방법
				new DefaultFileRenamePolicy()); //동일 파일 새이름 부여
		
		//업로드된 파일이름 구하기
		String fileName=multi.getFilesystemName("uploadFile");
		
		if(fileName==null) { //파일 업로드 안됨
			System.out.println("파일 업로드 되지 않았음");
		}
		
		WClassDTO wclass=new WClassDTO();
		wclass.setUploadFile(fileName);
		wclass.setClassname(multi.getParameter("classname"));
		wclass.setClevel(multi.getParameter("clevel"));
		wclass.setContent(multi.getParameter("content"));
		wclass.setTopic(multi.getParameter("topic"));
		int classnum=Integer.parseInt(multi.getParameter("classnum"));
		wclass.setClassnum(classnum);
		int flag=dao.classUpdate(wclass);
		if(flag==1) {
			response.setContentType("text/html; charset=euc-kr");
			PrintWriter out = response.getWriter();
			out.println("<script>");
			out.println("alert('강의정보가 수정되었습니다');");
			out.println("history.back(-1);");
			out.println("</script>");
		}

	}
}

 

  • ClassInsert와 마찬가지로 MultipartRequest 메소드를 이용하여 객체를 선언한다.
  • WClassDAO.java의 classUpdate 메소드를 수행하고 return 값이 있으면 alert 창을 띄운다.

 


<WClassDAO.java의 classUpdate 메소드>

 

//강의정보 수정
	public int classUpdate(WClassDTO vo) {
		Connection con=null;
		PreparedStatement ps=null;
		int flag=0;
		try {
			con=getConnection();
			String sql="update wclass set classname=?, topic=?, content=?, clevel=?, uploadfile=? where classnum=?";
			ps=con.prepareStatement(sql);
			ps.setString(1, vo.getClassname());
			ps.setString(2, vo.getTopic());
			ps.setString(3, vo.getContent());
			ps.setString(4, vo.getClevel());
			ps.setString(5, vo.getUploadFile());
			ps.setInt(6, vo.getClassnum());
			flag=ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, ps);
		}
		return flag;
	}

 


강의 상세보기(ClassDetail.jsp)에서 강의삭제 버튼을 누르면 자바스크립트의 delClassCheck로 강의번호를 들고 넘어간다.

 

function delClassCheck(classnum){
	 if(confirm("삭제하시겠습니까? 삭제된 강의정보는 되돌릴 수 없습니다.")){
    	location.href="delete?classnum="+classnum;
    }
}

 

 

WClassDeleteAction.java

(강의 삭제 서블릿. 경로는 "/Tutoring/class/delete"이다.)

 

package com.wclass.action;

import java.io.IOException;

import javax.servlet.ServletContext;
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.oreilly.servlet.MultipartRequest;
import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;
import com.wmember.model.WClassDAO;

/**
 * Servlet implementation class WClassDeleteAction
 */
@WebServlet("/class/delete")
public class WClassDeleteAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WClassDeleteAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WClassDAO dao=WClassDAO.getInstance();
		int classnum=Integer.parseInt(request.getParameter("classnum"));
		dao.classDel(classnum);
		response.sendRedirect("ClassList.jsp");
	}

}

 

  • 파라미터 값으로 받아온 classnum(강의번호)을 들고 WClassDAO.java의 classDel메소드를 수행한다. 
  • 삭제하고 난 뒤에는 ClassList.jsp로 다시 이동한다.

 


<WClassDAO.java의 classDel 메소드>

 

//삭제
	public void classDel(int classnum) {
		Connection con=null;
		Statement st=null;
		try {
			con=getConnection();
			String sql="delete from wclass where classnum='"+classnum+"'";
			st=con.createStatement();
			st.executeUpdate(sql);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, null);
		}
	}

 


WMemberLogout.java

(로그아웃 기능을 구현하는 서블릿. 경로는 "/Tutoring/member/logout"이다.)

 

package com.wmember.action;

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 javax.servlet.http.HttpSession;

/**
 * Servlet implementation class MemberLogout
 */
@WebServlet("/member/logout")
public class WMemberLogout extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WMemberLogout() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		HttpSession session=request.getSession();
		session.invalidate();
		response.sendRedirect("login");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	}

}

https://github.com/kkj0712/JspProject_Tutoring

 

kkj0712/JspProject_Tutoring

Contribute to kkj0712/JspProject_Tutoring development by creating an account on GitHub.

github.com

 

학원에서 일주일간 JSP로 개인프로젝트를 했다. 주제는 영어 학습 사이트. 벤치마킹?할 사이트는 캠블리로 선정했다.

강의 구매와 튜터 매칭 시스템, 캘린더에서 날짜를 골라서 수업을 듣는 기능은 구현하지 못했다. 

 

https://www.cambly.com/english?lang=ko

 

캠블리 Cambly, 전화영어 그 이상의 영어회화어플

Cambly에서 원어민 튜터와 언제 어디서나 간편하게 영어 수업을 받으시고, 영어 회화의 자신감을 키우세요!

www.cambly.com

 

내가 구현한 기능은

1. 회원가입, 로그인

2. 관리자 강의입력, 관리자 강의목록 보기 및 수정, 회원정보 수정

3. 사용자 강의목록 전체보기, 상세보기

4. 수강후기 게시판 전체보기, 회원 게시글 입력

5. 수강후기 게시글 상세보기 및 수정 삭제, 댓글 입력 삭제

6. 강의 장바구니 담기 및 삭제

 


사이트 디자인은 부트스트랩 템플릿을 이용했다.

https://startbootstrap.com/themes/landing-page/

 

Landing Page - Free Bootstrap 4 Landing Page Theme

A responsive Bootstrap 4 landing page theme by Start Bootstrap. All Start Bootstrap templates are free to download and open source.

startbootstrap.com

이외에도 다른 무료 부트스트랩 템플릿에 있는 사진들을 활용했다. 이 템플릿의 이름인 Wiser을 따와서 사이트 이름을 Wiser로 했다.

https://colorlib.com/wp/template/wiser/

 

Wiser - Free LMS Website Template Design 2020 - Colorlib

Wiser is a top-notch, responsive and free LMS website template design for establishing a striking online learning platform.

colorlib.com


DB구성 (Oracle SQL Developer)과 Table명

1. 회원과 관련된 DB -> WMember

2. 강의와 관련된 DB -> WClass

3. 수강후기 게시판 DB -> WBoard

4. 수강후기 댓글 DB -> WComment_Board

5. 장바구니 DB -> WCart

 

  • WClass의 기본키인 classnum(강의번호. 시퀀스로 부여)은 WBoard의 외래키로 참조된다. 
  • 수강후기 게시글에 해당하는 댓글 리스트를 보여줘야 하므로, WBoard의 기본키인 NUM은 WComment_Board의 BNUM 외래키로 참조된다.
  • (WMember의 classnum, WCart의 classnum또한 WClass의 classnum을 참조해야하는데 제약조건 설정을 빼먹었다..)

 

 


회원 DB관련 DTO (WmemberDTO.java)

 

package com.wmember.model;

public class WMemberDTO {
	private int num;
	private String name;
	private String userid;
	private String pwd;
	private String email;
	
	private int postcode;
	private String address;
	private String detailAddress;
	private String extraAddress;
	
	private String classnum;
	private String reg_date;
	private int admin;
	
	public int getPostcode() {
		return postcode;
	}
	public void setPostcode(int postcode) {
		this.postcode = postcode;
	}
	public String getAddress() {
		return address == null ? "" : address.trim();
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getDetailAddress() {
		return detailAddress == null ? "" : detailAddress.trim();
	}
	public void setDetailAddress(String detailAddress) {
		this.detailAddress = detailAddress;
	}
	public String getExtraAddress() {
		return extraAddress == null ? "" : extraAddress.trim();
	}
	public void setExtraAddress(String extraAddress) {
		this.extraAddress = extraAddress;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getName() {
		return name == null ? "" : name.trim();
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getUserid() {
		return userid == null ? "" : userid.trim();
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getPwd() {
		return pwd == null ? "" : pwd.trim();
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public String getEmail() {
		return email == null ? "" : email.trim();
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getClassnum() {
		return classnum == null ? "" : classnum.trim();
	}
	public void setClassnum(String classnum) {
		this.classnum = classnum;
	}
	public String getReg_date() {
		return reg_date == null ? "" : reg_date.trim();
	}
	public void setReg_date(String reg_date) {
		this.reg_date = reg_date;
	}
	public int getAdmin() {
		return admin;
	}
	public void setAdmin(int admin) {
		this.admin = admin;
	}
}

 


첫 시작화면에 해당하는 index.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="/include/header.jsp" %>
<style>
h1{
	text-align: left;
}
</style>
  <!-- Masthead -->
  <header class="masthead text-white text-center">
    <div class="overlay"></div>
       
        <div class="mainLine">
          <span style="width: 100%; height: 200px;"></span>
          <h1 style="color:#484848; font-size: 48px; line-height: 1.5em;">생생한 원어민 화상영어,<br/> 지금바로 시작하세요!</h1>
        </div>
       
          <form>
            <div class="form-row" style="width: 30%;">
              <div class="col-12 col-md-9 mb-2 mb-md-0">
                <input type="email" class="form-control form-control-lg" placeholder="  이메일 주소">
              </div>
              <div class="col-12 col-md-3">
                <input type="button" value="회원가입" class="btn btn-block btn-lg btn-primary" onclick="location.href='/Tutoring/member/insert'">
              </div>
            </div>
          </form>
  </header>

  <!-- Icons Grid -->
  <section class="features-icons bg-light text-center">
    <div class="container">
      <div class="row">
        <div class="col-lg-4">
          <div class="features-icons-item mx-auto mb-5 mb-lg-0 mb-lg-3">
            <div class="features-icons-icon d-flex">
              <i class="icon-screen-desktop m-auto text-primary"></i>
            </div>
            <h3>수업</h3>
            <p class="lead mb-0">튜터와 만들어 나가는 유연한 학습 스케쥴</p>
          </div>
        </div>
        <div class="col-lg-4">
          <div class="features-icons-item mx-auto mb-5 mb-lg-0 mb-lg-3">
            <div class="features-icons-icon d-flex">
              <i class="icon-layers m-auto text-primary"></i>
            </div>
            <h3>커리큘럼</h3>
            <p class="lead mb-0">내 레벨에 맞춰 선택해 더욱 체계적인 수업 진행</p>
          </div>
        </div>
        <div class="col-lg-4">
          <div class="features-icons-item mx-auto mb-0 mb-lg-3">
            <div class="features-icons-icon d-flex">
              <i class="icon-check m-auto text-primary"></i>
            </div>
            <h3>수료증</h3>
            <p class="lead mb-0">10시간 이상 수업 시, 캠블리 수료증 발급</p>
          </div>
        </div>
      </div>
    </div>
  </section>

  <!-- Testimonials -->
  <section class="testimonials text-center bg-light">
    <div class="container">
      <h2 class="mb-5">유학 없이도 유창하게 영어로 말할 수 있어요!</h2>
      <div class="row">
        <div class="col-lg-4">
          <div class="testimonial-item mx-auto mb-5 mb-lg-0">
            <img class="img-fluid rounded-circle mb-3" src="img/testimonials-1.jpg" alt="">
            <h5>Margaret E.</h5>
            <p class="font-weight-light mb-0">"I have been teaching English for 3 years. I am very patient, kind and I love to learn about new cultures and your thoughts about life."</p>
          </div>
        </div>
        <div class="col-lg-4">
          <div class="testimonial-item mx-auto mb-5 mb-lg-0">
            <img class="img-fluid rounded-circle mb-3" src="img/testimonials-2.jpg" alt="">
            <h5>Fred S.</h5>
            <p class="font-weight-light mb-0">"A conversationalist, I have worked internationally in business (operations, sales, training and HR) and am also licensed to teach scuba!"</p>
          </div>
        </div>
        <div class="col-lg-4">
          <div class="testimonial-item mx-auto mb-5 mb-lg-0">
            <img class="img-fluid rounded-circle mb-3" src="img/testimonials-3.jpg" alt="">
            <h5>Sarah W.</h5>
            <p class="font-weight-light mb-0">"I own and run a small business, am easy to speak to and hold a TEFL qualification. I look forward to meeting you!"</p>
          </div>
        </div>
      </div>
    </div>
  </section>

  <!-- Call to Action -->
  <section class="call-to-action text-white text-center">
    <div class="overlay"></div>
    <div class="container">
      <div class="row">
        <div class="col-xl-9 mx-auto">
          <h2 class="mb-4">내게 꼭 맞는 튜터를 찾아보세요</h2>
        </div>
        <div class="col-md-10 col-lg-8 col-xl-7 mx-auto">
          <form>
            <div class="form-row">
              <div class="col-12 col-md-9 mb-2 mb-md-0">
                <input type="email" class="form-control form-control-lg" placeholder="  이메일 주소">
              </div>
              <div class="col-12 col-md-3">
                 <input type="button" value="회원가입" class="btn btn-block btn-lg btn-primary" onclick="location.href='/Tutoring/member/insert'">
              </div>
            </div>
          </form>
        </div>
      </div>
    </div>
  </section>
<%@ include file="/include/footer.jsp" %>

 


header.jsp와 footer.jsp를 나누어서 페이지마다 포함시켰다.

 

header.jsp

 

sessionScope.userid 값이 비어있으면 로그인/회원가입 링크가, 

sessionScope.admin 값이 1이면 관리자이므로 관리자/로그아웃 링크가,

sessionScope.admin 값이 0이면 일반회원이므로 내계정/로그아웃 링크가 나타난다.

<%@ 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">
  <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  <meta name="description" content="">
  <meta name="author" content="">
  <title>영어 수업</title>
  <!-- Bootstrap core CSS -->
  <link href="/Tutoring/vendor/bootstrap/css/bootstrap.css"  rel="stylesheet">
  <!-- Custom fonts for this template -->
  <link href="/Tutoring/vendor/fontawesome-free/css/all.css" rel="stylesheet">
  <link href="/Tutoring/vendor/simple-line-icons/css/simple-line-icons.css"  rel="stylesheet" type="text/css">
  <link href="https://fonts.googleapis.com/css?family=Lato:300,400,700,300italic,400italic,700italic"  rel="stylesheet" type="text/css">
  <!-- Custom styles for this template -->
  <link href="/Tutoring/css/landing-page.css" rel="stylesheet">
  
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
  


</head>
<body>

  <!-- Navigation -->
  <nav class="navbar navbar-light bg-light static-top">
    <div class="container">
         <a class="navbar-brand" href="/Tutoring/index.jsp">Wiser English</a>
         <a class="navbar-nav" href="/Tutoring/include/about.jsp">와이저</a>
         <a class="navbar-nav" href="/Tutoring/class/courseList">과정</a>
    </div>
      <c:choose>
     	<c:when test="${empty sessionScope.userid}">
		    <ul class="navbar-nav">
		      <li class="nav-item">
		      	<a class="btn btn-gray" href="/Tutoring/member/login">로그인</a>
			    <a class="btn btn-primary" href="/Tutoring/member/insert">회원가입</a>
		      </li>
		  	</ul>
    	</c:when>
    	<c:when test="${sessionScope.admin==1}">
		    <ul class="navbar-nav">
		      <li class="nav-item">
		      	<a class="btn btn-gray" href="/Tutoring/member/Adminview">관리자</a>
			    <a class="btn btn-primary" href="/Tutoring/member/logout">로그아웃</a>
		      </li>
		  	</ul>
    	</c:when>
    	<c:when test="${sessionScope.admin==0}">
    		<ul class="navbar-nav">
		      <li class="nav-item">
		      	<a class="btn btn-gray" href="/Tutoring/member/view">내계정</a>
			    <a class="btn btn-info" href="/Tutoring/member/logout">로그아웃</a>
		      </li>
		  	</ul>
    	</c:when>
     </c:choose>  
  	
  </nav>
  
<!-- Bootstrap core JavaScript -->
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="/Tutoring/vendor/jquery/jquery.js"></script>
<script src="/Tutoring/vendor/bootstrap/js/bootstrap.bundle.js"></script>

header.jsp 실행화면

 

sessionScope.userid, sessionScope.admin 값은 로그인을 할때 받아온다.

 


WMemberLoginAction.java

(로그인 링크에 해당하는 "/Tutoring/member/login" 경로의 서블릿이다.)

 

package com.wmember.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
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 javax.servlet.http.HttpSession;

import com.wmember.model.WMemberDAO;

/**
 * Servlet implementation class WMemberLoginAction
 */
@WebServlet("/member/login")
public class WMemberLoginAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WMemberLoginAction() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd=request.getRequestDispatcher("login.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String userid=request.getParameter("userid");
		String pwd=request.getParameter("pwd");
		WMemberDAO dao=WMemberDAO.getInstance();
		int flag=dao.loginCheck(userid, pwd);
		int admin=-1;
		if(flag==0 || flag==1) {
			HttpSession session=request.getSession();
			session.setAttribute("userid", userid);
			admin=flag;
			session.setAttribute("admin", admin);
		}
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter(); 
		out.println(flag);
	}

}

 

  • a링크를 통해 이동하였으므로 doGet에서 처리된다. RequestDispatcher의 forward 메소드로 login.jsp로 이동한다.

  • login.jsp에서 ajax의 post방식으로 다시 WMemberLoginAction.java로 돌아온다. post방식이므로 doPost내에서 처리된다.
  • 파라미터 값으로 받아온 userid와 pwd를 들고 WMemberDAO.java내의 loginCheck 메소드를 실행한다. 
  • 리턴값을 flag에 담는다. 
  • 변수 admin을 -1값을 입력하여 선언한다. admin은 관리자, 일반회원을 구분하는 변수이다. 우선 모든 이용자는 일반회원으로 가입되고, DB에서 admin값에 1을 부여하여 관리자를 선별한다. 
  • loginCheck메소드에 의해 flag값이 0 또는 1로 저장되면 session값으로 userid를 받아온다. admin은 flag값과 통일되고 마찬가지로 session값으로 admin을 받는다.
  • out객체를 통해 flag값을 내보낸다.

 

<WMemberDAO.java 중 loginCheck메소드>

 

//디비셋팅
	private static WMemberDAO instance=new WMemberDAO();
	public static WMemberDAO getInstance() {
		return instance;
	}
	private Connection getConnection() throws Exception{
		Context initCtx=new InitialContext();
		Context envCtx=(Context) initCtx.lookup("java:comp/env");
		DataSource ds=(DataSource) envCtx.lookup("jdbc/wiser"); //context.xml의 name을 jdbc/member로 바꾸기
		return ds.getConnection();
	}
    
    
//로그인체크 (비밀번호 오류: 2, 회원아님: -1, 회원: 0, 관리자: 1)
	public int loginCheck(String userid, String pwd) {
		Connection con=null;
		Statement st=null;
		ResultSet rs=null;
		int flag=-1;
		try {
			con=getConnection();
			String sql="select pwd, admin from wmember where userid='"+userid+"'";
			st=con.createStatement();
			rs=st.executeQuery(sql);
			if(rs.next()) { //id 맞음
				if(rs.getString("pwd").equals(pwd)) { //비번 일치
					flag=rs.getInt("admin");
				}else { //비번 오류
					flag=2;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, rs);
		}
		return flag;
	}
    
//닫기 closeConnection
	private void closeConnection(Connection con, PreparedStatement ps) {
		try {
			if(ps!=null) ps.close();
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
	}
	private void closeConnection(Connection con, Statement st, ResultSet rs) {
		try {
			if(st!=null) st.close();
			if(con!=null) con.close();
			if(rs!=null) rs.close();
		} catch (SQLException e) {
			e.printStackTrace();
		} 
	}

 


login.jsp

  • 아이디와 패스워드를 입력하는 폼이 있다.
  • 자바스크립트 태그 안에서 공백을 확인하고 ajax를 이용하여 /Tutoring/member/login으로 다시 이동한다.
  • loginCheck을 끝내고 돌아온 flag값을 switch문을 통해 구분하고 alert창을 띄운 후 각각에 맞게 링크가 이동된다.

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp" %>
<style>
img{
	display: inline-block;
	float: right;
}
#loginFrm{
	width: 60%;
	height: auto;
	position: absolute;
	top: 50%;
	left: 35%;
	transform: translate(-50%, -50%);
}
</style>
<div class="container-fluid">
	<div class="row">
		<div class="col-md-8">
			<img src="/Tutoring/img/banner.png" alt="loginImage">
		</div>
		<div class="col-md-4">
				<form action="login" method="post" id="loginFrm">
				  <div class="form-group">
				    <label for="userid">아이디</label>
				    <input type="text" class="form-control" id="userid" placeholder="Enter id" name="userid">
				  </div>
				  <div class="form-group">
				    <label for="pwd">패스워드</label>
				    <input type="password" class="form-control" id="pwd" placeholder="Enter password" name="pwd">
				  </div>
				  <button type="button" id="loginBtn" class="btn btn-primary" style="width: 100%;">로그인</button>
				</form>
		</div>
</div>
<script>
$("#loginBtn").click(function(){
	if($("#userid").val()==""){
		alert("아이디를 입력하세요");
		$("#userid").focus();
		return false;
	}
	if($("#pwd").val()==""){
		alert("암호를 입력하세요");
		$("#pwd").focus();
		return false;
	}
	$.ajax({
		type : "post",
		url  : "login",
		data : {"userid":$("#userid").val(), "pwd":$("#pwd").val()},
		success : function(value){
			switch(value.trim()){
			case "0" : alert("로그인 성공"); location.href="/Tutoring/index.jsp"; break;
			case "1" : alert("관리자 로그인"); location.href="/Tutoring/member/Adminview"; break;
			case "2" : alert("비밀번호 오류"); break;
			case "-1": alert("회원이 아닙니다"); location.href="/Tutoring/member/insert"; break;
			default: alert(value.trim());
			}
		},
		error: function(e){
			alert("error:"+e);
		}
	})
})//loginBtn
</script>
<%@ include file="../include/footer.jsp" %>

 

  • 로그인에 성공했을경우 시작페이지로 이동하고 
  • 관리자로 로그인했을경우 관리자 페이지로 이동,
  • 회원이 아니라고 판단되었을 경우 회원가입페이지로 이동한다.

WMemberInsert.java (/Tutoring/member/insert)

(회원가입 링크에 해당하는 "/Tutoring/member/insert" 경로의 서블릿이다.)

package com.wmember.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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.wmember.model.WMemberDAO;
import com.wmember.model.WMemberDTO;

/**
 * Servlet implementation class WMemberInsertAction
 */
@WebServlet("/member/insert")
public class WMemberInsertAction extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WMemberInsertAction() {
        super();
        // TODO Auto-generated constructor stub
    }

/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    RequestDispatcher rd=request.getRequestDispatcher("join.jsp");
    rd.forward(request, response);
}

/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    WMemberDAO dao=WMemberDAO.getInstance();
    WMemberDTO member=new WMemberDTO();
    member.setName(request.getParameter("name"));
    member.setUserid(request.getParameter("userid"));
    member.setPwd(request.getParameter("pwd"));
    member.setEmail(request.getParameter("email"));
    member.setPostcode(Integer.parseInt(request.getParameter("sample6_postcode")));
    member.setAddress(request.getParameter("sample6_address"));
    member.setDetailAddress(request.getParameter("sample6_detailAddress"));
    member.setExtraAddress(request.getParameter("sample6_extraAddress"));

    dao.memberInsert(member);
    response.sendRedirect("login");
    }

}

 

  • a링크를 통해 이동하였으므로 doGet에서 처리된다. RequestDispatcher의 forward 메소드로 join.jsp로 이동한다.

 

 


join.jsp

  • 아이디, 아이디중복확인 버튼, 이름, 비밀번호, 비밀번호 확인, 우편번호 입력 폼이다.
  • 우편번호는 다음 우편번호 API를 이용하였고 예제 자바스크립트 코드를 그대로 복사 붙여넣기했다. 
  • 회원정보 수정할때 주소를 다시 고칠 것을 생각하여 WMemberDB에서 우편번호, 주소, 상세주소, 여분의 주소 컬럼을 만들었다. 
  • 아이디 중복과 여백확인등은 member.js 파일을 만들어서 그곳에서 처리하였다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp" %>
<script src="/Tutoring/js/member.js"></script>
<style>
img{
	display: inline-block;
	float: right;
}
#frm{
	width: 60%;
	height: auto;
	position: absolute;
	top: 50%;
	left: 35%;
	transform: translate(-50%, -50%);
}
.button{
	text-align: center;
	margin: 0 auto;
	padding: 20px;
}
</style>
<div class="container-fluid">
	<div class="row">
		<div class="col-md-7">
			<img src="/Tutoring/img/join.jpg" alt="joinImage">
		</div>
		<div class="col-md-5">
			<form action="insert" method="post" id="frm">
			  <br/><br/>
			  <div class="input-group mb-3">
			    <div class="input-group-prepend">
			      <span class="input-group-text">아이디</span>
			    </div>
			      <input type="text" class="form-control" id="userid" name="userid" readonly="readonly" size=20>
			    <div class="col align-self-end" >
			          <button  type="button"  id="idcheckBtn"  class="btn btn-primary">중복확인</button>
			   	</div>
			  </div>
			  <br/>
			   
			  <div class="input-group mb-3">
			    <div class="input-group-prepend">
			      <span class="input-group-text">이름</span>
			    </div>
			      <input type="text" class="form-control" id="name" name="name">
			  </div>
			  <br/>
			  
			  <div class="input-group mb-3">
			    <div class="input-group-prepend">
			      <span class="input-group-text">비밀번호</span>
			    </div>
			    <input type="password" class="form-control" placeholder="6자리 이상" id="pwd" name="pwd">
			    <input type="password" class="form-control" placeholder="비밀번호 확인" id="pwd_check" name="pwd_check">
			  </div>
			  <br/>
			  
			  <div class="input-group mb-3">
			    <div class="input-group-prepend">
			      <span class="input-group-text">이메일</span>
			    </div>
			      <input type="text" class="form-control" id="email" name="email" placeholder="email@email.com">
			  </div>
			  <br/>
			    
			  <div class="input-group mb-3">
			    <div class="input-group-prepend">
			      <span class="input-group-text">우편번호</span>
			    </div>
			      <input type="text" id="sample6_postcode" name="sample6_postcode" readonly="readonly" class="form-control">
			    <div class="col align-self-end" >
			      <input type="button" onclick="sample6_execDaumPostcode()" value="우편번호" class="btn btn-primary"><br>
			   	</div>
			  </div>
			  <br/>  
			
			  <div class="input-group mb-3">
			    <div class="input-group-prepend">
			      <span class="input-group-text">주소</span>
			    </div>
			    <input type="text" id="sample6_address" name="sample6_address" placeholder="주소" class="form-control"><br>
			  </div>
			
			  <div class="input-group mb-3">
				<input type="text" id="sample6_detailAddress" name="sample6_detailAddress" placeholder="상세주소" class="form-control">
				<input type="text" id="sample6_extraAddress" name="sample6_extraAddress" placeholder="참고항목" class="form-control">
			  </div>
			    
			  <div class="button">
			 	  <input type="reset" class="btn btn-gray" value="취소">
			 	  <button  id="send"  class="btn btn-primary">회원가입</button>
			  </div>
	  </div>
	</form>
	</div>
</div>
<%@ include file="../include/footer.jsp" %>
<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
    function sample6_execDaumPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                // 각 주소의 노출 규칙에 따라 주소를 조합한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
                var addr = ''; // 주소 변수
                var extraAddr = ''; // 참고항목 변수

                //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
                if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                    addr = data.roadAddress;
                } else { // 사용자가 지번 주소를 선택했을 경우(J)
                    addr = data.jibunAddress;
                }

                // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
                if(data.userSelectedType === 'R'){
                    // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                    // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                    if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                        extraAddr += data.bname;
                    }
                    // 건물명이 있고, 공동주택일 경우 추가한다.
                    if(data.buildingName !== '' && data.apartment === 'Y'){
                        extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                    }
                    // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                    if(extraAddr !== ''){
                        extraAddr = ' (' + extraAddr + ')';
                    }
                    // 조합된 참고항목을 해당 필드에 넣는다.
                    document.getElementById("sample6_extraAddress").value = extraAddr;
                
                } else {
                    document.getElementById("sample6_extraAddress").value = '';
                }

                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('sample6_postcode').value = data.zonecode;
                document.getElementById("sample6_address").value = addr;
                // 커서를 상세주소 필드로 이동한다.
                document.getElementById("sample6_detailAddress").focus();
            }
        }).open();
    }
</script>

 


 

 

http://postcode.map.daum.net/guide

 

Daum 우편번호 서비스

우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.

postcode.map.daum.net

 


member.js

email의 경우 정규식을 입력하여 정확하게 입력하도록 유도했다.

id중복확인 버튼을 누를 경우 idCheck.jsp 새 창이 뜬다. 

var reg_email = /^([0-9a-zA-Z_\.-]+)@([0-9a-zA-Z_-]+)(\.[0-9a-zA-Z_-]+){1,2}$/;


$(document).ready(function(){
	$("#send").click(function(){
		//아이디가 공백일때
		if($("#userid").val()==""){
			alert("아이디를 입력하세요");
			$("#userid").focus();
			return false;
		}
		//암호가 공백일때
		if($("#pwd").val()==""){
			alert("암호를 입력하세요");
			$("#pwd").focus();
			return false;
		}
		//암호확인이 공백일때
		if($("#pwd_check").val()==""){
			alert("암호확인 필수");
			$("#pwd_check").focus();
			return false;
		}
		//암호 일치확인
		if($("#pwd").val()!=$("#pwd_check").val()){
			alert("암호 불일치");
			$("#pwd_check").focus();
			return false;
		}
		if($("#pwd").val().length<6){
	        alert("비밀번호는 6글자 이상이어야 합니다.");
	        pw1.value="";
	        pw1.focus();
	        return false;
	    }
		//이름이 공백일때
		if($("#name").val()==""){
			alert("이름을 입력하세요");
			return false;
		}
		//이메일이 공백일때
		if($("#email").val()==""){
			alert("이메일을 입력하세요");
			return false;
		}
		//이메일 양식
		if(!$("#email").val().match(reg_email)){
			alert("이메일을 정확하게 입력하세요");
			$("#email").focus();
			return false;
		}
		$("#frm").submit();
	})//send
	
	//아이디 중복체크 버튼
	$("#idcheckBtn").click(function(){
		window.open("idCheck", "", "width=600 height=500")
	}); //idcheckBtn
	
	//id중복확인 사용버튼
	$("#useBtn").click(function(){
		if($("#userid").val()==""){
			alert("아이디를 입력하세요");
			$("#userid").focus();
			return false;
		}
		$.ajax({
			type: "post",
			url : "idCheck",
			data: {"userid":$("#userid").val()},
			success: function(val){
				if(val.trim()=="yes"){
					alert("사용가능한 아이디");
					$(opener.document).find("#userid").val($("#userid").val());
					self.close();
				}else if(val.trim()=="no"){
					alert("중복된 아이디");
					$("#userid").val("");
				}
			},
			error: function(e){
				alert("error:"+e);
			}
		}); //ajax
	}) //useBtn
	
});//document

 

  • ajax를 이용하여 post방식으로 WMemberIdCheck.java 서블릿으로 이동하고 받아온 값에 따라 alert창을 다르게 띄운다. 사용가능한 아이디일 경우 회원가입 창의 userid칸에 그 값이 담긴다.

 


idCheck.jsp

  • member.js에서 팝업된 화면으로 id입력 칸과 사용여부 버튼이 있다.
  • member.js를 포함하고 있으므로 사용여부 버튼 ("#useBtn")을 누를경우 WMemberIdCheck.java로 이동한다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>
<script src="/Tutoring/js/member.js"></script>

<div class="container">
    <div class="row">
	    <div class="col">
	      <br/>
	      <input type="text" class="form-control" id="userid" placeholder="Enter id" name="userid" >
	    </div>
      	<div class="col align-self-end" >
          <button  type="button"  id="useBtn"  class="btn btn-primary">사용여부</button>
   		</div>
    </div>
</div>

 

 


WMemberIdCheck.java

(아이디 중복확인 체크 서블릿)

package com.wmember.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
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.wmember.model.WMemberDAO;

/**
 * Servlet implementation class MemberIdCheck
 */
@WebServlet("/member/idCheck")
public class WMemberIdCheck extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public WMemberIdCheck() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		RequestDispatcher rd=request.getRequestDispatcher("idCheck.jsp");
		rd.forward(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		String userid=request.getParameter("userid");
		WMemberDAO dao=WMemberDAO.getInstance();
		String flag=dao.idCheck(userid);
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out=response.getWriter();                     
		out.println(flag);
	}
}

 

  • ajax에서 post방식으로 넘어왔으므로 doPost내에서 실행된다. 파라미터 값으로 userid를 받아와서 WMemberDAO.java의 idCheck메소드로 이동한다.
  • flag 값을 받아와서 다시 idCheck.jsp로 이동

 

<WMemberDAO.java의 idCheck메소드>

 

//아이디 중복확인 사용하기 버튼
	public String idCheck(String userid) {
		Connection con=null;
		Statement st=null;
		ResultSet rs=null;
		String flag="yes"; //사용가능
		try {
			con=getConnection();
			String sql="select * from wmember where userid='"+userid+"'";
			st=con.createStatement();
			rs=st.executeQuery(sql);
			if(rs.next()) {
				flag="no"; //사용불가능
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, st, rs);
		}
		return flag;
	}

 


다시 회원가입 join.jsp로 돌아와서.. 버튼 id가 send, form action의 경로는 insert, 방식은 post임을 확인할 수 있다.

 

<form action="insert" method="post" id="frm">
<button  id="send"  class="btn btn-primary">회원가입</button>

 

member.js에서 공백확인 등을 거치고 폼이 submint 되면 insert서블릿으로 이동한다.

 

$("#frm").submit();

 


WMemberInsertAction.java

(앞에서 본 회원가입 서블릿으로 doPost부분만 가져왔다.)

 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		WMemberDAO dao=WMemberDAO.getInstance();
		WMemberDTO member=new WMemberDTO();
		member.setName(request.getParameter("name"));
		member.setUserid(request.getParameter("userid"));
		member.setPwd(request.getParameter("pwd"));
		member.setEmail(request.getParameter("email"));
		member.setPostcode(Integer.parseInt(request.getParameter("sample6_postcode")));
		member.setAddress(request.getParameter("sample6_address"));
		member.setDetailAddress(request.getParameter("sample6_detailAddress"));
		member.setExtraAddress(request.getParameter("sample6_extraAddress"));
		
		dao.memberInsert(member);
		response.sendRedirect("login");
	}

 

 


<WMemberDAO.java의 memberInsert메소드>

 

//회원가입
	public void memberInsert(WMemberDTO vo) {
		Connection con=null;
		PreparedStatement ps=null;
		
		try {
			con=getConnection();
			String sql="INSERT INTO wmember(num, name, userid, pwd, email, address, "
					+ "classnum, reg_date, postcode, detailaddress, extraaddress, admin)"
					+ "VALUES(wmember_seq.nextval,?,?,?,?,?,0,sysdate,?,?,?,0)";
			ps=con.prepareStatement(sql);
			ps.setString(1, vo.getName());
			ps.setString(2, vo.getUserid());
			ps.setString(3, vo.getPwd());
			ps.setString(4, vo.getEmail());
			ps.setString(5, vo.getAddress());
			ps.setInt(6, vo.getPostcode());
			ps.setString(7, vo.getDetailAddress());
			ps.setString(8, vo.getExtraAddress());
			ps.executeUpdate();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			closeConnection(con, ps);
		}
	}

 

 

 


https://github.com/kkj0712/JspProject_Tutoring

 

kkj0712/JspProject_Tutoring

Contribute to kkj0712/JspProject_Tutoring development by creating an account on GitHub.

github.com

 

  • webcontent에 file 이라는 폴더 만들기. upload.jsp 생성

  • cos.jar 라는 라이브러리 파일을 lib 폴더에 넣음. 

  • com.file 패키지 만들고 FileUploadAction.java 서블릿 생성 (경로는 /file/upload.do)

  • WebContent안에 upload폴더를 만들기 (파일 저장 경로)

 

 

  • upload.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>

<form method="post" action="upload.do" enctype="multipart/form-data">

글쓴이: <input type="text" name="name"><br>

제목: <input type="text" name="title"><br>

파일 지정하기: <input type="file" name="uploadFile"><br>

<input type="submit" value="전송">

</form>

</body>

</html>

  • FileUploadAction.java

 

package com.file;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletContext;

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.oreilly.servlet.MultipartRequest;

import com.oreilly.servlet.multipart.DefaultFileRenamePolicy;

/**

 * Servlet implementation class FileUploadAction

 */

@WebServlet("/file/upload.do")

public class FileUploadAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public FileUploadAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        int uploadFileSizeLimit=5*1024*1024; //5mb로 지정

        String encType="UTF-8";

        String savePath="upload";

        ServletContext context=getServletContext();

        String uploadFilePath=context.getRealPath(savePath);

        System.out.println("서버 상의 실제 디렉토리: "+uploadFilePath);

        

        //multipart/form 방식은 request.getParameter로 받아올 수 없음

        MultipartRequest multi=new MultipartRequest(

                request, //request객체

                uploadFilePath, //서버상의 실제 디렉토리

                uploadFileSizeLimit, //최대 업로드 파일 크기

                encType, //인코딩 방법

                new DefaultFileRenamePolicy()); //동일 파일 새이름 부여

        //업로드된 파일이름 구하기

        String fileName=multi.getFilesystemName("uploadFile");

        System.out.println("fileName:"+fileName);

        if(fileName==null) { //파일 업로드 안됨

            System.out.println("파일 업로드 되지 않았음");

        }else {

            response.setContentType("text/html;charset=utf-8");

            PrintWriter out=response.getWriter();

            out.println("<b>글쓴이: "+multi.getParameter("name")+"<br>");

            out.println("<b>제목: "+multi.getParameter("title")+"<br>");

            out.println("<b>파일명: "+fileName);

        }

    }

}

 

 

<완성된 화면>

<로그인 페이지>

 

 

<로그인했을때>

 

 

 

  • Dynamic Web Project로 ServletGuest라는 프로젝트 만들기. Generate web.xml에 체크하기

 

 

  • WebContent에 guestbook이라는 폴더 만들고, insert.jsp 만들기 (폼태그)

  • Java Resources-src-com.guest.model 패키지 만들고 GuestDTO.java 만들기 (getter, setter)

    • Preferences에 getter body가 다음과 같이 설정되어야 함

 

    • num은 정수형 변수이므로 getNum()은 return num;으로만 설정

 

  • WEB-INF 폴더의 lib 폴더안에 jstl-1.2.jar 파일, json-simple-1.1.1.jar파일을 붙여넣는다.

 


 

<데이터베이스>

  • 오라클 SQL 디벨로퍼 열고 scott계정에 guestbook 테이블 생성

 

  • num에 해당하는 시퀀스 생성

 


  • com.guest.model패키지에 GuestDAO.java 만들기 (디비셋팅, 추가, 전체보기, 상세보기 등)

    • 디비셋팅할때 DataSource의 lookup 메소드 인자를 jdbc/guest로 수정

    • 전 프로젝트의 META-INF의 context.xml을 복사해서 현재 프로젝트 META-INF폴더 안에 복사해놓고 name="jdbc/guest"로 수정

 

<GuestDAO.java>

package com.guest.model;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class GuestDAO {

    //디비셋팅

    private static GuestDAO instance=new GuestDAO();

    public static GuestDAO getInstance() {

        return instance;

    }

    private Connection getConnection() throws Exception{

        Context initCtx=new InitialContext();

        Context envCtx=(Context) initCtx.lookup("java:comp/env");

        DataSource ds=(DataSource) envCtx.lookup("jdbc/guest"); //context.xml의 name을 jdbc/guest로 바꾸기

        return ds.getConnection();

    }

    

    //추가

    public void guestInsert(GuestDTO guest) {

        Connection con=null;

        PreparedStatement ps=null;

        

        try {

            con=getConnection();

            String sql="insert into guestbook(num, name, content, grade, created, ipaddr)"

                    + "values (guestbook_seq.nextval,?,?,?,sysdate,?)";

            ps=con.prepareStatement(sql);

            ps.setString(1, guest.getName());

            ps.setString(2, guest.getContent());

            ps.setString(3, guest.getGrade());

            ps.setString(4, guest.getIpaddr());

            ps.executeUpdate();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con,ps);

        }

    }

    

    //전체보기 페이징

    public ArrayList<GuestDTO> guestList(int startRow, int endRow){

        Connection con=null;

        PreparedStatement ps=null;

        ResultSet rs=null;

        ArrayList<GuestDTO> arr=new ArrayList<GuestDTO>();

        

        try {

            con=getConnection();

            StringBuilder sb=new StringBuilder();

            sb.append("select * from");

            sb.append(" (select aa.*, rownum rn from");

            sb.append(" (select * from guestbook order by num desc) aa");

            sb.append(" where rownum<=?) where rn>=?");

            ps=con.prepareStatement(sb.toString());

            ps.setInt(1, endRow);

            ps.setInt(2, startRow);

            rs=ps.executeQuery();

            while(rs.next()) {

                GuestDTO dto=new GuestDTO();

                dto.setNum(rs.getInt("num"));

                dto.setContent(rs.getString("content"));

                dto.setCreated(rs.getString("created"));

                dto.setGrade(rs.getString("grade"));

                dto.setIpaddr(rs.getString("ipaddr"));

                dto.setName(rs.getString("name"));

                arr.add(dto);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, ps, rs);

        }

        return arr;

    }

    

    //검색 전체보기 페이징

    public ArrayList<GuestDTO> guestList(String field, String word, int startRow, int endRow){

        Connection con=null;

        PreparedStatement ps=null;

        ResultSet rs=null;

        ArrayList<GuestDTO> arr=new ArrayList<GuestDTO>();

        

        try {

            con=getConnection();

            StringBuilder sb=new StringBuilder();

            sb.append("select * from");

            sb.append(" (select aa.*, rownum rn from");

            sb.append(" (select * from guestbook where "+field+" like '%"+word+"%'");

            sb.append(" order by num desc) aa");

            sb.append(" where rownum<=?) where rn>=?");

            ps=con.prepareStatement(sb.toString());

            ps.setInt(1, endRow);

            ps.setInt(2, startRow);

            rs=ps.executeQuery();

            while(rs.next()) {

                GuestDTO dto=new GuestDTO();

                dto.setNum(rs.getInt("num"));

                dto.setContent(rs.getString("content"));

                dto.setCreated(rs.getString("created"));

                dto.setGrade(rs.getString("grade"));

                dto.setIpaddr(rs.getString("ipaddr"));

                dto.setName(rs.getString("name"));

                arr.add(dto);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, ps, rs);

        }

        return arr;

    }

    

    

    //전체보기

    public ArrayList<GuestDTO> guestList(){

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        ArrayList<GuestDTO> arr=new ArrayList<GuestDTO>();

        

        try {

            con=getConnection();

            st=con.createStatement();

            String sql="select * from guestbook order by num desc";

            rs=st.executeQuery(sql);

            while(rs.next()) {

                GuestDTO dto=new GuestDTO();

                dto.setNum(rs.getInt("num"));

                dto.setContent(rs.getString("content"));

                dto.setCreated(rs.getString("created"));

                dto.setGrade(rs.getString("grade"));

                dto.setIpaddr(rs.getString("ipaddr"));

                dto.setName(rs.getString("name"));

                arr.add(dto);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return arr;

    }

    

    //상세보기

    public GuestDTO guestView(int num) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        GuestDTO guest=null;

        try {

            con=getConnection();

            st=con.createStatement();

            String sql="select * from guestbook where num="+num;

            rs=st.executeQuery(sql);

            if(rs.next()) {

                guest=new GuestDTO();

                guest.setNum(rs.getInt("num"));

                guest.setContent(rs.getString("content"));

                guest.setCreated(rs.getString("created"));

                guest.setGrade(rs.getString("grade"));

                guest.setIpaddr(rs.getString("ipaddr"));

                guest.setName(rs.getString("name"));

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return guest;

    }

    

    //평가 리스트 개수 출력

    public int guestCount() {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        int count=0;

        

        try {

            con=getConnection();

            String sql="select count(*) from guestbook";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) {

                count=rs.getInt(1);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return count;

    }

    

    //검색 평가 리스트 개수 출력

        public int guestCount(String field, String word) {

            Connection con=null;

            Statement st=null;

            ResultSet rs=null;

            int count=0;

            String sql="";

            try {

                con=getConnection();

                st=con.createStatement();

                if(word.equals("")) {

                    sql="select count(*) from guestbook";

                }else {

                    sql="select count(*) from guestbook where "+field+" like '%"+word+"%'";

                }

                rs=st.executeQuery(sql);

                if(rs.next()) {

                    count=rs.getInt(1);

                }

            } catch (Exception e) {

                e.printStackTrace();

            } finally {

                closeConnection(con, st, rs);

            }

            return count;

        }

    

    //삭제

    public void guestDelete(int num) {

        Connection con=null;

        Statement st=null;

        try {

            con=getConnection();

            String sql="delete from guestbook where num="+num;

            st=con.createStatement();

            st.executeUpdate(sql);

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, null);

        }

    }

        

    //로그인체크 (비밀번호 오류: 2, 회원아님: -1, 관리자: 1, 일반회원: 0)

    public int guestLoginCheck(String userid, String pwd) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        int flag=-1;

        

        try {

            con=getConnection();

            String sql="select pwd, admin from jmember where userid='"+userid+"'";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) { //id 맞음

                if(rs.getString("pwd").equals(pwd)) { //비번 일치

                    flag=rs.getInt("admin");

                }else { //비번 오류

                    flag=2;

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return flag;

    }

    

    //닫기 closeConnection

        private void closeConnection(Connection con, PreparedStatement ps) {

            try {

                if(ps!=null) ps.close();

                if(con!=null) con.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

        private void closeConnection(Connection con, Statement st, ResultSet rs) {

            try {

                if(st!=null) st.close();

                if(con!=null) con.close();

                if(rs!=null) rs.close();

            } catch (SQLException e) {

                e.printStackTrace();

            }

        }

}

 

 


<GuestDTO.java>



package com.guest.model;

public class GuestDTO {

    private int num;

    private String name;

    private String content;

    private String grade;

    private String created;

    private String ipaddr;

    

    public int getNum() {

        return num;

    }

    public void setNum(int num) {

        this.num = num;

    }

    public String getName() {

        return name == null ? "" : name.trim();

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getContent() {

        return content == null ? "" : content.trim();

    }

    public void setContent(String content) {

        this.content = content;

    }

    public String getGrade() {

        return grade == null ? "" : grade.trim();

    }

    public void setGrade(String grade) {

        this.grade = grade;

    }

    public String getCreated() {

        return created == null ? "" : created.trim();

    }

    public void setCreated(String created) {

        this.created = created;

    }

    public String getIpaddr() {

        return ipaddr == null ? "" : ipaddr.trim();

    }

    public void setIpaddr(String ipaddr) {

        this.ipaddr = ipaddr;

    }

}

 


 

<insert.jsp>

  • submit전송 버튼을 누르면 create.gb로 가도록 함.

  • com.guest.action이란 패키지안에 서블릿으로 GuestInsertAction.java 생성하여 액션 실행. (서블릿의 경로는 guestbook/create.gb)

  • com.guest.model에 들어있는 GuestDAO.java파일에서 guestInsert()메소드를 호출하도록 함

  • GuestInsertAction.java에서 guestInsert를 실행하고나면 list.gb로 가도록 함.

  • 이름과 내용에 글자수를 표시하도록 자바스크립트 함수 생성.

  • 상세보기 하게끔 fview() 자바스크립트 함수를 생성. (getJSON 사용. 콜백함수에서 결과 출력) 

  • 검색영역 생성 <form name="search" id="search">

 

 

<insert.jsp+ajax>

  • insert.jsp에서 내용을 입력하면 listResult.jsp로 넘어가지 말고 입력칸 바로 밑에 결과들이 뜨게 하고 싶다면? (댓글쓰기 처럼) ajax 비동기 방식으로 값을 뿌려주면 됨.

 

  • 검색찾기 버튼을 클릭하면 getData()함수를 호출함 (전체보기 함수) 단, 함수 호출 시 페이지 번호, field, word 값을 들고 가야함. getData(페이지 번호, field, word)로 함수 수정하기

  • count 함수도 수정

  • 검색결과의 페이징을 위해 pageUtil에 filed, word 변수 선언. 

  • 검색결과의 페이지가 제대로 안넘어간다? listResult.jsp에서 getData의 변수로 오는 field와 word는 문자열이니까 따옴표 혹은 홑따옴표로 감싸야함.

  • 삭제실행 추가

 

 

<%@ 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>

<meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>

  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>

<script>

$(document).ready(function(){

    getData(1, "", ""); //페이지 로드 시 전체 리스트 보기

    

    $("#btnSearch").on("click", function(){//검색버튼 클릭

        getData(1, $("#field").val(), $("#word").val());

        

    })//btnSearch

    

    $("#send").click(function(){ //전송버튼 클릭

        if(${sessionScope.login==null}){

            alert("로그인 필요");

            return false;

        }

        var name=$("#name").val();

        var content=$("#content").val();

        var grade=$("input:radio[name=grade]:checked").val();

        var postString="name="+name+"&content="+content+"&grade="+grade;

        $.ajax({

            type:   "post",

            url :   "create.gb",

            data:   postString,

            success:function(d){

                $("#result").html(d);

            },

            beforeSend: showRequest, //빈칸 확인

            error: function(e){

                alert("error:"+e);

            }

        })//ajax

    })//send

})//document

//전체보기 함수

function getData(pageNum, field, word){

    $.get("list.gb",

            {"pageNum":pageNum, "field":field, "word":word},

            function(d){

            $("#result").html(d);

    })

}//getData

//빈칸 확인

function showRequest(){

    if($("#name").val()==""){

        alert("이름을 입력하세요");

        $("#name").focus();

        return false;

    }

    if($("#content").val()==""){

        alert("내용을 입력하세요");

        $("#content").focus();

        return false;

    }

    if($("input:radio[name=grade]:checked").length==0){

        alert("평가를 해주세요");

        return false;

    }

    return true;

}//showRequest

//글자수 초과 함수

function textCount(obj,target){ //target: nameCount, contentCount

    var len=$("#"+obj.id).val().length;

    if(obj.size==len){

        alert("글자수 초과");

        return false;

    }

    $("#"+target).text(len);

}//textCount

//상세보기 함수

function fview(num){

    $.getJSON ("view.gb", {"num": num}, function(data){

                var htmlStr="<table align='center' border='1'>";

                    htmlStr+="<tr>";

                    htmlStr+="<th>번호</th>";

                    htmlStr+="<td>"+data.num+"</td>";

                    htmlStr+="</tr>";

                    htmlStr+="<tr>";

                    htmlStr+="<th>글쓴이</th>";

                    htmlStr+="<td>"+data.name+"</td>";

                    htmlStr+="</tr>";

                    htmlStr+="<tr>";

                    htmlStr+="<th>내용</th>";

                    htmlStr+="<td>"+data.content+"</td>";

                    htmlStr+="</tr>";

                    htmlStr+="<tr>";

                    htmlStr+="<th>평가</th>";

                    htmlStr+="<td>"+data.grade+"</td>";

                    htmlStr+="</tr>";

                    htmlStr+="<th>작성일</th>";

                    htmlStr+="<td>"+data.created+"</td>";

                    htmlStr+="</tr>";

                    htmlStr+="<tr>";

                    htmlStr+="<th>ip주소</th>";

                    htmlStr+="<td>"+data.ipaddr+"</td>";

                    htmlStr+="</tr>";

                    htmlStr+="</table>";

                $("#view").html(htmlStr);

            }//콜백함수

    )

} //fview

//삭제 함수

function fdelete(num, name){

    if(confirm("["+name+"]의 게시물을 삭제할까요?")){

        $.get ("delete.gb?num="+num, function(data){

            $("#result").html(data);

        })

    }

}

</script>

</head>

<body>

<c:if test="${sessionScope.login==null}">

    <a href="login.jsp">로그인</a>

</c:if>

<c:if test="${sessionScope.login!=null}">

    ${login}님 반갑습니다.

    <a href="logout.gb">로그아웃</a>

</c:if>

<br/><br/>

<form action="create.gb" method="post">

<table align="center" width=900px>

    <tr>

        <td align="center">글쓴이</td>

        <td>

            <input type="text" size="20" maxlength="20" id="name" name="name" onKeyup="textCount(this,'nameCount')">

            *20글자이내 (<span id="nameCount" style="color:red">0</span>)

        </td>

    </tr>

    <tr>

        <td align="center">내용</td>

        <td>

            <input type="text" size="70" maxlength="70" id="content" name="content" onKeyup="textCount(this,'contentCount')">

            *70글자이내 (<span id="contentCount" style="color:red">0</span>)

        </td>

    </tr>

    <tr>

        <td align="center">평가</td>

        <td>

            <input type="radio" name="grade" value="excellent">아주잘함(excellent)

            <input type="radio" name="grade" value="good">잘함(good)

            <input type="radio" name="grade" value="normal">보통(normal)

            <input type="radio" name="grade" value="fail">노력(fail)

        </td>

    </tr>

    <tr>

        <td colspan="2">

            <input type="submit" value="submit전송">

            <input type="button" value="ajax버튼 전송" id="send">

        </td>

    </tr>

</table>

</form>

<br/><br/>

<div align="center">

<form name="search" id="search">

    <select name="field" id="field">

        <option value="name">이름</option>

        <option value="content">내용</option>

    </select>

    <input type="text" name="word" id="word">

    <input type="button" value="찾기" id="btnSearch">

</form>

</div>

<br/><br/>

<div id="result" align="center"></div>

<hr>

<div id="view"></div>

</body>

</html>

 


<GuestInsertAction.java>

 

package com.guest.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

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.guest.model.GuestDAO;

import com.guest.model.GuestDTO;

/**

 * Servlet implementation class GuestInsertAction

 */

@WebServlet("/guestbook/create.gb")

public class GuestInsertAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public GuestInsertAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd=request.getRequestDispatcher("insert.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        GuestDTO guest=new GuestDTO();

        guest.setName(request.getParameter("name"));

        guest.setContent(request.getParameter("content"));

        guest.setGrade(request.getParameter("grade"));

        guest.setIpaddr(request.getRemoteAddr());

        

        GuestDAO dao=GuestDAO.getInstance();

        dao.guestInsert(guest);

        response.sendRedirect("list.gb");

    }

}




<listResult.jsp>

  • list.gb는 GuestListAction.java 서블릿의 경로인데 여기서 guestList()메소드를 호출.

  • 메소드로 인해 불러온 값들은 listResult.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>

<meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>

  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>

</head>

<body>

<h5>평가 리스트(<span id="cntSpan">${count}</span>)</h5>

<table class="table table-hover">

    <thead>

        <tr>

            <th>번호</th>

            <th>seq</th>

            <th>글쓴이</th>

            <th>평가</th>

            <th>작성일</th>

            <c:if test="${sessionScope.login!=null}">

            <th>삭제</th>

            </c:if>

        </tr>

    </thead>

    <tbody>

        <c:forEach items="${guest}" var="guest" varStatus="st">

        <tr>

            <td>${rowNo-st.index}</td>

            <td>${guest.num}</td>

            <td><a href="javascript:fview(${guest.num})">${guest.name}</a></td>

            <td>${guest.grade}</td>

            <td>${guest.created}</td>

            <c:if test="${sessionScope.login!=null}">

                <td><a href="javascript:fdelete(${guest.num},'${guest.name}')">삭제</a></td>

            </c:if>

        </tr>

        </c:forEach>

    </tbody>

</table>

<div align="center">

    <c:if test="${pu.startPage>pu.pageBlock }"> <!-- 이전 -->

        <a href="javascript:getData(${pu.startPage-pu.pageBlock},'${pu.field}','${pu.word}')">[이전]</a>

    </c:if>

    <c:forEach begin="${pu.startPage}" end="${pu.endPage}" var="i"><!-- 페이지 출력 -->

        <c:if test="${i==pu.currentPage}"> <!-- 현재 페이지 -->

            <c:out value="${i}"/>

        </c:if>

        <c:if test="${i!=pu.currentPage}"> <!-- 현재 페이지 아닌 경우 링크 부여-->

            <a href="javascript:getData(${i},'${pu.field}','${pu.word}')">${i}</a>

        </c:if>

    </c:forEach>

    <c:if test="${pu.endPage<pu.totPage}"> <!-- 다음-->

        <a href="javascript:getData(${pu.endPage+1},'${pu.field}','${pu.word}')">[다음]</a>

    </c:if>

</div>

</body>

</html>

 


<GuestListAction.java>

 

package com.guest.action;

import java.io.IOException;

import java.util.ArrayList;

import javax.servlet.RequestDispatcher;

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.guest.model.GuestDAO;

import com.guest.model.GuestDTO;

import com.guest.model.PageUtil;

/**

 * Servlet implementation class GuestListAction

 */

@WebServlet("/guestbook/list.gb")

public class GuestListAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public GuestListAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        GuestDAO dao=GuestDAO.getInstance();

        

        String pageNum=request.getParameter("pageNum")==null? "1":request.getParameter("pageNum");

        int currentPage=Integer.parseInt(pageNum);

        int pageSize=5;

        int startRow=(currentPage-1)*pageSize+1;

        int endRow=currentPage*pageSize;

                

        int count=0;

        String field=request.getParameter("field")==null?"":request.getParameter("field");

        String word=request.getParameter("word")==null?"":request.getParameter("word");

        count=dao.guestCount(field, word);

        //총페이지 수

        int totPage=(count/pageSize)+(count%pageSize==0?0:1);

        int pageBlock=3;

        int startPage=((currentPage-1)/pageBlock)*pageBlock+1;

        int endPage=startPage+pageBlock-1;

        if(endPage>totPage) endPage=totPage;

        

        PageUtil pu=new PageUtil();

        pu.setCurrentPage(currentPage);

        pu.setEndPage(endPage);

        pu.setPageBlock(pageBlock);

        pu.setStartPage(startPage);

        pu.setTotPage(totPage);

        pu.setField(field);

        pu.setWord(word);

        

        ArrayList<GuestDTO> arr=null;

        if(word.equals("")) {

            arr=dao.guestList(startRow,endRow);

        }else {

            arr=dao.guestList(field, word, startRow,endRow);

        }

        

        

        int rowNo=count-((currentPage-1)*pageSize); //매 페이지의 시작번호

        

        request.setAttribute("rowNo", rowNo);

        request.setAttribute("pu", pu);

        request.setAttribute("guest", arr);

        request.setAttribute("count", count);

        

        RequestDispatcher rd=request.getRequestDispatcher("listResult.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

}


<PageUtil.java>

  • 리스트의 페이지를 나타내고 싶으면? PageUtil.java 파일을 생성하여 페이지 수 표시에 관련된 변수 선언. getter setter.

 

package com.guest.model;

public class PageUtil {

    private int currentPage;

    private int endPage;

    private int startPage;

    private int totPage;

    private int pageBlock;

    private String field;

    private String word;

    

    public String getField() {

        return field == null ? "" : field.trim();

    }

    public void setField(String field) {

        this.field = field;

    }

    public String getWord() {

        return word == null ? "" : word.trim();

    }

    public void setWord(String word) {

        this.word = word;

    }

    public int getCurrentPage() {

        return currentPage;

    }

    public void setCurrentPage(int currentPage) {

        this.currentPage = currentPage;

    }

    public int getEndPage() {

        return endPage;

    }

    public void setEndPage(int endPage) {

        this.endPage = endPage;

    }

    public int getStartPage() {

        return startPage;

    }

    public void setStartPage(int startPage) {

        this.startPage = startPage;

    }

    public int getTotPage() {

        return totPage;

    }

    public void setTotPage(int totPage) {

        this.totPage = totPage;

    }

    public int getPageBlock() {

        return pageBlock;

    }

    public void setPageBlock(int pageBlock) {

        this.pageBlock = pageBlock;

    }

}

 

 


<view.gb>

  • GuestViewAction.java의 경로는 guestbook/view.gb. JSON 형태로 값을 출력

  • GuestDAO.java에서는 guestView()메소드 완성

 

package com.guest.action;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import javax.servlet.RequestDispatcher;

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 org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import com.guest.model.GuestDAO;

import com.guest.model.GuestDTO;

/**

 * Servlet implementation class GuestViewAction

 */

@WebServlet("/guestbook/view.gb")

public class GuestViewAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public GuestViewAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    //void라서 리턴값이 없다. 그래서 JSON형태로 바꿔서 콜백함수를 통해 값을 돌려주는 것

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        int num=Integer.parseInt(request.getParameter("num"));

        GuestDAO dao=GuestDAO.getInstance();

        GuestDTO guest=dao.guestView(num);

        //자바 Object을 JSON형태로 바꿔야 한다..

        JSONObject obj=new JSONObject();

        obj.put("name", guest.getName());

        obj.put("content", guest.getContent());

        obj.put("created", guest.getCreated());

        obj.put("grade", guest.getGrade());

        obj.put("ipaddr", guest.getIpaddr());

        obj.put("num", guest.getNum());

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out=response.getWriter();

        out.println(obj.toString());

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    

    }

}

 


 

<delete.gb>

  • GuestDeleteAction.java의 경로 guestbook/delete.gb. 

  • $.get 함수를 사용하여 insert.jsp에서 delete.gb 호출

  • delete.gb에서 guestDelete()메소드를 부르고 GuestDAO.java에서 메소드 완성

package com.guest.action;

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.guest.model.GuestDAO;

/**

 * Servlet implementation class GuestDeleteAction

 */

@WebServlet("/guestbook/delete.gb")

public class GuestDeleteAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public GuestDeleteAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        int num=Integer.parseInt(request.getParameter("num"));

        GuestDAO dao=GuestDAO.getInstance();

        dao.guestDelete(num);

        response.sendRedirect("list.gb");

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

}


<login.jsp>

  • 로그인 기능 구현. ajax 콜백이 아닌 다른 페이지로 넘어감

  • GuestLoginAction.java의 경로는 guestbook/login.gb.

  • GuestDAO.java에서 guestLoginCheck()메소드 완성 (아이디와 비밀번호가 테이블에 있는지 확인하여 검사)

  • 회원이면 insert.jsp로, 회원이 아니면 다시 login.jsp로 가도록

 

 

  • session 값인 login이 있으면 삭제가 보이도록, session 값인 login이 없으면 삭제가 보이지 않도록 함. (sessionScope.login!=null)

 

<%@ 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>

<form action="login.gb" method="post">

  <label for="userid">ID</label>

  <input type="text" id="userid" name="userid">

  <label for="pwd">PW</label>

  <input type="password" id="pwd" name="pwd">

  <input type="submit" value="로그인">

  <span style="color:red">${errMsg}</span>

</form>

</body>

</html>


<GuestLoginAction.java>

 

package com.guest.action;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;

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 javax.servlet.http.HttpSession;

import com.guest.model.GuestDAO;

/**

 * Servlet implementation class GuestLoginAction

 */

@WebServlet("/guestbook/login.gb")

public class GuestLoginAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public GuestLoginAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd=request.getRequestDispatcher("login.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        String userid=request.getParameter("userid");

        String pwd=request.getParameter("pwd");

        GuestDAO dao=GuestDAO.getInstance();

        int flag=dao.guestLoginCheck(userid, pwd); //jmember테이블 사용

        String path="";

        if(flag==0 || flag==1) {

            HttpSession session=request.getSession();

            session.setAttribute("login", userid);

            path="insert.jsp";

        }else if(flag==-1) { //회원 아님

            request.setAttribute("errMsg", "회원이 아닙니다.");

            path="login.jsp";

        }else if(flag==2) { //비번 오류

            request.setAttribute("errMsg", "비밀번호 오류");

            path="login.jsp";

        }

        RequestDispatcher rd=request.getRequestDispatcher(path);

        rd.forward(request, response);

    }

}

<GuestLogoutAction.java>

 

package com.guest.action;

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 javax.servlet.http.HttpSession;

/**

 * Servlet implementation class GuestLogoutAction

 */

@WebServlet("/guestbook/logout.gb")

public class GuestLogoutAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public GuestLogoutAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpSession session=request.getSession();

        session.invalidate();

        response.sendRedirect("insert.jsp");

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

}

 

 

 

 

  • header.jsp

  • header.jsp에 jstl/core 경로를 taglib으로 잡아준다. (prefix이름을 c로 지정. jstl쓰기 위함)

  • userid 세션에 따라 헤더에 나타나는 메뉴를 다르게 잡아준다.

  • userid 세션이 비어있다면 로그인, 회원가입, 게시판 메뉴가 뜨도록한다.

  • 그게 아니라면(로그인 되어있다면) 로그아웃, 정보변경, 게시판 메뉴가 뜨도록한다.

  • 회원탈퇴 기능도 추가한다. 액션은 MemberDelete.java에서 처리한다.

 

<%@ 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 lang="en">

<head>

  <title>Bootstrap Example</title>

  <meta charset="utf-8">                       

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>

  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>

  <script src="/project01/js/member.js"></script>

</head>

<body>

<nav class="navbar navbar-expand-sm bg-dark navbar-dark">

  <!-- Brand/logo -->

  <a class="navbar-brand" href="#">

    <h3>LOGO</h3>

  </a>

 

  <!-- Links -->

  <ul class="navbar-nav">

  <c:choose>

    <c:when test="${empty sessionScope.userid}">

        <li class="nav-item">

          <a class="nav-link" href="/project01/member/login.me">로그인</a>

        </li>

        <li class="nav-item">

          <a class="nav-link" href="/project01/member/insert.me">회원가입</a>

        </li>

    </c:when>

    <c:otherwise>

        <li class="nav-item">

          <a class="nav-link" href="/project01/member/logout.me">로그아웃</a>

        </li>

        <li class="nav-item">

          <a class="nav-link" href="/project01/member/view.me">정보변경</a>

        </li>

        <li class="nav-item">

          <a class="nav-link" href="/project01/member/delete.me">회원탈퇴</a>

        </li>

    </c:otherwise>

  </c:choose>

        <li class="nav-item">

          <a class="nav-link" href="/project01/board/board.me">게시판</a>

        </li>

  </ul>

 

  <c:if test="${not empty sessionScope.userid}">

    <span class="navbar-text">

     ${sessionScope.userid} 님 반갑습니다.

    </span>

  </c:if>

</nav>

 


 

  • MemberDelete.java: 탈퇴하기 서블릿

 

package com.member.action;

import java.io.IOException;

import java.util.ArrayList;

import javax.servlet.RequestDispatcher;

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 javax.servlet.http.HttpSession;

import com.member.model.MemberDTO;

import com.member.model.SMemberDAOImpl;

/**

 * Servlet implementation class MemberDelete

 */

@WebServlet("/member/delete.me")

public class MemberDelete extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public MemberDelete() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpSession session=request.getSession();

        String userid=(String)session.getAttribute("userid");

        SMemberDAOImpl dao=SMemberDAOImpl.getInstance();

        dao.memberDel(userid);

        session.invalidate();

        response.sendRedirect("login.me");

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    

    }

}




  • list.jsp: 관리자로 로그인 했을때 뜨는 회원리스트. list.jsp가 header.jsp를 포함하고 있으므로 jstl을 사용할 수 있다. 따라서 <c: forEach> 구문으로 회원 리스트를 불러올 수 있다.

  • 회원 리스트는 list액션을 처리하는 MemberList에서 memberList()메소드를 이용하여 ArrayList형식으로 저장되어 있다. 그 ArrayList를 members이름으로 불러온다.

  • <c: forEach items="${members}" var="mem">, ${mem.name}

  • 회원리스트에 삭제할 수 있는 기능을 넣는다. member.js에서 del() 함수로 삭제한다. 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ include file="../include/header.jsp" %>

  <div class="container">

    <br/>

    <h3>회원리스트</h3><br/><br/>

    <table class="table table-hover">

    <thead>

      <tr>

        <th>이름</th>

        <th>아이디</th>

        <th>전화번호</th>

        <th>이메일</th>

        <th>구분</th>

        <th>삭제</th>

      </tr>

    </thead>

    <tbody>

      <c:forEach items="${members}" var="mem">

      <c:if test="${mem.admin==0 }">

        <c:set var="mode" value="일반회원"/>

      </c:if>

      <c:if test="${mem.admin==1 }">

        <c:set var="mode" value="관리자"/>

      </c:if>

        <tr>

            <td>${mem.name}</td>

            <td>${mem.userid}</td>

            <td>${mem.phone}</td>

            <td>${mem.email}</td>

            <c:if test="${mem.admin==0}">

                <td>일반회원</td>

                <td onclick="del('${mem.userid}')">삭제</td>

            </c:if>

            <c:if test="${mem.admin==1}">

                <td>관리자</td>

                <td>Admin</td>

            </c:if>

        </tr>

      </c:forEach>

    </tbody>

  </table>

  </div>

  <script>

  </script>

<%@ include file="../include/footer.jsp" %>


  • UserDelete.java:  회원 삭제 서블릿. 회원 삭제를 하면 자동적으로 회원수도 줄어들도록.

 

package com.member.action;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

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 org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import com.member.model.MemberDTO;

import com.member.model.SMemberDAOImpl;

/**

 * Servlet implementation class UserDelete

 */

@WebServlet("/member/userDelete.me")

public class UserDelete extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public UserDelete() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        String userid=request.getParameter("userid");

        SMemberDAOImpl dao=SMemberDAOImpl.getInstance();

        dao.memberDel(userid); //삭제

        ArrayList<MemberDTO> arr=dao.memberList();

        int count=dao.getCount();

        //JSON 형태로 값을 가져가야함.

        JSONObject mainObj=new JSONObject();

        JSONArray jarr=new JSONArray();

        for(MemberDTO dto:arr) {

            String mode=dto.getAdmin()==1?"관리자":"일반회원";

            JSONObject obj=new JSONObject();

            obj.put("name", dto.getName());

            obj.put("userid", dto.getUserid());

            obj.put("email", dto.getEmail());

            obj.put("phone", dto.getPhone());

            obj.put("mode", mode);

            jarr.add(obj);

        }

        

        JSONObject countObj=new JSONObject();

        countObj.put("count", count);

        

        mainObj.put("root",jarr);

        mainObj.put("rootCount", countObj);

        

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out=response.getWriter();

        out.println(mainObj.toString());

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        doGet(request, response);

    }

}

 


  • MemberList.java: 회원리스트 서블릿

 

package com.member.action;

import java.io.IOException;

import java.util.ArrayList;

import javax.servlet.RequestDispatcher;

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.member.model.MemberDTO;

import com.member.model.SMemberDAOImpl;

/**

 * Servlet implementation class MemberList

 */

@WebServlet("/member/list.me")

public class MemberList extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public MemberList() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        SMemberDAOImpl dao=SMemberDAOImpl.getInstance();

        ArrayList<MemberDTO> arr= dao.memberList();

        request.setAttribute("members", arr);

        

        RequestDispatcher rd=request.getRequestDispatcher("list.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

}


  • view.jsp: 일반회원이 로그인했을때 상세정보를 수정할 수 있는 폼

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ include file="../include/header.jsp" %>

<div class="container">

  <form action="update.me" method="post" id="frm">

    <br/>

    <div class="form-group">

      <label for="id">id:</label>

      <input type="text" name="userid" id="userid" value="${member.userid}" readonly="readonly">

    </div>

    <div class="form-group">

      <label for="name">Name:</label>

      <input type="text" class="form-control" id="name" value="${member.name}" name="name">

    </div>

    <div class="form-group">

      <label for="pwd">Password:</label>

      <input type="password" class="form-control" id="pwd" value="${member.pwd}" name="pwd">

    </div>

    <div class="form-group">

      <label for="email">Email:</label>

      <input type="text" class="form-control" id="email" value="${member.email}" name="email">

    </div>

   

    <div class="form-group">

      <label for="phone">Phone:</label>

      <input type="text" class="form-control" id="phone" value="${member.phone}" name="phone">

    </div>

    <div class="form-check-inline">

        <label class="form-check-label">

        <input type="radio" class="form-check-input" name="admin" value="1">관리자

        </label>

    </div>

    <div class="form-check-inline">

      <label class="form-check-label">

        <input type="radio" class="form-check-input" name="admin"  value="0" checked>일반회원

      </label>

    </div>

    <script>

            if(${member.getAdmin()==0}){

                $("input:radio[value='0']").prop("checked", true);

            }else{

                $("input:radio[value='1']").prop("checked", true);              

            }

    </script>

    <br/>

     <button type="submit"  class="btn btn-primary">수정</button>

</div>

</form>

<%@ include file="../include/footer.jsp" %>




 

  • MemberView.java: 상세보기 서블릿

 

package com.member.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

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 javax.servlet.http.HttpSession;

import com.member.model.MemberDTO;

import com.member.model.SMemberDAOImpl;

/**

 * Servlet implementation class MemberView

 */

@WebServlet("/member/view.me")

public class MemberView extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public MemberView() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpSession session=request.getSession();

        String userid=(String)session.getAttribute("userid");

        SMemberDAOImpl dao=SMemberDAOImpl.getInstance();

        MemberDTO dto=dao.memberView(userid);

        request.setAttribute("member", dto);

        

        RequestDispatcher rd=request.getRequestDispatcher("view.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    

    }

}




 

  • MemberUpdate.java: 회원 상세보기-수정하기 서블릿

 

package com.member.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

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 javax.servlet.http.HttpSession;

import com.member.model.MemberDTO;

import com.member.model.SMemberDAOImpl;

/**

 * Servlet implementation class MemberUpdate

 */

@WebServlet("/member/update.me")

public class MemberUpdate extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public MemberUpdate() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        

        

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        MemberDTO dto=new MemberDTO();

        dto.setAdmin(Integer.parseInt(request.getParameter("admin")));

        dto.setEmail(request.getParameter("email"));

        dto.setName(request.getParameter("name"));

        dto.setPhone(request.getParameter("phone"));

        dto.setPwd(request.getParameter("pwd"));

        dto.setUserid(request.getParameter("userid"));

        SMemberDAOImpl dao=SMemberDAOImpl.getInstance();

        int flag=dao.memberUpdate(dto);

        HttpSession session=request.getSession();

        if(flag==1) {

            session.invalidate();

            response.sendRedirect("login.me");

        }

    }

}




  • MemberLogout.java: 로그아웃 서블릿

 

package com.member.action;

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 javax.servlet.http.HttpSession;

/**

 * Servlet implementation class MemberLogout

 */

@WebServlet("/member/logout.me")

public class MemberLogout extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public MemberLogout() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        HttpSession session=request.getSession();

        session.invalidate();

        response.sendRedirect("login.me");

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

}

 


 

  • member.js: 자바스크립트

 

var exp= /^[0-9]{3}-[0-9]{4}-[0-9]{4}$/;

$(document).ready(function(){

    $("#send").click(function(){

        //아이디가 공백일때

        if($("#userid").val()==""){

            alert("아이디를 입력하세요");

            $("#userid").focus();

            return false;

        }

        //암호가 공백일때

        if($("#pwd").val()==""){

            alert("암호를 입력하세요");

            $("#pwd").focus();

            return false;

        }

        //암호확인이 공백일때

        if($("#pwd_check").val()==""){

            alert("암호확인 필수");

            $("#pwd_check").focus();

            return false;

        }

        //암호 일치확인

        if($("#pwd").val()!=$("#pwd_check").val()){

            alert("암호 불일치");

            $("#pwd_check").focus();

            return false;

        }

        if($("#name").val()==""){

            alert("이름을 입력하세요");

            return false;

        }

        if($("#email").val()==""){

            alert("이메일을 입력하세요");

            return false;

        }

        if($("#phone").val()==""){

            alert("전화번호를 입력하세요");

            return false;

        }

        //전화번호 확인

        if(!$("#phone").val().match(exp)){

            alert("전화번호 입력 양식이 아닙니다.");

            $("#phone").focus();

            return false;

        }

        $("#frm").submit();

    })//send

    

    //아이디 중복체크 버튼

    $("#idcheck").click(function(){

        window.open("idCheck.jsp", "", "width=600 height=500")

    }); //idcheck

});//document

function del(userid){

    if(confirm("정말 삭제할까요?")){

        $.getJSON("userDelete.me?userid="+userid, function(data){

            //alert(data.root.length);

            var htmlStr="";

            $.each(data.root, function(key, val){

                htmlStr+="<tr>";

                htmlStr+="<td>"+val.name+"</td>";

                htmlStr+="<td>"+val.userid+"</td>";

                htmlStr+="<td>"+val.phone+"</td>";

                htmlStr+="<td>"+val.email+"</td>";

                htmlStr+="<td>"+val.mode+"</td>";

                if(val.mode=='일반회원'){

                    htmlStr+="<td onclick=del('"+val.userid+"')>삭제</td>";

                }else{

                    htmlStr+="<td>Admin</td>";

                }

                htmlStr+="</tr>";

            })

            $("table tbody").html(htmlStr);

        })

    }

}


 

  • SMemberDAOImpl.java: 추가 삭제 수정 등 각종 메소드 자바파일

 

package com.member.model;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class SMemberDAOImpl implements MemberDAO{

    

    private static SMemberDAOImpl instance=new SMemberDAOImpl();

    public static SMemberDAOImpl getInstance() {

        return instance;

    }

    private Connection getConnection() throws Exception{

        Context initCtx=new InitialContext();

        Context envCtx=(Context) initCtx.lookup("java:comp/env");

        DataSource ds=(DataSource) envCtx.lookup("jdbc/member"); //context.xml의 name을 jdbc/member로 바꾸기

        return ds.getConnection();

    }

    

    //회원가입

    public void memberInsert(MemberDTO vo) {

        Connection con=null;

        PreparedStatement ps=null;

        

        try {

            con=getConnection();

            String sql="INSERT INTO jmember VALUES(?,?,?,?,?,?)";

            ps=con.prepareStatement(sql);

            ps.setString(1, vo.getUserid());

            ps.setString(2, vo.getName());

            ps.setString(3, vo.getPwd());

            ps.setString(4, vo.getEmail());

            ps.setString(5, vo.getPhone());

            ps.setInt(6, vo.getAdmin());

            ps.executeUpdate();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, ps);

        }

    }

    //회원리스트 보기

    public ArrayList<MemberDTO> memberList() {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        ArrayList<MemberDTO>arr=new ArrayList<MemberDTO>();

        

        try {

            con=getConnection();

            String sql="select * from jmember";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            while(rs.next()) {

                MemberDTO dto=new MemberDTO();

                dto.setAdmin(rs.getInt("admin"));

                dto.setEmail(rs.getString("email"));

                dto.setName(rs.getString("name"));

                dto.setPhone(rs.getString("phone"));

                dto.setPwd(rs.getString("pwd"));

                dto.setUserid(rs.getString("userid"));

                arr.add(dto);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return arr;

    }

    //회원정보 수정

    public int memberUpdate(MemberDTO vo) {

        Connection con=null;

        PreparedStatement ps=null;

        int flag=0;

        try {

            con=getConnection();

            String sql="update jmember set name=?, pwd=?, email=?, phone=?, admin=? where userid=?";

            ps=con.prepareStatement(sql);

            ps.setString(1, vo.getName());

            ps.setString(2, vo.getPwd());

            ps.setString(3, vo.getEmail());

            ps.setString(4, vo.getPhone());

            ps.setInt(5, vo.getAdmin());

            ps.setString(6, vo.getUserid());

            flag=ps.executeUpdate();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, ps);

        }

        return flag;

    }

    

    //회원 상세보기

    public MemberDTO memberView(String userid) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        MemberDTO dto=null;

        try {

            con=getConnection();

            String sql="select * from jmember where userid='"+userid+"'";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) {

                dto=new MemberDTO();

                dto.setAdmin(rs.getInt("admin"));

                dto.setEmail(rs.getString("email"));

                dto.setName(rs.getString("name"));

                dto.setPhone(rs.getString("phone"));

                dto.setPwd(rs.getString("pwd"));

                dto.setUserid(rs.getString("userid"));

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return dto;

    }

    

    //삭제

    public void memberDel(String userid) {

        Connection con=null;

        Statement st=null;

        try {

            con=getConnection();

            String sql="delete from JMEMBER where userid='"+userid+"'";

            st=con.createStatement();

            st.executeUpdate(sql);

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, null);

        }

    }

    

    //아이디 중복확인 사용하기 버튼

    public String idCheck(String userid) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        String flag="yes"; //사용가능

        try {

            con=getConnection();

            String sql="select * from jmember where userid='"+userid+"'";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) {

                flag="no"; //사용불가능

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return flag;

    }

    //로그인체크 (비밀번호 오류: 2, 회원아님: -1, 관리자: 1, 일반회원: 0)

    public int loginCheck(String userid, String pwd) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        int flag=-1;

        try {

            con=getConnection();

            String sql="select pwd, admin from jmember where userid='"+userid+"'";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) { //id 맞음

                if(rs.getString("pwd").equals(pwd)) { //비번 일치

                    flag=rs.getInt("admin");

                }else { //비번 오류

                    flag=2;

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return flag;

    }

    

    //회원수

    public int getCount() {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        int count=0;

        

        try {

            con=getConnection();

            String sql="select count(*) from jmember";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) {

                count=rs.getInt(1);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return count;

    }

    

    //닫기 closeConnection

    private void closeConnection(Connection con, PreparedStatement ps) {

        try {

            if(ps!=null) ps.close();

            if(con!=null) con.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    private void closeConnection(Connection con, Statement st, ResultSet rs) {

        try {

            if(st!=null) st.close();

            if(con!=null) con.close();

            if(rs!=null) rs.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    

}

'Learning > JSP' 카테고리의 다른 글

파일 전송  (0) 2020.08.06
게스트북 (평가리스트) 만들기  (0) 2020.08.06
로그인, 회원가입, 게시판 만들기 1  (0) 2020.07.29
서블릿: 출력경로 통일하기  (0) 2020.07.29
서블릿으로 주소록 만들기  (0) 2020.07.28
  • ServletTest02 (address를 다른방식으로 표현. Controller를 하나로)

 

  • Dynamic Web Project로 ServletTest02 생성. src에 org.address.controller와 org.address.model 패키지 생성. org.address.model패키지에 SAddressDAO.java, SAddressDTO.java, ZipcodeDTO.java 파일 붙여넣기

 

  • WebContent에 detail.jsp, inser.jsp, list.jsp, zipCheck.jsp 붙여넣기

 

  • WebContent-WEB-INF-lib에 json-simple-1.1.1.jar와 jstl-1.2.jar 붙여넣기

 


  1. jsp에 action을 *.ad로 고치기

  1. org.address.controller 패키지에서 CommonController를 만들어서 *.ad로 매핑하기

  2. insert.ad=>AddrInsertAction

  3. list.ad=>AddrListAction

  4. delete.ad=>AddrDeleteAction

  5. Update.ad=>AddrUpdateAction

  6. Search.ad=>AddrSearchAction

  7. Action 인터페이스를 만들기

 

 


 

https://www.w3schools.com/bootstrap4/bootstrap_navs.asp

 

Bootstrap 4 Navs

Bootstrap 4 Navs Nav Menus Link Link Link Disabled If you want to create a simple horizontal menu, add the .nav class to a element, followed by .nav-item for each and add the .nav-link class to their links: Example

 

위 사이트에서 부트스트랩 디자인 사용하기

 


  • 로그인, 회원가입, 게시판 만들기 (Dynamic Web Project로 project01 생성)

 

  • src에는 com.member.action으로 서블릿 객체들 만들기, com.member.model로 DAO(인터페이스), DTO, DAOImpl 자바 클래스 만들기

  • WebContent에는 board, js, include, member 폴더 만들기

    • board 폴더에는 board.jsp (게시판)

    • js 폴더에는 member.js로 자바스크립트 파일 만들기 (New file에서 file 이름을 member.js로 하면 됨)

    • member 폴더에는 idCheck.jsp, join.jsp, list.jsp, login.jsp 파일을 만들기. 각각 폼 태그가 있어서 입력 양식이 됨. 

    • include에는 header와 footer jsp파일들을 만들고 폼 태그에서 그 주소로 찾아가도록 함

  • WEB-INF에 web.xml 파일을 붙여넣고 lib 폴더에 json, jstl 파일 붙여넣기

  • META-INF에 context.xml 파일 붙여넣기


 

  • 실행순서

 

  • header.jsp

  1. 부트스트랩으로 스타일을 지정한다. 

  2. 헤더의 메뉴에는 로그인, 회원가입, 게시판을 만든다.

  3. 로그인 링크는 login.me (로그인 버튼을 눌렀을때는 get방식으로 login.jsp로 넘어가고, 로그인 화면에서 로그인을 실행했을때는 post방식으로 값들을 입력할 수 있다. 회원가입과 게시판도 마찬가지로 get과 post 방식으로 분리하여 처리된다.)

  4. 회원가입 링크는 insert.me

  5. 게시판 링크는 board.me

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html lang="en">

<head>

  <title>Bootstrap Example</title>

  <meta charset="utf-8">

  <meta name="viewport" content="width=device-width, initial-scale=1">

  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">

  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>

  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.min.js"></script>

  <script src="/project01/js/member.js"></script>

</head>

<body>

<nav class="navbar navbar-expand-sm bg-dark navbar-dark">

  <!-- Brand/logo -->

  <a class="navbar-brand" href="#">

    <h3>LOGO</h3>

  </a>

 

  <!-- Links -->

  <ul class="navbar-nav">

    <li class="nav-item">

      <a class="nav-link" href="/project01/member/login.me">로그인</a>

    </li>

    <li class="nav-item">

      <a class="nav-link" href="/project01/member/insert.me">회원가입</a>

    </li>

    <li class="nav-item">

      <a class="nav-link" href="/project01/board/board.me">게시판</a>

    </li>

  </ul>

</nav>

 


 

  • footer.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<footer>

    <div class="jumbotron text-center" style="margin-bottom:0">

      <p>Footer</p>

    </div>

</footer>

</body>

</html>

 


  • join.jsp

  1. 상단에 include file로 header.jsp를 참조한다. 

  2. form action은 insert.me, method 방식은 post, id는 frm으로 선언

  3. 아이디, 패스워드, 이름, 이메일, 전화번호 작성란과 라디오버튼으로 회원종류를 구분한다.

  4. 하단에 include file로 footer.jsp를 참조한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ include file="../include/header.jsp" %>

<div class="container">

  <form action="insert.me" method="post" id="frm">

    <div class="row">

        <div class="col">

          <label for="userid">id:</label>

          <input type="text" class="form-control" id="userid" placeholder="Enter id" name="userid" >

        </div>

        <div class="col align-self-end" >

          <button  type="button"  id="idcheck"  class="btn btn-primary">중복확인</button>

        </div>

    </div>

   

    <div class="form-group">

      <label for="name">Name:</label>

      <input type="text" class="form-control" id="name" placeholder="Enter name" name="name">

    </div>

    <div class="form-group">

      <label for="pwd">Password:</label>

      <input type="password" class="form-control" id="pwd" placeholder="Enter password" name="pwd">

    </div>

   

    <div class="form-group">

      <label for="pwd_check">Password Confirm:</label>

      <input type="password" class="form-control" id="pwd_check" placeholder="Enter password Confirm" name="pwd_check">

    </div>

   

    <div class="form-group">

      <label for="email">Email:</label>

      <input type="text" class="form-control" id="email" placeholder="Enter Eamil" name="email">

    </div>

   

    <div class="form-group">

      <label for="phone">Phone:</label>

      <input type="text" class="form-control" id="phone" placeholder="Enter Phone" name="phone">

    </div>

   

    <div class="form-check-inline">

        <label class="form-check-label">

        <input type="radio" class="form-check-input" name="admin" value="1">관리자

        </label>

    </div>

    

    <div class="form-check-inline">

      <label class="form-check-label">

        <input type="radio" class="form-check-input" name="admin"  value="0" checked>일반회원

      </label>

    </div>

    <br/>

     <button  id="send"  class="btn btn-primary">회원가입</button>

    </form>

    </div>

<%@ include file="../include/footer.jsp" %>


 

  • join.jsp에서 action경로를 insert.me로 처리했기 때문에 그 파일이 필요하다.

  • Controller인 서블릿 MemberInsert.java를 com.member.action에 만들고 WebServlet 경로를 /member/insert.me로 잡아준다.

  • MemberInsert.java

 

package com.member.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

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.member.model.MemberDTO;

import com.member.model.SMemberDAOImpl;

/**

 * Servlet implementation class MemberInsert

 */

@WebServlet("/member/insert.me")

public class MemberInsert extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public MemberInsert() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd=request.getRequestDispatcher("join.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        SMemberDAOImpl dao=SMemberDAOImpl.getInstance();

        MemberDTO member=new MemberDTO();

        member.setAdmin(Integer.parseInt(request.getParameter("admin")));

        member.setEmail(request.getParameter("email"));

        member.setName(request.getParameter("name"));

        member.setPhone(request.getParameter("phone"));

        member.setPwd(request.getParameter("pwd"));

        member.setUserid(request.getParameter("userid"));

        dao.memberInsert(member);

        response.sendRedirect("login.me");

    }

}

 


 

  • member.js: 자바스크립트 파일

 

var exp= /^[0-9]{3}-[0-9]{4}-[0-9]{4}$/;

$(document).ready(function(){

    $("#send").click(function(){

        //아이디가 공백일때

        if($("#userid").val()==""){

            alert("아이디를 입력하세요");

            $("#userid").focus();

            return false;

        }

        //암호가 공백일때

        if($("#pwd").val()==""){

            alert("암호를 입력하세요");

            $("#pwd").focus();

            return false;

        }

        //암호확인이 공백일때

        if($("#pwd_check").val()==""){

            alert("암호확인 필수");

            $("#pwd_check").focus();

            return false;

        }

        //암호 일치확인

        if($("#pwd").val()!=$("#pwd_check").val()){

            alert("암호 불일치");

            $("#pwd_check").focus();

            return false;

        }

        if($("#name").val()==""){

            alert("이름을 입력하세요");

            return false;

        }

        if($("#email").val()==""){

            alert("이메일을 입력하세요");

            return false;

        }

        if($("#phone").val()==""){

            alert("전화번호를 입력하세요");

            return false;

        }

        //전화번호 확인

        if(!$("#phone").val().match(exp)){

            alert("전화번호 입력 양식이 아닙니다.");

            $("#phone").focus();

            return false;

        }

        $("#frm").submit();

    })//send

    

    //아이디 중복체크 버튼

    $("#idcheck").click(function(){

        window.open("idCheck.jsp", "", "width=600 height=500")

    }); //idcheck

    

    

});//document

 


 

  • login.jsp

  1. header.jsp와 footer.jsp파일을 include로 불러준다.

  2. 하단에 script태그를 쓰고 아이디와 암호 공백시 경고창을 띄우도록 해준다.

  3. ajax으로 login.me(post방식) url 연결하여 아이디와 비밀번호 대조하고 로그인하도록 처리한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ include file="../include/header.jsp" %>

  <div class="container">

 

  <form action="login.me" method="post" id="loginFrm">

    <div class="form-group">

      <label for="userid">id:</label>

      <input type="text" class="form-control" id="userid" placeholder="Enter id" name="userid">

    </div>

    <div class="form-group">

      <label for="pwd">Password:</label>

      <input type="password" class="form-control" id="pwd" placeholder="Enter password" name="pwd">

    </div>

    <div class="form-group form-check">

      <label class="form-check-label">

        <input class="form-check-input" type="checkbox" name="remember"> Remember me

      </label>

    </div>

    <button type="button" id="loginBtn" class="btn btn-primary">로그인</button>

  </form>

</div>

<script>

$("#loginBtn").click(function(){

    if($("#userid").val()==""){

        alert("아이디를 입력하세요");

        $("#userid").focus();

        return false;

    }

    if($("#pwd").val()==""){

        alert("암호를 입력하세요");

        $("#pwd").focus();

        return false;

    }

    $.ajax({

        type : "post",

        url  : "login.me",

        data : {"userid":$("#userid").val(), "pwd":$("#pwd").val()},

        success : function(value){

            switch(value.trim()){

            case "0" : alert("로그인 성공"); location.href="view.me"; break;

            case "1" : alert("관리자 로그인"); location.href="list.me"; break;

            case "2" : alert("비밀번호 오류"); break;

            case "-1": alert("회원이 아닙니다"); location.href="insert.me"; break;

            default: alert(value.trim());

            }

        },

        error: function(e){

            alert("error:"+e);

        }

    })

})//loginBtn

</script>

<%@ include file="../include/footer.jsp" %>


  • board.jsp: 아직 내용이 없음

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ include file="../include/header.jsp" %>

<div class="container-fluid">

  <h3>게시판</h3>

</div>

<%@ include file="../include/footer.jsp" %>

 


 

  • login.jsp의 form action을 login.me로 했기 때문에 그 파일이 필요하다. 마찬가지로 Controller인 서블릿 MemberLogin.java를 생성하고 경로를 /member/login.me로 잡아준다.

  • MemberLogin.java

 

package com.member.action;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;

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 javax.servlet.http.HttpSession;

import com.member.model.SMemberDAOImpl;

/**

 * Servlet implementation class MemberLogin

 */

@WebServlet("/member/login.me")

public class MemberLogin extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public MemberLogin() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd=request.getRequestDispatcher("login.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        String userid=request.getParameter("userid");

        String pwd=request.getParameter("pwd");

        SMemberDAOImpl dao=SMemberDAOImpl.getInstance();

        int flag=dao.loginCheck(userid, pwd);

        if(flag==0 || flag==1) {

            HttpSession session=request.getSession();

            session.setAttribute("userid", userid);

        }

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out = response.getWriter();

        out.println(flag);

    }

}

 


 

  • SMemberDAOImpl.java

 

package com.member.model;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class SMemberDAOImpl implements MemberDAO{

    

    private static SMemberDAOImpl instance=new SMemberDAOImpl();

    public static SMemberDAOImpl getInstance() {

        return instance;

    }

    private Connection getConnection() throws Exception{

        Context initCtx=new InitialContext();

        Context envCtx=(Context) initCtx.lookup("java:comp/env");

        DataSource ds=(DataSource) envCtx.lookup("jdbc/member"); //context.xml의 name을 jdbc/member로 바꾸기

        return ds.getConnection();

    }

    

    //회원가입

    public void memberInsert(MemberDTO vo) {

        Connection con=null;

        PreparedStatement ps=null;

        

        try {

            con=getConnection();

            String sql="INSERT INTO jmember VALUES(?,?,?,?,?,?)";

            ps=con.prepareStatement(sql);

            ps.setString(1, vo.getUserid());

            ps.setString(2, vo.getName());

            ps.setString(3, vo.getPwd());

            ps.setString(4, vo.getEmail());

            ps.setString(5, vo.getPhone());

            ps.setInt(6, vo.getAdmin());

            ps.executeUpdate();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, ps);

        }

    }

    @Override

    public ArrayList<MemberDTO> memberList() {

        // TODO Auto-generated method stub

        return null;

    }

    @Override

    public int memberUpdate(MemberDTO vo) {

        // TODO Auto-generated method stub

        return 0;

    }

    @Override

    public MemberDTO memberView(String userid) {

        // TODO Auto-generated method stub

        return null;

    }

    @Override

    public void memberDel(String userid) {

        // TODO Auto-generated method stub

        

    }

    @Override

    public String idCheck(String userid) {

        // TODO Auto-generated method stub

        return null;

    }

    //로그인체크 (비밀번호 오류: 2, 회원아님: -1, 관리자: 1, 일반회원: 0)

    public int loginCheck(String userid, String pwd) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        int flag=-1;

        try {

            con=getConnection();

            String sql="select pwd, admin from jmember where userid='"+userid+"'";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) { //id 맞음

                if(rs.getString("pwd").equals(pwd)) { //비번 일치

                    flag=rs.getInt("admin");

                }else { //비번 오류

                    flag=2;

                }

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return flag;

    }

    

    @Override

    public int memberCount() {

        // TODO Auto-generated method stub

        return 0;

    }

    

    //닫기 closeConnection

    private void closeConnection(Connection con, PreparedStatement ps) {

        try {

            if(ps!=null) ps.close();

            if(con!=null) con.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    private void closeConnection(Connection con, Statement st, ResultSet rs) {

        try {

            if(st!=null) st.close();

            if(con!=null) con.close();

            if(rs!=null) rs.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    

}


 

  • MemberDTO.java: 객체생성 자바 빈즈

 

package com.member.model;

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 == null ? "" : name.trim();

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getUserid() {

        return userid == null ? "" : userid.trim();

    }

    public void setUserid(String userid) {

        this.userid = userid;

    }

    public String getPwd() {

        return pwd == null ? "" : pwd.trim();

    }

    public void setPwd(String pwd) {

        this.pwd = pwd;

    }

    public String getEmail() {

        return email == null ? "" : email.trim();

    }

    public void setEmail(String email) {

        this.email = email;

    }

    public String getPhone() {

        return phone == null ? "" : phone.trim();

    }

    public void setPhone(String phone) {

        this.phone = phone;

    }

    public void setAdmin(int admin) {

        this.admin = admin;

    }

    public int getAdmin() {

        return admin;

    }

}


 

 

  • MemberDAO.java: 인터페이스 파일

 

package com.member.model;

import java.util.ArrayList;

public interface MemberDAO {

    //CRUD(create read update delete)라고 함

    //추가 (MemberVO 형의 vo 객체를 추가)

    public void memberInsert(MemberDTO vo);

    //전체보기 (전체리스트를 보려면? select에 들어가는 값 MemberVO 형의 ArrayList를 본다.)

    public ArrayList<MemberDTO>memberList();

    //수정

    public int memberUpdate(MemberDTO vo);

    //상세보기 (하나를 보려면? return값이 있다는 뜻. MemberVO형)

    public MemberDTO memberView(String userid);

    //삭제

    public void memberDel(String userid);

    //아이디 중복 체크 (리턴값은 userid)

    public String idCheck(String userid);

    //로그인 체크 (리턴값은 flag)

    public int loginCheck(String userid, String pwd);

    //전체회원 수

    public int memberCount();

}

 

'Learning > JSP' 카테고리의 다른 글

게스트북 (평가리스트) 만들기  (0) 2020.08.06
로그인, 회원가입, 게시판 만들기 2  (0) 2020.07.30
서블릿: 출력경로 통일하기  (0) 2020.07.29
서블릿으로 주소록 만들기  (0) 2020.07.28
JSTL  (0) 2020.07.27
  • New Dynamic Web Project 만들기: 이름은 ServletTest01

  • Generate web.xml deployment descriptor에 체크

 

 

  • FirstServlet에서 adder2.jsp, bbs.jsp, personForm2.jsp, personResult2.jsp를 복사해서 ServletTest01의 WebContent에 붙여넣기. lib폴더에 jstl-1.2.jar도 붙여넣기

 


 

  • adder2.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>

<form action="adder.go">

첫번째 수 : <input type="text" name="num1"><br>

두번째 수 : <input type="text" name="num2"><br>

<input type="submit" value="더하기">

</form>

</body>

</html>

 


  • bbs.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>

<form action="bbs.go" method="post">

이름 : <input type="text" name="name"><br>

제목 : <input type="text" name="title"><br>

내용 : <br>

<textarea rows="5" cols="20" name="content"></textarea><br>

<input type="submit" value="전송">

</form>

</body>

</html>

 


 

  • personForm2.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>

<h2>개인 정보 입력</h2>

<form action="person2.go" method="post">

이름: <input type="text" name="name"><br>

아이디: <input type="text" name="id"><br>

패스워드 : <input type="password" name="password"><br>

성별:

 <label for="man"></label>

 <input type="radio" name="gender" id="man"  value="남" checked ><input type="radio" name="gender" value="여"><br>

메일수신여부:

<input type="checkbox" name="notice" value="공지메일">공지메일

<input type="checkbox" name="notice" value="광고메일">광고메일

<input type="checkbox" name="notice" value="배송확인메일">배송확인메일<br><br>

직업:

<select name="job">

  <option value="회사원">회사원

  <option value="학생">학생

   <option value="기타">기타

</select><br><br>

<input type="submit" value="확인">

<input type="reset"  value="취소">

</form>

</body>

</html>

 


 

  • personResult2.jsp: jstl경로 처리

 

<%@ 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>

이름11 : ${p.name }<br>

아이디11 : ${p.id }<br>

성별11 : ${p.gender }<br>

직업11 : ${p.job }<br>

메일11 :

<c:forEach items="${p. notice}" var="mail">

  ${mail }

</c:forEach><br>

${msg }

</body>

</html>

 


  • adder2.jsp와 bbs.jsp, personForm2.jsp에서 form action의 경로를 전부 .go로 끝나도록 수정한다.

 

 

 

 


  • Java Resources에 src폴더 안에 org.controller와 org.model 패키지 만들기.

  • org.model안에 Person.java 파일 붙여넣기

 

  • Person.java

 

package org.model;

public class Person {

    private String name;

    private String id;

    private String paswword;

    private String job;

    private String[] notice;

    private String gender;

   

 

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getId() {

        return id;

    }

    public void setId(String id) {

        this.id = id;

    }

    public String getPaswword() {

        return paswword;

    }

    public void setPaswword(String paswword) {

        this.paswword = paswword;

    }

    public String getJob() {

        return job;

    }

    public void setJob(String job) {

        this.job = job;

    }

    public String[] getNotice() {

        return notice;

    }

    public void setNotice(String[] notice) {

        this.notice = notice;

    }

    public String getGender() {

        return gender;

    }

    public void setGender(String gender) {

        this.gender = gender;

    }

   

   

}

 


  • web.xml에 display name, servlet name,  servlet class, servlet mapping, url pattern 지정. servlet name을 doController라 선언. servlet class 경로를 CommonController로 지정. .go로 끝나는 파일들은 모두 이 web.xml을 거친다.

 

 


  • org.controller 패키지에 CommonController.java 클래스 파일 생성하기. HttpServlet을 extends해주고 doGet, doPost 오버라이딩하기. doGet에는 doPost(req,resp)을 써서 doPost로 가도록 경로를 잡아준다. 

  • if else문으로 adder2, bbs, person2 jsp 파일들의 출력 경로를 잡아준다.

 

package org.controller;

import java.io.IOException;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class CommonController extends HttpServlet{

    @Override

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        doPost(req, resp);

    }

    

    @Override

    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        String requestURI=req.getRequestURI();

        String contextPath=req.getContextPath();

        String command=requestURI.substring(contextPath.length());

//      System.out.println("requestURI:"+requestURI);

//      System.out.println("command:"+command);

        if(command.equals("/adder.go")) {

            new AdderServlet().execute(req,resp);

        }else if(command.equals("/bbs.go")){

            new BbsServlet().execute(req,resp);

        }else if(command.equals("/person2.go")) {

            new PersonServlet().execute(req,resp);

        }

        

    }

}


 

 

  • org.controller에서 Action.java라는 인터페이스를 만든다. execute라는 메소드를 만든다. execute의 인자에는 req, resp가 들어가고 throws로 예외처리를 해준다. (CommonController의  인자와 예외처리 복사해서 붙여줌) CommonController를 거치는 jsp 파일들이 doGet으로 갈지 doPost로 갈지 모르기 때문에 execute 메소드를 대신 부르는 것이다.

  • Action.java

package org.controller;

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 req, HttpServletResponse resp) throws ServletException, IOException;

}

 


 

  • Action.java 인터페이스 파일을 상속받는 AdderServlet.java파일을 생성한다. implements로 Action 상속받고 execute메소드를 오버라이딩한다.

  • AdderServlet.java

package org.controller;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class AdderServlet implements Action{

    @Override

    public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

          req.setCharacterEncoding("utf-8");

          int num1 = Integer.parseInt(req.getParameter("num1"));

          int num2= Integer.parseInt(req.getParameter("num2"));

          int sum = num1+num2;

         

          resp.setContentType("text/html;charset=utf-8");

          PrintWriter out = resp.getWriter();

          out.println("<html>");

          out.println("<head><title>결과</title></head>");

          out.println("<body>");

          out.println("<body>");

          out.println("덧셈결과 :" + sum);

          out.println("</body>");

          out.println("</html>");

    }

}


 

  • bbs.jsp를 실행했을때 결과값을 얻기 위해서 위와 마찬가지로 BbsServlet.java파일을 생성한다. implements로 Action을 상속받고 execute메소드를 오버라이딩한다.

  • BbsServlet.java

 

package org.controller;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class BbsServlet  implements Action{

    @Override

    public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

          req.setCharacterEncoding("utf-8");

          String name = req.getParameter("name");

          String title = req.getParameter("title");

          String content = req.getParameter("content");

         

          resp.setContentType("text/html;charset=utf-8");

          PrintWriter out = resp.getWriter();

          out.println("<html>");

          out.println("<head><title>결과</title></head>");

          out.println("<body>");

          out.println("이름:" + name+"<br>");

          out.println("제목:" + title+"<br>");

          out.println("내용:" + content+"<br>");

          out.println("</body>");

          out.println("</html>");

    }

}


 

 

  • personForm2.jsp도 마찬가지로 결과값을 얻기 위해 PersonServlet.java를 만들고 implements로 Action을 상속받고 execute메소드를 오버라이딩한다.

  • PersonServlet.java

 

package org.controller;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.model.Person;

public class PersonServlet  implements Action{

    @Override

    public void execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

          req.setCharacterEncoding("utf-8");

          String name = req.getParameter("name");

          String id = req.getParameter("id");

          String gender = req.getParameter("gender");

          String[] notice = req.getParameterValues("notice");

          String job = req.getParameter("job");

         

          Person person = new Person();

          person.setGender(gender);

          person.setId(id);

          person.setJob(job);

          person.setName(name);

          person.setNotice(notice);

          

          req.setAttribute("p", person);

          RequestDispatcher rd = req.getRequestDispatcher("personResult2.jsp");

          rd.forward(req, resp);        

    }

}

 


  • web.xml에서 servlet처리 부분을 주석처리 한다면? CommonController랑 연결이 안됨. 이걸 대신할 수 있는 어노테이션은? CommonController.java에서 WebServlet을 어노테이션하고 ("*.go")을 부르면 됨

 

 

 

'Learning > JSP' 카테고리의 다른 글

로그인, 회원가입, 게시판 만들기 2  (0) 2020.07.30
로그인, 회원가입, 게시판 만들기 1  (0) 2020.07.29
서블릿으로 주소록 만들기  (0) 2020.07.28
JSTL  (0) 2020.07.27
서블릿  (0) 2020.07.27

 

  • 톰캣이 안잡힐때.. 해당 작업중인 Project 마우스 우클릭 properties에서 java build path에서 jre remove 후 add library해서 다시 넣어줌

 

 

 

 

 

 


 

  • insert.jsp: 주소록 입력 폼

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

<script>

$(document).ready(function(){

    $("#zipBtn").on("click",function(){

        window.open("zip.do","","width=700 height=400");

    })

})

</script>

</head>

<body>

<a href="list.do">전체보기</a>

<form action="insert.do" method="post" name="frm">

<table>

        <tr>

                <td colspan="2">주소록 등록하기</td>

        </tr>

        <tr>

                <td>이름</td>

                <td><input type="text" name="name"></td>

        </tr>

        <tr>

                <td>우편번호</td>

                <td><input type="text" name="zipcode" id="zipcode" size=7>

                        <input type="button" value="검색" id="zipBtn">

                </td>

        </tr>

        <tr>

                <td>주소</td>

                <td><input type="text" name="addr" id="addr" size=50></td>

        </tr>

        <tr>

                <td>전화번호</td>

                <td><input type="text" name="tel"></td>

        </tr>

        <tr>

        <td colspan="2">

                <input type="submit" value="등록">

                <input type="reset" value="취소">

        </td>

        </tr>

</table>

</form>

</body>

</html>


  • InsertAction.java: 주소록 등록 관련 서블릿

package com.address.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

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.address.model.SAddressDAO;

import com.address.model.SAddressDTO;

/**

 * Servlet implementation class InsertAction

 */

@WebServlet("/address/insert.do")

public class InsertAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public InsertAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        RequestDispatcher rd=request.getRequestDispatcher("insert.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        SAddressDTO dto = new SAddressDTO();

        dto.setAddr(request.getParameter("addr"));

        dto.setName(request.getParameter("name"));

        dto.setTel(request.getParameter("tel"));

        dto.setZipcode(request.getParameter("zipcode"));

        SAddressDAO dao = SAddressDAO.getInstance();

        dao.insertAddress(dto);

        response.sendRedirect("list.do");

    }

}

 


 

  • list.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>

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

</head>

<body>

<table>

<div align="right">

    <a href="insert.do">회원등록 </a>/주소록 개수: <span id="cntSpan">${count}</span>

</div>

    <thead>

        <tr>

            <td>번호</td>

            <td>이름</td>

            <td>주소</td>

            <td>전화번호</td>

        </tr>

    </thead>

    <tbody>

    <c:forEach items="${listArr}" var="address">

        <tr>

            <td>${address.num}</td>

            <td><a href="detail.do?num=${address.num}">${address.name }</a></td>

            <td>${address.addr}</td>

            <td>${address.tel}</td>

        </tr>

    </c:forEach>

    </tbody>

</table>

    <select name="field" id="field">

    <option value="name">이름</option>

    <option value="tel">전화</option>

    </select>

    <input type="text" name="word" id="word">

    <input type="button" value="검색" id="searchBtn">

    <script type="text/javascript">

        $("#searchBtn").click(function(){

            if($("#word").val()==""){

                alert("검색어를 입력하세요");

                $("#word").focus();

                return false;

            }

            $.getJSON("search.do",

                    {"field":$("#field").val(),

                     "word":$("#word").val()},

                    function(data){

                        var htmlStr="";

                        $.each(data.searchArr,function(key,val){

                            htmlStr+="<tr>";

                            htmlStr+="<td>"+val.num+"</td>";

                            htmlStr+="<td>"+val.name+"</td>";

                            htmlStr+="<td>"+val.addr+"</td>";

                            htmlStr+="<td>"+val.tel+"</td>";

                            htmlStr+="</tr>"

                        })//each

                        $("table tbody").html(htmlStr);

                        $("#cntSpan").text(data.searchCount.scount);

                    }//콜백함수

            )//getJSON

        })//searchBtn

    </script>

</body>

</html>

 


 

  • ListAction.java: 전체보기 서블릿 (list.jsp가 아니라 이 파일을 실행해야 함)

 

package com.address.action;

import java.io.IOException;

import java.util.ArrayList;

import javax.servlet.RequestDispatcher;

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.address.model.SAddressDAO;

import com.address.model.SAddressDTO;

/**

 * Servlet implementation class ListAction

 */

@WebServlet("/address/list.do")

public class ListAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public ListAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        SAddressDAO dao = SAddressDAO.getInstance();

        int count=dao.getCount();

        ArrayList<SAddressDTO> arr =dao.addressList();

        request.setAttribute("listArr", arr);

        request.setAttribute("count", count);

        

        RequestDispatcher rd = request.getRequestDispatcher("list.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        doGet(request, response);

    }

}

 

 


 

  • detail.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>

<form action="update.do" method="post" name="frm">

<input type="hidden" name="num" value="${dto.num}">

<table>

    <tr>

        <td colspan="2">주소록 수정하기</td>

    </tr>

    <tr>

        <td>이름</td>

        <td><input type="text" name="name"

        value="${dto.name}"></td>

    </tr>

    <tr>

        <td>우편번호 </td>

        <td><input type="text" name="zipcode" size=10

        value="${dto.zipcode}">

        <input type="button" name="search" value="검색" onclick="zipfinder()"></td>

    <tr>

        <td>주소

        <td><input type="text" name="addr" size=30

        value="${dto.addr}"></td>

    </tr>

    <tr>

        <td>전화번호</td>

        <td><input type="text" name="tel"

        value="${dto.tel}"></td>

    </tr>

    <tr>

        <td colspan="2">

        <input type="submit" value="수정" onclick="location.href='update.do?num=${dto.num}'">

        <input type="button" value="삭제" onclick="location.href='delete.do?num=${dto.num}'"> <!-- del()이라는 함수를 부른다. -->

        <input type="reset" value="취소">

        </td>

    </tr>

</table>

</form>

</body>

</html>

 


 

  • DetailAction.java 만들기: 패키지 우클릭-New-Servlet

 

 

  • DeatilAction - Next>

 

 

  • Edit... 클릭

 

 

  • url mappings를 /address/detail.do 로 설정. detail.do는 어디서 나온 것이냐? 

  • list.jsp에서 name에 링크를 걸고 클릭했을때 넘어가는 경로 이름.

 

 

 

  • 다시 Servlet 만드는 창으로 와서.. doPost, doGet등 만들기 원하는 부분에 체크

 

 

  • DetailAction.java에 자동으로 불러온 모습

 

package com.address.action;

import java.io.IOException;

import java.util.ArrayList;

import javax.servlet.RequestDispatcher;

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.address.model.SAddressDAO;

import com.address.model.SAddressDTO;

/**

 * Servlet implementation class DetailAction

 */

@WebServlet("/address/detail.do")

public class DetailAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public DetailAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        int num=Integer.parseInt(request.getParameter("num"));

        SAddressDAO dao = SAddressDAO.getInstance();

        SAddressDTO dto = dao.addressDetail(num);

        request.setAttribute("dto", dto);

        RequestDispatcher rd=request.getRequestDispatcher("detail.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        doGet(request, response);

    }

}

 

 


 

  • 같은 방식으로 DeleteAction.java를 서블릿으로 생성. url mappings는 /address/delte.do

 

package com.address.action;

import java.io.IOException;

import javax.servlet.RequestDispatcher;

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.address.model.SAddressDAO;

/**

 * Servlet implementation class DeleteAction

 */

@WebServlet("/address/delete.do")

public class DeleteAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public DeleteAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        int num=Integer.parseInt(request.getParameter("num"));

        SAddressDAO dao=SAddressDAO.getInstance();

        dao.addressDelete(num);

        response.sendRedirect("list.do");

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        doGet(request, response);

    }

}

  • 메소드: SAddressDAO의 addressDelete(num)

  • list.do를 호출하여 list.jsp로 

 


 

  • UpdateAction.java 서블릿 생성. url mappings는 /address/update.do

 

package com.address.action;

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.address.model.SAddressDAO;

import com.address.model.SAddressDTO;

/**

 * Servlet implementation class UpdateAction

 */

@WebServlet("/address/update.do")

public class UpdateAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public UpdateAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        SAddressDTO dto=new SAddressDTO();

        dto.setNum(Integer.parseInt(request.getParameter("num")));

        dto.setAddr(request.getParameter("addr"));

        dto.setName(request.getParameter("name"));

        dto.setTel(request.getParameter("tel"));

        dto.setZipcode(request.getParameter("zipcode"));

        

        SAddressDAO dao=SAddressDAO.getInstance();

        dao.addressUpdate(dto);

        response.sendRedirect("list.do");

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        doGet(request, response);

    }

}

 

 

  • 메소드: SAddressDAO의 addressUpdate(SAddressDTO dto)

 


 

  • 우편번호 검색하기. insert.jsp에 우편번호 검색 버튼에 id="zipBtn". 상단에 자바스크립트 불러오고 zipBtn을 눌렀을때 window.open으로 zip.do 불러오도록 하기

  • 서블릿으로 ZipAction.java 생성. url mappings는 /address/zip.do

 

package com.address.action;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

import javax.servlet.RequestDispatcher;

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 org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import com.address.model.SAddressDAO;

import com.address.model.ZipcodeDTO;

/**

 * Servlet implementation class ZipAction

 */

@WebServlet("/address/zip.do")

public class ZipAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public ZipAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

//      response.sendRedirect("zipCheck.jsp");

        RequestDispatcher rd=request.getRequestDispatcher("zipCheck.jsp");

        rd.forward(request, response);

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");

        String dong=request.getParameter("dong");

        SAddressDAO dao=SAddressDAO.getInstance();

        ArrayList<ZipcodeDTO>arr=dao.zipSearch(dong);

        

        JSONObject mainObj=new JSONObject();

        JSONArray jarr=new JSONArray();

        

        for (ZipcodeDTO zip:arr) {

            JSONObject obj=new JSONObject();

            obj.put("zipcode", zip.getZipcode());

            obj.put("sido", zip.getSido());

            obj.put("gugun", zip.getGugun());

            obj.put("dong",zip.getDong());

            obj.put("bunji",zip.getBunji());

            jarr.add(obj);

        }

        mainObj.put("jarr",jarr);

        response.setContentType("text/html;charset=utf-8");

        PrintWriter out=response.getWriter();

        out.println(mainObj.toString());

    }

}

 

  • doGet에서 zipCheck.jsp를 디스패처로 호출

  • zipCheck.jsp: 검색 버튼 id는 send라 명명. 제이슨 형식으로 zip.do 부르기

 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

<script>

$(document).ready(function(){

    $("#send").click(function(){

        if($("#dong").val()==""){

            alert("동이름을 입력하세요");

            $("#dong").focus();

            return false;

        }

        $.post("zip.do",{"dong":$("#dong").val()},

            function(data){

                data=JSON.parse(data); //파싱

                var htmlStr="";

                htmlStr+="<table>";

                for(var i=0;i<data.jarr.length;i++){

                    htmlStr+="<tr>";

                    htmlStr+="<td>"+data.jarr[i].zipcode+"</td>";

                    htmlStr+="<td>"+data.jarr[i].sido+"</td>";

                    htmlStr+="<td>"+data.jarr[i].gugun+"</td>";

                    htmlStr+="<td>"+data.jarr[i].dong+"</td>";

                    htmlStr+="<td>"+data.jarr[i].bunji+"</td>";

                    htmlStr+="</tr>";

                }

                htmlStr+="</table>";

                $("#area").html(htmlStr);

            }   

        );//post

    }) //send

    

    $("#area").on("click","tr",function(){

        var address = $("td:eq(1)",this).text()+" " +

                      $("td:eq(2)",this).text()+" " +

                      $("td:eq(3)",this).text()+" " +

                      $("td:eq(4)",this).text();

        $(opener.document).find("#zipcode").val($("td:eq(0)",this).text());

        $(opener.document).find("#addr").val(address);

        self.close();

    }); //area

    

}) //document

</script>

</head>

<body>

<table>

    <tr>

        <td> 동이름입력: <input type="text" name="dong" id="dong">

        <input type="button" value="검색" id="send">

        </td>

    </tr>

</table>

<div id="area"></div>

</body>

</html>

 

  • 메소드: SAddressDAO의 zipSearch


  • 주소 bunji 부분에 null 값이 나오는게 싫다면

  • 이클립스 메뉴 window-preference-java-code style-code templates-getter body-edit

  • return ${field}==null?"":${field}.trim(); 으로 고쳐줌

 

 

 


 

  • json-simple-1.1.1.jar파일을 lib에 넣는다.

  • 자바스크립트가 인식할 수 있는 코드로 바꿔주기위해 필요함

 

 

 


 

  • 검색 SearchAction.java

 

package com.address.action;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.ArrayList;

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 org.json.simple.JSONArray;

import org.json.simple.JSONObject;

import com.address.model.SAddressDAO;

import com.address.model.SAddressDTO;

/**

 * Servlet implementation class SearchAction

 */

@WebServlet("/address/search.do")

public class SearchAction extends HttpServlet {

    private static final long serialVersionUID = 1L;

      

    /**

     * @see HttpServlet#HttpServlet()

     */

    public SearchAction() {

        super();

        // TODO Auto-generated constructor stub

    }

    /**

     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

            request.setCharacterEncoding("utf-8");

            String field=request.getParameter("field");

            String word=request.getParameter("word");

            SAddressDAO dao=SAddressDAO.getInstance();

            ArrayList<SAddressDTO> arr=dao.addressSearch(field, word);

            int count=dao.searchCount(field,word);

            

            JSONObject mainObj=new JSONObject();

            JSONArray jarr=new JSONArray();

            for(SAddressDTO dto:arr) {

                JSONObject obj=new JSONObject();

                obj.put("num", dto.getNum());

                obj.put("name", dto.getName());

                obj.put("addr", dto.getAddr());

                obj.put("tel", dto.getTel());

                obj.put("zipcode", dto.getZipcode());

                jarr.add(obj);

            }

            JSONObject objCount=new JSONObject();

            objCount.put("scount", count);

            

            mainObj.put("searchArr", jarr);

            mainObj.put("searchCount", objCount);

            response.setContentType("text/html;charset=utf-8");

            PrintWriter out=response.getWriter();

            out.println(mainObj.toString());

    }

    /**

     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

     */

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        // TODO Auto-generated method stub

        doGet(request, response);

    }

}


 

  • SAddressDAO.java

 

package com.address.model;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.sql.Statement;

import java.util.ArrayList;

import javax.naming.Context;

import javax.naming.InitialContext;

import javax.sql.DataSource;

public class SAddressDAO {

    private static SAddressDAO instance = new SAddressDAO();

    public static SAddressDAO getInstance() {

        return instance;

    }

    //디비연결

    private Connection getConnection() throws Exception {

        Context initCtx = new InitialContext();

        Context envCtx = (Context) initCtx.lookup("java:comp/env");

        DataSource ds = (DataSource) envCtx.lookup("jdbc/member");

        return ds.getConnection();

    }

    //추가

    public void insertAddress(SAddressDTO ad) {

        Connection con = null;

        PreparedStatement ps = null;

        try {

            con = getConnection();

            String sql = "insert into address "

            + "values(address_seq.nextval,?,?,?,?)";

            ps = con.prepareStatement(sql);

            ps.setString(1, ad.getName());

            ps.setString(2, ad.getZipcode());

            ps.setString(3, ad.getAddr());

            ps.setString(4, ad.getTel());

            ps.executeUpdate();

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, ps);

        }

    }

    //상세보기

    public SAddressDTO addressDetail(int num) {

        Connection con = null;

        Statement st = null;

        ResultSet rs = null;

        SAddressDTO dto=null;

        try {

            con=getConnection();

            st=con.createStatement();

            String sql="select * from address where num="+num;

            rs=st.executeQuery(sql);

            if(rs.next()) {

                dto=new SAddressDTO();

                dto.setNum(rs.getInt("num"));

                dto.setAddr(rs.getString("addr"));

                dto.setName(rs.getString("name"));

                dto.setNum(rs.getLong("num"));

                dto.setTel(rs.getString("tel"));

                dto.setZipcode(rs.getString("zipcode"));

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return dto;

    }

    

    //전체보기

    public ArrayList<SAddressDTO> addressList(){

            Connection con = null;

            Statement st = null;

            ResultSet rs = null;

            ArrayList<SAddressDTO> arr = new ArrayList<>();

            try {

                con = getConnection();

                String  sql ="select * from address";

                st = con.createStatement();

                rs = st.executeQuery(sql);

                while(rs.next()) {

                    SAddressDTO ad= new SAddressDTO();

                    ad.setAddr(rs.getString("addr"));

                    ad.setName(rs.getString("name"));

                    ad.setNum(rs.getLong("num"));

                    ad.setTel(rs.getString("tel"));

                    ad.setZipcode(rs.getString("zipcode"));

                    arr.add(ad);

                }

            } catch (Exception e) {

                    e.printStackTrace();

            }finally {

                closeConnection(con, st, rs);

            }

            return arr;

        }

    

    //삭제하기

    public void addressDelete(int num) {

        Connection con=null;

        Statement st=null;

        

        try {

            con=getConnection();

            st=con.createStatement();

            String sql="delete from address where num="+num;

            st.executeUpdate(sql);

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, null);

        }

    }

    

    //수정하기

    public SAddressDTO addressUpdate(SAddressDTO dto) {

        Connection con=null;

        PreparedStatement ps=null;

        

        try {

            con=getConnection();

            String sql="update address set name=?, zipcode=?, tel=?, addr=? where num=?";

            ps=con.prepareStatement(sql);

            ps.setString(1, dto.getName());

            ps.setString(2, dto.getZipcode());

            ps.setString(3, dto.getTel());

            ps.setString(4, dto.getAddr());

            ps.setLong(5, dto.getNum());

            ps.executeUpdate();

        }catch (Exception e){

            e.printStackTrace();

        }finally {

            closeConnection(con, ps);

        }

        return dto;

    }

    

    //개수출력

    public int getCount() {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        int count=0;

        

        try {

            con=getConnection();

            String sql="select count(*) from address";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) {

                count=rs.getInt(1);

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

        return count;

    }

    

    //검색 개수출력

    public int searchCount(String field, String word) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        int count=0;

        

        try {

            con=getConnection();

            String sql="select count(*) from address where "+field+" like '%"+word+"%'";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            if(rs.next()) {

                count=rs.getInt(1);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return count;

    }

    

    //우편번호 검색

    public ArrayList<ZipcodeDTO> zipSearch(String dong){

        Connection con = null;

        Statement st = null;

        ResultSet rs = null;

        ArrayList<ZipcodeDTO> arr = new ArrayList<>();

        try {

            con = getConnection();

            String  sql ="select * from zipcode where dong like '%"+dong+"%'";

            st = con.createStatement();

            rs = st.executeQuery(sql);

            while(rs.next()) {

                ZipcodeDTO zip= new ZipcodeDTO();

                zip.setBunji(rs.getString("bunji"));

                zip.setDong(rs.getString("dong"));

                zip.setGugun(rs.getString("gugun"));

                zip.setSido(rs.getString("sido"));

                zip.setZipcode(rs.getString("zipcode"));

                arr.add(zip);

            }

        } catch (Exception e) {

                e.printStackTrace();

        }finally {

            closeConnection(con, st, rs);

        }

        return arr;

    }

    

    //검색

    public ArrayList<SAddressDTO > addressSearch(String field, String word) {

        Connection con=null;

        Statement st=null;

        ResultSet rs=null;

        ArrayList<SAddressDTO> arr=new ArrayList<SAddressDTO>();

        try {

            con=getConnection();

            String sql="select * from address where "+field+" like '%"+word+"%'";

            st=con.createStatement();

            rs=st.executeQuery(sql);

            while(rs.next()) {

                SAddressDTO sd=new SAddressDTO();

                sd.setNum(rs.getInt("num"));

                sd.setName(rs.getString("name"));

                sd.setAddr(rs.getString("addr"));

                sd.setTel(rs.getString("tel"));

                sd.setZipcode(rs.getString("zipcode"));

                arr.add(sd);

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            closeConnection(con, st, rs);

        }

        return arr;

    }

    

    //닫기

    private void closeConnection(Connection con, PreparedStatement ps) {

        try {

            if (ps != null)

                ps.close();

            if (con != null)

                con.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

    private void closeConnection(Connection con, Statement st, ResultSet rs) {

        try {

            if (rs != null)

                rs.close();

            if (st != null)

                st.close();

            if (con != null)

                con.close();

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}




 

  •  SAddressDTO.java

 

package com.address.model;

public class SAddressDTO {

    private long num;

    private String name;

    private String zipcode;

    private String tel;

    private String addr;

    public long getNum() {

        return num;

    }

    public void setNum(long num) {

        this.num = num;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public String getZipcode() {

        return zipcode;

    }

    public void setZipcode(String zipcode) {

        this.zipcode = zipcode;

    }

    public String getTel() {

        return tel;

    }

    public void setTel(String tel) {

        this.tel = tel;

    }

    public String getAddr() {

        return addr;

    }

    public void setAddr(String addr) {

        this.addr = addr;

    }

    

    

}

 


 

  • ZipcodeDTO.java

 

package com.address.model;

public class ZipcodeDTO {

    private String zipcode;

    private String sido;

    private String gugun;

    private String dong;

    private String bunji;

    private int seq;

    public String getZipcode() {

        return zipcode == null ? "" : zipcode.trim();

    }

    public void setZipcode(String zipcode) {

        this.zipcode = zipcode;

    }

    public String getSido() {

        return sido == null ? "" : sido.trim();

    }

    public void setSido(String sido) {

        this.sido = sido;

    }

    public String getGugun() {

        return gugun == null ? "" : gugun.trim();

    }

    public void setGugun(String gugun) {

        this.gugun = gugun;

    }

    public String getDong() {

        return dong == null ? "" : dong.trim();

    }

    public void setDong(String dong) {

        this.dong = dong;

    }

    public String getBunji() {

        return bunji == null ? "" : bunji.trim();

    }

    public void setBunji(String bunji) {

        this.bunji = bunji;

    }

    public void setSeq(int seq) {

        this.seq = seq;

    }

}

 

'Learning > JSP' 카테고리의 다른 글

로그인, 회원가입, 게시판 만들기 1  (0) 2020.07.29
서블릿: 출력경로 통일하기  (0) 2020.07.29
JSTL  (0) 2020.07.27
서블릿  (0) 2020.07.27
게시판 2  (0) 2020.07.23
  • WebContent에 jstl이라는 폴더 만들고 adder.jsp 복사 붙여넣기. action에 addResult_jstl 로 변경

  • jstl 라이브러리 다운받기

https://mvnrepository.com/artifact/javax.servlet/jstl/1.2 에서 jar 파일 다운로드, WEB-INF에 넣기

 

 

 

 

 


 

  • adder.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>

<form action="addResult_jstl.jsp">

첫번째 수 : <input type="text" name="num1"><br>

두번째 수 : <input type="text" name="num2"><br>

<input type="submit" value="더하기">

</form>

</body>

</html>

  • addResult_jstl.jsp

 

  • set: 변수 지정 키워드

  • choose & when: 조건문

 

 

 

<%@ 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>

    첫번째: ${param.num1}<br/>

    첫번째: ${param.num2}<br/>

    <hr/>

    결과: ${param.num1+param.num2}<br/>

    <c:set var="no" value="${param.num1}"/>

    no: ${no }

    <hr/>

    <c:choose>

    <c:when test="${no mod 2==0}">

        짝수

    </c:when>

    <c:otherwise>

        홀수

    </c:otherwise>

    </c:choose>

    <hr>

    

    <c:if test="${no%2==0 }">

        짝수

    </c:if>

    <c:if test="${no%2!=0 }">

        홀수

    </c:if>

</body>

</html>

 


 

  • color.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>

<form action="colorResult.jsp">

ID:<input type="text" name="id"><br>

Color:

<select name="color">

    <option value="yellow">노랑</option>

    <option value="blue">blue</option>

    <option value="orange">orange</option>

    <option value="pink">pink</option>  

</select>

<input type="submit" value="보내기">

</form>

</body>

</html>

 


  • colorResult.jsp:출력값 (choose를 써야 when을 쓸 수 있음)

<%@ 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>

    <c:if test="${param.id!=null}">

        <c:set var="id" value="${param.id }"/>

    </c:if>

    <c:if test="${param.id==null || param.id==''}">

        <c:set var="id" value="GUEST"/>

    </c:if>

    color:${param.color} <br>

    <c:choose>

    <c:when test="${param.color=='yellow'}">

        <c:set var="c" value="노랑"/>

    </c:when>

    <c:when test="${param.color=='blue'}">

        <c:set var="c" value="파랑"/>

    </c:when>

    <c:when test="${param.color=='pink'}">

        <c:set var="c" value="분홍"/>

    </c:when>

    <c:when test="${param.color=='orange'}">

        <c:set var="c" value="주황"/>

    </c:when>

    </c:choose>

    ${id}님이 좋아하는 색깔은

    <span style="background-color: ${param.color}">${c}</span>입니다.

</body>

</html>

 


 

 

 

'Learning > JSP' 카테고리의 다른 글

서블릿: 출력경로 통일하기  (0) 2020.07.29
서블릿으로 주소록 만들기  (0) 2020.07.28
서블릿  (0) 2020.07.27
게시판 2  (0) 2020.07.23
게시판 1  (0) 2020.07.22

+ Recent posts