본문 바로가기

Dev/[Java]

[Spring] 8. Spring MVC

반응형

이제 J2EE로 넘어가서 Tomcat을 붙여볼것이다..

 

 

1) Spring MVC depedency 추가(메이븐 레포지토리에 Spring Web MVC검색)

 

 

 

 

2) web.xml 에 설정

  2-1) DispatcherServlet(Front Controller 역할) 을 서블릿 설정 (Contextloder 컨트롤쉬프트)

  2-2) Springbeans.xml 파일을 Tomcat이 인식할 수 있도록 설정(Listner를 활용할것이다.)

 

	<!-- needed for ContextLoaderListener -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:config/springbeans.xml</param-value>
	</context-param>

	<!-- Bootstraps the root web application context before servlet initialization -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>
	<!-- The front controller of this Spring Web application, responsible for 
		handling all application requests -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:config/springbeans.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

(전체 소스코드)

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
	id="WebApp_ID" version="4.0">
	<display-name>MySpringMVC</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>


	<!-- needed for ContextLoaderListener -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>classpath:config/springbeans.xml</param-value>
	</context-param>

	<!-- Bootstraps the root web application context before servlet initialization -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- The front controller of this Spring Web application, responsible for 
		handling all application requests -->
	<servlet>
		<servlet-name>springDispatcherServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>classpath:config/springbeans.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<!-- Map all requests to the DispatcherServlet for handling -->
	<servlet-mapping>
		<servlet-name>springDispatcherServlet</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>
	
	
	
	

	
	
	
	
	
	

</web-app>

 

 

3) Controller 클래스 작성

기본 생성자만 만들어 본 것이다..

 

@Repository
public class UserDAOImpl implements IUserDAO {

	
	@Autowired
	private UserMapper userMapper;
	
	public UserDAOImpl() {
		System.out.println("UserDAO 기본생성자 호출 됨...!");
	}
	

 

 

이후 서버를 가동해본다.

 

 

 

기본 생성자가 2번 호출되면 성공이다..

 

 

 

 

 

 

2번 생성되는 이유는

web.xml에서 아까 contextloader부분과, Dispatcher부분 두군데에 전부 springbeans.xml을 넣어주었기 때문이다.

이걸 이제 springbean.xml과 springbeans-web.xml로 나누고,

DAO는 springbean.xml에, 

Controller는 springbean-web.xml에 넣을것이다.

 

아래는 springbean-web.xml 을 생성하고 component-scan을 새로 넣어준 것이다..

포인트는 context:include/ context:exclude이다.

 

springbean에서도 호출하고, 여기서도 호출하면 결국 2개가 또 호출되것이다.

 

그래서 여기다가는 controller 쪽 거를 incluede해주고, DAO쪽 거를 exclude해줄 것이다.

 

springbean-web.xml 

<!--  DI전략2의 Component Auto Scanning 설정 -->
	<context:component-scan base-package="myspring.user" >
		<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
		<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
	</context:component-scan>

 

 

 

 

 

자 이제 이 프로젝트를 웹에 붙일것이다.

 

JSTL 라이브러리 의존성 주입 (POM.xml에 )

 

이후 전에 했던 JSP들을 가져온다

(cmd는 필요없으므로 지운다.)

 

 

 

패키지와 클래스를 새로만든다.

 

이제 여기다가 콘트롤러를 만들어줄것이다..

 

처음에 클래스 위에다가 @Controller 입력하면 스프링 프로젝트에서 알아서 인식한다..

이유는 springbeans.xml에다가 component scan하는 것에 패키지명을 넣어줬기때문이다.

이 하위 패키지는 다 인식한다.

@Controller
public class UserController {

 

이후 Select All 해본다.

여기서 중요한건 @RequestMapping 어노테이션에 URL을 적어주고,

ModelANdView를 리턴해주는것이다..

 

	
	@Autowired
	private IUserDAO dao;
    
	@RequestMapping("/userList.do")
	public ModelAndView getUserList() {
		List<UserVO> userList = dao.getUsers();
		
		return new ModelAndView("userList.jsp", "users", userList);
	}

 

 

Select User Detail 해볼것이다. 여기서 중요한건

1. GetMapping을 사용했다는 것,

2. 메서드 파라미터로 @RequestParam String이 쓰인것

3. 그냥 @RequestParam 과 같이 쓰려면  JSP의 Items 내용과,  해당 변수가 이름이 같아야한다. 아니라면

@RequestParam("id") 이런식으로 해줘야댄다.

	// 만약 @RequestParam 뒤의 매개변수가 UserList에서 넘어오는 쿼리스트링과 다르다면..
	// @RequestParam("id") 이런식으로 써줘야됨. 그러나 지금은 일치하므로 그냥 
	// @RequestParam String userid 로 가는것이다
	@GetMapping("/userDetail.do")
	public String getUser(@RequestParam String userid, Model model) {
		UserVO user = dao.getUser(userid);
		model.addAttribute("userOne", user);
		
		return "userDetail.jsp";
	}

 

 

insert를 해볼것이다. 

Getmapping 과 PostMapping을 유의해야한다.

 

insert

   @PostMapping("/userInsert.do")
public String userInsert(@ModelAttribute UserVO userVO) {
	int cnt = dao.insertUser(userVO);
	if(cnt > 0) {
		return "redirect:/userList.do";
	}
	else {
		return "redirect:/";
	}
}	
    
@GetMapping("/userInsert.do")
public String userInsertForm(Model model) {
	List<String> cityList = List.of("서울","경기","부산","제주","머구");
	model.addAttribute("cities", cityList);
	
	return "userInsert";
}
    

update

	@PostMapping("/userUpdate.do")
	public String userUpdate(@ModelAttribute UserVO user) {
		System.out.println("수정폼에서 전달받은 UserVO" + user);
		int cnt = dao.updateUser(user);
		System.out.println("수정폼에서 전달받은 !!!!!!!!!!!" + cnt);
		if(cnt > 0) {
			return "redirect:/userDetail.do?userid=" + user.getUserid();
		}
		else {
			return "redirect:/";
		}
	}
	
	@GetMapping("/userUpdate.do")
	public ModelAndView userUpdateForm(@RequestParam String userid) {
		List<String> cityList = List.of("서울","경기","부산","제주","머구");
		UserVO user = dao.getUser(userid);
		
		Map<String, Object> dataMap = new HashMap<>();
		dataMap.put("user", user);
		dataMap.put("cities", cityList);
		
		return new ModelAndView("userUpdate", "map", dataMap);
	}

 

Delete

	@GetMapping("/userDelete.do")
	public String userDelete(@RequestParam int id) {
		int cnt = dao.deleteUser(id);
		if(cnt > 0) {
			return "redirect:/userList.do";
		}
		else {
			return "redirect:/";
		}
	}

 

 

전체 소스코드

package myspring.user.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.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.servlet.ModelAndView;

import myspring.user.dao.IUserDAO;
import myspring.user.vo.UserVO;

@Controller
public class UserController {
	
	@Autowired
	private IUserDAO dao;
	
	public UserController() {
		System.out.println("UserController 기본 생성자 호출 됨 ..!!!");
	}
	
	@GetMapping("/userDelete.do")
	public String userDelete(@RequestParam int id) {
		int cnt = dao.deleteUser(id);
		if(cnt > 0) {
			return "redirect:/userList.do";
		}
		else {
			return "redirect:/";
		}
	}
	
	
	@PostMapping("/userUpdate.do")
	public String userUpdate(@ModelAttribute UserVO user) {
		System.out.println("수정폼에서 전달받은 UserVO" + user);
		int cnt = dao.updateUser(user);
		System.out.println("수정폼에서 전달받은 !!!!!!!!!!!" + cnt);
		if(cnt > 0) {
			return "redirect:/userDetail.do?userid=" + user.getUserid();
		}
		else {
			return "redirect:/";
		}
	}
	
	@GetMapping("/userUpdate.do")
	public ModelAndView userUpdateForm(@RequestParam String userid) {
		List<String> cityList = List.of("서울","경기","부산","제주","머구");
		UserVO user = dao.getUser(userid);
		
		Map<String, Object> dataMap = new HashMap<>();
		dataMap.put("user", user);
		dataMap.put("cities", cityList);
		
		return new ModelAndView("userUpdate", "map", dataMap);
	}
	
	@PostMapping("/userInsert.do")
	public String userInsert(@ModelAttribute UserVO userVO) {
		int cnt = dao.insertUser(userVO);
		if(cnt > 0) {
			return "redirect:/userList.do";
		}
		else {
			return "redirect:/";
		}
	}
	
	
	
	@GetMapping("/userInsert.do")
	public String userInsertForm(Model model) {
		List<String> cityList = List.of("서울","경기","부산","제주","머구");
		model.addAttribute("cities", cityList);
		
		return "userInsert";
	}
	
	// 만약 @RequestParam 뒤의 매개변수가 UserList에서 넘어오는 쿼리스트링과 다르다면..
	// @RequestParam("id") 이런식으로 써줘야됨. 그러나 지금은 일치하므로 그냥 
	// @RequestParam String userid 로 가는것이다
	@GetMapping("/userDetail.do")
	public String userDetail(@RequestParam String userid, Model model) {
		UserVO user = dao.getUser(userid);
		model.addAttribute("userOne", user);
		
		return "userDetail";
	}
	
	@RequestMapping("/userList.do")
	public ModelAndView userList() {
		List<UserVO> userList = dao.getUsers();
		
		return new ModelAndView("userList", "users", userList);
	}
	

}

 

 

 

JSP소스코드..

Index.jsp

userLIst.do가 호출되면 controller로 가서 어떻게 다시 다른 페이지로 가는지 보자..

Controller에서  ModelAndView를 Return 해주는 것을 볼 수 있다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ page import="java.util.Date"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>사용자 관리</h1>
	<%--
	Date date = new Date(); 
	out.println("스트림으로 출력한 현재 시간은 : " + date);
	--%>
	<ul>
		<li><a href="userList.do">1.사용자 리스트</a></li>

		<!-- 여기선 form을 뿌려준다.. -->
		<li><a href="userInsert.do">2.사용자 등록</a></li>
		
		<li><a href="userDetail.do">3. test</a></li>
	</ul>

</body>
</html>

 

 

userList.jsp

여기서는 삭제를 위해 자바스크립트를 썼다..

이 부분을 잘 보면될듯

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 목록</title>
<script type="text/javascript">
	function userDelete(id, userid){
		var result = confirm(userid + "사용자를 정말 삭제하시겠습니까?");
		
		if(result){
			location.href = "userDelete.do?id=" + id;
		}
		
	}
</script>
</head>
<body>
	<h2>사용자 목록</h2>
	<table>
		<tr>
			<th>순서</th>
			<th>사용자ID</th>
			<th>이름</th>
			<th>성별</th>
			<th>지역</th>
		</tr>

		<%-- 자바코드로 하면 이렇게된다.. --%>
		<%--
		List<UserVO> users = (List)request.getAttribute("users);
		for(int i=0;i<users.size();i++){
			UserVO user = users.get(i);
		}
		--%>

		<%-- JSTL로 하면 이렇게된다.. --%>
		<c:forEach var="user" items="${users}" varStatus="status">
			<tr>
				<td>${status.count}</td> <!-- <td>${user.id}</td> -->
				<td><a href = "userDetail.do?userid=${user.userid}">${user.userid}</a></td>
				<td>${user.name}</td>
				<%-- <td><a href="userDelete.do?id=${user.id}">삭제</a></td> --%>
				<td><a href="#" onclick="userDelete(${user.id},'${user.userid}')">삭제</a></td> 
			</tr>

		</c:forEach>
	</table>
</body>
</html>

 

 

userDetail.jsp

여기서는 수정할 때 id를 어떻게 넘겨주는지를 보자

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 상세</title>
</head>
<body>
	<h2>사용자 상세정보</h2>
	<table>
		<tr>
			<th>ID</th>
			<td>${userOne.id}</td>
		</tr>
		<tr>
			<th>user ID :</th>
			<td>${userOne.userid}</td>
		</tr>
		<tr>
			<th>name :</th>
			<td>${userOne.name}</td>
		</tr>
		<tr>
			<th>gender :</th>
			<td>${userOne.gender}</td>
		</tr>
		<tr>
			<th>city :</th>
			<td>${userOne.city}</td>
		</tr>
		<tr>
			<th>입고일자 :</th>
			<td><fmt:formatDate value="${userOne.regdate}"
					pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate></td>

			<!-- <td>${userOne.regdate}</td> -->
		</tr>
	</table>
	<hr>
	<%-- JSP떄는 이렇게 썼따.--%>
	<%--<a href="<%=request.getContextPath()%>/index.jsp">Home</a> --%>
	<a href="${pageContext.request.contextPath}/index.jsp">Home</a>
	<a href="${pageContext.request.contextPath}/userUpdate.do?userid=${userOne.userid}">수정</a>


</body>
</html>

 

userInsert.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
	<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 등록</title>
</head>
<body>
	<h2>사용자 등록</h2>
	<form method="post" action="userInsert.do">
		<table>
			<tr>
				<th>사용자 ID :</th>
				<td><input type="text" name="userid"></td>
			</tr>
			<tr>
				<th>사용자 이름 :</th>
				<td><input type="text" name="name"></td>
			</tr>
			<tr>
				<th>성별 :</th>
				<td><input type="radio" name="gender" value="남">남 <input
					type="radio" name="gender" value="여">여</td>
			</tr>
			<tr>
				<th>주소 :</th>
				<td>
					<select name="city">
						<c:forEach var="city" items="${cities}" >
								<option value="${city}">${city}</option>
						</c:forEach>
					</select>
				</td>
			</tr>
			<tr>
				<td colspan="2">
					<input type = "submit" value="등록">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>

 

 

 

 

 

 

updateUser.jsp

여기서는 choose, when과 같은 구문을 씀.

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>사용자 수정</title>
</head>
<body>
	<h2>사용자 수정</h2>
	<form method="post" action="userUpdate.do">
		<table>
			<tr>
				<th>사용자 ID :</th>
				<td>
					${map.user.userid} 
 					<input type="hidden" name="userid" value="${map.user.userid}"> 
				</td>
			</tr>
			<tr>
				<th>이름 :</th>
				<td>
					<input type="text" name="name" value="${map.user.name}">
				</td>
			</tr>
			<tr>
				<th>성별 :</th>
				<td>
					<c:choose>
						<c:when test="${map.user.gender eq '남' }">
							<input type="radio" name="gender" value="남" checked>남
							<input type="radio" name="gender" value="여">여
						</c:when>
						<c:when test="${map.user.gender eq '여' }">
							<input type="radio" name="gender" value="남">남
							<input type="radio" name="gender" value="여" checked>여
						</c:when>
					</c:choose>
				</td>
			</tr>
			<tr>
				<th>주소 :</th>
				<td>
					<select name="city">
						<c:forEach var="city" items="${map.cities}">
							<c:choose>
								<c:when test="${city eq map.user.city}">
									<option value="${city}" selected>${city}</option>
								</c:when>

								<c:otherwise>
									<option value="${city}">${city}</option>
								</c:otherwise>
							</c:choose>
						</c:forEach>
					</select>
				</td>
			</tr>
			<tr>
				<td colspan="2">
					<input type="submit" value="수정">
				</td>
			</tr>
		</table>
	</form>
</body>
</html>
반응형