👩💻 자바 개발자 양성과정 25일차
- Servlet 작동 방식
- 이클립스에서 run하는 것과 bin/startup.bat의 차이
- Servlet의 GET/POST
- 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>");
}
}
🍔 효율적인 변수선언 방식
이렇게 한번에 변수를 선언하고 가공하기보다
사용 직전에 변수를 선언하는 방식🔽을 선호함