무작정 개발.Vlog

[Struts1] Struts1/iBatis 게시판 만들기

by 무작정 개발
반응형
2022.03.08(52일 차) - 화요일

 

이번에는 기존에 Struts1 + JDBC가 아닌 Struts1 + iBatis로 게시판을 만들 예정이다.

 

iBatis 설치 및 초기 세팅을 이전 글에 정리했으니 참고!

https://backendcode.tistory.com/83

 

iBatis(2.0) 설치 및 초기 세팅

2022.03.08(52일 차) 기존까지는 JDBC로 게시판을 제작해서 DB를 연동했지만 오늘은 iBatis를 사용해서 DB를 연결해서 게시판을 만들 예정 기존까지는 JDBC로 DB를 연결해서 게시판을 만들었다. 하지만 오

backendcode.tistory.com

 

 

오늘의 수업 내용

 

Struts + iBatis 게시판 만들기

 

Struts & iBatis 게시판
Struts & iBatis 게시판

이번엔 위의 사진의 게시판을 만들 것이다. 기존에 했던 JSP, Servlet 게시판과 크게 다른 점이 없다.

 

 

초기 세팅 - (XML작업)

 

XML파일 생성 위치
XML파일 생성 위치

 

boardTest_sqlMap.xml 생성

  • 이전에 만들었던 패키지 com.util.sqlMap에 xml파일을 만들어준다.
  • DAO의 역할을 하는 boardTest_sqlMap.xml 생성
  • 칼럼명 앞뒤에 #을 쓰면 물음표로 자동 인식 처리된다. 세미콜론(;) 사용 x
  • 여기서 작성되는 SQL문은 기존에 getter/setter를 통해  진행되는 DAO클래스 역할을 해줌
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC "-/ibatis.apache.org//DTO SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<!-- parameterClass: 가져오는 것 / resultClass : 내보내는것 -->

<!-- Mapper -->
<sqlMap namespace="board">
<select id="maxNum" resultClass="int">
	select nvl(max(num),0) from board
</select>

<!-- 게시글 입력(insert) -->
<insert id="insertData" parameterClass="com.boardTest.BoardForm">
	insert into board (num,subject,name,email,content,pwd,
	ipAddr,hitCount,created) values (#num#,#subject#,#name#,
	#email#,#content#,#pwd#,#ipAddr#,0,sysdate)
</insert>

<!-- 반복적인 내용을 처리 -->
<sql id="where-list">

	<!-- searchkey에 subject가 오면 이 where문을 실행한다. -->
	<isEqual property="searchKey" compareValue="subject">
		where subject like '%' || #searchValue# || '%'
	</isEqual>
	
	<!-- searchKey에 name이 오면-->
	<isEqual property="searchKey" compareValue="name">
		where name like '%' || #searchValue# || '%'
	</isEqual>
	
	<!-- searchKey에 content가 오면 -->
	<isEqual property="searchKey" compareValue="content">
		where content like '%' || #searchValue# || '%'
	</isEqual>
	
</sql>

<sql id="field-list">
	num,name,subject,hitCount,to_char(created,'YYYY-MM-DD') created
</sql>


<!--resultClass는 반환값  /int 대신 Integer써도 된다. -->
<!-- 매개변수는 parameterClass /여기에 매개변수를 하나밖에 못써서 
commonDAO에서 map에 2개의 매개변수를 넣어줘서 여기에 map을 씀-->
<!-- 파라미터는 들어오는값(받아내는값) / 리절트는 나가는 값(반환값) -->

<!-- 전체 데이터갯수 -->
<select id="dataCount" resultClass="Integer" parameterClass="map">
	select nvl(count(num),0) from board
	<include refid="where-list"/>
</select>

<!-- list 데이터 조회 -->
<select id="listData" resultClass="com.boardTest.BoardForm"
	parameterClass="map">
	select * from(
	select rownum rnum,data.* from (
	<!-- select num,name,subject,hitCount,to_char(created,'YYYY-MM-DD') created -->
	select <include refid="field-list"/> from board
	where $searchKey$ like '%' || #searchValue# || '%'
	order by num desc) data)
	<!-- CDATA 안에 있는 것은 모두 텍스트로 변환 -->
<![CDATA[
	where rnum >= #start# and rnum <= #end#
]]>
</select>

<!-- num으로 한개의 데이터 읽어오기 -->
<select id="readData" resultClass="com.boardTest.BoardForm"
	parameterClass="int">
	select num,name,subject,email,pwd,content,ipAddr,hitCount,
	created from board where num=#num#
</select>

<!-- 조회수 증가 -->
<update id="hitCountUpdate" parameterClass="int">
	update board set hitCount=hitCount+1 where num=#name#
</update>

<!-- 이전글 -->
<select id="preReadData" resultClass="com.boardTest.BoardForm"
	parameterClass="map">
	select data.* from (
	select num,subject from board
	where ($searchKey$ like '%' || #searchValue# || '%')
	and (num>#num#) order by num asc) data
	where rownum=1
</select>

<!-- 다음글 -->
<select id="nextReadData" resultClass="com.boardTest.BoardForm"
	parameterClass="map">
	select data.* from (
	select num,subject from board
	where ($searchKey$ like '%' || #searchValue# || '%')
<![CDATA[
	and (num<#num#) order by num desc) data
	where rownum=1
]]>
</select>

<!-- 수정 -->
<update id="updateData" parameterClass="com.boardTest.BoardForm">
	update board set name=#name#,subject=#subject#,email=#email#,
	content=#content#,pwd=#pwd# where num=#num#
</update>


<!-- 삭제 -->
<delete id="deleteData" parameterClass="int">
	delete board where num=#num#
</delete>

</sqlMap>

 

이전에 만들었던 sqlMapConfig.xml에 sqlMap 등록하기

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-/ibatis.apache.org//DTO SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">


<!-- cacheModelsEnabled="false" -> 캐쉬를 사용하지 말라는 뜻 -->
<!-- useStatementNamespaces -> sqlMap.xml에서 namespace 사용가능하게 해줌 -->
<!-- <dataSource type="SIMPLE"> -> 단일 DB사용 -->
<!-- property : 등록 -->
<!-- sqlMap resource :  com/util/sqlMap/boardTest_sqlMap.xml 를 불러옴-->

<!-- Config(환경설정파일) -->
<sqlMapConfig>
	<settings
	cacheModelsEnabled="false"	
	useStatementNamespaces="true"/> 
	
	<!-- DB연결자.JDBC등록된 내용도있고, 이 내용도 함께 존재해야함 -->
	<transactionManager type="JDBC" commitRequired="false">
		<dataSource type="SIMPLE">
			<property name="JDBC.Driver" value="oracle.jdbc.driver.OracleDriver"/>
			<property name="JDBC.ConnectionURL" value="jdbc:oracle:thin:@localhost:1521:xe"/>
			<property name="JDBC.Username" value="suzi"/>
			<property name="JDBC.Password" value="a123"/>
		</dataSource>
	</transactionManager>
	
	<sqlMap resource="com/util/sqlMap/boardTest_sqlMap.xml"/>
</sqlMapConfig>

WEB_INF에  config.xml생성 후 web.xml에 매핑 경로 추가하기

 

struts-config_boardTest.xml 생성
struts-config_boardTest.xml 생성

위의 경로 (WebContent / WEB-INF / struts-config_boardTest.xml생성

 

struts-config_boardTest.xml 생성

  • Controller의 역할을 하는 xml이다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config 
PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">

<!-- <forward name="created_ok" redirect="true" :세션이나 update.delete,insert는 redirect를 써야함 -->

<struts-config>

	<form-beans>
		<form-bean name="boardTestForm" type="com.boardTest.BoardForm"/>
	</form-beans>
	
	<action-mappings>
	
		<action path="/boardTest" type="com.boardTest.BoardAction"
			name="boardTestForm" scope="request" parameter="method">
			
			<forward name="created" path="/boardTest/created.jsp"/>
			<forward name="created_ok" redirect="true" path="/boardTest.do?method=list"/>
			<forward name="list" path="/boardTest/list.jsp"/>
			<forward name="article" path="/boardTest/article.jsp"/>
			<forward name="deleted" redirect="true" path="/boardTest.do?method=list"/>
		</action>
	
	</action-mappings>

</struts-config>

 

web.xml에 매핑 경로 추가하기

<servlet>
  	<servlet-name>action</servlet-name>
  	<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  	<init-param>
  		<param-name>config</param-name>
  		<param-value>
  			/WEB-INF/struts-config.xml,
  			/WEB-INF/struts-config_test.xml,
  			/WEB-INF/struts-config_board.xml,
  			/WEB-INF/struts-config_boardTest.xml
  		</param-value>
  	</init-param>
  	<load-on-startup>2</load-on-startup>
  </servlet>
  
  <servlet-mapping>
  	<servlet-name>action</servlet-name>
  	<url-pattern>*.do</url-pattern>
  </servlet-mapping>

 

/WEB-INF/struts-config_boardTest.xml 추가!


Java Package 및 클래스 생성

 

패키지 생성
패키지 생성

패키지를 생성하고 2개의 클래스를 만들 것이다.

 

 

BoardAction 클래스 생성

  • boardDAO가 없으므로 CommonDAOImpl 객체 생성을 통해 CommonDAO 생성
  • 전역 변수로 dao 객체를 생성하게 되면 오류가 발생해서 메서드 안에 그때그때 CommonDAO를 생성해야 한다.
  • DB를 오픈하고 메서드를 실행하면 실행은 되지만 dao를 초기화하게되서 두 번째 실행 시 오류가 발생하기 때문
package com.boardTest;

import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.actions.DispatchAction;

import com.util.MyUtil;
import com.util.dao.CommonDAO;
import com.util.dao.CommonDAOImpl;

public class BoardAction extends DispatchAction {
	
	//게시글 작성(created)페이지
	public ActionForward created(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		//여기서 넘어오는 mode를 받아야 함 - (update가 왔을 때)
		//글올리기를 눌렀을때는 mode는 null, 글수정을 누르면 mode가 들어온다.
		String mode = request.getParameter("mode");
		
		//그래서 mode가 null인 경우랑 아닌 경우가 있으니
		if(mode==null) {//mode가 created일 경우
			request.setAttribute("mode", "insert");
		} else {//mode가 update일 경우
			
			//수정화면
			CommonDAO dao = CommonDAOImpl.getInstance();
			
			//article.jsp에서 넘긴 값을 받아줘야함
			int num = Integer.parseInt(request.getParameter("num"));
			String pageNum = request.getParameter("pageNum");
			
			BoardForm dto = 
					(BoardForm)dao.getReadData("board.readData", num);
			
			if(dto==null) {
				return mapping.findForward("list");				
			}
			
			request.setAttribute("dto", dto);
			request.setAttribute("mode", "updateOK");
			request.setAttribute("pageNum", pageNum);
		}
		
		return mapping.findForward("created"); 
	}
	
	//게시글 작성완료 시(created_ok)
	public ActionForward created_ok(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		//DB 연결자 가져온다. 그래서 inserdate등을 호출할 수 있게 된다.
		CommonDAO dao = CommonDAOImpl.getInstance();
				
		//Object로 넘어오니 다운캐스팅
		BoardForm f = (BoardForm)form;
		//넘어온 mode를 받아준다.
		String mode = request.getParameter("mode");
		
		if(mode.equals("insert")) {
		
		//boardTest_sqlMap.xml에 있는 board 안에 있는 maxNum호출
		int maxNum = dao.getIntValue("board.maxNum");
				
		f.setNum(maxNum + 1);
		f.setIpAddr(request.getRemoteAddr());
		
		//board.insertData : board안의 insertDate를 호출 / 
		//boardForm을 매개변수로 받아와야하는데 위에서 BoardForm을 f에 넣어줬으니 여기에 f를 쓴다.
		dao.insertData("board.insertData", f);
		
		} else if(mode.equals("updateOK")) {
			
			//수정
			String pageNum = request.getParameter("pageNum");
			
			//dao에서 update를 시킨다.
			dao.updateData("board.updateData", f);
			
			//pageNum을 넘기기위해 세션을 쓴다.
			HttpSession session = request.getSession();
			session.setAttribute("pageNum", pageNum);
			
		}
		//굳이 안해도 된다.
		dao = null; //insert랑 update를 사용하기때문에 null로 초기화
		
		
		return mapping.findForward("created_ok"); 
	}
	
	//게시판 리스트조회 시(list)
	public ActionForward list(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		
		CommonDAO dao = CommonDAOImpl.getInstance();
		
		
		String cp = request.getContextPath();
		MyUtil myUtil = new MyUtil();// 페이징처리
		
		// 기존 BoardServlet 내용의 list 부분 가져옴 
		String pageNum = request.getParameter("pageNum");

		int currentPage = 1;
		
		//수정에서 session에 올려놓은 pageNum 받기
		HttpSession session = request.getSession();
		
		if(pageNum==null) {
			pageNum = (String)session.getAttribute("pageNum");
		}
		//session을 받은 다음에 지워준다.(pageNum을)
		session.removeAttribute("pageNum");

		if(pageNum!=null)
			currentPage = Integer.parseInt(pageNum);

		String searchKey = request.getParameter("searchKey");
		String searchValue = request.getParameter("searchValue");
		
		
		// 디코딩해서 받는다
		// null값 찾기
		
		// 검색을안했으면
		if(searchValue==null||searchValue.equals("")) {
			searchKey = "subject";
			searchValue = "";
			
		}else {
			// 검색을했으면 
			if(request.getMethod().equalsIgnoreCase("GET")) {
				
				//디코더 시킨다.
				// 값을 UTF-8로 인코딩
				searchValue = URLDecoder.decode(searchValue, "UTF-8");
			}
		}
		
		//우리는 map에 담아서 데이터를 보내기 때문에 map에 담아줘야함
		Map<String, Object> hMap = new HashMap<>();
		hMap.put("searchKey", searchKey);
		hMap.put("searchValue", searchValue);
		
		// 검색한 데이터 전체 개수
		//boardTest_sqlMap.xml에 있는 select문 id="dataCount"에 hmap 매개변수와 함께 전달
		int dataCount = dao.getIntValue("board.dataCount", hMap);
		
		
		// 한화면에 표시할 데이터 개수
		int numPerPage = 5;
		int totalPage = myUtil.getPageCount(numPerPage, dataCount);

		if(currentPage>totalPage)
			currentPage = totalPage;
		
		//데이터베이스에서 가져올 시작과 끝위치 rnum
		int start = (currentPage-1)*numPerPage+1;
		int end = currentPage*numPerPage;
		
		hMap.put("start", start);
		hMap.put("end", end);
		//hMap에는 4개의 데이터가 존재(searchKey,searchValue,start,end)
		
		List<Object> lists =
				dao.getListData("board.listData", hMap);
		
		
		// 리스트에서 설치키 설치벨류를 article 로 값 보내기 
		String param = "";
		// null을 못찾을수있으니 조건 2번줌
		if(searchValue!=null&&!searchValue.equals("")) {
			
			// 검색을했으면
			param = "searchKey=" + searchKey;
			param+= "&searchValue=" + URLEncoder.encode(searchValue, "UTF-8");
		}
		
		// 가상의 주소를 담는다.	
		String listUrl = cp + "/boardTest.do?method=list";

		if(!param.equals("")) {
			
			// 널이아니면 검색을 했다.
			// myUtil 뒤에 검색된 주소가 딸려간다.
			// listUrl은 ?가 없으므로 붙인것
			listUrl += "&" + param;
		}

		String pageIndexList =
				myUtil.pageIndexList(currentPage, totalPage, listUrl);
		
		
		// 리스트를 클릭했을때 article로 넘어가는부분 
		
		// 글보기 주소를 만든다.
		// 검색을 안했다면
				
				
		// 현재페이지를 넘겨준다 ( 되돌아 올수있게 )
		String articleUrl = cp + "/boardTest.do?method=article&pageNum=" + currentPage;
		
		
		// 검색을 했다면 param 까지
		// 뒤에 붙일거니까 &를 붙이는것이다.
		if(!param.equals("")) {
			
			
			// articleUrl 은 ?가 있어서 	
			// 현재페이지를 넘겨준다 ( 되돌아 올수있게 - 키와 값 검색을했을때 되돌아올수있게 )
			articleUrl += "&" + param;
		}

		//포워딩 페이지에 데이터 넘기기
		request.setAttribute("lists", lists);
		request.setAttribute("articleUrl", articleUrl);
		request.setAttribute("pageIndexList", pageIndexList);
		request.setAttribute("pageNum", pageNum);
		request.setAttribute("totalPage", totalPage);
		
		// dataCount는 null이아닐떄 pageIndexList를 띄우기위해
		request.setAttribute("dataCount", dataCount);
		
		
		
		return mapping.findForward("list");
		
		
	}
	
	public ActionForward article(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		CommonDAO dao = CommonDAOImpl.getInstance();
		
		int num = Integer.parseInt(request.getParameter("num"));
		String pageNum = request.getParameter("pageNum");
		
		String searchKey = request.getParameter("searchKey");
		String searchValue = request.getParameter("searchValue");
		
		// 값이 있으면
		if(searchValue != null) {
			
			searchValue = URLDecoder.decode(searchValue, "UTF-8");
		}else {
			searchKey = "subject";
			searchValue = "";
		}
		
		//게시물번호(프라이머리키) 조회수 증가
		dao.updateData("board.hitCountUpdate", num);
		
		
		// 하나의 데이터 읽어온다
		// setAttribute("dto",dto);
		BoardForm dto = (BoardForm)dao.getReadData("board.readData", num);
		
		if(dto==null) {
			
			return mapping.findForward("list");
			
		}
		
		// 라인수 
		// setAttribute("line",lineSu);
		int lineSu = dto.getContent().split("\n").length;
		
		dto.setContent(dto.getContent().replace("\n", "<br/>"));
		
		//이전글,다음글
		String preUrl = "";
		String nextUrl = "";
		
		String cp = request.getContextPath();
		
		Map<String, Object> hMap = new HashMap<>();
		hMap.put("searchKey", searchKey);
		hMap.put("searchValue", searchValue);
		hMap.put("num", num);
		
		String preSubject = "";
		BoardForm preDTO =
				(BoardForm)dao.getReadData("board.preReadData", hMap);
		
		if(preDTO!= null) {
			
			preUrl = cp + "/boardTest.do?method=article&pageNum=" + pageNum;
			preUrl+= "&num=" + preDTO.getNum();
			
			preSubject = preDTO.getSubject();
			
		}
		

		String nextSubject = "";
		BoardForm nextDTO =
				(BoardForm)dao.getReadData("board.nextReadData", hMap);
		
		if(nextDTO!= null) {
			
			nextUrl = cp + "/boardTest.do?method=article&pageNum=" + pageNum;
			nextUrl+= "&num=" + nextDTO.getNum();
			
			nextSubject = nextDTO.getSubject();
			
		}
		
		String urlList = cp + "/boardTest.do?method=list&pageNum=" + pageNum;
		
		//검색을 했으면
		if(!searchValue.equals("")) {
			
			searchValue = URLEncoder.encode(searchValue, "UTF-8");
			
			urlList += "&searchKey=" + searchKey 
					+ "&searchValue=" + searchValue;
			
			if(!preUrl.equals("")) {
				
				preUrl += "&searchKey=" + searchKey 
						+ "&searchValue=" + searchValue;
				
			}
			
			if(!nextUrl.equals("")) {
				
				nextUrl += "&searchKey=" + searchKey 
						+ "&searchValue=" + searchValue;
				
			}
			
		}
		
		
		//수정과 삭제에서 사용할 인수
		String paramArticle = "num=" + num + "&pageNum=" + pageNum;
		
		request.setAttribute("dto", dto);
		request.setAttribute("preSubject", preSubject);
		request.setAttribute("preUrl", preUrl);
		request.setAttribute("nextSubject", nextSubject);
		request.setAttribute("nextUrl", nextUrl);
		request.setAttribute("linSu", lineSu);
		request.setAttribute("paramArticle", paramArticle);
		request.setAttribute("urlList", urlList);
		
		
		
		return mapping.findForward("article");
	}
	
	public ActionForward deleted(ActionMapping mapping, ActionForm form, 
			HttpServletRequest request, HttpServletResponse response)
			throws Exception {
		
		CommonDAO dao = CommonDAOImpl.getInstance();
		
		int num = Integer.parseInt(request.getParameter("num"));
		String pageNum = request.getParameter("pageNum");
		
		dao.deleteData("board.deleteData", num);
		
		HttpSession session = request.getSession();
		session.setAttribute("pageNum", pageNum);
		
		return mapping.findForward("deleted");
	
	}

}

 

BoardForm 클래스 생성

package com.boardTest;

import org.apache.struts.action.ActionForm;

public class BoardForm extends ActionForm {

	private static final long serialVersionUID = 1L;
	
	
	private int num;
	private String name;
	private String pwd;
	private String email;
	private String subject;
	private String content;
	private String ipAddr;
	private String created;
	private int hitCount;
    
    getter/setter 생성
    
}

JSP페이지 작성(게시판 리스트 조회 페이지, 게시판 글 작성 페이지, 게시글 조회 페이지)

 

list.jsp - (게시판 리스트 조회 페이지)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!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>게 시 판(Struts & iBatis)</title>

<link rel="stylesheet" type="text/css" href="<%=cp%>/boardTest/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/boardTest/css/list.css"/>

<script type="text/javascript">

	function searchData() {
		
		var f = document.searchForm;
		
		f.action = "<%=cp%>/boardTest.do?method=list";
		f.submit();
		
	}

</script>

</head>
<body>

<div id="bbsList">

	<div id="bbsList_title">
		게 시 판(Struts & iBatis)
	</div>
	<div id="bbsList_header">
		<div id="leftHeader">
		<form action="" method="post" name="searchForm">
			<select name="searchKey" class="selectField">
				<option value="subject">제목</option>
				<option value="name">작성자</option>
				<option value="content">내용</option>
			</select>
			<input type="text" name="searchValue" class="textField"/>
			<input type="button" value=" 검 색 " class="btn2" onclick="searchData();"/>		
		</form>				
		</div>
		<div id="rightHeader">
			<input type="button" value=" 글올리기 " class="btn2" 
			onclick="javascript:location.href='<%=cp%>/boardTest.do?method=created';"/>		
		</div>	
	</div>
	<div id="bbsList_list">
		<div id="title">
			<dl>
				<dt class="num">번호</dt>
				<dt class="subject">제목</dt>
				<dt class="name">작성자</dt>
				<dt class="created">작성일</dt>
				<dt class="hitCount">조회수</dt>
			</dl>
		</div>
		<div id="lists">
		<c:forEach var="dto" items="${lists }">
			<dl>
				<dd class="num">${dto.num }</dd>
				<dd class="subject">
				<a href="${articleUrl }&num=${dto.num}">
				${dto.subject }
				</a>
				</dd>
				<dd class="name">${dto.name }</dd>
				<dd class="created">${dto.created }</dd>
				<dd class="hitCount">${dto.hitCount }</dd>
			</dl>
		</c:forEach>
		</div>
		<div id="footer">
			<p>
			<c:if test="${dataCount!=0 }">
				${pageIndexList }
			</c:if>
			<c:if test="${dataCount==0 }">
				등록된 게시물이 없습니다.
			</c:if>
			</p>
		</div>
		
	</div>
	
</div>

</body>
</html>

 

실행화면(list.jsp)

게시판 조회 페이지
게시판 조회 페이지


created.jsp - (게시판 글 작성 페이지)

<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!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>게 시 판</title>

<link rel="stylesheet" type="text/css" href="<%=cp%>/boardTest/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/boardTest/css/created.css"/>

<script type="text/javascript" src="<%=cp%>/boardTest/js/util.js"></script>
<script type="text/javascript">

	function sendIt(){
		
		var f = document.myForm;
		
		str = f.subject.value;
		str = str.trim();
		if(!str){
			alert("\n제목을 입력하세요.");
			f.subject.focus();
			return;
		}
		f.subject.value = str;
		
		str = f.name.value;
		str = str.trim();
		if(!str){
			alert("\n이름을 입력하세요.");
			f.name.focus();
			return;
		}		
		
/* 		if(!isValidKorean(str)){
			alert("\n이름을 정확히 입력하세요.");
			f.name.focus()
			return;
		}		
		 */
		
		f.name.value = str;
		
		if(f.email.value){
			if(!isValidEmail(f.email.value)){
				alert("\n정상적인 E-Mail을 입력하세요.");
				f.email.focus();
				return;
			}
		}
		
		str = f.content.value;
		str = str.trim();
		if(!str){
			alert("\n내용을 입력하세요.");
			f.content.focus();
			return;
		}
		f.content.value = str;
		
		str = f.pwd.value;
		str = str.trim();
		if(!str){
			alert("\n패스워드를 입력하세요.");
			f.pwd.focus();
			return;
		}
		f.pwd.value = str;
		
		f.action = "<%=cp%>/boardTest.do";
		f.submit();
		
	}

</script>


</head>
<body>

<div id="bbs">
	<div id="bbs_title">
		게 시 판 (Struts + iBatis)
	</div>
	
	<form action="" method="post" name="myForm">
	<div id="bbsCreated">
		
		<div class="bbsCreated_bottomLine">
			<dl>
				<dt>제&nbsp;&nbsp;&nbsp;&nbsp;목</dt>
				<dd>
				<input type="text" name="subject" value="${dto.subject }" size="60" 
				maxlength="100" class="boxTF"/>
				</dd>
			</dl>		
		</div>
		
		<div class="bbsCreated_bottomLine">
			<dl>
				<dt>작성자</dt>
				<dd>
				<input type="text" name="name" value="${dto.name }" size="35" 
				maxlength="20" class="boxTF"/>
				</dd>
			</dl>		
		</div>
		
		<div class="bbsCreated_bottomLine">
			<dl>
				<dt>E-Mail</dt>
				<dd>
				<input type="text" name="email" value="${dto.email }" size="35" 
				maxlength="50" class="boxTF"/>
				</dd>
			</dl>		
		</div>
		
		<div id="bbsCreated_content">
			<dl>
				<dt>내&nbsp;&nbsp;&nbsp;&nbsp;용</dt>
				<dd>
				<textarea rows="12" cols="63" name="content"
				 class="boxTA">${dto.content }</textarea>
				</dd>
			</dl>
		</div>
		
		<div class="bbsCreated_noLine">
			<dl>
				<dt>패스워드</dt>
				<dd>
				<input type="password" name="pwd" size="35"  value="${dto.pwd }"
				maxlength="7" class="boxTF"/>
				&nbsp;(게시물 수정 및 삭제시 필요!!)
				</dd>
			</dl>		
		</div>	
	
	</div>
	
	<div id="bbsCreated_footer">
	
		<input type="hidden" name="method" value="created_ok"/>
		<input type="hidden" name="mode" value="${mode }"/>
		
		<c:if test="${mode=='insert' }">
			<input type="button" value=" 등록하기 " class="btn2" onclick="sendIt();"/>
			<input type="reset" value=" 다시입력 " class="btn2" 
			onclick="document.myForm.subject.focus();"/>
			<input type="button" value=" 작성취소 " class="btn2" onclick="javascript:location.href='<%=cp%>/boardTest.do?method=list';"/>
		</c:if>
		
		<c:if test="${mode=='updateOK' }">
		
			<input type="hidden" name="num" value="${dto.num }"/>
			<input type="hidden" name="pageNum" value="${pageNum }"/>
		
			<input type="button" value=" 수정하기 " class="btn2" onclick="sendIt();"/>
			<input type="button" value=" 수정취소 " class="btn2" onclick="javascript:location.href='<%=cp%>/boardTest.do?method=list';"/>
		</c:if>		
	</div>
	</form>
</div>

</body>
</html>

 

 

실행화면(created.jsp)

게시글 작성 페이지
게시글 작성 페이지


article.jsp - (게시글 조회 페이지)

  • 기존에 했던 게시판과 다르게 이전글,다음글을 볼 수 있는 기능 추가
<%@ page contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%
	request.setCharacterEncoding("UTF-8");
	String cp = request.getContextPath();
%>
<!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>게 시 판(Struts & iBatis)</title>

<link rel="stylesheet" type="text/css" href="<%=cp%>/boardTest/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/boardTest/css/article.css"/>

</head>
<body>

<div id="bbs">
	
	<div id="bbs_title">
		게 시 판(Struts & iBatis)
	</div>
	<div id="bbsArticle">
		
		<div id="bbsArticle_header">
			${dto.subject }
		</div>
		
		<div class="bbsArticle_bottomLine">
			<dl>
				<dt>작성자</dt>
				<dd>${dto.name }</dd>
				<dt>줄수</dt>
				<dd>${lineSu }</dd>
			</dl>		
		</div>
		
		<div class="bbsArticle_bottomLine">
			<dl>
				<dt>등록일</dt>
				<dd>${dto.created }</dd>
				<dt>조회수</dt>
				<dd>${dto.hitCount }</dd>
			</dl>		
		</div>
		
		<div id="bbsArticle_content">
			<table width="600" border="0">
			<tr>
				<td style="padding-left: 20px 80px 20px 62px;" 
				valign="top" height="200">
				${dto.content }
				</td>
			</tr>			
			</table>
		</div>
		
		<div class="bbsArticle_bottomLine">
			이전글:
			<c:if test="${!empty preUrl }">
			<a href="${preUrl }">${preSubject }</a>
			</c:if>
		
		</div>
		
		<div class="bbsArticle_noLine">
			다음글:
			<c:if test="${!empty nextUrl }">
			<a href="${nextUrl }">${nextSubject }</a>
			</c:if>
		</div>
		
	</div>
	
	<div class="bbsArticle_noLine" style="text-align: right">
	From : ${dto.ipAddr }
	</div>
	
	<div id="bbsArticle_footer">
		<div id="leftFooter">
			<input type="button" value=" 수정 " class="btn2" 
			onclick="javascript:location.href='<%=cp%>/boardTest.do?method=created&mode=update&${paramArticle }';"/>
			<input type="button" value=" 삭제 " class="btn2" 
			onclick="javascript:location.href='<%=cp%>/boardTest.do?method=deleted&${paramArticle }';"/>
		</div>
		<div id="rightFooter">
			<input type="button" value=" 리스트 " class="btn2" 
			onclick="javascript:location.href='${urlList}';"/>
		</div>	
	</div>
</div>
</body>
</html>

 

실행화면(article.jsp)

게시글 조회 페이지
게시글 조회 페이지

 

이전글을 클릭하면 이전 게시글로 페이지가 이동되고, 다음 글을 클릭하면 다음 게시글 페이지로 넘어간다.

 

끝!

반응형

블로그의 정보

무작정 개발

무작정 개발

활동하기