웹페이지를 다룰 때 데이터를 입력 및 전송하여 데이터를 수신하는 작업을 많이 한다.
1. 데이터 입력 + 전송하는 페이지
2. 데이터 수신하는 결과 페이지
위 두 페이지로 데이터 입력 및 전송, 수신하는 페이지를 만들어본다.
Ex02_Send.java : 입력 + 전송
Ex02_Receive.java : 수신 + 처리
🔻데이터 송수신 페이지 작성
temp.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>데이터 수신</h1>
<p>데이터 처리가 완료되었습니다.</p>
</body>
</html>
doGet(), doPost()에 넣을 html을 html파일을 따로 만들어 작성하고 복사하여 붙여넣는 것이 편하다.
Ex02_Send.java
사용자에게 데이터를 입력받고 Ex02_Receive.java로 전송한다.
package com.test.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Ex02_Send extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setCharacterEncoding("UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("<!DOCTYPE html>"
+ "<html>"
+ "<head>"
+ "<meta charset=\"UTF-8\">"
+ "<title>Insert title here</title>"
+ "</head>"
+ "<body>"
+ " <h1>데이터 전송</h1>"
+ " <form method=\"GET\" action='/servlet/receive.do'>"
+ " <div>"
+ " 이름: <input type=\"text\" name=\"name\">"
+ " </div>"
+ " <div>"
+ " 나이: <input type=\"text\" name=\"age\">"
+ " </div>"
+ " <input type=\"submit\" value=\"보내기\">"
+ " </form>"
+ " "
+ "</body>"
+ "</html>");
writer.close();
}
}
위에서 작성한 temp.html을 writer.println에 붙여넣는다.
" <form method=\"GET\" action='/servlet/receive.do'>"
action 에 경로를 지정할 때 root context 를 앞에 붙여야한다.
Ex02_Receive.java
Ex02_Send.java에서 전송한 데이터 값을 수신하고 페이지에 출력한다.
package com.test.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Ex02_Receive extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//데이터 수신
//<input type="text" name="name">
//<input type="text" name="age">
//HttpServletRequest req
//데이터를 수신하는 역할
String name = req.getParameter("name");
String age = req.getParameter("age");
System.out.println(name);
System.out.println(age);
resp.setCharacterEncoding("UTF-8");
PrintWriter writer = resp.getWriter();
writer.println("<!DOCTYPE html>\r\n"
+ "<html>\r\n"
+ "<head>\r\n"
+ "<meta charset=\"UTF-8\">\r\n"
+ "<title>Insert title here</title>\r\n"
+ "</head>\r\n"
+ "<body>\r\n"
+ " <h1>데이터 수신</h1>\r\n"
+ " <p>데이터 처리가 완료되었습니다.</p>\r\n"
+ " \r\n"
+ "</body>\r\n"
+ "</html>");
writer.close();
}
}
HttpServletRequest req가 데이터를 수신하는 역할을 한다.
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"
version="4.0">
<display-name>servletTest</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<!-- send & receive -->
<servlet>
<servlet-name>send</servlet-name>
<servlet-class>com.test.servlet.Ex02_Send</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>send</servlet-name>
<url-pattern>/send.do</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>receive</servlet-name>
<servlet-class>com.test.servlet.Ex02_Receive</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>receive</servlet-name>
<url-pattern>/receive.do</url-pattern>
</servlet-mapping>
</web-app>
🔻데이터 전송 방식
1. GET
- 입력값을 전송받은 name, age들을 QueryString(=파라미터들)이라고 한다.
- http://localhost:8090/servlet/receive.do?name=hong&age=20
- URL의 일부로 데이터를 첨부하여 전송한다. 데이터는 주소 표시줄에 노출된다.
- URL에 데이터가 노출되기 때문에 비밀 정보나 민감한 정보를 전송하기에는 적합하지 않다.
- URL의 길이에 제한이 있기 때문에 전송할 수 있는 데이터의 양이 제한된다.
2. POST
- HTTP 요청의 본문(body)에 데이터를 담아 전송한다. 데이터는 URL에 노출되지 않는다.
- GET 방식보다는 보안적으로 더 안전하다.
- POST 요청은 헤더에 Content-Length를 통해 전송되는 데이터의 길이를 표시하기 때문에, 길이 제한이 없다.
그냥 get방식의 코드를 post로 변경하면 405에러가 난다.
서블릿은 요청을 당하면 자동으로 호출하는 doGet(), goPost() 메소드가 있다.
GET방식으로 요청하면 doGet()이 호출되고 , POST방식으로 요청하면 doPost()가 호출된다.
따라서, 전송 방식에 따라 수신할 파일에서 doGet()메소드를 작성할 지, doPost()를 작성할 지 달라진다.
'SERVER(Servlet, JSP)' 카테고리의 다른 글
[JSP] JSP 구성요소 (JSP 지시자, 스크립트 요소, 액션 태그) (0) | 2023.10.17 |
---|---|
[JSP] JSP 프로젝트 생성 (0) | 2023.10.17 |
[servlet] 정적 페이지와 동적 페이지의 작동 원리 (0) | 2023.10.17 |
[servlet] servlet 클래스 에러 대처법 (0) | 2023.10.17 |
[Server] Servlet 기초 (0) | 2023.10.16 |