6주차) 패스트캠퍼스 Java & Springboot 로 시작하는 웹 프로그래밍
MVC
클라이언트 : 서비스 요청하는 애플리케이션(or PC)
서버: 서비스를 제공하는 애플리케이션(or PC) > Email/ File/ Web server
WAS(Web Application server): 웹 애플리케이션을 서비스하는 서버/ 서버에 프로그램을 설치하고 웹에서 보여줌
#Tomcat
-Server : 서버> 서비스 > 엔진(서비스를 처리) > HOST> Context (서블릿 여러개) = 프로젝트
주소형식 = Host명/context명/서블릿명
-설정파일
: conf/server.xml (서버설정) | conf/web.xml (모든 web app의 공통설정) | WEB-INF/web.xml (web app의 개별설정)
프로토콜 : 서로 간의 통신을 위한 약속, 규칙으로 주고받을 데이터에 대한 형식을 정의한 것
- HTTP(텍스트기반) 응답메시지
> 형식: 상태라인(HTTP/1.1 상태코드 상태설명) / 헤더 / 빈줄(헤더, 바디 구분) / 바디(응답내용)
#상태코드 : 1**(informational) 2**(성공) 3**(Redirect- 다른URL로 요청필요) 4**(client error) 5**(server error)
- HTTP(텍스트기반) 요청(GET/ POST) 메시지
> 형식: 요청라인 / 헤더 / 빈줄 / 바디
- GET: 리소스를 받는(Read) - 요청라인에 쿼리스트링으로 요청, 바디 없음, 보안취약, 소용량
- POST: 서버에 data(바디내용)를 전송/제공 (Write), 대용량가능 => 게시판 글쓰기, 로그인, 회원가입
▶개발자도구의 Network 탭에서 확인 가능
OOP 5대 설계원칙 - SOLID
> SRP: 단일책임 원칙 (하나의 메서드는 하나의 책임을 진다, 관심사/ (un)common /중복(입출력)코드 의 분리)
> OCP: 개방-폐쇄 원칙
> LSP: 리스코프 치환 원칙
> ISP: 인터페이스 분리 원칙
> DIP: 의존성 역전 원칙
ex) 요일을 계산해주는 프로그램 > MVC패턴으로 개선
isVaild함수 return true일때와 false일때
jsp파일내용
한글이 깨질때 : <%@ page contentType="text/html;charset=utf-8" %>
- Servlet (싱글톤)
@WebServlet = @Controller(메소드에 맵핑) + @RequestMapping
> 해당 클래스는 HttpServlet 상속, 메소드HttpServletRequest request, HttpServletResponse response 필요
@WebServlet public class 클래스 extends HttpServlet { @Override public void 클래스(HttpServletRequest request, HttpServletResponse response) { }} |
@Controller public class 클래스{ @RequestMapping public void main( HttpServletResponse response){ } } |
요청
> 존재x > 인스턴스 생성
> 서블릿 인스턴스 존재시
서블릿 클래스 로딩
↓
init() 초기화
↓
service() 호출할때마다 반복수행
- JSP (Java Server Pages)
html안에 java코드가 존재하는 것, servlet과 동일
동작) jsp작동 시 servlet으로 변환 > servlet 클래스파일 컴파일 > servlet 인스턴스 생성
파일 저장 위치- src/main/webapp
<%! servlet의 클래스 영역 내용%> <% servlet의메소드 내부에 존재함 %>
*기본객체 : 생성없이 사용할 수 있는 객체 (ex -request, response, pageContext, config, application, page, out 등)
- EL (Expression Language)표현식
<%=값%>을 사용하지않기 위해 ${값}을 사용하는 표현식, lv(지역변수)는 사용불가, 값을 읽을 수 있음, null출력안함
[EX]
requset객체 안에 attribute 라는 Map(이름- request scope)저장 ![]() key = name, value = silver로 저장 ![]() |
color = <%=person.getCar().getColor()%> //red = ${person.getCar().getColor()} <br> //red = ${person.car.color} <br> //red name = ${name} //Silver = ${requestScope.name} //Silver = <%=request.getAttribute("name")%> (EL불가) //Silver name == "Silver" = ${ name eq "Silver"} // true = ${name.equals("Silver")} // true = ${name == "Silver" // true name != "Silver" = ${name != "Silver" // false = ${name ne "Silver"}) // false id = <%=request.getParameter("id")%> //null = ${pageContext.request.getParameter("id")} //출력x = ${param.id} <br> //출력x |
Scope | 기본객체 |
page | pageContext |
requst | requst |
session | session |
application | application |
- JSTL(JSP Standard Tag Lib) : <%태그%>사용하지 않기 위해 사용 <접두사:태그명 ~> 형식
(접두사)
<c: 상단에 <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> 선언한것으로 core 라이브러리를 사용
<fmt: <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 선언한것으로 fmt 라이브러리를 사용
[EX]
<c:set var="to" value="10"/> //저장소에 저장 (key = var값, value = value값)으로 page Scope 생략한것
<c:forEach var="i" begin="1" end="${to}"> ${i} </c:forEach> //1부터 10까지 출력
<c:set var="arr" value="10,20,30,40,50,60,70"/> // 배열생성
<%-- varStatus는 count와 index멤버를 가지고 있음 --%>
<c:if test="${not empty arr}">
<c:forEach var = "elem" items="${arr}" varStatus="status">
status.count = ${status.count} / status.index = ${status.index}<br>
arr[${status.index}]=${elem}
</c:forEach>
</c:if>
//주소창에 ?msg = 메시지 입력하면 출력됨
<c:if test="${param.msg == null}"> 메시지가 없습니다. </c:if>
<c:if test="${param.msg != null}">
msg = ${param.msg} //태그를 인식하고 내용만 출력
msg = <c:out value="${param.msg}"/> //태그를 인식하지 않고 그대로 출력
</c:if>
- Filter
서블릿의 전처리 후처리 중복코드를 필터에 넣음
- 필터 1개 요청 > [필터] 전처리 > [필터] 서블릿 호출 > [서블릿] 처리 > [필터] 후처리 |
- 필터 2개 요청 > [필터1] 전처리 > [필터1] 필터2 호출 > [필터2] 전처리 >[필터2] 서블릿 호출 > [서블릿] 처리 > [필터2] 후처리 > [필터1] 후처리 |
[내일배움카드] [국비지원교육]