
MyBatis sql문 xml에서 관리 → 컴파일 x, src에 관리, 오라클엔 DML만 넘어감
SqlSession → commit/rollback가능
pageMove[0] → forward/redirect → WEB-INF접근하려면 포워드때야함(else문처리)
<pojo step3 - ActionSupport.java>
package com.pojo.step3; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.pojo.step2.Board2Controller; public class ActionSupport extends HttpServlet { Logger logger = Logger.getLogger(ActionSupport.class); protected void doService(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { logger.info("doService 호출"); String uri = req.getRequestURI(); logger.info(uri); // /board3/boardList.st3가 찍힘 String context = req.getContextPath(); logger.info(context); // "/" -> server.xml에 들어있음 String command = uri.substring(context.length() + 1); System.out.println(command); // board3/boardList.st3 int end = command.lastIndexOf("."); System.out.println(end); // 16(board3의 경우) command = command.substring(0, end); System.out.println(command); // board3/boardList String upmu[] = null; // upmu[0]=업무명(폴더명), upmu[1]=요청기능이름(메소드명) upmu = command.split("/"); // /기준으로 문자열 잘라서 upmu 배열에 담기 logger.info(upmu[0] + ", " + upmu[1]); // upmu req에 담기 req.setAttribute("upmu", upmu); Object obj = ""; // null이 맞지만 String이 들어온다는 전제로 "" try { obj = HandlerMapping.getController(upmu, req, res); } catch (Exception e) { logger.info("Exception: " + e.toString()); } // 페이지 이동처리 공통코드 // obj 형식 예시 -> redirect:XXX.jsp or forward:XXX.jsp if (obj != null) { String pageMove[] = null; ModelAndView mav = null; // obj가 String인 경우 -> webapp if (obj instanceof String) { // obj에 :이 포함된 경우 if (((String) obj).contains(":")) { logger.info(": 포함되어 있음"); pageMove = obj.toString().split(":"); } // obj에 :이 포함되지 않은 경우 else { logger.info(": 포함되어 있지 않음"); pageMove = obj.toString().split("/"); } logger.info("페이지이동 => " + pageMove[0] + ", " + pageMove[1]); } // obj가 ModelAndView인 경우 -> WEB-INF else if (obj instanceof ModelAndView) { mav = (ModelAndView) obj; pageMove = new String[2]; pageMove[0] = ""; // forward가 들어있으면 안됨 -> 있으면 webapp로 향함 pageMove[1] = mav.getViewName(); } // pageMove가 null이 아닐 경우 각 방식으로 페이지 이동처리 if (pageMove != null) { // pageMove[0] = redirect or forward or "" // pageMove[1] = XXX new ViewResolver(req, res, pageMove); } } // end of 페이지 이동처리 공통코드 } @Override protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { logger.info("doGet호출"); doService(req, res); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { logger.info("doPost호출"); doService(req, res); } }
<pojo step3 - HandlerMapping.java>
package com.pojo.step3; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; public class HandlerMapping { static Logger logger = Logger.getLogger(HandlerMapping.class); /*************************************** * @param upmu[](upmu[0]=업무명,폴더명 | upmu[1]=메소드명, 기능명, 페이지이름) * @param request -> 1-1, 1-2와는 다르게 인터페이스를 implements하지 않는다 * @param response -> HttpServlet * Q. 어디서 받아오는가? * @return Object * 테스트 -> http://localhost:9000/board3/boardList.st3 ***************************************/ public static Object getController(String[] upmu, HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { logger.info(upmu[0]+", "+upmu[1]); Controller3 controller = null; String path = null; Object obj = null; ModelAndView mav = null; // 게시판 구현 if("board3".equals(upmu[0])) { controller = new Board3Controller(); // 게시글 전체 목록 -> html 화면 출력(text/html) if("boardList".equals(upmu[1])) { obj = controller.boardList(req, res); // 리턴타입이 ModelAndView인 경우 if(obj instanceof ModelAndView) { return (ModelAndView)obj; } // 리턴타입이 String인 경우 else if(obj instanceof String) { return (String)obj; } } // json 게시글 전체 목록 -> json 화면 출력(application/json) else if("jsonBoardList".equals(upmu[1])) { obj = controller.jsonBoardList(req, res); // 리턴타입이 ModelAndView인 경우 if(obj instanceof ModelAndView) { return (ModelAndView)obj; } // 리턴타입이 String인 경우 else if(obj instanceof String) { return (String)obj; } } // 글 입력 - 새글쓰기와 댓글쓰기 else if("boardInsert".equals(upmu[1])) { obj = controller.boardInsert(req, res); // 리턴타입이 String인 경우 if(obj instanceof String) { return (String)obj; } } // 글 수정 - 첨부파일 수정 유무 고려하기 else if("boardUpdate".equals(upmu[1])) { obj = controller.boardUpdate(req, res); // 리턴타입이 String인 경우 if(obj instanceof String) { return (String)obj; } } // 글 삭제 - 첨부파일 삭제 유무 고려하기 else if("boardDelete".equals(upmu[1])) { obj = controller.boardDelete(req, res); // 리턴타입이 String인 경우 if(obj instanceof String) { return (String)obj; } } // 글 상세보기 else if("boardDetail".equals(upmu[1])) { obj = controller.boardDetail(req, res); // 리턴타입이 ModelAndView인 경우 if(obj instanceof ModelAndView) { return (ModelAndView)obj; } // 리턴타입이 String인 경우 else if(obj instanceof String) { return (String)obj; } } } // end of 게시판 구현 // 인증 관리 구현 else if("auth".equals(upmu[0])) { } // 회원 관리 구현 else if("member".equals(upmu[0])) { } // 주문 관리 구현 else if("order".equals(upmu[0])) { } return obj; } }
<pojo step3 - Controller3.java>
package com.pojo.step3; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; // javascript기반의 UI API // 리액트는 바닐라스크립트 + ES6(주요이슈-spread, module, arrow),ES7 + html 섞어쓰기 public interface Controller3 { public Object jsonBoardList(HttpServletRequest req, HttpServletResponse res); public Object boardList(HttpServletRequest req, HttpServletResponse res); public Object boardDetail(HttpServletRequest req, HttpServletResponse res); public Object boardInsert(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException; public Object boardUpdate(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException; public Object boardDelete(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException; }
<pojo step3 - ModelAndView.java>
package com.pojo.step3; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.apache.log4j.Logger; /* * spring4에서 제공되던 ModelAndView 흉내내기 * ModelAndView * 1) scope가 request이다 * 2) 화면 이름을 정해준다 */ public class ModelAndView { Logger logger = Logger.getLogger(ModelAndView.class); HttpServletRequest req = null; // 캡슐화 코드는 반드시 getter/setter가 필요하다 -> 스프링부트는 Lombok대체 private String viewName = null; List<Map<String, Object>> reqList = new ArrayList<>(); public ModelAndView() { } public ModelAndView(HttpServletRequest req) { this.req = req; } public void addObject(String name, Object obj) { req.setAttribute(name, obj); Map<String, Object> pMap = new HashMap<>(); pMap.put(name, obj); reqList.add(pMap); } public String getViewName() { return viewName; } public void setViewName(String viewName) { this.viewName = viewName; } }
<pojo step3 - HashMapBinder.java>
package com.util; import java.util.Enumeration; import java.util.Map; import javax.servlet.http.HttpServletRequest; // 스프링부트에선 RequestParam이 대신해줌, Model, ModelMap // 사용자가 입력한 값을 Map에 담아준다 // 담을 Map은 컨트롤계층에서 bind메소드호출시 파라미터를 이용해서 원본 주소번지를 받아온다 // 그리고 그 안에 담는다 public class HashMapBinder { HttpServletRequest req = null; // 전역변수 public HashMapBinder() { } // 생성자 파라미터(지역변수)에 요청객체가 필요한 이유는? // -> 생성자의 1역할: 전역변수의 초기화 public HashMapBinder(HttpServletRequest req) { this.req = req; } // 어떤 페이지 어떤 상황에서 공통코드를 재사용 가능하게 할 것인가? // 각 업무별 요청 클래스에서 주입받을 객체를 정해서 메소드의 파라미터로 전달받음 // 전달받은 주소번지 원본에 값을 담아준다 public void bind(Map<String, Object>pMap) { pMap.clear(); Enumeration<String> en = req.getParameterNames(); while(en.hasMoreElements()) { String key = en.nextElement(); pMap.put(key, req.getParameter(key)); } } }
<pojo step3 - Board3Controller.java>
package com.pojo.step3; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; import com.util.HashMapBinder; public class Board3Controller implements Controller3 { Logger logger = Logger.getLogger(Board3Controller.class); Board3Logic boardLogic = new Board3Logic(); //메소드 @Override public ModelAndView boardList(HttpServletRequest req, HttpServletResponse res) { logger.info("boardList 호출"); List<Map<String, Object>> bList = null; //사용자가 조건 검색을 원하는 경우 - 조건 값을 전달할 객체 생성함 //MyBatis에서는 동적쿼리를 지원하므로 하나로 2가지 경우 사용 가능함 Map<String, Object> pMap = new HashMap<>(); HashMapBinder hmb = new HashMapBinder(req); hmb.bind(pMap); bList =boardLogic.boardList(pMap); ModelAndView mav = new ModelAndView(req); mav.setViewName("board3/boardList"); mav.addObject("bList", bList); return mav; // 리턴이 mav면 webapp/WEB-INF/views/board3 아래의 jsp } @Override public Object jsonBoardList(HttpServletRequest req, HttpServletResponse res) { logger.info("jsonBoardList호출"); List<Map<String, Object>> bList = null; Map<String, Object> pMap = new HashMap<>(); bList =boardLogic.boardList(pMap); req.setAttribute("bList", bList); return "forward:jsonBoardList.jsp"; // 리턴이 String이면 webapp/board3 아래의 jsp } @Override public Object boardDetail(HttpServletRequest req, HttpServletResponse res) { logger.info("boardDetail호출"); List<Map<String, Object>> bList = null; //전체 조회에 대한 sql문 재사용 가능함 - 1건 조회 경우 Map<String, Object> pMap = new HashMap<>(); HashMapBinder hmb = new HashMapBinder(req); hmb.bind(pMap); bList =boardLogic.boardList(pMap); logger.info(bList); req.setAttribute("bList", bList); return "forward:board3/boardDetail"; } /* * INSERT INTO board_master_t(bm_no, bm_title, bm_writer, bm_content, bm_reg, * bm_hit) VALUES(seq_board_no.nextval, #{bm_title}, * #{bm_writer}, to_char(sysdate, 'YYYY-MM-DD') , 0) * * 화면에서 받아올 값 - bm_title, bm_writer, bm_content * 그렇지 않은 경우 - bm_reg */ @Override public Object boardInsert(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { logger.info("boardInsert호출"); int result = 0; // 폼태그 안에 사용자가 입력한 정보(bm_writer, bm_title, bm_content...)를 받아온다 // req.getParameter("bm_writer") // req.getParameter("bm_title") // req.getParameter("bm_content") // -> 계속 반복해야하기에 HashMapBinder클래스 공통코드 생성 Map<String, Object> pMap = new HashMap<>(); HashMapBinder hmb = new HashMapBinder(req); hmb.bind(pMap); result = boardLogic.boardInsert(pMap); String path = ""; if(result==1) { path = "redirect:/board3/boardList.st3"; } else { path = "redirect:/board3/boardInsertFail.jsp"; res.sendRedirect(path); } return path; } @Override public Object boardUpdate(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { logger.info("boardUpdate호출"); int result = 0; Map<String, Object> pMap = new HashMap<>(); HashMapBinder hmb = new HashMapBinder(req); hmb.bind(pMap); logger.info(pMap); // result값의 변화를 주는 코드(0->1) result = boardLogic.boardUpdate(pMap); String path = ""; if(result==1) { path = "redirect:/board3/boardList.st3"; } else { path = "redirect:/board3/boardUpdateFail.jsp"; res.sendRedirect(path); } return path; } @Override public Object boardDelete(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { logger.info("boardDelete호출"); int result = 0; Map<String, Object> pMap = new HashMap<>(); HashMapBinder hmb = new HashMapBinder(req); hmb.bind(pMap); result = boardLogic.boardDelete(pMap); String path = ""; if(result==1) { path = "redirect:/board3/boardList.st3"; } else { path = "redirect:/board3/boardUpdateFail.jsp"; res.sendRedirect(path); } return path; } }
<pojo step3 - Board3Logic.java>
package com.pojo.step3; import java.util.List; import java.util.Map; import org.apache.log4j.Logger; public class Board3Logic { Logger logger = Logger.getLogger(Board3Logic.class); Board3Dao boardDao = new Board3Dao(); /** * 글 목록 출력 * @param pMap * @return */ public List<Map<String, Object>> boardList(Map<String, Object> pMap) { logger.info("boardList 호출" + pMap); List<Map<String, Object>> bList = null; bList = boardDao.boardList(pMap); return bList; } /** * 새 글쓰기 * @param pMap * @return */ public int boardInsert(Map<String, Object> pMap) { logger.info("boardInsert 호출" + pMap); int result = 0; int bm_no = 0; int bm_group = 0; bm_no = boardDao.getBNo(); pMap.put("bm_no", bm_no); // Map안에서 꺼낸다는 건 화면에서 넘어온 값이라는 뜻 if(pMap.get("bm_group")!=null) { bm_group = Integer.parseInt(pMap.get("bm_group").toString()); } // 댓글쓰기인 경우 /* * UPDATE board_master_t * SET bm_step = bm_step + 1 * WHERE bm_group =:g * AND bm_step >:s; */ if(bm_group > 0) { logger.info("댓글쓰기 로직 호출"); boardDao.bStepUpdate(pMap); pMap.put("bm_pos", Integer.parseInt(pMap.get("bm_pos").toString())+1); pMap.put("bm_step", Integer.parseInt(pMap.get("bm_step").toString())+1); } // 새글쓰기인 경우 -> 그룹번호 채번 포함 else { logger.info("새글쓰기 로직 호출 => " + bm_group); bm_group = boardDao.getBGroup(); pMap.put("bm_group", bm_group); pMap.put("bm_pos", 0); pMap.put("bm_step", 0); } result = boardDao.boardInsert(pMap); return result; } /** * 글 수정 * @param pMap * @return */ public int boardUpdate(Map<String, Object> pMap) { logger.info("boardUpdate 호출" + pMap); int result = 0; result = boardDao.boardMUpdate(pMap); return result; } /** * 글 삭제 * @param pMap * @return */ public int boardDelete(Map<String, Object> pMap) { logger.info("boardDelete 호출" + pMap); int result = 0; result = boardDao.boardMDelete(pMap); return result; } }
<pojo step3 - Board3Dao.java>
package com.pojo.step3; import java.util.HashMap; import java.util.List; import java.util.Map; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.log4j.Logger; import com.util.MyBatisCommonFactory; public class Board3Dao { Logger logger = Logger.getLogger(Board3Dao.class); MyBatisCommonFactory mcf = new MyBatisCommonFactory(); /** * 게시글 목록 출력 * @param pMap * @return */ public List<Map<String, Object>> boardList(Map<String, Object> pMap) { logger.info("boardList 호출"); List<Map<String, Object>> bList = null; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { sqlSessionFactory = mcf.getSqlSessionFactory(); sqlSession = sqlSessionFactory.openSession(); bList = sqlSession.selectList("boardList", pMap); logger.info(bList); } catch (Exception e) { e.printStackTrace(); } return bList; } /** * 새 게시글 쓰기 * @param pMap * @return */ public int boardInsert(Map<String, Object> pMap) { logger.info("boardInsert 호출"); int result = 0; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { sqlSessionFactory = mcf.getSqlSessionFactory(); sqlSession = sqlSessionFactory.openSession(); // insert이지만 update로 하는 이유는 리턴타입이 Object이기 때문이다 // 메소드 이름은 상관없이 해당 쿼리문을 id로 찾기 때문이다 result = sqlSession.update("boardMInsert", pMap); if(result == 1) { sqlSession.commit(); } logger.info(result); } catch (Exception e) { e.printStackTrace(); } return result; } /** * 글 group 채번 * @return */ public int getBGroup() { int result = 0; logger.info("getBGroup 호출"); SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { sqlSessionFactory = mcf.getSqlSessionFactory(); sqlSession = sqlSessionFactory.openSession(); result = sqlSession.selectOne("getBGroup", ""); logger.info(result); // 채번한 글그룹번호 } catch (Exception e) { e.printStackTrace(); } return result; } /** * 글 no 채번 * @return */ public int getBNo() { int result = 0; logger.info("getBNo 호출"); SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { sqlSessionFactory = mcf.getSqlSessionFactory(); sqlSession = sqlSessionFactory.openSession(); result = sqlSession.selectOne("getBNo", ""); logger.info(result); // 채번한 글번호 } catch (Exception e) { e.printStackTrace(); } return result; } /** * 글 step 업데이트 * @param pMap */ public void bStepUpdate(Map<String, Object> pMap) { logger.info("bStepUpdate 호출"); int result = 0; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { sqlSessionFactory = mcf.getSqlSessionFactory(); sqlSession = sqlSessionFactory.openSession(); result = sqlSession.update("bStepUpdate", pMap); if(result == 1) { sqlSession.commit(); } logger.info(result); } catch (Exception e) { e.printStackTrace(); } } // end of bStepUpdate /** * 글 수정하기 * @param pMap - 사용자가 입력한 값 받아옴 */ public int boardMUpdate(Map<String, Object> pMap) { logger.info("boardMUpdate 호출"); int result = 0; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { sqlSessionFactory = mcf.getSqlSessionFactory(); sqlSession = sqlSessionFactory.openSession(); result = sqlSession.update("boardMUpdate", pMap); if(result == 1) { sqlSession.commit(); } logger.info(result); } catch (Exception e) { e.printStackTrace(); } return result; } // end of boardMUpdate /** * 글 삭제하기 * @param pMap * @return */ public int boardMDelete(Map<String, Object> pMap) { logger.info("boardMDelete 호출"); int result = 0; SqlSessionFactory sqlSessionFactory = null; SqlSession sqlSession = null; try { sqlSessionFactory = mcf.getSqlSessionFactory(); sqlSession = sqlSessionFactory.openSession(); int bm_no = 0; if(pMap.get("bm_no")!=null) { bm_no = Integer.parseInt(pMap.get("bm_no").toString()); } result = sqlSession.update("boardMDelete", bm_no); if(result == 1) { sqlSession.commit(); } logger.info(result); } catch (Exception e) { e.printStackTrace(); } return result; } // end of boardMDelete }
<pojo step3 - ViewResolver.java>
package com.pojo.step3; import java.io.IOException; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.log4j.Logger; public class ViewResolver { Logger logger = Logger.getLogger(ViewResolver.class); public ViewResolver() { } public ViewResolver(HttpServletRequest req, HttpServletResponse res, String[] pageMove) throws ServletException, IOException{ String path = pageMove[1]; // pageMove[0]이 redirect -> webapp if ("redirect".equals(pageMove[0])) { res.sendRedirect(path); } // pageMove[0]이 forward -> webapp else if ("forward".equals(pageMove[0])) { RequestDispatcher view = req.getRequestDispatcher("/" + path + ".jsp"); view.forward(req, res); } // 그외 forward 처리 -> WEB-INF // setViewName(XXX); // WEB-INF/views/XXX.jsp else { path = pageMove[0] + "/" + pageMove[1]; RequestDispatcher view = req.getRequestDispatcher("/WEB-INF/views" + path + ".jsp"); view.forward(req, res); } } // end of ViewResolver(req, res, pageMove) }
<pojo step3 - board.xml>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.mybatis.mapper.BoardMapper"> <!-- 게시글 삭제 --> <delete id="boardMDelete" parameterType="int"> DELETE FROM board_master_t WHERE bm_no = #{value} </delete> <!-- 게시글목록 가져오는 쿼리문 --> <select id="boardList" parameterType="java.util.HashMap" resultType="map"> SELECT bm.bm_no, bm.bm_title, bm.bm_writer, bm.bm_content, bm.bm_pw, bs.bs_file, bm.bm_hit, bm.bm_group, bm.bm_pos, bm.bm_step, bm.bm_reg FROM board_master_t bm, board_sub_t bs WHERE bm.bm_no = bs.bm_no(+) <!-- 글번호로 검색 --> <if test= 'bm_no > 0' > AND bm.bm_no = #{bm_no} </if> <!-- 글날짜로 검색 --> <if test= 'bm_reg!=null and bm_reg.length()!=0 and bm_reg!="undefined"' > AND bm_reg LIKE '%'||#{bm_reg}||'%' </if> <!-- 글제목으로 검색 --> <if test= 'cb_search!=null and cb_search.length()>0 and cb_search.equals("bm_title")' > AND bm_title LIKE '%'||#{tb_search}||'%' </if> <!-- 글내용으로 검색 --> <if test= 'cb_search!=null and cb_search.equals("bm_content")' > AND bm_content LIKE '%'||#{tb_search}||'%' </if> <!-- 작성자로 검색 --> <if test= 'cb_search!=null and cb_search.equals("bm_writer")' > AND bm_writer LIKE '%'||#{tb_search}||'%' </if> ORDER BY bm.bm_group DESC, bm.bm_step ASC </select> <!-- board Master에 인서트 --> <!-- pos와 step은 원글이면 0, 댓글이면 read.jsp에서 가진 값에 1을 더한 값으로 결정됨 조회수는 0(새글이니까), 날짜는 시스템 날짜정보로 등록 --> <insert id="boardMInsert" parameterType="map"> INSERT INTO board_master_t (bm_no, bm_title, bm_writer, bm_content, bm_pw, bm_reg, bm_hit, bm_group, bm_pos, bm_step) VALUES (#{bm_no}, #{bm_title}, #{bm_writer}, #{bm_content}, #{bm_pw}, to_char(sysdate, 'YYYY-MM-DD'), 0, #{bm_group}, #{bm_pos}, #{bm_step}) </insert> <!-- board Sub에 인서트 --> <!-- 첨부파일을 추가하는 경우에만 실행됨, 없으면 해당없음 글번호는 새글쓰기에서 결정된 값이 대입되어야함, 새로채번하면 안됨! --> <insert id="boardSInsert" parameterType="map"> INSERT INTO board_sub_t(bm_no, bs_seq, bs_file, bs_size) VALUES(#{bm_no}, 1, #{bs_file}, #{bs_size}) </insert> <!-- board Master에 Step 업데이트 --> <!-- 내가 쓰는 댓글 뒤에 댓글이 존재하는 경우만 실행됨 조건절에 들어오는 그룹번호와 step은 상세보기 화면에서 가져온 값이 대입됨 --> <update id="bStepUpdate" parameterType="map"> UPDATE board_master_t SET bm_step = bm_step + 1 WHERE bm_group = #{bm_group} AND bm_step > #{bm_step} </update> <!-- board Master 내용 수정하기 --> <update id="boardMUpdate" parameterType="map"> UPDATE board_master_t SET bm_title = #{bm_title} <if test="bm_writer != null"> ,bm_writer = #{bm_writer} </if> <if test="bm_content != null"> ,bm_content = #{bm_content} </if> <if test="bm_pw != null"> ,bm_pw = #{bm_pw} </if> ,bm_reg = TO_CHAR(sysdate, 'YYYY-MM-DD') WHERE bm_no = #{bm_no} </update> <!-- bm_no 채번 --> <select id="getBNo" parameterType="string" resultType="int"> SELECT NVL ( (SELECT /*+index_desc(board_master_t BOARD_BM_NO_PK) */ bm_no FROM board_master_t WHERE ROWNUM = 1), 0)+1 bm_no FROM DUAL </select> <!-- bm_group 채번 --> <select id="getBGroup" parameterType="string" resultType="int"> SELECT NVL ( (SELECT /*+index_desc(board_master_t i_board_group) */ bm_group FROM board_master_t WHERE ROWNUM = 1 AND bm_group > 0), 0)+1 bm_group FROM DUAL </select> </mapper>
<pojo step3 - boardList.jsp → WEB-INF위치>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <% // jsp에서 자바코드(스크립틀릿)와 html코드의 작성 위치는 문제가 되지 않는다. // 왜냐하면 어차피 jsp는 서버에서 실행되고 그 결과가 text로 출력되는 것이므로 // html과 처리 시점이 완전 다르니까... List<Map<String,Object>> boardList = (List<Map<String,Object>>)request.getAttribute("bList"); int size = 0; if(boardList!=null){ size = boardList.size(); } %> <!DOCTYPE html> <html> <head> <!-- <meta charset="UTF-8"> 이것때문에 한글깨짐.--> <title>MVC기반의 계층형 게시판 구현하기[WEB-INF]</title> <%@ include file="../common/easyUI_common.jsp" %> <script type="text/javascript"> let g_no=0;//그리드에서 선택이 바뀔때 마다 변경된 값이 저장됨. let tb_value;//사용자가 입력한 문자열 담기 let isOk = false; function dlgIns_save(){ //폼 전송 처리함. $("#f_boardIns").submit(); } function dlgIns_close(){ $("#dlg_boardIns").dialog('close'); } function getBoardList(){ //alert("getBoardList호출"); //사용자가 선택한 콤보박스에 value가 담김 - b_title, or b_content or b_writer cb_value = user_combo; tb_value = $("#tb_search").val();//사용자가 입력한 조건 검색 문자열 console.log("콤보박스 값: "+ cb_value+", 사용자가 입력한 키워드: "+tb_value); location.href = "./boardList.st3?cb_search="+cb_value+"&tb_search="+tb_value+"&bm_reg="+v_date; } function boardDetail(bm_no){ console.log(bm_no) location.href = "./boardDetail.st3?bm_no="+bm_no; } function fileDown(fname){ location.href="downLoad.jsp?bs_file="+fname; } </script> </head> <body> <script type="text/javascript"> let user_combo="bm_title";//제목|내용|작성자 //전변 - javascript에서는 선언만 하고 선택을 하지 않았거나 값이 할당되지 않으면 //그냥 null비교만 해서는 안된다. let v_date;//사용자가 선택한 날짜 정보 담기 //기본 날짜포맷을 재정의 $.fn.datebox.defaults.formatter = function(date){ var y = date.getFullYear(); var m = date.getMonth()+1; var d = date.getDate(); return y+'-'+(m<10? "0"+m:m)+'-'+(d<10? "0"+d:d); } //날짜 포맷을 적용 $.fn.datebox.defaults.parser = function(s){ var t = Date.parse(s); if (!isNaN(t)){ return new Date(t); } else { return new Date(); } } $(document).ready(function(){//DOM구성이 완료된 시점-자바스크립트로 태그접근,설정변경,이미지 $("#dg_board").datagrid({ onSelect:function(index,row){ g_no = row.B_NO; console.log("g_no:"+g_no); }, onDblClickCell: function(index, field, value){ if("B_TITLE" == field){ location.href="./boardDetail.pj?b_no="+g_no; g_no = 0; $("#dg_board").datagrid('clearSelections') } } }); //등록 날짜 정보를 선택했을 때 $('#db_date').datebox({ //왜? undefinded이었나? onSelect: function(date){ //alert(date.getFullYear()+":"+(date.getMonth()+1)+":"+date.getDate()); const y = date.getFullYear(); const m = date.getMonth()+1; const d = date.getDate(); v_date = y+"-"+(m<10? "0"+m:m)+"-"+(d<10? "0"+d:d); //console.log("사용자가 선택한 날짜 ==> "+v_date); } }); //검색 조건 콤보에 변경이 일어났을 때 $('#cb_search').combobox({ onChange:function(){ user_combo = $("#cb_search").combobox('getValue');//b_title or b_content or b_writer console.log(user_combo) } }); $('#tb_search').textbox({ icons: [{ iconCls:'icon-search', handler: function(e){ console.log("검색"); //$(e.data.target).textbox('setValue', 'Something added!'); $("#dg_board").datagrid({ }); } }] }); /*===================== CRUD버튼 시작 ====================*/ //조회버튼 클릭했을 때 $('#crudBtnSel').bind('click', function(){ getBoardList(); }); $('#crudBtnIns').bind('click', function(){ //alert('입력 버튼'); $("#dlg_boardIns").dialog('open'); }); $('#crudBtnUpd').bind('click', function(){ alert('수정 버튼'); }); $('#crudBtnDel').bind('click', function(){ alert('삭제 버튼'); }); /*===================== CRUD버튼 끝 ====================*/ });///////////////// end of ready </script> <center> <table id="dg_board" class="easyui-datagrid" title="계층형 게시판 목록" style="width:800px;height:550px" data-options="rownumbers:true,singleSelect:true,toolbar:'#tb',footer:'#pn_board'"> <thead> <tr> <th data-options="field:'BM_NO',width:60, align:'center', hidden:'true'">글번호</th> <th data-options="field:'BM_TITLE',width:350">제목</th> <th data-options="field:'BM_WRITER',width:80,align:'center'">작성자</th> <th data-options="field:'BM_REG',width:100,align:'center'">작성일</th> <th data-options="field:'BS_FILE',width:170">첨부파일</th> <th data-options="field:'BM_HIT',width:60,align:'center'">조회수</th> </tr> </thead> <tbody> <% if(size==0){ %> <script> $.messager.alert('Info','조회결과가 없습니다.'); </script> <% } else if(size>0){ for(int i=0;i<size;i++){ if(size == i) break; Map<String,Object> rMap = boardList.get(i); %> <tr> <td><%=1%></td> <td> <!-- 너 댓글이니? --> <% String imgPath = path + "..\\images\\"; if(Integer.parseInt(rMap.get("BM_POS").toString()) > 0){ for(int j=0; j<Integer.parseInt(rMap.get("BM_POS").toString()); j++){ out.print(" "); } %> <img src="<%=imgPath%>reply.gif" /> <% } %> <a href="javascript:boardDetail('<%=rMap.get("BM_NO") %>')" style="text-decoration:none;color:#000000"> <%=rMap.get("BM_TITLE")%> </a> </td> <td><%=rMap.get("BM_WRITER")%></td> <td><%=rMap.get("BM_REG")%></td> <td> <%="첨부파일 없음"%> </td> <td><%=rMap.get("BM_HIT")%></td> </tr> <% }// end of for }// end of else if %> </tbody> </table> <!-- 툴바 추가 중 조건검색 화면 시작 --> <div id="tb" style="padding:2px 5px;"> <!-- req.getParameter("cb_search"):String SELECT * FROM board_master_t WHERE ?(컬럼) LIKE %||?||% --> <select class="easyui-combobox" id="cb_search" name="cb_search" panelHeight="auto" style="width:100px"> <option selected>선택</option> <option value="bm_title">제목</option> <option value="bm_content">내용</option> <option value="bm_writer">작성자</option> </select> <input id="tb_search" name="tb_search" class="easyui-textbox" style="width:320px"> 작성일: <input id="db_date" class="easyui-datebox" name="bm_date" style="width:110px"> <!-- 버튼 추가 화면 시작 --> <div id="ft" style="padding:2px 5px;"> <a id="crudBtnSel" href="#" class="easyui-linkbutton" iconCls="icon-search" plain="true">조회</a> <a id="crudBtnIns" href="#" class="easyui-linkbutton" iconCls="icon-edit" plain="true">입력</a> <a id="crudBtnUpd" href="#" class="easyui-linkbutton" iconCls="icon-reload" plain="true">수정</a> <a id="crudBtnDel" href="#" class="easyui-linkbutton" iconCls="icon-cut" plain="true">삭제</a> </div> <!-- 버튼 추가 화면 끝 --> </div> <!-- 툴바 추가 중 조건검색 화면 끝 --> <!-- 페이지 네이션 추가 시작 --> <div style="display:table-cell;vertical-align:middle; width:800px; background:#efefef; height:30; border:1px solid #ccc;"> 1 2 3 4 5 6 7 8 9 10 </div> <!-- 페이지 네이션 추가 끝 --> <% String gubun = request.getParameter("gubun"); if("list".equals(gubun)){ %> <script type="text/javascript"> getBoardList(); </script> <% } %> <!-- 글입력 화면 추가 시작 --> <div id="dlg_boardIns" footer="#tb_boardIns" class="easyui-dialog" title="글쓰기" data-options="modal:true,closed:true" style="width:600px;height:400px;padding:10px"> <!-- <form id="f_boardIns" method="post" enctype="multipart/form-data" action="./boardInsert.pj"> --> <form id="f_boardIns" method="get" action="./boardInsert.st3"> <!-- hidden속성은 화면에 보이지 않음 - 개발자가 필요로하는 값 등록 부분과 수정 부분이 동시에 발생할 수도 있다 - 트랜젝션 처리가 필요함 트랜잭션 처리가 필요한 경우의 메소드 설계 --> <input type="hidden" id="bm_no" name="bm_no" value="0"> <input type="hidden" id="bm_group" name="bm_group" value="0"> <input type="hidden" id="bm_pos" name="bm_pos" value="0"> <input type="hidden" id="bm_step" name="bm_step" value="0"> <table> <tr> <td width="100px">제 목</td> <td width="500px"><input id="bm_title" name="bm_title" class="easyui-textbox" data-options="width:'250px'" required></td> </tr> <tr> <td width="100px">작 성 자</td> <td width="500px"><input id="bm_writer" name="bm_writer" class="easyui-textbox" data-options="width:'150px'" required></td> </tr> <tr> <td width="100px">내 용</td> <td width="500px"><input id="bm_content" name="bm_content" class="easyui-textbox" data-options="multiline:'true',width:'350px', height:'90px'" required></td> </tr> <tr> <td width="100px">비 번</td> <td width="500px"><input id="bm_pw" name="bm_pw" class="easyui-textbox" data-options="width:'100px'" required></td> </tr> <tr> <td width="100px">첨부파일</td> <td width="500px"><input id="bs_file" name="bs_file" class="easyui-filebox" data-options="width:'350px'"></td> </tr> </table> </form> </div> <!-- 다이얼로그 화면 버튼 추가 시작 --> <div id="tb_boardIns"> <a href="javascript:dlgIns_save()" class="easyui-linkbutton">저장</a> <a href="javascript:dlgIns_close()" class="easyui-linkbutton">닫기</a> </div> <!-- 다이얼로그 화면 버튼 추가 끝 --> <!-- 글입력 화면 추가 끝 --> </center> </body> </html>
<pojo step3 - boardDetail.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.List, java.util.Map"%> <% List<Map<String,Object>> getBoardList = (List<Map<String,Object>>)request.getAttribute("bList"); String bm_title = null; String bm_writer = null; String bm_content = null; String bm_pw = null; String bm_no = null; String bm_group = null; String bm_pos = null; String bm_step = null; if(getBoardList!=null && getBoardList.size()>0){ bm_title = getBoardList.get(0).get("BM_TITLE").toString(); bm_writer = getBoardList.get(0).get("BM_WRITER").toString(); bm_content = getBoardList.get(0).get("BM_CONTENT").toString(); bm_pw = getBoardList.get(0).get("BM_PW").toString(); bm_no = getBoardList.get(0).get("BM_NO").toString(); bm_group = getBoardList.get(0).get("BM_GROUP").toString(); bm_pos = getBoardList.get(0).get("BM_POS").toString(); bm_step = getBoardList.get(0).get("BM_STEP").toString(); } out.print(getBoardList); %> <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>글상세보기</title> <!-- 공통 코드 include처리 --> <%@ include file="../common/easyUI_common.jsp" %> <script type="text/javascript"> function addAction(){ $("#f_boardAdd").attr("action","/board3/boardInsert.st3"); $("#f_boardAdd").submit(); //부모창에 함수를 호출할때 opener.함수명(); //opener.boardList(); //self.close(); } function updateForm(){ //alert("updateForm 호출 성공"); $('#d_boardUpd').dialog({ title:'글수정' ,width:720 ,height:450 ,closed:false ,cache:false ,modal:true }); //$('#d_boardUpd').dialog('open'); //$('#d_boardUpd').dialog('refresh', ''); } // 수정창 확인버튼 boardUpd = () => { $("#uf_board").attr("action","/board3/boardUpdate.st3"); $("#uf_board").submit(); } //댓글쓰기 function repleForm(){ $("#dlg_boardAdd").dialog('open'); } //글삭제하기 이벤트 처리 function boardDelView(){ console.log("boardDelView호출 성공"); $('#d_boardDel').dialog({ title: '글삭제', buttons: btn_boardDel, width: 420, height: 250, closed: true, cache: false, href: 'boardDelForm.jsp?bm_no=<%=bm_no%>&bm_pw=<%=bm_pw%>', modal: true }); $('#d_boardDel').dialog('open'); } //글삭제 화면에서 확인 버튼을 클릭했을 때 function boardDel(){ const db_pw = '<%=bm_pw%>' const u_pw = $("#u_pw").textbox('getValue'); //alert("db_pw:"+db_pw+", u_pw:"+u_pw); //alert("사용자가 입력한 비번:"+$("#db_pw").textbox('getValue')); //사용자가 입력한 비번과 DB에서 읽어온 비번을 비교하여 //일치하면 삭제 처리 진행하고 //불일치하면 비번을 다시 입력받도록 해주세요. if(u_pw==db_pw){ //alert("같다"); $.messager.confirm('Confirm','정말 삭제하시겠습니까?',function(r){ //r:true-ok, false-cancel if (r){//자바스크립트는 0이면 false 나머지 true location.href="./boardDelete.st3?bm_no=<%=bm_no%>"; } }); }else{ console.log('비밀번호가 다릅니다.') $("#db_pw").textbox('setValue',''); } } function boardDelClose(){ $('#d_boardDel').dialog('close'); } function boardList(){ location.href="/board3/boardList.st3"; } </script> </head> <body> <script type="text/javascript"> $(document).ready(function(){ }); </script> <table align="center" id="p" class="easyui-panel" title="글상세보기" data-options="footer:'#tb_read'" style="width:670px;height:380px;padding:10px;background:#fafafa;"> <tr> <td>제목</td> <td><input id="bm_title" value="<%=bm_title %>" name="bm_title" data-options="width:'450px'" class="easyui-textbox"></td> </tr> <tr> <td>작성자</td> <td><input id="bm_writer" value="<%=bm_writer %>" name="bm_writer" class="easyui-textbox"></td> </tr> <tr> <td>내용</td> <td><input id="bm_content" value="<%=bm_content %>" name="bm_content" data-options="multiline:'true', width:'570px', height:'90px'" class="easyui-textbox"></td> </tr> <tr> <td>비밀번호</td> <td><input id="bm_pw" value="<%=bm_pw %>" name="bm_pw" class="easyui-passwordbox"></td> </tr> </table> <div id="tb_read" style="padding:2px 5px;" align="center"> <a href="javascript:repleForm()" class="easyui-linkbutton" iconCls="icon-edit" plain="true">댓글쓰기</a> <a href="javascript:updateForm()" class="easyui-linkbutton" iconCls="icon-add" plain="true">수정</a> <a href="javascript:boardDelView()" class="easyui-linkbutton" iconCls="icon-remove" plain="true">삭제</a> <a href="javascript:boardList()" class="easyui-linkbutton" iconCls="icon-search" plain="true">목록</a> </div> <!-- 글삭제 시작 --> <div id="d_boardDel" closed="true" class="easyui-dialog" style="padding:20px 50px"> <div id="btn_boardDel" align="right"> <a href="javascript:boardDel()" class="easyui-linkbutton" iconCls="icon-ok" style="width:90px">확인</a> <a href="javascript:boardDelClose()" class="easyui-linkbutton" iconCls="icon-cancel" style="width:90px">닫기</a> </div> </div> <!-- 글삭제 끝 --> <!-- 글수정 시작 --> <div id="d_boardUpd" closed="true" class="easyui-dialog" style="padding:20px 50px"> <form id="uf_board" method="get"> <!-- <form id="uf_board" method="post" enctype="multipart/form-data"> --> <input type="hidden" id="bm_no" name="bm_no" value="<%=bm_no %>"> <input type="hidden" id="bs_seq" name="bs_seq" value="<%=1 %>"> <input type="hidden" id="old_file" name="old_file" value="이전파일명"> <table align="center" width="650px" height="280px"> <tr> <td width="120px">글제목</td> <td width="580px"> <input id="bm_title" value="<%=bm_title %>" name="bm_title" class="easyui-textbox"> </td> </tr> <tr> <td width="120px">작성자</td> <td width="580px"> <input id="bm_writer" value="<%=bm_writer %>" name="bm_writer" class="easyui-textbox"> </td> </tr> <tr> <td width="120px">내용</td> <td width="580px"> <input id="bm_content" multiline="true" value="<%=bm_content %>" name="bm_content" class="easyui-textbox" style="width:100%;height:100px"> </td> </tr> <tr> <td width="120px">첨부파일</td> <td width="580px"> <input id="b_file" name="b_file" class="easyui-filebox" style="width:100%"> </td> </tr> <tr> <td width="120px">비번</td> <td width="580px"> <input id="bm_pw" name="bm_pw" class="easyui-textbox" style="width:100px"> </td> </tr> </table> </form> <div id="btn_boardUpd" align="right"> <a href="javascript:boardUpd()" class="easyui-linkbutton" iconCls="icon-ok" style="width:90px">등록</a> <a href="javascript:boardUpdClose()" class="easyui-linkbutton" iconCls="icon-cancel" style="width:90px">닫기</a> </div> </div> <!-- 글수정 끝 --> <!-- 댓글쓰기 시작 --> <!--================== [[댓글쓰기 화면]] ==================--> <div id="dlg_boardAdd" title="댓글쓰기" class="easyui-dialog" style="width:600px;height:400px;padding:10px" data-options="closed:'true',modal:'true',footer:'#tbar_boardAdd'"> <!-- form전송시 encType옵션이 추가되면 request객체로 사용자가 입력한 값을 꺼낼 수 없다. MultipartRequest => cos.jar --> <!-- <form id="f_boardAdd" method="post" enctype="multipart/form-data"> --> <form id="f_boardAdd" method="get"> <input type="hidden" name="bm_no" value="<%=bm_no%>"> <input type="hidden" name="bm_group" value="<%=bm_group%>"> <input type="hidden" name="bm_pos" value="<%=bm_pos%>"> <input type="hidden" name="bm_step" value="<%=bm_step%>"> <!-- <form id="f_boardAdd"> --> <table> <tr> <td width="100px">제목</td> <td width="500px"> <input class="easyui-textbox" data-options="width:'350px'" id="bm_title" name="bm_title" required> </td> </tr> <tr> <td width="100px">작성자</td> <td width="500px"> <input class="easyui-textbox" data-options="width:'150px'" id="bm_writer" name="bm_writer" required> </td> </tr> <tr> <td width="100px">내용</td> <td width="500px"> <input class="easyui-textbox" id="bm_content" name="bm_content" data-options="multiline:'true',width:'400px',height:'90px'" required> </td> </tr> <tr> <td width="100px">비번</td> <td width="500px"> <input class="easyui-textbox" data-options="width:'100px'" id="bm_pw" name="bm_pw" required> </td> </tr> </table> </form> </div> <!-- 입력 화면 버튼 추가 --> <div id="tbar_boardAdd" align="right"> <a href="javascript:addAction()" class="easyui-linkbutton" iconCls="icon-save">저장</a> <a href="javascript:$('#dlg_boardAdd').dialog('close')" class="easyui-linkbutton" iconCls="icon-cancel">닫기</a> </div> <!-- 댓글쓰기 끝 --> </body> </html>
<pojo step3 - boardDelForm.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ include file="../common/easyUI_common.jsp" %> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>글삭제</title> </head> <body> <div style="margin-bottom:20px"> <input id="u_pw" name="u_pw" class="easyui-textbox" label="비밀번호:" style="width:200px;height:25px"> </div> </body> </html>
foward 요청은 scope1으로 받고 응답은 move1으로 함
(scope1에 out.print한 출력결과는 볼 수 없다)

<scope예제 - Sonata.java>
package com.book.scope; public class Sonata { public int speed = 10; public String carName = "2023형 소나타"; public int wheelNum = 4; public Sonata() { // 전역변수 10, 2023형 소나타, 4 System.out.println("디폴트 생성자 - 파라미터가 없는 생성자"); } public Sonata(int speed) { // 전역변수 speed치환, 2023형 소나타, 4 this.speed = speed; } public Sonata(int speed, String carName) { // 전역변수 speed치환, carName치환, 4 this.speed = speed; this.carName = carName; } public Sonata(int speed, String carName, int wheelNum) { // 전역변수 speed치환, carName치환, wheelNum this.speed = speed; this.carName = carName; this.wheelNum = wheelNum; } }
<scope예제 - scope1.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <!-- id는 인스턴스 변수로 생각해야함 --> <jsp:useBean id="myCar" scope="request" class="com.book.scope.Sonata" /> <jsp:useBean id="herCar" scope="page" class="com.book.scope.Sonata" /> <jsp:useBean id="yourCar" scope="session" class="com.book.scope.Sonata" /> <% // 위의 id와 같은 이름 사용불가 // 유지의 문제 -> request, session+cookie com.book.scope.Sonata himCar = new com.book.scope.Sonata(); // 별도 인스턴스화하면 scope를 가질 수 없음 out.print("<h3>"+myCar.toString()+"</h3>"); // request out.print("<h3>"+herCar.toString()+"</h3>"); // page out.print("<h3>"+yourCar.toString()+"</h3>"); // scope를 session으로하면 주소번지 바뀌지 않음 out.print("<h3>"+himCar.toString()+"</h3>"); request.setAttribute("myCar", myCar); pageContext.setAttribute("herCar", herCar); session.setAttribute("yourCar", yourCar); %> <jsp:forward page="./move1.jsp"> <jsp:param name="oMyCar" value="<%=myCar.toString() %>" /> <jsp:param name="oHerCar" value="<%=herCar.toString() %>" /> <jsp:param name="oYourCar" value="<%=yourCar.toString() %>" /> </jsp:forward> </body> </html>
<scope예제 - move1.jsp>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="com.book.scope.Sonata" %> <% // getAttribute는 Object Sonata myCar = (Sonata)request.getAttribute("myCar"); Sonata herCar = (Sonata)pageContext.getAttribute("herCar"); Sonata yourCar = (Sonata)session.getAttribute("yourCar"); // getParameter는 String String oMyCar = request.getParameter("oMyCar"); String oHerCar = request.getParameter("oHerCar"); String oYourCar = request.getParameter("oYourCar"); out.print("scope1.jsp에서 생성된 객체가 유지되는가?"); out.print("<hr>"); out.print(myCar); // request -> 주소번지가 계속 바뀜(주소번지 원본) out.print("<br>"); out.print(oMyCar); // 그냥 문자열 out.print("<br>"); //out.print(oMyCar.carName); // 문자열이기에 주소번지 필요한 carName사용불가 out.print(oMyCar.concat("1")+"자동차".concat("1")); out.print("<br>"); out.print(oMyCar.indexOf(3)+"소나타".concat("1")); out.print("<br>"); out.print(oMyCar.charAt(2)+new Boolean(true).toString()); out.print("<hr>"); out.print(herCar); // page -> url바뀌면 유지되지 않음 out.print("<br>"); out.print(oHerCar); out.print("<hr>"); out.print(yourCar); // session -> 주소번지 고정 out.print("<br>"); out.print(oYourCar); %>
<jdbc 테스트 - JDBCTemplate.java>
package com.util; import java.io.*; import java.sql.*; import java.util.Properties; public class JDBCTemplate { public JDBCTemplate() { } public static Connection getConnection() { Connection con = null; Properties prop = new Properties(); try { String currentPath = JDBCTemplate.class.getResource("./").getPath(); prop.load(new BufferedReader(new FileReader(currentPath + "driver.properties"))); Class.forName(prop.getProperty("driver")); con = DriverManager.getConnection(prop.getProperty("url"), prop.getProperty("user"), prop.getProperty("pwd")); } catch (Exception e) { e.printStackTrace(); } return con; } public static void close(Connection con) { try { if (con != null && !con.isClosed()) { con.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void close(Statement stmt) { try { if (stmt != null && !stmt.isClosed()) { stmt.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void close(ResultSet rset) { try { if (rset != null && !rset.isClosed()) { rset.close(); } } catch (SQLException e) { e.printStackTrace(); } } public static void commit(Connection con) { try { if (con != null && !con.isClosed()) { con.commit(); } } catch (SQLException e) { e.printStackTrace(); } } public static void rollback(Connection con) { try { if (con != null && !con.isClosed()) { con.rollback(); } } catch (SQLException e) { e.printStackTrace(); } } public static void main(String args[]) { Connection con = getConnection(); System.out.println(con); } }
'국비학원 > 수업기록' 카테고리의 다른 글
국비 지원 개발자 과정_Day70 (1) | 2023.03.09 |
---|---|
국비 지원 개발자 과정_Day69 (1) | 2023.03.08 |
국비 지원 개발자 과정_Day67 (0) | 2023.03.06 |
국비 지원 개발자 과정_Day66 (0) | 2023.03.03 |
국비 지원 개발자 과정_Day65 (0) | 2023.03.02 |
댓글