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"으로 변경!
Author And Source
이 문제에 관하여(22.03.15 Web Server MVC패턴4 - admin계정 관리, 메시지 전송,출력), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@ggg4155/22.03.15-Web-Server-MVC패턴4-admin계정-관리저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)