내가 구현한 기능 소개(별구름 ‐ 만화, 카카오톡 테마) - KimByoungKoo/NewLightProject GitHub Wiki

📌별구름 페이지 - 만화, 카카오톡 테마

✔️ 별구름 페이지 - 만화, 카카오톡 테마 상세 보기 및 카테고리 별 페이지 진입

  • 로그인이 되어 있지 않다면, 상세 보기 페이지를 진입할 수 없다.

    회원이 올린 창작물에 대해 저작권을 보호하기 위해 진입할 수 없게 했다.

  • 창작물 상세보기 페이지 진입 시 User가 업로드한 창작물과 댓글이 함께 보여진다.

  • 카테고리 선택 별 페이지 진입이 달라진다.

💻Code

CreationsFrontController.java
public class CreationsFrontController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String target = req.getRequestURI().substring(req.getContextPath().length());
		
		switch(target) {

//		categoryCode별 진입 페이지
		case "/creations/pageListOk.ct" :
			new ThemeListOkController().execute(req, resp);
			break;

		//창작물 보기 처리	
		case "/creations/creationRead.ct" :
			new CreationReadOkController().execute(req, resp);
			break;
                }
        }
}
ThemeListOkController.java
public class ThemeListOkController implements Execute{
	
	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		CreationsVO creationsVO = new CreationsVO();
		CreationsDAO creationsDAO = new CreationsDAO();

		String path = "/app/creations/pageList/";
		String code = req.getParameter("categoryCode");
		String name = req.getParameter("categoryName");
		
		List<CreationsVO> creations = null;
		
		Map<String, String> cateMap = new HashMap<String, String>();
		cateMap.put("categoryCode", code);
		cateMap.put("categoryName", name);
		
		String title = code.equals("101") ? "별구름" : "별숲";
		title += " - "+name;
		
		creations = creationsDAO.selectMenu(cateMap);

		req.setAttribute("creations", creations);
		req.setAttribute("title", title);
				
		if(code.equals("101")) {
			switch(name) {
			case "손그림" : case "만화": case "폰트" :
				path += "pageList.jsp" ;
				break;
			case "배경화면" :
				path += "pageList2.jsp";
				break;
			case "카톡테마" :
				path += "pageList3.jsp";
				break;
			}
		}else {
			switch(name) {
			case "배경화면": case "트레이싱":
				path += "pageList2.jsp";
				break;
			case "카톡테마" :
				path += "pageList3.jsp";
				break;
			}
			
		}
		
		List<CreationsVO> creationsList = creationsDAO.selectMenu2(cateMap);
		System.out.println(creationsList);
		req.setAttribute("creationsList", creationsList);
				
		req.getRequestDispatcher(path).forward(req, resp);
		
	}

}
CreationReadOkController.java
public class CreationReadOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		int creationNumber = Integer.valueOf(req.getParameter("creationNumber"));

		CreationsDAO creationsDAO = new CreationsDAO();
		CreationsVO creationsVO = creationsDAO.creationContent(creationNumber);

	        CreationsFileDAO creationsFileDAO = new CreationsFileDAO();
		List<CreationsFileDTO> creationsFiles = creationsFileDAO.select(creationNumber);

                int creationComment = creationsDAO.creationComment(creationNumber);

                List<CreationsVO> commentList = creationsDAO.commentList(creationNumber);

                creationsVO.setFiles(creationsFiles);
		creationsVO.setCreationNumber(creationNumber);

                req.setAttribute("creation", creationsVO);
		req.setAttribute("creationComment", creationComment);
		req.setAttribute("commentList", commentList);

                List<CreationsFileDTO> files = creationsFileDAO.aniList(creationNumber);

                CreationsVO checkPath = creationsDAO.creationRead(creationNumber);
		String path = null;

		if(checkPath.getCategoryName().equals("만화")) {
			path = "/app/creations/creation/aniView.jsp";
		}else {
			path = "/app/creations/creation/creation.jsp";
		}
			
		req.getRequestDispatcher(path).forward(req, resp);
        }
}
CreationDAO.java
public class CreationsDAO {
	
	public SqlSession sqlSession;
	
	public CreationsDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}

//	테마별 파일조회해서 페이지에 뿌려주기
	public List<CreationsVO> selectMenu(Map<String, String> categoryMap){
		return sqlSession.selectList("creations.selectMenu", categoryMap);
	}

//	창작물 카테고리별로 뿌려주기
	public List<CreationsVO> selectMenu2 (Map<String, String> categoryMap){
		return sqlSession.selectList("creations.selectMenu2" , categoryMap);
	}

//	각 창작물 페이지 뿌려주기
	public CreationsVO creationContent(int creationNumber){
		return sqlSession.selectOne("creations.creationContent" , creationNumber);
	}

//	댓글 갯수 뿌려주기
	public int creationComment(int creationNumber) {
		return sqlSession.selectOne("creations.creationComment" , creationNumber);
	}

//	댓글 리스트 뿌려주기
	public List<CreationsVO> commentList(int creationNumber){
		return sqlSession.selectList("creations.commentList" , creationNumber);
	}

//	creationRead페이징 처리
	public CreationsVO creationRead(int creationNumber) {
		return sqlSession.selectOne("creations.creationRead", creationNumber);
	}

}
CreationsFileDAO.java
public class CreationsFileDAO {

	public SqlSession sqlSession;
	
	public CreationsFileDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}

	public List<CreationsFileDTO> select(int creationNumber){
		return sqlSession.selectList("creationsfile.select", creationNumber);
	}

//	만화 리스트 뿌려주기
	public List<CreationsFileDTO> aniList(int creationNumber) {
		return sqlSession.selectList("creationsfile.aniList", creationNumber);
	}
}
CreationsMapper.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="creations">

   <!-- 창작물 보기 -->
   <select id="creationContent" parameterType="_int" resultType="CreationsVO">
      select 
      c.creation_number, c.creation_title , c.creation_content , c.creation_writeday , c.category_name,
      c.creation_read_count , m.member_nickname , m.member_number , m.member_pfp
      from creations c join `member` m
      on c.member_number = m.member_number
      where c.creation_number = #{creationNumber}
   </select>

   <!-- 카테고리 테마별 창작물 조회하기 -->
   <select id="selectMenu2" resultType="CreationsVO" parameterType="map">
      		select count(cc.comment_number ) comment_count, j.* from (
			select count(l.member_number) like_count, m.member_nickname, m.member_pfp ,  c.* 
			from creations c join
			`member` m 
			on c.member_number = m.member_number
			left outer join likes l 
			on c.creation_number = l.creation_number
			where c.category_code = #{categoryCode} and c.category_name = #{categoryName}
			group by c.creation_number
			) j left outer join creations_comment cc 
			on j.creation_number = cc.creation_number 
			group by j.creation_number
			order by j.creation_number desc;
   </select>

   <!-- 창작물 댓글 갯수 -->
   <select id="creationComment" parameterType="_int" resultType="_int">
      select count(creation_number)
      from creations_comment cc
      where creation_number = #{creationNumber}
   </select>

   <!-- 창작물 댓글 리스트 -->
   <select id="commentList" parameterType="_int" resultType="CreationsVO">
      select cc.comment_number, cc.comment_content, cc.comment_writedate , cc.creation_number, m.member_nickname , m.member_number , m.member_pfp 
      from creations_comment cc join `member` m
      on cc.member_number = m.member_number
      where creation_number = #{creationNumber}
   </select>

  <!-- creationRead 페이징처리 -->
   <select id="creationRead" parameterType="_int" resultType="CreationsVO">
      select category_name from creations c 
      where creation_number = #{creationNumber}
   </select>

</mapper>
CreationsFileMapper.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="creationsfile">

	<select id="select" parameterType="_int" resultType="CreationsFileDTO">
		select file_system_name, file_original_name, creation_number
		from creations_file
		where creation_number = #{creationNumber}
	</select>

	<!-- 만화 리스트 뿌려주기 -->
	<select id="aniList" parameterType="_int" resultType="CreationsFileDTO">
		select file_system_name from creations_file cf 
		where creation_number = #{creationNumber}
	</select>

</mapper>

📷View

별구름 페이지 - 만화, 카카오톡 테마 상세 보기 및 카테고리 별 페이지 진입
newlight_별구름-만화 페이지 상세보기 진입01 newlight_별구름-만화 페이지 진입01 newlight_별구름-카톡테마 페이지 상세보기 진입01 newlight_별구름-카톡테마 페이지 진입01

✔️ 별구름 페이지 - 만화, 카카오톡 테마 글 작성하기

  • session 검사 후 로그인이 안되어 있을 경우 로그인 페이지로 이동,

    로그인이 되어 있다면 글 작성 페이지로 이동하여 창작물 업로드 페이지로 이동하여 글을 작성할 수 있다.

💻Code

CreationsFrontController.java
public class CreationsFrontController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String target = req.getRequestURI().substring(req.getContextPath().length());
       
       switch(target) {
   	case "/creations/CreationWrite.ct" :
	new CreationWriteOkController().execute(req,resp);
	break;

	case "/creations/CreationUploadOk.ct" :
	new CreationUploadOkController().execute(req, resp);
	break;
       }
    }

}	
CreationWriteController.java
public class CreationWriteOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		MemberDAO memberDAO = new MemberDAO();
		
		HttpSession session = req.getSession();
		
		Integer memberNumber = (Integer)session.getAttribute("memberNumber");
		
		String path = null;
		
		if(memberNumber == null) {
			path ="/member/login.me";
		} else {
			path = "/app/main/upload.jsp";
			req.setAttribute("memberNickname", memberDAO.getMemberNickName(memberNumber));
		}
		
		req.getRequestDispatcher(path).forward(req, resp);

	}

}
CreationUploadOkController.java
public class CreationUploadOkController implements Execute{
	
	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		CreationsDTO creationDTO = new CreationsDTO();
		CreationsDAO creationDAO = new CreationsDAO();
		CreationsFileDTO creationfileDTO = new CreationsFileDTO();
		CreationsFileDAO creationfileDAO = new CreationsFileDAO();

		int creationNumber = 0;
		boolean isFirst = true;
		String path = null;
		
		String uploadPath = req.getSession().getServletContext().getRealPath("/") + "upload/";
		int fileSize = 1024 * 1024 * 20;
		
		MultipartParser parser = new MultipartParser(req, fileSize);
		parser.setEncoding("UTF-8");
		
		while(true) {
			Part part = parser.readNextPart();
			
			if(part == null) {break;}
			String fileSystemName = null;
			String fileOriginalName = null;
			
			if(part.isFile()) {
				FilePart filePart = (FilePart)part;
				filePart.setRenamePolicy(new DefaultFileRenamePolicy());
				fileOriginalName = filePart.getFileName();
				
				if(fileOriginalName != null) {
					File file = new File(uploadPath, fileOriginalName);
					filePart.writeTo(file);
					fileSystemName = filePart.getFileName();
					
					creationfileDTO.setFileSystemName(fileSystemName);
					creationfileDTO.setFileOriginalName(fileOriginalName);
					creationfileDTO.setCreationNumber(creationNumber);
					creationfileDAO.insert(creationfileDTO);
					
					if(isFirst) {
						creationDAO.update(creationfileDTO);
						isFirst = false;
					}
				}
			}else {
				ParamPart paramPart = (ParamPart)part;
				String param = paramPart.getName();
				String value = paramPart.getStringValue();
				
				if(param.equals("creationTitle")) {
					creationDTO.setCreationTitle(value);
				}else if(param.equals("creationContent")) {
					creationDTO.setCreationContent(value);
				}else if(param.equals("category1")) {
					creationDTO.setCreationCode(value);
				}else if(param.equals("category2")) {
					creationDTO.setCreationName(value);
				}
				
				
				if(creationDTO.getCreationTitle() == null || creationDTO.getCreationContent() == null) {continue;}
				
				creationDTO.setMemberNumber((Integer)req.getSession().getAttribute("memberNumber"));
				creationDAO.insert(creationDTO);
				
				creationNumber = creationDAO.getSequence();
			}
			
		}
		
		if(creationDTO.getCreationCode().equals("101") && creationDTO.getCreationName().equals("만화")) {
			path = "/crations/aniListOk.ct";
		}else if(creationDTO.getCreationCode().equals("101") && creationDTO.getCreationName().equals("카카오톡 테마")) {
			path = "/creations/themeOneListOk.ct";
		}
		
		resp.sendRedirect("/main/mainpageListOk.mi");
	}
}
CreationFileDAO.java
public class CreationsFileDAO {

	public SqlSession sqlSession;
	
	public CreationsFileDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}
	
	public void insert(CreationsFileDTO creationDTO) {
		sqlSession.insert("creationsfile.insert", creationDTO);
	}
CreationsDAO.java
public class CreationsDAO {
	
	public SqlSession sqlSession;
	
	public CreationsDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}

	public void insert(CreationsDTO creationDTO) {
		sqlSession.insert("creations.insert", creationDTO);
	}

	public void update(CreationsFileDTO creationsFileDTO) {
		sqlSession.update("creations.update", creationsFileDTO);
	}
}
CreationsMapper.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="creations">

   <!-- 창작물 올리기 -->
   <insert id="insert" parameterType="CreationsDTO">
      insert into creations
      (creation_number, creation_title, creation_content, category_code,
      category_name,  member_number , creation_sumnail)
      values(#{creationNumber}, #{creationTitle}, #{creationContent},
      #{creationCode}, #{creationName}, #{memberNumber}
      , #{creationSumnail})
   </insert>

   <update id="update" parameterType="CreationsFileDTO">
      update creations
      set creation_sumnail = #{fileSystemName}
      where creation_number = #{creationNumber}
   </update>

</mapper>
CreationsFileMapper.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="creationsfile">

	<insert id="insert" parameterType="CreationsFileDTO">
		insert into creations_file
		(file_system_name, file_original_name, creation_number)
		values(#{fileSystemName}, #{fileOriginalName}, #{creationNumber})
	</insert>

</mapper>

📷View

  • 창작물 업로드 작성 페이지 양식은 모두 같다. 어느 카테고리에 글을 작성할 것인지 선택하고 글 작성 하면 된다.
별구름 페이지 - 만화, 카카오톡 테마 글 작성하기
newlight_별구름 - 만화, 카카오톡 테마 글 작성01 newlight_별구름 - 만화, 카카오톡 테마 글 작성02 newlight_별구름 - 만화, 카카오톡 테마 글 작성03 newlight_별구름 - 만화, 카카오톡 테마 글 작성04 newlight_별구름 - 만화, 카카오톡 테마 글 작성05

✔️ 별구름 페이지 - 만화, 카카오톡 테마 작성된 글 수정 및 삭제

  • session 검사 후 session의 값과 글 작성자 DB의 값이 일치하면 수정 및 삭제 기능을 이용할 수 있다.
  • session이 글 작성자 DB의 값과 일치하지 않을 경우 수정 및 삭제 버튼은 활성화 되지 않고 목록 버튼만 활성화 된다.

💻Code

CreationsFrontController.java
public class CreationsFrontController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String target = req.getRequestURI().substring(req.getContextPath().length());

        switch(target) {

	 //창작물 수정 처리
	 case "/creations/creationUpdate.ct" :
	 new CreationUpdateController().execute(req, resp);
	 break;

	case "/creations/creationUpdateOk.ct" :
	new CreationUpdateOkController().execute(req, resp);
	break;

         //창작물 삭제 처리
	 case "/creations/creationDeleteOk.ct" :
	 new CreationDeleteOkController().execute(req,resp);
	 break;
        }
     }

}
CreationUpdateController.java
public class CreationUpdateController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		int creationNumber = Integer.valueOf(req.getParameter("creationNumber"));
		
		CreationsDAO creationsDAO = new CreationsDAO();
		
		req.setAttribute("creations", creationsDAO.select2(creationNumber));
		
		req.getRequestDispatcher("/app/main/uploadUpdate.jsp").forward(req, resp);

	}

}
CreationUpdateOkController.java
public class CreationUpdateOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {

		CreationsVO creationsVO = new CreationsVO();
		CreationsDAO creationsDAO = new CreationsDAO();
		CreationsFileDTO creationsFileDTO = new CreationsFileDTO();
		CreationsFileDAO creationsFileDAO = new CreationsFileDAO();

		int creationNumber = 0;
		

		
		String uploadPath = req.getSession().getServletContext().getRealPath("/") + "upload/";
		int fileSize = 1024*1024*20;
		
		MultipartParser parser = new MultipartParser(req,fileSize);
		parser.setEncoding("utf-8");
		
		while(true) {
			Part part = parser.readNextPart();
			
			if(part == null) {break;}
			String fileSystemName = null;
			String fileOriginalName = null;
			
			if(part.isFile()) {
				FilePart filePart = (FilePart)part;
				filePart.setRenamePolicy(new DefaultFileRenamePolicy());
				fileOriginalName = filePart.getFileName();
				
				if(fileOriginalName != null) {
					File file = new File(uploadPath, fileOriginalName);
					filePart.writeTo(file);
					
					fileSystemName = filePart.getFileName();
					
					creationsFileDTO.setFileOriginalName(fileOriginalName);
					creationsFileDTO.setFileSystemName(fileSystemName);
					creationsFileDTO.setCreationNumber(creationNumber);
					creationsFileDAO.insert(creationsFileDTO);
					creationsDAO.update(creationsFileDTO);
				}
			} else {
				ParamPart paramPart = (ParamPart)part;
				String param = paramPart.getName();
				String value = paramPart.getStringValue();
				
				if(param.equals("creationTitle")) {
					creationsVO.setCreationTitle(value);
				} else if (param.equals("creationContent")) {
					creationsVO.setCreationContent(value);
				} else if(param.equals("category1")) {
					creationsVO.setCreationCode(value);
				} else if(param.equals("category2")) {
					creationsVO.setCreationName(value);
				} else if(param.equals("creationNumber")) {
					creationNumber = Integer.valueOf(value);
					creationsVO.setCreationNumber(creationNumber);
				}
				
				if(creationsVO.getCreationTitle() == null || creationsVO.getCreationContent() == null || creationsVO.getCreationCode() == 
                                  null || creationsVO.getCreationName() == null) {
					continue;
				}
				
				System.out.println(req.getSession().getAttribute("memberNumber"));
				creationsVO.setMemberNumber((Integer)req.getSession().getAttribute("memberNumber"));
				creationsDAO.creationUpdate(creationsVO);

				List<CreationsFileDTO> files = creationsFileDAO.select(creationNumber);
				
				for(CreationsFileDTO file : files) {
					File temp = new File(uploadPath, file.getFileSystemName());
					
					if(temp.exists()) {
						temp.delete();
					}
				}
				creationsFileDAO.delete(creationNumber);
			}
		}
		
		resp.sendRedirect("/main/mainpageListOk.mi");

	}

}
CreationDeleteOkController.java
public class CreationDeleteOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		CreationsDAO creationsDAO = new CreationsDAO();
		CreationsFileDAO creationsFileDAO = new CreationsFileDAO();
		LikesDAO likesDAO = new LikesDAO();
		
		int creationNumber = Integer.valueOf(req.getParameter("creationNumber"));
		
		creationsDAO.creationCommentDelete(creationNumber);
		likesDAO.likeDelete(creationNumber);
		
		String uploadPath = req.getSession().getServletContext().getRealPath("/") + "upload/";
		
		
		List<CreationsFileDTO> files = creationsFileDAO.select(creationNumber);
		
		for(CreationsFileDTO file : files) {
			File temp = new File(uploadPath, file.getFileSystemName());
			
			if(temp.exists()) {
				temp.delete();
			}
		}
		
		creationsFileDAO.delete(creationNumber);
		creationsDAO.creationDelete(creationNumber);
		
		resp.sendRedirect("/main/mainpageListOk.mi");

	}

}
CreationsDAO.java
public class CreationsDAO {
	
	public SqlSession sqlSession;
	
	public CreationsDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}

//      창작물 업로드 파일 수정하
	public void update(CreationsFileDTO creationsFileDTO) {
		sqlSession.update("creations.update", creationsFileDTO);
	}

//	창작물 수정하기
	public void creationUpdate (CreationsVO creationsVO) {
		sqlSession.update("creations.creationUpdate" , creationsVO);
	}

	public void delete(int creationNumber) {
		sqlSession.delete("creationsfile.delete" , creationNumber);
	}

//	댓글 전체 삭제
	public void creationCommentDelete(int creationNumber) {
		sqlSession.delete("creationComment.creationDelete" , creationNumber);
	}

//	 창작물 삭제하기
	public void creationDelete(int creationNumber) {
		sqlSession.delete("creations.creationDelete" , creationNumber);
	}
}
CreationCommentMapper.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="creationComment">

   <delete id="creationDelete" parameterType="_int">
      delete from creations_comment
      where creation_number=#{creationNumber}
   </delete>

</mapper>
CreationsFileMapper.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="creationsfile">

	<insert id="insert" parameterType="CreationsFileDTO">
		insert into creations_file
		(file_system_name, file_original_name, creation_number)
		values(#{fileSystemName}, #{fileOriginalName}, #{creationNumber})
	</insert>

	<select id="select" parameterType="_int" resultType="CreationsFileDTO">
		select file_system_name, file_original_name, creation_number
		from creations_file
		where creation_number = #{creationNumber}
	</select>

	<!-- 파일 삭제 -->
	<delete id="delete" parameterType="CreationsFileDTO">
		delete from creations_file
		where creation_number = #{creationNumber}
	</delete>

</mapper>
CreationsMapper.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="creations">

   <!-- 창작물 수정하기 -->
   <update id="creationUpdate" parameterType="creationsVO">
      update creations
      set
      creation_title=#{creationTitle}, creation_content=#{creationContent},
      category_code=#{creationCode}, category_name=#{creationName},
      creation_sumnail=#{creationSumnail}
      where
      creation_number=#{creationNumber}
   </update>

   <!-- 창작물 삭제 -->
   <delete id="creationDelete" parameterType="_int">
      delete from creations
      where creation_number=#{creationNumber}
   </delete>

</mapper>

📷View

별구름 - 만화 페이지 수정 및 삭제
newlight_별구름-만화 페이지 글 삭제하기01 newlight_별구름-만화 페이지 글 수정하기01 newlight_별구름-만화 페이지 글 수정하기02 newlight_별구름-만화 페이지 글 수정하기03
별구름 - 카톡테마 페이지 수정 및 삭제
newlight_별구름-카톡테마 페이지 글 수정하기01 newlight_별구름-카톡테마 페이지 글 수정하기02 newlight_별구름-카톡테마 페이지 글 삭제하기01

✔️ 별구름 페이지 - 만화, 카카오톡 테마 댓글 작성하기

  • session 검사 후 DB에 저장되어 있는 회원이라면 있다면 댓글 작성을 작성할 수 있다.

💻Code

CreationCommentFrontController.java
public class CreationCommentFrontController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String target = req.getRequestURI().substring(req.getContextPath().length());

                switch(target) {
//		댓글 추가 처리	
		case "/creations/commentWriteOk.cc1" :
			new CommentWrtieOkController().execute(req, resp);
			break;
			
//		댓글 리스트 처리	
		case "/creations/commentListOK.cc1" :
			new CommentListOkController().execute(req,resp);
			break;
			
                }

        }

}
CommentWriteOkController.java
public class CommentWrtieOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		CreationsVO creationsVO = new CreationsVO();
		CreationsDAO creationsDAO = new CreationsDAO();
		
		req.setCharacterEncoding("utf-8");
		
		creationsVO.setCreationNumber(Integer.valueOf(req.getParameter("creationNumber")));
		creationsVO.setMemberNumber(Integer.valueOf(req.getParameter("memberNumber")));
		creationsVO.setCommentContent(req.getParameter("commentContent"));
		
		creationsDAO.commentInsert(creationsVO);

	}

}
CommentListOkController.java
public class CommentListOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
	      int creationNumber = Integer.valueOf(req.getParameter("creationNumber"));
	      CreationsVO creationVO = new CreationsVO();
	      CreationsDAO creationsDAO = new CreationsDAO();
	      Gson gson = new Gson();
	      JsonArray creationCommentList = new JsonArray();
	      
	      req.setAttribute("creationCommentList", creationsDAO.commentList(creationNumber));
	      
	      List<CreationsVO> creationsList = creationsDAO.commentList(creationNumber);
	      
	      for(CreationsVO creationComment : creationsList) {
	         String creationCommentJson = gson.toJson(creationComment);
	         creationCommentList.add(JsonParser.parseString(creationCommentJson));
	      }
	      resp.setContentType("application/json;charset=utf-8");
	     
	      PrintWriter out = resp.getWriter();
	      out.print(creationCommentList.toString());
	      out.close();
	   }


	}
CreationsDAO.java
public class CreationsDAO {
	
	public SqlSession sqlSession;
	
	public CreationsDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}

//	댓글 작성하기
	public void commentInsert(CreationsVO creationsVO) {
		sqlSession.insert("creationComment.commentInsert", creationsVO);
	}

//	댓글 리스트 뿌려주기
	public List<CreationsVO> commentList(int creationNumber){
		return sqlSession.selectList("creations.commentList" , creationNumber);
	}

}
CreationCommentMapper.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="creationComment">

   <!-- 댓글 생성 -->
   <insert id="commentInsert" parameterType="CreationsVO">
      insert into creations_comment
      (comment_content, member_number, creation_number)
      values(#{commentContent} , #{memberNumber} , #{creationNumber})
   </insert>

</mapper>
CreationsMapper.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="creations">

   <!-- 창작물 댓글 리스트 -->
   <select id="commentList" parameterType="_int" resultType="CreationsVO">
      select cc.comment_number, cc.comment_content, cc.comment_writedate , cc.creation_number, m.member_nickname , m.member_number , m.member_pfp 
      from creations_comment cc join `member` m
      on cc.member_number = m.member_number
      where creation_number = #{creationNumber}
   </select>

</mapper>

✔️ 별구름 페이지 - 만화, 카카오톡 테마 댓글 수정 및 삭제

  • session 검사 후 댓글 작성한 User와 DB의 값이 같으면 수정 및 삭제 기능을 이용할 수 있고,

    같지 않다면 수정 및 삭제 버튼은 활성화 되지 않는다.

💻Code

CreationCommentFrontController.java
public class CreationCommentFrontController extends HttpServlet{
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}
	
	private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String target = req.getRequestURI().substring(req.getContextPath().length());

		switch(target) {
//              댓글 수정			
		case "/creations/commentUpdateOk.cc1":
			new CommentUpdateOkController().execute(req,resp);
			break;
			
//		댓글 삭제
		case "/creations/commentDeleteOk.cc1" :
			new CommentDeleteOkController().execute(req,resp);
			break;
		
		}
	}

}
CommentUpdateOkController.java
public class CommentUpdateOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		CreationsVO creationsVO = new CreationsVO();
		
		creationsVO.setCommentNumber(Integer.valueOf(req.getParameter("commentNumber")));
		creationsVO.setCommentContent(req.getParameter("commentContent"));
		
		new CreationsDAO().commentUpdate(creationsVO);
	}

}
CommentDeleteController.java
public class CommentDeleteOkController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		CreationsDAO creationsDAO = new CreationsDAO();
		CreationCommentDAO creationCommentDAO = new CreationCommentDAO();
		
		int commnetNumber = Integer.valueOf(req.getParameter("commentNumber"));
		
		creationsDAO.commentDelete(commnetNumber);
		
	}
}
CreationsDAO.java
public class CreationsDAO {
	
	public SqlSession sqlSession;
	
	public CreationsDAO() {
		sqlSession = MyBatisConfig.getSqlSessionFactory().openSession(true);
	}

//	댓글 수정하기
	public void commentUpdate(CreationsVO creationsVO) {
		sqlSession.update("creationComment.commentUpdate" , creationsVO);
	}

//	댓글 삭제하기
	public void commentDelete(int commentNumber) {
		sqlSession.delete("creationComment.commentDelete" , commentNumber);
	}
}
CreationCommentMapper.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="creationComment">

   <!-- 댓글 수정하기 -->
   <update id="commentUpdate" parameterType="CreationsVO">
   update creations_comment
   set comment_content=#{commentContent}
   where comment_number=#{commentNumber}
   </update>

   <!-- 댓글 삭제하기 -->
   <delete id="commentDelete" parameterType="_int">
   delete from creations_comment
   where comment_number=#{commentNumber}
   </delete>

</mapper>

✔️ User가 올린 업로드 파일 다운로드

  • User가 올린 업로드 파일을 다운로드 할 수 있는 기능을 구현하였다.

💻Code

CreationFileFrontController.java
public class CreationFileFrontController extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doProcess(req, resp);
	}

	private void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		String target = req.getRequestURI().substring(req.getContextPath().length());
		
		switch (target) {
		case "/creationFile/download.ccmf" :
			new CreationDonwloadController().execute(req, resp);
			break;
			
		}
	}

}
CreationDownloadController.java
public class CreationDonwloadController implements Execute {

	@Override
	public void execute(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException {
		String fileSystemName = req.getParameter("fileSystemName");
		String fileOriginalName = req.getParameter("fileOriginalName");
		String uploadPath = req.getSession().getServletContext().getRealPath("/") + "upload/";

		InputStream in = null;
		OutputStream out = null;

		try {
			File file = new File(uploadPath, fileSystemName);

//      파일의 byte수를 의미한다.
			file.length();

//      실제파일의 byte를 1024바이트(1KB)단위로 가져온다.
			byte[] buffer = new byte[1024];

//      클라이언트에게 보내는 응답이 이전과 다르게 파일(바이트) 데이터이므로 컨텐트 타입을 설정해야한다.
			resp.setContentType("application/octet-stream; charset=utf-8");

			fileOriginalName = new String(fileOriginalName.getBytes("UTF-8"), "ISO-8859-1");
//      resp의 헤더영역에 파일에 대한 추가정보 설정하기
			resp.setHeader("Content-Length", file.length() + "");
			resp.setHeader("Content-Disposition", "attachment; filename=" + fileOriginalName);

			in = new FileInputStream(file);

			out = resp.getOutputStream();

			int readCnt = 0;

			while ((readCnt = in.read(buffer)) != -1) {
				out.write(buffer, 0, readCnt);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if (in != null) {
					in.close();
				}
				if (out != null) {
					out.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}

	}

}
⚠️ **GitHub.com Fallback** ⚠️