Servlet게시판1: 기초

web.xml코드 추가

1
2
3
4
5
6
7
8
9
<!-- Model2 게시판  -->
<servlet>
<servlet-name>BoardFrontController</servlet-name>
<servlet-class>com.itwillbs.board.action.BoardFrontController</servlet-class> <!-- 컨트롤로 주소와 동일하게 -->
</servlet>
<servlet-mapping>
<servlet-name>BoardFrontController</servlet-name>
<url-pattern>*.bo</url-pattern>
</servlet-mapping>




src폴더아래에 새로운 패키지와 BoardFrontController.java생성

  1. extends HttpServlet상속을 해야 컨트롤러의 역할이 가능하다. 상속하지않으면 클래스명만 controller일 뿐 그냥 일반 클래스임.
  2. doGet(), doPost() 오버라이딩
  3. 주소 매핑
  4. 주소비교 후 처리
  5. 페이이지이동 : True면 sendRedirect이동방식, False면 forward이동 방식
    • true면 sendRedirect방식으로 이동
    • 사용처: 주소와 화면의 전환이 동시에 일어날때 (가상주소 .bo -> 가상주소로 .bo)
    • false면 forward방식으로 이동
    • 사용처: 주소는 그대로인데 화면이 바뀔때 (가상주소 .bo에서 request객체정보를 가지고 이동하면서 .jsp를 보여줌)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
public class BoardFrontController  extends HttpServlet{

// 일반 클래스를 서블릿을 상속해서 컨트롤러 역활 할수있도록 설정

protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doProcess() 호출 (페이지 GET/POST방식 모두 사용호출)");

//1. 주소 매핑
System.out.println("--------------@ 주소 매핑 @-------------");
// requestURI : /Model2JSP7/test.me
// 프로젝트명 + 주소
String requestURI = request.getRequestURI();
System.out.println(" requestURI : " + requestURI);

// contextPath : /Model2JSP7
// 프로젝트명
String contextPath = request.getContextPath();
System.out.println(" contextPath : " + contextPath);

// 가상주소
// /test.me
String command = requestURI.substring(contextPath.length());
System.out.println(" command(가상주소) : " + command);


//2. 주소비교 후 처리
System.out.println("--------------@ 주소 비교 후 처리 @-------------");
Action action = null;
ActionForward forward = null;

}//end of 주소비교후처리(command)


//3. 페이이지이동
System.out.println("-----------------@ 페이지 이동 @--------------");
if(forward != null){ // 이동할 정보(setPath과setRedirect)가 있는 경우
if(forward.isRedirect()){ //True면 sendRedirect이동방식, False면 forward이동 방식
//true면 sendRedirect방식으로 이동
//사용처: 주소와 화면의 전환이 동시에 일어날때 (가상주소 `.bo` -> 가상주소로 `.bo`)
System.out.println("컨트롤러: "+forward.getPath()+"로 이동(sendRedirect이동방식)");
response.sendRedirect(forward.getPath());
}else{
//false면 forward방식으로 이동
//사용처: 주소는 그대로인데 화면이 바뀔때 (가상주소 `.bo`에서 request객체정보를 가지고 이동하면서 `.jsp`를 보여줌)
//RequestDispatcher dis = new RequestDispatcher(forward.getPath()); 인터페이스이므로 new연산자를 이용한 객체생성 불가
System.out.println("컨트롤러: "+forward.getPath()+"로 이동(forward이동방식)");
RequestDispatcher dis = request.getRequestDispatcher(forward.getPath());
dis.forward(request, response);
}

}

}//end of doProcess

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet호출");
doProcess(req, resp);
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost호출");
doProcess(req, resp);
}

}




ActionForward.java 생성

  • sendRedirect 이동방식 : 주소와 화면의 전환이 동시에 일어날때 (가상주소 -> 가상주소로 )
  • forward 이동방식 : 주소는 그대로인데 화면이 바뀔때 (가상주소에서 jsp보여줌)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class ActionForward {

//1.외부접근 못하도록 이동할 페이지와 이동할 방식 멤버변수 생성
private String path;
private boolean isRedirect;
// true면 sendRedirect방식으로 이동
//사용처: 주소와 화면의 전환이 동시에 일어날때 (가상주소 -> 가상주소로 )
// false면 forward방식으로 이동
//사용처: 주소는 그대로인데 화면이 바뀔때 (가상주소에서 jsp보여줌)
//2. getter setter생성
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}

//3.toString
@Override
public String toString() {
return "ActionForward [path=" + path + ", isRedirect=" + isRedirect + "]";
}
}




Action.java생성

1
2
3
4
5
6
7
public interface Action {
//상수, 추상메서드 사용가능
//1. 추상 메서드 작성
public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) throws Exception;


}//end of interface




BoardDTO.java 생성

  • BoardBean.java 생성 대신 BoardBean.java 생성
  • DTO(Data Transfer Object) 데이터 전송 객체
    • DTO = bean = VO 동일한 역할
    • JavaBeans 규칙을 따름
    • DB에 정보를 가진 객체
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//1번규칙만족 : 클래스는 public
public class BoardDTO {
//2번규칙만족 : 멤버변수선언 private
private int bno;
private String name;
private String pw;
private String subject;
private String content;
private int readcount;
private int re_ref;
private int re_lev;
private int re_seq;
private Date date;
private String file;
private String ip;

//4번규칙만족 : 기본생성자존재하지만 생략됨
//public BoardBean(){}

//3번규칙만족 : 멤버변수마다 별도의 get/set메소드가 존재해야한다.
public int getBno() {
return bno;
}
(중략)
//5. toString()
@Override
public String toString() {
return "BoardBean [bno=" + bno + ", name=" + name + ", pw=" + pw + ", subject=" + subject + ", content="
+ content + ", readcount=" + readcount + ", re_ref=" + re_ref + ", re_lev=" + re_lev + ", re_seq="
+ re_seq + ", date=" + date + ", file=" + file + ", ip=" + ip + "]";
}
}




BoardDAO.java 생성

  • DB연결 메서드 생성
  • 자원해제 메서드 생성
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class BoardDAO {
Connection con = null;
String sql = "";
PreparedStatement pstmt = null;
ResultSet rs = null;

//디비연결
private void getCon() throws Exception{
Context init = new InitialContext(); //업캐스팅
// 고정문구"java:comp/env/다른문구context파일의 name값입력"
DataSource ds = (DataSource) init.lookup("java:comp/env/jdbc/mysqlDB");
con = ds.getConnection();
System.out.println("DAO: 디비연결성공"+con);
}//getCon닫음

//자원해제 메서드 구현
public void closeDB(){
try{
if(rs != null) rs.close();
if(pstmt != null) pstmt.close();
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}//closeDB닫음
}