이번시간은 어노테이션에 배워보았다.
객체를 생성할때 dispatcher-servlet.xml 에서 bean객체를 생성했다
이제는 어노테이션을 사용하면 dispatcher-servlet.xml 에서 객체 생성할 필요가 없다.
1. 객체 생성
- 어노테이션을 사용하지않을 때 : 컨트롤러는 일단 객체를 생성한다 -> 객체를 불러서 사용한다.
1. 어노테이션을 사용하면 위 순서를 행하지 않아도 된다.
- dispatcher-servlet.xml에 객체를 생성하지 않아도 된다.
- 컨트롤러에서 @Controller 작성 하면 된다.
-MainController 라는 이름으로 객체 생성
@Controller
public class MainController {
}
2. @Controller 이렇게만 쓰면 나중에 소스 합칠때 충돌남
그래서 구분작업이 필요하다
- main.Controller 로 객체 생성
- 이름은 사용자 정의 이다.
@Controller("main.mainController")
public class MainController {
}
2. 메서드 생성
1.기본 메소드 생성
접근 지정자는 public
리턴값은 String
기본적으로 가지고 있는 매개변수는 없다
필요한 것만 매개변수자리에 넣어서 사용하게 된다.
- 스프링이 알아서 가져다 주게 된다.
- @RequestMapping(value="/주소" , method={RequestMethod.GET/POST})
주소가 오게되면 하단 메서드가 실행된다. 메서드 방식은 GET 또는 POST 방식이다.
@RequestMapping(value="/demo/write.action",method={RequestMethod.POST})
public String write_ok(TestCommand command,HttpServletRequest request) throws Exception {
// 사용자가 보낸값을 받는방법 : 매개변수자리에적게되면 스프링이 알아서 가져다 준다.
String message = "이름 : " + command.getUserName();
message += "<br/>아이디 " + command.getUserId();
// 넘겨주기 위해서는 request가 필요하며 매개변수 자리에 요청한다.
request.setAttribute("message",message);
// anno 폴더의 result.jsp를 찾아가게 한다.
return "anno/result";
}
3. 어노테이션 사용 방법
package com.anno;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
//Controller : 1. 객체 생성 2. 상속 자동으로 됨
//RequestMapping : 해당 url로 이동하게 되면 메소드 방식에 따라서 MainController 메소드가 실행됨
@Controller("main.mainController") // 1. @Controller 만 쓰면 적당한 컨트롤러를 알아서 가져오라는게 가능
@RequestMapping(value="/main.action") // 2. 사용자가 /main.action를 쓰면 무조건 MainController이 실행된다. / 가상주소시
public class MainController {
// @Controller 하나가 MainController -> mainController <bean name="listFormController" class="com.test.ListFormController"> 이거처럼 객체 알아서 생성하라는 뜻임
// 즉 MainController main.mainController = new MainController();
// 나중 다른팀이 mainController 만들면 충돌이 일어남.. 그래서 ("이름") 이름을 써줘야 한다.(이름아무거나써도됨)
@RequestMapping(method=RequestMethod.GET) // 3. 넘어온 방식이 GET방식이면 밑에 method() 실행됨
public String method() { //method 의 이름으로 찾아가지 않는다 이름은 마음대로 주면됨
return "/main"; // main.jsp로 찾아감 앞에 / 필요없다 prefix해주니까
}
}
Annotation 이용하여 get방식과 post 방식을 사용하여 데이터를 전송
create.jsp 는 result.jsp로 이동
insert.jsp 는 result.jsp로 이동
save.jsp 는 result.jsp로 이동
위 방식으로 페이지가 이동될것임
result.jsp는 데이터를 출력할 사이트이며 공통적으로 사용될곳임
1. TestCommand 클래스 생성 ( 스프링에서의 DTO역할)
package com.anno;
public class TestCommand { // Spring의 dto
private String userId;
private String userName;
private String mode; // 댓글창 or 수정창 으로 쓸건가
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. TestMainController 클래스 생성
여기서는 @Controller 를 사용하여 객체를 생성하였다.
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 {
// wrtie.action 쳐서 GET방식으로 오면 write() 실행 , POST방식으로 오면 write_ok() 실행
// 이 주소가 오는데 get방식으로 오면 wrtie()를 get방식으로 자동으로 실행함
@RequestMapping(value="/demo/write.action", method= {RequestMethod.GET}) public String write() throws Exception {
// method(필요한걸써놓으면 스프링이 여기다가 갖다준다.)
return "anno/create"; // create.jsp를 띄어라 (get방식으로 가게됨) create.jsp와 TestController는 1:1 관계가 됨
}
// 로그인버튼누를때 from action = 보내는 주소랑 같아야 한다.
// 데이터는 TestCommand(DTO) 에 담겨서 오면 좋을것이다
@RequestMapping(value="/demo/wrtie.action",method = {RequestMethod.POST})
// 위주소가 오면 post방식일때 이 메서드 wrtie_ok()를 실행해라
public String write_ok(TestCommand command,HttpServletRequest request) { // 스프링이 사용자가 입력한 두개의 값을 TestCommand 를 넣어가지고 딱 가져다 준다 ( 객체를 자동으로 만들어준다 )
// 데이터가 command 에 담겨온다. command에 dto가 있다 라고 생각하면 된다.
String message = "아이디:" + command.getUserId();
message += ", 이름 : " + command.getUserName();
// 메시지를 넘기면 됨
// 기존에는 request를 써서 넘겼지만 여기서는 스프링한테 달라고 하면 된다.(매개변수를 참고한다)
request.setAttribute("message", message);
return "anno/result"; // anno폴더에 save.jsp로 이동 주소는 action으로 보임
}
// command
@RequestMapping(value="/demo/save.action",
method= {RequestMethod.GET,RequestMethod.POST}) // GET방식이나 POST방식으로 오게 되면
public String save(TestCommand command , HttpServletRequest request) throws Exception {
// get방식으로 왔으면
if(command==null||command.getMode()==null||
command.getMode().equals("")) {
// 처음실행할때 dto에 아무것도 없으므로
return "anno/save";
}
// dto가 null아니라면
String message = "이름: " + command.getUserName();
message += ", 아이디: " + command.getUserId();
// request필요 -> 매개변수에 추가
request.setAttribute("message", message);
return "anno/result";
}
// 여기서는 위의 2가지를 합쳐서 사용 insert.jsp -> result.jsp
// 위에서 command 한번에 받았는데 이번에는 하나하나 받음 - 예시로
// 하나하나 가져오는방법도 있다. (잘쓰이지않는다)
// 위주소로 /demo/insert.action GET방식이나 POST방식으로 오게 되면 insert() 무조건 실행
@RequestMapping(value="/demo/insert.action",
method= {RequestMethod.GET,RequestMethod.POST})
public String insert(TestCommand userId , String userName , String mode , HttpServletRequest request) throws Exception { // command(dto)로 안받고 하나하나 받을수있다.
if(mode==null||mode.equals("")) {
// 처음실행할때 mode에 아무것도 없으므로
return "anno/insert";
}
// dto가 null아니라면
String message = "이름: " + userName;
message += ", 아이디: " + userId;
// request필요 -> 매개변수에 추가
request.setAttribute("message", message);
return "anno/result";
}
}
3. 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>
create.jsp 페이지
create.jsp -> result.jsp 로 이동함
create.jsp 에서는 폼 태그를 사용하므로 post방식으로 데이터를 넘긴다.
<%@ 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="로그인"/>
</form>
</body>
</html>
// 로그인버튼누를때 from action = 보내는 주소랑 같아야 한다.
// 데이터는 TestCommand(DTO) 에 담겨서 오면 좋을것이다
@RequestMapping(value="/demo/wrtie.action",method = {RequestMethod.POST})
public String write_ok(TestCommand command,HttpServletRequest request) { // 스프링이 사용자가 입력한 두개의 값을 TestCommand 를 넣어가지고 딱 가져다 준다 ( 객체를 자동으로 만들어준다 )
String message = "아이디:" + command.getUserId();
message += ", 이름 : " + command.getUserName();
// 메시지를 넘기면 됨
// request가 없으니 스프링한테 달라고 하면됨 -> 매개변수에 추가
request.setAttribute("message", message);
return "anno/result"; // anno폴더에 save.jsp로 이동 주소는 action으로 보임
}
create.jsp 에서 result.jsp로 넘길때
TestController 클래스에 있는 wrtie메서드를 사용했다
@RequestMapping 은
/demo/wrtie.action 은 가상주소이므로 풀경로를 적어줘야 한다.
방식이 POST방식이면 anno 안의 create(jsp)로 이동하게 된다.
create.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="로그인"/>
</form>
</body>
</html>
위는 create.jsp의
로그인 버튼 누르면 <input> type에 submit를 줘서 action를 찾아가게 된다.
<from action="<%=cp %>/demo/write.action" method="post"> 위의 form을 통해 wrtie.action로 post방식으로 찾아감
// 로그인버튼누를때 from action = 보내는 주소랑 같아야 한다.
// 데이터는 TestCommand(DTO) 에 담겨서 오면 좋을것이다
@RequestMapping(value="/demo/wrtie.action",method = {RequestMethod.POST})
public String write_ok(TestCommand command,HttpServletRequest request) { // 스프링이 사용자가 입력한 두개의 값을 TestCommand 를 넣어가지고 딱 가져다 준다 ( 객체를 자동으로 만들어준다 )
String message = "아이디:" + command.getUserId();
message += ", 이름 : " + command.getUserName();
// 메시지를 넘기면 됨
// request가 없으니 스프링한테 달라고 하면됨 -> 매개변수에 추가
request.setAttribute("message", message);
return "anno/result"; // anno폴더에 save.jsp로 이동 주소는 action으로 보임
}
위에는 TestController 클래스에 있는 wrtie_ok메소드 인데
@RequestMapping 에 의해서
@RequestMapping(value="/demo/wrtie.action",method = {RequestMethod.POST})
form 에서 /demo/wrtie.action 으로 이동하면서 방식은 POST방식이므로
이 메소드가 실행되는 것이다.
스프링이 TestCommand 객체를 생성하고 command 에 데이터를 넣어서 보내준다 ( 자동으로 )
command.getUserId() 와 command.getUserName() 으로 받아온 데이터를 message 에 담고
setAttribute를 통해서 변수 message 에 담아서 보낸다.
마지막으로 return "anno/result" 으로 anno폴더에 있는 result.jsp로 이동시킨다.
위 방식은 포워딩 방식인데 우리눈에는 wrtie.action 으로 보이지만 실제 경로는 resut.jsp가 된다.
insert.jsp 에서 result.jsp 와 save.jsp를 하였다
방법은 위에와 다른점이 없다
save.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"/> <!-- mode 가 그 수정,입력 그거 같이 넘겨줘야함 -->
<input type="submit" value="로그인"/>
</form>
</body>
</html>
insert.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/insert.action" method="post">
아이디 : <input type="text" name="userId"/><br/>
이름 : <input type="text" name="userName"/><br/>
<input type="hidden" name="mode" value="insert"/><!-- mode 가 그 수정,입력 그거 같이 넘겨줘야함 -->
<input type="submit" value="로그인"/>
</form>
</body>
</html>
dispatcher-servlet.xml 에서 빈객체를 만들어주면서 해당하는 서블릿으로 경로를 주고 ModelAndView를 통해 해당하는 jsp로 이동시키는 무려 작업을 3번이상 했는데.
어노테이션을 쓰면서 코드량이 확실히 줄어들었다.
'BACKEND > 스프링 Spring' 카테고리의 다른 글
[spring2.5] 스프링 객체 생성 (0) | 2022.03.23 |
---|---|
[spring2.5] 게시판 만들기 (0) | 2022.03.23 |
[spring2.5] 스프링 간단한 예제(2) (0) | 2022.03.23 |
[spring2.5] 스프링 간단한 예제 (0) | 2022.03.23 |
[Spring2.5] 스프링 2.5 환경 설정 (0) | 2022.03.22 |