환경

windows10

 

목차

1. nodejs  설치

2. yarn 설치

3. vscode 설치 + 플러그인 설치

4. 원하는 디렉토리에서 git으로 리액트 예제파일 다운로드

 

nodejs  설치

 

아래 링크로 가서 윈도우 버전을 다운로드 받자

https://nodejs.org/ko/download/

 

다운로드 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

 

 

 

다운로드 받고나서 설치

 

 

yarn 설치

npm은 nodejs의 패키지를 관리해주는 도구로 nodejs설치할 때 기본으로 설치된다고 한다.

yarn은 npm을 대체할 수 있는 도구로 npm보다 더 빠르며 효율적인 캐시 시스템과 기타 부가 기능을 제공.

 

아래 링크에서 다운로드 하자

https://classic.yarnpkg.com/en/docs

 

Yarn

Fast, reliable, and secure dependency management.

classic.yarnpkg.com

 

 

Getting Started

 

 

스태이블 버전을 다운로드 하자

 

 

 

 

vscode 설치 + 플러그인 설치

 

https://code.visualstudio.com/

 

Visual Studio Code - Code Editing. Redefined

Visual Studio Code is a code editor redefined and optimized for building and debugging modern web and cloud applications.  Visual Studio Code is free and available on your favorite platform - Linux, macOS, and Windows.

code.visualstudio.com

 

 

 

 

아래의 플러그인을 설치한다

 

1. ESLint: 자바스크립트 문법 및 코드 스타일을 검사

 

2. Reactjs Code Snippets: 리액트 컴포넌트 및 라이프사이클 함수를 작성할 때 단축 단어를 사용하여 간편하게 코드를 자동으로 생성해 낼 수 있는 코드 스니펫 모음.
검색했을 때 유사한 결과가 여러 개 나올 수 있으니 제작자가 charalampos karypidis인 것을 설치.

 

3. Prettier-Code formatter: 코드 스타일을 자동으로 정리해 주는 도구.

 

 

 

원하는 디렉토리에서 git으로 리액트 예제파일 다운로드

 

예제파일을 받아보자

 

yarn create react-app hello-react

 

엔터를 치면 주르륵 깔린다

 

결과

 

해당폴더에 리액트 예제가 깔렸다

 

vscode에서 열어보자(폴더는 hello-react를 선택하자)

 

vscode에서 터미널을 켜자

 

yarn이 안될 경우 아래를 따라해보고 그래도 안되면 기본 터미널을 git bash로 바꿔보자

stackoverflow.com/questions/43313178/react-native-error-yarn-is-not-recognized-as-an-internal-or-external-command

 

React Native Error - yarn' is not recognized as an internal or external command

I am not able to run the sample react Native AwesomeProject project. Can anyone help? Below is the details. C:\Users\dip\AwesomeProject>react-native run-android 'yarn' is not recognized as an

stackoverflow.com

 

yarn start 입력

 

인터넷 창이 뜨며 해당 화면이 출력되면 성공

 

 

jsp

정처기

리액트

자바스크립트

제이쿼리

플렉스 그리드

'낙서장' 카테고리의 다른 글

웹에디터 ckeditor  (0) 2020.06.16
vsCode 저장시 자동으로 코드정렬  (0) 2020.06.15
vsCode 저장시 자동 정렬되게 하기  (0) 2020.06.13
200612  (0) 2020.06.12
면접  (0) 2020.06.10

 

'낙서장' 카테고리의 다른 글

vsCode 저장시 자동으로 코드정렬  (0) 2020.06.15
공부할거  (0) 2020.06.13
200612  (0) 2020.06.12
면접  (0) 2020.06.10
자바스크립트 새로 가져오기  (0) 2020.06.10

 

전달 가능 방식

get방식 - key:value

post, put, delete방식 - key:value + 텍스트 + json + 영상 이미지 등 byte + 등등등

--------------------------

get방식은 getParameter로 값을 받을 수 있고 버퍼로 받지 못한다

post방식처럼 body에 값을 넣어서 전달하는 경우
getParameter로 값을 받을 수 있고 버퍼로도 받을 수 있다

------------------------------

 

'Web > Jsp' 카테고리의 다른 글

product 페이지 예제 만들기  (0) 2020.06.15
블로그 댓글 지우기  (0) 2020.06.15
블로그 댓글쓰기  (0) 2020.06.12
블로그 댓글보기  (0) 2020.06.12
사진 업로드  (0) 2020.06.11

 

detail.jsp

더보기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@include file="../include/nav.jsp"%>

<div class="container">

	<button type="button" class="btn btn-light" onclick="back(${param.page})">뒤로가기</button>

	<c:if test="${sessionScope.principal.id == detailDto.boardDto.board.userId}">

		<a href="/blog/board?cmd=update&id=${detailDto.boardDto.board.id}" class="btn btn-warning">수정</a>
		<!-- 하이퍼링크는 get방식만 사용 -->
		<button type="button" class="btn btn-danger" onclick="deleteById(${detailDto.boardDto.board.id})">삭제</button>

	</c:if>


	<br /> <br />


	<h6>
		작성자 : <i>${detailDto.boardDto.username}</i> 조회수 : <i>${detailDto.boardDto.board.readCount}</i>
	</h6>

	<br />

	<h3>${detailDto.boardDto.board.title}</h3>

	<div class="container p-3 my-3 border">${detailDto.boardDto.board.content}</div>

	<hr />
	<!-- 댓글 박스 -->
	<div class="row bootstrap snippets">
		<div class="col-md-12">
			<div class="comment-wrapper">
				<div class="panel panel-info">
					<div class="panel-heading m-2">
						<b>Comment</b>
					</div>
					<div class="panel-body">
						<textarea id="reply__write__form" class="form-control" placeholder="write a comment..." rows="3"></textarea>
						<br>
						<button onclick="replyWrite(${detailDto.boardDto.board.id}, ${sessionScope.principal.id})" type="button" class="btn btn-primary pull-right">댓글쓰기</button>
						<div class="clearfix"></div>
						<hr />
						<!-- 댓글 리스트 시작-->
						<ul id="reply__list" class="media-list">

							<c:forEach var="replyDto" items="${detailDto.replyDtos}">
								<!-- 댓글 아이템 -->
								<li class="media"><img onerror="this.src='/blog/image/userProfile.png'" src="${replyDto.userProfile}" alt="" class="img-circle">
									<div class="media-body">
										<strong class="text-primary">${replyDto.username}</strong>
										<p>
											${replyDto.reply.content} <br /> <br />
										</p>
									</div></li>
							</c:forEach>
						</ul>
						<!-- 댓글 리스트 끝-->
					</div>
				</div>
			</div>

		</div>
	</div>
	<!-- 댓글 박스 끝 -->

</div>

<script>

	function replyWrite(boardId, userId) {
		var data = {
			boardId : boardId,  // 키값은 변수가 안 들어가서 문제 없다
			userId : userId,
			content : $("#reply__write__form").val()
		}
		
		$.ajax({
			
			type: "post",
			url: "/blog/reply?cmd=writeProc",
			data : JSON.stringify(data),
			contentType : "application/json; charset=utf-8",
			dataType: "json"
			
		}).done(function (result) {
			
			$("#reply__list").empty();
			
			// 정상 응답
			// 1. reply__list를 찾아서 내부를 비우기
			// 2. ajax 재호출 findAll()
			// 3. reply__list를 찾아서 내부에 채워주기

			for (var replyDto of result) {
				
				var string = "<li class=\"media\"><img onerror=\"this.src='/blog/image/userProfile.png'\" src=\""+replyDto.userProfile+"\" alt=\"\" class=\"img-circle\">\r\n" + 
				"					<div class=\"media-body\">\r\n" + 
				"					<strong class=\"text-primary\">"+replyDto.username+"</strong>\r\n" + 
				"					<p>\r\n" + 
				"						"+replyDto.reply.content+" <br /> <br />\r\n" + 
				"					</p>\r\n" + 
				"				</div></li>";
				  
				$('#reply__list').append(string);
			
			}
			
// 		    result.forEach(replyDto => {
	    	
//				var string = "<li class=\"media\"><img onerror=\"this.src='/blog/image/userProfile.png'\" src=\""+replyDto.userProfile+"\" alt=\"\" class=\"img-circle\">\r\n" + 
//				"					<div class=\"media-body\">\r\n" + 
//				"					<strong class=\"text-primary\">"+replyDto.username+"</strong>\r\n" + 
//				"					<p>\r\n" + 
//				"						"+replyDto.reply.content+" <br /> <br />\r\n" + 
//				"					</p>\r\n" + 
//				"				</div></li>";
			  
//			$('#reply__list').append(string);
	        
//		    });
			
		}).fail(function (result) {
			
		});
		
		
// 		$.ajax({
// 			type: "post",
// 			url: "/~~/~",
// 			success: function name() {}, 
// 			error : function name() {}
// 		});
		
	}
</script>

<script src="/blog/js/detail.js"></script>

<%@include file="../include/footer.jsp"%>


 

자바스크립트에 replyWrite함수를 만들어 준다

 

boardId와 userId를 매개변수로 받아서 ajax로 통신하여 값(댓글배열)을 받아온다.

결과가 정상이면 댓글들을 모두 지우고

댓글배열을 통해 다시 댓글들을 생성해준다.

 

 

ReplyController

더보기
package com.cos.blog.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cos.blog.action.Action;
import com.cos.blog.action.reply.ReplyWriteProcAction;


@WebServlet("/reply")
public class ReplyController extends HttpServlet {
	private final static String TAG = "ReplyController : ";
	private static final long serialVersionUID = 1L;
       
    public ReplyController() {
        super();
    }
    

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doProcess(request, response);
	}
	
	protected void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// http://localhost:8000/blog/user?cmd=join
		String cmd = request.getParameter("cmd");
		System.out.println(TAG+"router : "+cmd);
		Action action = router(cmd);
		action.execute(request, response);
	}
	
	public Action router(String cmd) {
		if(cmd.equals("writeProc")) {
			return new ReplyWriteProcAction();
		}
		return null;
	}
	

}

 

 

 

ReplyWriteProcAction

더보기
package com.cos.blog.action.reply;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cos.blog.action.Action;
import com.cos.blog.dto.ReplyResponseDto;
import com.cos.blog.model.Reply;
import com.cos.blog.repository.ReplyRepository;
import com.cos.blog.util.Script;
import com.google.gson.Gson;

public class ReplyWriteProcAction implements Action{

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		BufferedReader br = request.getReader();
		StringBuffer sb = new StringBuffer();
		String input = null;
		
		while ((input = br.readLine()) != null) {
			sb.append(input);
		}
		
		System.out.println(sb.toString());
		
		Gson gson = new Gson();
		Reply reply = gson.fromJson(sb.toString(), Reply.class);
		
		ReplyRepository replyRepository = ReplyRepository.getInstance();
		
		int result = replyRepository.save(reply);
		
//		Script.outText(Integer.toString(result), response);
		if(result == 1) {
			List<ReplyResponseDto> replyDtos = replyRepository.findAll(reply.getBoardId());
			
			Script.outJson(gson.toJson(replyDtos), response);
			
		} else {
			Script.back("댓글 달기에 실패하였습니다", response);
		}
		
		// ReplyRepository 연결 - save(reply)
		// save 성공하면 1, 실패하면 0, -1
		// Script.outText() 응답
		
	}

}

 

스트링빌더나 스트링버퍼를 사용하여 ajax에서 온 데이터를 조합한다

 

gson으로 json데이터를 자바객체로 만든다

 

데이터베이스에 댓글을 저장하고 결과값을 리턴받는다

 

결과값이 성공이면 댓글들을 새로받아와서 json으로 만든 뒤 ajax에게 돌려보내준다

 

 

ReplyRepository.java

더보기
package com.cos.blog.repository;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.cos.blog.db.DBConn;
import com.cos.blog.dto.ReplyResponseDto;
import com.cos.blog.model.Board;
import com.cos.blog.model.Reply;
import com.cos.blog.model.Users;

public class ReplyRepository {
	private static final String TAG = "ReplyRepository : "; // TAG 생성 (오류 발견시 용이)
	private static ReplyRepository instance = new ReplyRepository();

	private ReplyRepository() {
	}

	public static ReplyRepository getInstance() {
		return instance;
	}

	private Connection conn = null;
	private PreparedStatement pstmt = null;
	private ResultSet rs = null;

	// 글쓰기
	public int save(Reply reply) { // object 받기(안에 내용 다 받아야 하니까)
		final String SQL = "INSERT INTO reply(id, userid, boardid, content, createDate) "
				+ "VALUES(REPLY_SEQ.nextval,?,?,?,sysdate)";
		try {
			conn = DBConn.getConnection(); // DB에 연결
			pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, reply.getUserId());
			pstmt.setInt(2, reply.getBoardId());
			pstmt.setString(3, reply.getContent());
			// 물음표 완성하기
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(TAG + "save : " + e.getMessage());
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		return -1; // 실패시
	}

	// 회원정보 수정
	public int update(Board board) { // object 받기(안에 내용 다 받아야 하니까)
		final String SQL = "";
		try {
			conn = DBConn.getConnection(); // DB에 연결
			pstmt = conn.prepareStatement(SQL);
			// 물음표 완성하기
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(TAG + "Update : " + e.getMessage());
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		return -1; // 실패시
	}

	
	// 회원정보 삭제
	public int deleteById(int id) { // object 받기(안에 내용 다 받아야 하니까)
		final String SQL = "";
		try {
			conn = DBConn.getConnection(); // DB에 연결
			pstmt = conn.prepareStatement(SQL);
			// 물음표 완성하기
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(TAG + "Delete : " + e.getMessage());
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		return -1; // 실패시
	}

	
	public List<ReplyResponseDto> findAll(int boardId) {

		StringBuffer sb = new StringBuffer();
		sb.append("SELECT r.id, r.userid, r.boardId, r.content, r.createDate, u.username, u.userProfile ");
		sb.append("FROM reply r INNER JOIN users u ");
		sb.append("ON r.userid = u.id ");
		sb.append("WHERE boardId = ? ");
		sb.append("ORDER BY r.id DESC ");

		final String SQL = sb.toString();
		List<ReplyResponseDto> replyDtos = new ArrayList<>();

		try {
			conn = DBConn.getConnection();
			pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, boardId);
			rs = pstmt.executeQuery();

			while (rs.next()) {

				Reply reply = Reply.builder()
						.id(rs.getInt(1))
						.userId(rs.getInt(2))
						.boardId(rs.getInt(3))
						.content(rs.getString(4))
						.createDate(rs.getTimestamp(5))
						.build();

				ReplyResponseDto replyDto = ReplyResponseDto.builder().reply(reply).username(rs.getString(6))
						.userProfile(rs.getString(7)).build();

				replyDtos.add(replyDto);

			}

			return replyDtos;
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(TAG + "findAll(boardId) : " + e.getMessage());
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		return null; // 실패시
	}
	

	// 회원정보 다 찾기
	public List<Reply> findAll() { // object 받기(안에 내용 다 받아야 하니까)
		final String SQL = "";
		List<Reply> replys = new ArrayList<>();
		try {
			conn = DBConn.getConnection(); // DB에 연결
			pstmt = conn.prepareStatement(SQL);
			// 물음표 완성하기

			// while 돌려서 rs -> java오브젝트에 집어넣기
			return replys;
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(TAG + "findAll : " + e.getMessage());
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		return null; // 실패시
	}

	// 회원정보 한 건 찾기
	public Reply findById(int id) { // object 받기(안에 내용 다 받아야 하니까)
		final String SQL = "";
		Reply reply = new Reply();
		try {
			conn = DBConn.getConnection(); // DB에 연결
			pstmt = conn.prepareStatement(SQL);
			// 물음표 완성하기

			// if 돌려서 rs -> java오브젝트에 집어넣기
			return reply;
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(TAG + "findById : " + e.getMessage());
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		return null; // 실패시
	}

}

 

댓글 저장

 

 

댓글 xss 공격 막기

 

 

결과

-

'Web > Jsp' 카테고리의 다른 글

블로그 댓글 지우기  (0) 2020.06.15
get / post 방식  (0) 2020.06.12
블로그 댓글보기  (0) 2020.06.12
사진 업로드  (0) 2020.06.11
자바스크립트 on 이벤트  (0) 2020.06.11

 

BoardResponseDto

DetailResponseDto를 Board로 바꾼다.( 재사용하기위해서 )

 

BoardRepository

더보기
	public BoardResponseDto findById(int id) { // object 받기(안에 내용 다 받아야 하니까)
		
		StringBuilder sb = new StringBuilder();
		sb.append("SELECT b.id, b.userid, b.title, b.content, b.readcount, b.createdate, u.username ");
		sb.append("FROM board b INNER JOIN users u ");
		sb.append("ON b.userId = u.id ");
		sb.append("AND b.id = ?");
		
		final String SQL = sb.toString();
		BoardResponseDto boardDto = null;
		
		try {
			conn = DBConn.getConnection(); // DB에 연결
			pstmt = conn.prepareStatement(SQL);
			// 물음표 완성하기
			pstmt.setInt(1, id);
			
			rs = pstmt.executeQuery();
			
			// if 돌려서 rs -> java오브젝트에 집어넣기
			if(rs.next()) {
				
				boardDto = new BoardResponseDto();	
				Board board = Board.builder()
						.id(rs.getInt(1))
						.userId(rs.getInt(2))
						.title(rs.getString(3))
						.content(rs.getString(4))
						.readCount(rs.getInt(5))
						.createDate(rs.getTimestamp(6))
						.build();
				boardDto.setBoard(board);
				boardDto.setUsername(rs.getString(7));
				
			}
			
			return boardDto;
			
		} catch (SQLException e) {
			
			e.printStackTrace();
			System.out.println(TAG + "findById : " + e.getMessage());
			
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		
		return null; // 실패시
		
	}

 

BoardResponseDto로 바꾸었기 때문에 리포지토리의 리턴값도 바꾸어야한다.

 

 

ReplyResponseDto

댓글DTO생성

 

 

DetailResponseDto

board와 reply를 합쳐서 detail

 

 

데이터베이스

데이터베이스에서 쿼리문을 테스트해본다.

 

 

ReplyRepository

더보기
	public List<ReplyResponseDto> findAll(int boardId) {

		StringBuffer sb = new StringBuffer();
		sb.append("SELECT r.id, r.userid, r.boardId, r.content, r.createDate, u.username, u.userProfile ");
		sb.append("FROM reply r INNER JOIN users u ");
		sb.append("ON r.userid = u.id ");
		sb.append("WHERE boardId = ? ");
		sb.append("ORDER BY r.id DESC ");

		final String SQL = sb.toString();
		List<ReplyResponseDto> replyDtos = new ArrayList<>();

		try {
			conn = DBConn.getConnection();
			pstmt = conn.prepareStatement(SQL);
			pstmt.setInt(1, boardId);
			rs = pstmt.executeQuery();

			while (rs.next()) {

				Reply reply = Reply.builder()
						.id(rs.getInt(1))
						.userId(rs.getInt(2))
						.boardId(rs.getInt(3))
						.content(rs.getString(4))
						.createDate(rs.getTimestamp(5))
						.build();

				ReplyResponseDto replyDto = ReplyResponseDto.builder().reply(reply).username(rs.getString(6))
						.userProfile(rs.getString(7)).build();

				replyDtos.add(replyDto);

			}

			return replyDtos;
		} catch (SQLException e) {
			e.printStackTrace();
			System.out.println(TAG + "findAll(boardId) : " + e.getMessage());
		} finally {
			DBConn.close(conn, pstmt, rs);
		}
		return null; // 실패시
	}

 

findAll을 오버로딩하고, 스트링버퍼

 

 

BoardDetailAction

더보기
package com.cos.blog.action.board;

import java.io.IOException;
import java.util.HashSet;
import java.util.List;
import java.util.Vector;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import com.cos.blog.action.Action;
import com.cos.blog.dto.BoardResponseDto;
import com.cos.blog.dto.DetailResponseDto;
import com.cos.blog.dto.ReplyResponseDto;
import com.cos.blog.model.Board;
import com.cos.blog.repository.BoardRepository;
import com.cos.blog.repository.ReplyRepository;
import com.cos.blog.util.HtmlParser;
import com.cos.blog.util.Script;

public class BoardDetailAction implements Action {

	@Override
	public void execute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		if (request.getParameter("id") == null || request.getParameter("id").equals("")) {
			Script.back("잘못된 접근입니다.", response);
			return;
		}
		

		int boardId = Integer.parseInt(request.getParameter("id"));

		BoardRepository boardRepository = BoardRepository.getInstance();
		
		ReplyRepository replyRepository = ReplyRepository.getInstance();
		
		int result = 0;
		
		Cookie[] cookies = request.getCookies();
		int visitor = 0;
		
		
		
		for (Cookie cookie : cookies) {
			System.out.println(cookie.getName());
			if(cookie.getName().equals("visit")) {
				
				visitor = 1;
				
				
				if(cookie.getValue().contains(request.getParameter("id"))) {
					
					result = 1;
					
				} else {
					
					cookie.setValue(cookie.getValue()+ "_" + request.getParameter("id"));
					
					response.addCookie(cookie);
					
					result = boardRepository.readCountUp(boardId);
					
				} 
			}
		}
		
		if(visitor == 0) {
			Cookie cookie1 = new Cookie("visit", request.getParameter("id"));
			response.addCookie(cookie1);
			
			result = boardRepository.readCountUp(boardId);
		}
		
		
		
//		if(result != 1) {
//			Script.back("서버오류", response);
//			return;
//		}
		
		
//		Cookie cookie =
		
//		HttpSession session = request.getSession();
//		if(session.getAttribute("sameUser") == null || !session.getAttribute("sameUser").equals(request.getParameter("id"))) {
//			result = boardRepository.readCountUp(id);
//			session.setAttribute("sameUser", request.getParameter("id"));
//		}
		
		
		if(result == 1) {
			System.out.println("리절트1 ");
			BoardResponseDto boardDto = boardRepository.findById(boardId);
			List<ReplyResponseDto> replyDtos = replyRepository.findAll(boardId);
			
			
			DetailResponseDto detailDto = DetailResponseDto.builder()
					.boardDto(boardDto)
					.replyDtos(replyDtos)
					.build();
			
			if (detailDto != null) {
				
				String content = detailDto.getBoardDto().getBoard().getContent(); // DTO에서 컨텐츠 가져오기
				
				String doc = HtmlParser.youtubeParser(content); // 유튜브 링크가 있다면 아래에 영상 프레임 넣기
				
				detailDto.getBoardDto().getBoard().setContent(doc); // 바뀐 내용을 콘텐츠에 바꿔넣기
				
				request.setAttribute("detailDto", detailDto);

				RequestDispatcher dis = request.getRequestDispatcher("board/detail.jsp");
				dis.forward(request, response);
				
			} else {
				Script.back("잘못된 접근입니다.", response);
			}
		} else {
			Script.back("상세보기를 할 수 없습니다.", response);
		}
		
	}

}

 

리포지토리를 소환

 

데이터를 가져와서 객체에 저장

 

detailDto에 두 객체를 저장

 

기존의 dto를 detailDto로 모두 바꿔준다

 

 

detail.jsp

기존의 dto를 detailDto로 모두 바꿔준다

 

데이터베이스에 댓글을 임의로 넣고 테스트

 

결과

-

'Web > Jsp' 카테고리의 다른 글

get / post 방식  (0) 2020.06.12
블로그 댓글쓰기  (0) 2020.06.12
사진 업로드  (0) 2020.06.11
자바스크립트 on 이벤트  (0) 2020.06.11
multipart/form-data // HTML 파일업로드 MIME타입  (0) 2020.06.11

 

 

'낙서장' 카테고리의 다른 글

공부할거  (0) 2020.06.13
vsCode 저장시 자동 정렬되게 하기  (0) 2020.06.13
면접  (0) 2020.06.10
자바스크립트 새로 가져오기  (0) 2020.06.10
검색 기능 넣기  (0) 2020.06.10

+ Recent posts