MVC2 - (1)

2022. 10. 7. 16:27Dev.Program/Java & Spring

728x90

MVC2

  • 구조

< 환경변수 설정 >

  • 환경 변수 편집 창 열기(시스템 환경 변수 편집)

  • CLASSPATH / JAVA_HOME 폴더 있는 지 확인하기
  • CLASSPATH 편집!

> 톰캣 설치 된 폴더 탐색기에서 찾아보기

  • C:\Program Files\Apache Software Foundation\Tomcat 8.0\lib

  • servlet-api.jar 파일 복사

> 자바 jdk 로 가기

  • C:\Program Files\Java\jdk1.8.0_131\lib

  • servlet-api.jar 붙여넣기

 

> 다시 환경변수 편집

  • CLASSPATH 에 환경변수 설정해주기
  • %JAVA_HOME%\lib\servlet-api.jar

 

  • 새로 만들기

  • 톰캣 폴더 찾기! 찾은 후 확인

 

> 새로만들기 하나 더!

  • 디렉터리 찾아보기 클릭
  • jre 폴더

< 이클립스 설정 >

  • 이클립스 오른쪽 위 Open Perspective 누르기

  • Java EE 선택!
  • 워크스페이스 다시 설정! ⇒ 새폴더(workspace_jsp_model2 만들어서 경로설정)
  • 이클립스 재시작됨

 

  • C:\Program Files\Apache Software Foundation\Tomcat 8.0

 

p.556

cmd 창

> 데이터 베이스 새로 만들기

mysql> create database jsp_model2;

mysql> use jsp_model2

 

> 테스트용 테이블 하나 만들기

mysql> create table test(idx int);

mysql> insert into test values(1);

 

< 이클립스에서 설정하기 >

  • 우클릭

  • 이 파일은 우리한테 없는 파일! 일단 지우기
  • mysql-connector-java-5.1.47.jar 추가해주기

  • 위에는 밖에 표시하는 이름이고, 밑에는 실제 DB 이름
  • (위에는 이름 달라져도 됨! 보통은 헷갈려서 같게 설정함)

  • 테스트 해보기
  • (연결 성공하면 이 창 뜸)

Finish 누르면

  • 이렇게 추가되어있다!

  • 이 부분 누르면
  • 위에 이렇게 새창이 생김

 

  • SQL 구문 적고 실행할 때 (단축키 Alt + S)
  • 결과가 여기 나타남




  • Test 이름의 다이나믹 웹프로젝트 만들기

 

  • 8080 포트번호 찾아가기
  • <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
  • 추가해주기

 

======== Test 에서 index.jsp 만들기

  • 톰캣 Ctrl Alt R (우클릭 실행)

이제 Ctrl + F11 로 실행 안하고, 주소창에 주소 적어서 들어갈 것! (서블릿 사용할 때)

  • Ctrl + F11 로 실행할 시 나중에 문제가 생기기 때문에 이제 이렇게 실행안함

  • context.xml 복사해오기
  • 이렇게 기본 틀 빼고 다 지우기!
  • 여기에 이제 DB 연동하는 Connection Pool 만들 것!

p.571 - 커넥션풀 설정

p.443 - 커넥션풀 설명

 

< context.xml >

<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!-- DBCP 사용을 위한 환경 설정 -->
<Resource
name="jdbc/MySQL"
auth="Container"
type="javax.sql.DataSource"
username="root"
password="1234"
driverClassName="com.mysql.jdbc.Driver"
factory="org.apache.tomcat.dbcp.dbcp2.BasicDataSourceFactory"
url="jdbc:mysql://localhost:3306/jsp_model2"
maxActive="500"
/>
</Context>
  • 대소문자 구분!
  • name : 나중에 불러올 이름 ( 달라져도 됨 부를 때 잘 적으면 되니까 )
  • type : 인터페이스
  • maxActive 는 지금 우리가 가상으로 사용하기 때문에 500개 설정해도 8개만 반환될 거

 

======== dbcpTest.jsp

  • java.sql 패키지

  • javax.naming

 

  • 다운캐스팅 안해서 오류
  • 오류 사라짐!

 

  • javax.sql









# tip.

context.xml 에 root / 1234 를 적어놓으면 전부 노출됨 (또 아이디나 비밀번호가 바뀌면 서버 재시작 해야하기때문) 그래서 별로 좋지 않은 방법!

Properties 객체로 만드는 방법이나

이렇게 username, password 를 따로 적는 칸이 있다!

⇒ 실무에선 이렇게 쓰는게 좋다

 

 

< dbcpTest.jsp >

<%@page import="javax.sql.DataSource"%>
<%@page import="javax.naming.InitialContext"%>
<%@page import="javax.naming.Context"%>
<%@page import="java.sql.Connection"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
Connection con = null;

try {
// -------------- DBCP 사용을 위한 설정 ----------------
// context.xml 의 <Context> 태그 설정을 가져오기
Context initCtx = new InitialContext();

// context.xml 의 <Context> 태그 내의 <Resource> 태그 부분 가져오기
Context envCtx = (Context)initCtx.lookup("java:comp/env"); /* Context 타입으로 다운캐스팅 */
// ============================ 여기까지는 바뀔 일 없음!

// context.xml 의 JNDI(name 속성) 가져오기
DataSource ds = (DataSource)envCtx.lookup("jdbc/MySQL"); /* DataSource 타입으로 다운캐스팅 */

// DataSource 객체의 getConnection() 메서드를 호출하여 Connection 객체 가져오기
con = ds.getConnection();
out.println("<h1>DBCP 연결 성공!</h1>");
} catch(Exception e) {
out.println("<h1>DBCP 연결 실패!</h1>");
e.printStackTrace();
}
%>

 

p.580 - FrontController

  • ======== TestFrontController.java
  • 바로 상속 받는 방법

 

  • jsp 는 웹페이지만 새로고침 하면 되지만 java 파일이 바뀌면 Server 재시작 해줘야함 
  • Ctrl + Alt + R (재시작 단축키) ← 톰캣 누르고 단축키 누르기

 

  • 지금은 404 에러 뜸

  • 어노테이션 추가!

> 서버 재시작 하기!

  • 재시작 해보면 이제 404 에러는 안뜸!
  • 콘솔창에 syso 도 잘 나옴!

< TestFrontController.java >

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;

// 서블릿 클래스는 반드시 javax.servlet.http.HttpServlet 클래스를 상속받아 정의
// 서블릿 주소 요청을 감지하기 위해 클래스 선언부 위에
// @@WebServlet 어노테이션을 사용하여 "*.XXX" 형태의 문자열을 전달하면
// 요청 URL 주소에 XXX 형태로 끝나는 요청은 모두 서블릿 주소로 간주하여
// 현재 컨트롤러로 요청을 전달하게 됨
// ex) "*.bo" 문자열 전달 시 주소창에 XXXX.bo 로 끝나는 요청을 모두 서블릿 요청으로 처리함
@WebServlet("*.bo")
public class TestFrontController extends HttpServlet {
// HttpServlet 클래스를 상속받은 서블릿 클래스에서는
// HTTP 요청 방식 메서드(GET/POST)에 따라 자동으로 호출되는
// doGet(), doPost() 메서드 오버라이딩 하여 각 요청에 따른 처리 작업 기술해야함
// => GET/POST 방식 모두 처리할 작업이 동일하므로 두 메서드를 별도로 작성하지 않고
//    하나의 메서드로 통합하여 처리하기 위해 doProcess() 메서드를 정의하고 공통적으로 호출
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST 방식에서 한글 깨짐 문제 해결을 위해 인코딩 방식 UTF-8 설정
System.out.println("TestFrontController");
request.setCharacterEncoding("UTF-8");

String servletPath = request.getServletPath();
System.out.println("요청주소 : " + servletPath);
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 공통 작업을 처리하는 doProcess() 메서드를 호출하여 request, response 객체 전달
doProcess(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 공통 작업을 처리하는 doProcess() 메서드를 호출하여 request, response 객체 전달
doProcess(request, response);
}

}
  • 요청 주소까지 받아올 수 있다!

< 새 프로젝트 만들었을 때 다시 설정하는 방법 >

======== Test2 웹프로젝트 만들기

  • context.xml

 

  • /Test 만 쓰면 이거 하나만 불러오는 거! (특정 url만 불러오기)
  • 보통 main 만 불러올 때 이런식으로 씀! 잘 쓸 일 없다!

 

p.60

p.581

Test 프로젝트에서

< TestFrontController.java >

  • 추가

  • 출력창
  • requestURI : 입력한 주소
  • contextPath : 프로젝트 명
  • command : contextPath.length() ⇐ 5! 그래서 /Test/test.bo 여기의 인덱스 5번인 / 부터 test.do 까지 subString 으로 추출

⇒ 근데 이제 이 세개 쓸 일은 없고 request.getServletPath(); 이거 씀!

 

< 서블릿 주소 추출 >

1. 요청 URI 추출 => request 객체로부터 URI 추출

String requestURI = request.getRequestURI();
// "/프로젝트명/서블릿주소" 추출

2. 컨텍스트 경로 추출

String contextPath = request.getContextPath(); // "/프로젝트명" 추출

3. 서블릿 경로 추출

  • ⇒ URI 주소에서 컨텍스트 경로를 제외한 나머지 부분을 추출
String command = requestURI.substring(contextPath.length());
// "/서블릿주소" 추출

⇒ 이 세 과정을 묶어서 request.getServletPath(); 로 씀

 

> 위의 1 ~ 3 번까지 과정을 하나로 결합한 getServletPath() 메서드 사용

String servletPath = request.getServletPath();
System.out.println("요청주소 : " + servletPath);



======== test.jsp

<form action="InputTest.test" method="post">
<input type="text" name="id"/>
<input type="submit" value="이동">
</form>
  • body 에 추가
  • (실행창)
  • 이동 누르면
  • 주소창 바뀜
  • 콘솔창

 

< TestFrontController.java >

  • get 방식 post 방식에 syso 적기

 

다시 test.jsp로 돌아와서 이동해보면

< test.jsp >

  • POST 방식 요청한다고 콘솔창에 나옴!

 

< TestFrontController.java >

// 요청받은 서블릿 주소에 대한 판별 수행
if(command.equals("/InputTest.test")) {
String id = request.getParameter("id");
System.out.println("id : " + id);
}
  • 추가
  • 아이디 값도 들고옴!

 

======== Test.java 만들기

public class Test {
public void test() {

}
}

 

< Controller.java >

  • 인스턴스 안에 객체 생성하고, Create method 로 자동 메서드 만들기

 

< Test.java >

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Test {


public void test(HttpServletRequest request, HttpServletResponse response) {
try {
String id = request.getParameter("id");
System.out.println("아이디 : " + id);

response.sendRedirect("Result.test");
} catch (IOException e) {
e.printStackTrace();
}
}
}
  • try ~ catch 문에 넣기

 

> 다시 test.jsp 에서 아이디 입력해서 넘겨보기

  • 주소창 확인(Result.test)
  • 콘솔창 확인! (id 값 잘 가지고 다니는 것을 확인할 수 있다!)

 

======== MVC_Board 프로젝트 새로 만들기

  • context.xml 복사해오기

  • Controller 패키지 만들기

  • Servlet 으로 만들어보기

  • 자동으로 슈퍼클래스 되어있음! Class name 만 설정하기
  • Next 누르기

  • 이 부분이 어노테이션 부분!
  • 이거 Remove 하고 Add 눌러서 *.test 추가해주기
  • Next
  • doGet / doPost 자동 체크되어있다!

  • 자동완성! 간단하다!
  • 어노테이션 부분 *.test 도 자동으로 들어가있다!

 

 

======== BoardFrontController.java

< BoardFrontController.java >

@WebServlet("*.bo")
public class BoardFrontController extends HttpServlet {
     
protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String command = request.getServletPath();
System.out.println("주소 : " + command);
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doProcess(request, response);
}

}
  • TestFrontController.java 는 지우기!

p.570

======== 패키지 6개 만들기

  • controller / action / dao / db / svc / vo

 

======== db 패키지에 jdbcUtil.java 클래스 만들기

  • DB 관련 기본 기능들은 다 여기서 처리할 것!
  • (연결, 자원반환, commit, rollback 등)을 담당하는 클래스

  • java.sql

  • javax.naming

 

  • Surround ~ 눌러서 try ~ catch 로 묶어주기

  • 이 부분은 context.xml 의 name=”” 부분!

 

< jdbcUtil.java >

package db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class jdbcUtil {
// DB 관련 기본 기능(연결, 자원반환, commit, rollback 등)을 담당하는 클래스
// 1. DBCP 기능을 활용한 Connection 객체 가져오는 메서드 getConnection() 정의

public Connection getConnection() { // DBCP 로부터 전달받은

//  Connection 객체를 저장할 변수 선언
Connection con = null;

try {
// -------------- DBCP 사용을 위한 설정 ----------------
// context.xml 의 <Context> 태그 설정을 가져오기
Context initCtx = new InitialContext();

// context.xml 의 <Context> 태그 내의

// <Resource> 태그 부분 가져오기
Context envCtx = (Context)initCtx.lookup("java:comp/env"); /*Context 타입으로 다운캐스팅*/
// ============================ 여기까지는 바뀔 일 없음!
// context.xml 의 JNDI(name 속성) 가져오기
DataSource ds = (DataSource)envCtx.lookup("jdbc/MySQL");/* DataSource 타입으로 다운캐스팅 */

// DataSource 객체의 getConnection() 메서드를

// 호출하여 Connection 객체 가져오기
con = ds.getConnection();

// DB 작업에 대한 Auto Commit 기능 해제
con.setAutoCommit(false);

// 기본값은 true(=Auto Commit 활성화)
} catch (Exception e) {
e.printStackTrace();
}

return con; // Connection 객체 리턴
}

// 메서드 오버로딩을 활용하여

// Connection, PreparedStatement, ResultSet 객체 반환
public void close(Connection con) {
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

public void close(PreparedStatement pstmt) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

public void close(ResultSet rs) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

// Auto Commit 해제로 인해 Commit, Rollback 기능을 수행하는 

// 각각의 메서드 정의
public void commit(Connection con) {
try {
con.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}

public void rollback(Connection con) {
try {
con.rollback();
} catch (SQLException e) {
e.printStackTrace();
}
}

}

 

  • Connection 에서 이 작업이 이루어졌기 때문에
  • 여기서 Connection 을 받아오는 것!

 

======== vo (value object)패키지에서 ActionForward.java 클래스 만들기

우리 사용했던 자바빈 처럼 뭔가를 담아놓는 패키지!

575p

< ActionForward.java >

package vo;

public class ActionForward {
/*
* 서블릿에서 클라이언트로부터 요청을 받아 처리 후

* View 페이지로 포워딩 할 때
* 이동할 View 페이지의 URL(주소)와 

* 포워딩 방식(Dispatch or Redirect)을 다루기 위한 클래스
*/

private String path; // 포워딩 할 View 페이지의 URL 을 저장할 변수
private boolean redirect; // 포워딩 방식을 저장할 변수

  // (true : Redirect, false : Dispatch)

public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return redirect;
}
public void setRedirect(boolean redirect) {
this.redirect = redirect;
}

}

 

143



> Test 프로젝트로 이동

test.jsp 복사해서 Test 프로젝트에 Dispatcher_test.jsp / Redirect_test.jsp 만들기

< Dispatcher_test.jsp >

<form action="DispatcherTest.test" method="post">
<input type="text" name="id"/>
<input type="submit" value="이동">
</form>

 

< Redirect_test.jsp >

<form action="RedirectTest.test" method="post">
<input type="text" name="id"/>
<input type="submit" value="이동">
</form>

 

< TestFrontController.java >

if(command.equals("/InputTest.test")) {
String id = request.getParameter("id");
System.out.println("id : " + id);

Test test = new Test();
test.test(request, response);
} else if(command.equals("/DispatcherTest.test")) {
// Dispatcher 방식으로 포워딩

// (주소표시줄 변경 X, request 객체가 공유됨)
// => request 객체의 getRequestDispatcher() 메서드를 

// 호출하여 포워딩 할 페이지 전달
//    => RequestDispatcher 객체가 리턴됨
RequestDispatcher dispatcher = request.getRequestDispatcher("dispatcher_result.jsp");
// => RequestDispatcher 객체의 forward() 메서드를

//  호출하여 request, response 객체 전달
dispatcher.forward(request, response); 

// 두 객체를 가지고 지정된 페이지로 포워딩 수행
} else if(command.equals("/RedirectTest.test")) {
// Redirect 방식으로 포워딩

// (주소표시줄 변경 O, request 객체가 공유되지 않음)
// => response 객체의 sendRedirect() 메서드를 호출하여

//  포워딩 할 페이지 전달
response.sendRedirect("redirect_result.jsp"); 

// 지정된 페이지로 포워딩
}
  • if 문에 else if 문 추가!

 

  • javax.servlet

 

======== dispatcher_result.jsp / redirect_result.jsp 만들기

request 파라미터 : <%=request.getParameter("id") %>
  • 각 jsp 파일에 body 에 한 줄 추가!

 

> dispatcher_test.jsp 실행

  • 실행창
  • admin 입력 후 이동
  •  
  • admin 값 가져옴
  • 요청한 주소가 유지

 

> redirect_test.jsp 실행

  • 똑같이 admin 입력 후 이동
  • .test 가 아닌 redirect_result.jsp 창이 나옴! id 값도 null 값 뜸!
  • 요청한 주소(.test)가 아닌 이동하는 페이지(redirect_result.jsp)로 바뀜

 

⇒ 둘의 차이점은 1) 주소창 2) 아이디값



> 다시 MVC_Board 프로젝트로 돌아가기

< BoardFrontController.java >

protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST 방식 한글 처리
request.setCharacterEncoding("UTF-8");

// 서블릿 주소 가져오기
String command = request.getServletPath();

// "BoardList.bo" 와 "BoardWriteProAction.bo" 주소 판별
if(command.equals("/BoardList.bo")) {
// BoardList.bo 서블릿 주소가 요청되면

// BoardListAction 클래스의 인스턴스를 생성하여
// 글목록 가져오기 작업을 수행하기 위해

// 메서드를 호출하여 작업 처리
BoardListAction action = new BoardListAction();
action.getList();
} else if (command.equals("/BoardWritePro.bo")) {
// BoardWritePro.bo 서블릿 주소가 요청되면

// BoardWriteProAction 클래스의 인스턴스를 생성하여
// 입력받은 글쓰기 폼 내용을 저장하는 작업을 수행하기 위해

// 메서드 호출
BoardWriteProAction action = new BoardWriteProAction();
action.write();
}
}
  • 지금은 if 문(else~ if문) 안에 저렇게 길게 적는데 나중에는 interface를 implements 해서 쓸 거! 그럼 코드 간편해진다

574

 

action 패키지에서

======== BoardListAction.java / BoardWriteProAction.java 클래스 만들기

  • 일단 각 getList() 메서드와 write() 메서드 만들어두기 (나중에 지울 거!)

 

다시 다 지우고

action 패키지에서

======== Action.java (인터페이스로 만들기)

package action;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import vo.ActionForward;


public interface Action {
/*
* - 서블릿 요청이 들어올 때 각 요청에 따른 다른 클래스들의 객체를 생성하여
*   요청을 처리해야하는 데, 이 때 공통 부모인 Action 인터페이스를 정의하여
*   추상메서드를 각 Action 클래스에서 구현하도록 강제하면
*   다형성을 통해 하나의 Action 인터페이스 타입으로

 *   Action 클래스를 관리할 수 있음
* - 각 요청을 받아들일 execute() 메서드를 통해

 *   request, response 객체를 전달받고
*   이동할 URL과 포워딩 방식이 저장된 ActionForward타입 객체를 리턴하도록 함
*/
public ActionForward execute(HttpServletRequest request,
HttpServletResponse response) throws Exception;
}

 

< BoardListAction.java / BoardWriteProAction.java >

  • implements Action 후 Add unimplemented methods 눌러서 추상메서드 구현하기
  • 둘 다 공통의 부모(Action)를 가짐!

 

< BoardFrontController.java >

protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST 방식 한글 처리
request.setCharacterEncoding("UTF-8");

// 서블릿 주소 가져오기
String command = request.getServletPath();

Action action = null;
ActionForward forward = null;

// "BoardList.bo" 와 "BoardWriteProAction.bo" 주소 판별
if(command.equals("/BoardList.bo")) {
action = new BoardListAction();
action.execute(request, response);
} else if (command.equals("/BoardWritePro.bo")) {
action = new BoardWriteProAction();
action.execute(request, response);
}
}
  • 위에 코드와 비교했을 때 엄청 짧아짐!

  • action 리턴타입이 Actionforward기 때문에 forward 에 저장해줄 것!
  • 여기 오류 부분은
    Exception 으로 바꾸면 해결됨!

> 이 if 문 바깥에서 포워딩작업을 공통으로 수행

protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// POST 방식 한글 처리
request.setCharacterEncoding("UTF-8");

// 서블릿 주소 가져오기
String command = request.getServletPath();

Action action = null;
ActionForward forward = null;

// "BoardList.bo" 와 "BoardWriteProAction.bo" 주소 판별
if(command.equals("/BoardList.bo")) {
action = new BoardListAction();
forward = action.execute(request, response);
} else if (command.equals("/BoardWritePro.bo")) {
action = new BoardWriteProAction();
forward = action.execute(request, response);
}

// ActionForward 객체 내의 포워딩 방식에 따라 각각의 포워딩 작업 수행
if(forward != null ) {
// ActionForward 객체 내의 포워딩 방식(Redirect or Dispatcher) 판별
if(forward.isRedirect()) { // Redirect 방식
response.sendRedirect(forward.getPath());
} else { // Dispatcher 방식
RequestDispatcher dispatcher = request.getRequestDispatcher(forward.getPath());
dispatcher.forward(request, response);
}
}
}
  • 공통으로 수행되는 포워딩 작업 (추가부분)
  • 책 581

 

Ctrl + Shift + O

  • Import 정리해주는 단축키 (없는 거 추가, 안쓰는 거 제거)

 

======== WebContent에 board 폴더 만들기

======== board 폴더에 qna_board_write.jsp 만들기

======== WebContent에 main.jsp 만들기

< main.jsp >

<h1>메인 페이지</h1>
  • body 부분에 추가

< qna_board_write.jsp >

<h1>글쓰기</h1>
<form action="BoardWritePro.bo" method="post">
<input type="submit" value="글쓰기"/>
</form>
  • body 부분에 추가

< BoardFrontController.java >

// if문을 사용하여 서블릿주소 판별 및 각 요청처리를 위한 작업요청
if(command.equals("/BoardWriteForm.bo")) {
// 글쓰기 페이지 요청은 비즈니스 로직이 없는

// View 페이지(JSP)로 바로 연결 수행
// ⇒ ActionForward 객체의 포워딩 방식을

// 별도로 설정하지 않음(기본값 false : Dispatcher)
// 주소 변경없음!
forward = new ActionForward();
// forward.setRedirect(false); 

// 포워딩 방식을 Dispatcher 방식으로 설정
// (기본값이라 생략가능)
forward.setPath("/board/qna_board_write.jsp");

// 이동할 View 페이지 경로 지정
} else if(command.equals("/BoardWritePro.bo")) {

}
  • if 문 변경!



  • 요청한 서블릿 주소 (프로젝트명/서블릿주소)

  • jsp 파일에서 Ctrl+F11 로 실행했을 때 창
  • 프로젝트명/폴더명/파일명
  • 그래서 Ctrl+F11 로 실행하면 안됨! (주소가 달라지기 때문!)

 

< main.jsp >

<h2><a href="BoardWriteForm.bo">글쓰기 페이지</a></h2>
  • body 에 추가

> 실행해보기

  • 글쓰기 페이지 눌러보기
  • 주소창 확인

⇒ 여기까지가 Dispatcher 방식

 

======== action 패키지에서 BoardWriteProAction.java 만들기

  • 만들 때 Action 인터페이스 상속받기(implements)

 

< BoardWriteProAction.java >

public class BoardWriteProAction implements Action {

@Override
public ActionForward execute(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("BoardWriteProAction");
return null;
}

}
  • syso로 출력만 해보기(구현은 나중에 할 거)

 

< BoardFrontController.java >

  • else if 문 완성시키기
else if(command.equals("/BoardWritePro.bo")) {
// BoardWriteProAction 클래스 인스턴스 생성 => Action 타입으로 업캐스팅
action = new BoardWriteProAction();
// 공통 메서드인 execute() 메서드를 호출하여 request, response 객체 전달
try {
forward = action.execute(request, response);
} catch (Exception e) {
e.printStackTrace();
}

 

main.jsp 에서 실행 시작!

  • 글쓰기 페이지로 이동

  • 글쓰기 버튼 누르기
  • 콘솔창에 글자 뜨면 성공!



728x90

'Dev.Program > Java & Spring' 카테고리의 다른 글

MVC2 - (3)  (0) 2022.10.07
MVC2 - (2) Service 클래스  (0) 2022.10.07
자바 Swing(스윙) - (5)  (0) 2022.10.06
자바 Swing(스윙) - (4)  (0) 2022.10.06
자바 Swing(스윙) - (3)  (0) 2022.10.06