JSP&Servlet

JSP & Servlet 다루기 (1) : Tomcat, JSP, Servlet 개념, jsp 요청과 응답 처리

TerianP 2022. 5. 26.
728x90

1. 개념 정리하기

1) JSP 란?

JSP 란 JavaServer Pages 의 약자이며 HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구이다. JSP 가 실행되면 자바 서블릿(Servlet) 으로 변환되며 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고 그렇게 생성된 데이터를 웹페이지와 함께 클라이언트로 응답한다.

=> 쉽게 생각하면 기존의 html 에서 java 언어를 사용할 수 있도록 만들어진 웹 페이지

 

2) Tomcat 톰켓 WAS

톰캣 또한 아파치 소프트웨어 재단에서 후원을 하고 있으며, 오픈소스로 개발이 되고 있다. JAVA EE 기반으로 만들어졌으며, JSP와 Servlet을 구동하기 위한 서블릿 컨테이너 역할을 수행한다. 아파치서버와는 다르게 DB연결, 다른 응용프로그램과 상호 작용 등 동적인 기능들을 사용할 수 있다.

 

3) 자바 서블릿 Java Servlet

서블릿이란 웹페이지를 동적으로 생성하기 위해 서버측 프로그램을 말한다. 이는 자바 언어를 기반으로 만들지며 웹 어플리케이션 서버 ( Web Application Sever ) 위에서 컴파일 되고 동작한다.

 

4) WAS(wab application server)

DB 처리, 로직 처리를 요구하는 동적타입을 제공하는 소프트웨어 프레임워크를 의미한다. 주로 아래의 3가지 기능을 한다.

  • 프로그램 실행 환경과 데이터베이스 접속 기능을 제공한다.
  • 여러 개의 트랜잭션을 관리한다.
  • 업무를 처리하는 비즈니스 로직을 수행한다.

 

 

2. Servlet 로 백엔드 다루기

1) tomcat 사용시 폴더별 설명

  • src/main/java/webapp/ ⇒ 각종 html jsp
  • 웹의 기준점(index) 의 위치는 webapp

2) HTTP 상태코드

상태 코드 설명

200 전송 완료!! 정상적 요청 성공!
404 페이지를 찾을 수 없음 → 보통 클라이언트의 문제
405 요청한 메소드는 서버에서 알고 있지만, 제거되었고 사용할 수 없습니다
500 서버에서의 문제지만 정확한 원인은 알 수 없음

3) HttpServlet

  • servlet 란 웹에서 동작하는 자바 프로그램이라고 할 수 있다. tomcat 이 java 코드로 된 servlet 를 읽어와서 web 에 뿌려주는 방식
  • servlet 의 라이프 사이클 아래 순서를 따른다.
    • init() -> doGet() || doPost -> destory()
  • HttpServlet 은 GenericServlet 를 상속받아서 만들어진 http 프로토콜 전용 서블릿이다. 따라서 다른 프로토콜을 사용하는 경우 GenericServlet 를 상속받아서 사용할 수 있다.

4) 프론트 : html or jsp

  • 한글을 사용하려면 charset=utf-8 은 필수!
  • form action 에서 / 는 따로 쓸 필요 없음! get/post 만 주의할 것
  • 프론트에서 .do, .html 뭘 사용하던 마음대로지만 백엔드에서는 프론트를 따라간다.

4) 백엔드 : java

  1. Servlet 코드 작성 방법
    • HttpServlet 상속 또는 GenericServlet 상속받아서 사용
    • get 방식으로 요청을 받는 경우 doGet() // post 방식으로 요청을 받는 경우 doPost 오버라이드 후 사용
    • 어노테이션은 WebServlet 를 사용한다 ⇒ spring 에서 사용하는 @RequestMapping, @GetMapping 를 하나로 묶은게 아닌가 싶음
  2. 서블릿을 사용하는 경우 html action 태그 쪽에서 .do 를 사용하기도 한다. 이는 .html 이 아니라 다른 값을 보여줌으로써 보안을 높이기 위해서라고
    • 이때 html 쪽에서는 action 태그에서는 기본적으로 / 는 안 붙이는게 편하고, 붙이지 않고 붙이는 경우 ./ 를 사용한다 ⇒ 그냥 / 만 쓰면 에러 발생...
    • 단 자바쪽에서는 반드시!! 꼭!! / 를 붙여서 받아야한다.
    • jsp 에서 보내는 요청 url 과 응답 url 은 일치해야 한다. 예를 들어 .do 를 사용하는 경우 java 쪽에서도 마찬가지로 .do 로 받아야 한다.
  3. 요청방식에 따라서 doGet 과 doPost 를 적절히 오버라이드하여 사용하며 사용자의 요청은 req 서버에서의 응답은 resp 로 처리한다.
    • get과 post 모두 getParameter 를 사용해서 값을 가져오고, 이때 기준은 html 에서 name 속성의 값이다 ⇒ ajax 는 data 의 값을 가져오게 된다
    • checkbox 처럼 하나의 name 속성에서 2개 이상의 값이 넘어오는 경우 req.getParameterValues() 를 사용하면 된다. 이때 return 은 String[]
    • req : HttpRequest 사용자 요청을 객체로 만든 것
    • resp : HttpResponse 서버의 응답을 객체로 만든 것
  4. 한글 처리를 위해서는 resp 응답객체에 UTF-8 을 명시해서 보내야 한다.
    • req.setCharacterEncoding("UTF-8"); ⇒ request 로 넘어오는 값들에 대해서 한글처리
    • resp.setContentType("text/html;charset=UTF-8"); ⇒ response 로 넘기는 값들에 대해서 한글처리
  5. 서버에서 웹으로 데이터를 전달, 즉 네트워크에서의 I/O 에서는 printWriter 를 사용한다. 단순히 텍스트전달이 아닌 json 형태로 데이터를 전달할때도 동일하게 사용된다.

1. Get 방식 응답의 기본 코드


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

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletMapping;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/hello2.html")
public class HelloServlet extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// 한글 처리를 위한 인코딩
		resp.setCharacterEncoding("UTF-8");

		// 응답객체에 printWriter 로 내용 작성(쓰기 객체)
		PrintWriter out = resp.getWriter();
		// 사용자 브라우저에 이 내용을 전달
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");		
		out.println("<title>Hello servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>Hello Servelt</h1>");
		out.println("<h1>안녕하세요</h1>");

		out.println("</body>");
		out.println("</html>");
	}
}

2. http 요청을 활용한 구구단 출력


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

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("/gugudan.html")
public class GuGuDan extends HttpServlet{
	// <http://localhost:8080/web/gugudan.html>
	
	// 1. httpservlet 상속
	// 2. doget 오버라이드
	// 3. @WebServlet 어노테이션
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		resp.setCharacterEncoding("UTF-8");
		
		PrintWriter out = resp.getWriter();

		
		out.println("<html>");
		out.println("<head>");
		out.println("<meta charset='UTF-8'>");		
		out.println("<title>Hello servlet</title>");
		out.println("</head>");
		out.println("<body>");
		out.println("<h1>Hello Servelt</h1>");
		out.println("<h1>안녕하세요</h1>");
		
		for(int i=1; i<10; i++) {
			out.println("<h2> 3 * "+i+" : "+3*i);
		}
		out.println("</body>");
		out.println("</html>");
	}
	
}

3. 웹에서 요청받고 응답하기 - get

  • 웹에서 GET 방식으로 요청한 값을 전달받아서 다시 웹에 응답 resp 하기
  • 요청한 값 즉 req 를 사용하며 get 으로 보내온 요청 주소의 queryString에 있는 파라미터 값을 확인하고 req.getparameter 를 사용하여 값을 가져온다.
  • 이때 req.getparameter 는 String 을 return 한다.
  • 요청 html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="./gugudan.html">구구단3단 보러가기</a>
// 여기서 action 태그에 ./ 하거나 / 를 안쓰거나
	<form action="gugudando" method="get">
		<input type="text" name="dan" id="gugu"/>
		<input type="submit" value="전송"/>
	</form>
</body>
</html>
  • 응답 자바 코드

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

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("/gugudando")
public class GuGudan extends HttpServlet{
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// getParameter 는 string 을 리턴함
		String str = req.getParameter("dan");
		
//		STring 을 int 로Integer.parseInt(str)
		int dan = Integer.parseInt(str);
		
		resp.setCharacterEncoding("UTF-8");
		PrintWriter pw = resp.getWriter();
		
			pw.println("<html>");
			pw.println("<head>");
			pw.println("<meta charset='UTF-8'>");
			pw.println("<title>구구단 출력</title>");
			pw.println("<h1>구구단!!");
			
			for(int i=1; i<10; i++) {
				pw.println("<h1>");
				pw.println(dan+" * "+i+" : "+i*dan);
				pw.println("</h1>");
			}
			pw.println("</head>");
			pw.println("</html>");
	}
}

4. 웹에서 요청받고 응답하기 - post

  • 웹에서 post 방식으로 요청한 값을 받고, 다시 웹으로 전달하기
  • 요청 html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="login.do" method="post">
	ID : <input type="text" name="id" id="" />
	PW : <input type="password" name="passwd" id="" />
	<input type="submit" value="로그인" />
	<input type="button" value="회원가입" />
	</form>
</body>
</html>
  • 응답 java

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

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("/friday.do")
public class SendData extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doMsg(resp, req);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doMsg(resp, req);
	}

	private void doMsg(HttpServletResponse resp, HttpServletRequest req) {

		try {
			req.setCharacterEncoding("UTF-8");
			resp.setContentType("text/html;charset=UTF-8");

			String msg = req.getParameter("msg");
			System.out.println(msg);

			PrintWriter pw = resp.getWriter();

			pw.println("<html>");
			pw.println("<head>");
			pw.println("<meta charset='UTF-8'>");
			pw.println("<body>");

			pw.println("<h1> 오늘은 금요일 : "+msg+"</h1>");
			
			pw.println("</body>");
			pw.println("</head>");
			pw.println("</html>");

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

5. 2가지의 이상의 값을 받아서 처리하기

  • 2가지 이상의 값을 받는 경우 getParameterValues() 메소드 사용!! 이때 return 은 String[]
  • 요청 html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>당신의 취미는?</h1>
	<form action="prtHobby.do" method="post">
		<input type="checkbox" name="hobby" id="" value="낮잠" />낮잠
		<input type="checkbox" name="hobby" id="" value="코딩" />코딩
		<input type="checkbox" name="hobby" id="" value="wow" />WoW
		<input type="checkbox" name="hobby" id="" value="LoL" />LoL
		<input type="checkbox" name="hobby" id="" value="HoS" />HoS
		<input type="submit" value="전송" />
	</form>
</body>
</html>
  • java

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

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("/day2/prtHobby.do")
public class PrtHobby extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPro(req, resp);
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		doPro(req, resp);
	}

	private void doPro(HttpServletRequest req, HttpServletResponse resp) throws IOException {
		req.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html;charset=UTF-8");

		// 2개 이상의 값이 넘어오는 경ㅇ getParameterValues 사용
		String[] hobbys = req.getParameterValues("hobby");

		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		pw.println("<head>");
		pw.println("<meta charset='UTF-8'>");
		pw.println("<body>");
		
		for(String l : hobbys) {
			pw.println("<h1>넘어온 값 : "+l+"</h1>");
		}
		
		pw.println("</body>");
		pw.println("</head>");
		pw.println("</html>");
	}

}

6. GenericServlet

  • HttpServlet 가 상속받는 서블릿의 부모
  • 라이프 사이클 : init() -> service() -> destory()
  • 프로토콜에 상관없이 get, post 에 상관없이 사용가능!
    • 정확히는 doGet, doPost 대신 service() 메소드가 호출되는 방식

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

import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;

// 서블릿 라이프 사이클은 : init() -> service() -> destory()
@WebServlet("/myServlet.do")
public class MyServlet2 extends GenericServlet {
	
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("서블릿 시작중");
	}

	@Override
	public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("service() 호출중");
		req.setCharacterEncoding("UTF-8");
		res.setContentType("text/html;charset=UTF-8");

		PrintWriter pw = res.getWriter();

		pw.println("<html>");
		pw.println("<head>");
		pw.println("<meta charset='UTF-8'>");
		pw.println("<body>");
		pw.println("<h1> GenericServlet 를 상속받은 서블릿 </h2>");		
		pw.println("</body>");
		pw.println("</head>");
		pw.println("</html>");

	}
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("서블릿 제거중");
	}
	

}

Reference

https://javacpro.tistory.com/43

 

[JSP] JSP (JavaServer Pages ) 란 무엇인가?

JSP (JavaServer Pages ) 란 무엇인가? JSP 란 JavaServer Pages 의 약자이며 HTML 코드에 JAVA 코드를 넣어 동적웹페이지를 생성하는 웹어플리케이션 도구이다. JSP 가 실행되면 자바 서블릿(Servlet) 으로 변환..

javacpro.tistory.com

 

https://velog.io/@kdhyo/Apache-Tomcat-%EB%91%98%EC%9D%B4-%EB%AC%B4%EC%8A%A8-%EC%B0%A8%EC%9D%B4%EC%A7%80

 

Apache? Tomcat?? 둘이 무슨 차이지?

학교에서 php를 하고, 회사에서 spring boot + jsp를 사용하면서아파치 톰캣을 자연스럽게 사용하게 되었다.하지만, 사용하는 동안 이게 도대체 무엇이길래 웹을 할 때 많은 곳에서 사용하는지?이게

velog.io

 

댓글