이제 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>
'Dev > [Java]' 카테고리의 다른 글
war로 배포하는 법 (0) | 2021.02.03 |
---|---|
[Spring] 9. Spring MVC 직접해보기 (0) | 2021.02.02 |
[Spring] 7. Mapper 써보기 (0) | 2021.02.01 |
[Spring] 5. Database Connection Pool (DBCP)써보기, MyBatis Spring (0) | 2021.02.01 |
[Spring] 4. DI전략 3단계 (0) | 2021.02.01 |