JAVA/JAVA개발자 양성과정

[Servlet/JSP] Servlet 작동 방식

728x90
반응형

👩‍💻 자바 개발자 양성과정 25일차

  1. Servlet 작동 방식
  2. 이클립스에서 run하는 것과 bin/startup.bat의 차이
  3. Servlet의 GET/POST
  4. Servlet에서 txt파일 내용 읽기

 

🍔 Servlet서브렛 작동방식

 <!-- 1. aliases 설정 -->
<servlet>
    <servlet-name>welcome</servlet-name>
    <servlet-class>servlets.WelcomeServlet</servlet-class>
</servlet>

<!-- 2. 매핑 -->
<servlet-mapping>
    <servlet-name>welcome</servlet-name>
    <url-pattern>/welcome</url-pattern>
</servlet-mapping>

예 : http://localhost:8080/servletWebApp/hello

 

Context Path  : servletWebApp

 

servletWebApp가 있는지 확인함

web.xml을 찾음

servlet-class에서 servletWebApp를 찾음

연결된 url-pattern으로 servletWebApp을 응답함

 

servletWebApp가 있는지 확인함

@WebServlet(value = "/hello") 를 확인함

연결된 /hello으로 servletWebApp을 응답함

 

 

jsp매핑

<servlet>
	<servlet-name>home-jsp</servlet-name>
	<jsp-file>/home.jsp</jsp-file>
</servlet>

<servlet-mapping>
	<servlet-name>home-jsp</servlet-name>
	<url-pattern>/home</url-pattern>
</servlet-mapping>

🍔 html form과 servlet연결하기

- 프로그램과 설정을 이것저것 바꿔줘야 하는데 그건 비공개로 올려둔 파일 확인 할 것

 

html from action에서 이부분과

servlet에서 @WebServlet괄호 내 부분을 같게 설정해주어야 오류가 안난다.

 


🍔 이클립스에서 run하는 것과 bin/startup.bat의 차이

이클립스에서 껏다 켰다 하는건 이클립스의 서버를 사용해서 껏다 켰다 하는거고

window폴터 bin에서 껏다 켰다 하는건 톰캣의 서버를 사용해서 껏다 켰다 하는것임


🍔 Serlet에서 GET 받기

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Get 방식</title>
</head>
<body>
	<form action="/servletWebApp/getData" method="get">

		이름 : <input type="text" name="name"><br>
		나이 : <input type="text" name="age"><br>
		<button type="submit">전송</button>
		<button type="reset">취소</button>

	</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("/getData")
public class GetDataServlet extends HttpServlet {
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		//1. 요청 파라미터를 구한다.
		String name = request.getParameter("name");
		String age = request.getParameter("age");
		
		//2. 컨텐트 타입을 설정한다.
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter pw = response.getWriter();
		pw.println("<html><body>");
		pw.println("이름은"+name+"나이는"+age);
		pw.println("</html></body>");
	}

}

🍔 Serlet에서 POST 받기

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Post 방식</title>
</head>
<body>
	<form action="/servletWebApp/postData" method="post">

		이름 : <input type="text" name="name"><br>
		email : <input type="email" name="email"><br>
		<button type="submit">전송</button>
		<button type="reset">취소</button>

	</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(value = "/postData")
public class PostDataServlet extends HttpServlet {
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		//post로 받아온 데이터를 출력하기 위해선 인코딩을 바꿔줘야 한다.
		//get으로 받아온 데이터는 출력할때 인코딩을 바꿔주기만 하면 된다.
		request.setCharacterEncoding("utf-8");🍕
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		
		response.setContentType("text/html; charset=utf-8");🍕🍕
		PrintWriter pw = response.getWriter();
		pw.println("<html><body>");
		pw.println("이름"+name+"이메일"+email);
		pw.println("</html></body>");
		pw.close();
		
	}

}

🍕 request.setCharacterEncoding("utf-8");

post로 받아온 데이터는 받자마자 인코딩을 바꿔줘야 한다.

 

🍕 🍕 response.setContentType("text/html; charset=utf-8");

get으로 받아온 데이터는 출력할때 인코딩을 바꿔주기만 하면 된다.

 


🍔 Serlet에서 여러개의 파라미터 받아오기

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Post 방식</title>
</head>
<body>

	<!-- http://localhost:8080/servletWebApp/multiData?hobby=game&hobby=climb&hobby=movie -->
	<form action="/servletWebApp/multiData" method="get">
		<h1>취미를 선택하시오</h1>
		<input type="checkbox" name="hobby" value="game">게임<br> <input
			type="checkbox" name="hobby" value="climb">등산<br> <input
			type="checkbox" name="hobby" value="movie">영화<br> <input
			type="checkbox" name="hobby" value="music">음악<br>
		<button type="submit">전송</button>

	</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("/multiData")
public class MultiDataServlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 1.요청 파라미터를 구한다.
		String[] hobbies = request.getParameterValues("hobby"); 🍕

		// 2.Content-type 변경
		response.setContentType("text/html; charset=utf-8");

		String str = "";
		if (hobbies != null) {
			for (String hobby : hobbies) {
				str += hobby;
			}
		}

		// 3. 문자기반의 출력 스트림을 생성한다.
		PrintWriter pw = response.getWriter();
		if(hobbies == null || str.equals("")) {
			pw.println("선택된 것이 없습니다."+str.equals(""));
		}else {
			pw.println(str);
		}
		pw.close();
	}
}

🍕 String[] hobbies = request.getParameterValues("hobby"); 

여러개의 데이터를 파라미터로 받아올때는 이렇게하면 배열 형식으로 여러개 가져올수 있다


🍔 Serlet에서 txt파일 내용 읽기

public class FileInpusStreamTest {
	public static void main(String[] args) {
		FileInputStream fis = null;
		try {
			fis = new FileInputStream("C:/io/data.txt");
			
			byte[] buf = new byte[10];
			int readByte = 0;
			//읽어들일 데이터가 있을때까지 값을 내다가 없으면 -1을 값으로 낸다.
			while((readByte = fis.read(buf)) != -1) {
				//System.out.printf("readBtye:%d%n", readByte);
				
				System.out.write(buf, 0, readByte); 🍕
				
				//만약 아래와 같이 하면 256초과전의 데이터는 업데이트가 되지 않는다.
				//System.out.write(buf); 🍕🍕
			};
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (fis != null)
					fis.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}

🍕 System.out.write(but, 0, readByte)

txt파일내 존재하는 데이터 만큼 출력된다.

0부터 존재하는 데이터까지(readByte) 출력하라고 해주었기 때문임

 

🍕🍕 System.out.write(buf);

하지만 범위를 특정해주지않으면 자연스럽게 10바이트만큼 실행되기에 

빈칸에는 이전 데이터가 채워지게 되면서 올바르지 않은 값이 나오게 된다.


🍔 Servlet 오늘 배운거 활용하기 (get으로 form값 전달하기)

formData.html

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Insert title here</title>
</head>
<body>
	<form action="/servletWebApp/formData" method="get">
		<p>
			이름 : <input type="text" name="name">
		</p>
		<p>
			성별 : <input type="radio" name="gender" value="M" id="M"><label
				id="M">남</label> <input type="radio" name="gender" value="F" id="F"><label
				id="F">여</label>
		</p>
		<p>
			직업 : <select name="job">
				<option value="1">학생</option>
				<option value="2">프로그래머</option>
				<option value="3">디자이너</option>
				<option value="4">엔지니어</option>
			</select>
		</p>
		<p>좋아하는 색상 : 
			<input type="checkbox" name="color" value="red"> 빨강
			<input type="checkbox" name="color" value="orange"> 오렌지
			<input type="checkbox" name="color" value="pink"> 핑크
			<input type="checkbox" name="color" value="blue"> 파랑
		</p>
		<button type="submit">전송</button>
	</form>
</body>
</html>

 

GetFormDataServlet.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("/formData")
public class GetFormDataServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// get변수 설정
		String namePost = request.getParameter("name");
		String genderPost = request.getParameter("gender");
		String jobPost = request.getParameter("job");
		String[] colorPost = request.getParameterValues("color");
		
		// 이름
		String name = namePost.trim();
		
		// 성별
		String gender = "";
		if (genderPost.equals("M")) {
			gender = "남자";
		} else if (genderPost.equals("F")) {
			gender = "여자";
		}
		
		// 직업
		int jobNum = Integer.parseInt(jobPost);
		String[] jobList = { "학생", "프로그래머", "디자이너", "엔지니어" };
		String job = jobList[jobNum - 1];
		
		//좋아하는 색상
		String color = "";
		if(colorPost != null) {
			if(colorPost.length == 1) {
					color = colorPost.toString();
			}else {
				for (String colorStr : colorPost) {
					color += colorStr + ", ";
				}
			}
		}
		
		// 출력
		response.setContentType("text/html; charset=utf-8");
		PrintWriter pw = response.getWriter();
		pw.println("<html><body>");
		pw.println("이름 : " + name + "<br>성별 : " + gender + "<br>직업 : " + job + "<br>좋아하는 색상 : " + color );
		pw.println("</html></body>");
	}

}

🍔 효율적인 변수선언 방식

이렇게 한번에 변수를 선언하고 가공하기보다

사용 직전에 변수를 선언하는 방식🔽을 선호함

 

728x90
반응형