Servlet/JSP 3일차

0

서블릿 필터

웹 서버 <---> WAS <--> (필터) Servlet Container

  • 클라이언트로 부터 서버로 요청이 들어오기 전에 서블릿을 거쳐서 필터링 하는 것을 서블릿 필터라고 한다.
  • 한글을 요청하려면 아래의 설정은 필수이다.

    request.setCharacterEncoding("UTF-8")

  • 하지만 Servlet은 굉장히 많기에 Servlet마다 설정을 하기에는 불편할 수도있다.
  • Web.xml에서 기본설정을 UTF-8로 할 수 있지만 Tomcat은 여러서버를 돌리기에 이는 부담스러운 행동이다.
  • Filter를 통해 이 작업을 진행할 수 있다.
  1. 새로운 클래스를 생성
  2. 이때 인터페이스에 java.servlet filter 추가
package com.newlecture.web.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

@WebFilter("/*") // Annotation
public class CharacterEncodingFilter implements Filter {

	@Override
	public void doFilter(ServletRequest request, 
			ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
		System.out.println("before Filter");
		request.setCharacterEncoding("UTF-8");
		// chain.doFilter() 이전에 실행할 것이 위치하는 부분
		
		chain.doFilter(request, response); // 흐름을 관할하는 함수
		
		// chain.doFilter() 이후에 실행할 것이 위치하는 부분
		
		System.out.println("after Filter");

	}
}

여러 개의 Submit 버튼 사용하기

  • HTML 코드를 짤 때 버튼을 여러개 할 수 있다.
<input type="submit" name="operator" value=" 덧셈" />
<input type="submit" name="operator" value=" 뺄셈" />
  • 위와 같이 name을 지정해주면 된다.
  • 그럼 value가 서버로 전달된다.
  • 전달된 value 값에 따른 연산을 실행하면 된다.

입력 데이터 배열로 받기

  • 각각의 text를 다른 이름으로 받으면 서버쪽 또는 프로트엔드 부분의 코드가 반복되는 부분이 많을 것이다.
  • 이는 배열로 전달하면 해결이 되는 이 방법은 아래와 같다.
<input name="num" type="text" />
<input name="num" type="text" />
<input name="num" type="text" />
<input name="num" type="text" />
  • 위와 같이 똑같은 name으로 전달하면 배열로 전달된다.
String[] num_ = request.getParameterValues("num");

Servlet 코드에는 위와 같이 request.getParameterValues()함수를 사용하면 배열로 입력받을 수 있다.

상태 유지의 필요성

Application 객체

  • Application 저장소 : 서블릿 컨텍스트(Context)
  • 일종의 책갈피, 상태를 이어나갈 수 있게 도와주는 저장소(공간)
  • 각 Web Application 당 객체 하나만 생성가능
  • 웹 어플리케이션 전체 영역에서 자원을 공유해야할 때 주로 사용
package com.newlecture.web;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
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("/calc2")
public class Calc2 extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");

		ServletContext application = request.getServletContext();
		// ServletContext() 변수지정

		PrintWriter out = response.getWriter();

		String v_ = request.getParameter("v");
		String op = request.getParameter("operator");

		int v = 0;
		if (!v_.equals(""))
			v = Integer.parseInt(v_);
		
		// =이 전달되기 전까지는 context에 저장
		if (op.equals("=")) {

			int x = (Integer) application.getAttribute("value");
			int y = v;
			String operator = (String) application.getAttribute("op");
			int result = 0;

			if (operator.equals("+"))
				result = x + y;
			else
				result = x - y;
			
			out.printf("result is %d\n", result);
		} else {
			/*Context에 저장*/
			application.setAttribute("value", v);
			application.setAttribute("op", op);
		}

	}
}

오늘의 함수

  • ServletContext application = request.getServletContext();
    : ServletContext 객체 생성
  • application.setAttribute("value", v);
    : (key, value) 쌍으로 이뤄져있고 값을 Context에 저장
  • application.getAttribute("value");
    : key에 대한 값을 불러옴

20~26장까지

0개의 댓글