이안의 평일코딩

JSP 7일차 - Interface, 자유게시판 본문

Back-end/JSP

JSP 7일차 - Interface, 자유게시판

이안92 2020. 10. 12. 09:50
반응형

2020.10.12(월)

 

* 인터페이스

서로 다른 여러개의 클래스를 묶어서 한개의 이름(인터페이스)으로 관리(제어)

상속 extends, implements

class A => A 데이터형

class B => B 데이터형

interface I

class C implements I => 데이터형 (I, C)

 

interface 동물

class 개 implements 동물 (개, 동물)

동물 ani = new 개()

=> 인터페이스에 존재하는 메소드에 한정 => 인터페이스에 메소드를 증가하면 => 구현하고 있는 모든 클래스가 에러발생

=> POJO (인터페이스 구현(X), 상속(X)) => 구분(어노테이션) => Spring

 

 

기능(요청) 처리하는 메소드 => Model의 모든 클래스가 요청을 처리하기 위한 메소드

 

Call By References (클래스, 배열 => 메모리 주소 이용하는 방식)

주소(메모리) => 값을 주소에 채워주는 방식

 

매개변수 전송 방식

- Call by Value : 다른 메모리에 값을 복사(일반 데이터)

- Call by Reference : 같은 메모리 주소. 원본이 넘어간다

 

 

Java Resources/src

Config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
   PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
   "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- 오라클을 연결하기 위한 환경설정 : 한개만 사용  -->
  <!-- properties 파일 읽기 -->
  <!-- MyBatis,Spring : 기본 디폴트 폴더가 src -->
  <properties resource="db.properties"/>
  <typeAliases>
    <!-- VO를 등록 -->
    <typeAlias type="com.sist.dao.BoardVO" alias="BoardVO"/>
    <!-- 
                      오라클에서 가지고 오는 데이터를 받아서 저장 
            while(rs.next())
            {
                DataBoardVO vo=new DataBoardVO(); // 셋팅
                vo.setNo(rs.getInt(1));
                ==
                ==
                ==
            }
     -->
  </typeAliases>
  <!-- 오라클 연결하는 부분 : getConnection() -->
  <environments default="development"><!-- 개발 환경을 만든다 -->
    <environment id="development">
      <!-- Commit,Rollback => Transection -->
      <!-- 
                    트랜잭션 처리 방법
                    자동처리 : 일반적으로 많이 사용 => JDBC
                    수동처리 : 프로그래머가 처리 => MANAGED
                    
           COMMIT : 정상처리 => 저장을 요청
           ROLLABCK : SQL문장이 틀렸다 => 실행하지 않는다 : UNDO (ctrl+z)
       -->
       <transactionManager type="JDBC"/>
      <!-- 오라클 정보를 모아서 MyBatis 라이브러리에 전송 : DataSource -->
       <dataSource type="POOLED">
          <!-- 
               UNPOOLED : 요청(SQL문장 실행)할때 오라클 연결 , 결과값을 가지고 오면 오라클 연결 해제
                          => 연결하는 시간이 많이 소모(연결이 지연될 수 도 있다)
               POOLED : DBCP (미리 Connection을 연결하고 요청시마다 연결된 Connection을 넘겨준다
                              사용후에는 반환=> 다시 재사용이 가능)
                          => 연결하는 소모되지 않는다 
                          => Connection의 생성 갯수를 제어 할 수 있다
                          => 일반적으로 웹프로그램에서는 기본으로 사용
           -->
           <!-- 오라클 연결을 위한 기본정보를 마이바티스로 전송 -->
           <!-- 
                    db.properties
                    driver=oracle.jdbc.driver.OracleDriver
					url=jdbc:oracle:thin:@211.238.142.000:1521:XE
					username=hr
					password=happy
            -->
           <property name="driver" value="${driver}"/>
           <property name="url" value="${url}"/>
           <property name="username" value="${username}"/>
           <property name="password" value="${password}"/>
           <!-- Connection : 8개 -->
           <!-- 
                 public class PooledDataSource
                 {
                     private String driver;
                     private String url;
                     private String username;
                     private String password;
                 }
                 
                 public class MyBatisDAO
                 {
                      private DataSource dataSource;
                      public MyBatisDAO()
                      {
                          Class.forName(dataSource.getDriver()); ==> 필요한 데이터 => XML로 설정 
                      }
                      public void getConnection()
                      {
                         conn=DriverManager.getConnection(dataSource.getUrl(),
                             dataSource.getUsername(),dataSource.getPassword())
                      }
                 }
            -->
       </dataSource>
    </environment>
  </environments>
  <!-- SQL문장을 전송 : SQL문장 어디 있는지 확인 : mapper를 등록  -->
  <!-- XML은 문서 저장 : 저장내용이 많아지면 파싱(XML저장되어 있는 데이터를 읽어 간다) 속도가 저하된다:분산  -->
  <!-- XML만 가지고 코딩하는 프레임워크 : XML이 길어진다=>속도의 문제 (스트럿츠) : 스프링 -->
  <!-- 
      MyBatis => XML없이도 사용이 가능 
                ===== Annotation  @
   -->
  <mappers>
    <mapper resource="com/sist/dao/board-mapper.xml"/>
  </mappers>
</configuration>

 

db.properties

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@211.238.142.000:1521:XE
username=hr
password=happy

 

com.sist.controller

Controller.java

package com.sist.controller;

import java.io.*;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/////// XML 파싱
import javax.xml.parsers.*;
import org.w3c.dom.*;
//////////////////////////
import com.sist.model.*;
// 연결 (Model <====> JSP)
/*
 *   Controller 등록 => web.xml
 */
import java.util.*;

public class Controller extends HttpServlet {
	private static final long serialVersionUID = 1L;
    /*
     *    서블릿 동작 
     *      = 메모리 할당 (생성자 호출) 
     *      = init() : 파일 읽기 , 서버연결 
     *      = service() : 사용자가 요청시 처리하는 메소드 
     *        ========= GET/POST ==> 동시에 처리가 가능한 메소드 
     *           GET  => doGet()
     *           POST => doPost()
     *      = destroy() : 할당된 메모리를 회수한다 
     *      
     *      == 새로고침,화면이동 ==> destroy() 호출 ==> 메모리 회수
     *         ==========================================  다시 원상복귀 (새로운 서블릿,JSP 생성)
     *         
     *         A a=new A(); ==> destroy() => 메모리는 사라진다 
     *         새로고침 , 화면이동 
     *         A a=new A(); ==> 새로운 메모리를 다시 만든다 (초기화)
     */
	// XML의 데이터를 읽어서 map에 저장 (Controller가 기억하고 있다가 => 요청 => 바로 모델클래스를 찾을 수 있게 한다)
	// Callback함수다 
	// 저장 (모델클래스 저장)
	private Map clsMap=new HashMap(); // 키 , 값
	public void init(ServletConfig config) throws ServletException {
		// web.xml에 등록된 => applicationContext.xml파일을 읽기 
		// web.xml에 설정된 데이터를 읽어오는 클래스 => ServletConfig
		String path=config.getInitParameter("contextConfigLocation");
		System.out.println(path);
		try
		{
			// XML읽기
			DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
			// XML을 파싱할 수 있게 클래스 생성 
			DocumentBuilder db=dbf.newDocumentBuilder(); // 파싱기 
			// XML , WML , HDML (무선)
			// XML 읽어서 메모리에 저장 (저장공간 :Document)
			Document doc=db.parse(new File(path));
			// 최상위 태그 ==> 트리형태로 저장 
			Element root=doc.getDocumentElement();
			System.out.println(root.getTagName());// <beans>
			
			// bean => 태그 읽기
			// bean태그를 묶어서 사용 
			// 같은 태그를 묶을때 ==> NodeList
			NodeList list=root.getElementsByTagName("bean");
			/*
			 *    <bean id="list.do" class="com.sist.model.ListModel"/>
				  <bean id="detail.do" class="com.sist.model.DetailModel"/>
				  <bean id="insert.do" class="com.sist.model.InsertModel"/>
			 */
			for(int i=0;i<list.getLength();i++)
			{
				// bean 읽기 
				Element bean=(Element)list.item(i);
				String cmd=bean.getAttribute("id");
				String cls=bean.getAttribute("class");
				System.out.println("cmd="+cmd+",class="+cls);
				// 저장 
				// 클래스를 메모리 할당을 한다음에 키,주소
				Class clsName=Class.forName(cls);
				Object obj=clsName.newInstance(); // 클래스이름을 읽어서 메모리 할당 
				System.out.println("할당된 주소:"+obj);
				
				// 저장(Map)
				clsMap.put(cmd, obj);
			}
			/*
			 *   XML 파싱  => Spring,Mybatis ==> 파싱 클래스 
			 *   SI , SM , 솔루션 , 프레임워크 
			 *   =======   ============== xml을 파싱 
			 *   이미 만들어진 클래스 => 제작 
			 */
		}catch(Exception ex){}
	}
    // 사용자 요청 처리하는 메소드 
	// Callback함수다 
	// Callback => 프로그래머가 호출하는 메소드가 아니라 시스템에 위해서 자동 호출되는 메소드 
	// main()
	// 윈도우 => 이벤트 (콜백)
	// 프로그래머는 콜백을 함수를 만들 수 없어서 => 반드시 호출을 해야 한다 
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 사용자 요청시에 처리가 되는 영역
		// http://localhost/OnLineStudy16_MVC1/list.do URL
		// 1. 사용자 요청을 받는다 
		String cmd=request.getRequestURI();// /OnLineStudy16_MVC1/list.do ==> URI
		//                                   =================== contextPath
		// 2. Model클래스 찾기 
		cmd=cmd.substring(request.getContextPath().length()+1); // list.do , detail.do
		
		Model model=(Model)clsMap.get(cmd); // if을 사용하지 않아도 된다 
		// 1,2을 처리하기 위해서 ==> 관련된 데이터를 Map에 저장 ==> clsMap에 저장된 클래스를 찾는다 
		// 3. Model를 통해서 요청처리 ==> 결과값을 request,session에 담는다
		String jsp=model.handlerRequest(request);// 처리후에 request에 값을 담아 준다 
		// 4. JSP를 찾는다 
		// 5. JSP로 request를 전송한다
		// request를 해당 JSP로 전송하는 클래스 => RequestDispatcher
		/*
		 *      Model 
		 *      
		 *      ==> return "board/list.jsp"
		 *      ==> return "redirect:list.do" => Spring
		 *      
		 *      insert_ok.jsp ==> list.jsp
		 *      update_ok.jsp
		 */
		if(jsp.startsWith("redirect"))
		{
			response.sendRedirect(jsp.substring(jsp.indexOf(":")+1));
			// 화면 이동 ==> sendRedirect() => request가 초기화 
		}
		else
		{
			RequestDispatcher rd=request.getRequestDispatcher(jsp);
			rd.forward(request, response);
			// 화면 이동 ==> forward  ===> request를 전송 => jsp에서 request에 담은 데이터를 받아서 출력 
		}
		
	}
    
}

 

com.sist.dao

BoardVO.java

package com.sist.dao;
import java.util.*;
public class BoardVO {
    private int no;
    private String name;
    private String subject;
    private String content;
    private String pwd;
    private Date regdate;
    private int hit;
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
	public Date getRegdate() {
		return regdate;
	}
	public void setRegdate(Date regdate) {
		this.regdate = regdate;
	}
	public int getHit() {
		return hit;
	}
	public void setHit(int hit) {
		this.hit = hit;
	}
   
}

 

BoardDAO.java

package com.sist.dao;
import java.util.*;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.*;
public class BoardDAO {
   // 파싱(XML) => SqlSessionFactory
	private static SqlSessionFactory ssf;
	// 구동하기전에 자동으로 파싱을 한다 => 초기화블럭 (static => static{} , instance => {})
	static
	{
		// 오류 처리  => Mybatis (컴파일 오류(X) => 에러가 발생시에 찾기 어렵다)
		try
		{
			// IO => 파일경로 , 파일명이 틀릴경우에 처리(컴파일예외=>반드시 예외처리를 한다)
			// 파일 읽기
			Reader reader=Resources.getResourceAsReader("Config.xml");
			// MyBatis,Spring => classpath(자동으로 인식하는 경로 : src) 
			// XML 파싱 
			ssf=new SqlSessionFactoryBuilder().build(reader);
		}catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
	/*
	 *   <select id="boardListData" resultType="BoardVO" parameterType="hashmap">
		   SELECT no,subject,name,regdate,hit,num
		   FROM (SELECT no,subject,name,regdate,hit,rownum as num
		   FROM (SELECT no,subject,name,regdate,hit 
		   FROM freeboard ORDER BY no DESC))
		   WHERE num BETWEEN #{start} AND #{end}
		  </select>
		  <select id="boardTotalPage" resultType="int">
		   SELECT CEIL(COUNT(*)/10.0) FROM freeboard
		  </select>
	 */
	//            resultType                parameterType
	public static List<BoardVO> boardListData(Map map)
	{
		List<BoardVO> list=new ArrayList<BoardVO>();
		SqlSession session=ssf.openSession();// Connection얻기
		list=session.selectList("boardListData",map);
		session.close();//Connection반환
		return list;// null 
	}
	public static int boardTotalPage()
	{
		int total=0;
		SqlSession session=ssf.openSession();
		total=session.selectOne("boardTotalPage");
		session.close();
		return total;
	}
	/*
	 *   <update id="hitIncrement" parameterType="int">
		     UPDATE freeboard SET
		     hit=hit+1
		     WHERE no=#{no}
		   </update>
		   <select id="boardDetailData" resultType="BoardVO" parameterType="int">
		     <!-- public BoardVO boardDetailData(int no) -->
		     SELECT no,name,subject,content,regdate,hit
		     FROM freeboard
		     WHERE no=#{no}
		   </select>
	 */
	/*
	 *   CURD 
	 *     <select>
	 *       SQL => 1개만 사용 (select문장)
	 *     </select>
	 *     <insert>
	 *       1개 (insert)
	 *     </insert>
	 *     <update>
	 *     </update>
	 *     <delete>
	 *     </delete>
	 *     
	 *     단 => 구현한 메소드는 여러개를 동시에 읽어서 처리 
	 */
	public static BoardVO boardDetailData(int no)
	{
		SqlSession session=ssf.openSession();
		// 조회수 증가
		session.update("hitIncrement", no);
		session.commit();// 정상적으로 저장 
		// 데이터 읽기
		BoardVO vo=session.selectOne("boardDetailData", no);
		// 반환
		session.close();
		return vo;
	}
}

 

board-mapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sist.dao.board-mapper">
  <select id="boardListData" resultType="BoardVO" parameterType="hashmap">
   SELECT no,subject,name,regdate,hit,num
   FROM (SELECT no,subject,name,regdate,hit,rownum as num
   FROM (SELECT no,subject,name,regdate,hit 
   FROM freeboard ORDER BY no DESC))
   WHERE num BETWEEN #{start} AND #{end}
  </select>
  <select id="boardTotalPage" resultType="int">
   SELECT CEIL(COUNT(*)/10.0) FROM freeboard
  </select>
  <!-- 상세보기 : 조회수 증가, 게시물 1개를 읽어 온다 (VO)
  		mybatis에서 태그에 SQL문장은 1번만 사용이 가능
   -->
   <!-- 조회수 증가 -->
   <!-- 
   		resultType (X) ==> void
   		parameterType(매개변수) ==> (int no)
    -->
   <update id="hitIncrement" parameterType="int">
   	UPDATE freeboard SET 
   	hit=hit+1 
   	WHERE no=#{no}
   </update>
   <select id="boardDetailData" resultType="BoardVO" parameterType="int">
   	<!-- public BoardVO boardDetailData(int no) -->
   	SELECT no,name,subject,content,regdate,hit 
   	FROM freeboard 
   	WHERE no=#{no}
   </select>
</mapper>

 

com.sist.model

Model.java

package com.sist.model;

import javax.servlet.http.HttpServletRequest;

public interface Model {
    // 기능(요청) 처리하는 메소드 => Model의 모든 클래스가 요청을 처리하기 위한 메소드 
	public String handlerRequest(HttpServletRequest request);// Call By References
	// 주소(메모리) ==> 값을 주소에 채워주는 방식 (클래스,배열=>메모리 주소를 이용하는 방식)
	/*
	 *   매개변수 전송 방식 : Call by Value : 다른 메모리에 값을 복사(일반 데이터)
	 *                  Call by Reference : 같은 메모리 주소 원본이 넘어간다 
	 *                  
	 *   MVC 동작 순서
	 *      브라우저에서 요청을 받는 경우(JSP/Servlet) 
	 *           request     (request를 받아서)    request   데이터베이스 연결 
	 *   사용자   ===========  컨트롤러   ============ Model클래스  ========== 데이터베이스(DAO) 
	 *            결과값을 받는다       request에 값을 담아서  (setAttribute())
	 *                                                     결과값이 있는 request => 받아서 출력
	 *   ========= Model 클래스 ============== 컨트롤러  ============= JSP로 전송 =========> 사용자 
	 *   
	 *   사용자가 보내준 request를 이용해서 ==> 결과값을 담아 준다  ==> (request는 전체 동일 하다)
	 *                                                   ======================
	 *                                                    Call By Reference
	 *                                                    
	 *   1) 컨트롤러 : 서블릿 (모델과 뷰를 연결해 주는 역할 수행)
	 *   2) 모델 : 요청 처리 ==> 확장(재사용) 일반 자바
	 *   3) 뷰 : 요청 처리된 결과값을 출력 ==> JSP (EL,JSTL)
	 *   
	 *   <%
         // 사용자가 보내준 게시물를 받는다
         // detail.jsp?no=10
            String no=request.getParameter("no");
         // DAO 전송
           BoardDAO dao=new BoardDAO();
           BoardVO vo=dao.boardDetailData(Integer.parseInt(no));  ==> 자바로 구현 (모델)
		%>
		===================== 모델
		<!DOCTYPE html>
		<html>
		<head>
		<meta charset="UTF-8">
		<title>Insert title here</title>
		<link rel="stylesheet" href="table.css">
		</head>
		<body>
		   <center>
		     <h1>내용보기</h1>
		     <table class="table_content" width=700>
		       <tr>
		         <th width=20%>번호</th>
		         <td width=20% align="center"><%=vo.getNo() %></td>
		         <th width=20%>작성일</th>
		         <td width=20% align="center"><%=vo.getRegdate().toString() %></td>
		       </tr>
		       <tr>
		         <th width=20%>이름</th>
		         <td width=20% align="center"><%=vo.getName() %></td>
		         <th width=20%>조회수</th>
		         <td width=20% align="center"><%=vo.getHit() %></td>
		       </tr>
		       <tr>
		         <th width=20%>제목</th>
		         <td colspan="3" align="left"><%=vo.getSubject() %></td>
		       </tr>
		       <tr>
		         <td colspan="4" height="200" valign="top"><pre><%=vo.getContent() %></pre></td>
		       </tr>
		       <tr>
		         <td colspan="4" align="right">
		           <a href="update.jsp?no=<%=vo.getNo()%>">수정</a>&nbsp;
		           <a href="#">삭제</a>&nbsp;
		           <a href="list.jsp">목록</a>
		         </td>
		       </tr>
		     </table>
		   </center>
		</body>
		</html>
		=================== View 
		
		컨트롤러 ==> 연결해야되는 모델과 뷰를 알고 있다 (518~520page)
		  1) 요청 받는다 
		     String cmd=request.getRequestURI() 
		       => (list).do
		  2) 모델을 찾는다   ==> ListModel
		  3) 모델에서 넘겨준 결과값을 request,session에 담아서
		       request.setAttribute()
		  4) JSP를 찾고 => request, session을 넘겨준다 
		       forward(request,responae)
		       
		       list.do ==> ListModel    ====> list.jsp
		       detail.do ==> DetailModel ===> detail.jsp  ==> Map을 이용해서 (요청:키,해당 자바파일)
		       
		       ***** Controller가 수정하기 위해서 Controller를 소스수정 ==> 전체 사이트를 구동할 수 없다 
		       *
		       *  파일을 이용한다 (.properties,.xml)
		       *                          ===== Spring,struts
		       
	 *          
	 */
}

DetailModel.java

package com.sist.model;

import javax.servlet.http.HttpServletRequest;
import com.sist.dao.*;
// ==> 게시판 상세보기 처리 
public class DetailModel implements Model{

	@Override
	public String handlerRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		// detail.do?no=1
		// request.setParameter("no",1); ==>  ==> request.getParameter("no") ==> 1
		// 사용자가 보낸 값을 request에 묶어서 넘겨주는 역할 (톰캣)
		// service(HttpServletRequest request) => request가 매개변수 ==> 화면이 변경될때마다 request가 초기화
		// 1. 사용자 보내준 게시물번호를 받는다 
		String no=request.getParameter("no");
		// 2. BoardDAO를 통해서 게시물 한개를 읽어 온다 (BoardVO) ==> SQL문장 실행 => board-mapper.xml
		BoardVO vo=BoardDAO.boardDetailData(Integer.parseInt(no));
		// 3. 읽어온 BoardVO값을 jsp로 전송 
		
		request.setAttribute("vo", vo);
		return "board/detail.jsp";
	}

}

 

InsertModel.java

package com.sist.model;

import javax.servlet.http.HttpServletRequest;
// 글쓰기 요청시 처리 
public class InsertModel implements Model{

	@Override
	public String handlerRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		return "board/insert.jsp";// 화면만 이동 
	}

}

 

InsertOkModel.java

package com.sist.model;

import javax.servlet.http.HttpServletRequest;
/*
 *     list.jsp => HTML만 출력한다 (데이터가 없는 상태)
 *     list.do  => 데이터를 list.jsp로 전송후에 출력 
 *     
 *     list.jsp
 *     <%
 *                                      list.do
 *         List<BoardVO> list=BoardDAO.boardListData(); =>ListModel
 *     %>
 *     <html>
 *       <body>
 *         for(BoardVO vo:list)
 *         {
 *         }
 *       </body>
 *     </html>
 *     
 *     list.jsp ==> 그냥 출력 
 *                                         request
 *     list.do ==> Controller ==> ListModel ===> JSP (request에 설정된 데이터를 출력 : ${})
 */
public class InsertOkModel implements Model{

	@Override
	public String handlerRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		return "redirect:list.do";// 이동 => 목록 ==> list.jsp(X) , list.do
	}

}

 

ListModel.java

package com.sist.model;

import javax.servlet.http.HttpServletRequest;
// 게시판 목록처리 ==>
/*
 *    <%@ page contentType="text/html;charset=UTF-8" %>
 *    <%
 *         목록처리 
 *         List에 값을 채운다  ==> Model
 *    %>
 *    ==============================
 *    <html>
 *     <body>
 *        List를 출력하는 내용 
 *     </body>
 *    </html>
 *    ============================== View
 */
import java.util.*;
import com.sist.dao.*;
public class ListModel implements Model{

	@Override
	public String handlerRequest(HttpServletRequest request) {
		// TODO Auto-generated method stub
		// 게시물 목록을 가지고 온다 => request에 값을 담아서 JSP로 전송
		String page=request.getParameter("page"); // 사용자가 요청한 페이지를 받는다 
		if(page==null) // 게시판을 실행할때 => 첫페이지 
			page="1"; //default 
		int curpage=Integer.parseInt(page);
		// 현재 페이지 ==> list목록을 가지고 온다
		Map map=new HashMap();
		// WHERE num BETWEEN #{start} AND #{end}
		// start(시작위치,끝위치) => MyBatis에서 처리  
		int rowSize=10;
		int start=(rowSize*curpage)-(rowSize-1); // rownum은 시작이 1부터 
		int end=rowSize*curpage;
		/*
		 *   1page ==> 1 AND 10
		 *   2page ==> 11 AND 20
		 */
		map.put("start", start);
		map.put("end", end);
		
		List<BoardVO> list=BoardDAO.boardListData(map);
		
		int totalpage=BoardDAO.boardTotalPage();
		
		/*
		 *   JSP로 전송해야될 데이터는 3개 (현재페이지,총페이지 , list목록)
		 */
		request.setAttribute("list", list);
		request.setAttribute("curpage", curpage);
		request.setAttribute("totalpage", totalpage);
		// 여기서 전송된 것이 아니라 ==> Controller에서 request를 받아서 전송 
		/*
		 *    사용자 요청   ====> Controller  ===> Model ===== BoardDAO 
		 *    Model ==== Controller ===> JSP
		 */
		return "board/list.jsp";// 어떤 JSP로 request를 보낼것인지 
	}

}

 

WebContent

index.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	response.sendRedirect("list.do");
	// JavaScript : location.href="list.do"
%>

 

WEB-INF/

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- applicationContext.xml
     사용자 요청 => list.do 
           => ListModel클래스를 찾을 수 있게 만든다 (매칭)
           
   Model클래스 등록 => Controller가 찾아서 요청 처리가 가능하게 만드는 파일
 -->
<beans><!-- 스프링 Bean(Model클래스) -->
  <bean id="list.do" class="com.sist.model.ListModel"/>
  <bean id="detail.do" class="com.sist.model.DetailModel"/>
  <bean id="insert.do" class="com.sist.model.InsertModel"/>
  <bean id="insert_ok.do" class="com.sist.model.InsertOkModel"/>
  <!-- 
         map.put("list",new ListModel())
   -->
</beans>

 

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>OnLineStudy16_MVC1</display-name>
  <!-- Servlet 등록 -->
  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>com.sist.controller.Controller</servlet-class>
    <!-- 
          Controller가 읽어갈 XML의 위치 저장 
     -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/Users/yongpro/Desktop/JAVA1/HelloWorld/OnLineStudy16_MVC1/WebContent/WEB-INF/applicationContext.xml</param-value>
    </init-param>
  </servlet>
  <servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>*.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
  <!-- URL주소에 파일명 없이 자동 실행이 가능하게 만든다 : 등록된 파일만 가능 (추가해서 사용이 가능) -->
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>main.jsp</welcome-file>
    <!-- 추가 -->
  </welcome-file-list>
</web-app>

 

board/

detail.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>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
   margin: 0px auto; /*가운데 정렬*/
   width:700px;
}
h1 {
     text-align: center;
}
</style>
</head>
<body>
  <div class="container">
    <div class="row">
      <h1>내용보기</h1>
      <table class="table table-striped">
        <tr>
          <th class="text-center danger" width=20%>번호</th>
          <td class="text-center" width=30%>${vo.no }</td>
          <th class="text-center danger" width=20%>작성일</th>
          <td class="text-center" width=30%>
            <fmt:formatDate value="${vo.regdate }" pattern="yyyy/MM/dd"/>
          </td>
        </tr>
        <tr>
          <th class="text-center danger" width=20%>이름</th>
          <td class="text-center" width=30%>${vo.name }</td>
          <th class="text-center danger" width=20%>조회수</th>
          <td class="text-center" width=30%>${vo.hit }</td>
        </tr>
        <tr>
          <th class="text-center danger" width=20%>제목</th>
          <td class="text-left" colspan="3">${vo.subject }</td>
        </tr>
        <tr>
          <td class="text-left" colspan="4" valign="top" height="200">
            <pre style="white-space: pre-wrap;border: none;background-color: white">${vo.content }</pre>
          </td>
        </tr>
        <tr>
          <td colspan="4" class="text-right">
            <a href="update.jsp?no=${vo.no }" class="btn btn-xs btn-success">수정</a>
            <a href="delete.jsp?no=${vo.no }" class="btn btn-xs btn-info">삭제</a>
            <a href="list.jsp" class="btn btn-xs btn-warning">목록</a>
          </td>
        </tr>
      </table>
    </div>
  </div>
</body>
</html>

 

insert.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" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<style type="text/css">
.row {
   margin: 0px auto; /*가운데 정렬*/
   width:700px;
}
h1 {
     text-align: center;
}
</style>
</head>
<body>
  <div class="row">
   <h1 class="text-center">글쓰기</h1>
   <form method="post" action="insert_ok.do">
   <table class="table table-hover">
     <tr>
       <th class="danger text-right" width=15%>이름</th>
       <td width=85%>
         <input type=text name=name size=15 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>제목</th>
       <td width=85%>
         <input type=text name=subject size=45 class="input-sm">
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>내용</th>
       <td width=85%>
         <textarea rows="10" cols="50" name=content></textarea>
       </td>
     </tr>
     <tr>
       <th class="danger text-right" width=15%>비밀번호</th>
       <td width=85%>
         <input type=password name=pwd size=10 class="input-sm">
       </td>
     </tr>
     <tr>
       <td colspan="2" class="text-center">
         <input type=submit value=글쓰기 class="btn btn-sm btn-primary">
         <input type=button value=취소 class="btn btn-sm btn-primary"
           onclick="javascript:history.back()"
         >
       </td>
     </tr>
   </table>
   </form>
  </div>
</body>
</html>

 

list.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"%>
<%--
       request.getParameter() : 사용자가 요청한 데이터 
       request.setAttribute() => request.getAttribute()
       ================================================
               사용자가 요청한 데이터 외에 다른 데이터 추가해서 사용 
               
        => id , pwd 로그인 ===> 서버에서는 개인정보 여러개 추가 
                              name , 주소
       
 --%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
</head>
<body>
  <div class="container">
   <div class="row">
     <h1 class="text-center">자유게시판</h1>
     <table class="table">
       <tr>
         <td>
           <a href="insert.do" class="btn btn-sm btn-primary">새글</a>
         </td>
       </tr>
     </table>
     <table class="table table-striped">
       <tr class="danger">
         <th class="text-center" width=10%>번호</th>
         <th class="text-center" width=45%>제목</th>
         <th class="text-center" width=15%>이름</th>
         <th class="text-center" width=20%>작성일</th>
         <th class="text-center" width=10%>조회수</th>
       </tr>
       <c:forEach var="vo" items="${list }">
        <tr>
          <td class="text-center" width=10%>${vo.no }</td>
          <td class="text-left" width=45%>
           <a href="detail.do?no=${vo.no }">${vo.subject }</a>
          </td>
          <td class="text-center" width=15%>${vo.name }</td>
          <td class="text-center" width=20%>
           <fmt:formatDate value="${vo.regdate }" pattern="yyyy-MM-dd"/>
          </td>
          <td class="text-center" width=10%>${vo.hit }</td>
        </tr>
       </c:forEach>
      </table>
      <table class="table table-striped">
        <tr>
          <td class="text-right">
            <a href="list.do?page=${curpage>1?curpage-1:curpage }" class="btn btn-sm btn-danger">이전</a>
              ${curpage } page / ${totalpage } pages
            <a href="list.do?page=${curpage<totalpage?curpage+1:curpage }" class="btn btn-sm btn-primary">다음</a>
          </td>
        </tr>
      </table>
     </div>
    </div>
</body>
</html>

 

 

반응형
Comments