내가 구현한 기능 소개(별구름 ‐ 만화, 카카오톡 테마) - KimByoungKoo/NewLightProject GitHub Wiki
-
로그인이 되어 있지 않다면, 상세 보기 페이지를 진입할 수 없다.
회원이 올린 창작물에 대해 저작권을 보호하기 위해 진입할 수 없게 했다.
-
창작물 상세보기 페이지 진입 시 User가 업로드한 창작물과 댓글이 함께 보여진다.
-
카테고리 선택 별 페이지 진입이 달라진다.
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>별구름 페이지 - 만화, 카카오톡 테마 상세 보기 및 카테고리 별 페이지 진입
-
session 검사 후 로그인이 안되어 있을 경우 로그인 페이지로 이동,
로그인이 되어 있다면 글 작성 페이지로 이동하여 창작물 업로드 페이지로 이동하여 글을 작성할 수 있다.
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>- 창작물 업로드 작성 페이지 양식은 모두 같다. 어느 카테고리에 글을 작성할 것인지 선택하고 글 작성 하면 된다.
별구름 페이지 - 만화, 카카오톡 테마 글 작성하기
- session 검사 후 session의 값과 글 작성자 DB의 값이 일치하면 수정 및 삭제 기능을 이용할 수 있다.
- session이 글 작성자 DB의 값과 일치하지 않을 경우 수정 및 삭제 버튼은 활성화 되지 않고 목록 버튼만 활성화 된다.
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>별구름 - 만화 페이지 수정 및 삭제
별구름 - 카톡테마 페이지 수정 및 삭제
- session 검사 후 DB에 저장되어 있는 회원이라면 있다면 댓글 작성을 작성할 수 있다.
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의 값이 같으면 수정 및 삭제 기능을 이용할 수 있고,
같지 않다면 수정 및 삭제 버튼은 활성화 되지 않는다.
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가 올린 업로드 파일을 다운로드 할 수 있는 기능을 구현하였다.
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();
}
}
}
}