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 구성요소
- 지시자 : page 의 설정 정보
- 스크립틀릿 : JAVA 코드 == > 나중에 JSTL(Java Standard Tag Library) 로 변경할 예정이다.
<% Date date = new Date(); %> 3. 표현식 : 문자열로 출력 ==> EL(Expression Language , 표현언어 )
<%=date %> 4. 주석 5. 선언부 : 변수나 method 선언 , jsp 는 화면, 컨텐츠를 생성하는 역할 변수나 method 는 로직 처리시 주로 사용
jsp 가 변환된 클래스에서
- 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......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는 웹어플리케이션 레벨을 지원
세가지의 차이 : 서로다른 환경을 대상
****요구사항 : EAR 파일 자체에는 META-INF 라는 폴더에 application.xml 파일이 있어야 합니다.
WAR 파일에는 WEB-INF 폴더에 포함된 web.xml 파일이 필요합니다. java 파일에는 이런요구사항 없다.
JAR, WAR, EAR 파일은 모두 표준 압축 알고리즘을 사용하므로 모든 표준 압축 도구로 작성가능 JDP에는 JAR.exe 라는 특수 유틸리티 포함 → 웹, 엔터프라이즈 및 java 응용 프로그램을 해당 유형으로 패키지하고 압축
보통 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) 주요 사용 용도
- 파라미터 정보 확인 인위 조작이 불가 getParameter는 존재하지만 setParameter 메소드는 없음 ==> request 클래스의 Wrapper 클래스를 이용하여 파라미터 조작가능
- 헤더 정보 확인
- 속성(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>
댓글
댓글 쓰기