Dev/Spring

Spring2.5 - Annotation

창문닦이 2019. 4. 8. 15:33

Annotation

스프링을 사용하는 가장 큰 이유 중 하나. 코딩을 단순화 시키는 작업. 객체 생성이 단순해짐

1. Command 클래스 생성

2. JSP페이지 생성 - created.jsp, result.jsp

3. 어노테이션을 사용을 위해 정의 - dispatcher servlet

4. Controller 클래스 생성. 컨트롤러는 클래스이기 때문에 객체를 생성해야 사용이 가능.

어노테이션을 쓸 경우 디스팻처 서블릿에서 작성했던 bean객체를 할 필요가 없어짐

1. Command 클래스 생성

package com.anno;

public class TestCommand {//DTO

private String userId;

private String userName;

private String mode;

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 getMode() {

return mode;

}

public void setMode(String mode) {

this.mode = mode;

}

}

2-1. JSP페이지 생성 - created.jsp

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="<%=cp%>/demo/write.action" method="post">

아이디 : <input type="text" name="userId"/><br/>

이름 : <input type="text" name="userName"/><br/>

<input type="submit" value="로그인"/><br/>

 

</form>

 

</body>

 

</html>

2-2. JSP페이지 생성 - result.jsp

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

${message }

</body>

</html>

3. 어노테이션을 사용하겠다고 정의하는 것이 필요 - dispatcher servlet

어노테이션을 사용할 패키지를 작성해주면 된다. 하지만 대부분 사용할 경우 전체 프로젝트에서 사용함

<context:component-scan base-package="*" scoped-proxy="no"/>

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"

p:alwaysUseFullPath="true">

<property name="order" value="1"/>

</bean>

가상의 이름이지만 폴더의 이름을 쓰겠다는게 true (만약 서블릿 경로를 포함한 전체 경로를 이용해서 매핑 여부를 판단하도록 설정). 어노테이션을 가장 먼저 실행할 것이므로 order 프로퍼티를 1로 설정

 
어노테이션을 이용하여 컨트롤러를 구현할 때에는 요청 URL 매핑을 @RequestMapping 어노테이션을 이용하여 설정.
@RequestMapping 어노테이션을 알맞게 처리하기 위해서는 DefaultAnnotationHandlerMapping을 HandlerMapping으로 등록해야한다.
 
DispatcherServlet 이 사용하는 설정 파일에 별도의 HandlerMapping을 설정하지 않은 경우
▶ DispatcherServlet은 기본적으로 DefaultAnnotationHandlerMapping을 등록하므로 별도로 설정 파일에 명시하지 않아도 된다.
 
DispatcherServlet이 사용하는 스프링 설정 파일에 HandlerAdapter를 등록한 경우
 추가적으로 AnnotationMethodHandlerAdapter를 빈으로 등록해야 어노테이션을 이용하여 작성한 컨트롤러가 동작.
 
<context:component-scan base-package="*" scoped-proxy="no"/>
해당 태그를 이용하여 @Controller 어노테이션을 적용할 클래스를 자동으로 로딩할 수 있다.

4. Controller 클래스 생성

@Controller 어노테이션
클래스 타입에 적용되며, @Controller 어노테이션을 붙이면 해당 클래스를 웹 요청을 처리하는 컨트롤러로 사용할 수 있다.
@Controller 어노테이션이 적용된 클래스는 다른 클래스와 마찬가지로 <bean> 태그를 이용하여 스프링 빈으로 등록하면 된다.
 

컨트롤러 한 곳에서 매핑정보와 객체 생성 등 모두 정의하기 때문에 직관적이고 오류를 찾기 쉽다.

@Controller("anno.testController") 이 한줄로 인해 스프링이 테스트컨트롤러 클래스를 컨트롤러로 인지하고

<bean name="TestContorller" class="com.anno.TestContorller"/>로 객체 생성한것과 동일하다. 어노테이션으로 객체를 생성할 경우 팀으로 만들어 합칠떄 충돌하는 문제가 발생할 수 있음.

그래서 구분작업을 진행한다. 이름을 지정하는 것이 가능. “패키지명.원하는객체명”


@RequestMapping(value="/demo/write.action",method={RequestMethod.GET})

주소를 입력하게되면 주소를 찾아가서 어느 메소드를 실행해야되는지 작업해줄 것


package com.anno;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

//컨트롤러 객체생성

@Controller("anno.testController")

public class TestController {

 

//Get방식으로 이주소가 들어오면 write메소드를 찾아가라. 이게 하나의 세트

@RequestMapping(value="/demo/write.action",method={RequestMethod.GET})

public String write() throws Exception{//스프링은 매개변수가 필요할 경우 작성해주면 됨

//스트럿츠2는 메소드안에 변수를 받아오는 코드를 작성해주는 게 차이점.

return "anno/created"; //직관적으로 움직임

}

//주소가 동일하더라도 메소드방식이 다를경우 write_ok 메소드 실행.

//스프링에서는 메소드의 이름이 중요치 않음. 충돌만 나지 않으면 된다

//created.jsp에서 데이터가 전송될때 form태그안에 submit을 통해 항상 post로 전송됨을 기억

@RequestMapping(value="/demo/write.action",method={RequestMethod.POST})

public String write_ok(TestCommand command, HttpServletRequest request) throws Exception{

String message = "이름: "+ command.getUserName();

message += ",아이디: " + command.getUserId() ;

//반환값을 보내기 위해 request필요

request.setAttribute("message", message);

return "anno/result";

}

}

5. 실행 결과


GET방식과 POST방식을 합친 예시

1.test.jsp 생성

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="<%=cp%>/demo/save.action" method="post">

아이디 : <input type="text" name="userId"/><br/>

이름 : <input type="text" name="userName"/><br/>

<input type="hidden" name="mode" value="insert"/>

<input type="submit" value="로그인"/><br/>

</form>

</body>

</html>

2. 컨트롤러에 메소드 추가

//컨트롤러 객체생성

@Controller("anno.testController")

public class TestController {

//GET방식과 POST방식 둘다 하나의 메소드를 호출

@RequestMapping(value="/demo/save.action",method={RequestMethod.GET,RequestMethod.POST})

public String save(TestCommand command, HttpServletRequest request) throws Exception{

if(command==null||command.getMode()==null||command.getMode().equals("")){

return "anno/test";

}

String message = "이름: "+ command.getUserName();

message += ",아이디: " + command.getUserId() ;

request.setAttribute("message", message);

return "anno/result";

}

}

3. 실행 결과


Command가 아닌 일부 변수만 전송 가능

1. View 생성 (입력 JSP 페이지)

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<form action="<%=cp%>/demo/demo.action" method="post">

아이디 : <input type="text" name="userId"/><br/>

이름 : <input type="text" name="userName"/><br/>

<input type="hidden" name="mode" value="insert"/>

<input type="submit" value="로그인"/><br/>

</form>

</body>

</html>

2. Controller 생성

//컨트롤러 객체생성

@Controller("anno.testController")

public class TestController {

//Command 전체가 아니라 일부 파라미터만 사용하는 것도 가능하다

@RequestMapping(value="/demo/demo.action",method={RequestMethod.GET,RequestMethod.POST})

public String save(String userId, String userName,

String mode, HttpServletRequest request, HttpServletResponse response) throws Exception{

if(mode==null||mode.equals(""))

return "anno/demo";

 

String message = "이름: "+ userName;

message += ",아이디: " + userId ;

request.setAttribute("message", message);

return "anno/result";

}

}

3. 실행 페이지


 

@RequestMapping(value="/main.action", method={RequestMethod.GET}) 요청uri와 RequestMethod를 한꺼번에 혹은 따로 기재할 수 있다.

1. jsp페이지 생성

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<h1>메인화면이에요</h1>

<a href="<%=cp %>/demo/write.action">created</a>

<a href="<%=cp %>/demo/save.action">save</a>

<a href="<%=cp %>/demo/demo.action">demo</a>

</body>

</html>

 2. 컨트롤러 생성

RequestMapping을 한번에 작성할 수 있지만 원래는 나눠 작성.

ckage com.anno;

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestMethod;

@Controller

@RequestMapping(value="/main.action")

public class MainController {

 

@RequestMapping(method=RequestMethod.GET)

public String method(){

return "/main";

}

}

3. 실행 페이지