spring - 어노테이션 기능

오늘·2021년 6월 4일
0

웹 페이지 연습

목록 보기
26/35

스프링 어노테이션(Annotation)

-> 기존의 스프링에서는 xml로 빈을 설정했는데, 빈이 많아지면 xml 설정이 좀 복잡해진다. 그래서 스프링 3.0부터는 어노테이션과 빈을 섞어서 사용하는 방법이 나왔다.

  • 기존에 XML에서 Bean 설정에 해줬던 걸 어노테이션을 이용해 자바 코드에서 설정할 수 있다
  • 기능이 복잡해짐에 따라 xml 에서 설정하는 것보다 유지보수에 유리
  • 현재 어플리케이션 개발시 xml 설정 방법과 어노테이션 방식을 혼합해서 사용한다
  • 주로 xml은 스프링에서 지원해주는 클래스를 사용할때
  • @는 개발자가 설정하는 부분

어노테이션 제공 클래스

  1. DefaultAnnotationHandlerMapping : 클래스 레벨에서 @RequestMapping을 처리
  2. AnnotationMethodHandlerAdapter : 메소드 레벨에서 @RequestMapping을 처리

<context:component-scan> 태그 기능

패키지 이름을 지정하면 애플리케이션 실행 시 해당 패키지에서 어노테이션으로 지정된 클래스를 Bean으로 만들어준다

  • 사용형식 : `<context:component-scan base-package="패키지 이름" />
  • 여러가지 스테레오 타입 어노테이션

스프링 어노테이션을 이용해 url 요청 실습

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="/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>

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>
	</servlet>

	<servlet-mapping>
		<servlet-name>action</servlet-name>
		<url-pattern>*.do</url-pattern>
	</servlet-mapping>

</web-app>

MainController.java

아래 두 표현식은 같은 느낌이라고 보면 된다

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;
	}
}

main.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"  %>
<%  request.setCharacterEncoding("UTF-8"); %>    

<html>
<head>
<meta charset=UTF-8">
<title>결과 창</title>
</head>
<body>
	<h1> 반갑습니다 </h1>
	<h1> ${msg} 페이지 입니다~ </h1>
</body>
</html>

실행

  1. 주소창에 http://localhost:8700/pro26/test/main1.do로 요청시
  1. 주소창에 http://localhost:8700/pro26/test/main2.do로 요청시

로그인 기능 요청 실습

파일 추가

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">
	
	<!-- 한글 깨짐 현상 없애기 -->
	<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>

LoginVO.java

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;
	}
}

LoginController.java

  • 스프링 어노테이션 기능을 이용해, 로그인 시 전송된 ID와 이름을 JSP에 출력하도록 하는 곳
  • 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;
	}
}

loginForm.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" %>
<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>

result.jsp

로그인창에서 전송된 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

@RequestParam
매개변수의 수가 많아지면 일일이 getParameter() 메소드를 이용하는 방법이 불편해진다. 이때 사용하는 것이 @RequestParam

LoginController.java 수정

눈여겨 볼 곳을 모양 차이이다

지금 사용하던 코드는
	@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;
	}
}

loginForm.jsp 수정

값 보내는 부분 login2.do로 수정
<form method="post" action="${contextPath}/test/login2.do">

실행

모양은 같다. 첫 화면에서 값을 입력하고

가입하기로 넘기면 아래와 같이 잘 받아오는 모습을 볼 수 있다

콘솔에도 잘 찍힌다


@RequestParam의 required 속성

  • required : 필수
  • @RequestParam 적용 시 required 속성을 생략하면 기본값은 true 이다.
  • required 속성을 true로 설정하면 메소드 호출 시 반드시 지정한 이름으로 매개변수를 전달해야 한다. (만약! 매개변수가 없다면 예외 발생)
  • required 속성을 false로 설정하면 메소드 호출 시 지정한 이름의 매개변수가 전달되면서 값을 저장하고, 없으면 null을 할당한다

LoginController.java 수정

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;
	}
}

loginForm.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" %>
<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이 출력된 모습을 확인할 수 있다.


@RequestParam을 이용해 Map에 값 설정

전송되는 매개변수의 수가 많을 경우 Map에 바로 저장해서 사용하면 편리할 수 있다

LoginController.java 수정

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;
	}
}

result.jsp 수정

값을 info로 보냈으니, 결과창에서도 바인딩한 속성 이름으로 불러와야 한다

	<h1> 아이디 : ${info.userID}</h1>
	<h1> 이름 : ${info.userName}</h1>

loginForm.jsp 수정

값 보내는 부분 login3.do로 수정

<form method="post" action="${contextPath}/test/login3.do">

실행

실행화면에서 값을 입력하면

잘 나옴

-> map으로 받았기 때문에 메소드에서 받는 부분은 하나처럼 보였지만, 이름/값으로 저장된 아이디와 이름이 잘 출력되었다.


@ModelAttribute

  • 해당 어노테이션을 이용해 전달되는 매개변수 값을 LoginVO 클래스와 이름이 같은 속성에 자동으로 설정
  • addObject()를 이용할 필요 없이 info를 이용해 바로 jsp에서 LoginVO속성에 접근할 수 있다.
  • 예를 들어 로그인창에서 전달된 매개변수가 이름:userID / 값:hong 일 때, @ModelAttribue로 LoginVO를 지정하면 전달 시 LoginVO의 속성 userID에 값 hong을 자동을 넣어(설정해)준다

LoginController.java 수정

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;
	}
}

loginForm.jsp 수정

값 넘겨줄 부분 수정

<form method="post" action="${contextPath}/test/login4.do">

result.jsp

	<h1> 아이디 : ${info.userID}</h1>
	<h1> 이름 : ${info.userName}</h1>
	<h1> 이메일 : ${info.email}</h1>

실행

값을 넣고 보내면

에러

보니까 이메일 값을 안넘겨줘서 그렇다. 입력창을 따로 만들어 값을 보내지도 않았고, hidden으로 넘겨주는 값도 지워버려서. 그래서 result.jsp 에서 이메일을 받는 <h1> 이메일 : ${info.email}</h1> 이 부분을 지워버리고 다시 실행 후 값 보내니

잘 나온다.

이메일 부분을 지우지 않고 LoginVO부분에 이메일 getter/setter를 추가해 줘도 위의 에러는 해결된다.

LoginVO.java 수정

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;
	}
}

loginForm.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" %>
<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>

result.jsp

	<h1> 아이디 : ${info.userID}</h1>
	<h1> 이름 : ${info.userName}</h1>
	<h1> 이메일 : ${info.email}</h1>

실행시

첫화면에서 값을 입력하고 보내기

에러 없이 화면에 잘 출력된다


Model 클래스 이용해서 값 전달

Model 클래스

  • 메소드 호출시 jsp로 값을 바로 바인딩 하여 전달 가능
  • 클래스 속 addAttribute() 메소드는 ModelAndView의 addObject()메소드와 같은 기능을 수행
  • 따로 "뷰 정보를 전달할 필요 없을 때" 사용하면 편리

LoginController.java 수정

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";
	}
}

result.jsp 수정

	<h1> 아이디 : ${userID}</h1>
	<h1> 이름 : ${userName}</h1>
	<h1> 이메일 : ${email}</h1>

실행

폼 태그를 사용하지 않고 바로 http://localhost:8700/pro26/test/login5.do 실행하면 미리 설정해둔 값이 출력


Autowired의 특징

@Autowired 로 Bean 주입하기
: xml에서 빈을 설정한 후, 애플리케이션이 실행될 때 빈을 주입해 사용하면 xml 파일이 복잡해지면서 사용 및 보수, 관리가 불편해진다

  • 기존 xml 파일에서 각각의 빈을 DI로 주입했던 기능을, 코드에서 어노테이션으로 자동 수행할 수 있게끔 만든다
  • @Autowired를 사용하면 "별도의 setter나 생성자가 없어도" 속성에 빈을 주입할 수 있다

실습하기 - 파일구조

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>

jdbc.properties

jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@localhost:1521:XE
jdbc.username=System
jdbc.password=hb0317vd

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">
	
	<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>

action-servlet.xml 수정

	<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>

회원 관리 기능 파일 구조

member.xml

<?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>

modelConfig.xml

<?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

회원 관리기능 자바, jsp 파일 구조

MemberControler.java

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;
}

MemberControllerImpl.java

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;
	}
}

MemberService.java

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;
}

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 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);
	}
}

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;

// 해당 클래스를 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;
	}
}

MemberVO.java

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;
	}

}

listMembers.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}" />
<%  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>

memberForm.jsp

<%@ 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>&nbsp;</p></td>
				<td width="400"><input type="submit" value="가입하기"><input
					type="reset" value="다시입력"></td>
			</tr>
		</table>
	</form>
</body>

modMember.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}" />
<%  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>&nbsp;</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 로 실행하면 전체 회원 창 출력

삭제하기 선택시 해당 컬럼 삭제

회원가입 선택시 정보 입력 창이 뜨고

값 입력후 가입하기 누르면 다시 전체 멤버 목록이 뜨면서, 방금 가입한 정보까지 잘 들어가 있는 걸 확인할 수 있었다.

0개의 댓글

관련 채용 정보