본문 바로가기
BackEnd

5/20 - 톰캣, 웹 서버 프로그래밍, 서블릿

by Jiwon_Loopy 2025. 6. 1.
반응형

목차


웹 서버


  • server + applet
  • servlet
    • java 안에 html (css, js)
  • jsp
    • html 안에 java
    • el, jst1
  • 템플릿 엔진
    • velocity
    • thymeleaf

톰캣 설치


Apache Tomcat® - Welcome!

이클립스 연결


  • 퍼스펙티브 javaEE로 변경
  • 운영 서버는 auto reloading enabled를 끔
    • 재시작이 안되어서 수동으로 해주어야 함
  • war 파일
    • 톰캣에 배포하기 위한 파일
    • export → war file
    • 톰캣폴더 내의 webapps에 war 파일 붙여넣기
    • 톰캣 스타트
  • 파일 구조
    • bin
      • 실행
    • conf
      • 설정
    • lib
      • 라이브러리
    • log
      • 로그
    • temp
      • 임시
    • webapps
      • 어플리케이션
    • work
      • 톰캣 내부에서 필요한 파일
  • 에러 로그 보는 법
    • conf → server.xml

서블릿 사용해보기


  • 코드 입력
package pro05.ex01;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FirstServlet extends HttpServlet {
	@Override
	public void init() throws ServletException{
		System.out.println("init 메서드 호출");
	}
	
	@Override
	public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
		System.out.println("시스템 메서드 호출");
	}
	
	@Override
	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}

}

  • web.xml 작성
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>pro05</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  
  <!-- 서블릿 등록 -->
  <servlet>
  <servlet-name>first</servlet-name>
  	<servlet-class>pro05.ex01.FirstServlet</servlet-class>
  </servlet>
  
  <!-- 서블릿 매핑 -->
  <servlet-mapping>
  	<servlet-name>first</servlet-name>
  	<url-pattern>/first</url-pattern>
  </servlet-mapping>
</web-app>
  • Add and Remove 꼭 해주기

자동 매핑 사용


  • 설정 방식
    • xml
      • 설정 불편
      • 전체구조파악 용이
    • java
      • 설정 편함
      • 전체구조파악 불편
  • 어노테이션 방식 (java 방식)

package pro05.ex01;

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;

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

	/**
	 * @see Servlet#init(ServletConfig)
	 */
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

}

Servlet 객체


  • getParameter(”파라미터 명”)
    • 단일 값을 리턴
  • getParameterValues(”파라미터 명)
    • 다중 값 (배열)을 리턴
  • getSession()
    • 현재 요청과 관련된 세션 반환
    • 세션이 없다면 새로운 세션 반환
  • setSession()
  • getAttribute()
  • setAttribute()
  • Response 객체
    • 응답
    • sendRedirect()
      • 클라이언트에게 리다이렉트 응답을 보내고 특정 URL로 다시 요청하게 함

로그인 폼 만들어보기


  • 전송 과정
    • value값을 전달
    • 폼 태그로 전송된 정보를 서블릿에서 받아 출력
    • action에 명시된 이름과 매핑되는 서블릿 연결
    • name의 id값으로 각 값을 전달
  • getParameter
    • 단일 값
  • getParameterValues
    • 다중 값
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form method="get" action="login">
		아이디 : <input type="text" name="user_id"><br>
		비밀번호 : <input type="password" name="user_pw"><br>
		<input type="submit" value="로그인"><input type="reset" value="다시입력">
		
		<input type="checkbox" name="subject" value="자바" checked>자바
		<input type="checkbox" name="subject" value="언어" >C언어
		<input type="checkbox" name="subject" value="JSP" >JSP
		<input type="checkbox" name="subject" value="안드로이드" >안드로이드
	</form>
</body>
</html>
package pro05.ex01;

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;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {       
 
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init 메서드 호출");
	}

	/**
	 * @see Servlet#destroy()
	 */
	public void destroy() {
		System.out.println("destroy 메서드 호출");
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	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 );
		}
	}

}

환율 계산기


package pro05.ex01;

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

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;

/**
 * Servlet implementation class CalcServlet
 */
@WebServlet("/calc")
public class CalcServlet extends HttpServlet {

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter pw = response.getWriter();
		String command = request.getParameter("command");
		String won = request.getParameter("won");
		String operator = request.getParameter("operator");
		
		if(command != null && command.equals("calculate")) {
			String result = calculate(Float.parseFloat(won), operator);
			pw.print("<html><font size =10>변환 결과</font><br>");
			pw.print("<html><font size =10>" + result + "</font><br>");
			pw.print("<a href='/pro05/calc'>환율 계산기</a>");
			return;
		}
		
		pw.print("<html><title>환율 계산기</title>");
		pw.print("<font size=5>환율 계산기</font><br>");
		pw.print("<form name='frmCalc' method='get' action='/pro05/calc'/>");
		pw.print("원화 : <input type='text' name='won' size=10/>");
		pw.print("<select name='operator'>");
		pw.print("<option value='dollar'>달러</option>");
		pw.print("<option value='en'>엔화</option>");
		pw.print("<option value='wian'>위안</option>");
		pw.print("<option value='pound'>파운드</option>");
		pw.print("<option value='euro'>유로</option>");
		pw.print("</select>");
		pw.print("<input type='hidden' name='command' value='calculate'/>");
		pw.println("<input type='submit' value='변환'/>");
		pw.println("</form>");
		pw.print("</html>");
		pw.close();
		
		
	}
	
	private static String calculate(float won, String operator) {
		float USD_RATE = 1000;
		float JPY_RATE = 1000;
		float CNY_RATE = 1000;
		float GBP_RATE = 1000;
		float EUR_RATE = 1000;
		String result = null;
		if(operator.equals("dollar")) {
			result = String.format("%.6f", won / USD_RATE);
		}else if(operator.equals("en")) {
			result = String.format("%.6f", won / JPY_RATE);
		}else if(operator.equals("wian")) {
			result = String.format("%.6f", won / CNY_RATE);
		}else if(operator.equals("pound")) {
			result = String.format("%.6f", won / GBP_RATE);
		}else if(operator.equals("euro")) {
			result = String.format("%.6f", won / EUR_RATE);
		}
		return result;
	}

}

 

728x90
반응형

'BackEnd' 카테고리의 다른 글

5/23 - 서블릿, 쿠키와 세션, 필터와 리스너, JSP  (0) 2025.06.01
5/22 - Servlet, 쿠키, 세션  (0) 2025.06.01
5/21 - 서블릿 응답 처리 방법  (0) 2025.06.01
Bean 등록  (1) 2025.03.08
springboot - 기초  (0) 2025.03.07