2022. 10. 7. 16:27ㆍDev.Program/Java & Spring
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 에서 실행 시작!
- 글쓰기 페이지로 이동
- 글쓰기 버튼 누르기
- 콘솔창에 글자 뜨면 성공!
'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 |