spring
스프링 프레임워크 : 자바로 만든 프로그램 툴, 전자정부표준 프레임워크, 스프링 부트(스프링프레임워크를 경량화)
spring MVC 동작원리
*클라이언트(유저, 사용자, 고객)
특정 서비스를 이용하는 사용자를 뜻하며, 서버로부터 다양한 데이터를 요청하는 주체.
*웹 브라우저 클라이언트
흔히 사용하는 인터넷. 크롬, 엣지, 파이어폭스 등
*서버
클라이언트로부터 요청받은 데이터를 찾아 넘겨주는 주체
사용자, 유저, 클라이언트 브라우저에 URL(주소) 입력
http://localhost:8080/myweb/
=> http가 요청정보를 가지고 localhost:8080 서버 찾아감
localhost:8080 서버에 /(모든페이지) 페이지 보고 싶다 요청
요청정보 들고 서버에 감(처리)
=> 1. 웹서버(아파치) 전달
=> 웹서버 안에 / 페이지 찾기 => 처리필요
=> 2. 웹 애플리케이션 서버(WAS,톰캣,웹컨테이너) 전달
=> 1) request(http가 들고온 요청정보를 저장),
response(서버 처리결과 응답정보를 저장)
기억장소 만들어줌(객체생성)
=> 2) src-main-webapp-WEB-INF-web.xml 참조 (설정 정보 확인) - source
가상주소 / 모든 가상 주소 -> 주소매핑하는 처리담당자 servlet(xml)연결
=> 3) /WEB-INF/spring/root-context.xml
servlet(명령 처리담당자) 호출
<context:component-scan base-package="cohttp://m.itwillbs.myweb" /> 폴더 @스캔
<annotation-driven /> 스캔한 @ 자동동작
@Controller 스캔(주소매핑)
@RequestMapping(value="/", method=RequestMethod.GET)
주소매핑 : 가상주소 뽑아와서 주소 비교해서 실제 페이지(자바 메소드) 연결
=> 4) /WEB-INF/spring/root-context.xml 호출
=> JAVA,JSP 명령을 처리하고 결과를 html변경 작업
(응답정보를 response에 저장)
=> response(응답정보)를 웹서버에 전달
=> response(응답정보)를 http에 전달
=> 응답정보를 사용자에게 전달
=> request, response, servlet 기억장소 해제
1. 요청 처리
클라이언트의 HTTP 요청이 DispatcherServlet에 도착. DispatcherServlet은 요청을 받아 적절한 컨트롤러에게 전달
2. Handler Mapping
요청 URL에 대응되는 컨트롤러를 찾음. 컨트롤러에 대한 매핑을 확인하여 적절한 핸틀러를 식별함
3. Controller Execution
DispatcherServlet이 적절한 컨트롤러를 찾으면 해당 컨트롤러를 실행. 컨트롤러는 비즈니스 로직을 처리하고 데이터를 준비
4.View Resolution
컨트롤러가 데이터를 처리하고 모델을 구성한 후, DispatcherServlet은 ViewResolver를 사용하여 이를 렌더링할 View를 결정
5. View Rendering
결정된 뷰는 데이터를 기반으로 HTML, JSON 등 응답을 생성. 이 응답은 클라이언트에게 반환
6. 응답 전송
DispatcherServlet은 생성된 응답을 클라이언트에게 반환
※DispatcherServlet은 스프링 MVC에서 전반적인 흐름을 제어하고 중앙집중식으로 요청 처리를 담당함으로서 개발자가 각 컨트롤러와 뷰의 상호작용에 집중할 수 있도록 함
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/root-context.xml</param-value>
</context-param>
<!-- Creates the Spring Container shared by all Servlets and Filters -->
<!-- 3) listener 서버에 연결되어지면 실행되는 파일 ContextLoaderListener 동작
Context 파일 호출 (/WEB-INF/spring/root-context.xml) -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Processes application requests -->
<!-- 2) servlet-name인 appServlet을 찾음
=> 스프링파일 DispatcherServlet(서블릿 지정) 연결
=> /WEB-INF/spring/appServlet/servlet-context.xml 서블릿 지정 -->
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 1) / 모든 주소, 모든 가상 주소가 들어오면 servlet-name인 appServlet을 찾으러 감 -->
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
<context-param>
기본적으로 제공해주는 설정파일 외에 사용자가 직접 컨트롤하는 XML 파일을 지정해주는 역할.
<listener>
스프링 설정 정보
<servlet>
DispatcherServlet이 모든 요청을 받고, 요청의 URL과 맵핑하는 Controller에 위임
<init-param>
초기화 매개변수를 정의하는 데 사용되는 요소
<servlet-mapping>
웹 애플리케이션에서 URL과 특정 서블릿 간의 매핑을 정의하는 데 사용. 이를 통해 클라이언트가 특정 URL에 대한 요청을 보내면 해당 요청이 처리될 서블릿을 결정할 수 있음
root-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
</beans>
servlet-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<!-- 2) 검색한 @을 자동으로 동작 -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<!-- 4) 이미지, css, js 경로 설정 src-main-webapp - /resources/ -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<!-- 3) jsp 경로 설정 접두사 : /WEB-INF/views/, 파일이름 ,접미사 : .jsp -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- 1) com.itwillbs.myweb 패키지를 스캔해서 → @(애노테이션)을 검색(찾기)
만약 다른 폴더를 만들면 추가해줘야함-->
<context:component-scan base-package="com.itwillbs.myweb" />
<context:component-scan base-package="com.itwillbs.controller" />
</beans:beans>
HomeController.java
package com.itwillbs.myweb;
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;
/**
* Handles requests for the application home page.
*
* @Controller : 주소매핑 파일
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*
* @RequestMapping : 자동으로 가상주소를 뽑아와서 value="/" 비교해서 일치 여부 확인,
* GET, POST 방식 확인 => 두 개 다 일치하면 아래에 있는 메소드가 자동으로 동작
*/
@RequestMapping(value = "/", method = RequestMethod.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(자바 request 역할/기능, 데이터를 담아서 jsp에 가지고 이동)
// => jsp에 들고가서 get하지 않고 바로 사용
model.addAttribute("serverTime", formattedDate );
//접두사/파일이름/접미사 설정
// /WEB-INF/views/home.jsp 주소 변경 없이 이동하는 방식(forword)
//return "redirect:home"; responseSendRedirect
return "home";
}
//http://localhost:8080/myweb/test 가상주소
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
// /WEB-INF/views/test.jsp 주소 변경 없이 이동하는 방식(forword)
return "test";
}
}//닫는 괄호
MemberController.java
package com.itwillbs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MemberController {
//member관련 들고오기
//가상주소 /member/insert → /WEB-INF/view/member/insert.jsp연결
//http://localhost:8080/myweb/member/insert 가상주소
@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {
// /insert → /WEB-INF/views/member/insert.jsp 주소 변경 없이 이동하는 방식(forword)
return "/member/insert";
}
//http://localhost:8080/myweb/member/insertPro 가상주소(POST 방식)
@RequestMapping(value = "/member/insertPro", method = RequestMethod.POST)
public String insertPro() {
System.out.println("MemberController insertPro()");
//회원가입처리
// /member/login 주소 변경하면서 이동(redirect:)
return "redirect:/member/login";
}
//가상주소 /member/login → /WEB-INF/view/member/login.jsp연결
@RequestMapping(value = "/member/login", method = RequestMethod.GET)
public String login() {
return "/member/login";
}
//http://localhost:8080/myweb/member/loginPro 가상주소(POST 방식)
@RequestMapping(value = "/member/loginPro", method = RequestMethod.POST)
public String loginPro() {
System.out.println("MemberController loginPro()");
//로그인 처리
// /member/main 주소 변경하면서 이동(redirect:)
return "redirect:/member/main";
}
//가상주소 /member/main → /WEB-INF/view/member/main.jsp연결
@RequestMapping(value = "/member/main", method = RequestMethod.GET)
public String main() {
return "/member/main";
}
//가상주소 /member/info → /WEB-INF/view/member/info.jsp연결
@RequestMapping(value = "/member/info", method = RequestMethod.GET)
public String info() {
return "/member/info";
}
//가상주소 /member/update → /WEB-INF/view/member/update.jsp연결
@RequestMapping(value = "/member/update", method = RequestMethod.GET)
public String update() {
return "/member/update";
}
//http://localhost:8080/myweb/member/updatePro 가상주소(POST 방식)
@RequestMapping(value = "/member/updatePro", method = RequestMethod.POST)
public String updatePro() {
System.out.println("MemberController updatePro()");
//회원가입처리
// /member/main 주소 변경하면서 이동(redirect:)
return "redirect:/member/main";
}
//가상주소 /member/delete → /WEB-INF/view/member/delete.jsp연결
@RequestMapping(value = "/member/delete", method = RequestMethod.GET)
public String delete() {
return "/member/delete";
}
//http://localhost:8080/myweb/member/deletePro 가상주소(POST 방식)
@RequestMapping(value = "/member/deletePro", method = RequestMethod.POST)
public String deletePro() {
System.out.println("MemberController deletePro()");
//회원가입처리
// /member/main 주소 변경하면서 이동(redirect:)
return "redirect:/member/login";
}
}//닫는 괄호
스프링
- 가상 주소 매핑(설계하기 나름) 기존 /insert.me → 스프링 /member/insert
- 객체 생성 방식(DI, 의존관계주입) → 스프링 버전 3(확인)
어려움... - JDBC
- 마이바티스 JDBC 설정 → 스프링 버전 4 이상
회원가입, 로그인, 게시판 - 파일업로드
파일 게시판, 갤러리게시판 - ajax
아이디 중복체크
가상주소매핑
가상주소/ → /WEB-INF/views/home.jsp 연결(HomeCotroller.java)
가상주소 /test → /WEB-INF/views/test.jsp 연결하기 실습
※/ 하나만 있을 때는 home.jsp
/내용 이 있을 때 내용.jsp로 이동
HomeController.java
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*
* @RequestMapping : 자동으로 가상주소를 뽑아와서 value="/" 비교해서 일치 여부 확인,
* GET, POST 방식 확인 => 두 개 다 일치하면 아래에 있는 메소드가 자동으로 동작
*/
@RequestMapping(value = "/", method = RequestMethod.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(자바 request 역할/기능, 데이터를 담아서 jsp에 가지고 이동)
// => jsp에 들고가서 get하지 않고 바로 사용
model.addAttribute("serverTime", formattedDate );
//접두사/파일이름/접미사 설정
// /WEB-INF/views/home.jsp 주소 변경 없이 이동하는 방식(forword)
//return "redirect:home"; responseSendRedirect
return "home";
}
//http://localhost:8080/myweb/test 가상주소
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
// /WEB-INF/views/test.jsp 주소 변경 없이 이동하는 방식(forword)
return "test";
}
}//닫는 괄호
test.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WEB-INF/views/test.jsp</title>
</head>
<body>
<h1>WEB-INF/views/test.jsp</h1>
gd
</body>
</html>
MVC Project했던 member, board 복사해서 views에 넣은 후 member-insert 주소 매핑해보기
가상주소 /insert → /WEB-INF/views/member/insert.jsp 연결
HomeController.java
@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {
// /insert → /WEB-INF/views/member/insert.jsp 주소 변경 없이 이동하는 방식(forword)
return "/member/insert";
}
src/main/java
com.itwillbs.myweb/MemberController.java
@Controller
public class MemberController {
//member관련 들고오기
//http://localhost:8080/myweb/member/insert 가상주소
@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {
// /insert → /WEB-INF/views/member/insert.jsp 주소 변경 없이 이동하는 방식(forword)
return "/member/insert";
}
}//닫는 괄호
HomeController.java에서 자르지 않으면 에러 발생
xml에서 스캔할 때부터 에러 발생하기 때문에 HomeController에서 지워줘야함.
스프링은 @먼저 스캔
MemberController.java 패키지를 변경하면 /member/insert 가 뜨지 않음.
servlet-context.xml에 <context:component-scan base-package="com.itwillbs.controller" /> 추가
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<!-- 2) 검색한 @을 자동으로 동작 -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<!-- 4) 이미지, css, js 경로 설정 src-main-webapp - /resources/ -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<!-- 3) jsp 경로 설정 접두사 : /WEB-INF/views/, 파일이름 ,접미사 : .jsp -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<!-- 1) com.itwillbs.myweb 패키지를 스캔해서 → @(애노테이션)을 검색(찾기)
만약 다른 폴더를 만들면 추가해줘야함-->
<context:component-scan base-package="com.itwillbs.myweb" />
<context:component-scan base-package="com.itwillbs.controller" />
</beans:beans>
member-파일.jsp 주소매핑
package com.itwillbs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MemberController {
//member관련 들고오기
//가상주소 /member/insert → /WEB-INF/view/member/insert.jsp연결
//http://localhost:8080/myweb/member/insert 가상주소
@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {
// /insert → /WEB-INF/views/member/insert.jsp 주소 변경 없이 이동하는 방식(forword)
return "/member/insert";
}
//가상주소 /member/login → /WEB-INF/view/member/login.jsp연결
@RequestMapping(value = "/member/login", method = RequestMethod.GET)
public String login() {
return "/member/login";
}
//가상주소 /member/main → /WEB-INF/view/member/main.jsp연결
@RequestMapping(value = "/member/main", method = RequestMethod.GET)
public String main() {
return "/member/main";
}
//가상주소 /member/info → /WEB-INF/view/member/info.jsp연결
@RequestMapping(value = "/member/info", method = RequestMethod.GET)
public String info() {
return "/member/info";
}
//가상주소 /member/update → /WEB-INF/view/member/update.jsp연결
@RequestMapping(value = "/member/update", method = RequestMethod.GET)
public String update() {
return "/member/update";
}
//가상주소 /member/delete → /WEB-INF/view/member/delete.jsp연결
@RequestMapping(value = "/member/delete", method = RequestMethod.GET)
public String delete() {
return "/member/delete";
}
}//닫는 괄호
list.jsp 수정
<!-- 231221 -->
<%@page import="java.util.ArrayList"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>member/list.jsp</title>
</head>
<body>
<h1>member/list.jsp</h1>
<h1>회원 목록</h1>
<c:if test="${empty sessionScope.id }">
<c:redirect url="login.me"/>
</c:if>
<c:if test="${! empty sessionScope.id }">
<c:if test="${! sessionScope.id == 'admin' }">
<c:redirect url="main.me"/>
</c:if>
</c:if>
<%
//로그인 표시 → 세션에서 "id"값을 가져와서 → String id 저장
// String id = (String)session.getAttribute("id");
%>
<%
//로그인 표시값이 있으면 login.jsp이동, 있으면 로그인표시값이 "admin"이 아니면 main.jsp이동
// if(id==null){
// response.sendRedirect("login.me");
// }else{
// if(!id.equals("admin")){
// response.sendRedirect("main.me");
// }
// }
//MemberDAO 객체생성
// MemberDAO memberDAO = new MemberDAO();
//ArrayList 자바 내장객체
//→ 배열(같은 기억장소를 여러 개 사용)에 단점(초기기억장소가 고정)울 보완한 자바 내장객체 배열
//→ 기억장소 10개 할당 → 데이터가 10개가 넘어가면 추가로 10개가 추가되어짐
//→ java.util.ArrayList
// ArrayList 데이터 개수 : .size()
// ArrayList 배열에 데이터 저장(순서대로 값이 저장) : .add(memberDTO 주소값)
// ArrayList 배열에 데이터 가져오기 : .get(순서)
//ArrayList<MemberDTO> 리턴할 형 getMemberList() 메소드 정의
//ArrayList<MemberDTO> memberList = getMemberList() 메소드 호출
// ArrayList<MemberDTO> memberList = memberDAO.getMemberList();
//request에서 값을 가지고 와서
// ArrayList<MemberDTO> memberList = (ArrayList<MemberDTO>)request.getAttribute("memberList");
%>
<c:set var="memberList" value="${requestScope.memberList }"/>
<table border="1">
<tr><td>아이디</td><td>비밀번호</td><td>이름</td><td>가입날짜</td></tr>
<%
// for(int i = 0; i < memberList.size(); i++){
// MemberDTO memberDTO = memberList.get(i);
%>
<%-- <tr><td><%=memberList.get(i).getId() %></td> --%>
<%-- <td><%=memberList.get(i).getpw() %></td> --%>
<%-- <td><%=memberList.get(i).getName() %></td> --%>
<%-- <td><%=memberList.get(i).getDate() %></td></tr> --%>
<%
// }
%>
<!-- 변수 배열 -->
<c:forEach var="memberDTO" items="${memberList }">
<tr><td>${memberDTO.id}</td>
<td>${memberDTO.pw}</td>
<td>${memberDTO.name}</td>
<td>${memberDTO.date}</td></tr>
</c:forEach>
</table>
</body>
</html>
현 위치, 절대 위치
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>member/insert.jsp</title>
</head>
<body>
<!--
가상 주소 : http://localhost:8080/myweb/member/insert
실제페이지(화면) : http://localhost:8080/myweb/member/insert.jsp
-->
<!--
<form action="member/insertPro" method="post">
현 위치 → http://localhost:8080/myweb/member/member/insertPro
-->
<!--
<form action="/member/insertPro" method="post">
절대위치 -> http://localhost:8080/member/insertPro
-->
<h1>member/insert.jsp</h1>
<h1>회원가입</h1>
<form action="/member/insertPro" method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pw"><br>
이름 : <input type="text" name="name"><br>
<input type="submit" value="가입">
</form>
</body>
</html>
Servers 탭
insert.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>member/insert.jsp</title>
</head>
<body>
<!--
가상 주소 : http://localhost:8080/myweb/member/insert
실제페이지(화면) : http://localhost:8080/myweb/member/insert.jsp
-->
<!--
<form action="member/insertPro" method="post">
현 위치 → http://localhost:8080/myweb/member/member/insertPro
-->
<!--
<form action="/member/insertPro" method="post">
절대위치 -> http://localhost:8080/member/insertPro
-->
<h1>member/insert.jsp</h1>
<h1>회원가입</h1>
<form action="<%=request.getContextPath() %>/member/insertPro" method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pw"><br>
이름 : <input type="text" name="name"><br>
<input type="submit" value="가입">
</form>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>member/insert.jsp</title>
</head>
<body>
<!--
가상 주소 : http://localhost:8080/myweb/member/insert
실제페이지(화면) : http://localhost:8080/myweb/member/insert.jsp
-->
<!--
<form action="member/insertPro" method="post">
현 위치 → http://localhost:8080/myweb/member/member/insertPro
-->
<!--
<form action="/member/insertPro" method="post">
절대위치 -> http://localhost:8080/myweb/member/insertPro
http://localhost:8080/프로젝트명/member/insertPro
-->
<h1>member/insert.jsp</h1>
<h1>회원가입</h1>
<form action="${pageContext.request.contextPath}/member/insertPro" method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pw"><br>
이름 : <input type="text" name="name"><br>
<input type="submit" value="가입">
</form>
</body>
</html>
insert - web.xml - servlet-context.xml - HomeController - MemberController - 만들어줘야함 * 반복
package com.itwillbs.myweb;
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;
/**
* Handles requests for the application home page.
*
* @Controller : 주소매핑 파일
*/
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
/**
* Simply selects the home view to render by returning its name.
*
* @RequestMapping : 자동으로 가상주소를 뽑아와서 value="/" 비교해서 일치 여부 확인,
* GET, POST 방식 확인 => 두 개 다 일치하면 아래에 있는 메소드가 자동으로 동작
*/
@RequestMapping(value = "/", method = RequestMethod.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(자바 request 역할/기능, 데이터를 담아서 jsp에 가지고 이동)
// => jsp에 들고가서 get하지 않고 바로 사용
model.addAttribute("serverTime", formattedDate );
//접두사/파일이름/접미사 설정
// /WEB-INF/views/home.jsp 주소 변경 없이 이동하는 방식(forword)
//return "redirect:home"; responseSendRedirect
return "home";
}
//http://localhost:8080/myweb/test 가상주소
@RequestMapping(value = "/test", method = RequestMethod.GET)
public String test() {
// /WEB-INF/views/test.jsp 주소 변경 없이 이동하는 방식(forword)
return "test";
}
}//닫는 괄호
login.jsp
<!-- 231218 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>member/login.jsp</title>
</head>
<body>
<h1>member/login.jsp</h1>
<h1>로그인</h1>
<form action="${pageContext.request.contextPath}/member/loginPro" method="post">
아이디 : <input type="text" name="id"><br>
비밀번호 : <input type="password" name="pw"><br>
<input type="submit" value="로그인">
</form>
</body>
</html>
update.jsp
<!-- 231219 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>member/update.jsp</title>
</head>
<body>
<h1>member/update.jsp</h1>
<h1>회원 정보 수정</h1>
<!-- 비밀번호가 맞는지 안맞는지를 먼저 확인한 후 이름만 수정 -->
<%
// request.setCharacterEncoding("utf-8");
// String id = (String)session.getAttribute("id");
// //자바 파일 MemberDAO 객체 생성
// MemberDAO memberDAO = new MemberDAO();
// System.out.println("MemberDAO의 기억장소 주소 : " + memberDAO);
// //MemberDTO memberDTO = MemberDAO의 기억장소 주소 .getMember(id) 메소드 호출
// MemberDTO memberDTO = memberDAO.getMember(id);
// System.out.println("리턴 받은 MemberDTO의 바구니 기억장소 주소 : " + memberDTO);
// MemberDTO memberDTO = (MemberDTO)request.getAttribute("memberDTO");
// if(memberDTO!=null){
%>
<!-- <form action="updatePro.me" method="post"> -->
<%-- 아이디 : <input type="text" name="id" value="<%=memberDTO.getId() %>" readonly><br> --%>
<!-- 비밀번호 : <input type="password" name="pw"> 비밀번호 입력 시 회원정보 수정<br> -->
<%-- 이름 : <input type="text" name="name" value="<%=memberDTO.getName() %>"><br> --%>
<%
// }
%>
<%-- <c:set var="memberDTO" value="${requestScope.memberDTO }" /> --%>
<%-- <c:if test="${! empty memberDTO }"> --%>
<form action="${pageContext.request.contextPath}/member/updatePro" method="post">
아이디 : <input type="text" name="id" value="${memberDTO.id }" readonly><br>
비밀번호 : <input type="password" name="pw"> 비밀번호 입력 시 회원정보 수정<br>
이름 : <input type="text" name="name" value="${memberDTO.name }"><br>
<input type="submit" value="회원정보수정">
</form>
<%-- </c:if> --%>
<c:if test="${empty memberDTO }">
아이디 없음
</c:if>
</body>
</html>
delete.jsp
<!-- 231214 -->
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>member/delete.jsp</title>
</head>
<body>
<h1>member/delete.jsp</h1>
<h1>회원 정보 삭제</h1>
<%
//main.jsp에서 delete.jsp로 이동할 때 아무값도 없이 이동
//연결정보를 저장하는 session 내장객체 안에 로그인표시("id","asdf") 저장
//session에서 로그인 표시값 가져오기 String id 변수저장
// String id = (String)session.getAttribute("id");
%>
<form action="${pageContext.request.contextPath}/member/deletePro" method="post">
아이디 : <input type="text" name="id" value="${sessionScope.id}" readonly><br>
비밀번호 : <input type="password" name="pw"><br>
<input type="submit" value="회원정보삭제">
</form>
</body>
</html>
MemberController.java
package com.itwillbs.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class MemberController {
//member관련 들고오기
//가상주소 /member/insert → /WEB-INF/view/member/insert.jsp연결
//http://localhost:8080/myweb/member/insert 가상주소
@RequestMapping(value = "/member/insert", method = RequestMethod.GET)
public String insert() {
// /insert → /WEB-INF/views/member/insert.jsp 주소 변경 없이 이동하는 방식(forword)
return "/member/insert";
}
//http://localhost:8080/myweb/member/insertPro 가상주소(POST 방식)
@RequestMapping(value = "/member/insertPro", method = RequestMethod.POST)
public String insertPro() {
System.out.println("MemberController insertPro()");
//회원가입처리
// /member/login 주소 변경하면서 이동(redirect:)
return "redirect:/member/login";
}
//가상주소 /member/login → /WEB-INF/view/member/login.jsp연결
@RequestMapping(value = "/member/login", method = RequestMethod.GET)
public String login() {
return "/member/login";
}
//http://localhost:8080/myweb/member/loginPro 가상주소(POST 방식)
@RequestMapping(value = "/member/loginPro", method = RequestMethod.POST)
public String loginPro() {
System.out.println("MemberController loginPro()");
//회원가입처리
// /member/main 주소 변경하면서 이동(redirect:)
return "redirect:/member/main";
}
//가상주소 /member/main → /WEB-INF/view/member/main.jsp연결
@RequestMapping(value = "/member/main", method = RequestMethod.GET)
public String main() {
return "/member/main";
}
//가상주소 /member/info → /WEB-INF/view/member/info.jsp연결
@RequestMapping(value = "/member/info", method = RequestMethod.GET)
public String info() {
return "/member/info";
}
//가상주소 /member/update → /WEB-INF/view/member/update.jsp연결
@RequestMapping(value = "/member/update", method = RequestMethod.GET)
public String update() {
return "/member/update";
}
//http://localhost:8080/myweb/member/updatePro 가상주소(POST 방식)
@RequestMapping(value = "/member/updatePro", method = RequestMethod.POST)
public String updatePro() {
System.out.println("MemberController updatePro()");
//회원가입처리
// /member/main 주소 변경하면서 이동(redirect:)
return "redirect:/member/main";
}
//가상주소 /member/delete → /WEB-INF/view/member/delete.jsp연결
@RequestMapping(value = "/member/delete", method = RequestMethod.GET)
public String delete() {
return "/member/delete";
}
//http://localhost:8080/myweb/member/deletePro 가상주소(POST 방식)
@RequestMapping(value = "/member/deletePro", method = RequestMethod.POST)
public String deletePro() {
System.out.println("MemberController deletePro()");
//회원가입처리
// /member/main 주소 변경하면서 이동(redirect:)
return "redirect:/member/login";
}
}//닫는 괄호
주소매핑만 작업
'KDT > WEB' 카테고리의 다른 글
240125 WEB - Spring4(JDBC, 마이바티스) (0) | 2024.01.25 |
---|---|
240123 WEB - SPRING3(가상주소매핑, 의존성주입) (0) | 2024.01.23 |
240118 WEB - JSP25(MVC, JSTL, 페이지), SPRING 1(설치, 환경설정) (0) | 2024.01.18 |
240116 WEB - JSP24(MVC, JSTL, 게시글 자르기(페이징알고리즘)) (0) | 2024.01.16 |
240115 WEB - JSP23(MVC, JSTL) (0) | 2024.01.15 |