-> 기존의 스프링에서는 xml로 빈을 설정했는데, 빈이 많아지면 xml 설정이 좀 복잡해진다. 그래서 스프링 3.0부터는 어노테이션과 빈을 섞어서 사용하는 방법이 나왔다.
패키지 이름을 지정하면 애플리케이션 실행 시 해당 패키지에서 어노테이션으로 지정된 클래스를 Bean으로 만들어준다
파일 위치
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/test/" />
<property name="suffix" value=".jsp"/>
</bean>
<!-- 클래스 레벨에 @RequestMapping을 처리한다 -->
<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/>
<!-- 메소드 레벨에 @RequestMapping을 처리 -->
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/>
<!-- com.spring 패키지 속 클래스에 어노테이션이 적용되도록 설정한다 -->
<context:component-scan base-package="com.spring"/>
</beans>
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
아래 두 표현식은 같은 느낌이라고 보면 된다
xml 로 표현시
<bean id = "mainController" class="com.spring.ex01.MainControler">
</bean>
java식으로 표현시
@Controller("mainController")
public class MainController {
실행문
}
코드
package com.spring.ex01;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
// 해당 클래스를 Bean으로 자동변환한다. 넘겨주는 빈의 id값은 괄호 안의 "mainController"
@Controller("mainController")
// @RequestMapping을 이용해 첫 번째 단계의 url 요청이 /test 이면 mainController 빈을 요청하겠다
@RequestMapping("/test")
public class MainController {
// @RequestMapping을 이용해 두 번째 단계의 url 요청이 /main1.do 라면 mainController 빈의 main() 메소드에게 요청
// 메소드 = RequestMethod.GET으로 지정시 GET방식으로 요청이 들어오면 해당 메소드가 호출
@RequestMapping(value="/main1.do" ,method=RequestMethod.GET)
public ModelAndView main1(HttpServletRequest request, HttpServletResponse response) throws Exception{
ModelAndView mav=new ModelAndView();
mav.addObject("msg","main1");
mav.setViewName("main");
return mav;
}
// @RequestMapping을 이용해 두 번째 단계의 url 요청이 /main2.do라면 mainController 빈의 main2() 메소드에게 요청
// method = RequestMethod.GET으로 지정시 GET방식으로 요청이 들어오면 해당 메소드가 호출
@RequestMapping(value="/main2.do" ,method = RequestMethod.GET)
public ModelAndView main2(HttpServletRequest request, HttpServletResponse response) throws Exception{
ModelAndView mav=new ModelAndView();
mav.addObject("msg","main2");
mav.setViewName("main");
return mav;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% request.setCharacterEncoding("UTF-8"); %>
<html>
<head>
<meta charset=UTF-8">
<title>결과 창</title>
</head>
<body>
<h1> 반갑습니다 </h1>
<h1> ${msg} 페이지 입니다~ </h1>
</body>
</html>
- 주소창에
http://localhost:8700/pro26/test/main1.do
로 요청시
- 주소창에
http://localhost:8700/pro26/test/main2.do
로 요청시
파일 추가
한글 깨짐 현장을 방지하기 위해, 한글 필터 기능을 설정한다
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<!-- 한글 깨짐 현상 없애기 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<!-- /* = 모든 것을 그렇게 처리하겠다 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- 여기까지가 한글깨짐 현상을 없애기 위해 필터링한것 -->
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
package com.spring.ex02;
public class LoginVO {
private String userID;
private String userName;
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;
}
}
method={RequestMethod.GET,RequestMethod.POST}
설정은 GET방식과 POST 방식을 모두 처리하도록 한다.@RequestMapping(...)
를 사용하면 한 메소드에 여러개의 요청 URL을 설정하여 동시에 호출할 수 있다.package com.spring.ex02;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
// 컨트롤러 빈을 자동으로 생성
@Controller("loginController")
public class LoginController {
// /test/loginForm.do와 /test/loginform2.do 로 요청이 들어오면 loginForm()을 호출한다
@RequestMapping(value = { "/test/loginForm.do", "/test/loginForm2.do" }, method = { RequestMethod.GET })
public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("loginForm");
return mav;
}
// GET방식와 POST 방식 요청시 모두 처리하겠다
@RequestMapping(value = "/test/login.do", method={RequestMethod.GET,RequestMethod.POST})
public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
mav.setViewName("result");
String userID = request.getParameter("userID");
String userName = request.getParameter("userName");
mav.addObject("userID", userID);
mav.addObject("userName", userName);
return mav;
}
}
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>로그인 창</title>
</head>
<body>
<form method="post" action="${contextPath}/test/login.do">
<table width="400">
<tr>
<td> 아이디 <input type="text" name="userID" size="10"></td>
</tr>
<tr>
<td> 이름 <input type="text" name="userName" size="10"></td>
</tr>
<tr>
<td>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</td>
</tr>
</table>
</form>
</body>
</html>
로그인창에서 전송된 id와 이름이 결과창에 나타나도록 result.jsp 작성
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<% request.setCharacterEncoding("utf-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>결과창</title>
</head>
<body>
<h1> 아이디 : ${userID}</h1>
<h1> 이름 : ${userName}</h1>
</body>
</html>
http://localhost:8700/pro26/test/loginForm.do
으로 실행시 로그인 창이 나온다
값을 넣고 로그인을 누르면
아래와 같이 받아온 값이 출력된다
@RequestParam
매개변수의 수가 많아지면 일일이 getParameter() 메소드를 이용하는 방법이 불편해진다. 이때 사용하는 것이 @RequestParam
눈여겨 볼 곳을 모양 차이이다
지금 사용하던 코드는
@RequestMapping(value = "", method={})
public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
mav.setViewName("result");
// 중간에 이런식으로 값을 받아오는 부분이 있었다.
String userID = request.getParameter("userID");
String userName = request.getParameter("userName");
mav.addObject("userID", userID);
mav.addObject("userName", userName);
return mav;
}
하지만 위와 같이하지 않고, 아래와 같이 어노테이션을 사용해서 작성해주면
public ModelAndView login2(
@RequestParam("userID") String userID,
@RequestParam("userName") String userName,
HttpServletRequest request, HttpServletResponse response) throws Exception {
내부 실행문에서
request.getParameter를 사용하지 않아도 된다.
전체 코드
package com.spring.ex02;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller("loginController")
public class LoginController {
@RequestMapping(value = { "/test/loginForm.do", "/test/loginForm2.do" }, method = { RequestMethod.GET })
public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("loginForm");
return mav;
}
// @RequestMapping(value = "/test/login.do", method={RequestMethod.GET,RequestMethod.POST})
// public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception {
// request.setCharacterEncoding("utf-8");
// ModelAndView mav = new ModelAndView();
// mav.setViewName("result");
// String userID = request.getParameter("userID");
// String userName = request.getParameter("userName");
// mav.addObject("userID", userID);
// mav.addObject("userName", userName);
//
// return mav;
// }
@RequestMapping(value = "/test/login2.do", method={RequestMethod.GET,RequestMethod.POST})
public ModelAndView login2(
// @RequestParam을 이용해서 매개변수가 userID이면 그 값을 변수 userID에 자동 설정
@RequestParam("userID") String userID,
// @RequestParam을 이용해서 매개변수가 userName이면 그 값을 변수 userName에 자동 설정
@RequestParam("userName") String userName,
HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
mav.setViewName("result");
/*
위와 같이 작성시 아래와 같은 getParameter()메소드를 사용할 필요가 없음
String userID = request.getParameter("userID");
String userName = request.getParameter("userName");
*/
System.out.println("userID : " + userID);
System.out.println("userName : " + userName);
mav.addObject("userID", userID);
mav.addObject("userName", userName);
return mav;
}
}
값 보내는 부분 login2.do로 수정
<form method="post" action="${contextPath}/test/login2.do">
모양은 같다. 첫 화면에서 값을 입력하고
가입하기로 넘기면 아래와 같이 잘 받아오는 모습을 볼 수 있다
콘솔에도 잘 찍힌다
userID는 required를 설정하지 않고
userName은 required를 true로 주고
email은 required를 false로 준다면?
public ModelAndView login2(
@RequestParam("userID") String userID,
@RequestParam(value="userName", required=true) String userName,
@RequestParam(value="email", required=false) String email,
HttpServletRequest request, HttpServletResponse response) throws Exception {
전체 코드
package com.spring.ex02;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller("loginController")
public class LoginController {
@RequestMapping(value = { "/test/loginForm.do", "/test/loginForm2.do" }, method = { RequestMethod.GET })
public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("loginForm");
return mav;
}
// @RequestMapping(value = "/test/login.do", method={RequestMethod.GET,RequestMethod.POST})
// public ModelAndView login(HttpServletRequest request, HttpServletResponse response) throws Exception {
// request.setCharacterEncoding("utf-8");
// ModelAndView mav = new ModelAndView();
// mav.setViewName("result");
// String userID = request.getParameter("userID");
// String userName = request.getParameter("userName");
// mav.addObject("userID", userID);
// mav.addObject("userName", userName);
//
// return mav;
// }
@RequestMapping(value = "/test/login2.do", method={RequestMethod.GET,RequestMethod.POST})
public ModelAndView login2(
@RequestParam("userID") String userID,
@RequestParam(value="userName", required=true) String userName,
@RequestParam(value="email", required=false) String email,
HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
mav.setViewName("result");
/*
위와 같이 작성시 아래와 같은 getParameter()메소드를 사용할 필요가 없음
String userID = request.getParameter("userID");
String userName = request.getParameter("userName");
*/
System.out.println("userID : " + userID);
System.out.println("userName : " + userName);
System.out.println("email : " + email);
mav.addObject("userID", userID);
mav.addObject("userName", userName);
return mav;
}
}
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>로그인 창</title>
</head>
<body>
<form method="post" action="${contextPath}/test/login2.do">
<!-- hidden 태그를 이용해 이메일 정보를 전송 -->
<input type="hidden" name="email" value="hong@test.com" />
<table width="400">
<tr>
<td> 아이디 <input type="text" name="userID" size="10"></td>
</tr>
<tr>
<td> 이름 <input type="text" name="userName" size="10"></td>
</tr>
<tr>
<td>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</td>
</tr>
</table>
</form>
</body>
</html>
실행창에 값 입력하고
hidden 설정으로 넣어놓은 이메일이 콘솔에 찍힌다
로그인 창에서 input 이메일을 주석처리하면
입력창에 로그인, 이름, 이메일 모두 값을 넣지 않았는데 이메일 부분만 빈 공간대신 null이 출력된 모습을 확인할 수 있다.
전송되는 매개변수의 수가 많을 경우 Map에 바로 저장해서 사용하면 편리할 수 있다
package com.spring.ex02;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller("loginController")
public class LoginController {
@RequestMapping(value = { "/test/loginForm.do", "/test/loginForm2.do" }, method = { RequestMethod.GET })
public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("loginForm");
return mav;
}
@RequestMapping(value = "/test/login3.do", method = { RequestMethod.GET, RequestMethod.POST })
public ModelAndView login3(
// 전송되는 매개변수의 이름을 key, 값을 value로 저장한다
@RequestParam Map<String, String> info,
HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
// Map에 저장된 (매개변수의 이름으로) 전달된 값을 가져온다
String userID = info.get("userID");
String userName = info.get("userName");
System.out.println("userID: "+userID);
System.out.println("userName: "+userName);
// @RequestParam에서 설정한 Map이름으로 바인딩
mav.addObject("info", info);
mav.setViewName("result");
return mav;
}
}
값을 info로 보냈으니, 결과창에서도 바인딩한 속성 이름으로 불러와야 한다
<h1> 아이디 : ${info.userID}</h1>
<h1> 이름 : ${info.userName}</h1>
값 보내는 부분 login3.do로 수정
<form method="post" action="${contextPath}/test/login3.do">
실행화면에서 값을 입력하면
잘 나옴
-> map으로 받았기 때문에 메소드에서 받는 부분은 하나처럼 보였지만, 이름/값으로 저장된 아이디와 이름이 잘 출력되었다.
이름:userID / 값:hong
일 때, @ModelAttribue로 LoginVO를 지정하면 전달 시 LoginVO의 속성 userID에 값 hong을 자동을 넣어(설정해)준다package com.spring.ex02;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller("loginController")
public class LoginController {
@RequestMapping(value = { "/test/loginForm.do", "/test/loginForm2.do" }, method = { RequestMethod.GET })
public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("loginForm");
return mav;
}
// @ModelAttribute를 이용해 전달되는 매개변수 값을 LoginVO 클래스 속 이름이 같은 속성에 자동으로 넣어줌
// addObject()를 이용할 필요 없이 info를 이용해 바로 jsp에서 loginVO속성에 접근할 수 있게 되는 것이다
@RequestMapping(value = "/test/login4.do", method = { RequestMethod.GET, RequestMethod.POST })
public ModelAndView login4(
@ModelAttribute("info") LoginVO loginVO,
HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
System.out.println("userID : " + loginVO.getUserID());
System.out.println("userName : " + loginVO.getUserName());
mav.setViewName("result");
return mav;
}
}
값 넘겨줄 부분 수정
<form method="post" action="${contextPath}/test/login4.do">
<h1> 아이디 : ${info.userID}</h1>
<h1> 이름 : ${info.userName}</h1>
<h1> 이메일 : ${info.email}</h1>
값을 넣고 보내면
에러
보니까 이메일 값을 안넘겨줘서 그렇다. 입력창을 따로 만들어 값을 보내지도 않았고, hidden으로 넘겨주는 값도 지워버려서. 그래서 result.jsp 에서 이메일을 받는<h1> 이메일 : ${info.email}</h1>
이 부분을 지워버리고 다시 실행 후 값 보내니
잘 나온다.
이메일 부분을 지우지 않고 LoginVO
부분에 이메일 getter/setter를 추가해 줘도 위의 에러는 해결된다.
email값 받을 수 있도록 변수 명시. getter/setter 설정
package com.spring.ex02;
public class LoginVO {
private String userID;
private String userName;
private String email;
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 getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
이메일 입력 부분 추가
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="contextPath" value="${pageContext.request.contextPath}"/>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>로그인 창</title>
</head>
<body>
<form method="post" action="${contextPath}/test/login4.do">
<table width="400">
<tr>
<td> 아이디 <input type="text" name="userID" size="10"></td>
</tr>
<tr>
<td> 이름 <input type="text" name="userName" size="10"></td>
</tr>
<tr>
<td> 이메일 <input type="text" name="email"> </td>
</tr>
<tr>
<td>
<input type="submit" value="로그인">
<input type="reset" value="다시입력">
</td>
</tr>
</table>
</form>
</body>
</html>
<h1> 아이디 : ${info.userID}</h1>
<h1> 이름 : ${info.userName}</h1>
<h1> 이메일 : ${info.email}</h1>
첫화면에서 값을 입력하고 보내기
에러 없이 화면에 잘 출력된다
Model 클래스
package com.spring.ex02;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
@Controller("loginController")
public class LoginController {
@RequestMapping(value = { "/test/loginForm.do", "/test/loginForm2.do" }, method = { RequestMethod.GET })
public ModelAndView loginForm(HttpServletRequest request, HttpServletResponse response) throws Exception {
ModelAndView mav = new ModelAndView();
mav.setViewName("loginForm");
return mav;
}
@RequestMapping(value = "/test/login5.do", method = { RequestMethod.GET, RequestMethod.POST })
public String login5(
// 메소드 호출 시 Model 클래스 객체를 생성
Model model,
HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
// jsp에 전달할 데이터를 model에 addAttribute() 메소드를 이용해 바인딩
model.addAttribute("userID", "hong");
model.addAttribute("userName", "홍길동");
model.addAttribute("email", "asdf@gmail.com");
return "result";
}
}
<h1> 아이디 : ${userID}</h1>
<h1> 이름 : ${userName}</h1>
<h1> 이메일 : ${email}</h1>
폼 태그를 사용하지 않고 바로 http://localhost:8700/pro26/test/login5.do
실행하면 미리 설정해둔 값이 출력
@Autowired 로 Bean 주입하기
: xml에서 빈을 설정한 후, 애플리케이션이 실행될 때 빈을 주입해 사용하면 xml 파일이 복잡해지면서 사용 및 보수, 관리가 불편해진다
<?xml version="1.0" encoding="UTF-8"?>
<beans
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans">
<bean id="propertyPlaceholderConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>/WEB-INF/config/jdbc.properties</value>
</property>
</bean>
<bean id="dataSource"
class="org.apache.ibatis.datasource.pooled.PooledDataSource">
<property name="driver" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation"
value="classpath:mybatis/model/modelConfig.xml" />
<property name="mapperLocations" value="classpath:mybatis/mappers/*.xml" />
</bean>
<bean id="sqlSession"
class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory"></constructor-arg>
</bean>
</beans>
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:XE
jdbc.username=System
jdbc.password=hb0317vd
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID" version="3.0">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/config/action-mybatis.xml</param-value>
</context-param>
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- jsp경로를 test에서 member로 변경-->
<property name="prefix" value="/WEB-INF/views/member/" />
<property name="suffix" value=".jsp"/>
</bean>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="mapper.member">
<resultMap id="memResult" type="memberVO">
<result property="id" column="id" />
<result property="pwd" column="pwd" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="joinDate" column="joinDate" />
</resultMap>
<select id="selectAllMemberList" resultMap="memResult">
<![CDATA[
select * from t_member order by joinDate desc
]]>
</select>
<select id="selectName" resultType="String">
<![CDATA[
select name from t_member
where id = 'hong'
]]>
</select>
<select id="selectPwd" resultType="int" >
<![CDATA[
select pwd from t_member
where id = 'hong'
]]>
</select>
<select id="selectMemberById" resultType="memberVO" parameterType="String" >
<![CDATA[
select * from t_member
where
id=#{id}
]]>
</select>
<select id="selectMemberByPwd" resultMap="memResult" parameterType="int" >
<![CDATA[
select * from t_member
where
pwd = #{pwd}
]]>
</select>
<insert id="insertMember" parameterType="memberVO">
<![CDATA[
insert into t_member(id,pwd, name, email)
values(#{id}, #{pwd}, #{name}, #{email})
]]>
</insert>
<insert id="insertMember2" parameterType="java.util.HashMap">
<![CDATA[
insert into t_member(id,pwd, name, email)
values(#{id}, #{pwd}, #{name}, #{email})
]]>
</insert>
<update id="updateMember" parameterType="memberVO">
<![CDATA[
update t_member
set pwd=#{pwd}, name=#{name}, email=#{email}
where
id=#{id}
]]>
</update>
<delete id="deleteMember" parameterType="String">
<![CDATA[
delete from t_member
where
id=#{id}
]]>
</delete>
<!-- 동적 SQL문 -->
<select id="searchMember" parameterType="memberVO" resultMap="memResult">
<![CDATA[
select * from t_member
]]>
<where>
<if test=" name != '' and name != null">
name=#{name}
</if>
<if test="email != '' and email != null ">
and email = #{email}
</if>
</where>
order by joinDate desc
</select>
<select id="foreachSelect" resultMap="memResult" parameterType="java.util.Map">
<!-- <include refid="a" /> -->
<![CDATA[
select * from t_member
]]>
where name in
<foreach item="item" collection="list" open="(" separator="," close=")" >
#{item}
</foreach>
order by joinDate desc
</select>
<insert id="foreachInsert" parameterType="java.util.Map">
<foreach item="item" collection="list" open="INSERT ALL" separator=" " close="SELECT * FROM DUAL" >
INTO t_member(id, pwd, name, email)
VALUES (#{item.id},
#{item.pwd},
#{item.name},
#{item.email})
</foreach>
</insert>
<!-- like 검색 -->
<select id="selectLike" resultMap="memResult" parameterType="String" >
<![CDATA[
select * from t_member
where
name like '%' || #{name} || '%'
]]>
</select>
</mapper>
<?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>
<typeAliases>
<typeAlias type="com.spring.member.vo.MemberVO" alias="memberVO" />
</typeAliases>
</configuration
package com.spring.member.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.dao.DataAccessException;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.spring.member.vo.MemberVO;
public interface MemberController {
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception;
public ModelAndView addMember(@ModelAttribute("info") MemberVO memberVO,HttpServletRequest request, HttpServletResponse response) throws Exception;
public ModelAndView removeMember(@RequestParam("id") String id, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
String id = request.getParameter("id")
-> @RequestParam("id") String id
@RequestMapping(value="/*Form.do", method=RequestMethod.GET)
-> 여러 요청에 대한 한 개의 메소드를 호출할 경우, 정규식을 이용해 매핑하는 역할
-> 즉, Form.do로 끝나는 모든 요청에 대해 동일한 메소드를 호출한다.
전체코드
package com.spring.member.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import com.spring.member.service.MemberService;
import com.spring.member.vo.MemberVO;
// @Controller를 이용해서 MemberControllerImpl 클래스에 대해 id가 memberController인 빈 자동 생성
@Controller("memberController")
public class MemberControllerImpl implements MemberController {
// Autowired를 이용해 id가 memberService 인 빈을 자동 주입한다
@Autowired
private MemberService memberService;
// Autowired를 이용해 id가 memberVO인 빈을 자동 주입한다
@Autowired
private MemberVO memberVO ;
@Override
// /member/listMembers.do = 두 단계로 요청시 바로 해당 메소드를 호출하도록 매핑
@RequestMapping(value="/member/listMembers.do" ,method = RequestMethod.GET)
public ModelAndView listMembers(HttpServletRequest request, HttpServletResponse response) throws Exception {
String viewName = getViewName(request);
List membersList = memberService.listMembers();
ModelAndView mav = new ModelAndView(viewName);
mav.addObject("membersList", membersList);
return mav;
}
@Override
@RequestMapping(value="/member/addMember.do" ,method = RequestMethod.POST)
public ModelAndView addMember(
// 회원 가입에서 전송된 회원 정보를 바로 MemberVO 객체에 전달하기
@ModelAttribute("member") MemberVO member,
HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
int result = 0;
// 설정된 memberVO 객체를 SQL문으로 전달해 회원 등록하기
result = memberService.addMember(member);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
}
@Override
@RequestMapping(value="/member/removeMember.do" ,method = RequestMethod.GET)
public ModelAndView removeMember(
// 전송된 ID를 변수 id에 넣어주기
@RequestParam("id") String id,
HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("utf-8");
memberService.removeMember(id);
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
}
// 정규식을 이용해 요청명이 Form.do로 끝나면 form()메소드 호출
@RequestMapping(value = "/member/*Form.do", method = RequestMethod.GET)
public ModelAndView form(HttpServletRequest request, HttpServletResponse response) throws Exception {
String viewName = getViewName(request);
ModelAndView mav = new ModelAndView();
mav.setViewName(viewName);
return mav;
}
private String getViewName(HttpServletRequest request) throws Exception {
String contextPath = request.getContextPath();
String uri = (String) request.getAttribute("javax.servlet.include.request_uri");
if (uri == null || uri.trim().equals("")) {
uri = request.getRequestURI();
}
int begin = 0;
if (!((contextPath == null) || ("".equals(contextPath)))) {
begin = contextPath.length();
}
int end;
if (uri.indexOf(";") != -1) {
end = uri.indexOf(";");
} else if (uri.indexOf("?") != -1) {
end = uri.indexOf("?");
} else {
end = uri.length();
}
String viewName = uri.substring(begin, end);
if (viewName.indexOf(".") != -1) {
viewName = viewName.substring(0, viewName.lastIndexOf("."));
}
if (viewName.lastIndexOf("/") != -1) {
viewName = viewName.substring(viewName.lastIndexOf("/"), viewName.length());
}
return viewName;
}
}
package com.spring.member.service;
import java.util.List;
import org.springframework.dao.DataAccessException;
import com.spring.member.vo.MemberVO;
public interface MemberService {
public List listMembers() throws DataAccessException;
public int addMember(MemberVO memberVO) throws DataAccessException;
public int removeMember(String id) throws DataAccessException;
}
package com.spring.member.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.spring.member.dao.MemberDAO;
import com.spring.member.vo.MemberVO;
// id가 memberService 빈을 자동 생성할 수 있도록 어노테이션 사용
@Service("memberService")
// 묶어서 실행하겠다는 어노테이션
@Transactional(propagation = Propagation.REQUIRED)
public class MemberServiceImpl implements MemberService {
// id가 memberDAO인 빈을 자동 주입
@Autowired
private MemberDAO memberDAO;
@Override
public List listMembers() throws DataAccessException {
List membersList = null;
membersList = memberDAO.selectAllMemberList();
return membersList;
}
@Override
public int addMember(MemberVO member) throws DataAccessException {
return memberDAO.insertMember(member);
}
@Override
public int removeMember(String id) throws DataAccessException {
return memberDAO.deleteMember(id);
}
}
package com.spring.member.dao;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;
import com.spring.member.vo.MemberVO;
// 해당 클래스를 DAO빈으로 자동 변환
@Repository("memberDAO")
public class MemberDAOImpl implements MemberDAO {
@Autowired
private SqlSession sqlSession;
@Override
public List selectAllMemberList() throws DataAccessException {
List<MemberVO> membersList = null;
membersList = sqlSession.selectList("mapper.member.selectAllMemberList");
return membersList;
}
@Override
public int insertMember(MemberVO memberVO) throws DataAccessException {
int result = sqlSession.insert("mapper.member.insertMember", memberVO);
return result;
}
@Override
public int deleteMember(String id) throws DataAccessException {
int result = sqlSession.delete("mapper.member.deleteMember", id);
return result;
}
}
package com.spring.member.vo;
import java.sql.Date;
import org.springframework.stereotype.Component;
// @Component : 스프링 컨테이너가 해당 클래스를 빈으로 자동 변환
@Component("memberVO")
public class MemberVO {
private String id;
private String pwd;
private String name;
private String email;
private Date joinDate;
public MemberVO() {}
public MemberVO(String id, String pwd, String name, String email) {
this.id = id;
this.pwd = pwd;
this.name = name;
this.email = email;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Date getJoinDate() {
return joinDate;
}
public void setJoinDate(Date joinDate) {
this.joinDate = joinDate;
}
}
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("UTF-8"); %>
<html>
<head>
<meta charset=UTF-8">
<title>회원 정보 출력창</title>
</head>
<body>
<table border="1" align="center" width="80%">
<tr align="center" bgcolor="lightgreen">
<td><b>아이디</b></td>
<td><b>비밀번호</b></td>
<td><b>이름</b></td>
<td><b>이메일</b></td>
<td><b>가입일</b></td>
<td><b>삭제</b></td>
</tr>
<c:forEach var="member" items="${membersList}">
<tr align="center">
<td>${member.id}</td>
<td>${member.pwd}</td>
<td>${member.name}</td>
<td>${member.email}</td>
<td>${member.joinDate}</td>
<td><a
href="${contextPath}/member/removeMember.do?id=${member.id }">삭제하기</a></td>
</tr>
</c:forEach>
</table>
<a href="${contextPath}/member/memberForm.do"><h1
style="text-align: center">회원가입</h1></a>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 가입창</title>
<style>
.text_center {
text-align: center;
}
</style>
</head>
<body>
<form method="post" action="${contextPath}/member/addMember.do">
<h1 class="text_center">회원 가입창</h1>
<table align="center">
<tr>
<td width="200"><p align="right">아이디</td>
<td width="400"><input type="text" name="id"></td>
</tr>
<tr>
<td width="200"><p align="right">비밀번호</td>
<td width="400"><input type="password" name="pwd"></td>
</tr>
<tr>
<td width="200"><p align="right">이름</td>
<td width="400"><p>
<input type="text" name="name"></td>
</tr>
<tr>
<td width="200"><p align="right">이메일</td>
<td width="400"><p>
<input type="text" name="email"></td>
</tr>
<tr>
<td width="200"><p> </p></td>
<td width="400"><input type="submit" value="가입하기"><input
type="reset" value="다시입력"></td>
</tr>
</table>
</form>
</body>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="contextPath" value="${pageContext.request.contextPath}" />
<% request.setCharacterEncoding("UTF-8"); %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원 정보 수정창</title>
<style>
.text_center {
text-align: center;
}
</style>
</head>
<body>
<form method="post" action="${contextPath}/member/modMember.do">
<h1 class="text_center">회원 정보 수정창</h1>
<table align="center">
<tr>
<td width="200"><p align="right">아이디</td>
<td width="400"><input type="text" name="id"></td>
</tr>
<tr>
<td width="200"><p align="right">비밀번호</td>
<td width="400"><input type="password" name="pwd"></td>
</tr>
<tr>
<td width="200"><p align="right">이름</td>
<td width="400"><p>
<input type="text" name="name"></td>
</tr>
<tr>
<td width="200"><p align="right">이메일</td>
<td width="400"><p>
<input type="text" name="email"></td>
</tr>
<tr>
<td width="200"><p> </p></td>
<td width="400"><input type="submit" value="수정하기"><input
type="reset" value="다시입력"></td>
</tr>
</table>
</form>
</body>
</html>
http://localhost:8700/pro26/member/listMembers.do
로 실행하면 전체 회원 창 출력
삭제하기 선택시 해당 컬럼 삭제
회원가입 선택시 정보 입력 창이 뜨고
값 입력후 가입하기 누르면 다시 전체 멤버 목록이 뜨면서, 방금 가입한 정보까지 잘 들어가 있는 걸 확인할 수 있었다.