22.03.15 Web Server MVC패턴4 - admin계정 관리, 메시지 전송,출력

관리자 계정인 admin 계정으로 회원전체정보 검색,삭제 기능 만들기

  • main.jsp의 로그인 부분 ↓

    if(info.getEmail().equals("admin"))일 때 <a href="select.jsp">회원전체검색</a> -> 추가됨
<nav>
			<% if(info != null){ %>
			<!-- id가 admin이면회원전체검색이 되도록!!  -->
				<%if(info.getEmail().equals("admin")){  %>
				<a href="select.jsp">회원전체검색</a>
				<a href="update.jsp">개인정보수정<a>
				<a href="LogoutServiceCon">로그아웃<a>
				<%} else{ %>
				<a href="update.jsp">개인정보수정<a>
				<a href="LogoutServiceCon">로그아웃<a>
				<%} %>
			<%} else {%>
				<a href ="#menu">로그인<a> 
			<%} %>
		</nav> </header>
  • view - select.jsp의 부분 ↓

    -admin(관리자)계정은
    -스크립틀릿 안에 DB연결, sql문 작성 후 DB해제까지
    -회원정보를 테이블형태로 보여주기위해 while문안에 rs.next()메소드가 true일때만 반복하게 해줌
    -가져온 값 rs.getString(columnindex)을 변수에 각 담아주고
    -출력형태의 out.print에 행과 열 <tr><td></td></tr>로 출력
    -클릭하면 삭제해주는 a태그도 넣어준다 href='DeleteServiceCon?email="+email+"' DeleteServiceCon 서블릿 파일에 쿼리스트링형태로 키값을 담아서 보내줌!!! (폼태그처럼 데이터를 전송할수없어서)
<%@page import="java.net.URLEncoder"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.Connection"%>
<%@page import="Model.MemberDAO"%>
<%@page import="Model.MemberDTO"%>
<%@page import="oracle.jdbc.driver.DBConversion"%>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!-- 1.request영역에 저장된 정보를 가져오시오. -->

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
	<head>
		<title>Forty by HTML5 UP</title>
		<meta charset="UTF-8" />
		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
		<!--[if lte IE 8]><script src="assets/js/ie/html5shiv.js"></script><![endif]-->
		<link rel="stylesheet" href="assets/css/main.css" />
		<!--[if lte IE 9]><link rel="stylesheet" href="assets/css/ie9.css" /><![endif]-->
		<!--[if lte IE 8]><link rel="stylesheet" href="assets/css/ie8.css" /><![endif]-->
		
	</head>
	<style>
	
	</style>
	<body style="text-align: center;">
		<!-- Wrapper -->
			<div id="wrapper">
				<!-- Menu -->
					<nav id="Update">	
						<table>
							<caption><h2>회원관리페이지</h2></caption>
							<tr>
								<td>Email</td>
								<td>Tel</td>
								<td>Address</td>							
							</tr>
							<!-- 2.모든 회원의 이메일(email),전화번호(tel),주소(address)를 출력하시오. -->
							
							
							<%
							//db연결
							Connection conn = null;
							PreparedStatement psmt = null;
							ResultSet rs = null;
							try{
							Class.forName("oracle.jdbc.driver.OracleDriver");
							String url = "jdbc:oracle:thin:@localhost:1521:xe";
							String dbid = "hr";
							String dbpw = "hr";
							 conn = DriverManager.getConnection(url, dbid, dbpw);							
							 String sql = "select * from web_member2";
							 psmt = conn.prepareStatement(sql);
							 rs = psmt.executeQuery();
							
							 
							while(rs.next()){
							 String email = rs.getString(1); 
							 String tel = rs.getString(3); 
							 String address = rs.getString(4);
							 out.print("<tr>");
							 out.print("<td>"+ email +"</td>");
							 out.print("<td>"+ tel +"</td>");
							 out.print("<td>"+ address +"</td>");
							 out.print("<td><a href='DeleteServiceCon?email="+email+"'>삭제</a></td>");
							 out.print("</tr>");
							}
							
							//db연결해제
							}catch(Exception e){
								e.printStackTrace();
							}finally{
								if(rs!=null){
									rs.close();
								}if(psmt!=null){
									psmt.close();
								}if(conn!=null){
									conn.close();
								}
							}
							
							%>
							
							
						</table>
					</nav>		
					<a href="main.jsp" class="button next scrolly">되돌아가기</a>	
			</div>
		<!-- Scripts -->
			<script src="assets/js/jquery.min.js"></script>
			<script src="assets/js/jquery.scrolly.min.js"></script>
			<script src="assets/js/jquery.scrollex.min.js"></script>
			<script src="assets/js/skel.min.js"></script>
			<script src="assets/js/util.js"></script>
			<!--[if lte IE 8]><script src="assets/js/ie/respond.min.js"></script><![endif]-->
			<script src="assets/js/main.js"></script>
	</body>
</html>

  • Model package - MemberDAO에서 delete메소드 만들어서 ↓

    -쿼리스트링으로 받은 email이 매개변수
    -리턴값은 삭제된 행 -> int cnt (클래스영역에 전역변수로 이미 선언해줌)
	public int delete(String email) {
		dbconn();
		try {
			String sql="delete from web_member2 where email=?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, email);
			cnt = psmt.executeUpdate();
			
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			dbclose();
		}
		
		return cnt;
	}
  • Controller package - DeleteServiceCon 부분 ↓

    -select.jsp에서 넘어온 쿼리스트링 키값 email을 수집하고 변수에 담아줌
    -DAO 선언하고 메소드 호출
    -삭제되거나 삭제되지않아도 바로 select.jsp페이지 이동->삭제되면 사라지고 되지않으면 그대로남음
package Controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Model.MemberDTO;
import Model.MemberDAO;

@WebServlet("/DeleteServiceCon")
public class DeleteServiceCon extends HttpServlet {
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String email = request.getParameter("email");
		
		MemberDAO dao = new MemberDAO();
		int cnt = dao.delete(email);
		if(cnt>0) {
			response.sendRedirect("select.jsp");
		}else {
			response.sendRedirect("select.jsp");
			System.out.println("삭제실패");
		}
		
	}

}

웹페이지에서 메시지 확인

  • 먼저, DB에서 메시지를 저장할 테이블과 시퀀스를 생성한다
    1 ) web_message 테이블
    create table web_massage(
    num number(10),
    send_name varchar2(100),
    receive_email varchar2(100),
    content varchar2(200),
    sendDate Date,
    constraint msg_num_pk primary key(num)
    );
    2 ) msg_num_seq 시퀀스
    --number가 자동으로(점진적으로) 생성될 수 있도록 : 시퀀스생성
    create sequence msg_num_seq
    start with 1
    increment by 1
    maxvalue 9999
    minvalue 1
    nocycle nocache;
  • Model에 해당하는 MessageDTO 클래스 만들고, 필드선언, 생성자, getter & setter 만들기 ↓ ↓

package Model;

public class MessageDTO {
	//필드명이 선언시 테이블 컬럼명과 같아야 좋다
	private int num;
	private String send_name;
	private String receive_email;
	private String content;
	private String sendDate;	//날짜계산을 안하므로 String type
	public MessageDTO(int num, String send_name, String receive_email, String content, String sendDate) {
		super();
		this.num = num;
		this.send_name = send_name;
		this.receive_email = receive_email;
		this.content = content;
		this.sendDate = sendDate;
	}
	public MessageDTO(String send_name, String receive_email, String content) {
		super();
		this.send_name = send_name;
		this.receive_email = receive_email;
		this.content = content;
	}
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}
	public String getSend_name() {
		return send_name;
	}
	public void setSend_name(String send_name) {
		this.send_name = send_name;
	}
	public String getReceive_email() {
		return receive_email;
	}
	public void setReceive_email(String receive_email) {
		this.receive_email = receive_email;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getSendDate() {
		return sendDate;
	}
	public void setSendDate(String sendDate) {
		this.sendDate = sendDate;
	}
	
	
}
  • main.jsp의 메시지 입력부분 부분 ↓

    -메시지를 입력한다 -> DB에 내용 저장한다 는 뜻
    -데이터 전송하는 폼태그의 기본 3가지 : action, name, submit (+ method)
    -contents의 용량 문제로 post방식을 사용한다
    -폼태그 안의 input태그의 name값을 헷갈리지않게 테이블의 컬럼으로 지정
<section> 
			<!-- content용량 때문에 post방식을 사용 -->
			<form action="MsgCon" method="post">
				<div class="field half first">
					<label for="name">Name</label> <input type="text" name="send_name" id="name"
						placeholder="보내는 사람 이름" />
				</div>
				<div class="field half">
					<label for="email">Email</label> <input type="text" name="receive_email" id="email"
						placeholder="보낼 사람 이메일" />
				</div>

				<div class="field">
					<label for="message">Message</label>
					<textarea name="content" id="message" rows="6"></textarea>
				</div>
				<ul class="actions">
					<li><input type="submit" value="Send Message" class="special" /></li>
					<li><input type="reset" value="Clear" /></li>
				</ul>
			</form>
			</section>
  • Model package MessageDAO 클래스 만들고, DB연결,해제 메소드도 만들기 + 메시지 보내는(DB저장) sendMsg 메소드 ↓↓↓↓

    -매개변수는 폼에서 받아온 데이터를 DTO에 담아준 dto
    -web_message테이블의 첫번째컬럼 num에 시퀀스값을 순차적으로 만들어 저장 : msg_num_seq.nextval
    -2,3,4 컬럼은 setString메소드에 각 컬럼번호, 폼태그에서 받아와서 DTO에 각 담아준 변수 dto에서 가져와서(get) getSend_name, getReceive_email, getContent를 담아줌
	public int sendMsg(MessageDTO dto) {
		try {
			dbconn();

			String sql = "insert into web_massage values(msg_num_seq.nextval, ?, ?, ?, sysdate)";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, dto.getSend_name());
			psmt.setString(2, dto.getReceive_email());
			psmt.setString(3, dto.getContent());

			cnt = psmt.executeUpdate();

		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			dbclose();
		}
		return cnt;
	}
  • Controlller package 폼태그 데이터를 받을 MsgCon 서블릿 ↓

    -폼에서 받아온 파라미터 수집해 DTO호출 dto변수에 담고 DAO호출해 dto를 매개변수로 담는 sendMsg메소드 호출한다 -> 리턴이 int
    -메시지 성공실패는 콘솔창에서만 확인하고 메인으로 바로 보내줌
package Controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Model.MessageDAO;
import Model.MessageDTO;


@WebServlet("/MsgCon")
public class MsgCon extends HttpServlet {
	
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//post방식 인코딩
		request.setCharacterEncoding("UTF-8");
		String s_name = request.getParameter("send_name");
		String r_email = request.getParameter("receive_email");
		String content = request.getParameter("content");
		
		//DTO객체 생성
		MessageDTO dto = new MessageDTO(s_name, r_email, content);
		MessageDAO dao = new MessageDAO();
		int cnt = dao.sendMsg(dto);
		if(cnt>0) {
			System.out.println("메시지전송 성공");
		}else {
			System.out.println("메시지전송 실패");
		}
		response.sendRedirect("main.jsp");
	}

}

로그인 후 나에게 온 메시지 확인하기

  • 로그인을 했다면 web_massage 테이블에 저장된 메시지 정보 가져오기

  • 메세지 출력하는 메소드 List<E> : ArrayList 상위클래스 -->더 포괄적인 변수를 사용할 수 있다. object
    -로그인정보가 담긴 session info값이 not null일때

  • Model package selectMsg 서블릿 ↓

    -매개변수 : 로그인한 이메일
    -리턴 : List<MessageDTO> 반환 -->전역변수로 처리하면 계속 null값이 뜨기때문에 메소드안에서 지역변수로 선언
    -받은사람 email과 로그인한 사람email이 동일해야해서, select문의 where절 의 바인드변수에 .setString으로 받아온 email주소를 넣는다!
    -DB에서 받아와야할 값은 컬럼 순서대로 num, send_name, receive_email=email, content,sendDate 순으로 각 변수에 담아준다. -> MessageDTO msgdto = null;클래스영역에 선언해주기 (while문밖에서도 쓰여야됨)-> 이 값들을 msgdto에 담고, msgdto를 list에 추가함

	public List<MessageDTO> selectMsg(String email){
		List<MessageDTO> msglist = new ArrayList<MessageDTO>();
		try {
			dbconn();
			String sql = "select * from web_massage where receive_email=?";
			psmt = conn.prepareStatement(sql);
			psmt.setString(1, email);
			rs = psmt.executeQuery();
			while(rs.next()) {
				int num = rs.getInt(1);
				String send_name = rs.getString(2);
				String receive_email = email;
				String content = rs.getString(4);
				String sendDate = rs.getString(5);
				MessageDTO msgdto = new MessageDTO(num, send_name, receive_email, content, sendDate);
				msglist.add(msgdto);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			dbclose();
		} return msglist;
		
	}
  • 로그인을 한 다음에도 로그인정보를 가지고있고 메시지 정보가 나타날 수 있게 하는 goMain 서블릿 만들기 ↓

    -세션정보 불러오기->다운캐스팅 + getAtrr ("세션이름")
    -로그인 했을 때 .setAttribute에 info란이름으로 MemberDTO dto를 넣어줬음->반환데이터타입은 MemberDTO -> dto 변수에 담아줌
    -dto가 not null일때 (로그인상태일때) MessageDAO dao생성 -> selectMsg메소드 생성 -> dto에서 getEmail
    ->selectMsg메소드의 리턴 타입 : List
    -List에 담긴 정보를 가진채 페이지 이동하기 : forward방식
    -이동 전 List 정보 저장 : request scope영역 ----request에 저장을 하면 response객체를 가진채로 이동을 함 -> 여기에 msglist를 저장하는 것
package Controller;

import java.io.IOException;
import java.util.List;

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 Model.MemberDTO;
import Model.MessageDAO;
import Model.MessageDTO;

@WebServlet("/goMain")
public class goMain extends HttpServlet {
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//세션정보
		HttpSession session = request.getSession();
		MemberDTO dto = (MemberDTO)session.getAttribute("info");
		//로그인한 사람의 메시지 출력
		if(dto !=null) {
			//로그인상태
			MessageDAO dao = new MessageDAO();
			List<MessageDTO> msglist = dao.selectMsg(dto.getEmail());
			// List에 담긴 정보 가진채로 페이지 이동 forward방식
			// 이동 전 List 정보 저장
			// request scope영역에 리퀘스트에 저장을 하면 리스폰스객체를 가진채로 이동을 함
			request.setAttribute("msglist", msglist);
		}else {
			
		}
		//forward방식으로 페이지를 이동!
		RequestDispatcher rd = request.getRequestDispatcher("main.jsp");
		rd.forward(request, response);
	}

}
  • main.jsp 에서 내게 온 메시지 보이게 하기 ↓

    -main.jsp의 바디태그 시작점 스크립틀릿에
    List<MessageDTO>msglist = (List<MessageDTO>)request.getAttribute("msglist");
    ->forward방식으로 페이지 이동하면서 List의 정보를 가져오는 것
    -List배열에서 하나하나씩 꺼내서 MessageDTO mdto형태로 반환
<header class="major">
				<h2>나에게 온 메세지 확인하기</h2>
				</header>
				<p></p>
				<ul class="actions">
				<%
                  /* 로그인을 했으면 메세지 출력 send_name, content, sendDate */
                  if(info != null){
                    /* for each문 -> 확장 for문 */
                   /* for(객체타입 변수명 : 배열){} */
                   	for(MessageDTO mdto : msglist){
                   		%>
                   		<li>
                   			<span><%= mdto.getSend_name() %></span>
                   			<span><%= mdto.getContent() %></span>
                   			<span><%= mdto.getSendDate() %></span>
                   		</li>
                   		
                   	<% }
                 }else{%>
                              
                              <li>로그인을 하세요.</li>
                              <li><a href="#" class="button next scrolly">전체삭제하기</a></li>

                              <% }%>
					
				</ul>

로그인, 수정,관리 등 모든 처리 후 main.jsp가 아닌 goMain을 거쳐가게 하기 -> 내게 온 메시지가 계속해서 나오게


컨트롤러의 마지막 sendRedirect 경로에 "goMain"으로 변경!, jsp에서도 main.jsp으로 가는 모든 경로를 "goMain"으로 변경!

좋은 웹페이지 즐겨찾기