수업(국비지원)/Spring
[Spring] (MVC 2) 관리자 설정(AdminController, AdminLoginAspect, ShopService, UserDao, list)
byeolsub
2023. 4. 21. 00:15
📌 AdminController.java 생성
package controller;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import logic.ShopService;
import logic.User;
/*
* AdminController의 모든 메서드들은 반드시 관리자로 로그인 해야한 실행되도록
* AOP 설정해야함. => AdminLoginAspect 클래스 생성.
* 1. 로그아웃 : 로그인하세요. login 페이지로 이동
* 2. 관리자 아닌 경우 : 관리자만 거래 가능합니다. mypage 페이지로 이동
*/
@Controller
@RequestMapping("admin")
public class AdminController {
@Autowired
private ShopService service;
@RequestMapping("list")
public ModelAndView list(HttpSession session) {
ModelAndView mav = new ModelAndView();
List<User> list = service.userlist();
mav.addObject("list",list);
return mav;
}
}
📌 AdminLoginAspect.java 생성
package aop;
import javax.servlet.http.HttpSession;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import exception.LoginException;
import logic.User;
@Component //객체화
@Aspect //AOP 기능의 클래스
public class AdminLoginAspect {
@Around("execution(* controller.Admin*.*(..)) && args(..,session)")
public Object adminCheck(ProceedingJoinPoint joinPoint, HttpSession session) throws Throwable {
User loginUser = (User)session.getAttribute("loginUser");
if(loginUser == null) { //로그아웃 상태인 경우
throw new LoginException("[adminCheck]로그인 후 거래하세요.", "../user/login");
} else if(!loginUser.getUserid().equals("admin")) { //2. 관리자 아닌 경우
throw new LoginException("[adminCheck]관리자만 거래 가능합니다.", "../user/mypage?id=" + loginUser.getUserid());
}
return joinPoint.proceed();
}
}
📌 ShopService.java 내용 추가
package logic;
import java.io.File;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import dao.ItemDao;
import dao.UserDao;
/*
* @Component : 해당 클래스를 객체화
* - Service 기능 : Controller 와 Model사이의 중간 역할의 클래스
*/
@Service //@Component + Service 기능
public class ShopService {
@Autowired //현재 내 컨테이너(객체)들 중에 itemDao 객체를 주입.
private ItemDao itemDao;
@Autowired
private UserDao userDao;
public List<Item> itemList() {
return itemDao.list();
}
public Item getItem(Integer id) {
return itemDao.getItem(id);
}
//db에 내용 저장. 파일 업로드.
//item : 저장 정보. 입력된 파라미터 값 + 업로드 된 파일의 내용
public void itemCreate(@Valid Item item, HttpServletRequest request) {
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //업로드 구현 완료
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름
}
//maxid : item테이블 중 최대 id 값
int maxid = itemDao.maxId();
item.setId(maxid+1);
itemDao.insert(item);
}
private void uploadFileCreate(MultipartFile file, String uploadPath) {
//uploadPath : 파일이 업로드 되는 폴더
String orgFile = file.getOriginalFilename(); //업로드 된 파일의 이름
File fpath = new File(uploadPath);
if(!fpath.exists()) fpath.mkdirs(); //업로드 폴더를 생성(없으면)
try {
//파일의 내용 => uploadPath + orgFile 로 파일 저장
file.transferTo(new File(uploadPath + orgFile)); //파일업로드
} catch(Exception e) {
e.printStackTrace();
}
}
public void itemUpdate(Item item, HttpServletRequest request) {
//item.getPicture() : 업로드 된 파일의 내용
if(item.getPicture() != null && !item.getPicture().isEmpty()) { //업로드 된 파일이 있는 경우
String uploadPath = request.getServletContext().getRealPath("/") + "img/"; //업로드 위치
uploadFileCreate(item.getPicture(), uploadPath); //파일 업로드 : 업로드된 내용을 서버에 파일로 저장
item.setPictureUrl(item.getPicture().getOriginalFilename()); //파일의 이름을 db에 등록하기 위해 설정
}
itemDao.update(item);
}
public void itemDelete(Integer id) {
itemDao.delete(id);
}
public void userInsert(@Valid User user) {
userDao.insert(user);
}
public User getUser(String userid) {
return userDao.selectOne(userid);
}
public void userUpdate(@Valid User user) {
userDao.update(user);
}
public void userDelete(String userid) {
userDao.delete(userid);
}
public void userChgPass(String userid, String pass) {
userDao.chgpass(userid,pass);
}
public String getSearch(User user, String url) {
return userDao.search(user, url);
}
**public List<User> userlist() {
return userDao.list();
}**
}
📌 UserDao.java 내용 추가
package dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.sql.DataSource;
import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.stereotype.Repository;
import logic.User;
@Repository
public class UserDao {
private NamedParameterJdbcTemplate template;
private Map<String, Object> param = new HashMap<>();
private RowMapper<User> mapper = new BeanPropertyRowMapper<>(User.class);
@Autowired
public void setDataSource(DataSource dataSource) {
template = new NamedParameterJdbcTemplate(dataSource);
}
public void insert(@Valid User user) {
SqlParameterSource param = new BeanPropertySqlParameterSource(user);
String sql = "insert into useraccount"
+ " (userid, password, username, phoneno, postcode,"
+ "address, email, birthday)"
+ " values(:userid, :password, :username, :phoneno, :postcode,"
+ " :address, :email, :birthday)";
template.update(sql, param);
}
public User selectOne(String userid) {
param.clear();
param.put("userid", userid);
//EmptyResultDataAccessException : 해당 레코드 없을 때 예외 발생
return template.queryForObject("select * from useraccount where userid=:userid", param, mapper);
}
public void update(User user) {
SqlParameterSource param = new BeanPropertySqlParameterSource(user);
String sql = "update useraccount set username=:username, "
+ " birthday=:birthday, phoneno=:phoneno, postcode=:postcode,"
+ "address=:address, email=:email where userid=:userid";
template.update(sql, param);
}
public void delete(String userid) {
param.clear();
param.put("userid", userid);
template.update("delete from useraccount where userid=:userid", param);
}
public void chgpass(String userid, String pass) {
String sql = "update useraccount set password=:password where userid=:userid";
param.clear();
param.put("userid",userid);
param.put("password",pass);
template.update(sql, param);
}
public String search(User user, String url) {
String col = "userid";
if(url.equals("pw")) col = "password";
String sql = "select " + col + " from useraccount "
+ " where email=:email and phoneno=:phoneno ";
if(url.equals("pw")) {
sql += "and userid=:userid";
}
SqlParameterSource param = new BeanPropertySqlParameterSource(user);
return template.queryForObject(sql, param, String.class);
}
**public List<User> list() {
return template.query("select * from useraccount ", param, mapper);
}**
}
📌 list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- /springmvc1/src/main/webapp/WEB-INF/view/admin/list.jsp --%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html><html><head>
<meta charset="UTF-8">
<title>회원목록</title>
<script type="text/javascript">
function allchkbox(allchk) {
$(".idchks").prop("checked",allchk.checked)
}
</script>
<style>
.noline {text-decoration: none;}
</style>
</head><body>
<table class="w3-table-all"><tr><td colspan="7">회원목록</td></tr>
<tr><th>아이디<a href="list?sort=1" class="noline">▲</a>
<a href="list?sort=2" class="noline">▼</a></th>
<th>이름<a href="list?sort=3" class="noline">▲</a>
<a href="list?sort=4" class="noline">▼</a></th>
<th>전화</th>
<th>생일</th>
<th>이메일<a href="list?sort=5" class="noline">▲</a>
<a href="list?sort=6" class="noline">▼</a></th><th> </th></tr>
<c:forEach items="${list}" var="user">
<tr><td>${user.userid}</td><td>${user.username}</td><td>${user.phoneno}</td>
<td><fmt:formatDate value="${user.birthday}" pattern="yyyy-MM-dd"/></td>
<td>${user.email}</td>
<td><a href="../user/update?id=${user.userid}">수정</a>
<a href="../user/delete?id=${user.userid}">강제탈퇴</a>
<a href="../user/mypage?id=${user.userid}">회원정보</a>
</td>
</c:forEach>
</table></body></html>
📌 AdminController.java 내용 수정 및 추가
package controller;
import java.util.Collections;
import java.util.List;
import javax.servlet.http.HttpSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import logic.ShopService;
import logic.User;
/*
* AdminController의 모든 메서드들은 반드시 관리자로 로그인 해야한 실행되도록
* AOP 설정해야함. => AdminLoginAspect 클래스 생성.
* 1. 로그아웃 : 로그인하세요. login 페이지로 이동
* 2. 관리자 아닌 경우 : 관리자만 거래 가능합니다. mypage 페이지로 이동
*/
@Controller
@RequestMapping("admin")
public class AdminController {
@Autowired
private ShopService service;
**@RequestMapping("list")
public ModelAndView list(Integer sort, HttpSession session) {
ModelAndView mav = new ModelAndView();
List<User> list = service.userlist();
if(sort == null) sort = 0; //정렬하지 않겠다.
switch(sort) {
case 1 : //아이디의 오름차순 정렬
Collections.sort(list, (u1,u2)->u1.getUserid().compareTo(u2.getUserid()));
break;
case 2 : //아이디의 내림차순 정렬
Collections.sort(list, (u1,u2)->u2.getUserid().compareTo(u1.getUserid()));
break;
case 3 : //이름의 오름차순 정렬
Collections.sort(list, (u1,u2)->u1.getUserid().compareTo(u2.getUserid()));
break;
case 4 : //이름의 내림차순 정렬
Collections.sort(list, (u1,u2)->u2.getUserid().compareTo(u1.getUserid()));
break;
case 5 : //이메일의 오름차순 정렬
Collections.sort(list, (u1,u2)->u1.getUserid().compareTo(u2.getUserid()));
break;
case 6 : //이메일의 내림차순 정렬
Collections.sort(list, (u1,u2)->u2.getUserid().compareTo(u1.getUserid()));
break;
}
mav.addObject("list",list);
return mav;
}**
}