티스토리 뷰

코딩/spring

[20주 5일차] 경기 추가

ehzim 2024. 2. 23. 21:49

공부할 것!!

테이블 조인!!!!

 

 

 

Controller

GameContoller.java

package com.springmvc.controller;


import java.io.File;
import java.util.List;
import java.util.Random;
import java.util.UUID;

import javax.servlet.http.HttpServletRequest;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import com.springmvc.domain.Game;
import com.springmvc.domain.Match;
import com.springmvc.service.GameService;
import com.springmvc.service.MatchService;


@Controller
@RequestMapping("/games")
public class GameController {

	
	@Autowired
	private GameService gameService;

	@Autowired
	private MatchService matchService;
	
	@GetMapping
	public String requestGameList(Model model)
	{
		List<Game> list = gameService.readAllGame();
		model.addAttribute("list",list);
		return "/Game/games";
	}
	
	@GetMapping("/all")
	public String requestAllGames(Model model)
	{
		List<Game> list = gameService.readAllGame();
		model.addAttribute("list",list);
		return "/Game/game";
	}
	
	@GetMapping("/game")
	public String requestGameById(@RequestParam("id") String gameId, Model model) {
//		Match matchById = matchService.readMatchById(gameId);
//		model.addAttribute("match",matchById);
		
		Game gameById = gameService.readGameById(gameId);
		model.addAttribute("game",gameById);
		
		return "/Game/game";
	}
	
	@GetMapping("/add")
	public String requestAddGameForm(@ModelAttribute("addGame")Game game, Model model) 
	{
		return "/Game/addGame";
	}
	
	
	@PostMapping("/add")
	public String submitAddNewGame(@ModelAttribute("addGame")Game game, Model model ,HttpServletRequest request) {
		System.out.println("POSTMAPPING 도착");
		String gameId = generateGameId(10);
		System.out.println(gameId);
		game.setGameId(gameId);
//		Match match = new Match();
//		match.setGameId(gameId);
		MultipartFile img = game.getGameImage();
		
		String saveName = img.getOriginalFilename();
		String save = request.getSession().getServletContext().getRealPath("/resources/images");
		File saveFile = new File(save,saveName);
		
		if(img!=null&&!img.isEmpty()) {
			try {
				img.transferTo(saveFile);
				game.setFileName(saveName);
			}
			catch(Exception e) {
				throw new RuntimeException("사진 등록 실패");
			}
		}
		gameService.setNewGame(game);
		return "redirect:/games";
	}
	
	private String generateGameId(int length) {
		
		if(length<=0) {
			throw new IllegalArgumentException("길이는 1이상이어야 합니다.");
		}
		Random random = new Random();
		StringBuilder stringBuilder = new StringBuilder();
		
		for(int i=0; i<length; i++) {
			int randomNumber = random.nextInt(10);
			stringBuilder.append(randomNumber);
		}
		return "G_"+ stringBuilder.toString();
	}
	
	@GetMapping("/update")
	public String getUpdateGameForm(@ModelAttribute("UpdateGame") Game game, @RequestParam("id") String gameId, Model model) {
		System.out.println("game Id : " +gameId);
		Game gameById = gameService.readGameById(gameId);
		model.addAttribute("game",gameById);
		
		
		return "/Game/updateGame";
	}
	
	@PostMapping("/update")
	public String submitUpdateGameForm(@ModelAttribute("UpdateGame") Game game, HttpServletRequest request, Model model) {
		
		MultipartFile img = game.getGameImage();
		
		System.out.println("포스트맵핑");
		System.out.println("game Id : " +game.getTeamId1());
		System.out.println(game);
		String saveName = img.getOriginalFilename();
		String save = request.getSession().getServletContext().getRealPath("/resources/images");
		File saveFile = new File(save,saveName);
		
		if(img!=null&&!img.isEmpty()) {
			try {
				img.transferTo(saveFile);
				game.setFileName(saveName);
			}
			catch(Exception e) {
				throw new RuntimeException("사진 등록 실패");
			}
		}
		
		gameService.setUpdateGame(game);
		return "redirect:/games";
		
	}
	
	@RequestMapping(value="/delete")
	public String getDeleteForm(Model model, @RequestParam("id")String gameId) {
		System.out.println("delete시작");
		System.out.println(gameId+"삭제됨!!!");
		gameService.setDeleteGame(gameId);
		return "redirect:/games";
	}
	
	

}

 

 

 

Domain

Game.java

package com.springmvc.domain;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.web.multipart.MultipartFile;

public class Game implements Serializable {
	
	private static final long serialVersionUID = -1774939428596054428L;
	
	private String gameId;  //게임아이디
	private String teamId1;  //팀아이디1 not null

	private String teamName1;  //팀명1 not null

	private String date;  //경기날짜
	private String userId;   //사용자 아이디
	private String userName;  //사용자 이름
	private String userNumber;   //사용자전화번호
	private String stadium;   //경기장
	private String fileName;
	private MultipartFile gameImage;
	private Match match;
	private List<Match> matches = new ArrayList<>();
	
	public List<Match> getMatches(){
		return matches;
	}
	
	public Game() {
		super();
		// TODO Auto-generated constructor stub
	}

	public String getFileName() {
		return fileName;
	}

	public void setFileName(String fileName) {
		this.fileName = fileName;
	}

	public MultipartFile getGameImage() {
		return gameImage;
	}

	public void setGameImage(MultipartFile gameImage) {
		this.gameImage = gameImage;
	}

	public String getGameId() {
		return gameId;
	}

	public void setGameId(String gameId) {
		this.gameId = gameId;
	}

	public String getTeamId1() {
		return teamId1;
	}

	public void setTeamId1(String teamId1) {
		this.teamId1 = teamId1;
	}

	

	public String getTeamName1() {
		return teamName1;
	}

	public void setTeamName1(String teamName1) {
		this.teamName1 = teamName1;
	}

	
	public String getDate() {
		return date;
	}

	public void setDate(String date) {
		this.date = date;
	}

	public String getUserId() {
		return userId;
	}

	public void setUserId(String userId) {
		this.userId = userId;
	}

	public String getUserName() {
		return userName;
	}

	public void setUserName(String userName) {
		this.userName = userName;
	}

	public String getUserNumber() {
		return userNumber;
	}

	public void setUserNumber(String userNumber) {
		this.userNumber = userNumber;
	}

	public String getStadium() {
		return stadium;
	}

	public void setStadium(String stadium) {
		this.stadium = stadium;
	}

	public Match getMatch() {
		return match;
	}

	public void setMatch(Match match) {
		this.match = match;
	}


	
}

 

Repository

GameRepository.java

package com.springmvc.repository;

import java.util.List;

import com.springmvc.domain.Game;

public interface GameRepository {

	List<Game> readAllGame();
	Game readGameById(String gameId);
	
	void setNewGame(Game game);
	void setUpdateGame(Game game);
	void setDeleteGame(String gameId);
}

 

 

 

 

GameRepositoryImpl.java

 

package com.springmvc.repository;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import com.springmvc.domain.Game;
import com.springmvc.domain.Match;

@Repository
public class GameRepositoryImpl implements GameRepository{

	
	private JdbcTemplate template;
	private List<Game> listOfGames = new ArrayList<Game>();
	
	@Autowired
	public void setJdbcTemplate(DataSource dataSource) {
		this.template = new JdbcTemplate(dataSource);
	}
	
	
	@Override
	public List<Game> readAllGame() {
	    String SQL = "SELECT * FROM game g left join matching m ON g.g_id = m.g_id";
	    Map<String, Game> gameMap = new HashMap<>();
	    
	    template.query(SQL, rs -> {
	        String gameId = rs.getString("g.g_id");
	        
	        // Game 객체가 이미 Map에 있는지 확인
	        Game game = gameMap.get(gameId);
	        if (game == null) {
	            // Map에 없다면 Game 객체 생성
	            game = new Game();
	            game.setGameId(gameId);
	            // 기존의 Game 속성 설정 코드
	            gameMap.put(gameId, game);
	        }
	        
	        game.setTeamId1(rs.getString("g.t_id1"));
	        game.setTeamName1(rs.getString("g.t_name1"));
	        game.setDate(rs.getString("g.g_date"));
	        game.setUserId(rs.getString("g.userid"));
	        game.setUserName(rs.getString("g.username"));
	        game.setUserNumber(rs.getString("g.userphone"));
	        game.setStadium(rs.getString("g.g_stadium"));
	        game.setFileName(rs.getString("g.g_filename"));
	        
	        // Match 객체 생성 및 설정
	        Match match = new Match();
	        match.setTeamId(rs.getString("m.t_id"));
	        match.setTeamName(rs.getString("m.t_name"));
	        match.setUserId(rs.getString("m.userid"));
	        match.setUserName(rs.getString("m.username"));
	        match.setUserNumber(rs.getString("m.userphone"));
	        match.setFileName(rs.getString("m.g_filename"));
	        // 다른 Match 속성 설정 코드들...

	        // Game 객체에 Match 추가
	        game.getMatches().add(match);

	    });

	    return new ArrayList<>(gameMap.values());
	}

	@Override
	public Game readGameById(String gameId) {
		String SQL = "SELECT * FROM game g LEFT JOIN matching m ON g.g_id = m.g_id WHERE g.g_id = ?";
		Map<String, Game> gameMap = new HashMap<>();
	    
	    template.query(SQL, new Object[]{gameId}, rs -> {
	        String currentGameId  = rs.getString("g.g_id");
	        
	        // Game 객체가 이미 Map에 있는지 확인
	        Game game = gameMap.get(currentGameId );
	        if (game == null) {
	            // Map에 없다면 Game 객체 생성
	            game = new Game();
	            game.setGameId(currentGameId );
	            // 기존의 Game 속성 설정 코드
	            gameMap.put(currentGameId , game);
	        }
	        
	        game.setTeamId1(rs.getString("g.t_id1"));
	        game.setTeamName1(rs.getString("g.t_name1"));
	        game.setDate(rs.getString("g.g_date"));
	        game.setUserId(rs.getString("g.userid"));
	        game.setUserName(rs.getString("g.username"));
	        game.setUserNumber(rs.getString("g.userphone"));
	        game.setStadium(rs.getString("g.g_stadium"));
	        game.setFileName(rs.getString("g.g_filename"));
	        
	        // Match 객체 생성 및 설정
	        Match match = new Match();
	        match.setTeamId(rs.getString("m.t_id"));
	        match.setTeamName(rs.getString("m.t_name"));
	        match.setUserId(rs.getString("m.userid"));
	        match.setUserName(rs.getString("m.username"));
	        match.setUserNumber(rs.getString("m.userphone"));
	        match.setFileName(rs.getString("m.g_filename"));
	        // 다른 Match 속성 설정 코드들...

	        // Game 객체에 Match 추가
	        game.getMatches().add(match);
	    });     
	    return gameMap.get(gameId);
	}

	@Override
	public void setNewGame(Game game) {
		
		String SQL = "INSERT INTO game(g_id, t_id1, t_name1, g_date, userid, username, userphone, g_stadium, g_filename)"+"VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?)";
		template.update(SQL,game.getGameId(), game.getTeamId1(), game.getTeamName1(), game.getDate(), game.getUserId(), game.getUserName(), game.getUserNumber(), game.getStadium(),game.getFileName());
		
	}

	@Override
	public void setUpdateGame(Game game) {
		if(game.getFileName()!=null) {
			String SQL = "UPDATE game SET t_id1=?,t_name1=?,g_date=?,userid=?,username=?,userphone=?,g_stadium=?,g_filename=? WHERE g_id=?";
			template.update(SQL,game.getTeamId1(), game.getTeamName1(), game.getDate(), game.getUserId(),game.getUserName(),game.getUserNumber(),game.getStadium(),game.getFileName(),game.getGameId());
		}
		else if(game.getFileName()==null) {
			String SQL = "UPDATE game SET t_id1=?,t_name1=?,g_date=?,userid=?,username=?,userphone=?,g_stadium=? WHERE g_id=?";
			template.update(SQL, game.getTeamId1(), game.getTeamName1(), game.getDate(), game.getUserId(),game.getUserName(),game.getUserNumber(),game.getStadium(),game.getGameId());
		}
		
	}

	@Override
	public void setDeleteGame(String gameId) {
		String SQL = "DELETE FROM game WHERE g_id=?";
		this.template.update(SQL, gameId);
		
	}
	public void setTemplate(JdbcTemplate template) {
		this.template = template;
	}

}

 

 

 

 

 

Service

GameService.java

package com.springmvc.service;

import java.util.List;

import com.springmvc.domain.Game;

public interface GameService {

	List<Game> readAllGame();
	Game readGameById(String gameId);
	
	void setNewGame(Game game);
	void setUpdateGame(Game game);
	void setDeleteGame(String gameId);
}

 

 

 

GameServiceImpl.java

package com.springmvc.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.springmvc.domain.Game;
import com.springmvc.repository.GameRepository;

@Service
public class GameServiceImpl implements GameService{

	@Autowired
	GameRepository gameRepository;
	
	@Override
	public List<Game> readAllGame() {
		// TODO Auto-generated method stub
		return gameRepository.readAllGame();
	}

	@Override
	public Game readGameById(String gameId) {
		Game gameById = gameRepository.readGameById(gameId);
		return gameById;
	}

	@Override
	public void setNewGame(Game game) {
		gameRepository.setNewGame(game);
		
	}

	@Override
	public void setUpdateGame(Game game) {
		gameRepository.setUpdateGame(game);
		
	}

	@Override
	public void setDeleteGame(String gameId) {
		gameRepository.setDeleteGame(gameId);
		
	}

}

 

 

 

 


view

 

 

addGame.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>     
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>          
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<link href="<c:url value="/resources/css/bootstrap.min.css"/>"rel="stylesheet" />
<title>경기 등록</title>
</head>
<body>
   <h3>경기 등록 페이지</h3>
   <form:form modelAttribute="addGame" enctype="multipart/form-data">
      <!-- <p>  아이디 : <form:input path="gameId"/>  -->
      <p> 팀 아이디 : <form:input path="teamId1"/> <!-- path 는 DTO 객체의 변수 -->
      <p> 팀 이름 : <form:input path="teamName1"/>
      <p> 경기 날짜 : <form:input type="date" path="date"/>
      <p> 예약자 아이디 : <form:input path="userId"/>
      <p> 예약자 이름 : <form:input path="userName"/>
      <p> 전화번호 : <form:input path="userNumber"/>
      <p> 경기장 : <form:input path="stadium" />
      <p> 구단사진 : <form:input path="gameImage" type="file" class="form-control" />
         <input type="submit" value="등록"/>
   </form:form>
</body>
</html>

 

 

 

 

games.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<!DOCTYPE html>
<html>
<head>
<link href="<c:url value='/resources/css/bootstrap.min.css'/>"rel="stylesheet" />
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
   <c:forEach items="${list}" var="game">
      <div class="col-md-7">
         <h2> ${game.teamName1} vs  ${game.getMatches().get(0).teamName}</h2>
         <p> 경기 날짜 : ${game.date}
         <p> 경기장 : ${game.stadium}
         <a href="<c:url value='/games/game?id=${game.gameId}'/>" class="btn btn-success">상세보기</a>
      	 <a href="<c:url value='/match/add?id=${game.gameId}'/>" class="btn btn-success">매칭</a>
      	<a href="<c:url value='/match/delete?id=${game.gameId}'/>" class="btn btn-danger" onclick="return deleteConfirm('${game.gameId}')">매칭취소 &raquo;</a>
      </div>
   </c:forEach>   
</div>  
</body>
</html>

 

 

 

 

 

game.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>      
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div class="container">
      <div class="row">
         <div class="col-md-8">
                <h3>${game.gameId}</h3>
                <div>
                <img src="<c:url value='/resources/images/${game.fileName}'/>" alt="${game.teamName1} Image" width="50" height="50">
                <h2>${game.teamName1}</h2>
                <p>
                </div>vs 
                <div>
			    <c:forEach var="match" items="${game.matches}">
			    	<!--  <img src="<c:url value='/resources/images/${match.fileName}'/>" alt="${match.teamName} Image" width="50" height="50">-->
			        <img src="<c:url value='/resources/images/${match.fileName}'/>" style="width: 50" height="50"/>
			        <h2>${match.teamName}</h2>
			        <p>예약자 : ${match.userId }</p>
			    </c:forEach>
			    </div>
			    <p><b>경기일</b> : ${game.date}</p>
                <p><b>경기장</b> : ${game.stadium}</p>
                <p><b>예약자</b> : ${game.userId}</p>
                <p><b>전화번호</b> : ${game.userNumber}</p>
                <form:form name="addGame" method="put">
	               <a href="<c:url value="/games"/>"class="btn btn-secondary">목록 &raquo;</a>
	               <a href='<c:url value="/games/update?id=${game.gameId}"/>' class="btn btn-success">수정&raquo;</a>
	               <a href="<c:url value='/games/delete?id=${game.gameId}'/>" class="btn btn-danger" onclick="return deleteConfirm('${game.gameId}')">삭제 &raquo;</a>
	            </form:form>
	            <a href="<c:url value='/match/add?id=${game.gameId}'/>" class="btn btn-success">매칭</a>
	      		<a href="<c:url value='/match/update?id=${game.gameId}'/>" class="btn btn-success">매칭수정</a>
	      		<a href="<c:url value='/match/delete?id=${game.gameId}'/>" class="btn btn-danger" onclick="return deleteConfirm('${game.gameId}')">매칭취소 &raquo;</a>
                <%-- <div>
                    <!-- Output game images -->
                    <img src="<c:url value='/resources/images/${game.fileName}'/>" alt="${game.teamName1} Image" width="50" height="50">
                    <img src="<c:url value='/resources/images/${game.matches[0].fileName}'/>" alt="${game.matches[0].teamName1} Image" width="50" height="50">
                </div>
                <h2>${game.teamName1} vs ${game.matches[0].teamName}</h2>
                <br>
                <!-- Output game details -->
                <p><b>경기일</b> : ${game.date}</p>
                <p><b>경기장</b> : ${game.stadium}</p>
                <p><b>예약자</b> : ${game.userId}</p>
                <p><b>전화번호</b> : ${game.userNumber}</p>
                <br>
                <!-- Output matches -->
                <h4>Matches:</h4>
                <c:forEach var="match" items="${game.matches}">
                    <p>${match.teamName} - ${match.userName}</p>
                </c:forEach>
	            <form:form name="addGame" method="put">
	               <a href="<c:url value="/games"/>"class="btn btn-secondary">목록 &raquo;</a>
	               <a href='<c:url value="/games/update?id=${game.gameId}"/>' class="btn btn-success">수정&raquo;</a>
	               <a href="<c:url value='/games/delete?id=${game.gameId}'/>" class="btn btn-danger" onclick="return deleteConfirm('${game.gameId}')">삭제 &raquo;</a>
	            </form:form>
	            <a href="<c:url value='/match/add?id=${game.gameId}'/>" class="btn btn-success">매칭</a>
	      		<a href="<c:url value='/match/delete?id=${game.gameId}'/>" class="btn btn-danger" onclick="return deleteConfirm('${game.gameId}')">매칭취소 &raquo;</a> --%>
         </div>
      </div>
   </div>
</body>
</html>

 

 

 

 

 

 

updateGame.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<!DOCTYPE html>
<html>
<head>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3>수정 페이지</h3>
	<div class="col-md-4">
		<img src="<c:url value='/resources/images/${game.fileName}'/>" alt="image" style="width: 20%"/>
	</div>
	<form:form modelAttribute="UpdateGame" action="./update?id=${game.gameId}" class="form-horizontal" enctype="multipart/form-data" method="post">
		<p> 게임 아이디 : <form:input path="gameId" value="${game.gameId}" readonly="readonly"/>
		<p> 팀1 아이디 : <form:input path="teamId1" value="${game.teamId1}"/> <!-- path 는 DTO 객체의 변수 -->		
		<p> 팀1 이름 : <form:input path="teamName1" value="${game.teamName1}"/>	
		<p> 경기 날짜 : <form:input path="date" value="${game.date}"/>
		<p> 예약자 아이디 : <form:input path="userId" value="${game.userId}"/>
		<p> 예약자명 : <form:input path="userName" value="${game.userName}"/>
		<p> 예약자 번호 : <form:input path="userNumber" value="${game.userNumber}"/>
		<p> 경기장 : <form:input path="stadium" value="${game.stadium}"/>
		<div class="col-sm-10">
			이미지<form:input path="gameImage" type="file" class="form-control"/>
		</div>
		<div class="form-group row">
			<input type="submit" class="btn btn-primary" value="수정"/>
			<a href="<c:url value="/games"/>" class="btn btn-primary">취소</a>
		</div>
		${game }
	</form:form>

</body>
</html>

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday