[Struts 1] 설치 및 초기 세팅, 게시판 만들기
by 무작정 개발2022.03.07(51일 차)
오늘부터 프레임워크를 배우는데
Java -> OracleDB -> JSP/Servlet -> Struts1 -> Struts2 -> Spring -> Spring Boot
내가 듣는 과정은 위의 순서대로 배우고 오늘부터는 Struts1에 대해 배운다.
struts는 깊게 안 배우고 게시판과 파일 업로드 정도만 하고 스프링으로 넘어갈 예정이다.
struts는 환경 세팅 파일을 2개 만들어야 하는데 xml로 만든다.
점심시간 이후에는 struts로 게시판 제작 이번에 마지막 jdbc 다음부터는 아이 바티스 마이 바티스 쓸 예정이다.
오늘의 수업 내용
Struts 설치 및 초기 세팅
Struts를 설치하고 초기 세팅하는 방법을 정리하고자 한다.
(1) - Struts 1 버전 설치하기
https://struts.apache.org/download.cgi#struts2529
먼저 위의 사이트에서 Struts 1.3.10 버전 파일을 다운로드하여준다. ( 하단 사진 참고)
(2) - 이클립스에서 다이내믹 웹 프로젝트 생성하기
Project Exploer 쪽에서 빈 곳에 우클릭 -> New -> Dynamic Web Project 클릭!
Project name을 struts로 작성하고 Next 버튼 클릭! ( 나는 이미 프로젝트를 생성해서 이미 사용 중이라는 문구가 뜬다.)
계속 Next를 누르다 Finish를 눌러주면 된다.
프로젝트를 정상적으로 생성했으면 상단 사진의 화면이 나올 것이다.
(3) - lib(라이브러리) 추가하기
생성된 프로젝트에서 WebContent 폴더 -> WEB-INF -> 안에 lib 폴더가 있을 것이다.
처음에 다운받은 압축파일을 더블클릭하면 위의 화면이 나오는데 위의 화면 경로와 같이
struts-1.3.10 -> lib를 들어가면 jar파일들이 보일 것이다. (파란색으로 체크한 부분)
이걸 모두 드래그해서 우리가 생성한 struts 프로젝트 안에 있는 lib 폴더에 넣어준다.
lib를 정상적으로 추가하면 위의 화면처럼 나올 것이다. 위에 노란색으로 체크된 3개의 jar파일은 jsp/servlet때 했던 jar파일을 따로 옮겨온 것이다. (자세한 사항은 이전 JSP/Servlet 글 참고)
(4) - XML 파일 만들기
일단 이렇게 3개의 XML파일을 생성해준다.
struts-config.xml - 공통(공용)적으로 적용되는 환경 설정
이 xml파일은 공용적인 파일 세팅이다. gloabal이라는 말이 들어가면 '공용적인'이라고 생각하면 된다.
struts-config_temp.xml - 개별의 프로젝트에 적용되는 환경 설정
web.xml
web.xml은 서블릿에서 xml 입력할 때와 크게 다른 점이 없다.
<load-on-startup>2 </load-on-startup> : 스타트 업할 때 이걸 2번째로 찾으라는 명령어이다. 첫 번째로 찾는 것은
Annotation이므로 일반적으로 2번을 준다.
그리고 <url-patten> 부분에 있는 *. do는 확장자를 의미하는데 uri주소 마지막에. do가 들어갈 경우 모두 매핑하도록
설정했다.. do로 끝나면 action으로 가서 문법 검사를 하고 <param-value>에 있는 파일들을 실행한다.
여기까지 하면 Struts 설치 및 초기 세팅 끝!
Struts 게시판 만들기
이번에는 기존에 만들었던 게시판을 활용하여 JSP/Servlet 대신 Struts로 게시판을 만들 것이다.
기능은 기존 게시판처럼 페이징 처리, 검색 글 올리기 등등 기능은 같다. 자세한 것은 지난 글들을 참고!
BoardForm.java 생성 - (DTO의 기능을 하는 클래스)
Form은 서블릿에서 만들었던 DTO랑 같다고 할 수 있다.
Servlet에서는 DTO이고, Struts에서는 Form인 것이다.
package com.board;
import org.apache.struts.action.ActionForm;
//Struts에서 관리하므로 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 생성
}
이전 게시판처럼 여기서는 사용할 변수들, getter/setter를 입력한다.
Struts에서 관리하기 때문에 ActionForm을 상속함으로써 BoardForm을 관리한다.
BoardDAO 생성 - (DB에 access 하는 클래스)
- 기존에 만들었던 BoardDAO를 그대로 가지고 온다. 코딩은 같다.
package com.board;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
//DAO는 테이블에 데이터를 넣는 클래스이기때문에 table을 만들었으면 dao도 만들 수 있다.
public class BoardDAO {
// 의존성 주입(객체를 생성함에 동시에 초기화)
private Connection conn;
public BoardDAO(Connection conn) {
this.conn = conn;
}
// num의 최대값 구하기
public int getMaxNum() {
int maxNum = 0;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
// nvl를 써서 null인 값을 0으로 바꿔준다. 0으로 바꿔줘야 연산이 가능(++)
sql = "select nvl(max(num),0) from board";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
if (rs.next()) {
maxNum = rs.getInt(1); // 여긴 컬럼명or숫자를 쓴다.
// 하지만nvl(max(num)) 는 파생 컬럼이라서 이름을 못쓰기 때문에 1을 써준다.
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return maxNum;
}
// 입력(insert) - 넘어오는 데이터는 BoardDTO의 dto
public int insertData(BoardForm dto) {
int result = 0;
PreparedStatement pstmt = null;
String sql;
try {
sql = "insert into board (num,name,pwd,email,subject,";
sql += "content,ipAddr,hitCount,created) ";
sql += "values (?,?,?,?,?,?,?,0,sysdate)";
pstmt = conn.prepareStatement(sql);
// values 9개중에 ?는 7개라서 7개만 작성
pstmt.setInt(1, dto.getNum());
pstmt.setString(2, dto.getName());
pstmt.setString(3, dto.getPwd());
pstmt.setString(4, dto.getEmail());
pstmt.setString(5, dto.getSubject());
pstmt.setString(6, dto.getContent());
pstmt.setString(7, dto.getIpAddr());
result = pstmt.executeUpdate(); // 실행해준다
pstmt.close();// 닫아준다.
} catch (Exception e) {
System.out.println(e.toString());
}
return result; // result로 반환
// --여기까지가 입력(insert)
}
// 전체 데이터 갯수 구하기
public int getDataCount(String searchKey, String searchValue) {
int totalCount = 0;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
searchValue = "%" + searchValue + "%";
sql = "select nvl(count(*),0) from board ";
sql+= "where " + searchKey + " like ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, searchValue);
rs = pstmt.executeQuery();
if(rs.next()) {
totalCount = rs.getInt(1);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return totalCount;
}
// 전체 데이터 출력(페이지마다 개수 제한)
public List<BoardForm> getLists(int start, int end,String searchKey, String searchValue) {
//rownum을 매개변수로 할당해서 해당범위만 list로 출력
List<BoardForm> lists = new ArrayList<BoardForm>();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
searchValue = "%" + searchValue + "%";
sql = "select * from (";
sql+= "select rownum rnum, data.* from (";
sql+= "select num,name,subject,hitcount,";
sql+= "to_char(created,'YYYY-MM-DD') created ";
sql+= "from board where " + searchKey + " like ? ";
sql+= "order by num desc) data) " ;
sql+= "where rnum>=? and rnum<=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, searchValue);
pstmt.setInt(2, start);
pstmt.setInt(3, end);
rs = pstmt.executeQuery();
while(rs.next()) {
BoardForm dto = new BoardForm();
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setSubject(rs.getString("subject"));
dto.setHitCount(rs.getInt("hitCount"));
dto.setCreated(rs.getString("created"));
lists.add(dto);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
// num으로 조회한 한개의 데이터
public BoardForm getReadData(int num) {
BoardForm dto = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select num,name,pwd,email,subject,content,";
sql += "ipAddr,hitCount,created ";
sql += "from board where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
rs = pstmt.executeQuery();
if (rs.next()) { // 데이터가 1개니까 while문 x if문사용
dto = new BoardForm();// 위에서 객체생성했으니 이렇게
dto.setNum(rs.getInt("num"));
dto.setName(rs.getString("name"));
dto.setPwd(rs.getString("pwd"));
dto.setEmail(rs.getString("email"));
dto.setSubject(rs.getString("subject"));
dto.setContent(rs.getString("content"));
dto.setIpAddr(rs.getString("ipAddr"));
dto.setHitCount(rs.getInt("hitCount"));
dto.setCreated(rs.getString("created"));
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return dto;
}
// 조회수 증가
public int updateHitCount(int num) {
int result = 0;
PreparedStatement pstmt = null;
String sql;
try {
sql = "update board set hitCount=hitCount+1 where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//수정
public int updateData(BoardForm dto) {
int result = 0;
PreparedStatement pstmt = null;
String sql;
try {
sql = "update board set name=?,pwd=?,email=?,subject=?,";
sql+= "content=? where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getName());
pstmt.setString(2, dto.getPwd());
pstmt.setString(3, dto.getEmail());
pstmt.setString(4, dto.getSubject());
pstmt.setString(5, dto.getContent());
pstmt.setInt(6, dto.getNum());
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
//삭제
public int deleteData(int num) {
int result = 0;
PreparedStatement pstmt = null;
String sql;
try {
sql = "delete board where num=?";
pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, num);
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
}
BoardAction.java - (Servlet의 기능을 하는 클래스)
BoardAction 클래스는 Servlet에서의 Servlet클래스와 동일하다고 말할 수 있다.
Servlet에서는 Servlet클래스, Struts에서는 Action클래스.
write, write_ok, list 등 메서드를 생성해서 기능에 따라 사용자 정의대로 호출한다.
package com.board;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.sql.Connection;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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.DBConn;
import com.util.MyUtil;
//DispatchAction : if문을 메소드단위로 만들것이다.
public class BoardAction extends DispatchAction{
//메서드명 변경 가능
// 게시판 작성 시
// ActionForm은 BoardForm의 데이터 내용을 가져오는 기능
public ActionForward write(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
//사용자가 오오면 created페이지를 띄우고자 한다.
//created라는 문자열을 가지고 돌아가라
return mapping.findForward("created");
}
//게시판 작성 완료 시
public ActionForward write_ok(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
//form은 Object로 넘어오기때문에 다운캐스팅
BoardForm f = (BoardForm)form; //다운캐스팅
f.setNum(dao.getMaxNum() + 1);
f.setIpAddr(request.getRemoteAddr());
// 7개의 데이터를 넘겨주면 됨
dao.insertData(f);
//save라는 문자열을 xml파일로 보내준다.
return mapping.findForward("save");
}
public ActionForward list(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
String cp = request.getContextPath();
MyUtil myUtil = new MyUtil();// 페이징처리
// 기존 BoardServlet 내용의 list 부분 가져옴
String pageNum = request.getParameter("pageNum");
int currentPage = 1;
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");
}
}
// 검색한 데이터 전체 개수
int dataCount = dao.getDataCount(searchKey, searchValue);
// 한화면에 표시할 데이터 개수
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;
// 검색했으면 키값 벨류 start end
//데이터베이스에서 해당페이지를 가져온다
List<BoardForm> lists =
dao.getLists(start, end, searchKey, searchValue);
// 리스트에서 설치키 설치벨류를 article 로 값 보내기
String param = "";
// null을 못찾을수있으니 조건 2번줌
if(searchValue!=null&&!searchValue.equals("")) {
// 검색을했으면
param = "searchKey=" + searchKey;
param+= "&searchValue=" + URLEncoder.encode(searchValue, "UTF-8");
}
// 가상의 주소를 담는다.
String listUrl = cp + "/board.do?method=list";
if(!param.equals("")) {
// 널이아니면 검색을 했다.
// myUtil 뒤에 검색된 주소가 딸려간다.
// listUrl은 ?가 없으므로 붙인것
listUrl += "&" + param;
}
String pageIndexList =
myUtil.pageIndexList(currentPage, totalPage, listUrl);
// 리스트를 클릭했을때 article로 넘어가는부분
// 글보기 주소를 만든다.
// 검색을 안했다면
// 현재페이지를 넘겨준다 ( 되돌아 올수있게 )
String articleUrl = cp + "/board.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 {
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
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");
}
//게시물번호(프라이머리키) 조회수 증가
dao.updateHitCount(num);
// 하나의 데이터 읽어온다
// setAttribute("dto",dto);
BoardForm dto = dao.getReadData(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 param = "pageNum=" + pageNum;
if(searchValue != null && !searchValue.equals("")) {
//검색을 했다는거
param += "&searchKey=" + searchKey;
// 인코더 시켜서 보낸다
param += "&searchValue=" + URLEncoder.encode(searchValue, "UTF-8");
}
// 게시물 누르면 데이터가 보여지게 위해서 데이터를 넘김(setAttribute)
// 값을 가지고 넘어가는 변수는 param을 쓸수없다
// param은 이미 내부에 변수를 쓰고있다.
request.setAttribute("dto", dto);
request.setAttribute("params", param);
request.setAttribute("linSu", lineSu);
request.setAttribute("pageNum", pageNum);
return mapping.findForward("article");
}
public ActionForward updated(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
// 수정버튼 눌렀을때 주소창으로 넘어가는 데이터
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");
}
BoardForm dto = dao.getReadData(num);
if(dto==null) {
return mapping.findForward("list");
}
String param = "pageNum=" + pageNum;
if(searchValue != null&& !searchValue.equals("")) {
param += "&searchKey=" + searchKey;
param += "&searchValue=" + URLEncoder.encode(searchValue, "UTF-8");
}
//이제 데이터 넘김
request.setAttribute("dto", dto);
request.setAttribute("pageNum", pageNum);
request.setAttribute("params", param);
request.setAttribute("searchKey", searchKey);
request.setAttribute("searchValue", searchValue);
return mapping.findForward("updated");
}
public ActionForward updated_ok(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
String pageNum = request.getParameter("pageNum");
String searchKey = request.getParameter("searchKey");
String searchValue = request.getParameter("searchValue");
BoardForm f = (BoardForm)form;
f.setNum(Integer.parseInt(request.getParameter("num")));
//수정된 데이터를 보낸다
dao.updateData(f);
//되돌아올때
String param = "&pageNum=" + pageNum;
if(searchValue != null&& !searchValue.equals("")) {
param += "&searchKey=" + searchKey;
param += "&searchValue=" + URLEncoder.encode(searchValue, "UTF-8");
}
request.setAttribute("params", param);
request.setAttribute("pageNum", pageNum);
//return mapping.findForward("updated_ok");
ActionForward af = new ActionForward();
af.setRedirect(true);
af.setPath("/board.do?method=list" + param);
return af;
}
public ActionForward deleted(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
Connection conn = DBConn.getConnection();
BoardDAO dao = new BoardDAO(conn);
int num = Integer.parseInt(request.getParameter("num"));
String pageNum = request.getParameter("pageNum");
String searchKey = request.getParameter("searchKey");
String searchValue = request.getParameter("searchValue");
dao.deleteData(num);
String param = "&pageNum=" + pageNum;
if(searchValue != null&& !searchValue.equals("")) {
param += "&searchKey=" + searchKey;
param += "&searchValue=" + URLEncoder.encode(searchValue, "UTF-8");
}
ActionForward af = new ActionForward();
af.setRedirect(true);
af.setPath("/board.do?method=list" + param);
return af;
}
}
BoardAction 클래스는 DispatchAction을 상속받는다.
기존에 했던 Servlet에서는 웹페이지 url을 if - else if로 구분해서 느리기 때문에 이런 문제점을 해결해
페이지를 이동할 때 필요한 메서드만 호출한다.
DB는 기존에 만들었던 Servlet게시판 board 테이블을 그대로 가져와서 연결해주었다. (이전 글 참고)
자세한 건 상단 주석 참고!
public ActionForward write(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
위를 보면 write 메서드에 있는 ActionForm은 BoardForm의 데이터 내용을 가져오는 기능을 한다.
struts-config_board.xml - (forward 경로 등록)
<?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">
<!-- 각각의 기능에 대한 환경설정 -->
<!-- 객체 생성 -->
<!-- /board.do 가 오면 com.board.BoardAction 으로 가라 갈때 boardForm가져가라
parameter : a.jsp?a=10&b=20 딸려가면서 어느메소드 찾아가라고 명시해줌
메소드에 담을 메소드가 필요하다. scope = request : "영역 이객체가 충돌될수있으니
request한도내에서 인식 1:1 관계에서만 boardAction 까지만
http://localhost:8080/struts/board.do?method=writeparameter = method = > ?method=writeparameter="method"
-> method 에 wrtie 가 들어오게된다.created 문자를 가져오면 /board/created.jsp 로 이동해라
forward일때 실제주소 , redirect 일때 가상주소 -->
<struts-config>
<form-beans>
<form-bean name="boardForm" type="com.board.BoardForm"/>
</form-beans>
<action-mappings>
<action path="/board" type="com.board.BoardAction"
name="boardForm" scope="request" parameter="method">
<forward name="created" path="/board/created.jsp"/>
<forward name="save" redirect="true" path="/board.do?method=list"/>
<forward name="list" path="/board/list.jsp"/>
<forward name="article" path="/board/article.jsp"/>
<forward name="updated" path="/board/updated.jsp"/>
</action>
</action-mappings>
</struts-config>
이 xml파일에서는 웹페이지 모든 경로를 등록한다.
<action-mappings>
안에는 경로(path)에. do를 입력하면 안 된다. 이미 web.xml파일에서 *. do를 입력해줘서 여기서는
생략해야 한다. 경로(path) 뒤에. do가 숨어있다고 생각하면 이해하기 쉽다.
<form-beans>에서 객체를 생성해주고, type와 name에는 데이터를 받기 위한 파일을 입력해준다.
type에는 BoardForm이 있는 경로를 쓰면 된다.
scope = request는 "영역 이 객체가 충돌될 수 있으니
request한도 내에서 인식 1:1 관계에서만 boardAction 까지만 객체 생성을 해도 겹치지 않도록 한다.
메서드를 구분하기 위해 parameter로 받고, 받는 변수명은 method로 선언했다.
<forward>
쪽을 보면 action파일에서 넘어온 메서드들을 판별한다.
name = " " 에 들어간 값에 따라 맞는 경로(path)로 연결해준다.
insert, delete, update가 있을 때는 redirect = "true"를 써준다.
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>게 시 판(Struts1)</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;
f.action = "<%=cp%>/board.do";
f.submit();
}
</script>
</head>
<body>
<div id="bbs">
<div id="bbs_title">
게 시 판 (Struts1)
</div>
<form action="" method="post" name="myForm">
<div id="bbsCreated">
<div class="bbsCreated_bottomLine">
<dl>
<dt>제 목</dt>
<dd>
<input type="text" name="subject" size="60"
maxlength="100" class="boxTF"/>
</dd>
</dl>
</div>
<div class="bbsCreated_bottomLine">
<dl>
<dt>작성자</dt>
<dd>
<input type="text" name="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" 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"></textarea>
</dd>
</dl>
</div>
<div class="bbsCreated_noLine">
<dl>
<dt>패스워드</dt>
<dd>
<input type="password" name="pwd" size="35"
maxlength="7" class="boxTF"/>
(게시물 수정 및 삭제시 필요!!)
</dd>
</dl>
</div>
</div>
<div id="bbsCreated_footer">
<input type="hidden" name="method" value="write_ok"/>
<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%>/board.do?method=list';"/>
</div>
</form>
</div>
</body>
</html>
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>게 시 판(Struts1)</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%>/board.do?method=list";
f.submit();
}
</script>
</head>
<body>
<div id="bbsList">
<div id="bbsList_title">
게 시 판(Struts1)
</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%>/board.do?method=write';"/>
</div>
</div>
<div id="bbsList_list">
<div id="title">
<!-- lists를 하나씩꺼내서 dto라는 변수에 넣음 -->
<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>
</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>게 시 판(Struts1)</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"/>
</head>
<body>
<div id="bbs">
<div id="bbs_title">
게 시 판(Struts1)
</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>
<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%>/board.do?method=updated&num=${dto.num }&${params }'"/>
<input type="button" value=" 삭제 " class="btn2"
onclick="javascript:location.href='<%=cp%>/board.do?method=deleted&num=${dto.num }&${params }'"/>
</div>
<div id="rightFooter">
<input type="button" value=" 리스트 " class="btn2"
onclick="javascript:location.href='<%=cp%>/board.do?method=list&${params }'"/>
</div>
</div>
</div>
</body>
</html>
updated.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>게 시 판(Struts1)</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;
f.action = "<%=cp%>/board.do";
f.submit();
}
</script>
</head>
<body>
<div id="bbs">
<div id="bbs_title">
게 시 판 (Struts1)
</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="method" value="updated_ok"/>
<input type="hidden" name="num" value="${dto.num }">
<input type="hidden" name="pageNum" value="${pageNum }">
<input type="hidden" name="searchKey" value="${searchKey }">
<input type="hidden" name="searchValue" value="${searchValue }">
<input type="button" value=" 수정하기 " class="btn2" onclick="sendIt();"/>
<input type="button" value=" 수정취소 " class="btn2"
onclick="javascript:location.href='<%=cp%>/board.do?method=list&${params }';"/>
</div>
</form>
</div>
</body>
</html>
여기까지 하면 Struts1으로 게시판 만들기 성공!
기존에 했던 Servlet 게시판과 크게 다른 게 없다. 다른 점은 Servlet 대신 Struts1을 쓰는 것이다.
내일은 오늘 했던 게시판을 iBatis를 사용해서 만들 예정이다.
'Back-End > JSP & Struts & JDBC' 카테고리의 다른 글
[Struts1] Struts1/iBatis 게시판 만들기 (0) | 2022.03.09 |
---|---|
iBatis(2.0) 설치 및 초기 세팅 (0) | 2022.03.08 |
[Servlet] - 이미지 게시판 만들기 (0) | 2022.03.03 |
[Servlet] 쿠키(cookie), 파일 업로드(1) - 파일 등록 및 조회, 파일 업로드(2) - 파일 업로드, 다운로드, 삭제 (0) | 2022.02.24 |
[JSP & Servlet] 핵심&필수 개념 정리 - (복습) (0) | 2022.02.23 |
블로그의 정보
무작정 개발
무작정 개발