일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Java
- oracle
- git
- CRUD
- 과정평가형
- 제약조건
- rownum
- Bootstrap
- alias
- 이클립스
- HTTP Status 500
- HTML
- sql developer
- tomcat
- jQuery
- HTTP Status 404
- ||
- 모조칼럼
- 성적프로그램
- github
- 부트스트랩
- 답변형 게시판
- SQL
- Oracle DB
- group by
- Oracle SQL
- JSP
- JavaScript
- 한글 인코딩
- distinct
초급의 끄적거림
[Spring] Spring 기본설정 / 기본 사용 방법 본문
1. Spring Framework
- 환경설정이 복잡하다
- 어노테이션 방식으로 구성할 수 있다
- MVC를 편하게 사용하도록 지원해줌
- Spring Legacy : 아무것도 없는 빈 페이지
- 패키지가 'com.mycompany.myapp' 처럼 라는 삼단으로 만들어져야 함
- request.getContextPath() 프로젝트 루트값 불러오는 것
- 라이브러리를 제대로 다운 받지 못하면 빨간 X → 인터넷이 연결되어 있어야 다운이 되면서 X가 사라짐 (미리 다운로드 받아둘 것)
- 필요한 라이브러리를 가지게 되면 자연스럽게 사라짐
- 원칙적으로 라이브러리를 넣기 위해서는 각자의 사이트에 가서 다운로드 받아야 했음
- Spring Framework는 repository 라는 곳에서 라이브러리를 한번에 관리함
- 다운로드 되어져 있는 라이브러리를 사용자가 관리할 수 있고 따로 USB에 가지고 다니며 사용 가능
- 설정이 복잡하다는 단점
- 개발하는데 좋기 위해 만들어진 패턴이고 배포할 때는 프로젝트를 .war배포
자주 쓰게 될 것
기존에 있는 라이브러리가 어디에 있는지 알려주는 것
- src\main\webapp\WEB-INF = WebContent 로 (view 단의 root 에 해당)
- web.xml
2. Maven 설정 파일의 생성
- 라이브러리 다운로드 장소
- Mavnen의 디폴트모습
- 경로에 맞춰서 'maven' 폴더 생성 (D:/java0514/maven)
- 아래의 settings를 'settings.xml'로 'D:/java0514/maven' 경로에 저장
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<localRepository>D:/java0514/maven</localRepository>
<interactiveMode>true</interactiveMode>
<usePluginRegistry>false</usePluginRegistry>
<offline>false</offline>
<pluginGroups>
<pluginGroup>org.codehaus.mojo</pluginGroup>
</pluginGroups>
</settings>
- 디폴트값 쓰지 않고 위에서 만든 settings.xml 이 들어있는 폴더를 설정해줌
3. basicSpring 생성
- 프로젝트 이름은 의미 없음
- 위에서 maven 에 새로운 라이브러리 경로를 생성해주었기 때문에 새로운 Spring Project를 만들었을 때 maven 에 라이브러리가 자동적으로 생성됨
+) 정상적으로 했음에도 프로젝트에 빨간 X가 없어지지 않을 경우,
'프로젝트' 에서 우클릭 → 'Maven' → 'Update Project' 로 해결 가능
4. HomeController.java
- 결과확인 방법 : http://localhost:8090/basicspring/hello.do
- @RequestMapping 의 value를 hello.do 로 변경
- method의 get은 get방식을 말하는 것.
→ hello.do가 method가 get 방식으로 들어오면 아래의 내용을 실행하라는 것
package kr.co.basicspring;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/* 결과확인 방법
* http://localhost:8090/basicspring/hello.do
*/
@RequestMapping(value = "hello.do", method = RequestMethod.GET) //hello.do가 method가 get 방식으로 들어오면 아래의 내용을 실행하라는 것
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
return "home";
}
}
5. test01 패키지
5-1) CalcController 클래스 생성
사용자가 요청한 정보는 request에 들어감 → request 라는 내부객체가 필요함
request.getParameter("no1")
reqeust.getParameter("no2")
1. view 단으로 이동하기 위한 클래스
: Model, ModelAndView
2. view 페이지로 이동
: setViewName(" "); - 뷰 이름 설정
3. addObject(String name, Object value) & req.setAttribute("", ""_;
: 뷰에 전달할 값 추가, 공유 장소 req영역에 값을 올림
package kr.co.basicspring.test01;
import javax.servlet.http.HttpServletRequest;
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 //해당 클래스는 컨트롤러 기능이다
//스프링컨테이너 (서버)에서 자동으로 객체가 생성된다
public class CalcController {
//new CalcController() → 객체
public CalcController() {
System.out.println("-----CalcController() 객체 생성됨");
}//CalcController() end
//결과확인
//http://localhost:8090/basicspring/add.do?no1=5&no2=8
//@RequestMapping → 요청 명령어 등록 (add.do를 등록하기 위한 것)
// → 요청 명령어 등록 후 실행의 주체는 클래스 X, 메소드 O (한 개의 클래스 안에 여러 개의 메소드 가능)
// → 클래스를 만들 때마다 관리할 필요 없이 메소드만 수정하면 됨
//1) @RequestMapping(value="요청명령어", method=GET / POST)
@RequestMapping(value = "/add.do", method = RequestMethod.GET)
public ModelAndView add(HttpServletRequest req) { //value가 들어왔을 때 자동으로 add() 메소드가 실행
//사용자가 요청값 가져오기
int no1=Integer.parseInt(req.getParameter("no1"));
int no2=Integer.parseInt(req.getParameter("no2"));
System.out.println(no1);
System.out.println(no2);
int result=no1+no2;
//view단으로 이동하기 위한 클래스
//→ Model
//→ ModelAndView
// 둘 중 아무거나 써도 무방
ModelAndView mav=new ModelAndView();
//view 페이지로 이동
//servlet-context.xml 20행 → prefix (setViewName의 접두사, 종종 바뀌기도 함): /WEB-INF/views/
// 21행 → suffix (setViewName의 접미사): .jsp
// /WEB-INF/views/calcResult.jsp
mav.setViewName("calcResult"); //.jsp로
// 공유 장소 req영역에 값 올리기 (calcResult.jsp 에서도 사용해야하기 때문에 공유공간에 올리고 가야함)
req.setAttribute("msg", "<h1>두 수의 합</h1>");
req.setAttribute("img", "<img src='resources/images/add.png'>"); // servlet-context.xml 의 16행 resources 가 외부에서 불러오는 것들을 저장함
req.setAttribute("no1", no1);
req.setAttribute("no2", no2);
req.setAttribute("result", result);
return mav;
}//add() end
@RequestMapping(value = "/sub.do", method =RequestMethod.GET )
public ModelAndView sub(HttpServletRequest req) {
int no1=Integer.parseInt(req.getParameter("no1"));
int no2=Integer.parseInt(req.getParameter("no2"));
int result=no1-no2;
ModelAndView mav=new ModelAndView();
mav.setViewName("calcResult");
//공유공간 request영역에 값 올리기 (req.setAttribute() = mav.addObject())
mav.addObject("msg", "<h1>두 수의 차</h1>");
mav.addObject("img", "<img src='resources/images/sub.png'>"); // servlet-context.xml 의 16행 resources 가 외부에서 불러오는 것들을 저장함
mav.addObject("no1", no1);
mav.addObject("no2", no2);
mav.addObject("result", result);
return mav;
}//sub() end
@RequestMapping(value = "/mul.do", method = RequestMethod.GET)
public ModelAndView mul(HttpServletRequest req) {
int no1=Integer.parseInt(req.getParameter("no1"));
int no2=Integer.parseInt(req.getParameter("no2"));
int result=no1*no2;
ModelAndView mav=new ModelAndView();
mav.setViewName("calcResult");
//공유공간 reqeust영역에 값 올리기 (둘이 같은 의미이기 때문에 겹쳐서 사용)
mav.addObject("msg", "<h1>두 수의 곱</h1>");
mav.addObject("img", "<img src='resources/images/mul.png'>");
req.setAttribute("no1", no1);
req.setAttribute("no2", no2);
req.setAttribute("result", result);
return mav;
}//mul() end
@RequestMapping(value = "/div.do", method = RequestMethod.GET)
public ModelAndView div(HttpServletRequest req) {
int no1=Integer.parseInt(req.getParameter("no1"));
int no2=Integer.parseInt(req.getParameter("no2"));
int result=no1/no2;
ModelAndView mav=new ModelAndView();
mav.setViewName("calcResult");
//공유공간 reqeust영역에 값 올리기
mav.addObject("msg", "<h1>두 수의나누기</h1>");
mav.addObject("img", "<img src='resources/images/div.png'>");
req.setAttribute("no1", no1);
req.setAttribute("no2", no2);
req.setAttribute("result", result);
return mav;
}//div() end
//-------------------------------------------------------------------------------------
//2) 요청명령어를 처리하는 메소드의 매개변수의 유연성
//@RequestParam("요청변수명") 자료형 변수명
//→ 사용자가 요청한 값을 직접 변수에 저장가능하다
@RequestMapping("diff.do") // ← get post 방식이 정해지지 않고 생략된 경우, 상관 없이 get이든 post든 진행
public ModelAndView diff(@RequestParam ("no1") int a,
@RequestParam ("no2") int b) {
//두 수 사이의 차이
int result=Math.abs(a-b);
ModelAndView mav=new ModelAndView();
mav.setViewName("calcResult");
//공유공간 request영역에 값 올리기 (req.setAttribute() = mav.addObject())
mav.addObject("msg", "<h1>두 수의 차</h1>");
mav.addObject("no1", a);
mav.addObject("no2", b);
mav.addObject("result", result);
return mav;
}//diff() end
//------------------------------------------------------------------------------------------------------------
//3) 사용자가 요청한 값을 매개변수로 직접 저장가능하다
//→ 요청변수명과 매개변수명이 동일해야 함
@RequestMapping("max.do")
public ModelAndView max(int no1, int no2) {
//두 수 중 큰수
int result=Math.max(no1, no2);
ModelAndView mav=new ModelAndView();
mav.setViewName("calcResult");
//공유공간 request영역에 값 올리기 (req.setAttribute() = mav.addObject())
mav.addObject("msg", "<h1>두 수의 차</h1>");
mav.addObject("no1", no1);
mav.addObject("no2", no2);
mav.addObject("result", result);
return mav;
}//max() end
}//class end
5-2) calcResult.jsp
<%@ page language="java" contentType="text/html; charset=EUC-KR"
pageEncoding="EUC-KR"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>calcResult.jsp</title>
</head>
<body>
<h1>1) JSP</h1>
<%=request.getAttribute("msg") %>
숫자 1 : <%=request.getAttribute("no1") %><br>
숫자 2 : <%=request.getAttribute("no2") %><br>
결과 : <%=request.getAttribute("result") %><br>
<%=request.getAttribute("img") %>
<hr>
<h1>2) EL </h1>
${requestScope.msg }
숫자 1 : ${requestScope.no1 }<br>
숫자 2 : ${requestScope.no2 }<br>
결과 : ${requestScope.result }<br>
${requestScope.img }<br>
<hr>
<h1>3) EL </h1>
${msg }
숫자 1 : ${no1 }<br>
숫자 2 : ${no2 }<br>
결과 : ${result }<br>
${img==null ? "" : img}
</body>
</html>
기본 에노테이션
1) @Controller
: 접속자의 URL 요청을 처리하는 클래스라는 정의
: 접속자가 브라우정서 URL을 입력하여 접근시 주소에 해당하는 메소드를 구현하고, 데이터를 처리하여 JSP페이지로 이동하는 기능
: 주소에 해당하는 메소드 실행 / DTO, DAO 등 데이터 처리, JSP 페이지로 이동
2) @RequestMapping : 접속자의 요청주소에 따라 실행할 클래스나 메소드의 구분자로 사용
3) @RequestParam : <form> 태그에서 전송한 데이터의 접근
1) @RequestMapping (value="요청명령어", method=GET / POST)
2) 요청명령어를 처리하는 메소드의 매개변수의 유연성
@RequestParam("요청변수명") 자료형 변수명
3) 사용자가 요청한 값을 매개변수로 직접 저장 가능하다
6. bbs
- 입출력해주는 form
- WEB-INF\views\bbs
6-1) src/main/java\kr.co.basicspring.test02\BbsCont.java 생성
package kr.co.basicspring.test02;
import javax.servlet.http.HttpServletRequest;
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
public class BbsCont {
public BbsCont() {
System.out.println("----- BbsCont() 객체 생성됨");
}//BbsCont() end
//결과확인
//http://localhost:8090/basicspring/bbs/create.do
/* 1)
@RequestMapping(value = "bbs/create.do", method = RequestMethod.GET)
public ModelAndView bbsForm () {
ModelAndView mav=new ModelAndView();
mav.setViewName("bbs/bbsForm");
return mav;
}//bbsFrom() end
*/
//2) 단순히 페이지 이동만 할 때 많이 사용하는 방식
@RequestMapping(value = "bbs/create.do", method = RequestMethod.GET)
public String bbsForm() {
return "bbs/bbsForm";
}//bbsForm() end
//-----------------------------------------------------------------------------------------------------------------------------------
//동일한 요청명령어를 GET | POST방식으로 분리해서 호출가능
@RequestMapping(value = "bbs/create.do", method = RequestMethod.POST)
public ModelAndView bbsInt(HttpServletRequest req) {
String wname=req.getParameter("wname").trim();
String subject=req.getParameter("subject").trim();
String content=req.getParameter("content").trim();
String passwd=req.getParameter("passwd").trim();
ModelAndView mav=new ModelAndView();
mav.setViewName("bbs/bbsResult");
mav.addObject("wname", wname);
mav.addObject("subject", subject);
mav.addObject("content", content);
mav.addObject("passwd", passwd);
return mav;
}//bbsInt() end
}//class end
6-2) bbsForm.jsp (폼생성)
- 1)과 2)의 방식이 동일
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bbs/bbsForm.jsp</title>
</head>
<body>
<h3>* 글쓰기 *</h3>
<form name="bbsfrm"
method="post"
action="create.do">
<table border="1">
<tr>
<th>작성자</th>
<td><input type="text" name="wname" size="10" maxlength="20" required></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="subject" size="20" maxlength="100" required></td>
</tr>
<tr>
<th>내용</th>
<td>
<textarea rows="5" cols="30" name="content"></textarea>
</td>
</tr>
<tr>
<th>비밀번호</th>
<td><input type="password" name="passwd" size="10" maxlength="10" required></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="쓰기">
<input type="reset" value="취소">
</td>
</tr>
</table>
</form>
</body>
</html>
6-3) bbsResult.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bbs/bbsResult.jsp</title>
</head>
<body>
<h3> * 글쓰기 결과 *</h3>
작성자 : ${wname }<br>
제목 : ${subject }<br>
내용 : ${content }<br>
비밀번호 : ${passwd }<br>
</body>
</html>
* 아직 인코딩을 하지 않았기 때문에 한글이 깨져 나오게 됨!
7. 인코딩 서블릿 등록
MVC 버전은 encodefilter 를 작성하고 서블릿 등록을 해주었지만, spring에서는 서블릿 등록만 해주면 한글필터 통과
bbsCont.java
- 필터 인코딩을 서블릿에 등록하기 위해 bbsCont.java (현재 운영중인 controller)에 아래 코드를 import.
import org.springframework.web.filter.CharacterEncodingFilter;
web.xml
<!-- 한글 필터 등록 -->
<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>
8. 요청 명령어 매개변수 (parameter)가 DTO객체인 경우
8-1) BbsDTO 생성
package kr.co.basicspring.test02;
- 아래 칼럼으로 BbsDTO 를 생성하고 'getter'와 'setter' 생성
8-2) BbsCont.java
매개변수 (parameter)가 DTO 객체인 경우
→ 해당 클레스에 반드시 폼 컨트롤 요소 이름으로 되어 있는 멤버 변수와 각 getter와 setter 함수가 있어야 한다
@RequestMapping(value = "bbs/create.do", method=RequestMethod.GET)
public String bbsForm(){return "bbs/bbsForm";}
@RequestMapping(value = "bbs/create.do", method=RequestMethod.POST)
public ModelAndView bbsInt(BbsDTO dto) {
System.out.println("wname : "+dto.getWname());
System.out.println("subject : "+dto.getSubject());
System.out.println("content : "+dto.getContent());
System.out.println("passwd : "+dto.getPasswd());
ModelAndView mav=new ModelAndView();
mav.setViewName("bbs/bbsResult2");
//request영역에 dto 객체 올리기 (객체에 담은 bbsResult2 파일을 생성 후 테스트)
mav.addObject("dto", dto);
return mav;
}//bbsInt() end
8-3) bbsResult2.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>bbs/bbsResult2.jsp</title>
</head>
<body>
<h3>* 글쓰기 결과 *</h3>
작성자 : ${dto.wname }<br>
제목 : ${dto.subject }<br>
내용 : ${dto.content }<br>
비밀번호 : ${dto.passwd }<br>
</body>
</html>
'Framework > Spring' 카테고리의 다른 글
[Spring] 파일 다운로드/업로드 (수정, 삭제) (0) | 2019.10.20 |
---|---|
[Spring] 파일 다운로드/업로드 게시판 (등록, 목록, 상세보기) (0) | 2019.10.18 |
[Spring] 파일 업로드 게시판 (0) | 2019.10.17 |
[Spring] AJAX 2 / 아이디 중복확인 / 쿠키 생성 (0) | 2019.10.17 |
[Spring] maven / AJAX (0) | 2019.10.16 |