[Struts2] Struts2 + iBatis를 이용한 답변 형 게시판
by 무작정 개발반응형
2022.03.11(54일 차)
이번에는 Struts2 + iBatis를 이용한 답변 형 게시판에 대해 정리할 것이다.
게시판 = CRUD 기능이다.
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));
언제나 테이블을 생성했으면 select를 통해 칼럼명 등에 오타가 없는지 다시 한번 확인해준다! 나중에 iBatis를 쓸 때
칼럼명이 달라서 에러가 발생할 수 있기 때문이다.
2. BoardDTO 클래스 생성
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. struts-board.xml 생성 및 등록
- struts-board.xml을 생성하고 struts.xml에 등록해준다.
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">
<!-- Controller 역할 -->
<!-- extends 의 default 는 packagename 의 default struts.xml과 연결되게끔함 -->
<!-- 주소창을 여기서 친다 -->
<struts>
<package name="board" extends="default" namespace="/bbs">
<!-- /bbs에 created.Action 이 오면 BoardAction 으로 가서 created메소드를 실행해라 -->
<action name="created" class="com.board.BoardAction" method="created">
<result name="input">/board/created.jsp</result>
<!-- 입력이 됬으므로 리다이랙트(수정,세션된건) -->
<result name="success" type="redirectAction">list</result>
</action>
<action name="list" class="com.board.BoardAction" method="list">
<result name="success">/board/list.jsp</result>
</action>
<action name="article" class="com.board.BoardAction" method="article">
<result name="success">/board/article.jsp</result>
</action>
<!-- struts2 에서는 list뒤에 get방식으로 데이터를 넘길수있다. -->
<action name="updated" class="com.board.BoardAction" method="updated">
<result name="input">/board/created.jsp</result>
<result name="success" type="redirectAction">list?pageNum=${dto.pageNum}</result>
</action>
<action name="reply" class="com.board.BoardAction" method="reply">
<result name="input">/board/created.jsp</result>
<result name="success" type="redirectAction">list?pageNum=${dto.pageNum}</result>
</action>
<action name="deleted" class="com.board.BoardAction" method="deleted">
<result name="success" type="redirectAction">list?pageNum=${dto.pageNum}</result>
</action>
</package>
</struts>
struts.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="default" extends="struts-default" namespace="">
<global-results>
<result name="error">/exception/error.jsp</result>
</global-results>
</package>
<include file="struts-board.xml"/>
</struts>
4. board_sqlMap.xml 생성 및 등록하기
- DAO로 사용할 board_sqlMap.xml을 생성(iBatis)
- 생성한 xml파일을 sqlMap_config에 등록
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="bbs">
<!-- 별칭을줘서 간단하게 쓸수있다. -->
<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>
<select id="dataCount" resultClass="int" parameterClass="map">
select nvl(count(*),0) from bbs
where $searchKey$ like '%' || #searchValue# || '%'
</select>
<!-- 그룹은 큰순서로 정렬 , orderNo 작은순서로 정렬 -->
<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>
<!-- Article -->
<!-- 조회수 증가 -->
<update id="hitCountUpdate" parameterClass="int">
update bbs set hitCount=hitCount+1 where boardNum=#boardNum#
</update>
<!-- 하나의 데이터 가져옴 -->
<select id="readData" parameterClass="int" resultClass="boardDTO">
select boardNum,name,pwd,email,subject,content,ipAddr,
groupNum,depth,orderNo,parent,hitCount,created
from bbs where boardNum=#boardNum#
</select>
<!-- 이전글 다음글 -->
<!-- 그룹넘버가 같으면서 orderNo가 현재보다 작아야한다. -->
<!-- 이전글이 최신글이다. -->
<select id="preReadData" parameterClass="map" resultClass="boardDTO">
select data.* from (
select boardNum,subject from bbs
where ($searchKey$ like '%' || #searchValue# || '%')
<![CDATA[
and ((groupNum=#groupNum# and orderNo<#orderNo#)
or(groupNum>#groupNum#))
order by groupNum asc,orderNo desc) data
where rownum=1
]]>
</select>
<!-- 다음글이 예전에 쓴글 -->
<select id="nextReadData" parameterClass="map" resultClass="boardDTO">
select data.* from (
select boardNum,subject from bbs
where ($searchKey$ like '%' || #searchValue# || '%')
<![CDATA[
and ((groupNum=#groupNum# and orderNo>#orderNo#)
or(groupNum<#groupNum#))
order by groupNum desc,orderNo asc) data
where rownum=1
]]>
</select>
<!-- orderNo를 수정하는 쿼리 , groupNum은 같아야한다. 사용자보다 큰 orderNo 1씩증가 -->
<update id ="orderNoUpdate" parameterClass="map">
update bbs set orderNo = orderNo + 1
where groupNum = #groupNum# and orderNo>#orderNo#
</update>
<!-- 우리의 데이터를 수정하는 쿼리 -->
<update id="updateData" parameterClass="boardDTO">
update bbs set name=#name#,subject=#subject#,email=#email#,
content=#content#,pwd=#pwd# where boardNum=#boardNum#
</update>
<delete id="deleteData" parameterClass="int">
delete bbs
where boardNum in
(select boardNum from bbs start with boardNum=#boardNum#
connect by prior boardNum=parent)
</delete>
</sqlMap>
sqlMap_config에 등록
<sqlMap resource="com/util/sqlMap/board_sqlMap.xml"/>
5. BoardAction 클래스 생성
package com.board;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
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;
import com.util.MyUtil;
import com.util.dao.CommonDAO;
import com.util.dao.CommonDAOImpl;
public class BoardAction extends ActionSupport
implements Preparable, ModelDriven<BoardDTO>{
private static final long serialVersionUID = 1L;
private BoardDTO dto;
// getDto 가 modelDriven에 의해서 원하는곳으로 넘어간다.
public BoardDTO getDto() {
return dto;
}
@Override
public BoardDTO getModel() {
return dto;
}
@Override
public void prepare() throws Exception {
// modelDriven이 객체를 넘기려면 객체를 생성해야한다.
dto = new BoardDTO();
}
// 사용자가 created메소드로 찾아오면
// 입력할때 쓸것인가
// 겉모습만 보여줄것인가
public String created() throws IOException {
HttpServletRequest request = ServletActionContext.getRequest();
// 앞뒤가 바뀌면 안된다. equals가 뒤에 와야된다.
// 게시물 입력창을 띄운다.
if(dto==null||dto.getMode()==null||dto.getMode().equals("")) {
request.setAttribute("mode", "create");
return INPUT;
}
// dto가 null이 아니면 입력이 된것이다.
// 입력 코딩은 좀있다가
CommonDAO dao = CommonDAOImpl.getInstance();
int maxBoardNum = dao.getIntValue("bbs.maxBoardNum");
// 처음들어가는 데이터
dto.setBoardNum(maxBoardNum + 1);
dto.setIpAddr(request.getRemoteAddr());
dto.setGroupNum(dto.getBoardNum());
dto.setDepth(0);
dto.setOrderNo(0);
dto.setParent(0);
dao.insertData("bbs.insertData", dto);
return SUCCESS;
}
// 리스트 띄우기
public String list() throws IOException {
CommonDAO dao = CommonDAOImpl.getInstance();
MyUtil myUtil = new MyUtil();
// request 사용하기 위해 생성
HttpServletRequest request = ServletActionContext.getRequest();
String cp = request.getContextPath();
int numPerPage = 10;
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 필요
Map<String, Object> hMap = new HashMap<String,Object>();
hMap.put("searchKey", dto.getSearchKey());
hMap.put("searchValue", dto.getSearchValue());
// 전체 데이터 개수 구하기
totalDataCount = dao.getIntValue("bbs.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);
// hamp에는 4개가 들어가있다 키와벨류start,end
List<Object> lists = (List<Object>)dao.getListData("bbs.listData",hMap);
// 일련번호를 만들기
int listNum,n=0;
Iterator<Object> it = lists.iterator();
while(it.hasNext()) {
// dto를 하나꺼내서 만들어서 vo에 listNum에 넣어준다.
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;
// param 널이 아니면 검색이 됐다.
if(!param.equals("")) {
urlList += "?" + param;
urlArticle += "&" + param;
}
// 데이터 넘김
// 이 내개 데이터와 success를 가지고 돌아감
request.setAttribute("lists", lists);
request.setAttribute("totalDataCount", totalDataCount);
request.setAttribute("pageIndexList",
myUtil.pageIndexList(currentPage, totalPage, urlList));
request.setAttribute("urlArticle", urlArticle);
return SUCCESS;
}
// 클릭해서 dto는 자동으로 넘어온다.
public String article() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
CommonDAO dao = CommonDAOImpl.getInstance();
// 스트럿츠2가 자동으로 dto를 넘겨줘서 pageNum과 boardNum이 나오게 된다.
/*System.out.print(dto.getSearchKey());
System.out.print(dto.getSearchValue());
System.out.print(dto.getPageNum());
System.out.print(dto.getBoardNum());*/
// dao에서 하나의 데이터를 가져올것이다.
// 넘어오는값을 변수에 빼놓는다.
String searchKey = dto.getSearchKey();
String searchValue = dto.getSearchValue();
String pageNum = dto.getPageNum();
int boardNum = dto.getBoardNum();
if(searchValue==null||searchValue.equals("")) {
searchKey = "subject";
searchValue = "";
}
if(request.getMethod().equalsIgnoreCase("GET")) {
searchValue = URLDecoder.decode(searchValue, "UTF-8");
}
// 조회수 증가
dao.updateData("bbs.hitCountUpdate", boardNum);
// 하나의 데이터를 읽어와서 dto에 넣어준다.
dto = (BoardDTO)dao.getReadData("bbs.readData",boardNum);
// nullnullnull3 검색을 했는데도 key,value,pagenum 없어짐..
// 위에는 있어서 출력이 됐는데
// 진행하다 보니까 자동으로 넘어온 dto가 이 밑에서
// getReadData에 의해서 기존에 있는게 덮어져서 초기화됨
// 맨 마지막에 boardNum만 보이게 된다.
// 우리가 별도로 자동으로 넘어온 dto를 빼놔서
// 아래에서 사용을 하게되는것이다.
/*System.out.print(dto.getSearchKey());
System.out.print(dto.getSearchValue());
System.out.print(dto.getPageNum());
System.out.print(dto.getBoardNum());*/
if(dto==null) {
return "read-error";
}
// dto에서 꺼냈으니 content는 있으나 키벨류페이지넘은 초기화되어있음..
int lineSu = dto.getContent().split("\r\n").length;
dto.setContent(dto.getContent().replaceAll("\r\n", "<br/>"));
// 이전글 다음글보낼것임
Map<String, Object> hMap = new HashMap<>();
// hMap.put("searchKey", dto.getSearchKey()); 이렇게 넣어주면안됨 위에 자동으로 넣은 dto sk,sv,pn 이 초기화 되어있어서
// 널이 들어가면 검색이 안된다..
hMap.put("searchKey", searchKey); // 그럼 여기다가 위에서 dto.getSearchKey 로
// 받은 searchKey변수 를 써줘야 한다.
hMap.put("searchValue", searchValue);
hMap.put("groupNum", dto.getGroupNum());
hMap.put("orderNo", dto.getOrderNo());
// 이전글
BoardDTO preDTO = (BoardDTO)dao.getReadData("bbs.preReadData",hMap);
int preBoardNum = 0;
String preSubject = "";
if(preDTO!=null) {
preBoardNum = preDTO.getBoardNum();
preSubject = preDTO.getSubject();
}
BoardDTO nextDTO = (BoardDTO)dao.getReadData("bbs.nextReadData",hMap);
int nextBoardNum = 0;
String nextSubject = "";
if(nextDTO!=null) {
nextBoardNum = nextDTO.getBoardNum();
nextSubject = nextDTO.getSubject();
}
// 넘어가는 주소
String params = "pageNum=" + pageNum;
if(!searchValue.equals("")) {
params += "&searchKey=" + searchKey;
params += "&searchValue="
+ URLEncoder.encode(searchValue,"UTF-8");
}
request.setAttribute("preBoardNum", preBoardNum);
request.setAttribute("preSubject",preSubject);
request.setAttribute("nextBoardNum", nextBoardNum);
request.setAttribute("nextSubject",nextSubject);
request.setAttribute("params",params);
request.setAttribute("lineSu",lineSu);
request.setAttribute("pageNum",pageNum);
// 이제 sql에 이전글 다음글로 넘어가게 된다.
return SUCCESS;
}
public String updated() throws Exception {
// 게시물 수정 화면
HttpServletRequest request = ServletActionContext.getRequest();
CommonDAO dao = CommonDAOImpl.getInstance();
if(dto.getMode()==null||dto.getMode().equals("")) {
dto = (BoardDTO)dao.getReadData("bbs.readData",dto.getBoardNum()); // 하나의 데이터 읽어옴
if(dto==null) {
return "read-error";
}
request.setAttribute("mode", "update");
request.setAttribute("pageNum", dto.getPageNum());
return INPUT;
}
// 게시물 수정
// DTO는 자동으로 넘어감
dao.updateData("bbs.updateData", dto);
return SUCCESS;
}
// 답변
public String reply() throws Exception {
HttpServletRequest request = ServletActionContext.getRequest();
CommonDAO dao = CommonDAOImpl.getInstance();
if(dao==null||dto.getMode()==null||dto.getMode().equals("")) {
// 부모의 데이터 읽기
dto = (BoardDTO)dao.getReadData("bbs.readData",dto.getBoardNum());
if(dto==null) {
return "read-error";
}
// 부모의 컨텐츠를 먼저 보여주고 줄을 귿고 내가 쓰고싶은글을쓴다
String temp = "\r\n\r\n-----------------------------\r\n\r\n";
temp += "[답변]\r\n";
//부모데이터를 변경해서 내 데이터로 created.jsp에 출력
dto.setSubject("[답변]" + dto.getSubject()); // 부모꺼로 바꿈
dto.setContent(dto.getContent() + temp); // 위에 만든 temp를 붙임
dto.setName(""); // name은 내꺼쓸수있게 부모꺼 지울거임
dto.setEmail(""); // 내꺼쓸수있게 부모꺼 지울거임
dto.setPwd(""); // 내꺼쓸수있게 부모꺼 지울거임
request.setAttribute("mode", "reply");
request.setAttribute("pageNum", dto.getPageNum());
return INPUT;
}
// 답변입력
//orderNum 수정
Map<String, Object> hMap = new HashMap<>();
hMap.put("groupNum", dto.getGroupNum()); //부모의 groupNum
hMap.put("orderNo", dto.getOrderNo());
dao.updateData("bbs.orderNoUpdate", hMap);
//입력
int maxBoardNum = dao.getIntValue("bbs.maxBoardNum");
dto.setBoardNum(maxBoardNum+1);
dto.setIpAddr(request.getRemoteAddr()); // 새로운 댓글을 다는 사람의 ip를 넣는다 클라이언트 ip를 넣는다.
dto.setDepth(dto.getDepth()+1); //들여쓰기
dto.setOrderNo(dto.getOrderNo()+1); //현재 입력되는 데이터의 orderNo
dao.insertData("bbs.insertData", dto);
return SUCCESS;
}
public String deleted() throws Exception {
CommonDAO dao = CommonDAOImpl.getInstance();
dao.deleteData("bbs.deleteData", dto.getBoardNum());
return SUCCESS;
}
}
6. 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>답 변 형 게 시 판(Struts2)</title>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/list.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)
</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%>/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>
<div id="lists">
<c:forEach var="dto" items="${lists }">
<dl>
<dd class="num">${dto.listNum }</dd>
<dd class="subject">
<c:if test="${dto.depth!=0 }">
<c:forEach var="i" begin="1" end="${dto.depth }" step="1">
</c:forEach>
<img alt="" src="<%=cp%>/board/image/re.gif"/>
</c:if>
<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>
</c:forEach>
</div>
<div id="footer">
<p>
<c:if test="${totalDataCount!=0 }">
${pageIndexList }
</c:if>
<c:if test="${totalDataCount==0 }">
"등록된 게시물이 없어..."
</c:if>
</div>
</div>
</div>
</body>
</html>
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>답 변 형 게 시 판(Struts2)</title>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/article.css"/>
<script type="text/javascript">
function sendData(value) {
var boardNum = "${dto.boardNum}";
var pageNum = "${pageNum}";
var url = "<%=cp%>/bbs/";
if(value=="delete"){
url += "deleted.action";
}else if(value =="update"){
url += "updated.action";
}else if(value =="reply"){
url += "reply.action";
}
url += "?boardNum="+boardNum;
url += "&${params}";
location.replace(url);
}
</script>
</head>
<body>
<div id="bbs">
<div id="bbs_title">
답 변 형 게 시 판(Struts2)
</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 preSubject }">
<a href="<%=cp%>/bbs/article.action?${params}&boardNum=${preBoardNum}">${preSubject }</a>
</c:if>
</div>
<div class="bbsArticle_noLine">
다음 글 :
<c:if test="${!empty nextSubject }">
<a href="<%=cp%>/bbs/article.action?${params}&boardNum=${nextBoardNum}">${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="sendData('reply')"/>
<input type="button" value=" 수정 " class="btn2" onclick="sendData('update')"/>
<input type="button" value=" 삭제 " class="btn2" onclick="sendData('delete')"/>
</div>
<div id="rightFooter">
<input type="button" value=" 리스트 " class="btn2"
onclick="javascript:location.href='<%=cp%>/bbs/list.action?${params }';"/>
</div>
</div>
</div>
</body>
</html>
created.jsp - (mode에 따라 답변 등록, 글 수정, 게시글 등록 페이지)
- mode에 따라 버튼 변경 및 호출 액션 설정
<%@ 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>답 변 형 게 시 판(Struts2)</title>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/style.css"/>
<link rel="stylesheet" type="text/css" href="<%=cp%>/board/css/created.css"/>
<script type="text/javascript" src="<%=cp%>/board/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;
/* 입력 수정 댓글 */
/* request.setAttribute("mode", "create"); */
/* 주소를 분리해놨다. */
if(f.mode.value=="create") {
f.action = "<%=cp%>/bbs/created.action";
}else if(f.mode.value=="update") {
f.action = "<%=cp%>/bbs/updated.action";
}else if(f.mode.value=="reply") {
f.action = "<%=cp%>/bbs/reply.action";
}
f.submit();
}
</script>
</head>
<body>
<div id="bbs">
<div id="bbs_title">
답 변 형 게 시 판(Struts2)
</div>
<form action="" method="post" name="myForm">
<div id="bbsCreated">
<div class="bbsCreated_bottomLine">
<dl>
<dt>제 목</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>내 용</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" value="${dto.pwd }" size="35"
maxlength="7" class="boxTF"/>
(게시물 수정 및 삭제시 필요!!)
</dd>
</dl>
</div>
</div>
<div id="bbsCreated_footer">
<!-- 수정으로 쓸곳 , 수정하기 위해서 필요한것이다. -->
<input type="hidden" name="boardNum" value="${dto.boardNum }"/>
<!-- 변수에 담아서 보내주무르 dto.pageNum에서 pageNum으로 바꾼다.
req.setAttribute( -->
<input type="hidden" name="pageNum" value="${pageNum }"/>
<!-- 댓글달때 필요하므로 써놓음 -->
<input type="hidden" name="groupNum" value="${dto.groupNum }"/>
<input type="hidden" name="orderNo" value="${dto.orderNo }"/>
<input type="hidden" name="depth" value="${dto.depth }"/>
<!-- parent에는 부모의 boardNum이 들어간다. -->
<input type="hidden" name="parent" value="${dto.boardNum }"/>
<!-- 입력용인지 수정용인지 댓글용인지 -->
<input type="hidden" name="mode" value="${mode }"/>
<c:if test="${mode=='create' }">
<input type="button" value=" 등록하기 " class="btn2" onclick="sendIt();"/>
<input type="reset" value=" 다시입력 " class="btn2"
onclick="document.myForm.subject.focus();"/>
<!-- 넘어갈때 pageNum도 넘어갈수있게 한다. -->
<input type="button" value=" 작성취소 " class="btn2"
onclick="javascript:location.href='<%=cp%>/bbs/list.action?pageNum=${pageNum }';"/>
</c:if>
<c:if test="${mode=='update' }">
<input type="button" value=" 수정하기 " class="btn2" onclick="sendIt();"/>
<!-- 넘어갈때 pageNum도 넘어갈수있게 한다. -->
<input type="button" value=" 수정취소 " class="btn2"
onclick="javascript:location.href='<%=cp%>/bbs/list.action?pageNum=${pageNum }';"/>
</c:if>
<c:if test="${mode=='reply' }">
<input type="button" value=" 답변등록하기 " class="btn2" onclick="sendIt();"/>
<input type="reset" value=" 다시입력 " class="btn2"
onclick="document.myForm.subject.focus();"/>
<!-- 넘어갈때 pageNum도 넘어갈수있게 한다. -->
<input type="button" value=" 작성취소 " class="btn2"
onclick="javascript:location.href='<%=cp%>/bbs/list.action?pageNum=${pageNum }';"/>
</c:if>
</div>
</form>
</div>
</body>
</html>
반응형
'Back-End > JSP & Struts & JDBC' 카테고리의 다른 글
[Struts 2] Struts2/iBatis 초기 세팅 , Struts2 예제 (2) | 2022.03.11 |
---|---|
[Struts1] Struts1 + iBatis 를 사용한 파일 업로드 (0) | 2022.03.10 |
[Struts1] Struts1/iBatis 게시판 만들기 (0) | 2022.03.09 |
iBatis(2.0) 설치 및 초기 세팅 (0) | 2022.03.08 |
[Struts 1] 설치 및 초기 세팅, 게시판 만들기 (0) | 2022.03.07 |
블로그의 정보
무작정 개발
무작정 개발