원래는 request와 response의 내용을 모두 다뤄야 하지만 오늘은 Main페이지에서 action (form태그)를 사용하여 데이터 전달하여 받는 법을 알아보려 한다.
- 사칙연산 예제 : JSP -> Servlet 데이터 전달하여(연산은 따로 java에서) servlet에서 응답해주는 예제
// Main Source
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>계산기 - JSP 페이지</title>
</head>
<body>
<h1>JSP로 만든 페이지</h1>
<form action="Oper" method="post">
<p>수식을 입력하세요(두 정수의 사칙 연산)</p>
<input type="text" name="input">
<button type="submit">확인</button>
</form>
</body>
</html>
//project - java Resources - src - java파일(연산이 필요한 내용)
package com.koreait.servlet;
public class Calc {
public int num1;
public int num2;
public Calc() {;}
public Calc(int num1, int num2) {
super();
this.num1 = num1;
this.num2 = num2;
}
//두 정수의 사칙연산 메소드 4개 선언
public int add() {return num1 + num2;}
public int sub() {return num1 - num2;}
public int mul() {return num1 * num2;}
/**
* @throws ArithmeticException
*/
public int div() {return num1 / num2;}
}
// 서블릿의 doGet, doPost를 사용하여 연산후 데이터 표현
package com.koreait.servlet;
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;
/**
* Servlet implementation class Oper
*/
@WebServlet("/Oper")
public class Oper extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Oper() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
String input = request.getParameter("input");
int result = 0, count = 0, temp = 0;
Calc c = null;
String[] arTemp = null;
PrintWriter out = response.getWriter();
String opers = "+-*/";
for (int i = 0; i < opers.length(); i++) {
for (int j = 0; j < input.length(); j++) {
if(opers.charAt(i) == input.charAt(j)) {
count++;
temp = i;
}
}
}
out.print("<p>");
if(count == 1) {
arTemp = input.split("\\" + opers.charAt(temp));
try {
c = new Calc(Integer.parseInt(arTemp[0]), Integer.parseInt(arTemp[1]));
switch(temp) {
case 0:
result = c.add();
break;
case 1:
result = c.sub();
break;
case 2:
result = c.mul();
break;
case 3:
result = c.div();
break;
}
out.println("결과 : " + result);
} catch (NumberFormatException e) {
out.println("정수만 입력하세요.");
} catch (ArithmeticException e) {
out.println("0으로 나눌 수 없다.");
}
}else if(count == 0) {
out.println("연산자를 찾지 못했습니다.");
}else {
out.println("두 정수의 연산만 가능합니다.");
}
out.println("</p>");
out.print("<a href='calc'>JSP 페이지로 이동</a>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
+) servlet에서 응답하는데 URL을 숨기고 싶을때 사용하는 Mapping기능!
: WEB-INF -> web.xml
// Main Source
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP 페이지</title>
</head>
<body>
<h1>JSP로 만든 페이지</h1>
// Hello라는 이름으로 가면 servlet으로 이동한다.
<form action="Hello" method="post">
// get 또는 post로 보내면 서블릿에서 그에 해당하는 메소드를 실행
// post는 servlet 맵핑으로 url이 /Baby로 끝난다.
<p>서블릿으로 이동</p>
<button type="submit">이동</button>
</form>
</body>
</html>
// servlet
package com.koreait.servlet;
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;
/**
* Servlet implementation class MyServlet
*/
// 어노테이션에 Hello로 지정되어있기 때문에 Main Source에서 action을 하면 서블릿으로 넘어간다.
@WebServlet("/Hello")
public class MyServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public MyServlet() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body><h1>서블릿으로 만든 페이지</h1>");
out.println("<a href='index.jsp'>jsp로 이동!</a></body></html>");
out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html><body><h1>서블릿으로 만든 페이지</h1>");
out.println("<a href='Baby'>jsp로 이동!</a></body></html>");
out.close();
}
}
// web.xml
// servlet Mapping
<?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>day02</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>
<servlet>
<servlet-name>baby-jsp</servlet-name>
<jsp-file>/index.jsp</jsp-file>
</servlet>
<servlet-mapping>
<servlet-name>baby-jsp</servlet-name>
<url-pattern>/Baby</url-pattern>
</servlet-mapping>
</web-app>
=> Main Source에서 action을 진행할때 method방식은 get과 Post방식이 있다.
get방식:
- 주소에 데이터를 추가하여 전달 하는 방식
- ?(물음표)이후부터는 쿼리 스트링이라고 부르며 key:value 의 세트로 데이터가 전송된다.
- 보통 쿼리 스트링에 포함되어 전송되므로 길이에 제한이 있으며, 주소에 데이터가 보이므로 보안상 취약점이 존재한다.
- 중요한 데이터 혹은 길이가 긴 데이터는 POST방식을 사용하여 요청하는 것이 좋지만
GET방식이 POST 방식보다 상대적으로 빠르다. 그러나 상대적일 뿐 둘다 빠르게 느껴진다.
post방식 :
- 데이터를 별도로 첨부하여 전달하는 방식
- 브라우저 히스토리에도 남지 않고 데이터는 쿼리 문자열과는 별도로 전송된다.
- 데이터의 길이에 제한도 없으며, GET방식보다 보안성이 높다
- GET방식보다 상대적으로 느리다
결론 :
전송할 데이터의 양이 작고 노출되어도 무방하다면 GET방식을 사용하고
전송할 데이터의 양이 크거나 노출이 되면 안될 데이터라면 POST방식을 사용한다.
// GET 방식 - 자기페이지에 request 전송
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>GET 방식의 요청</title>
</head>
<body>
<h1>GET 방식의 요청</h1>
<%
String city = request.getParameter("city");
String zipcode = request.getParameter("zipcode");
if(city == null || zipcode == null){
response.sendRedirect("post_test.jsp");
}else{
%>
<!-- 자신에게 보낼때는 action을 생략 할 수 있다. -->
<form>
<input type="text" value="Seoul" name="city" readonly>
<input type="text" value="12388" name="zipcode" readonly>
<button> GET방식으로 요청 보내기!</button>
</form>
<p>
<%=city %> <%=zipcode %>
</p>
<%} %>
</body>
</html>
// POST 방식
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>POST 방식 전송 예제</title>
</head>
<body>
<h1>POST방식 전송 예제</h1>
<form action="get_test.jsp" method="post">
<input type="text" value="Seoul" name="city" readonly>
<input type="text" value="12388" name="zipcode" readonly>
<button> POST방식으로 요청 보내기!</button>
</form>
</body>
</html>
'프로그래밍 공부 > JSP' 카테고리의 다른 글
[lesson] JSP - 자바빈즈(JAVABEANS) (2) | 2023.01.10 |
---|---|
[lesson] JSP - 쿠키(Cookie) + 세션(Session) (0) | 2023.01.10 |
[lesson] JSP - 내장객체 (0) | 2023.01.10 |
[lesson] JSP - Ajax (Asynchronous Javascript and Xml) (0) | 2023.01.10 |
[lesson] JSP - 개요 (0) | 2021.09.08 |