- 회원가입 (커넥션 풀)
- MemberServlet
package servletdb.ex04;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/member4")
public class MemberServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
//가입 버튼 클릭 시 db에 추가하기, 알림창 생성
response.setContentType("text/html;charset=utf-8");
MemberDAO dao = new MemberDAO(); //서버에 연결돼있으므로 db 연결 따로 X
PrintWriter out = response.getWriter();
String command = request.getParameter("command");
if (command!=null && command.equals("addMember")){
String _id = request.getParameter("id"); //_변수는 클라이언트에게 받아온 값
String _pwd = request.getParameter("pwd");
String _name = request.getParameter("name");
String _email = request.getParameter("email");
MemberVO vo = new MemberVO(); //한명의 회원 정보로 저장, db에 넘김
vo.setId(_id);
vo.setPwd(_pwd);
vo.setName(_name);
vo.setEmail(_email);
dao.addMember(vo);
out.print("회원가입이 완료되었습니다");
}
List list = dao.listMembers(); //<MemberVO>로 선언시 하단 for문에서 바로 list.get(i).getID 가능
out.print("<html><body>");
out.print("<table border=1>");
out.print("<tr align='center' bgcolor='azure'>");
out.print("<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일자</th>");
out.print("</tr>");
for (int i=0;i<list.size();i++) { //i번째 vo객체
MemberVO memberVO = (MemberVO) list.get(i);
out.print("<tr>");
out.print("<td>"+memberVO.getId()+"</td><td>"+memberVO.getPwd()+"</td><td>"+
memberVO.getName()+"</td><td>"+memberVO.getEmail()+"</td><td>"+memberVO.getJoindate()+"</td>");
out.print("</tr>");
}
out.print("</table>");
out.print("<a href='/servletdb/memberForm.html'>새 회원 등록하기</a>");
out.print("</body></html");
}
}
- MemberDAO
package servletdb.ex04;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MemberDAO {
private Connection con;
private PreparedStatement pstmt;
private DataSource dataFactory; //
public MemberDAO() { //
try {
Context ctx = new InitialContext();
Context envContext = (Context)ctx.lookup("java:/comp/env");
dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
} catch(Exception e) {
System.out.println("DB 연결 실패");
}
}
//회원정보 목록
public List<MemberVO> listMembers(){
List<MemberVO> list = new ArrayList<MemberVO>();
try {
con = dataFactory.getConnection(); //
String query = "select * from member_list";
pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date joinDate = rs.getDate("joindate");
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoindate(joinDate);
list.add(vo);
}
rs.close();
pstmt.close();
con.close();
} catch(Exception e) {
System.out.println("자료 처리 중 에러 발생");
}
return list;
}
public void addMember(MemberVO memberVO) {
try {
con = dataFactory.getConnection();
String id = memberVO.getId();
String pwd = memberVO.getPwd();
String name = memberVO.getName();
String email = memberVO.getEmail();
String query = "insert into member_list(id, pwd, name, email) values(?,?,?,?)";
pstmt = con.prepareStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
pstmt.setString(3, name);
pstmt.setString(4, email);
pstmt.executeUpdate();
pstmt.close();
} catch(Exception e) {
System.out.println("회원 추가 중 에러 발생");
}
}
}
※ Connection.prepareStatement()
=> 메소드 수행 시 쿼리가 메모리에 저장되므로 parse는 최초 한번만 수행됨 (효율적)
String query = "insert into member_list(id, pwd, name, email) values(?,?,?,?)"; //쿼리문
Statement pstmt = con.prepareStatement(query); //SQL문 DB에 전송 (데이터 없음)
pstmt.setString(1, id); //첫번째 데이터 바인딩
~
ptsmt.executeUpdate(); //SQL문 실행
- 회원 삭제
- MemberServlet
package servletdb.ex04;
import jakarta.servlet.http.HttpServlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet("/member4")
public class MemberServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
MemberDAO dao = new MemberDAO();
PrintWriter out = response.getWriter();
String command = request.getParameter("command");
if (command!=null && command.equals("addMember")){
String _id = request.getParameter("id");
String _pwd = request.getParameter("pwd");
String _name = request.getParameter("name");
String _email = request.getParameter("email");
MemberVO vo = new MemberVO();
vo.setId(_id);
vo.setPwd(_pwd);
vo.setName(_name);
vo.setEmail(_email);
dao.addMember(vo); //회원리스트에 추가
//회원 가입창에서 전송된 command 값이 delMember => ID를 가져와 SQL문으로 전달해서 삭제
} else if (command != null && command.equals("delMember")) {
String id = request.getParameter("id"); ////
dao.delMember(id); ////
}
List list = dao.listMembers();
out.print("<html><body>");
out.print("<table border=1>");
out.print("<tr align='center' bgcolor='azure'>");
out.print("<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일자</th><th>삭제</th>");
out.print("</tr>");
for (int i=0;i<list.size();i++) { //i번째 vo객체
MemberVO memberVO = (MemberVO) list.get(i);
out.print("<tr>");
out.print("<td>"+memberVO.getId()+"</td><td>"+memberVO.getPwd()+"</td><td>"+
memberVO.getName()+"</td><td>"+memberVO.getEmail()+"</td><td>"+memberVO.getJoindate()+"</td>");
out.print("<td><a href='/servletdb/member4?command=delMember&id="+ memberVO.getId() +"'>삭제</a></td>"); ////삭제를 클릭하면 command 값과 회원 ID를 서블릿으로 전송 ////
out.print("</tr>");
}
out.print("</table>");
out.print("<a href='/servletdb/memberForm.html'>새 회원 등록하기</a>");
out.print("</body></html");
}
}
- MemberDAO
package servletdb.ex04;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class MemberDAO {
private Connection con;
private PreparedStatement pstmt;
private DataSource dataFactory;
public MemberDAO() {
try {
Context ctx = new InitialContext();
Context envContext = (Context)ctx.lookup("java:/comp/env");
dataFactory = (DataSource) envContext.lookup("jdbc/oracle");
} catch(Exception e) {
System.out.println("DB 연결 실패");
}
}
//회원정보 목록
public List<MemberVO> listMembers(){
List<MemberVO> list = new ArrayList<MemberVO>();
try {
con = dataFactory.getConnection();
String query = "select * from member_list";
pstmt = con.prepareStatement(query);
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
String id = rs.getString("id");
String pwd = rs.getString("pwd");
String name = rs.getString("name");
String email = rs.getString("email");
Date joinDate = rs.getDate("joindate");
MemberVO vo = new MemberVO();
vo.setId(id);
vo.setPwd(pwd);
vo.setName(name);
vo.setEmail(email);
vo.setJoindate(joinDate);
list.add(vo);
}
rs.close();
pstmt.close();
con.close();
} catch(Exception e) {
System.out.println("자료 처리 중 에러 발생");
}
return list;
}
public void addMember(MemberVO memberVO) {
try {
con = dataFactory.getConnection();
String id = memberVO.getId();
String pwd = memberVO.getPwd();
String name = memberVO.getName();
String email = memberVO.getEmail();
String query = "insert into member_list(id, pwd, name, email) values(?,?,?,?)";
pstmt = con.prepareStatement(query);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
pstmt.setString(3, name);
pstmt.setString(4, email);
pstmt.executeUpdate();
pstmt.close();
} catch(Exception e) {
System.out.println("회원 추가 중 에러 발생");
}
}
public void delMember(String id) { ////
try {
con = dataFactory.getConnection();
String query = "delete from member_list where id=?";
pstmt = con.prepareStatement(query);
pstmt.setString(1,id);
pstmt.executeUpdate();
pstmt.close();
} catch(Exception e) {
System.out.println("삭제 중 에러 발생");
}
}
}
서블릿 포워드
: 하나의 서블릿에서 다른 서블릿/JSP와 연동
- 포워드 방법
1. redirect
- HttpServletResponse 객체의 sendRedirect() 메서드 이용
- 웹 브라우저에 재요청하는 방식
- 형식 : sendRedirect("포워드할 서블릿 또는 JSP")
(클라이언트의 웹브라우저에서 첫번째 서블릿에 요청 전달
-> 첫번째 서블릿은 sendRedirect() 통해 두번째 서블릿을 웹브라우저에 요청
-> 웹브라우저는 두번째 서블릿에 다시 요청 전달)
2. refresh
- HttpServletResponse 객체의 addHeader() 메서드 이용
- 웹브라우저에 재요청하는 방식
- 형식: response.addHeader("Refresh", "경과시간(초); url=요청할 서블릿 또는 jsp")
3. location
- 자바스크립트 location 객체의 href 속성을 이용
- 자바스크립트에서 재요청하는 방식
- 형식: location.href='요청할 서블릿 또는 jsp'
4. dispatch
- 일반적으로 포워딩기능을 지칭
- 서블릿이 다른 서블릿에 직접 요청하는 방법
- RequestDispatcher 클래스의 forward() 메서드를 이용합니다.
- 서블릿의 이동이 있더라도 url의 변경이 일어나지 않음
- 형식: RequestDispatcher dis = request.getRequestDispatcher("포워드할 서블릿 또는 jsp");
dis.forward(request,response);
1,2,3은 서블릿(=>요청)이 웹브라우저를 거쳐 다른 서블릿이나 jsp에게 요청하는 방식
=> 웹브라우저를 거치기 때문에 url의 변경이 일어난다.
4는 서블릿에서 바로 다른 서블릿에 요청하는 방법
=> 서블릿의 이동이 있더라도 url의 변경이 일어나지 않음
ex) /first 서블릿에서 /second 서블릿으로 이동해도 localhost:8080/first로 보인다.
- redirect
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.sendRedirect("second"); //second 서블릿 재요청
}
}
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2>sendRedirect를 이용한 포워딩 실습</h2>");
out.print("</body></html>");
}
}
@WebServlet("/first")
public class FirstServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.sendRedirect("second?name=hong"); ////
}
}
@WebServlet("/second")
public class SecondServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2>"+name+"님 환영합니다</h2>"); ////
out.print("</body></html>");
}
}
//
hong님 환영합니다
- refresh
@WebServlet("/first2")
public class FirstServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
response.addHeader("Refresh","1;url=second2"); ////
}
}
@WebServlet("/second2")
public class SecondServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2>refresh를 이용한 포워딩 실습</h2>");
out.print("</body></html>");
}
}
- location
@WebServlet("/first3")
public class FirstServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<script type='text/javascript'>"); //
out.print("location.href='second3';"); ////
out.print("</script>");
}
}
@WebServlet("/second3")
public class SecondServlet2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2>location을 이용한 포워딩 실습</h2>");
out.print("</body></html>");
}
}
- dispatch
@WebServlet("/first4")
public class FirstServlet4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
RequestDispatcher dispatcher = request.getRequestDispatcher("second4"); ////
dispatcher.forward(request, response); ////
}
}
@WebServlet("/second4")
public class SecondServlet4 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.print("<h2>dispatch를 이용한 포워딩 실습</h2>");
out.print("</body></html>");
}
}
=> http://localhost:8080/servletAPI/first4 이동해도 주소 그대로 유지됨
=> 대량의 데이터를 공유하거나 전달할 때 포워드보다 바인딩 (서블릿 -> 다른 서블릿/jsp)
서블릿 바인딩
: 웹 프로그램 실행 시 데이터를 서블릿 관련 객체에 저장하는 방법
- redirect 통한 바인딩 (실패)
@WebServlet("/bind")
public class FirstServletBind extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
request.setAttribute("address", "서울시 종로구"); ////
response.sendRedirect("secondBind"); //
}
}
@WebServlet("/secondBind")
public class SecondServletBind extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String address = (String)request.getAttribute("address"); ////
out.print("<html><body>");
out.print("<h3>주소는 "+address+"입니다</h3>"); ////
out.print("redirect를 이용한 포워딩 시 바인딩하는 실습");
out.print("</body></html>");
}
}
//
주소는 null입니다
redirect를 이용한 포워딩 시 바인딩하는 실습
=> /secondBind 이동은 하지만 데이터 바인딩 실패
=> 1,2,3 방법으로는 바인딩 불가
=> 웹 브라우저를 거치면서 객체가 다른 객체가 되어 돌아옴
(처음 요청 때 받은 객체 & 다시 웹 브라우저를 거쳐 요청하는 객체 => 서로 다른 객체)
- dispatch 통한 바인딩 (성공)
@WebServlet("/bind2")
public class FirstServletBind2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
request.setAttribute("address", "서울시 종로구"); ////
RequestDispatcher dispatcher = request.getRequestDispatcher("secondBind2"); ////
dispatcher.forward(request, response); ////
}
}
@WebServlet("/secondBind2")
public class SecondServletBind2 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String address = (String)request.getAttribute("address"); ////
out.print("<html><body>");
out.print("<h3>주소는 "+address+"입니다</h3>"); ///
out.print("dispatch를 이용한 포워딩 시 바인딩하는 실습");
out.print("</body></html>");
}
}
//
주소는 서울시 종로구입니다
dispatch를 이용한 포워딩 시 바인딩하는 실습
- 두 서블릿 간 회원정보 조회 바인딩
주 기능 / 화면 출력 서블릿 분리
- MemberVO, MemberDAO 복붙
- MemberServlet
@WebServlet("/member5")
public class MemberServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doHandle(request, response);
}
private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
MemberDAO dao = new MemberDAO();
PrintWriter out = response.getWriter();
String command = request.getParameter("command");
if (command!=null && command.equals("addMember")){
String _id = request.getParameter("id");
String _pwd = request.getParameter("pwd");
String _name = request.getParameter("name");
String _email = request.getParameter("email");
MemberVO vo = new MemberVO();
vo.setId(_id);
vo.setPwd(_pwd);
vo.setName(_name);
vo.setEmail(_email);
dao.addMember(vo);
} else if (command != null && command.equals("delMember")) {
String id = request.getParameter("id"); //누른 행의 id값 받아옴
dao.delMember(id); //id값 일치하는 회원을 회원리스트에서 삭제
}
List memberList = dao.listMembers();
request.setAttribute("memberList", memberList); //모든 회원정보를 객체 변수에 저장해 (Hashmap 구조)
//viewMembers(다른 서블릿)에 전달
RequestDispatcher dis = request.getRequestDispatcher("viewMembers");
dis.forward(request, response);
}
}
- ViewServlet
@WebServlet("/viewMembers")
public class ViewServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
List memberList = (List) request.getAttribute("memberList");
//MemberServlet에서 setAttribute()로 받은 HashMap 타입 객체 List로 변환해 받아옴
out.print("<html><body>");
out.print("<table border=1>");
out.print("<tr align='center' bgcolor='azure'>");
out.print("<th>아이디</th><th>비밀번호</th><th>이름</th><th>이메일</th><th>가입일자</th><th>삭제</th>");
out.print("</tr>");
for (int i=0;i<memberList.size();i++) {
MemberVO memberVO = (MemberVO) memberList.get(i);
out.print("<tr>");
out.print("<td>"+memberVO.getId()+"</td><td>"+memberVO.getPwd()+"</td><td>"+
memberVO.getName()+"</td><td>"+memberVO.getEmail()+"</td><td>"+memberVO.getJoindate()+"</td>");
out.print("<td><a href='/servletdb/member4?command=delMember&id="+ memberVO.getId() +"'>삭제</a></td>"); ////
out.print("</tr>");
}
out.print("</table>");
out.print("<a href='/servletdb/memberForm.html'>새 회원 등록하기</a>");
out.print("</body></html");
}
}
=> http://localhost:8080/servletAPI/member5
화면 출력은 viewMembers에서 실행되지만 dispatch이므로 주소 유지됨
※ ctrl shift O => import 자동 수정
'Programming > 국비학원' 카테고리의 다른 글
220928 - 서블릿 - 쿠키, 세션 (0) | 2022.09.29 |
---|---|
220927 - 서블릿 - 서블릿 확장 API (ServletContext 클래스), 쿠키, 세션 (0) | 2022.09.28 |
220923 - 서블릿 - DB 연결, 커넥션풀 (0) | 2022.09.24 |
220922 - 서버 - 서블릿 예제 (0) | 2022.09.23 |
220921 - 서버 - 서블릿 매핑, 응답 및 요청 처리 (0) | 2022.09.22 |