SpringBoard(게시판)-MVC구조

RedNine·2023년 2월 21일
0

스프링

목록 보기
5/17
post-thumbnail

게시판 순서

  • -WEB-INF
    (1)web.xml(DispatcherServlet 컨트롤러 등록) 1순위
    (2)board-servlet.xml(요청명령어 등록)
  • -META-INF (JNDI 방법)
    (3)Context.xml(DB정보->태그형태로 설정)->명함철
  • -src->빈즈
    (4)BoardDAO->JNDI명을 이용(DB접속)->list()
    (5)ListActionController->list()
  • -Webapp
    (6)화면에 출력할 page(~) -> list.jsp

1. 요청을 받아서 처리해주는 컨트롤러 등록

🎈web.xml

  <servlet>
  	<servlet-name>board</servlet-name>
  	<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>board</servlet-name>
  	<url-pattern>*.do</url-pattern>	
  </servlet-mapping>

2. JNDI(Java Naming Directory Interface)

: DB연결의 정보->Context.xml 저장 -> DB정보이름(default jdbc/orcl,,,) 등록=>DAO=>url,driver,계정,암호X(필요없다), JNDI이름을 검색(연결객체 가져옴)
🎈Context.xml(일반 xml파일로 생성)(JNDI방식)

<?xml version="1.0" encoding="UTF-8"?>
<Context>  Java Naming Directory Interface의 약자
   <Resource name="jdbc/orcl(JNDI이름)" --->외부클래스(BoardDAO)
         ( 외부에서 접속할때 DB의 정보를 알수 있도록 해주는 고유의 이름 )
         auth="container"    ->리소스(자원(DB)를 누가 관리할 것인가?(스프링)
         type="javax.sql.DataSource" ->(ex 자동차의 관한)커넥션풀에 대한 DataSource의 fullName
         username="scott"    ->접속할 계정명
         password="tiger"    ->접속할 암호
     	 driverClassName="oracle.jdbc.driver.OracleDriver"   ->접속할 Driver명
     	 factory="org.apache.commons.dbcp.BasicDataSourceFactory"
     	 -> 커넥션풀을 생성해주는 클래스 fullName (ex 자동차 공장) 
     	 url="jdbc:oracle:thin:@localhost:1521:orcl"   ->접속 url
         maxActive="20"    -> 최대로 빌려줄 수있는 커넥션풀 갯수 지정하는 속성
         maxIdle="10" />   -> 최대로 여분이 있는 커넥션풀 갯수 지정하는 속성
</Context>

3. DB접속에 대한 테이블 생성 및 DTO,DAO클래스 작성

🎈oracle DB등록

create table springboard(
num number(3) primary key,
author varchar2(15),
title varchar2(50),
content varchar2(4000),
writeday date default sysdate,
readcnt number(4) default 0); //처음 조회수는 0
  ///////////////
insert into springboard(num,author,title,content) 
                values(1,'홍길동','스프링 연습1','스프링 테스트 내용중');
  ////////////
commit;
  ////////////////
select * from springboard;  

🎈BoardDTO

public class BoardDTO {
	private int num;
	private String author,title,content,date;
	private int readcnt;//조회수
  			,,,

🎈BoardDAO

🎁import

  • import java.sql.*;
    • //Connection, PrepardStatement,,,
  • import java.util.*;
    • //ArrayList, List~
  • import javax.sql.*;
    • //DataSource객체 -> getConnection()을 이용(자식객체)
  • import javax.naming.*;
    • //Context(인터페이스) or InitialContext객체
      //lookup('찾고자하는 JNDI명')

🎁DB객체 얻어오기
DataSource ds;
//DBConnectionMgr pool=null; has a 관계

🎁생성자
생성자 : DataSource 얻기 : InitialContext와 JNDI명

try {
	//InitialContext ctx=new InitialContext(); (O 가능)
	Context ctx=new InitialContext();
	//형식) datasource객체명=(DataSource)ctx객체명.lookup("java:comp/env/찾고자하는 JNDI명");
	ds=(DataSource)ctx.lookup("java:comp/env/jdbc/orcl");
	System.out.println("ds=> "+ds);
  }catch(Exception e) {
	 e.printStackTrace();
  }
}

글목록보기

🎈board-servlet.xml

  • DB접속
    <bean id="boardDAO" class="kang.BoardDAO" />
  • 글목록보기(list()) setDao(BoardDAO 객체)
<bean name="/list.do" class="kang.ListActionController">
	<property name="dao">
		<ref bean="boardDAO" />
	</property>
</bean>

🎈ListActionController

  • 모델2 -> //public class ListAction
  • BoardDAO dao;
    //BoardDAO dao=new BoardDAO(); => 컨테이너가 이미 생성된 상태, 수동으로 해줄 필요 없다.
  • setDao : //<property name="dao"><ref bean="" /></property>

    🎁handleRequest()
  • ModelAndView : 화면에 출력할 list.jsp에 전달할 페이지와 전달할 값을 설정하기 위해서
    • 이동할 페이지(공유), 보내줄 데이터를 담기위해서

글쓰기 구현

🎈board-servlet.xml

<!-- 2. 글쓰기폼으로 이동 -->
<bean name="/writeui.do"		 class="org.springframework.web.servlet.mvc.ParameterizableViewController">
	<property name="viewName" value="write"></property>
</bean>
<!-- 3. 글쓰기(글수정하기와 거의 유사) -->
<bean name="/write.do" class="kang.WriteActionController">
	<property name="dao">
		<ref bean="boardDAO" />
	</property>
	<property name="commandClass" value="kang.BoardCommand" />
</bean>

🎈BoardCommand.java

  • BoardDTO -> 하나의 레코드에 관련된 필드와 연관이 있는 클래스(모든필드)
  • BoardCommend => 실질적으로 사용자로부터 값을 입력받는 필드로만 구성된 클래스
  • <jsp:setProperty name="" property="*" /> <- 모델2 단점(사용못함)
    • 모델2는 안되지만 스프링은 SetterMethod로 호출할 수 있다.(<jsp:~)
      🎈AbstractCommandController.java
      일반적인 웹상의 요청 명령어 -> Controller를 상속하는 반면
      AbstractCommandController : 데이터값을 입력을 받아서 처리해주는 컨트롤러(ex 로그인, 게시물 글쓰기, 게시물 수정)
  • board-servlet.xml( <property name="commendClass" value="kang.BoardCommand" />)
  • setCommendClass(BoardCommand command) 상속을 받아서 이미 존재하기 때문에 코딩하지 않아도 된다.
    🎁DB객체 상속
    BoardDAO dao;
    public void setDao(BoardDAO dao) {
    this.dao = dao;
    System.out.println("setDao() 호출됨(dao) => "+dao);
    }
    1. request(요청객체)
    1. response(응답객체)
    1. 입력받은 값을 저장한 객체(Object - 어떤 객체건 입력이 가능)
    1. BindException : 사용자로부터 값을 입력시 에러발생하는데 에러를 처리해주는 객체이다.

글상세보기

🎈board-servlet.xml

<!-- 4. 글상세보기 -->
<bean name="/retrieve.do" class="kang.RetrieveActionController">
	<property name="dao">
		<ref bean="boardDAO" />
	</property>
</bean>

🎈BoardDAO.java

🎈RetrieveActionController.java

🎈retrieve.jsp

  • readonly="readonly"을 주면 inputbox에 커서가 들어가지 않는다.(수정X)
  • <td><%=num></td> => request.getParameter("num")(X)
  • <hidden name="num" value="3" />을 써서 전달해 주어야 한다.

글수정하기

🎈board-servlet.xml

<bean name="/update.do"  class="lee.UpdateActionController">
    <property name="dao">
          <ref bean="boardDAO" />
    </property>
    <property name="commandClass"  value="lee.BoardCommand" />
</bean>

🎈UpdateActionController.java

글삭제하기

🎈BoardDAO

🎈DeleteActionController

글검색하기

🎈list.jsp

<!-- 검색 기능 시작 -->
	<tr><td colspan="5" align="center">
		<form action="search.do">
		   <select name="searchName" size="1">
	          <option value="author">작성자</option>
    	      <option value="title">제목</option>
           </select>
		   <input type="text" name="searchValue">
		   <input type="submit" value="검색">
		</form>
	</td></tr>
</table>
</body></html>

list.jsp에서 검색폼을 추가(기본 페이징처리 바로 아래에 위치)

🎈board-servlet.xml

<bean name="/search.do" class="kang.SearchActionController">
	<property name="dao">
		<ref bean="boardDAO" />
	</property>
</bean>

글검색하기 (검색하기위해서 입력)(페이징 처리X)

  • 값을 입력받는데 테이블에 저장이 되는가? -> AbstractCommandController 상속
  • 값을 입력을 받는데 전달 -> 검색 -> Controller 상속
    🎈BoardDAO.java

    🎈SearchActionController.java
  • ListActionController ctrl+c,v

0개의 댓글

관련 채용 정보