티스토리 뷰
1. MVC(Model, View, Controller)
웹 애플리케이션을 비즈니스 로직, 프레젠테이션 로직, 데이터로 분리하는 디자인 패턴(소프트웨어 설계)
비즈니스 로직 | 프레젠테이션 | 요청 처리 데이터 |
애플리케이션의 데이터, 즉 고객, 제품, 주문 정보의 조작 용어 |
애플리케이션이 사용자에게 표시 위치, 폰트, 크기 - (View) |
비즈니스 로직 + 프레젠테이션 파트 묶기 |
(1) MVC 패턴 구성 요소
-모델(Model) : 애플리케이션의 데이터와 비즈니스 로직 담는 객체
-뷰(View) : 사용자에게 모델의 정보(데이터)를 보여주는 역할(HTML). 비즈니스 로직 미포함. 오직 화면에 보여지는 것만.
-컨트롤러(Controller) : 모델과 뷰 사이에 어떤 동작이 있을 때, 조정하는 역할.
2. MVC 패턴 구조
요청 처리가 이루어지는 위치(JSP or Servlet) : 모델1(JSP), 모델2(Servlet)
모델1 | 모델2 | |
요청 처리 | JSP | Servlet |
장점 | 구조 단순. 구현 용이 복잡한 설정 필요없음. 빠른 개발 가능. |
뷰 코드 / 자바 코드 분리. 간결한 코드. 분업, 유지 보수, 확장 용이 |
단점 | 뷰 코드(출력) + 자바 코드(컨트롤러) → 분업 용이치 않음. 코드 복잡. 유지 보수 어려움 |
구조 복잡. 작업량 많음. 개발 초기에 설정할 부분이 많기에. |
(1) 모델 1 - 지금까지 배웠던 방식
-JSP로만 구현한 웹 애플리케이션. 웹 브라우저 요청을 JSP페이지가 받아서 처리. - JSP가 핵심역할
-JSP페이지 : 비즈니스 로직 처리 코드 + 웹 브라우저 결과 출력 코드
웹 브라우저 클라이언트 |
↔ | 컨트롤러 + 뷰 (JSP페이지) |
↔ | 모델 (자바 빈즈) |
↔ | 데이터베이스 |
(2) 모델 2
-모듈화 : 컨트롤러(서블릿)가 클라이언트 요청 처리, 응답 처리, 비즈니스 로직 처리 등의 흐름을 제어
웹 브라우저 (클라이언트) |
→ | 컨트롤러 (서블릿) |
↔ | 모델 (자바 빈즈) |
↔ | 데이터베이스 |
↓ | ||||||
↑ | ← | 뷰 (JSP 페이지) |
-컨트롤러(Servlet) : 모든 흐름 제어
-모델 : 요청에 대한 로직을 처리할 자바빈즈나 자바 클래스
-뷰 : 요청 결과를 출력할 JSP페이지
3. MVC 패턴 구현 - 모델1
#예제) get 방식, post 방식 호출
-필요 : 입력 폼 페이지(jsp 파일), 메소드서블릿(Servlet 파일),
(1) 입력 폼 페이지
이름과 주소를 입력받는 폼 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h3>get 방식 - 한글 깨짐 방지</h3>
<form method="get" action="info"> <!--info 서블릿 호출-->
<p> 이름 : <input type="text" name="name"/></p>
<p> 주소 : <input type="text" name="addr"/></p>
<p><input type="submit" value="전송"/></p>
</form>
</body>
</html>
(2) 서블릿(Servlet)
프로젝트(Dynamic Web Project)의 src/main/java 폴더
>> Servlet 생성 : 패키지 이름, 서블릿 이름 / URL : /info 변경 / doGet 방식 체크(나중에 호출할 때, /info로 호출)
★한글 깨짐 방지 처리를 해주지 않으면, 입력받은 한글이 깨져서 출력됨.
package servlet;
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;
/**
* Servlet implementation class InfoServlet
*/
@WebServlet("/info") // URL 이름으로 form 태그에서 action="info"하면 info.servlet 실행
public class InfoServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public InfoServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 처리 안 했을 때,
String name = request.getParameter("name");
String addr = request.getParameter("addr");
//ctrl + shift + o(임포트)
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.println("당신이 입력한 정보입니다.<br>");
out.println("이름 : "+name+"<br>");
out.println("주소 : "+addr);
out.print("</body></html>");
out.close();
}
}
-출력 결과(한글 깨짐 방지 처리 안 했을 때,
입력 폼에서 이름 : 홍길동, 주소 : 부산시 입력하면 아래와 같이 출력됨.
??? ??? ?????. ?? : ??? ?? : ??? |
★한글 깨짐 방지 처리(서블릿에서)_위의 서블릿에서 수정한 부분만 가져옴.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 깨짐 방지 처리
response.setContentType("text/html; charset=utf-8");
String name = request.getParameter("name");
String addr = request.getParameter("addr");
//ctrl + shift + o(임포트)
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.println("당신이 입력한 정보입니다.<br>");
out.println("이름 : "+name+"<br>");
out.println("주소 : "+addr);
out.print("</body></html>");
out.close();
}
-출력 결과
(입력 폼에서 이름 : 홍길동, 주소 : 부산시 입력했을 때,)
당신이 입력한 정보입니다. 이름 : 홍길동 주소 : 부산시 |
(+) 한글 처리하는 방법 2
Servers 폴더 >> 톰캣 >> Server.xml >> [ctrl] + [f] : '<connect' 찾기 >> <Connect> 태그 안에 URIEncoding="utf-8" 추가
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8082" protocol="HTTP/1.1" redirectPort="8443"/>
입력 폼 페이지 method_post.jsp
<h3>post 방식 - 한글 깨짐 방지 </h3>
<form action="info" method="post">
<p> 이름 : <input type="text" name="name"/></p>
<p> 주소 : <input type="text" name="addr"/></p>
<p><input type="submit" value="전송"/></p>
</form>
그리고
InfoServlet.java 파일에서 doPost 추가해서 한글 깨짐 방지 해줘야 함. 캐릭터셋 utf-8
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=utf-8");
//한글 처리했을때,
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
String addr = request.getParameter("addr");
PrintWriter out = response.getWriter();
out.print("<html><body>");
out.println("당신이 입력한 정보입니다.<br>");
out.println("이름 : "+name+"<br>");
out.println("주소 : "+addr);
out.print("</body></html>");
out.close();
}
-출력 결과
당신이 입력한 정보입니다. 이름 : 홍길동 주소 : 부산시 |
#예제) ContextPath 변경하는 방법
ContextPath는 http://localhost8082/text/info
(1) 톰캣 Servers 모듈즈(Modules)
이미 서버에 들어 있는 거면,
Servers >> 톰캣 서버 더블 클릭 >>모듈즈(Modules) >> 톰캣 서버에 들어가 있는 프로젝트 들이 표시
Document Case(실제 경로, 저장된), Path(주소에 나오는 것)
프로젝트 클릭 >> Edit > Path : 원하는 걸로 변경 >> 저장 후 서버 재시작
(2) Server.xml에서 변경
Servers 폴더 >> Server.xml >> <Context> 태그에 path있는데 거기서 수정 가능
<Context docBase="00testJSP" path="/00testJSP" reloadable="true" source="org.eclipse.jst.jee.server:00testJSP"/>
(3) Dynamic Web Project 생성할 때, 설정
Dynamic Web Project 생성할 때, Context root에 입력한 것이 Path 설정한 것과 동일
ex)
프로젝트 이름 example / Context root : bbb 설정했을 때, jsp파일을 작성하고 실행(Run As) 했을 때,
프로젝트 이름은 example인데 실제 호출은 아래와 같음.
http://localhost:8082/bbb/NewFile.jsp |
4. MVC 패턴 구현 - 모델 2
게시판 작성 예제로 구현
(0) 테이블 작성
sql에서 테이블 생성하고 데이터 입력
CREATE TABLE BOARD(
NUM NUMBER(5) PRIMARY KEY,
PASS VARCHAR2(30),
NAME VARCHAR2(30),
EMAIL VARCHAR2(30),
TITLE VARCHAR2(50),
CONTENT VARCHAR2(1000),
READCOUNT NUMBER(4) DEFAULT 0,
WRITEDATE DATE DEFAULT SYSDATE
);
CREATE SEQUENCE BOARD_SEQ
START WITH 1
INCREMENT BY 1;
INSERT INTO BOARD(NUM, NAME, EMAIL, PASS, TITLE, CONTENT)
VALUES(BOARD_SEQ.NEXTVAL, '성윤정', 'pinksung@nate.com', '1234',
'첫방문', '반갑습니다.');
INSERT INTO BOARD(NUM, NAME, EMAIL, PASS, TITLE, CONTENT)
VALUES(BOARD_SEQ.NEXTVAL, '성윤정', 'pinksung@nate.com', '1234',
'김밥', '맛있어요.');
INSERT INTO BOARD(NUM, NAME, EMAIL, PASS, TITLE, CONTENT)
VALUES(BOARD_SEQ.NEXTVAL, '천수빈', 'raccon@nate.com', '3333',
'고등어', '등푸른생선');
INSERT INTO BOARD(NUM, NAME, EMAIL, PASS, TITLE, CONTENT)
VALUES(BOARD_SEQ.NEXTVAL, '전원자', 'one@naver.com', '1111',
'갯골마을', '왜지감겹살 맛있습니다.');
COMMIT;
SELECT * FROM BOARD;
└작성 결과(sqldeveloper에서 확인)
(1) 프로젝트 생성
(1-1) New Dynamic Project
프로젝트 생성 : Content directory : WebContent
WEB-INF >> lib 폴더에 jar 파일 복사 붙여넣기(jstl.jar / ojdbc6.jar / servlet-api.jar / standar.jar)
(1-2) Server.xml
새로 만든 프로젝트(00exMVC)를 실행(Run As) >> Server 폴더 >> 톰캣 >> server.xml 클릭
>> 새로 만든 프로젝트의 Context가 추가된 것을 확인할 수 있음(실행했을때, 오류나는 건 괜찮음)
>> 데이터베이스 연결(loading) : 작업할 프로젝트의 <Context>에 추가
<Context docBase="00mvcBoard" path="/00mvcBoard" reloadable="true" source="org.eclipse.jst.jee.server:00mvcBoard">
<!-- DB 접속 정보 추가 -->
<Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:XE"
username="scott" password="tiger"
maxActive="20" maxIdle="10" maxWait="-1"/>
</Context>
(*만약에 서버 오류나면 이클립스 리스타트 해줄 것)
(2) 데이터베이스 접속 파일 생성 DBManager.class
src/main/java >> class 생성 : 패키지 이름 util / 클래스 이름 DBManager
package util;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class DBManager {
public static Connection getConnection() {
//객체 생성
Connection conn = null;
//server.xml 에서 Resource 정보 가져오기
try {
Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
//jdbc/myoracle이란 이름의 객체를 찾아서 DataSource가 받음
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
conn = ds.getConnection();
} catch (Exception e) {
e.printStackTrace();
}
return conn;
}
//select 수행 후 리소스 해제 메소드
public static void close(Connection conn, Statement stmt, ResultSet rs) {
try {
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
//DML(insert, update, delete) 수행 후 리소스 해제 메소드
public static void close(Connection conn, Statement stmt) {
try {
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
(3) 데이터 클래스 생성 - (모델 생성)
-생성 : src/main/java >> 클래스 생성 : 패키지 이름 com.board.dto / 클래스 이름 BoardVO
멤버 변수, 접근자, 설정자 생성
package com.board.dto;
import java.sql.Timestamp;
public class BoardVO {
//DTO(Data Transfer Ogject)
//VO(Value Object)
//이름은 다르지만 역할은 같음. 디비 데이터 ?? 클래스 선언? 생성?
private int num;
private String name;
private String email;
private String passwd;
private String title;
private String content;
private int readCount;
private Timestamp writedate;
//getter, setter
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getPasswd() {
return passwd;
}
public void setPasswd(String passwd) {
this.passwd = passwd;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getReadCount() {
return readCount;
}
public void setReadCount(int readCount) {
this.readCount = readCount;
}
public Timestamp getWritedate() {
return writedate;
}
public void setWritedate(Timestamp writedate) {
this.writedate = writedate;
}
}
(4) 모델 생성 - BoardDAO.java
-생성 : src/main/java >> 클래스 생성 : 패키지 이름 com.board.dao / 클래스 이름 BoardDAO.
게시글 입력 / 수정 / 조회 / 삭제 등의 내용을 담고 있는 메소드(?). 계속 사용할 것이기 때문에 싱글톤 패턴
(*싱글톤 패턴 : 한번만 선언. 생성한 인스턴스로 클래스 만들어 나감)
(*DAO(Data Access Object) : 데이터베이스 연동. SELECT, INSERT 등을 자바코드로 작성하는 것)
package com.board.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.board.dto.BoardVO;
import util.DBManager;
public class BoardDAO {
//DAO(Data Access Object)
// 데이터베이스와 연동. SELECT, INSERT 등을 자바코드로 작성해주는 것.
//DAO는 계속 사용할 거기 때문에 싱글톤 패톤
//싱글톤 패톤(한번만 선언. 생성한 인스턴스로 클래스를 만들어 나감)
private BoardDAO() {
}
//다른데선 객체 생성할 필요없이 getInstance로 접근하면 됨.
private static BoardDAO instance = new BoardDAO();
//어디서든 접근할 수 있도록 public static
public static BoardDAO getInstance() {
return instance;
}
//게시글 조회
public List<BoardVO> selectAllBoards(){
String sql = "SELECT * FROM BOARD ORDER BY NUM DESC";
List<BoardVO> list = new ArrayList<BoardVO>();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//DB 연동
try {
conn = DBManager.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
while(rs.next()) {
BoardVO bVo = new BoardVO();
bVo.setNum(rs.getInt("num"));
bVo.setName(rs.getString("name"));
bVo.setEmail(rs.getString("email"));
bVo.setPasswd(rs.getString("pass"));
bVo.setTitle(rs.getString("title"));
bVo.setContent(rs.getString("content"));
bVo.setReadCount(rs.getInt("readcount"));
bVo.setWritedate(rs.getTimestamp("writedate"));
list.add(bVo);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
DBManager.close(conn, stmt, rs);
}
return list;
}
//글 쓸 때 insert 메소드
//PreparedStatement 방법 사용
public void insertBoard(BoardVO bVo) {
String sql = "INSERT INTO BOARD(NUM, NAME, EMAIL, PASS, TITLE, CONTENT)"+
"VALUES(BOARD_SEQ.NEXTVAL, ?, ?, ?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bVo.getName()); //사용자 입력값
pstmt.setString(2, bVo.getEmail());
pstmt.setString(3, bVo.getPasswd());
pstmt.setString(4, bVo.getTitle());
pstmt.setString(5, bVo.getContent());
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBManager.close(conn, pstmt);
}
}
// 조회수 증가
// PreparedStatement 방법 사용
public void updateRead(String num) { // 매개변수로 num을 받아와 쿼리문에 넣어줌.
String sql = "UPDATE BOARD SET READCOUNT = READCOUNT + 1 WHERE NUM = ?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, num); // 매개변수로 num을 받아와 쿼리문에 넣어줌
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
} finally {
DBManager.close(conn, pstmt);
}
}
//상세글 작성
public BoardVO selectOneBoardByNum(String num) {
String sql = "SELECT * FROM BOARD WHERE NUM = ?";
BoardVO bVo = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, num);
rs = pstmt.executeQuery();
if (rs.next()) {
bVo = new BoardVO();
bVo.setNum(rs.getInt("num"));
bVo.setName(rs.getString("name"));
bVo.setEmail(rs.getString("email"));
bVo.setPasswd(rs.getString("pass"));
bVo.setTitle(rs.getString("title"));
bVo.setContent(rs.getString("content"));
bVo.setReadCount(rs.getInt("readcount"));
bVo.setWritedate(rs.getTimestamp("writedate"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBManager.close(conn, pstmt, rs);
}
return bVo;
}
//게시글 수정
public void updateBoard(BoardVO bVo) {
String sql = "UPDATE BOARD SET NAME = ?, EMAIL = ?, PASS = ?, "
+ "TITLE = ?, CONTENT = ? WHERE NUM = ?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bVo.getName());
pstmt.setString(2, bVo.getEmail());
pstmt.setString(3, bVo.getPasswd());
pstmt.setString(4, bVo.getTitle());
pstmt.setString(5, bVo.getContent());
pstmt.setInt(6, bVo.getNum());
pstmt.executeUpdate();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBManager.close(conn, pstmt);
}
}
//패스워드 확인 - 상세글 내용 복사 후 수정
public BoardVO checkPassWord(String passwd, String num) {
String sql = "SELECT * FROM BOARD WHERE PASS = ? AND NUM = ?";
BoardVO bVo = null;
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, passwd);
pstmt.setString(2, num);
rs = pstmt.executeQuery();
if (rs.next()) {
bVo = new BoardVO();
bVo.setNum(rs.getInt("num"));
bVo.setName(rs.getString("name"));
bVo.setEmail(rs.getString("email"));
bVo.setPasswd(rs.getString("pass"));
bVo.setTitle(rs.getString("title"));
bVo.setContent(rs.getString("content"));
bVo.setWritedate(rs.getTimestamp("writedate")); //상세글에 없는데 추가해야 될 수도
bVo.setReadCount(rs.getInt("readcount"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
DBManager.close(conn, pstmt, rs);
}
return bVo;
}
//게시글 작성
public void deleteBoard(String num) {
String sql = "DELETE FROM BOARD WHERE NUM = ?";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, num);
pstmt.executeQuery();
} catch (Exception e) {
e.printStackTrace();
}finally {
DBManager.close(conn, pstmt);
}
}
}
(5) 컨트롤러 : 서블릿
-생성 : src/main/java >> servlet 생성 : com.board.controller / 클래스 이름 BoardServlet.java
package com.board.controller;
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;
import com.board.controller.action.Action;
/**
* Servlet implementation class BoardServlet
*/
@WebServlet("/BoardServlet")
public class BoardServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public BoardServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String command = request.getParameter("command");
System.out.println("BoardServlet에서 요청 받음을 확인" + command);
//매개변수로 command 값을 가져와 출력하기 위해 2
ActionFactory af = ActionFactory.getInstance();
Action action = af.getAction(command);
if(action != null) {
action.execute(request, response);
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//한글 처리
request.setCharacterEncoding("utf-8");
doGet(request, response);
}
}
└ActionFactory 생성 ↓
(6) 컨트롤러 : 인터페이스 생성
-생성 : src/main/java >> 인터페이스 생성 : com.board.controller.action / 이름 Action
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
//추상 메소드 정의
public void execute(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException;
}
(7) 컨트롤러 : 클래스 생성
-생성 : src/main/java >> 클래스 생성 : 패키지 com.board.controller / 이름 ActionFactory
package com.board.controller;
import com.board.controller.action.Action;
public class ActionFactory {
//Action 이후에 나오는 것 관리?
//싱글톤
private static ActionFactory instance = new ActionFactory();
//생성자
private ActionFactory() {
super();
}
//외부에서 호출할 수 있도록 public static
public static ActionFactory getInstance() {
return instance;
}
//매개변수로 command 값을 가져와 출력하기 위해 1 BoardServlet.java
public Action getAction(String command) {
Action action = null;
System.out.println("ActionFactory : "+command);
return action;
}
}
(8) 컨트롤러 : BoardListAction
-생성 : src/main/java >> 클래스 생성 : 패키지 com.board.controller.action / 클래스 BoardListAction
package com.board.controller.action;
import java.io.IOException;
import java.util.List;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.dao.BoardDAO;
import com.board.dto.BoardVO;
public class BoardListAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/board/boardList.jsp";
//조회하기 위해
BoardDAO bDao = BoardDAO.getInstance();
List<BoardVO> boardList = bDao.selectAllBoards();
//조회한 것을 request에 담기
request.setAttribute("boardList", boardList);
//이동
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
(9) 뷰 - JSP페이지
-생성 : WebContent >> board 폴더 생성 >> JSP 파일 생성 : boardList.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> 게시판 </title>
<!-- css 적용 -->
<link rel="stylesheet" type="text/css" href="css/board.css">
</head>
<body>
<div id="wrap" align="center">
<h1>게시글 리스트</h1>
<table class="list">
<tr>
<td colspan="5" style="border:white; text-align:right">
<a href="BoardServlet?command=board_write_form">게시글 등록</a>
</td>
</tr>
<tr>
<th>번호</th><th>제목</th><th>작성자</th><th>작성일</th><th>조회</th>
</tr>
<c:forEach var="board" items="${boardList }">
<tr class="record">
<td>${board.num }</td>
<td>
<a href="BoardServlet?command=board_view&num=${board.num }">
${board.title }
</a>
</td>
<td>${board.name }</td>
<td><fmt:formatDate value="${board.writedate }"/></td>
<td>${board.readCount }</td>
</tr>
</c:forEach>
</table>
</div>
</body>
</html>
(10) 유효성 검사
-생성 : WebContent 폴더 >> 폴더 생성 : js >> 파일 생성 : board.js
//유효성 검사를 위한 함수
function boardCheck(){
if(document.frm.name.value.length == 0){
alert("작성자를 입력하세요.");
return false;
}
if(document.frm.passwd.value.length ==0){
alert("비밀번호를 입력하세요.");
return false;
//알림창이 떴을 때, 페이지 이동하지 말라고.
}
if(document.frm.title.calue.length == 0){
alert("제목을 입력하세요.");
return false;
}
return true;
//위의 조건 모두 아닐 시, true 반환해서 넘어가란 건가?
}
//창을 여는 함수
function open_win(url, name){
window.open(url, name, "width=500, height=230");
}
//비번 체크
function passCheck(){
if(document.frm.passwd.value.length == 0){
alert("비밀번호를 입력하세요");
return false;
}
return true;
}
(11) css 파일
-생성 : WebContent 폴더 >> 폴더 생성 : css >> 파일 생성 : board.css
#wrap{
width: 971px;
/*가운데 정렬을 위한 바깥 쪽 여백 설정 */
margin: 0;
margin-left: auto;
margin-right: auto;
}
h1{
color: green; /*글 색상*/
}
table{
width: 100%;
border-collapse: collapse;
font-size: 12px;
line-height: 24px; /* 줄 간격*/
}
table td, th{
border: #d3d3d3 solid 1px; /*경계선 색상 스타일 굵기*/
padding: 5px; /*안쪽 여백*/
}
th{
background: yellowgreen;
width: 120px;
}
img{
width: 220px; /*이미지 가로 크기*/
height:300px; /*이미지 세로 크기*/
}
a{
text-decoration: none;
color:black;
}
a:HOVER{
text-decoration: underline;
color: green;
}
(12) 출력
-src/main/java >> com.board.controller >> BoardServlet.java 파일 실행
-쿼리스트링 입력
http://localhost:8082/00mvcBoard/BoardServlet?command=board_list |
-결과
*게시글 뜨는 것까지 확인
22.02.23
(13) 디버깅을 통해 서버 흐름 확인
서버 우클릭 >> 디버깅 >> 리스타트 디버깅
디버그는 JSP 사용 못하고 자바 코드만 사용 가능.
토글 포인트로 브레이크 포인트 지점 설정. 벌레 아이콘(디버깅)
[f5], [f6],
[f8] 디버그 종료
(14) 게시글 등록 처리
게시글 등록을 클릭했을 때 처리하는 것
-1번 : 생성 : com.board.controller.action >> BoardWriteFormAction.java(클래스)
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BoardWriteFormAction implements Action{
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/board/boardWrite.jsp";
//dispacther로 이동
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
-2번 : 생성 : WebContent >> board >> boardWrite.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/board.css">
<script type="text/javascript" src="js/board.js"></script>
</head>
<body>
<div id="wrap" align="center">
<h1>게시글 등록</h1>
<form name="frm" method="post" action="BoardServlet">
<!-- 커맨드 메소드 넘거주기 위해 히든 타입으로 만듦 -->
<input type="hidden" name="command" value="board_write"/>
<table>
<tr>
<th>작성자</th>
<td><input type="text" name="name"/>*필수</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="pass"/>*필수(게시물 수정, 삭제시 필요)</td>
</tr>
<tr>
<th>이메일</th>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" size="70" name="title"/>*필수</td>
</tr>
<tr>
<th>내용</th>
<td><textarea cols="70" rows="15" name="content">
</textarea>
</td>
</tr>
</table>
<br><br>
<!-- 유효성 체크하기 위해 -->
<input type="submit" value="등록" onclick="return boardCheck();" />
<input type="reset" value="다시 작성"/>
<input type="button" value="목록" onclick="location.href='BoardServlet?command=board_list';"/>
</form>
</div>
</body>
</html>
-3번 : com.board.controller >> ActionFactory 수정(ActionFactory의 If문에 else if 추가)
//실제로 이동해야 하니까 추가
if(command.equals("board_list")) {
action = new BoardListAction();
}else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
}
return action;
>> 서버 재시작 >> BoardServlet 실행 >> 쿼리스트링 입력(?command=board_list) >> 게시글 등록 눌렀을 때, 게시판 이동 확인
...
(15) 작성된 글을 디비에 넣는 법
-1번 : 생성 : com.board.controller.action >> BoardWriteAction
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.dao.BoardDAO;
import com.board.dto.BoardVO;
public class BoardWriteAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BoardVO bVo = new BoardVO();
bVo.setName(request.getParameter("name"));
bVo.setPasswd(request.getParameter("pass"));
bVo.setEmail(request.getParameter("email"));
bVo.setTitle(request.getParameter("title"));
bVo.setContent(request.getParameter("content"));
BoardDAO bDao = BoardDAO.getInstance();
bDao.insertBoard(bVo);
//게시판 목록 화면으로 이동
new BoardListAction().execute(request, response);
}
}
-2번 : 생성 : WebContent >> board >> boardWrite.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/board.css">
<script type="text/javascript" src="js/board.js"></script>
</head>
<body>
<div id="wrap" align="center">
<h1>게시글 등록</h1>
<form name="frm" method="post" action="BoardServlet">
<!-- 커맨드 메소드 넘거주기 위해 히든 타입으로 만듦 -->
<input type="hidden" name="command" value="board_write"/>
<table>
<tr>
<th>작성자</th>
<td><input type="text" name="name"/>*필수</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="pass"/>*필수(게시물 수정, 삭제시 필요)</td>
</tr>
<tr>
<th>이메일</th>
<td><input type="text" name="email"/></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" size="70" name="title"/>*필수</td>
</tr>
<tr>
<th>내용</th>
<td><textarea cols="70" rows="15" name="content">
</textarea>
</td>
</tr>
</table>
<br><br>
<!-- 유효성 체크하기 위해 -->
<input type="submit" value="등록" onclick="return boardCheck();" />
<input type="reset" value="다시 작성"/>
<input type="button" value="목록" onclick="location.href='BoardServlet?command=board_list';"/>
</form>
</div>
</body>
</html>
-3번 : com.board.controller >> ActionFactory 수정
//실제로 이동해야 하니까 추가
if(command.equals("board_list")) {
action = new BoardListAction();
}else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
}else if(command.equals("board_write")) {
action = new BoardWriteAction();
}
return action;
-출력 결과
글을 입력했을 때,
(관리자, admin@google.com 공지사항 공지사항입니다)
(+) 위 과정에서 오류가 있었는데
com.board.dao >> BoardDAO.java 파일에서 입력하지 않은 게 있었음.
//글 쓸 때 insert 메소드
//PreparedStatement 방법 사용
public void insertBoard(BoardVO bVo) {
String sql = "INSERT INTO BOARD(NUM, NAME, EMAIL, PASS, TITLE, CONTENT)"+
"VALUES(BOARD_SEQ.NEXTVAL, ?, ?, ?, ?, ?)";
Connection conn = null;
PreparedStatement pstmt = null;
try {
conn = DBManager.getConnection();
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, bVo.getName()); //사용자 입력값
pstmt.setString(2, bVo.getEmail());
pstmt.setString(3, bVo.getPasswd());
pstmt.setString(4, bVo.getTitle());
pstmt.setString(5, bVo.getContent());
pstmt.executeUpdate(); //★이거 빼먹었음.
} catch (Exception e) {
e.printStackTrace();
}finally {
DBManager.close(conn, pstmt);
}
}
(16) 글 상세보기
-1번 : 생성 : com.board.controller.action >> BoardViewAction.java(클래스)
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.dao.BoardDAO;
import com.board.dto.BoardVO;
public class BoardViewAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/board/boardView.jsp";
String num = request.getParameter("num");
BoardDAO bDao = BoardDAO.getInstance();
//제목 클릭 시, 상세 내용들어갔을 때 조회수 증가
bDao.updateRead(num);
BoardVO bVo = bDao.selectOneBoardByNum(num);
request.setAttribute("board", bVo);
//포워드
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
-2번 : 생성 : WebContent >> board >> boardView.jsp
(+게시글 상세보기에서 게시글 목록으로 이동하는 버튼 추가 ::)
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>게시판</title>
<link rel="stylesheet" type="text/css" href="css/board.css">
<script type="text/javascript" src="js/board.js"></script>
</head>
<body>
<div id="wrap" align="center">
<h1>게시판 상세보기</h1>
<table>
<tr>
<th>작성자</th><td>${board.name }</td>
<th>이메일</th><td>${board.email }</td>
</tr>
<tr>
<th>작성일</th><td><fmt:formatDate value="${board.writedate }"/></td>
<th>조회수</th><td>${board.readCount }</td>
</tr>
<tr>
<th>제목</th>
<td colspan="3">${board.title }</td>
</tr>
<tr>
<th>내용</th>
<td colspan="3"><pre>${board.content }</pre></td>
</tr>
</table>
<br><br>
<input type="button" value="게시글 수정" onclick="open_win('BoardServlet?command=board_check_pass_form&num=${board.num}', 'update')" />
<input type="button" value="게시글 삭제" onclick="open_win('BoardServlet?command=board_check_pass_form&num=${board.num}', 'delete')" />
<input type="button" value="게시글 등록" onclick="location.href='BoardServlet?command=board_write_form';"/>
<!--boardWrite.jsp에서 복사해봄.-->
<input type="button" value="목록" onclick="location.href='BoardServlet?command=board_list';"/>
</div>
</body>
</html>
-3번 : com.board.controller >> ActionFactory.java
public Action getAction(String command) {
Action action = null;
System.out.println("ActionFactory : "+command);
//실제로 이동해야 하니까 추가
if(command.equals("board_list")) {
action = new BoardListAction();
}else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
}else if(command.equals("board_write")) {
action = new BoardWriteAction();
}else if(command.equals("board_view")) { //★ 추가
action = new BoardViewAction();
}
return action;
}
(17) 비밀번호 체크
-1번 : 생성 : com.board.controller.action >> BoardCheckPassFormAction
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class BoardCheckPassFormAction implements Action{
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/board/boardCheckPass.jsp";
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
-2번 : 생성 : WebContent >> board >> boardCheckPass.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/board.css">
<script type="text/javascript" src="js/board.js"></script>
</head>
<body>
<div align="center">
<h1>비밀번호 확인</h1>
<form action="BoardServlet" name="frm" method="get">
<input type="hidden" name="command" value="board_check_pass"/>
<input type="hidden" name="num" value="${param.num }"/>
<table style="width: 80%">
<tr>
<th>비밀번호</th>
<td>
<input type="password" name="pass" size="20"/>
</td>
</tr>
</table>
<br>
<input type="submit" value="확 인" onclick="return passCheck()"/>
<br><br>
${message }
</form>
</div>
</body>
</html>
-3번 : ActionFactory
//매개변수로 command 값을 가져와 출력하기 위해 1 BoardServlet.java
public Action getAction(String command) {
Action action = null;
System.out.println("ActionFactory : "+command);
//실제로 이동해야 하니까 추가
if(command.equals("board_list")) {
action = new BoardListAction();
}else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
}else if(command.equals("board_write")) {
action = new BoardWriteAction();
}else if(command.equals("board_view")) {
action = new BoardViewAction();
}else if(command.equals("board_check_pass")) { //★
action = new BoardCheckPassFormAction();
}
return action;
}
(17-2) 비밀번호 입력했을때, 성공/실패
-1-1번 : 생성 : com.board.controller.action >> BoardCheckPassAction
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.dao.BoardDAO;
import com.board.dto.BoardVO;
public class BoardCheckPassAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = null;
String num = request.getParameter("num");
String pass = request.getParameter("pass");
BoardDAO bDao = BoardDAO.getInstance();
BoardVO bVo = bDao.selectOneBoardByNum(num);
if(bVo.getPasswd().equals(pass)) {
//입력 비번, 기존 비번 같으면 페이지 이동
url = "/board/checkSuccess.jsp";
}else {
//안 같으면, 다시 비번 입력하는 페이지로 이동
url = "/board/boardCheckPass.jsp";
request.setAttribute("message", "비밀번호가 틀렸습니다.");
}
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
-2번 : 생성 : WebContent >> board >> checkSuccess.jsp
비밀번호 입력 성공 페이지 작성
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<script>
//글작성 페이지 update인지 delete인지에 따라서 다르게 수행
if(window.name == "update"){
window.opener.parent.location.href="BoardServlet?command=board_update_form&num=${param.num}";
}else if(window.name == "delete"){
alert("삭제되었습니다");
window.opener.parent.location.href="BoardServlet?command=board_delete&num=${param.num}";
}
window.close();
</script>
</body>
</html>
-3번 : ActionFactory
//실제로 이동해야 하니까 추가
if(command.equals("board_list")) {
action = new BoardListAction();
}else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
}else if(command.equals("board_write")) {
action = new BoardWriteAction();
}else if(command.equals("board_view")) {
action = new BoardViewAction();
}else if(command.equals("board_check_pass_form")) {
action = new BoardCheckPassFormAction();
}else if(command.equals("board_check_pass")) {
action = new BoardCheckPassAction(); //★
}
return action;
(18) 게시글 수정으로 이동
-1-1번 : 생성 : com.board.controller.action >> BoardUpdateAction
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.dao.BoardDAO;
import com.board.dto.BoardVO;
public class BoardUpdateAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
BoardVO bVo = new BoardVO();
bVo.setNum(Integer.parseInt(request.getParameter("num")));
bVo.setName(request.getParameter("name"));
bVo.setPasswd(request.getParameter("pass"));
bVo.setEmail(request.getParameter("email"));
bVo.setTitle(request.getParameter("title"));
bVo.setContent(request.getParameter("content"));
BoardDAO bDao = BoardDAO.getInstance();
bDao.updateBoard(bVo);
new BoardListAction().execute(request, response);
}
}
-1-2번 : 생성 : com.board.controller.action >> BoardUpdateFormAction
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.dao.BoardDAO;
import com.board.dto.BoardVO;
public class BoardUpdateFormAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = "/board/boardUpdate.jsp";
String num = request.getParameter("num");
BoardDAO bDao = BoardDAO.getInstance();
BoardVO bVo = bDao.selectOneBoardByNum(num);
request.setAttribute("board", bVo);
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
}
}
-2번 : 생성 : WebContent >> board >> boardUpdate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="css/board.css">
<script type="text/javascript" src="js/board.js"></script>
</head>
<body>
</body>
<div id="wrap" align="center">
<h1>게시글 수정</h1>
<form name="frm" method="post" action="BoardServlet">
<input type="hidden" name="command" value="board_update"/>
<input type="hidden" name="num" value="${board.num }"/>
<table>
<tr>
<th>작성자</th>
<td><input type="text" size="12" name="name" value="${board.name }"/>*필수</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" size="12" name="pass" />*필수(게시물 수정/삭제 시 필요)</td>
</tr>
<tr>
<th>이메일</th>
<td><input type="text" size="40" maxlength="50" name="email" value="${board.email }"/></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" size="70" name="title" value="${board.title }"/></td>
</tr>
<tr>
<th>내용</th>
<td><textarea cols="70" rows="15" name="content">${board.content }</textarea></td>
</tr>
</table>
<br><br>
<input type="submit" value="등록" onclick="return boardCheck();"/>
<input type="reset" value="다시 작성" />
<input type="button" value="목록" onclick="location.href='BoardServlet?command=board_list';"/>
</form>
</div>
</html>
-3번 ActionFactory
//실제로 이동해야 하니까 추가
if(command.equals("board_list")) {
action = new BoardListAction();
}else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
}else if(command.equals("board_write")) {
action = new BoardWriteAction();
}else if(command.equals("board_view")) {
action = new BoardViewAction();
}else if(command.equals("board_check_pass_form")) {
action = new BoardCheckPassFormAction();
}else if(command.equals("board_check_pass")) {
action = new BoardCheckPassAction();
}else if(command.equals("board_update_form")) { //★
action = new BoardUpdateFormAction();
}else if(command.equals("board_update")) { //★
action = new BoardUpdateAction();
}
return action;
(19) 글 삭제하는 거
-1번 : 생성 : com.board.controller.action >> BoardDeleteAction
package com.board.controller.action;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.board.dao.BoardDAO;
public class BoardDeleteAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//값 받아오기
String num = request.getParameter("num");
BoardDAO bDao = BoardDAO.getInstance();
bDao.deleteBoard(num);
new BoardListAction().execute(request, response);
}
}
-3번 : com.board.controller >> ActionFactory 수정
//실제로 이동해야 하니까 추가
if(command.equals("board_list")) {
action = new BoardListAction();
}else if(command.equals("board_write_form")) {
action = new BoardWriteFormAction();
}else if(command.equals("board_write")) {
action = new BoardWriteAction();
}else if(command.equals("board_view")) {
action = new BoardViewAction();
}else if(command.equals("board_check_pass_form")) {
action = new BoardCheckPassFormAction();
}else if(command.equals("board_check_pass")) {
action = new BoardCheckPassAction();
}else if(command.equals("board_update_form")) {
action = new BoardUpdateFormAction();
}else if(command.equals("board_update")) {
action = new BoardUpdateAction();
}else if(command.equals("board_delete")) {
action = new BoardDeleteAction();
}
return action;
'수업 > └JSP' 카테고리의 다른 글
[CH18]Ajax (0) | 2022.02.21 |
---|---|
[CH16]JDBC (0) | 2022.02.18 |
[CH14]쿠키 (0) | 2022.02.17 |
[CH13]세션 연습문제 (0) | 2022.02.17 |
[CH13]세션(Session) (0) | 2022.02.17 |
- Total
- Today
- Yesterday
- html input type
- html pre
- 스크립태그
- improt
- 미디어 태그
- BAEKJOON
- empty-cell
- ScriptTag
- html a tag
- CascadingStyleSheet
- JavaScript
- html
- html layout
- 변수
- 기본선택자
- css
- typeof
- Java
- border-spacing
- html base tag
- 외부구성요소
- scanner
- initialized
- caption-side
- html atrribute
- 입력양식
- selcetor
- input type 종류
- A%B
- text formatting
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |