spring 수업노트 jsp 2020.12.29

 

jsp(java server page)

jsp 는 화면 구성에 사용(html 안에 java 코드를 생성한다. )

요청에 따라 동적으로 컨텐츠(html , json , xml 등)를 생성/ 전달

jsp 는 화면 구성에 사용 ( html 안에 java 코드를 사용)

jsp 도 servlet 으로 변환되는 과정을 거친다.

servlet 랑 jsp 거의 유사함 (jsp 는 servlet으로 변환됨 )

servlet 은 로직 처리시에 사용 → MVC framework(spring, struts등 ) 사용

경로 :

Command line argument: -D:\A_TeachingMaterial\6.JspSpring\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\ROOT\org\apache\jsp

가면 class 로 보면 java 코드를 자동으로 out.print 를 해서 자동으로 jsp 코드로 변경해 주었다는 것을 알 수 있다.

출처 : https://aroundck.tistory.com/11

jsp 는 여러번 요청을 하더라도 위의 위치에 새로 만들어지지 않는다.

jsp 는 서버 요청을 할때 (클래스가 만들어져 있지 않으면 새롭게 변환을 하고 ) 생성이 된다.

-jsp 는 Servlet 으로 변환되어 서비스 된다. Servlet-Container(tomcat) 이 jsp 를 서블릿으로 변환하는 과정에서 사용하는 폴더는 work 폴더

-tomcat 도 개발자가 만든 프로그램으로 비정상적으로 동작할 때가 있음

-개발자가 jsp 파일을 수정하였음에도 수정 내역이 반영되지 않을 경우

-work 폴더에 생성된 jsp 변환파일들(java, class) 을 삭제 해주면 서버 연결할 때 (한번만)새롭게 파일을 만들어 준다.

-jsp를 서블릿으로 변환하는 시기는 해당 jsp 에 대해 최초 요청이 일어 났을 경우에 변환

-서블릿으로 생성이 된 이후 같은 파일에 대한 요청은 이미 변환된 파일로 서비스 (파일이 계속 생성이 되는것이 아니라 1번 생성이 된후 거기에 계속 요청변환되는것,,,,)

jsp 구성요소

  1. 지시자 : page 의 설정 정보
  2. 스크립틀릿 : JAVA 코드 == > 나중에 JSTL(Java Standard Tag Library) 로 변경할 예정이다.

<% Date date = new Date(); %> 3. 표현식 : 문자열로 출력 ==> EL(Expression Language , 표현언어 )

<%=date %> 4. 주석 5. 선언부 : 변수나 method 선언 , jsp 는 화면, 컨텐츠를 생성하는 역할 변수나 method 는 로직 처리시 주로 사용

jsp 가 변환된 클래스에서

  1. public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

→ 미묘하게 서블릿에서 쓰는 service 와 다름

2)if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) { response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD"); return; } → get, post, head 방식만 사용가능 나머지는 에러를 보낸다.

test 라이브러리 : j 유닛4.13

클래스를 테스트해야 한다 → 중요 : RUN AS JUNIT 으로 실행해서 테스트 한다.

tendency 에 의존성을 추가해야한다.

<!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.1</version> <scope>test</scope> </dependency>

scope 가 test → 운영을 할때 동작을 하지 않고 테스트 할 때 동작을 한다.

web-inf → lib 에는 안생긴다.

Marven Dependencies 에서 harmcrest 도 같이 생긴다.

JUnit Test Case 만들기 → 이름은 테스트할 클래스 + Test

@Test public void test() { fail("Not yet implemented"); }

한개 생성된게 차이점이다.

Test : junit 으로 실행

메인이 존재하지 않는다. 이클립스, 메이븐등에서 자동으로 실행되서 main 이 없다.

(일반 class는 main_ 에서 실행이 된다. )

errors가 나오면 : 실행이 잘 되지 않았을때 ( assetEquals 랑 관련되지 않음)

failures 가 나오면 : assetEquals 를 통과하지 못했을때 → 실행은 된다.

모든 과정통과 : 녹색마크

실패 메시지 : java.lang.AssertionError: expected:<120> but was:<720>

해석 : 120을 기대치로 넣었지만 실제적인 값은 720 이다.

tomcat(구체화) := 일반화/추상화 : servlet container → service 를 호출하는 주체가 된다.

-servlet 을 테스트하기는 힘들다.

why?

→ interface 타입 httpaServletRequest

요청부분에서 인자가 두개 response, request

// getattribute, getsession, setattribute 등등 → 서버가 필요함 .

테스트하기가 힘들어짐 (서버에 의한 요청, 반응이 되는데 ) 이렇게

외부환경에 의존하고 있으면 테스트하기가 어려워진다.

bash 에서 :

통과를 못하면 → war는 안만들어짐

$ mvn package -Dmaven.test.skip=true

이렇게 쓰면 test 를 거치지 않음

출처 :

자바에서 war와 jar의 차이가 뭔가요?

  • war......war.... 매일봐도 모르겠는 war

java archive (jar) : 하나의 application 기능이 가능하도록 java 파일 등을 압축하고 지원.

배포된 jar 파일을 사용하는 사용자들은 각 파일들에 대한 path 문제에서 벗어날 수 있다.

ojdbc14.jar , servlet-api.jar 등등

web archive war 는 jar 와달리 웹 어플리케이션 지원하기 위한 압축 방식

jsp, servlet, gif, html, jar 등을 압축하고 지원. jar 와 같은 맥락으로 servlet context 접근위해 관련된 모든 파일들을 패키지

enterprise archive : 하나의 웹어플리케이션 단위를 넘어 실제 서버에 배포하기 위한 단위

jar는 어플리케이션 레벨 war는 웹어플리케이션 레벨을 지원

세가지의 차이 : 서로다른 환경을 대상

JAVA_ JAR, WAR, EAR 차이점

****요구사항 : EAR 파일 자체에는 META-INF 라는 폴더에 application.xml 파일이 있어야 합니다.

WAR 파일에는 WEB-INF 폴더에 포함된 web.xml 파일이 필요합니다. java 파일에는 이런요구사항 없다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/487f535a-1399-4956-ac60-50f4c7ec1e01/.jpg

JAR, WAR, EAR 파일은 모두 표준 압축 알고리즘을 사용하므로 모든 표준 압축 도구로 작성가능 JDP에는 JAR.exe 라는 특수 유틸리티 포함 → 웹, 엔터프라이즈 및 java 응용 프로그램을 해당 유형으로 패키지하고 압축

[JAVA] JAR WAR 차이

보통 Marven 등을 통해 내려받는 라이브러리들은 class 파일들이 묶인 jar 파일로 구성되어 있다. 그리고 서비스 배포시에 프로젝트를 war 포맷으로 묶어 /webapps 등의 지정된 경로에 넣고 Tomcat 등의 웹 컨테이너 ( web container) 를 이용하여 배포

war 은 WEB-INF 및 META-INF 디렉토리로 사전 정의된 구조를 사용하며(WEB.XML이 반드시 필요.. ) war 파일을 실행하려면 TOMCAT, Weblogic, Webshere 등의 웹 서버(WEB) 또는 웹 컨테이너(WAS) 가 필요하다.

WAR 파일도 JAVA 의 JAR 옵션을 이용해 생성하는 JAR 파일의 일종. 웹 어플리케이션 전체를 패키징하기위한 JAR 파일로 생각할것.....

FACTORIAL

재귀함수(메소드) : 자기 자신을 호출하는 함수(메소드)

팩토리얼 수열

N, N! → 1부터 N까지의 정수를 곱하는 단순한 연산

: 사물의 순서를 정할때 여러방법의 가능성을 구할 수 있다.

:

0! → 1보타 크거나 같고 0 보다 작거나 같은 모든 정수들의 곱

이런 수는 존재하지 않기 때문에 곱셈의 항등원인 1과 같다고 정의한다.

0! = 1

  • STACK : 스택은 제한적으로 접근할 수 있는 나열 구조. 스택은 한쪽 끝에서만 자료를 넣거나 뺼 수 있는 선형구조로 되어 있다.

팩토리얼 메소드 만들기 - 자바에서

public class Factorial {

public static void main(String[] args) {

int input = 3;

System.out.println(fact(input));

}

// 1번째 팩토리얼 메소드

public static int fact(int n) {

if ( n ≤1 )

return 1;

else

return fact(n-1) * n;

}

}

기타

maven build 시에 자동으로 junit 테스트 코드에 대한 테스트를 한다.

Maven package시 test 코드 실행을 스킵하라고 하는 명령

mvn package - Dmaven.test.skip=true

bash$ mvn clean install - DskipTests

혹은

bash$ mvn clean install - Dmaven.test.skip = true

이유? : maven 으로 빌드시 정상적으로 동작하지 않는 test 케이스들로 인해 실패하는 경우가 있음. 변경된 정보들이 많을테니까.

HttpServletRequest : 사용자가 요청을 보낼때의 정보(파라미터, 해더정보, 쿠기를 은닉화한 객체 ) 누가 생성? : servlet container 가 생성 (ex) 톰캣 ) service(doXXX) 메소드의 인자 service(doXXX) 주요 사용 용도

  1. 파라미터 정보 확인 인위 조작이 불가 getParameter는 존재하지만 setParameter 메소드는 없음 ==> request 클래스의 Wrapper 클래스를 이용하여 파라미터 조작가능
  2. 헤더 정보 확인
  3. 속성(Attribute) 정보 설정, 조회 개발자가 인위 조작 가능
부가적 
4. ContextPath 확인 

	서블릿 + 정적인 자료인 컨텐츠(js, css, image 등 ) 들의 집합 
	
	webApplication = (유사) contextPath 
	
	request.getContextPath() 를 통해 contextPath 문자열을 얻어올 수 있다. 
	
	서버 하나에 여러개의 웹 어플리케이션을 서비스 하는 것이 가능하다.
	==> url 요청시 어떤 웹 어플리케이션을 의미하는지 구분이 필요하다. 
	
	http: //도메인/CONTEXT_PATH/경로 
	
	
	==> css, javascript , image 파일의 경로를 설정할 때 사용  
		
	jsp 라는 이름으로 contextPath가 설정된 웹어플리케이션의 경우
	webapp/image/brown.png 파일의 경로를 다음과 같이 설정할 수 있다.
	<img src="/jsp/image/brown.png" > 
	
	
	==> jsp 라는 이름의 컨텍스트 패스를 수정할 경우 링크와 관련된 부분을 모두 수정해야하는 문제점이 발생
	
		request.getContextPath() 메서드를 이용해 유지 보수 문제 해결 가능
		<img src="<%=request.getContextPath()%>/image/brown.png"/>
		
		
		
webapp/jsp/request.jsp

jsp 파일 내용 : request 객체에서 제공하는 메소드와, 메소드의 리턴값을 확인 

<body>
	request.getContextType() : 리턴값을 출력 <br> 
	request.getMethod() : 리턴값을 출력 <br> 
	request.getRequestURI() : 리턴값을 출력 <br>
	request.getContextPath() : 리턴값을 출력 <br>
	request.getServerPort() : 리턴값을 출력 <br>
</body>

댓글