본문 바로가기
학습/JSP

5. 서블릿 (POST 방식, 자바스크립트로 서블릿에 요청, 로그인 요청시 유효성 검사하기)

by Elfen Lied 2022. 11. 2.
반응형

- POST 방식

- 한글 인코딩 (utf-8)

  • src/main/java에 서블릿(LoginServlet3)을 만들어주고 doGet()과 doPost()만 남기고 다 지움
  • webapp에 login3.html 생성

 

package sec03.ex01;

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("/login3")
public class LoginServlet3 extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet()");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost()");
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8"); // 마임타입 지정
		PrintWriter out = response.getWriter();
		
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		System.out.println("아이디 : " + id);
		System.out.println("비밀번호 : " + pw);

		StringBuffer sb = new StringBuffer();
		sb.append("아이디 : " + id + "<br>");
		sb.append("비밀번호 : " + pw);
		out.print(sb);
	}

}

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login3" method="post">
	아이디 : <input type="text" name="user_id"><br>
	비밀번호 : <input type="text" name="user_pw"><br>
	<button>로그인</button>
</form>
</body>
</html>

한글로 아이디 비번을 요청했을때 안깨지고 잘 나오면 된다

 

 

 

- get과 post의 요청과 응답을 한곳에서 처리하기

  • src/main/java에 서블릿(LoginServlet4)을 만들어주고 doGet()과 doPost()와 doHandle() 만들어 준다
  • doHandle()에 throws 부분을 붙여준다.
  • webapp에 login4.html 생성
package sec01.ex02;

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("/login4")
public class LoginServlet4 extends HttpServlet {

	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doHandle");
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		
		out.print("<h3>아이디 : " + id + "</h3>");
		out.print("<h3>비밀번호 : " + pw + "</h3>");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet");
		doHandle(request, response); // request든 response든 어떤 걸로 받더라도 doHandle에서 처리
	}


	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPost");
		doHandle(request, response);
	}

}

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="login4" method="post">
	아이디 : <input type="text" name="user_id"><br>
	비밀번호 : <input type="text" name="user_pw"><br>
	<button>로그인</button>
</form>
</body>
</html>

콘솔을 확인하면 get 요청해도 doHandle이 받고 post 요청해도 doHandle이 받는다.

 

 

 

- 자바스크립트로 서블릿에 요청 & 로그인 요청시 유효성 검사하기

  • src/main/java에 서블릿(LoginServlet5)을 만들어주고 doPost()만 만들어 준다
  • webapp에 login5.html 생성
package sec01.ex03;

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("/login5")
public class LoginServlet5 extends HttpServlet {

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		String addr = request.getParameter("user_addr");
		
		StringBuffer sb = new StringBuffer();
		sb.append("아이디 : " + id + "<br>" );
		sb.append("비밀번호 : " + pw + "<br>" );
		sb.append("주소 : " + addr);
		out.print(sb);
	}

}

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form name="frmLogin">
        아이디 : <input type="text" name="user_id"><br>
        비밀번호 : <input type="text" name="user_pw"><br>
       	<input type="hidden" name="user_addr" value="대구광역시"><br>
        <button type="button" onclick="fn_validate()">전송</button>
    </form>
</body>
<script>
    function fn_validate() {
        var frmLogin = document.frmLogin;
        var id = frmLogin.user_id.value.trim();
        var pw = frmLogin.user_pw.value.trim();
        if (id == '' || id == '') {
            alert("아이디 또는 비밀번호를 입력하세요");
            return;
        } 
        frmLogin.action = 'login5'; // 폼태그의 action속성값 설정
        frmLogin.method = 'post'; // 폼태그의 method속성값 설정
        frmLogin.submit(); // 폼태그의 action 속성 실행
    }
</script>
</html>

주소는 input type이 hidden이고 value로 "대구광역시"로 줬기때문에 로그인 시에는 안보이지만

로그인 한뒤에는 같이 표시된다.

 

 

 

- 데이터베이스 처럼 값 지정 해놓고 로그인 하기

  • src/main/java에 서블릿(LoginTest)을 만들어주고 doGet()과 doPost()와 doHandle() 만들어 준다
  • src/main/java에 클래스(MemberDao) 만들어준다 (싱글톤으로 작성)
  • webapp에 loginTest.html 생성
package sec01.ex04;

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("/loginTest")
public class LoginTest extends HttpServlet {
	
	private MemberDao dao = MemberDao.getInstance();
	
	private void doHandle(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		String id = request.getParameter("user_id");
		String pw = request.getParameter("user_pw");
		boolean result = dao.login(id, pw);
		
		if(result) {
			// 로그인 성공
			out.print("<div>" + id + "님이 로그인 함.</div>");
		} else {
			// 로그인 실패
			out.print("로그인 실패<br>");
			out.print("<a href='/pro07/loginTest.html'>로그인 페이지로</a>");
		}
	}
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request,response); 
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doHandle(request,response); 
	}

}

 

 

package sec01.ex04;

import java.util.HashMap;
import java.util.Map;

public class MemberDao {
	private static MemberDao dao = new MemberDao();
	private Map<String, String> members = new HashMap<String, String>();
	private MemberDao() {
		members.put("kim", "1234");
		members.put("na", "3456");
		members.put("park", "6789");
		members.put("lee", "0000");
	}
	
	public static MemberDao getInstance() {
		return dao;
	}
	
	public boolean login(String id, String pw) {
		String value = members.get(id);
		if(pw.equals(value)) {
			System.out.println("로그인 성공");
			return true;
		}
		return false;
	}
}

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="loginTest" method="post">
	아이디 : <input type="text" name="user_id"><br>
	비밀번호 : <input type="password" name="user_pw"><br>
	<button>로그인</button>
</form>
</body>
</html>

MemberDao에 있는 값들이 맞게 들어가면 

 

 

MemberDao에 있는 값들이 다르게 들어가면

 

반응형

댓글