Dev/Struts

Struts2 - 답변형 게시판 만들기(1) 작성,리스트

창문닦이 2019. 3. 22. 18:04

게시판 만들기 - 게시글 작성 기능 구현

1. DB에 테이블 생성

create table bbs

(boardNum number(9) not null,

name varchar2(20) not null,

pwd varchar2(10),

email varchar2(50),

subject varchar2(50) not null,

content varchar2(4000) not null,

ipAddr varchar2(20) not null,

groupNum number(9) not null,

depth number(9) not null,

orderNo number(9) not null,

parent number(9) not null,

hitCount number(9) not null,

created date,

constraint pk_board_boardNum primary key(boardNum));

2. DTO생성

package com.board;

public class BoardDTO {

private int listNum;//일렬번호

private int boardNum;

private String name;

private String pwd;

private String email;

private String subject;

private String content;

private String ipAddr;

private int groupNum;

private int depth;

private int orderNo;

private int parent;

private int hitCount;

private String created;

private String searchKey;

private String searchValue;

private String pageNum;

private String mode;

//세개의 기능을 하는 하나의 창을 만들것 create, update, 답글작성

Getter, Setter 생성

}

3. Action 클래스 생성

package com.board;

import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionSupport;

import com.opensymphony.xwork2.ModelDriven;

import com.opensymphony.xwork2.Preparable;

public class BoardAction extends ActionSupport

implements Preparable,ModelDriven<BoardDTO>{

private static final long serialVersionUID = 1L;

private BoardDTO dto;

//getter만 생성

public BoardDTO getDto() {

return dto;

}

@Override

public BoardDTO getModel() {

return dto;

}

@Override

public void prepare() throws Exception {

dto = new BoardDTO();

}

public String created() throws Exception {

HttpServletRequest request = ServletActionContext.getRequest();

if(dto==null||dto.getMode()==null||dto.getMode().equals("")){

//게시물 작성창 띄우기

request.setAttribute("mode", "created");

return INPUT;

}

//게시물 저장 시 리턴값 success

return SUCCESS;

}

public String list() throws Exception {

//게시물 리스트 조회시 리턴값 success

return SUCCESS;

}

}

4. webContent board (JSP 폴더)생성 

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

<%@ page contentType="text/html; charset=UTF-8"%>

<%

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" href="<%=cp %>/board/css/style.css" type="text/css" />

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

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

<script type="text/javascript" >

function sendIt(){

f = document.myForm;

str = f.subject.value;

str = str.trim();//util.js에 있는 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;

}

f.name.value = str;

/*

//이름 한글검사

if(!isValidKorean(str)){

alert("\n이름을 정확히 입력하세요.");

f.name.focus();

return;

}

*/

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;

if(f.mode.value=="created"){

f.action = "<%=cp%>/bbs/created.action" ;

}else if(f.mode.value=="updated"){

f.action = "<%=cp%>/bbs/updated.action" ;

}else{

f.action = "<%=cp%>/bbs/reply.action";

}

f.submit();

}

</script>

</head>

<body>

<div id="bbs" >

<div id="bbs_title">

게 시 판(Struts2 + iBatis)

</div>

<form action="" name="myForm" method="post">

<div id="bbsCreated">

<div class="bbsCreated_bottomLine">

<dl>

<dt>제&nbsp;&nbsp;&nbsp;&nbsp;목</dt>

<dd>

<input type="text" name="subject" value="${dto.subject }" size="74" 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" value="${dto.pwd }" name="pwd" size="35" maxlength="7" class="boxTF"/>

&nbsp;(게시물 수정 및 삭제시 필요)

</dd>

</dl>

</div>

</div>

<div id="bbsCreated_footer">

<!-- update 필요한 파라미터 -->

<input type="hidden" name="boardNum" value="${dto.boardNum }"/>

<input type="hidden" name="pageNum" value="${dto.pageNum }"/>

<!-- reply 필요한 파라미터 -->

<input type="hidden" name="groupNum" value="${dto.groupNum }"/>

<input type="hidden" name="orderNo" value="${dto.orderNo }"/>

<input type="hidden" name="depth" value="${dto.depth }"/>

<input type="hidden" name="parent" value="${dto.parent }"/>

<input type="hidden" name="mode" value="${mode }">

<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 %>/bbs/list.action';" />

</div>

</form>

</div>

</body>

</html>



6. struts-board.xml 매핑정보 등록

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="board" extends="struts-default" namespace="/bbs" >       

<action name="created" method="created" class="com.board.BoardAction">

<result name="input">/board/created.jsp</result>

<!-- 작성완료시 반환값이 success -->

<result name="success" type="redirectAction">list</result>

</action>

<action name="list" method="list" class="com.board.BoardAction">

<result name="success">/board/list.jsp</result>

</action>

</package>

</struts>

7. struts.xml에 include 등록

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

 <!-- Configuration for the default package. -->

  <package name="default" extends="struts-default" namespace="" >       

      <global-results>

          <result name="error">/exception/error.jsp</result>

      </global-results>

 </package>

  <include file="struts-test.xml"/>

  <include file="struts-board.xml"/>

</struts>

스트럿츠 프로퍼티에 환경설정 파일을 struts.xml로 해놓았으므로 해당파일에 include를 추가하면 같이 반영된다.

8. DAO로 사용할 SQL Map 생성(iBatis 활용)

board_sqlMap.xml

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE sqlMap

PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"

"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="board">

<!-- 별칭 사용(자주 사용하는 명령어를 별칭을 만들어 사용할 수 있다) -->

<typeAlias alias="boardDTO" type="com.board.BoardDTO"/>

<!-- 최대값 -->

<select id="maxBoardNum" resultClass="int">

select nvl(max(boardNum),0) from bbs

</select>

<!-- 데이터 입력 -->

<insert id="insertData" parameterClass="boardDTO">

insert into bbs (boardNum,name,pwd,email,subject,content,ipAddr,groupNum,

depth,orderNo,parent,hitCount,created) values

(#boardNum#,#name#,#pwd#,#email#,#subject#,#content#,#ipAddr#,#groupNum#,

#depth#,#orderNo#,#parent#,0,sysdate)

</insert>

</sqlMap>

9. sqlMap_config에 mapper등록

sqlMapConfig.xml

<sqlMap resource="com/util/sqlMap/board_sqlMap.xml"/>



게시판 만들기 - 게시판 리스트 기능 구현

1. sqlMap 작성 

board_sqlMap.xml

그룹넘버는 내림차순정렬 오더넘버는 오름차순정렬


<!-- 데이터 갯수 -->

<select id="dataCount" resultClass="int" parameterClass="map">

select nvl(count(*),0) from bbs

where $searchKey$ like '%' || #searchValue# || '%'

</select>

<!-- 전체데이터 -->

<select id="listData" resultClass="boardDTO" parameterClass="map">

select * from (

select rownum rnum, data.* from(

select boardNum,name,subject,depth,hitCount,

to_char(created,'YYYY-MM-DD') created from bbs

where $searchKey$ like '%' || #searchValue# || '%'

order by groupNum desc, orderNo asc) data)

<![CDATA[

where rnum>=#start# and rnum<=#end#

]]>

</select>

2. Action에 메소드 추가

public String list() throws Exception {

//게시물 리스트 조회

CommonDAO dao = CommonDAOImpl.getInstance();

MyUtil myUtil = new MyUtil();

HttpServletRequest request = ServletActionContext.getRequest();

String cp = request.getContextPath();

int numPerPage = 5;

int totalPage = 0;

int totalDataCount = 0;

int currentPage = 1;

if(dto.getPageNum()!=null&&dto.getPageNum().equals("")){

currentPage = Integer.parseInt(dto.getPageNum());

}

if(dto.getSearchValue()==null||dto.getSearchValue().equals("")){

dto.setSearchKey("subject");

dto.setSearchValue("");

}

if(request.getMethod().equalsIgnoreCase("GET")){

dto.setSearchValue(URLDecoder.decode(dto.getSearchValue(),"UTF-8"));

}

Map<String, Object> hMap = new HashMap<String, Object>();

hMap.put("searchKey",dto.getSearchKey());

hMap.put("searchValue",dto.getSearchValue());

totalDataCount = dao.getIntValue("board.dataCount",hMap);

if(totalDataCount!=0){

totalPage = myUtil.getPageCount(numPerPage, totalDataCount);

}

if(currentPage>totalPage)

currentPage = totalPage;

int start = (currentPage-1)*numPerPage+1;

int end = currentPage*numPerPage;

hMap.put("start", start);

hMap.put("end", end);

List<Object> lists = (List<Object>)dao.getListData("board.listData", hMap);

int listNum,n=0;

ListIterator<Object> it = lists.listIterator();

while(it.hasNext()){

BoardDTO vo = (BoardDTO)it.next();

listNum = totalDataCount-(start+n-1);

vo.setListNum(listNum);

n++;

}

String param = "";

String urlList = "";

String urlArticle = "";

if(!dto.getSearchValue().equals("")){

param = "searchKey="+dto.getSearchKey();

param += "&searchValue="+URLEncoder.encode(dto.getSearchValue(),"UTF-8");

}

urlList = cp + "/bbs/list.action";

urlArticle = cp + "/bbs/article.action?pageNum="+currentPage;

if(!param.equals("")){

//검색한경우

urlList += "?" + param;

urlArticle += "&" + param;

}

request.setAttribute("lists",lists);

request.setAttribute("totalDataCount",totalDataCount);

request.setAttribute("pageIndexList",myUtil.pageIndexList(currentPage, totalPage, urlList));

request.setAttribute("urlArticle",urlArticle);

return SUCCESS;

}

3.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>게 시 판</title>

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

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

<script type="text/javascript">

function searchData(){

var f = document.searchForm;

f.action = "<%=cp%>/bbs/list.action";

f.submit();

}

</script>

</head>

<body>

<div id="bbsList">

<div id="bbsList_title">

게 시 판(Struts2 + iBatis)

</div>

<div id="bbsList_header">

<div id="leftHeader">

<form action="" name="searchForm" method="post">

<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 %>/bbs/created.action';"/>

</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>

<c:forEach var="dto" items="${lists }">

<div id="lists">

<dl>

<dd class="num">${dto.listNum }</dd>

<dd class="subject">

<a href="${urlArticle }&boardNum=${dto.boardNum}">${dto.subject}</a>

</dd>

<dd class="name">${dto.name}</dd>

<dd class="created">${dto.created}</dd>

<dd class="hitCount">${dto.hitCount}</dd>

</dl>

</div>

</c:forEach>

<div id="footer">

<p>

<c:if test="${totalDataCount!=0 }">

${pageIndexList }

</c:if>

<c:if test="${totalDataCount==0 }">

등록된 페이지가 없습니다

</c:if>

</p>

</div>

</div>

</div>

</body>

</html>