[Struts1] Struts1/iBatis 게시판 만들기
by 무작정 개발반응형
2022.03.08(52일 차) - 화요일
이번에는 기존에 Struts1 + JDBC가 아닌 Struts1 + iBatis로 게시판을 만들 예정이다.
iBatis 설치 및 초기 세팅을 이전 글에 정리했으니 참고!
https://backendcode.tistory.com/83
오늘의 수업 내용
Struts + iBatis 게시판 만들기
이번엔 위의 사진의 게시판을 만들 것이다. 기존에 했던 JSP, Servlet 게시판과 크게 다른 점이 없다.
초기 세팅 - (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에 매핑 경로 추가하기
위의 경로 (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>제 목</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" size="35" value="${dto.pwd }"
maxlength="7" class="boxTF"/>
(게시물 수정 및 삭제시 필요!!)
</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)
이전글을 클릭하면 이전 게시글로 페이지가 이동되고, 다음 글을 클릭하면 다음 게시글 페이지로 넘어간다.
끝!
반응형
'Back-End > JSP & Struts & JDBC' 카테고리의 다른 글
[Struts 2] Struts2/iBatis 초기 세팅 , Struts2 예제 (2) | 2022.03.11 |
---|---|
[Struts1] Struts1 + iBatis 를 사용한 파일 업로드 (0) | 2022.03.10 |
iBatis(2.0) 설치 및 초기 세팅 (0) | 2022.03.08 |
[Struts 1] 설치 및 초기 세팅, 게시판 만들기 (0) | 2022.03.07 |
[Servlet] - 이미지 게시판 만들기 (0) | 2022.03.03 |
블로그의 정보
무작정 개발
무작정 개발