카테고리 없음

044일차 201120

유호야 2020. 11. 20. 19:04
반응형

앞으로는 JSP 먼저 실행시키지 않을 것이다.

오늘은 서블릿을 만들어 실행할 것이다.

finish를 누르면, 클래스가 생성된다.

해당 파일은 java resources 폴더 안 쪽에 src 안에 있다.

자동으로 import가 몇 개 되어 있을 것이다.

 

자바는 소스코드가 바뀌면 무조건 껐다 켜야 한다. 물론 일반적으로는 자동으로 껐다켜준다.

f5번을 누를때마다 호출이 될 것이고 이 의미는 doGet 저 지점이 시작점이라는 뜻이다.

자바소스를 건드리면 서버가 자동으로 재시작이 된다.

http://localhost:8181/P201120-1/Test1

 

doget메소드의 아래 코드는 테스트코드라 지워야 한다.
request.getParameter("aa");

 

JSP에서는 자바로 코드가 변환되었을 때 out이라는 변수를 선언해주기 때문에 out.println이 가능했지만, 서블릿에서는 다르다. 

doGet안에서 쓸 수 있는 변수는 안에서 생성하는 변수 v1, v2 매개변수인 request.response 변수 밖에 사용할 수 없다.

request, response 객체 안에 다 연결이 되어있다.

out.print 객체를 쓰고 싶을 때

response. 

 

결과는 같지만 루틴이 다르다.

aaa.jsp를 호출하는 것과 Test4를 호출하는 것

 

서블릿에서서블릿이 실행된다.

request는 한 번만 발생했다. > 

 

forwarding과 Redirect는 적절하게 잘 써야 한다.
이것은 다음주 월요일부터 하는 수업에서 왜 포워딩과 리다이렉트를 하는 지 설명을 할 것이다.

 

절대 JSP로 리다이렉트 하지 않을 것이다.
jsp로 포워딩 무적권!

 

 

포워딩이란?
리다이렉트란?

 


서블릿 생성
Test5.

package com.ja.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Test5
 */
@WebServlet("/")
public class Test5 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Test5() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Test5 호출됨 get");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

웹브라우저기준에서 localhost:8181까지는 ip주소일 뿐이고,
톰캣기준에서주소도 같다. 
링크는 contextPath 다음에 붙인다.

jsp는 무조건 그 구조이다.
파일명 자체가 경로와 mapping이 되어있기 때문에 하나의 명령어, 즉 jsp가 하나의 흐름이 된다. 

하지만 servlet이 신기한게, / 를 주소에 입력하면 무엇을 입력하든 Test5가 호출된다.
Test5가 하나인데 url mapping이 /로 되어있다면, contextPath 이후에 나오는 모든게 Test5이다.

@WebServlet("/")
즉 여기가 '모든'이 된다.

@WebServlet("*.xxx")
.xxx로 끝나는 모든 것을 받겠다.

//@WebServlet("*.do") //어노테이션이 걸려있으면 톰캣을 이것을 인지한다.

어노테이션을 생성하면 톰캣이 클래스가 존재한다는 것을 인지하지만, annotation이 없다면 클래스가 존재하는 것을 인지하지 못하고, 404 not found 페이지가 발생.

 

앞으로 서블릿을 만들때 항상 annotation을 만들어줘야 한다.
하지만 문제가 하나 있따. 우리가 어떤 명령어에 따른 맵핑을, page가 백개면 명령어가 백개라는 뜻이다.

각각의 자바 코드의 어노테이션을 붙여가지고 맵핑 그것을 써야 한다.
어노테이션 방법이 쉽기는 하지만, 확인이 잘 안됀다. 소스코드를 다 뒤져봐야 한다.ㅇ

어노테이션을 쓰지 않고, 톰캣이 인지하게 하는 방법

1. 어노테이션을 이용해서 톰캣에 알리기
> 장점 쉽지만 단점은 개별 자바코드의 설정이 들어간다.
프로그램이 복잡할 수록 자바코드가 많다는 뜻이다. 즉 설정을 한 눈에 볼 수가 없다.
2. xml 설정을 통해서 톰캣에 알리기

 

세션시간 조정할 때랑 에러페이지로 몇 번 확인했을 것이다.
design은 이클립스가 코드를 읽어들여서 보여주는 항목이다.

xml은 무엇인가?

무언가가 끝까지 저장되려면 하드디스크에 저장이 되어야 한다.
엑셀을 껐다켜도 데이터가 온전하게 저장이 된다. 엑셀파일 같은 경우에는 int int String String
파일 포맷이라고 하고, 복잡한 형태의 데이터들은 첫번째 int 값으로 몇 개가 들어가고

 

2000년대 초중반 쯤에, xml이라는 문자로 데이터를 저장하는 포맷을 만들기 시작한다.
html 태그 구조라고 생각하면 된다. html 은 태그가 정확하게 지정이 되어있다. 규칙만 있고 우리가 마음대로 적용하면 된다. 내 마음대로 저장하면 된다. <person> person이라는 객체가 있다. 복잡한 형태도 저장할 수 있게 규칙을 만들어보자 > html을 확장을 해서 xml 이라는 문법을 만들어낸다.

 

갈수록 고도화된 데이터가 있다. 키값 키값 property 방식이 있었고, 누군가가 관계 데이터를 문자열로 저장해야 할 때 있을 때 만들었다. 
갈수록 xml은 하향길에 접어들고 있다. 요즘에는 자바스크립트 json이라는 표현을 썼었죠, 요즈음에는 이러한 형태로 더욱이 활용하고 있다. property는 원체 간단하고 쉽다. 그래서 하향길이 되지는 않을 것이다. 하지만 xml과 json은 서로 비슷한 기능이라서 xml보다는 json 타입으로 데이터를 설정하는 방법이 더 선호되고 있다. 하지만 xml이 오랜시간동안 사용해왔기때문에 데이터를 전송하고 받을 때 문자열로 데이터를 받아 저장하는 것을 xml이라고 한다.
순수한 문자열, 수정가능한 문자열, 규칙이 있어야 한다. relation을 설정할 수 있는 규칙이 있는 문자여야 한다.

name : 철수, 
age : 30

}

톰캣을 실행했을 때 web.xml을 먼저 읽고 가동한다. 즉 web.xml은 프로젝트마다 하나 씩 넣을 수 있고 즉 context마다 하나의 xml을 가지고 설정할 수 있다. 참고로 xml보면 맨 처음에 document 타입 xml처럼 <?xml version = "1.0" > xml 파일이라는 것을 알려주는 것이고, 두번째 줄의 xmlns = 값의 http 링크를 보면 태그 정의가 나와있다. 어떤 태그가 존재하고,  

 

	<!--  xml 주석 -->
	<error-page>
		<error-code>400</error-code>
		<location>/aaa/aaa.jsp</location>
	</error-page>
	
	<session-config>
		<session-timeout>60</session-timeout>
	</session-config>
	
	<!--  서블릿 설정 -->
	<servlet>
		<servlet-name>xxxx1</servlet-name>
		<servlet-class>com.ja.controller.Test1</servlet-class>
	</servlet>
    
   	<servlet-mapping>
	 	<servlet-name>xxxx1</servlet-name>
	 	<url-pattern>/Test1</url-pattern>
	 </servlet-mapping>

request mapping 안 쪽에다가는 못하고 바깥 쪽에, 하나의 서블릿이 있고, 

조심해야할 것 설정이 xml하고 annotation하고 섞을 수는 있는데 충돌이 나게 섞으면 안됀다.
@webServlet("/Test1") 이 한줄과 저 위의 코드들은 완전하게 동일하다.

근데 주석을 풀어버리면 충돌이 발생해서 가동하지 않는다. 설정은 한 가지로만
xml 아니면 annotation!

tomcat을 실행하면 web.xml을 읽어들일 것이고
class는 servlet이구나 xxxx1이구나 읽고 설정 정보를 저장한다.
servlet-name 이름과 관계의 특징 차이가 있다.
url-pattern 알고리즘을 메모리에 저장한다.

서블릿과 맵핑은 알아두자!

톰캣을 가동할 때 생성하고 싶다면?
<servlet></servlet> 안에 <load-on-startup>1</load-on-startup>

 

다음주에 만들 MVC 모델에서 서블릿은 단 한개만 만들 것이다. 명령어가 여러개 날라와도 하나가 처리할 것이다. *.do가 / 분기할 것이다. request.get request.uri인가 하면 if문으로 나눈다. 조금 더 복잡하게 할 것이다.

일반적으로 MVC 모델이라고 하면, 사실상 100개의 페이지건 1000개의 페이지건 많지 않다. 많아봤자 3-4개

annotation servlet에 name class mapping 

// @WebServlet(loadOnStartup = 1, name = "xxxx1")


Test1

package com.ja.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Test1
 */
public class Test1 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Test1() {
        super();
        System.out.println("Test1 생성됌");
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("Test1 get 호출됨!");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

TestFilter1

package com.ja.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class TestFilter1
 */
@WebFilter("*.do")
public class TestFilter1 implements Filter {
	//서블릿은 아니다.
	
    /**
     * Default constructor. 
     */
    public TestFilter1() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("필터1가 실행된다!");
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

TestFilter2

package com.ja.filter;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class TestFilter2
 */
@WebFilter("*.do")
public class TestFilter2 implements Filter {

    /**
     * Default constructor. 
     */
    public TestFilter2() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("필터2 동작된다.");
		// pass the request along the filter chain
		chain.doFilter(request, response);
		//
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

Filter는 동일한 맵핑으로 여러개를 넣을 수 있다.

서블릿은 하나의 명령, 동일한 맵핑으로 여러개를 넣을 수 없다.

chain do filter를 지우면 다음 필터가 동작하지 않는다.


Listener에 대해서.. 

이벤트가 발생했을 때 반응하는

사용자의 행위에 해당하는 이벤트가 아니라 lifecycle 생성 소멸과 관련된 이벤트가 발생한다.

listener 맵핑과 관련이 없다.

 

servlet context evevnts 

xml

String user = request.getAsyncContext();

return 타입 servlet context,

JSP에서의 Application, set, getAttribute하는 곳
getServletContext하면 된다.

반응형