기본적인 Option 만들고, 세팅하기
servlet-context.xml 내부를 수정해준다.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "HTTP://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="true" />
<setting name="defaultExecutorType" value="REUSE" />
</settings>
<typeAliases>
<!-- <typeAlias type="vo.BoardVo" alias="board"/> -->
<typeAlias type="vo.MemberVo" alias="member"/>
<typeAlias type="vo.PhotoVo" alias="photo"/>
</typeAliases>
<mappers>
<mapper resource="config/mybatis/mapper/member.xml" />
<mapper resource="config/mybatis/mapper/photo.xml" />
</mappers>
</configuration>
MemberController는 RequestMapping이 항상 경로가 /member/이기 때문에, login_form.do 앞에 /member/라는 RequestMapping이 항상 붙어서 해석이 된다.
MemberDao 연결하기(왼쪽 Constructor 생성자로 sqlSession 생성, 오른쪽 Setter로 sqlSession 생성)
MemberDao Spring으로 받게끔 지정해주기
public class MemberDao {
SqlSession sqlSession; // SqlSessionTemplate의 interface
// Injection 완료 Constructor로 받기
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
// mem_id에 해당되는 1건의 정보 얻어온다
public MemberVo selectOne(String mem_id) {
return sqlSession.selectOne("member.member_one",mem_id);
}
}
loginAction에 대한 Controller 작성하기(session 추가, 틀린 경우에 넘겨주는 값)
// /member/login.do?mem_id=one&mem_pwd=1234
@RequestMapping("login.do")
public String login(String mem_id, String mem_pwd, RedirectAttributes ra) {
MemberVo user = member_dao.selectOne(mem_id);
// 로그인한 유저 정보가 없으면,
if(user==null) {
// RedirectAttributes에 redirect할 때 넘어가야할 정보를 알려주면
// parameter로 이용된다.
ra.addFlashAttribute("reason","fail_id");
// return "redirect:login_from.do?reason=fail_id";
return "redirect:login_from.do";
}
// 비밀번호가 틀린 경우
if(user.getMem_pwd().equals(mem_pwd)==false) {
//response.sendRedirect("login_form.do?reason=fail_pwd&mem_id=" + mem_id);
ra.addAttribute("reason","fail_pwd");
ra.addAttribute("mem_id",mem_id);
return "redirect:login_form.do";
}
// 로그인 처리: 현재 로그인 객체(user)정보를 session 저장
session.setAttribute("user", user);
return "redirect:../photo/list.do";
}
로그아웃 Controller
// 로그아웃
@RequestMapping("logout.do")
public String logout() {
session.removeAttribute("user");
return "redirect:../photo/list.do";
}
Photo Paging 처리
context-3-dao.xml 생성하기
<!-- MemberDao 생성 -->
<bean id="member_dao" class="dao.MemberDao">
<property name="sqlSession" ref="sqlSession"/>
</bean>
<!-- PhotoDao 생성 -->
<bean id="photo_dao" class="dao.PhotoDao">
<property name="sqlSession" ref="sqlSession"/>
</bean>
</beans>
PhotoDao 작성하기
package dao;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import vo.PhotoVo;
public class PhotoDao {
SqlSession sqlSession;
// Setter Injection
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
public List<PhotoVo> selectList(Map<String, Object> map) {
List<PhotoVo> list = new ArrayList<PhotoVo>();
return sqlSession.selectList("photo.photo_list_page", map);
}
public PhotoVo selectOne(int p_idx) {
return sqlSession.selectOne("photo.photo_one", p_idx);
}
public int insert(PhotoVo vo) {
// TODO Auto-generated method stub
return sqlSession.insert("photo.photo_insert", vo);
}//end:insert()
public int update_filename(PhotoVo vo) {
// TODO Auto-generated method stub
return sqlSession.update("photo.photo_update_filename", vo);
}//end:update()
public int update(PhotoVo vo) {
return sqlSession.update("photo.photo_update", vo);
}//end:update()
public int selectRowTotal() {
return sqlSession.selectOne("photo.photo_row_total");
}
}
PhotoContoller PhotoListAction 대신하는 Controller 작성하기
package controller;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import dao.PhotoDao;
import util.MyCommon;
import util.Paging;
import vo.PhotoVo;
@Controller
@RequestMapping("/photo/")
public class PhotoController {
@Autowired
PhotoDao photo_dao;
public PhotoController() {
// TODO Auto-generated constructor stub
System.out.println("--PhotoController()--");
}
// /photo/list.do?page=2
@RequestMapping("list.do")
public String list(@RequestParam(name="page",defaultValue = "1") int nowPage,
Model model) {
// 게시물의 범위 계산(start/end)
int start = (nowPage-1) * MyCommon.Photo.BLOCK_LIST + 1;
int end = start + MyCommon.Photo.BLOCK_LIST - 1;
Map<String, Object> map = new HashMap<String, Object>();
map.put("start",start);
map.put("end",end);
List<PhotoVo> list = photo_dao.selectList(map);
// 전체 게시물수
int rowTotal = photo_dao.selectRowTotal();
// pageMenu 만들기
String pageMenu = Paging.getPaging("list.do", // pageURL
nowPage, // 현재페이지
rowTotal, // 전체페이지
MyCommon.Photo.BLOCK_LIST, // 한화면에 보여질 게시물 수
MyCommon.Photo.BLOCK_PAGE); // 한화면에 보여질 페이지 수
// 결과적으로 request binding
model.addAttribute("list",list);
model.addAttribute("pageMenu",pageMenu);
return "photo/photo_list";
}
}
index.jsp 작성하기
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
location.href="photo/list.do";
</script>
</head>
<body>
</body>
</html>
resources images 경로 변경하기
PhotoController 나머지 작성하기
@RequestMapping("insert_form.do")
public String insert_form() {
return "photo/photo_insert_form";
}
//사진등록
// 요청 Parameter 이름과 받는 변수명이 동일하면 @RequestParam(name="")의
// name 속성은 생략가능
@RequestMapping("insert.do")
public String insert(PhotoVo vo,
@RequestParam(name="photo") MultipartFile photo,
RedirectAttributes ra) throws Exception {
// 유저 정보 얻어오기
MemberVo user = (MemberVo) session.getAttribute("user");
// session timeout
if(user==null) {
// response.sendRedirect("../member/login_form.do?reason=session_timeout");
ra.addAttribute("reason","session_timeout");
return "redirect:../member/login_form.do";
}
// 파일 업로드 처리
String absPath = application.getRealPath("/resources/images/");
String p_filename = "no_file";
if(!photo.isEmpty()) {
// 업로드 파일이름 얻어오기
p_filename = photo.getOriginalFilename();
// 저장할 위치 + file 이름
File f = new File(absPath,p_filename);
if(f.exists()) { // 저장경로에 동일한 파일이 존재하면=>다른이름변경
// 변경파일명 = 시간_원본파일명
long tm = System.currentTimeMillis();
p_filename = String.format("%d_%s", tm, p_filename);
f = new File(absPath,p_filename);
}
// 임시 파일=>내가 지정한 위치로 복사
photo.transferTo(f);
}
// 업로드 된 파일이름
vo.setP_filename(p_filename);
// IP
String p_ip = request.getRemoteAddr();
vo.setP_ip(p_ip);
String p_content = vo.getP_content().replaceAll("\n", "<br>");
vo.setP_content(p_content);
// 입력한 로그인 유저 넣는다
vo.setMem_idx(user.getMem_idx());
vo.setMem_name(user.getMem_name());
// DB Insert
int res = photo_dao.insert(vo);
return "redirect:list.do";
}
json library 다운로드
https://mvnrepository.com/artifact/org.json/json/20240205
photo_one 추가 json ResponseBody로 넘기기
@RequestMapping(value="photo_one.do",
produces = "application/json;charset=utf-8;")
@ResponseBody // 현재 반환값을 응답데이터를 이용해라
public String photo_one(int p_idx) {
PhotoVo vo = photo_dao.selectOne(p_idx);
// VO -> JSON 객체 생성(필요없는건 안넘겨도 됨)
JSONObject json = new JSONObject();
json.put("p_idx", vo.getP_idx());
json.put("p_title", vo.getP_title());
json.put("p_content", vo.getP_content());
json.put("p_filename", vo.getP_filename());
json.put("p_regdate", vo.getP_regdate());
json.put("p_ip", vo.getP_ip());
json.put("mem_idx", vo.getMem_idx());
json.put("mem_name", vo.getMem_name());
return json.toString();
}
delete / modify / modify_form
@RequestMapping("delete.do")
public String delete(PhotoVo vo,int p_idx) {
vo = photo_dao.selectOne(p_idx);
String absPath = request.getServletContext().getRealPath("/resources/images/");
File delFile = new File(absPath, vo.getP_filename());
delFile.delete();
// DB delete
int res = photo_dao.delete(p_idx);
return "redirect:list.do";
}
@RequestMapping("modify_form.do")
public String modify_from(int p_idx, PhotoVo vo, Model model) {
vo = photo_dao.selectOne(p_idx);
String p_content = vo.getP_content().replaceAll("<br>", "\n");
vo.setP_content(p_content);
model.addAttribute("vo", vo);
return "photo/photo_modify_form";
}
@RequestMapping("modify.do")
public String modify(int p_idx, String p_title, String p_content, PhotoVo vo) {
vo.setP_idx(p_idx);
vo.setP_title(p_title);
vo.setP_content(p_content);
photo_dao.update(vo);
return "redirect:list.do";
}
update로 기존 사진 삭제하고 다시 올리는 Controller
@RequestMapping(value="photo_upload.do",produces = "application/json;charset=utf-8")
@ResponseBody
public String upload(PhotoVo vo, MultipartFile photo, RedirectAttributes ra, int p_idx) throws Exception {
String absPath = application.getRealPath("/resources/images/");
String p_filename = "no_file";
if(!photo.isEmpty() ) {
p_filename = photo.getOriginalFilename();
File f = new File(absPath,p_filename);
if(f.exists()) {
long tm = System.currentTimeMillis();
p_filename = String.format("%d_%s", tm, p_filename);
f = new File(absPath, p_filename);
}
photo.transferTo(f);
}
vo = photo_dao.selectOne(p_idx);
File delFile = new File(absPath, vo.getP_filename());
delFile.delete();
vo.setP_filename(p_filename);
photo_dao.update_filename(vo);
String json = String.format("{\"p_filename\":\"%s\"}", p_filename);
return json;
}
MemberDao
package dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import vo.MemberVo;
public class MemberDao {
SqlSession sqlSession; // SqlSessionTemplate의 interface
// Injection 완료 Constructor로 받기
public void setSqlSession(SqlSession sqlSession) {
this.sqlSession = sqlSession;
}
// mem_id 에 해당되는 1건의 정보 얻어온다
public MemberVo selectOne(String mem_id) {
return sqlSession.selectOne("member.member_id_one", mem_id);
}
//전체조희
public List<MemberVo> selectList() {
return sqlSession.selectList("member.member_list");
}
// mem_idx에 해당되는 1건의 정보 얻어온다
// 일부만 조회
public MemberVo selectOne(int mem_idx) {
return sqlSession.selectOne("member.member_one",mem_idx);
}
public int insert(MemberVo vo) {
return sqlSession.insert("member.member_insert", vo);
}//end:insert()
public int delete(int mem_idx) {
return sqlSession.delete("member.member_delete", mem_idx);
}//end:delete()
public int update(MemberVo vo) {
return sqlSession.update("member.member_delete", vo);
}//end:update()
}
MemberAction 전체를 Controller로 변경해주자
package controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import dao.MemberDao;
import vo.MemberVo;
@Controller
@RequestMapping("/member/")
public class MemberController {
// 자동연결
@Autowired
HttpServletRequest request;
@Autowired
HttpSession session;
// 처음에 1회 연결
@Autowired
MemberDao member_dao;
public MemberController() {
// TODO Auto-generated constructor stub
System.out.println("--MemberController()--");
}
// class RequestMapping + method RequestMapping => /member/login_form.do
@RequestMapping("login_form.do")
public String login_form() {
return "member/member_login_form";
}
// /member/login.do?mem_id=one&mem_pwd=1234
@RequestMapping("login.do")
public String login(String mem_id, String mem_pwd, RedirectAttributes ra) {
MemberVo user = member_dao.selectOne(mem_id);
// 로그인한 유저 정보가 없으면,
if(user==null) {
// RedirectAttributes에 redirect할 때 넘어가야할 정보를 알려주면
// parameter로 이용된다.
ra.addFlashAttribute("reason","fail_id");
// return "redirect:login_from.do?reason=fail_id";
return "redirect:login_from.do";
}
// 비밀번호가 틀린 경우
if(user.getMem_pwd().equals(mem_pwd)==false) {
//response.sendRedirect("login_form.do?reason=fail_pwd&mem_id=" + mem_id);
ra.addAttribute("reason","fail_pwd");
ra.addAttribute("mem_id",mem_id);
return "redirect:login_form.do";
}
// 로그인 처리: 현재 로그인 객체(user)정보를 session 저장
session.setAttribute("user", user);
return "redirect:../photo/list.do";
}
// 로그아웃
@RequestMapping("logout.do")
public String logout() {
session.removeAttribute("user");
return "redirect:../photo/list.do";
}
@RequestMapping("modify_form.do")
public String modify_form(int mem_idx, Model model) {
MemberVo vo = member_dao.selectOne(mem_idx);
model.addAttribute("vo", vo);
return "member/member_modify_form";
}
@RequestMapping("modify.do")
public String modify(int mem_idx, String mem_name, String mem_id, String mem_pwd, String mem_zipcode,
String mem_addr, String mem_grade) {
MemberVo vo = new MemberVo(mem_idx, mem_name, mem_id, mem_pwd, mem_zipcode, mem_addr, mem_grade);
member_dao.update(vo);
session = request.getSession();
MemberVo loginUser = (MemberVo) session.getAttribute("user");
if(loginUser.getMem_idx()==mem_idx) {
// 로그인상태정보
MemberVo user = member_dao.selectOne(mem_idx);
// session.removeAttribute("user"); 불필요한 작업
// scope내에 저장방식 Map형식: key / value
// 동일한 key로 저장하면 수정처리된다
session.setAttribute("user", user);
}
return "redirect:list.do";
}
@RequestMapping("insert_form.do")
public String insert_form() {
return "member/member_insert_form";
}
@RequestMapping("insert.do")
public String insert(String mem_name, String mem_id, String mem_pwd, String mem_zipcode,
String mem_addr) {
String mem_ip = request.getRemoteAddr();
MemberVo vo = new MemberVo(mem_name, mem_id, mem_pwd, mem_zipcode, mem_addr, mem_ip);
member_dao.insert(vo);
return "redirect:../photo/list.do";
}
@RequestMapping(value="check_id.do",produces = "application/json;charset=utf-8;")
@ResponseBody
public String check_id(String mem_id, MemberVo vo) {
vo = member_dao.selectOne(mem_id);
boolean bResult = (vo==null);
String json = String.format("{\"result\":%b}", bResult);
return json.toString();
}
@RequestMapping("list.do")
public String list(Model model) {
List<MemberVo> list = member_dao.selectList();
model.addAttribute("list",list);
return "member/member_list";
}
}
'SpringBoot↗' 카테고리의 다른 글
게시판 2편(대댓글 생성 로직 / 게시물 삭제 update 로직 / 수정로직 ) (2) | 2024.07.24 |
---|---|
Spring 답변형 게시판 작성 가이드 (0) | 2024.07.23 |
Spring DataBase 파일 2개/n개 다량 업로드 (0) | 2024.07.22 |
[오류해결]Spring 글씨깨짐 (0) | 2024.07.20 |
Spring DB FileUpload (0) | 2024.07.19 |