티스토리 뷰
- 스프링 2.5까지는 DI나 AOP 같은 기능은 따로 XML 파일로 설정한 후 애플리케이션에서 사용했다.
- 그러나 애플리케이션의 기능이 복잡해짐에 따라 XML 설정 파일의 내용도 복잡해졌고 관리에도 문제가 생기기 시작했다.
- 따라서 스프링 3.0부터는 DI 같은 자바 코드와 관련된 설정은 직접 코드에서 할 수 있게 애너테이션 기능을 제공한다.
- 현재 스프링 기반 애플리케이션에서는 XML에서 설정하는 방법과 애너테이션 기능을 사용하는 방법 두 가지를 혼합해서
사용하고 있다.
스프링 애너테이션 제공 클래스
- 스프링에서 애너테이션을 사용하려면 먼저 스프링에서 제공하는 애너테이션 관련 클래스를 XML 설정 파일에서
빈으로 설정해야 한다.
브라우저 URL 요청 처리 애너테이션 관련 클래스
클래스 | 기능 |
DefaultAnnotationHandlerMapping | 클래스 레벨에서 @RequestMapping을 처리한다. |
AnnotationMehtodHandlerAdapter | 메서드 레벨에서 @RequestMapping을 처리한다. |
<context:component-scan> 태그 기능
- <context:component-scan> 태그를 사용해 패키지 이름을 지정하면 애플리케이션 실행 시 해당 패키지에서
애너테이션으로 지정된 클래스를 빈으로 만들어 준다.
<context:component-scan base-package="패키지 이름" />
- 다음 표는 <context:component-scan> 태그로 지정한 패키지에 위치하는 클래스에 지정하는 여러 애너테이션이다.
애너테이션 | 기능 |
@Controller | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 컨트롤러 빈으로 자동 변환한다. |
@Service | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 서비스빈으로 자동 변환한다. |
@Repository | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 DAO 빈으로 자동 변환한다. |
@Component | 스프링 컨테이너가 component-scan에 의해 지정한 클래스를 빈으로 자동 변환한다. |
- 위 애너테이션이 설정된 클래스들은 실행 시 자동으로 빈으로 생성된다.
애너테이션 URL 요청
- 스프링 애너테이션 기능을 이용해 실습한다.
* web.xml
<?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> <!-- 값이 1 이상이면 톰캣 실행 시 DispatcherServlet을 미리 메모리에 로드한다. -->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
* action-servlet.xml
- 스프링에서 제공하는 DefaultAnnotationHandlerMapping과 AnnotationMethodHandlerAdapter 클래스의 빈을 설정한다.
- <contenxt:component-scan base-package="com.spring" /> 태그를 이용해 com.spring 하위 패키지에 애너테이션이
적용되도록 설정한다.
<?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="/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>
* MainController.java
- @Controller("mainController") 애너테이션은 주로 Controller 클래스에 위치해 빈을 만든다.
- @RequestMapping("/test")은 URL 요청 시 첫 번째 단계의 요청이 /test이면 mainController 빈에게 요청을 전달한다.
- 그리고 @RequestMapping(value="/main1.do", method=RequestMethod.GET)을 메서드에 위치시킨 후 각 요청을
구분하여 메서드를 호출한다.
package com.spring;
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("mainController") // @Controller 애너테이션을 이용해 MainController클래스를 빈으로 자동 변환한다. 빈 id는 mainController이다.
@RequestMapping("/test") // @RequestMapping을 이용해 첫 번째 단계의 URL요청이 /test이면 mainController 빈을 요청한다.
public class MainController {
// 두 번째 단계의 URL 요청이 /main1.do이면 mainController 빈의 main1() 메서드에게 요청한다. 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;
}
// 두 번째 단계의 URL 요청이 /main2.do이면 mainController 빈의 main2() 메서드에게 요청한다. 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;
}
}
* main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<%
request.setCharacterEncoding("utf-8");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
<h1>안녕하세요!</h1>
<h1>${msg }페이지입니다!</h1>
</body>
</html>
- 코드 작성 후 /test/main1.do와 /test/main2.do에 접속해 본다.
로그인 기능 구현
- 스프링 애너테이션을 이용해 로그인 기능을 구현해 본다.
- 먼저 실습 시 한글 꺠짐 현상을 방지하기 위해 web.xml에 한글 필터 기능을 설정한다.
* web.xml
<?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> <!-- 값이 1 이상이면 톰캣 실행 시 DispatcherServlet을 미리 메모리에 로드한다. -->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- 필터 적용 -->
<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>
</web-app>
* LoginController.java
- 스프링 애너테이션 기능을 이용해 로그인 시 전송된 ID와 이름을 JSP에 출력하도록 LoginController 클래스를 작성한다.
- method={RequestMethod.GET, RequestMethod.POST} 설정은 GET 방식과 POST 방식을 모두 처리할 수 있다.
- 또한 RequestMapping( ... )을 사용하면 한 메서드에 여러 개의 요청 URL을 설정하여 동시에 호출할 수 있다.
package com.spring;
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 req, HttpServletResponse res) 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 req, HttpServletResponse res) throws Exception{
req.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
mav.setViewName("result");
String userID = req.getParameter("userID");
String userName = req.getParameter("userName");
mav.addObject("userID",userID);
mav.addObject("userName",userName);
return mav;
}
}
* loginForm.jsp
<%@ 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 }" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="post" action="${contextPath }/test/login.do">
<table width="400px">
<tr>
<td>아이디 <input type="text" name="userID" size="10" / ></td>
</tr>
<tr>
<td>이름 <input type="text" name="userName" size="10" /></td>
</tr>
<tr align="center">
<td><input type="submit" value="결과 전송" /></td>
</tr>
</table>
</form>
</body>
</html>
* result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
<h1>아이디 : ${userID }</h1>
<h1>이름 : ${userName }</h1>
</body>
</html>
- /test/loginForm.do 또는 /test/loginForm2.do로 접근 시 로그인 페이지가 나타난다.
- 아이디와 이름 입력 후 [결과 전송] 버튼을 누르면 입력한 값들이 출력된다.
@RequestParam
- 지금까지는 브라우저에서 매개변수를 전송하면 getParameter() 메서드를 이용해 값을 얻었다.
- 그러나 전송되어 온 매개변수의 수가 많아지면 일일이 getParameter() 메서드를 이용하는 방법은 불편하다.
- 이번에는 @RequestParam 을 메서드에 적용해 쉽게 값을 얻는 방법은 알아본다.
- @RequestParam을 이용해 로그인창에서 전송받은 매개변수를 설정한 후 브라우저에서 매개변수를 전달하면
지정한 변수에 자동으로 값이 설정된다. 그러면 getParameter() 메서드를 사용하지 않아도 된다.
* LoginController.java
- login2 메서드를 작성한다. 이 메서드는 @RequestParam 애너테이션을 사용한다.
package com.spring;
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 {
// /test/loginForm.do와 /test/loginForm2.do로 요청 시 loginForm()을 호출한다.
@RequestMapping(value= {"/test/loginForm.do", "/test/loginForm2.do"}, method= {RequestMethod.GET})
public ModelAndView loginForm(HttpServletRequest req, HttpServletResponse res) 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 req, HttpServletResponse res) throws Exception{
req.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
mav.setViewName("result");
String userID = req.getParameter("userID");
String userName = req.getParameter("userName");
mav.addObject("userID",userID);
mav.addObject("userName",userName);
return mav;
}
// @RequestParam을 이용해 매개변수가 userID이면 그 값을 변수 userID에 자동으로 설정한다.
// @RequestParam을 이용해 매개변수가 userName이면 그 값을 변수 userName에 자동으로 설정한다.
@RequestMapping(value = "/test/login2.do", method= {RequestMethod.GET, RequestMethod.POST})
public ModelAndView login2(@RequestParam("userID") String userID, @RequestParam("userName") String userName,
HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
mav.setViewName("result");
/*
String id = request.getParameter("userID");
String name = request.getParameter("userName");
*/
System.out.println("userID : " + userID);
System.out.println("userName : " + userName);
mav.addObject("userID",userID);
mav.addObject("userName",userName);
return mav;
}
}
* loginForm.jsp
<%@ 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 }" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="post" action="${contextPath }/test/login2.do">
<table width="400px">
<tr>
<td>아이디 <input type="text" name="userID" size="10" ></td>
</tr>
<tr>
<td>이름 <input type="text" name="userName" size="10"/></td>
</tr>
<tr align="center">
<td><input type="submit" value="결과 전송" /></td>
</tr>
</table>
</form>
</body>
</html>
- /test/loginForm.do 또는 /test/loginForm2.do로 접근 시 로그인 페이지가 나타난다.
- 아이디와 이름 입력 후 [결과 전송] 버튼을 누르면 입력한 값들이 출력된다.
@RequestParam의 required 속성
- 로그인하는 경우 ID와 비밀번호 같은 정보는 반드시 컨트롤러에 전달되어야 한다.
- @RequestParam의 required 속성을 이용하면 반드시 전달해야 하는 필수 매개변수인 경우와 그렇지 않은 경우를
설정할 수 있다.
- @RequestParam 적용 시 required 속성을 생략하면 기본값은 true 이다.
- requried 속성을 true로 설정하면 메서드 호출 시 반드시 지정한 이름의 매개변수를 전달해야 한다.(매개변수가
없으면 예외 발생) - required 속성을 false로 설정하면 메서드 호출 시, 지정한 이름의 메개변수가 전달되면 값을 저장하고, 없으면 null을 할당한다.
* LoginController.java
// required 속성을 생략하면 기본값은 true이며 필수적으로 전달되어야 한다.
@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");
/*
String id = request.getParameter("userID"); String name=
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;
}
@RequestParam을 이용해 Map에 매개변수 값 설정하기
- 전송되는 매개변수의 수가 많을 경우 일일이 변수를 지정해서 사용하려면 불편하다.
- 이번에는 전달되는 매개변수 값들을 Map에 저장해 본다.
- @RequestParam Map<String, String> info는 이름이 info인 Map에 매개변수 이름을 key로, 매개변수 값을
value로 저장하는 구문이다.
* LoginController.java
@RequestMapping(value="/test/login3.do", method = {RequestMethod.GET, RequestMethod.POST })
public ModelAndView login3(@RequestParam Map<String, String> info, HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
ModelAndView mav = new ModelAndView();
String userID = info.get("userID");
String userName = info.get("userName");
System.out.println("userID : " + userID);
System.out.println("userName : " + userName);
mav.addObject("info", info);
mav.setViewName("result");
return mav;
}
* loginForm.do
<%@ 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 }" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form method="post" action="${contextPath }/test/login3.do">
<table width="400px">
<tr>
<td>아이디 <input type="text" name="userID" size="10" ></td>
</tr>
<tr>
<td>이름 <input type="text" name="userName" size="10"/></td>
</tr>
<tr align="center">
<td><input type="submit" value="결과 전송" /></td>
</tr>
</table>
</form>
</body>
</html>
* result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
<h1>아이디 : ${info.userID }</h1>
<h1>이름 : ${info.userName }</h1>
</body>
</html>
@ModelAttribute를 이용해 VO에 매개변수 값 설정
- 이번에는 여러 개의 매개변수를 전달한다. 우선 @ModelAttribute를 이용해 VO 클래스의 속성에 매개변수 값이 자동으로 설정되도록 한다.
- @ModelAttribute("info") LoginVO loginVO는 전달된 매개변수에 대해 LoginVO 클래스 객체를 생성한다.
- 이어서 매개변수 이름과 같은 속성에 매개변수 값을 설정한 후 info 이름으로 바인딩한다.
- 예를 들어 로그인창에서 전달된 매개변수 이름이 userID이고, 값이 hong일 경우, @ModelAttribute로 LoginVO를
지정하면 전달 시 LoginVO의 속성 userID에 전달된 값 hong을 자동으로 설정해 준다.
* LoginController.java
// @ModelAttribute를 이용해 전달되는 매개변수 값을 LoginVO 클래스와 이름이 같은 속성에 자동으로 설정한다.
// addObject()를 이용할 필요 없이 info를 이용해 바로 JSP에서 LoginVO 속성에 접근할 수 있다. ( info라는 이름으로 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;
}
* LoginVO.java
package com.spring;
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;
}
}
* result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
<h1>아이디 : ${info.userID }</h1> // info로 바로 접근 가능
<h1>이름 : ${info.userName }</h1> // info로 바로 접근 가능
</body>
</html>
Model 클래스 이용
- Model 클래스를 이용하면 메서드 호출 시 JSP로 값을 바로 바인딩하여 전달할 수 있다.
- Model 클래스의 addAttribute() 메서드는 ModelAndView의 addObject() 메서드와 같은 기능을 한다.
- Model 클래스는 따로 뷰 정보를 전달할 필요가 없을 때 사용하면 편리하다.
* LoginController.java
@RequestMapping(value="/test/login5.do", method= {RequestMethod.GET, RequestMethod.POST})
public String login5(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception{
request.setCharacterEncoding("utf-8");
model.addAttribute("userID", "hong");
model.addAttribute("userName","홍길동");
return "result";
}
* result.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isELIgnored="false"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>결과</title>
</head>
<body>
<h1>아이디 : ${userID }</h1>
<h1>이름 : ${userName }</h1>
</body>
</html>
@Autowired
- XML에서 빈을 설정한 후 애플리케이션이 실행될 때 빈을 주입해서 사용하면 XML 파일이 복잡해지면서 사용 및 관리가
불편해진다.
- 현재 스프링에서는 @Autowired를 이용해서 개발자가 만든 클래스들의 빈을 직접 자바 코드에서 생성하여 사용한다.
- @Autowired의 특징
- 기존 XML 파일에서 각가의 빈을 DI로 주입했던 기능을 코드에서 애너테이션으로 자동으로 수행한다.
- @Autowired를 사용하면 별도의 setter나 생성자 없이 속성에 빈을 주입할 수 있다.
* Web.xml
- ContextLoaderListener를 이용해 애플리케이션이 실행될 때 action-mybatis.xml을 읽어 들이도록 설정한다.
<?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>
<servlet>
<servlet-name>action</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup> <!-- 값이 1 이상이면 톰캣 실행 시 DispatcherServlet을 미리 메모리에 로드한다. -->
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<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>
</web-app>
* action-servlet.xml
<?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="/views/member/" />
<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>
* action-mybatis.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>
* memberControllerImpl.java
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.MemberServiceImpl;
import com.spring.member.vo.MemberVO;
@Controller("memberController")
public class MemberControllerImpl{
// @Autowired를 이용해 id가 memberService인 빈을 자동 주입한다.
@Autowired
private MemberServiceImpl memberService;
// @Autowired를 이용해 id가 memberVO인 빈을 자동 주입한다.
@Autowired
MemberVO memberVO;
@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;
}
@RequestMapping(value="/member/addMember.do", method=RequestMethod.POST)
public ModelAndView addMember(@ModelAttribute("member") MemberVO member, HttpServletRequest request, HttpServletResponse response) throws Exception {
request.setCharacterEncoding("utf-8");
int result = 0;
result = memberService.addMember(member);
// 회원 정보 추가 후 ModelAndView 클래스의 redirect 속성을 이용해 /member/listMembers.do로 리다이렉트한다.
ModelAndView mav = new ModelAndView("redirect:/member/listMembers.do");
return mav;
}
@RequestMapping(value="/member/removeMember.do", method=RequestMethod.GET)
public ModelAndView removeMember(@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;
}
@RequestMapping(value="/member/*Form.do", method=RequestMethod.GET)
public ModelAndView memberForm(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();
}
//http://localhost:port/member/listMember.do로 요청시
int begin = 0; //
if(!((contextPath==null)||("".equals(contextPath)))){
begin = contextPath.length(); // 전체 요청명 의 길이를 구함
}
int end;
if(uri.indexOf(";")!=-1){
end=uri.indexOf(";"); //요청 uri에 ';'가 있을 경우 ';'문자 위치를 구함
}else if(uri.indexOf("?")!=-1){
end=uri.indexOf("?"); //요청 uri에 '?'가 있을 경우 '?' 문자 위치를 구함
}else{
end=uri.length();
}
//http://localhost:8090/member/listMember.do로 요청시 먼저 '.do'를 제거한 http://localhost:8090/member/listMember를 구한 후,
//다시 http://localhost:8090/member/listMember에서 역순으로 첫번째 '/' 위치를 구한 후, 그 뒤의 listMember를 구한다.
String fileName=uri.substring(begin,end);
if(fileName.indexOf(".")!=-1){
fileName=fileName.substring(0,fileName.lastIndexOf(".")); //요청명에서 역순으로 최초 '.'의 위치를 구한후, '.do' 앞에까지의 문자열을 구함
}
if(fileName.lastIndexOf("/")!=-1){
fileName=fileName.substring(fileName.lastIndexOf("/"),fileName.length()); //요청명에서 역순으로 최초 '/'의 위치를 구한후, '/' 다음부터의 문자열을 구함
}
return fileName;
}
}
* memberServiceImpl.java
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 com.spring.member.dao.MemberDAOImpl;
import com.spring.member.vo.MemberVO;
@Service("memberService")
public class MemberServiceImpl {
@Autowired
private MemberDAOImpl dao;
/*
public void setMemberDAO(MemberDAOImpl dao) { this.dao = dao; }
*/
public List listMembers() throws DataAccessException{
List membersList = dao.selectAllMemberList();
return membersList;
}
public int addMember(MemberVO memberVO) throws DataAccessException {
return dao.insertMember(memberVO);
}
public int removeMember(String id) throws DataAccessException {
return dao.deleteMember(id);
}
}
* memberDAOImpl.java
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;
@Repository("dao")
public class MemberDAOImpl {
@Autowired
private SqlSession sqlSession;
/*
* public void setSqlSession(SqlSession sqlSession) {
* this.sqlSession = sqlSession; }
*/
public List selectAllMemberList() throws DataAccessException {
List<MemberVO> membersList = null;
membersList = sqlSession.selectList("mapper.member.selectAllMemberList");
return membersList;
}
public int insertMember(MemberVO memberVO) throws DataAccessException {
int result = sqlSession.insert("mapper.member.insertMember", memberVO);
return result;
}
public int deleteMember(String id) throws DataAccessException {
int result = sqlSession.delete("mapper.member.deleteMember", id);
return result;
}
}
* MemberVO.java
package com.spring.member.vo;
import java.sql.Date;
import org.springframework.stereotype.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;
}
}
- 코드 작성 후 /member/listmembers.do 로 접근해 회원 정보 리스트가 출력되는지 확인한다.
'Spring' 카테고리의 다른 글
[Spring] 스프링 웹 프로젝트 생성하기 (0) | 2024.10.15 |
---|---|
[Spring]MyBatis 연동하기 (0) | 2024.08.17 |
[Spring]JDBC 연동 (0) | 2024.08.17 |
[Spring]스프링 MVC (0) | 2024.08.17 |
[Spring]의존성 주입 (0) | 2024.08.16 |
- Total
- Today
- Yesterday
- Network
- react
- 제이쿼리
- httpServletRequest
- 네트워크
- HTML
- javaserverpage
- 세션
- FMT
- Spring
- script element
- el
- 내장객체
- 스프링
- Redux
- 리액트
- Servlet
- a 태그
- html css
- Java Server Page
- Session
- Spring MVC
- Binding
- 미들웨어
- JSP
- nodejs
- CSS
- CSS 속성
- 서블릿
- 서브넷팅
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |