Servlet(1)

Jinmin Kim·2021년 4월 21일
0

컨테이너 웹 어플리케이션 실행

웹 어플리케이션은 톰켓과 같은 웹 컨테이너에서 실행되는구조이다.
1. %CATALINA_HOME%webApp에 어플리케이션 저장
2. server.xml에 직접 웹 어플리케이션 등록

  1. %CATALINA_HOME%webApp에 어플리케이션 저장
    -> 위치에 웹어플리케이션을 위치시킨후 tomcat을 껏다가 실행하면 톰켓이 자동으로
    웹 어플리케이션을 인식한후 실행하는 방법

  2. server.xml에 등록하는 웹 어플리케이션을 컨택스트라고 부른다

<Context path="/webMal"
	docBase="C:\webShop"
        reloadable="true" />

예를 들어 이런식으로 server.xml에 Host태그안에 적어준다
path: url에 사용할 컨택스트 이름
docBase : 컨택스트에 대한 십제 웹 어플리케이션이 위치한 경로

  • 이러한 방법들은 이클립스를 사용하면 간단하게 등록이 가능하다

서블릿

클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바클래스
자바 서블릿은 일반 자바프로그램과는 다르게 독자적으로 실행되지못하고 톰캣과 같은
JSP/Serlvet 컨테이너에서 사용된다는 차이점이 있다.
init, destory 함수는 필요하지 않으면 쓰지않아도 되는 반면, do로 시작하는 메서드는
서블릿의 핵심 기능을 처리하므로 반드시 구현해야한다.
FristServlet.java

	@Override
    //초기화 작업 주로 수행
	public void init() throws ServletException {
		System.out.println("init 메소드 호출");
	}
	
	@Override
    //클라이언트가 요청하는 작업 수행
	public void doGet(HttpServletRequest req, HttpServletResponse resp)
	throws ServletException, IOException {
		System.out.println("doGet 메소드 호출");
	}
	
	@Override
    //기능수행및 메모리에서 소멸될때 호출
	public void destroy(){
		System.out.println("destroy 메소드 호출");
	}

web.xml

<servlet>, <servlet-mapping>
패키지명과 프로젝트 명을 그대로 url로 나타나게 되면 보안상의 이유등으로
좋지 않은 결과를 얻게될수있다. 그래서 web.xml로 servlet을 매핑시켜주어서
URL에 나타나게 하는 방법을 사용하는것을 web.xml에 적어준다
두개의 태그를 이용하여서 서로 연결시켜주어주며,
url-pattern이 url에서 호출될때의 이름을 mapping하는것을 의미한다.

  <servlet>
  	<servlet-name>aaa</servlet-name>
  	<servlet-class>sec01.ex01.FirstServlet</servlet-class>
  </servlet>
  <servlet>
  	<servlet-name>bbb</servlet-name>
  	<servlet-class>sec01.ex01.SecondServlet</servlet-class>
  </servlet>
  
  
  <servlet-mapping>
  	<servlet-name>aaa</servlet-name>
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
  	<servlet-name>bbb</servlet-name>
  	<url-pattern>/second</url-pattern>
  </servlet-mapping>

annotation

여러 서블릿을 web.xml에 설정할경우 복잡해진다는 단점이있다.
annotation을 이용하여서 직접 기능 명시를 하게된다면 가독성이 좋아지는 장점이있다.
annotation : 소스코드에 직접 기능을 설정하는 방법
@WebServlet을 이용하자.
주의 할점 : annotation이 적용되는 클래스는 HttpServlet 클래스를 항상 상속받아야한다.

@WebServlet("/third")
public class ThridServlet extends HttpServlet {
	...
}

이클립스에서는 new -> Servlet을 하게되면
간단히 Servlet에 대한 정보와 annotation을 정해서 만들수있다.
혹여 annotation을 사용할때는 매핑 이름이 사용되고있는 다른 매핑이름과 중복되지않도록 주의해야한다

API 기능

  1. 요청 관련 API : javax.servlet.http.HttpServletRequest
  2. 응답 관련 API : javax.servlet.http.HttpServletResponse

form 태그

<form name="frmInput" method="get" action="input">
        아이디: <input type="text" name="used_id"><br>
        비밀번호: <input type="password" name="user_pw"><br>
        <input type="checkbox" name="subject" value="java" checked>자바
        <input type="checkbox" name="subject" value="C언어">C언어
        <input type="checkbox" name="subject" value="JSP">JSP
        <input type="checkbox" name="subject" value="안드로이드">안드로이드
        <br><br>
        <input type="submit" value="전송">
        <input type="reset" value="초기화">
</form>
  1. name
    form 태그의 이름 지정, form을 구분하는역활 및 javascript에서 접근할때 자주사용
  2. method
    데이터 전송 방법을 지정(GET, POST)
  3. action
    데이터를 전송한 서블릿이나 JSP를 지정, 서블릿으로 할때는 매핑 이름을 사용
  4. encType
    데이터를 전송할 encoding 타입 지정, 파일을 업로드할때는
    multipart/form-data로 지정

HttpServletRequest에서 form태그로 전송된 데이터를 받아오는데 사용하는 메서드

String getParmeter(String name) - name의 값을 알고 name값 전송된 값을 받아오는데 사용
string [] getParameterValues(String name) - name에 대해 여러개의 값을 얻을때 사용
Enumeration getParameterNames() - name 값을 모를때 사용
@WebServlet("/input") //form 태그의 action과 mapping
InputServlet.java

package sec01.ex01;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/input") //form 태그의 action과 mapping
public class InputServlet extends HttpServlet{
	public void init() throws ServletException{
		System.out.println("init 메서드 호출");
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("utf-8");
		String user_id = request.getParameter("user_id");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디:" + user_id);
		System.out.println("비밀번호:" + user_pw);
		String[] subject = request.getParameterValues("subject");
		for(String str : subject){
			System.out.println("선택한 과목:" + str);
		}
	}
	
	public void destory(){
		System.out.println("destory 메서드 호출");
	}
}

InputServlet.java

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("utf-8");
		Enumeration enu = request.getParameterNames();
		while(enu.hasMoreElements()){
			String name = (String) enu.nextElement();
			String[] values = request.getParameterValues(name);
			for(String value : values){
				System.out.println("name= " + name + ",value=" + value);
			}
		}
	}

name 값을 모르는 경우에는 Enumeration enu = request.getParameterNames() 처럼
모든것을 다 받아와서 한꺼번에 뿌려줘도 된다

서블릿 응답 처리 방법

get, post 방식의 차이

get
서블릿에 데이터를 전송할때 데이터가 url 뒤에 name=value 형태로 전송
여러개의 데이터를 전송할떄는 &로 구분
보안이 취약
최대 255자의 데이터 전송 제한
기본전송방식 및 사용 쉬움
웹브라우저에서 직접 입력 가능

post
tcp/ip 프로토콜 데이터의 head 영역에 숨겨져서 전송
보안에 유리
데이터 용량 무제한
처리속도가 get보다 느림

  • doGet = Get 방식으로 처리하고 싶을때
  • doPost = Post 방식으로 처리하고 싶을때
    아래의 방식처럼 해주면, form 태그에서 action으로 get으로 주던
    post로 주던 해결이 가능하다.
package sec03.ex02;

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

@WebServlet("/login4")
public class LoginServlet4 extends HttpServlet {
	
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메서드 호출");
	}
	//Get 방식으로 처리할때
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet 메서드 호출 ");
		doHandle(request, response);
	}
	//Post 방식으로 처리할때
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost 메서드 호출");
		doHandle(request, response);
	}

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
		request.setCharacterEncoding("utf-8");
		String user_id = request.getParameter("user_id");
		System.out.println("doHandle 메서드 호출 ");
		String user_pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + user_id);
		System.out.println("비밀번호 : " + user_pw);
	}
	
	public void destory(){
		System.out.println("destory 메서드 호출");
	}
}
profile
Let's do it developer

0개의 댓글