JSP
221206 header, mypage, usercontroller, userdao, userserviceimpl, userservice 수정 및 modify 페이지추가
주영재
2022. 12. 6. 14:07
header
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-idth, initial-scale=1">
<title>Welcome to MyWorld</title>
<!-- Bootstrap Core CSS -->
<link href="${pageContext.request.contextPath}/css/bootstrap.css" rel="stylesheet">
<!-- Custom CSS -->
<link href="${pageContext.request.contextPath}/css/business-casual.css" rel="stylesheet">
<!-- Fonts -->
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300italic,400italic,600italic,700italic,800italic,400,300,600,700,800" rel="stylesheet" type="text/css">
<link href="https://fonts.googleapis.com/css?family=Josefin+Slab:100,300,400,600,700,100italic,300italic,400italic,600italic,700italic" rel="stylesheet" type="text/css">
<!-- jQuery -->
<script src="${pageContext.request.contextPath}/js/jquery.js"></script>
<!-- Bootstrap Core JavaScript -->
<script src="${pageContext.request.contextPath}/js/bootstrap.min.js"></script>
<script>
$('.carousel').carousel({
interval: 2000 //changes the speed
})
</script>
<style>
.abc {
position: sticky;
top: 0px;
width: 100%;
z-index: 10;
}
</style>
</head>
<body>
<%-- header --%>
<div class="brand">My Web</div>
<div class="address-bar">Welcome to MyWorld</div>
<nav class="navbar navbar-default abc" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/hong">My First Web</a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li>
<a href="${pageContext.request.contextPath}/index.main">HOME</a>
</li>
<li>
<a href="${pageContext.request.contextPath}/member/member.main">Member</a>
</li>
<li>
<a href="${pageContext.request.contextPath}/board/board_list.board">BOARD</a>
</li>
<%-- 세션이 없으면 로그인과 회원가입 --%>
<c:if test="${sessionScope.user_id==null }">
<li>
<a href="${pageContext.request.contextPath}/user/user_login.user">LOGIN</a>
</li>
<li>
<a href="${pageContext.request.contextPath}/user/user_join.user" style="color:red">JOIN</a>
</li>
</c:if>
<%-- 세션이 있으면 로그아웃과 마이페이지 --%>
<c:if test="${sessionScope.user_id!=null }">
<li>
<a href="${pageContext.request.contextPath}/user/user_logout.user">LOGOUT</a>
</li>
<li>
<a href="${pageContext.request.contextPath}/user/user_mypage.user" style="color:red">MYPAGE</a>
</li>
</c:if>
<%--
<c:choose>
<c:when>
로그인,회원가입
</c:when>
<c:otherwise>
로그아웃, 마이페이지
</c:otherwise>
ㅡ<c:/choose>
로도 사용 가능
--%>
</ul>
</div>
<!-- /.navbar-collapse -->
</div>
<!-- /.container -->
</nav>
<!-- end header -->
로그인이 안되면 왼쪽페이지, 로그인을 하면 오른쪽페이지
a태그에 각각 맞는 경로를 지정
user_mypage
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ include file="../include/header.jsp"%>
<section>
<div align="center">
${sessionScope.user_id }
<b>(${sessionScope.user_name })</b>님 환영합니다
<div>
<a href="user_logout.user">[로그아웃]</a>
<a href="user_modify.user">[정보수정]</a>
<a href="user_delete.user">[회원탈퇴]</a>
</div>
</div>
</section>
<%@ include file="../include/footer.jsp"%>
user_modify
<%@page import="com.example.user.model.UserVO"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@include file="../include/header.jsp" %>
<section>
<div align="center">
<h3>회원정보 수정 연습</h3>
<form action="updateForm.user" method="post">
<table>
<tr>
<td>아이디</td>
<td><input type="text" name="id" value="${vo.id }"
pattern="\w{4,8}" required readonly></td>
</tr>
<tr>
<td>비밀번호</td>
<td><input type="password" name="pw" placeholder="4~8글자 영문자숫자"
pattern="\w{4,8}" required="required"></td>
</tr>
<tr>
<td>이름</td>
<td><input type="text" name="name" pattern="[가-힣]{3,}"
required="required" value="${vo.name }"></td>
</tr>
<tr>
<td>이메일</td>
<td><input type="email" name="email" required="required" value="${vo.email }" readonly></td>
</tr>
<tr>
<td>성별</td>
<td>
<input type="radio" name="gender" value="f" ${vo.gender eq 'f'?'checked':''}>여자
<input type="radio" name="gender" value="m" ${vo.gender eq 'm'?'checked="checked"':''}>남자
</td>
</tr>
</table>
<input type="submit" value="정보수정">
<!--
JS로 기능을 붙임
onclick="location.href='경로'"
-->
<input type="button" value="마이페이지로 가기" onclick="location.href='user_mypage.user'">
</form>
</div>
</section>
<%@include file="../include/footer.jsp" %>
checked="checked"는 checked만 써도 된다.
다른 태그도 가능. required나 readonly, disabled 등등도 그냥 써도 된다.
placeholder에 ${ }를 넣으면 값을 받아올 수 없다. value에 넣어야 한다
UserController
package com.example.controller;
import java.io.IOException;
import java.io.PrintWriter;
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.example.user.model.UserVO;
import com.example.user.service.UserService;
import com.example.user.service.UserServiceImpl;
@WebServlet("*.user")
public class UserController extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doAction(request, response);
}
//get, post 하나로 묶음
protected void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글처리
request.setCharacterEncoding("utf-8");
//요청분기
String uri = request.getRequestURI();
String path = request.getContextPath();
String command =uri.substring(path.length());
System.out.println("요청경로:"+command);
//서비스 영역
UserService service=new UserServiceImpl();
switch (command) {
case "/user/user_join.user":
request.getRequestDispatcher("user_join.jsp").forward(request, response);
break;
case "/user/joinForm.user"://회원가입기능
int result = service.join(request, response);
if(result>=1) {//중복
//메시지
request.setAttribute("msg", "중복된 아이디 or email입니다");
request.getRequestDispatcher("user_join.jsp").forward(request, response);
}else {//가입성공
//가지고나갈 데이터 없음. redirect
//response.sendRedirect("user_login.jsp");-그런데 이대로 하면 페이지 주소가 user_login.jsp로 남음. MVC2는 컨트롤러를 타고 가야 함
response.sendRedirect("user_login.user");//이렇게하면 컨트롤러가 이걸 받아오고, 그래서 세번째 case로 이동하고 튀어나간다.
//MVC2에서 리타이렉트는 다시 컨트롤러를 태우는 요청
}
break;
case"/user/user_login.user"://로그인페이지
request.getRequestDispatcher("user_login.jsp").forward(request, response);
break;
case"/user/loginForm.user"://로그인요청
UserVO vo = service.login(request, response);
if(vo==null) {//로그인실패
request.setAttribute("msg", "아이디 비밀번호를 확인하세요");
request.getRequestDispatcher("user_login.jsp").forward(request, response);
}else {//로그인성공
//마이페이지
response.sendRedirect("user_mypage.user");
}
break;
case"/user/user_mypage.user": //마이페이지
request.getRequestDispatcher("user_mypage.jsp").forward(request, response);
break;
case"/user/user_logout.user": //로그아웃
HttpSession session=request.getSession();
session.invalidate();//세션무효화
//response.sendRedirect("/JSPWeb/index.main");//메인으로
response.sendRedirect(path+"/index.main");
break;
case"/user/user_modify.user"://정보수정화면
/****회원데이터를 가지고 나오는 작업 ****
* service와 dao에 getInfo() 메서드를 선언합니다.
* service에서는 세션에서 아이디를 얻습니다
* dao에서는 id를 전달받아 회원 데이터를 조회하여 vo에 저장합니다
* controller에서는 조회한 vo를 저장하고 화면으로 가지고 나갑니다.
* 화면에서는 input태그에 값을 출력해주세요
*/
UserVO vo2 = service.getInfo(request, response);
//1회용으로 쓸거임. 수정하기 전에 보여주기만 할 것.
request.setAttribute("vo", vo2);
request.getRequestDispatcher("user_modify.jsp").forward(request, response);
break;
case"/user/updateForm.user":
/*
****회원정보를 업데이트 하는 작업****
*service와 dao에 update() 메서드를 생성
*service에선 필요한 파라미터 값을 받습니다(pw, name, gender) 조건절에 id
*dao에서 데이터를 전달받아서 업데이트를 실행
*업데이트 이후에는 컨트롤러를 태워서 mypage로 리다이렉트
*/
int result2 = service.update(request, response);
if(result2==1) {//업데이트 성공
//response.sendRedirect("user_mypage.user");
//out객체를 이용해서 화면에 스크립트를 작성해서 보냄
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<script>");
out.println("alert('정보가 수정되었습니다')");
out.println("location.href='user_mypage.user';");
out.println("</script>");
}else {//업데이트 실패
//modify화면으로 포워드-데이터를 가지고 나갈 수가 없다. 때문에 컨트롤러를 타는 것
response.sendRedirect("user_modify.user");
}
break;
case "/user/user_delete.user":
//삭제는 실패가 일어나지 않아서 메서드 반환 타입을 void로 하고 메서드 호출과 페이지이동만 해도 된다.
int result3 = service.delete(request, response);
if(result3==1) {//삭제성공
response.sendRedirect(path+"/index.main");//메인화면
}else {
response.sendRedirect("user_mypage.user");//마이페이지
}
break;
default:
break;
}
}
}
정보수정으로 넘어갈 때 정보들은 1회용으로 보여주기만 할 것.
request를 사용하고 vo객체에 다 담아서 forward로 보낸다
UserDAO
package com.example.user.model;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import com.example.util.JDBCUtil;
public class UserDAO {
//여러 사용자들이 사용. 10명이 들어오면 10개가 생성되고 10개가 사라지고 함.
//어차피 다 똑같이 생김. 여러개 만들면 서버가 힘듦. singleton형식으로 생성
//UserDAO는 불필요하게 여러개 만들어질 필요가 없기 때문에
//한개의 객체만 만들어 지도록 Singleton형식으로 설계합니다.
//1. 나자신의 객체를 생성해서 1개로 제한합니다.
private static UserDAO instance = new UserDAO();
//2. 직접 객체를 생성 할 수 없도록 생성자에 private
private UserDAO() {
//드라이버 클래스 로드
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch (ClassNotFoundException e) {
System.out.println("드라이버클래스 로드에러");
}
}
//3. 외부에서 객체생성을 요구할 때 getter메서드를 통해 1번의 객체를 반환
public static UserDAO getInstance() {
return instance;
}
//4. 필요한 데이터베이스 변수 선언
public String URL = "jdbc:oracle:thin:@localhost:1521:xe";
public String UID = "jsp";
public String UPW = "jsp";
//원래 지역변수로 만들어야 함. 지금은 편의성을 위해
private Connection conn;
private PreparedStatement pstmt;
private ResultSet rs;
//5.메서드
public int idCheck(String id, String email) {
int result=0;
String sql="select count(*) as total from users where id =? or email = ?";
try {
//1. conn객체
conn=DriverManager.getConnection(URL, UID, UPW);
//2.pstmt
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, email);
//3. select문은 executeQuery로 실행
rs=pstmt.executeQuery();
if(rs.next()) {
result=rs.getInt("total");
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, pstmt, rs);
}
return result;
}
//회원가입
public void join(UserVO vo) {
String sql = "insert into users values(?,?,?,?,?)";
try {
conn=DriverManager.getConnection(URL, UID, UPW);
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, vo.getId());
pstmt.setString(2, vo.getPw());
pstmt.setString(3, vo.getName());
pstmt.setString(4, vo.getEmail());
pstmt.setString(5, vo.getGender());
pstmt.executeUpdate();//실행(성공시 1, 실패시 0반환. 성공시에 또 받아서 어디에 넣어야 하면 저장해야 하지만 여기선 그냥 실행만)
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, pstmt, rs);
}
}
//로그인
public UserVO login(String id, String pw) {
UserVO vo = null;
String sql = "select * from users where id=? and pw=?";
try {
conn=DriverManager.getConnection(URL, UID, UPW);
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pw);
rs=pstmt.executeQuery();
if(rs.next()) {//로그인 성공 후 ->데이터가 1행 조회되어서 나오면 vo에 회원정보 저장
String id2 = rs.getString("id");
String name = rs.getString("name");
String email = rs.getString("email");
String gender = rs.getString("gender");
vo=new UserVO(id2, null, name, email, gender);//비밀번호는 가지고 나오지 않는다.
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, pstmt, rs);
}
return vo;
}
//정보가져오기
public UserVO getInfo(String id) {
UserVO vo = null;
String sql = "select * from users where id=?";
try {
conn=DriverManager.getConnection(URL, UID, UPW);
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, id);
rs=pstmt.executeQuery();
if(rs.next()) {//로그인 성공 후 ->데이터가 1행 조회되어서 나오면 vo에 회원정보 저장
String id2 = rs.getString("id");
String name2 = rs.getString("name");
String email2 = rs.getString("email");
String gender2 = rs.getString("gender");
vo=new UserVO(id2, null, name2, email2, gender2);//비밀번호는 가지고 나오지 않는다.
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, pstmt, rs);
}
return vo;
}
//업데이트하기
public int update(String id, String pw, String name, String gender) {
int result = 0;
String sql = "update users set pw=?, name=?, gender=? where id=?";
try {
conn=DriverManager.getConnection(URL, UID, UPW);
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, pw);
pstmt.setString(2, name);
pstmt.setString(3, gender);
pstmt.setString(4, id);
result = pstmt.executeUpdate();//실행(성공시 1, 실패시 0반환.)
System.out.println(result);
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, pstmt, rs);
}
return result;
}
//회원탈퇴 기능
public int delete(String id) {
int result=0;
String sql = "delete from users where id=?";
try {
conn=DriverManager.getConnection(URL, UID, UPW);
pstmt=conn.prepareStatement(sql);
pstmt.setString(1, id);
result=pstmt.executeUpdate();//delete도 update와 똑같이 executeUpdate로 실행, 성공하면 1반환, 실패하면 0반환
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtil.close(conn, pstmt, rs);
}
return result;
}
}
UserService
package com.example.user.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.example.user.model.UserVO;
public interface UserService {
public int join(HttpServletRequest request, HttpServletResponse response);//추상메서드
public UserVO login(HttpServletRequest request, HttpServletResponse response);//추상메서드
public UserVO getInfo(HttpServletRequest request, HttpServletResponse response);//추상메서드
public int update(HttpServletRequest request, HttpServletResponse response);//추상메서드
public int delete(HttpServletRequest request, HttpServletResponse response);//추상메서드
}
UserServiceImpl
package com.example.user.service;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.example.user.model.UserDAO;
import com.example.user.model.UserVO;
public class UserServiceImpl implements UserService{
//컨트롤러의 역할을 분담
//가입처리
public int join(HttpServletRequest request, HttpServletResponse response) {
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String name = request.getParameter("name");
String email = request.getParameter("email");
String gender = request.getParameter("gender");
//아이디 or email 중복 검사 -> 가입
UserDAO dao=UserDAO.getInstance();
int result=dao.idCheck(id, email);
if(result>=1) {//중복
return 1;//중복의 의미반환
}else {//중복x->가입
UserVO vo = new UserVO(id, pw, name, email, gender);
dao.join(vo);
return 0;//성공의 의미반환
}
}
//로그인
public UserVO login(HttpServletRequest request, HttpServletResponse response) {
String id = request.getParameter("id");
String pw = request.getParameter("pw");
UserDAO dao = UserDAO.getInstance();
UserVO vo = dao.login(id, pw);
if(vo!=null){
HttpSession session = request.getSession();//자바에서 현재 세션 사용
//세션에 아이디, 이름을 저장
session.setAttribute("user_id", vo.getId());
session.setAttribute("user_name", vo.getName());
}
return vo;
}
//값 받아오기
public UserVO getInfo(HttpServletRequest request, HttpServletResponse response) {
//세션에서 user_id값을 얻음
HttpSession session = request.getSession();
String id = (String)session.getAttribute("user_id");//컨트롤러 로그인메서드에 있는 setAttribute의 키값
UserDAO dao = UserDAO.getInstance();//DAO는 특별하게 생성한다. new UserDAO()가 아님
UserVO vo = dao.getInfo(id);
return vo;
}
//업데이트
public int update(HttpServletRequest request, HttpServletResponse response) {
String id=request.getParameter("id");
String pw=request.getParameter("pw");
String name=request.getParameter("name");
String gender=request.getParameter("gender");
//DAO객체 생성
UserDAO dao=UserDAO.getInstance();
int result = dao.update(id, pw, name, gender);
//업데이트 성공시 세션 변경
if(result==1) {//세션을 바꾸는건 서비스에서!
HttpSession session = request.getSession();
session.setAttribute("user_name", name);
}
return result;
}
//회원탈퇴
public int delete(HttpServletRequest request, HttpServletResponse response) {
int result = 0;
//id가 필요
HttpSession session = request.getSession();
String id = (String)session.getAttribute("user_id");
UserDAO dao3=UserDAO.getInstance();
result = dao3.delete(id);
if(result==1) {
session.invalidate();
}
return result;
}
}