20211202掲示板投稿詳細ページ


・掲示板進行中


-教授
"게시판에 대한 부분을 완벽하게 이해하고 구축할 수 있다면, 그 사람은 현업에 가도 손색이 없어요" 
はい.
そして最近私は上の話に共感しています.昨日、2回インラインビューのSELECTを使って3つの検索を行い、非常に多くのページを構成し、うっとりさせました.
そして今日も同じです.大きな枠組みから見ると、理解はできるものの、少し詳しくさえあれば、知らないことがたくさんあります.だからコードをたくさん見たようです.

・インタフェースの作成


-インタフェースを作成しました.なぜなら、投稿の露出数と表示するページ数を定数化する必要があるからです.
public interface BoardFileConfig {
	//페이지에 노출될 게시물 수
	public static final int LIST_COUNT = 2;
	
	//페이징 수
	public static final int PAGE_COUNT = 2;
	
	//원래는 파일 업로드에 대한 것도 넣어야 하지만 오늘은 제외
	
}
-ページングの共通モジュールにも適用されます.内部から見ると,投稿の数を取得し,それぞれページング処理を行うのはかなり複雑である.だから少し時間をかけて理解しました.リストページにページングオブジェクトを作成し、昨日行われなかった部分をいくつか行います.
//페이징 객체 생성
Paging paging = null;

if(totalCount > 0 )
	{
		//검색 결과가 하나 이상 있음.
		//여기가 페이징 처리 추가할 곳
		//매개변수로 경로, 총게시물 수, 노출게시물 수, 페이징 수, 현재 페이지, 현해페이지의 변수 명, 여기서 매개변수를 넘긴다는 것은
		//생성자에 값을 넣어서 전달한다는 뜻임.
		paging = new Paging("/board/list.jsp", totalCount, BoardFileConfig.LIST_COUNT, BoardFileConfig.PAGE_COUNT, curPage, "curPage");
		
		//속성과 값이 짝꿍으로 매개변수로 넘겨야 함
		paging.addParam("searchType", searchType);
		paging.addParam("searchValue", searchValue);
		
		//paging에 이미 startRow가 세팅됨. 위에서
		search.setStartRow(paging.getStartRow());
		search.setEndRow(paging.getEndRow());
		
		
		list = boardDao.boardList(search);
		
	}
-昨日リストにBoardList(検索)メソッドを入れた結果、RUMの値が確定しなかったため、クエリ部にコメント処理を行った.ただし、ページングオブジェクトの作成時に渡されるコンストラクション関数の値により、startRowとendRow、さらには開始ページと最終ページが計算されます.したがって、これらの値をオブジェクトを検索する変数に設定し、正しいクエリーを行うと、任意の数の投稿を表示できます.
	$(document).ready(function(){	
		$("#btnWrite").on("click", function(){
			document.bbsForm.bbsSeq.value = "";
			//해당 페이지로 간다는 뜻.
			document.bbsForm.action = "/board/write.jsp";
			document.bbsForm.submit();
		});	
		
		   $("#btnSearch").on("click", function(){
			      document.bbsForm.bbsSeq.value = "";
			      document.bbsForm.searchType.value = $("#_searchType").val();
			      document.bbsForm.searchValue.value = $("#_searchValue").val();
			      document.bbsForm.curPage.value = "1";
			      document.bbsForm.action = "/board/list.jsp";
			      document.bbsForm.submit();
			   });

	});
	
	//다음 페이지 누르면 보내는 함수
	//현재 페이지를 매개변수로 받음
	function fn_list(curPage)
	{
		//bbsSeq는 그냥 ""처리 해주면 됨.
		document.bbsForm.bbsSeq.value = "";
		//매개변수로 받은 curPage를 넣어줌
		document.bbsForm.curPage.value = curPage;
		document.bbsForm.action = "/board/list.jsp";
		document.bbsForm.submit();
	}
	
	function fn_view(bbsSeq)
	{
		document.bbsForm.bbsSeq.value = bbsSeq;
		document.bbsForm.action = "/board/view.jsp";
		document.bbsForm.submit();
	}
-スクリプトセクションでは、jQueryを使用してボタンごとに機能を作成します.
<%
	if(paging != null)
	{	
		//페이징 블럭에 대한 처리
		if(paging.getPrevBlockPage() > 0)
		{
%>
			<li class="page-item"><a class="page-link" href="javascript:void(0)" onclick="fn_list(<%= paging.getPrevBlockPage()%>)">이전블럭</a></li>
			
<%
		}	
		
		//현재 페이지와 curPage가 같으면 클릭할 수 없게 만들기.
		long i;
		//5개씩 게시물이면, 페이지의 갯수를 계산하여 나타내기 위한 반복문
		for(i = paging.getStartPage(); i<= paging.getEndPage(); i++)
		{
			if(paging.getCurPage() != i)
			{
				//현재 페이지가 i와 같지 않으면		
%>
         		<li class="page-item"><a class="page-link" href="javascript:void(0)" onclick="fn_list(<%= i%>)"><%= i %></a></li>

<%
			}
			else
			{	
				//현재 페이지가 i와 같으면			
%>	
        		<li class="page-item active"><a class="page-link" href="javascript:void(0)" style="cursor:default;"><%= i %></a></li>		 	
<%
			}
		}
		
		if(paging.getNextBlockPage() > 0)
		{
			//다음 블럭에 대한 코드
%>
			<li class="page-item"><a class="page-link" href="javascript:void(0)" onclick="fn_list(<%= paging.getNextBlockPage()%>)">다음블럭</a></li>
<%		

		}	
	}
%>         
上記のセクションは、ページング処理に関するjspコードです.私が今いるページの数字はクリックできません.コードは、後ろにページを移動できるブロックがあれば、次のブロックが生成され、前にブロックがあれば、前のブロックが生成されます.

・詳細ページ


-投稿をクリックすると、詳細ページに移動し、投稿内容を表示するコードを作成します.もちろん、まず、その値を取得するクエリー文が作成されます.
public Board boardSelect(long bbsSeq) 
	{
		Board board = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("SELECT  ");
		sql.append("  		BBS_SEQ, ");
		sql.append("  		NVL(B.USER_ID, '') AS USER_ID, ");
		sql.append("  		NVL(B.USER_NAME, '') AS BBS_NAME, ");
		sql.append("  		NVL(B.USER_EMAIL, '') AS BBS_EMAIL, ");
		sql.append("  		NVL(A.BBS_PWD, '') AS BBS_PWD, ");
		sql.append("  		NVL(A.BBS_TITLE, '') AS BBS_TITLE, ");
		sql.append("      NVL(BBS_CONTENT, '') BBS_CONTENT, ");
		sql.append("  		NVL(A.BBS_READ_CNT, 0) AS BBS_READ_CNT, ");
		sql.append("  		NVL(TO_CHAR(A.REG_DATE, 'YYYY.MM.DD HH24:MI:SS'), '') AS REG_DATE ");
		sql.append(" FROM 		");
		sql.append("  		TBL_BOARD A, TBL_USER B ");
		sql.append(" WHERE 	A.BBS_SEQ = ? ");
		sql.append("  		AND A.USER_ID = B.USER_ID ");   
	    
	    try 
	    {
	    	
	    	conn = DBManager.getConnection();
	    	pstmt = conn.prepareStatement(sql.toString());
	    	
	    	pstmt.setLong(1, bbsSeq);
	    	
	    	rs = pstmt.executeQuery();
	    	
	    	if(rs.next()) 
	    	{
	    		board = new Board();
	    		
	    		board.setBbsSeq(rs.getLong("BBS_SEQ"));
	    		board.setUserId(rs.getString("USER_ID"));
	    		board.setBbsName(rs.getString("BBS_NAME"));
	    		board.setBbsEmail(rs.getString("BBS_EMAIL"));
	    		board.setBbsPwd(rs.getString("BBS_PWD"));
	    		board.setBbsTitle(rs.getString("BBS_TITLE"));
	    		board.setBbsContent(rs.getString("BBS_CONTENT"));
	    		board.setBbsReadCnt(rs.getInt("BBS_READ_CNT"));
	    		board.setRegDate(rs.getString("REG_DATE"));
	    	}
	    	
	    }
	    catch(SQLException e) 
	    {
	    	logger.error("[BoardDao] boardSelect SQLException", e);
	    }
	    finally 
	    {
	    	DBManager.close(rs, pstmt, conn);
	    }
	    
		return board;
	}
-投稿の1つのみを表示するため、boardオブジェクトを1つ受信するだけでアクセスするには、投稿をクリックします.ここでWHERE節の条件は非常に重要であり,もたらす値は1つである.IDが同じくらい速いかどうかを確認するために一つ持ってきますDRIVINGテーブルは標準テーブルで、標準テーブルは結合を行う際に、良い条件を満たすだけで、処理速度が速くなります.今はあまりデータがありませんが、これからは本当に膨大なデータに直面することができます.BBS SEQはPKまであるのでインデックスもあるので、先にBBS SEQを見つければインデックスでテーブルをフルスキャンする必要はありません.
//게시물 조회 시 조회수 증가
	public int boardReadCntPlus(long bbsSeq) 
	{
		int count = 0;
		Connection conn = null;
		PreparedStatement pstmt = null;
		StringBuilder sql = new StringBuilder();
		
		sql.append("UPDATE TBL_BOARD ");
		sql.append(" SET ");
		sql.append(" 		BBS_READ_CNT = BBS_READ_CNT + 1  ");
		sql.append(" WHERE ");
		sql.append(" 		BBS_SEQ = ? ");
	
		try 
		{
			conn = DBManager.getConnection();
			pstmt = conn.prepareStatement(sql.toString());
			
			pstmt.setLong(1, bbsSeq);
			
			count = pstmt.executeUpdate();
		}
		catch(SQLException e) 
	    {
	    	logger.error("[BoardDao] boardReadCntPlus SQLException", e);
	    }
	    finally 
	    {
	    	DBManager.close(pstmt, conn);
	    }
		
		return count;
	}
-ちなみに、投稿を照会する際に、BBS READ CNT値が上昇した照会も記入しています.
	//0은 없는 페이지를 보여준다는 뜻
	long bbsSeq = HttpUtil.get(request, "bbsSeq", (long)0);
	String searchType = HttpUtil.get(request, "searchType", "");
	String searchValue = HttpUtil.get(request, "searchValue", "");
	long curPage = HttpUtil.get(request, "curPage", (long)1);
	
	//쿼리를 실행하기 위해서 보드 보드다오 객체 생성
	BoardDao boardDao = new BoardDao();
	Board board = boardDao.boardSelect(bbsSeq);
	
	if(board != null)
	{
		//데이터가 존재하면
		//조회수 증가
		//따로 결과를 받아서 처리할 것이 없음.
		boardDao.boardReadCntPlus(bbsSeq);
		
	}
-クエリの結果がnullでない場合、クエリの数を増やすクエリも実行されます.
<script>
	$(document).ready(function(){
<% 
		if(board == null)
		{
			//보드객체가 비어있는 경우, 오류창 띄우고 돌려보냄.
%>
			alert("조회하신 게시물이 존재하지 않습니다.");
			document.bbsForm.action = "/board/list.jsp";
			document.bbsForm.submit();
<% 
		}
		else
		{	
			//데이터가 존재할 때에 대한 처리
%>
			
<%			
		}
%>

	});
</script>
jQuery部分に存在するデータと存在しないデータを処理する.その後、各値を対応するボード上のsetterでhtmlに表示するだけでよい.問題は、<>の特殊記号などを処理する必要があり、特にhtmlの企業やコンテンツに直接影響を及ぼす可能性があるということである.だから汎用モジュールでこの問題を解決しました.
また、Cookie IDをもらいました.もし私が今使っているIDが投稿者のIDであれば、その投稿を修正したり削除したりするボタンが表示されます.そうでなければ、私はコードを書いて、修正削除ボタンを完全に消してしまいます.
String cookieUserId = CookieUtil.getValue(request, "USER_ID");
	logger.debug("view.jsp CookieUserID: " + cookieUserId);
    
<% 
	if(StringUtil.equals(cookieUserId, board.getUserId()))
	{
%>
   <button type="button" id="btnUpdate" class="btn btn-secondary">수정</button>
   <button type="button" id="btnDelete" class="btn btn-secondary">삭제</button>
<%
	}
%>

・整理したときに書いた内容を見ると・・・


-何でもないと思います.しかし実際に行うと多くのエラーが発生し、論理が理解しにくいため、jspファイルが新たに生成され、実際にはすべて書き続け、読まずに書くなど、多くの練習が行われています.もちろん、やはり難しいところがたくさんあります.汎用モジュールも非常に多くなっているので、真剣に見ていますが、まだ残っていて難しすぎます.コードされた人にモジュールを書かせるのではなく、それを深く認識させた.月曜日から木曜日まで、非睡眠なしでレッスンに参加しましたが・・・そして明日は本当に家で授業をするつもりです.でも….家にいると本当に集中しにくいと思います.最近またコロナが激しくなってきて、本当に不安でしたが、仕方なく…頑張りましょう.私は開発者になります.方向を変えましたが、本当に楽しくやりました.だから私たちはもっと努力しなければなりません!!いいですよ.