본문 바로가기

programming/Gukbi

국비 교육 84일차 - spring tiles

728x90
반응형

정처기 실기 본다고 복습 블로깅을 제대로 못했다. 오늘부터 다시 열심히 고고

 

일단 tiles를 쓰면 구조가 이렇게 된다 

WEB-INF 폴더 밑에 XML 파일을 만들어주고, 내용은 아래와 같이 설정해준다. 

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
  <!-- 화면 설정 
       @Contoller
       public class MainController
       {
           @RequestMapping("main/main.do")
           public String main_main()
           {
               ==
               ==
               ==
               return "main";
           }
       }
  -->
  <definition name="main" template="/WEB-INF/main/main.jsp">
    <!-- include할 파일 설정 -->
    <put-attribute name="header" value="/WEB-INF/main/header.jsp"/>
    <put-attribute name="menu" value="/WEB-INF/main/menu.jsp"/>
    <put-attribute name="content" value="/WEB-INF/main/content.jsp"/>
    <put-attribute name="footer" value="/WEB-INF/main/footer.jsp"/>
  </definition>
  <!-- extends="main" main의 구조를 그대로 읽어 온다  -->
  <!-- <definition name="board/list" extends="main">
    <put-attribute name="content" value="/WEB-INF/board/list.jsp"></put-attribute>
  </definition>
  <definition name="notice/list" extends="main">
    <put-attribute name="content" value="/WEB-INF/notice/list.jsp"></put-attribute>
  </definition> -->
  <definition name="*/*" extends="main">
    <put-attribute name="content" value="/WEB-INF/{1}/{2}.jsp"></put-attribute>
  </definition>
  <definition name="*/*/*" extends="main">
    <put-attribute name="content" value="/WEB-INF/{1}/{2}/{3}.jsp"></put-attribute>
  </definition>
</tiles-definitions>

 가장 기본으로 깔릴 파일을 defintion name에 설정을 해둔다. 

그리고 그 안에 include될 파일들의 name과 경로명을 설정해준다. 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
  <center>
    <table width=900 height=700 border=1 bordercolor=black>
      <tr>
        <td colspan="2" height=100>
          <tiles:insertAttribute name="header"/>
        </td>
      </tr>
      <tr>
        <td width=200 height=500>
          <tiles:insertAttribute name="menu"/>
        </td>
        <td width=700 height=500>
          <tiles:insertAttribute name="content"/>
        </td>
      </tr>
      <tr>
        <td colspan=2 height=100>
           <tiles:insertAttribute name="footer"/>
        </td>
      </tr>
    </table>
  </center>
</body>
</html>

 그리고 include 해줄 자리에

 <tiles:insertAttribute name="header"/>

를 써서 화면이 출력되게 만들어 준다. 

 

위에는 기본적인 예제였다면 아래는 실제 프로젝트처럼 완성을 해봤다. 

<?xml version="1.0" encoding="UTF-8"?>
<!--  배치 -->
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">
<tiles-definitions>
  <definition name="main" template="/WEB-INF/main/main.jsp">
    <put-attribute name="header" value="/WEB-INF/main/header.jsp"/>
    <put-attribute name="nav" value="/WEB-INF/main/nav.jsp"/>
    <put-attribute name="content" value="/WEB-INF/main/content.jsp"/><!-- 변경되는 영역 -->
    <put-attribute name="footer" value="/WEB-INF/main/footer.jsp"/>
    <put-attribute name="copy" value="/WEB-INF/main/copy.jsp"/>
  </definition>
  <definition name="*/*" extends="main">
  	<put-attribute name="content" value="/WEB-INF/{1}/{2}.jsp"/>
  </definition>
</tiles-definitions>

 만약 main위에 있는 content의 내용을 계속 바꿔주려면 이렇게 코드를 써주면 된다. 

package com.sist.web;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MainController {
	@RequestMapping("main/main.do")
	public String main_main()
	{
		return "main";
	}
}

 사용자가 보내온 요청에 응답하기 위해서 위와 같이 controller를 만들어 준다. 

 

definition name값과 return값을 맞추면 화면이 include되어 띄워진다. 

 

 

그리고 이건 tiles의 내용은 아니지만 앞으로 사용할 RestController의 내용

 

package com.sist.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
import com.sist.vo.*;
import com.sist.dao.*;
// _ok.jsp실행하는 경우 (update,delete => 비밀번호가 검색후...) => JSON,일반 문자열 , Ajax,VueJS
// 페이지 이동(@Controller)이 아니라 실제 데이터값 전송 (한글 변환을 반드시 체크)
@RestController  
// @ResponseBody => 모바일,Front연결 => JSON => 변경(승격) @RestController
public class FreeBoardRestController {
   // DAO가 필요하다(스프링에서 관리하는 클래스 => 특별한 경우가 아닐때 싱글턴(메모리 할당을 1번 해서 재사용:디자인 패턴)
   /*
    *   디자인 패턴 (23개) => GOF패턴 
    *   스프링에서는 8개 사용 
    *     = 싱글턴 
    *     = 팩토리 (lookup=>getBean()) => DriverManager
    *     = POJO => 필요한 경우에 형변환 ( Adapter 패턴 )
    *     = MVC 패턴 
    *     = 프록시패턴 (대신 호출:대리자) : AOP
    */
   @Autowired
   private FreeBoardDAO fDao;
   
   @PostMapping("board/update_ok.do")
   public String board_update_ok(FreeBoardVO vo,int page)
   {
	   String result="";
	   // 비밀번호가 O(상세보기 이동) , X(자바스크립트 history.back())
	   boolean bCheck=fDao.freeboardUpdate(vo);
	   // 결과값을 가지고 올때 DAO를 연결 
	   if(bCheck==true)
	   {
		   result="<script>location.href=\"../board/detail.do?no="+vo.getNo()+"&page="+page+"\";</script>";
	   }
	   else
	   {
		   result="<script>alert(\"비밀번호가 틀립니다!!\");history.back();</script>";
	   }
	   return result;
   }
}

 사용자가 수정을 누르면, dao에서 비밀번호가 맞는지 확인을 해주고 값을 가져오게 한다. 

 

비밀번호가 맞으면 상세보기로 이동을하고, 틀리면 javascript history.back()으로 되돌아 간다. 

728x90
반응형