728x90

이 강의는 JSP를 다루는 방법에 대해서 강의를 하지만 웹서버(tomcat이나 glassfish 등)를 어떻게 다루는지나 IDE(Eclipse,IntelliJ 등)를 어떻게 사용하는지는 거의 다루지 않는다. 이 JSP강의 시리즈들은 JSP를 어떻게 다루는지에 대한 서술이 주로 이루어져있다. 그런 자료들이 필자의 블로그에 Usage-Java-JSP카테고리에 소개되어있으므로 이를 참고해주면 되겠다. 중간 중간에 꼭 필요한 부분에서 링크를 걸어서 진행하니 큰 걱정은 할 필요는 없다. 그러니 강의를 보다가 정보가 나오지 않는다면 반드시 위 카테고리를 참고하자. 그래도 모르는게 있으면 쪽지나 답글로 질문하라.


또한 JSP는 웹을 다루는 기술이다보니 html,css,js등이 사용이 되는 경우가 있다. 이러한 부분을 필자가 일일히 가르키면서 진행할 수 없다. html,css의 경우 마크업언어이지만 마크업언어라고 단순히 치부하기에는 너무나도 기능이 많고 속성이 많다. 또한 js는 그냥 하나의 프로그래밍 언어라서 이걸 가르치려면 아예 Java수준으로 가르쳐야된다는 문제점이 있다. 필자 블로그에서 이들에 대한 포스팅역시 제공하고 있다. 찾아서보면 된다.


그러나 만약 찾는게 없다면 구글링에 의존하라.


저번시간에는 기본적인 request, response모델로 간단한 Servlet을 만들어 봤다.

그런데 저번 시간에 정말 간단한 request, 즉 정말 간단한 호출을 했다.

그래서 이번시간에는 form을 사용해서 호출하는것을 보여주려고 한다.


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login">
id : <input type="text" name="loginId"/><br>
password : <input type="text" name="loginPassword"><br>
<input type="submit">
</form>
</body>
</html>


정말 간단한 폼이다. 예제다운 폼인데 id와 password를 받아서 넘기는 코드이다.

저기서 submit버튼을 누르면 action이 실행되는데 url이 login이다.

그러면 login이 필요하므로 새 서블릿을 만들어 보자.


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "LoginServlet", urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("loginId");
String password = request.getParameter("loginPassword");

response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Login Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Id는 " + id + "입니다.");
out.println("password의 길이는 " + password.length() + "입니다.");
out.println("</body>");
out.println("</html>");
}
}


이 서블릿에서는 이제 드디어 request, 즉 호출클래스를 사용한다.

request에서 form으로 전달한 값을 사용하려면 getParameter를 사용해야한다.

이때 form에서 전달되는 값은 name속성으로 접근한다.


한번 예제를 실행해보자.



inedx.html에 값을 각각 넣어보자. 제대로된 테스트를위해서 한글을 넣어서 보내주는게 좋다.



보면 ID와 패스워드가 제대로 전달된걸 확인할 수있다.

이때 주소창을 신경써보면 url끝에 ?가 붙고 뒤에 각각 파라미터에 대한 값이 붙어있다.

그리고 각각의 파라미터들은 &로 연결된다. &는 양쪽 사이에 공백이 없다.


이렇게 보내는 방식을 method라고 하고 주소 뒤에 붙어서 사용하는 방식을 get방식이라고 한다.

get방식은 url을 사용하기 때문에 url길이만큼의 제한이 있다. 참고로 url길이의 제한은 2048자이다.

그러나 만약 아이디와 패스워드가 노출이 된다고 생각해봐라.

해커들이 매우 좋아할거다. 그냥 패스워드를 대놓고 보여주니 말이다.

그러면 http상으로 아이디 패스워드를 사용하는 방법은 자취를 감췃을 것이다.

이제 새로운 방식이 필요하다. 그것이 post이다.


<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
id : <input type="text" name="loginId"/><br>
password : <input type="text" name="loginPassword"><br>
<input type="submit">
</form>
</body>
</html>


post로 response하기 위해서는 보내는 쪽도 request해야한다.

그 방법이 바로 form의 method를 post로 적어주는것이다.

get을 보낼때는 적지 않았는데 이 때까지 누누히 말했지만 아무것도 안적으면 get이다.

물론 명시적으로 get을 적어줘도 문제는 없다.

여기서 위 서블릿을 바로실행하면 어떨까? 한번 시행해보라



실행했지만 아무것도 뜨지 않는다. 그 이유를 알겟는가?

왜냐하면 우리의 doPost는 비어있기 때문이다. 코드를 아래와같이 바꿔보자.


import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet(name = "LoginServlet", urlPatterns = {"/login"})
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("loginId");
String password = request.getParameter("loginPassword");

response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Login Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("여기는 post 입니다.");
out.println("Id는 " + id + "입니다.");
out.println("password의 길이는 " + password.length() + "입니다.");
out.println("</body>");
out.println("</html>");
}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("loginId");
String password = request.getParameter("loginPassword");

response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<title>Login Servlet</title>");
out.println("</head>");
out.println("<body>");
out.println("Id는 " + id + "입니다.");
out.println("password의 길이는 " + password.length() + "입니다.");
out.println("</body>");
out.println("</html>");
}
}


doPost에도 코드를 적어준다.

doPost는 doGet과 한줄이 다른데 이는 그냥 post인걸 구별하기위해서 필자가 넣었다.

그럼 실행해보자.



이제 다시 전송해보자.



이번에는 post라인에 우리가 써주었으므로 제대로 작동하는 것을 볼 수있다.


요즘에는 RESTFul이 대세이고 이 RESTFul시스템이서는 post가 None RESTFul에비해서 다른 의미를 가진다.

그러나 여기서 RESTFul을 설명하는건 조금 힘이 드므로 그냥 None RESTFul로 설명하자.


일단 Get과 Post의 장단점을 알아야한다,

post는 파라미터를 폼에 숨겨서 보낸다. 그래서 외부에 쉽게 노출되지 않는다는 장점이 있다.

게다가 get은 url을 쓰기에 길이의 제한이 있는것도 문제다.

그러나 항상 post가 좋은건 아니다. url을 쓰지 않는 다는건 상태가 유지되지 않는 다는 것이다.

예를들어서 파라미터를 우리가 직접 붙혀넣어 줄수도 있는데 post는 그게 불가능하다.


그래서 보통 용도가 나뉜다. 상태가 유지될 필요성이 있다면(검색엔진, 세부 페이지등) get을 쓰고

반대로 보안(비밀번호)을 사용하거나  일반적인 상황에서는 get을 쓴다.


※근데 사실 post도 작정하고 긁어내려면 긁어낼 수 있다.

아래의 상황을 보자.



제일 아래쪽 Form Data를 보자. 보다시피 패킷을 분석해내면 얼마든지 알아낼 수 있다.

따라서 post라서 안전해!!는 솔직히 말하면 아무 상관없다.

이걸 보안을 유지하려면 Form데이터를 암호화해서 보내야한다. 이런것을 SSL(Secret Socket Layer)을 사용해야한다.

그러나 이 내용은 강의에 맞지 않기에 생략하도록 하겠다.


'Programming > Java-JSP' 카테고리의 다른 글

[JSp-06]Declaration(선언문)  (0) 2017.10.15
[JSP-05]Expression(표현식)  (0) 2017.10.15
[JSP-04]Screptlet(스크립트릿)  (0) 2017.10.11
[JSP-03]JSP  (0) 2017.10.11
[JSP-01]Servlet  (0) 2017.10.10

+ Recent posts