ex05.JSP

바보·2023년 5월 14일

JSP

목록 보기
8/18

HTTP 요청 메서드


쓸 수 있는 요청 메서드는 이렇게 있지만
아직 DB관리하는 방법을 안 배워서
못쓴다고 말하심
쓸 수 있는 요청 메서드는 get과 post라는데..

일단 두가지를 알아보자.

<ul>
	<li>GET
    	<ul>
    		<li>요청 속도가 가장 빠르다</li>
        	<li>파라미터를 주소창에 담아서 보낸다</li>
        	<li>주소창은 길이 제한 있고 노출되기 떄문에 중요한 데이터에는 부적합</li>
        	<li>가장 일반적인 요청 메서드</li>
    	</ul>    
    </li>

<li>POST
    	<ul>
    		<li>GET 보단 속도가 떨어진다</li>
        	<li>파라미터를 HTTP Header에 담아서 보낸다</li>
        	<li>길이 제한이 딱히 없고, 주소창에 데이터가 노출되지 않는다</li>
    	</ul>    
    </li>
</ul>



+ POST는 GET보단 보안이 나은 편이지만
편지봉투라고 생각하면 좋다.
뜯기 전에는 볼 수 없지만
그냥 위에 부분만 뜯으면 내용이 쉽게 보이기 떄문에/ F12만 눌러서 확인해도 확인 가능함
<style>
fieldset { display: inline-block; }
</style>
<fieldset>
	<legend>GET</legend>
    	<form action="ex05_result.jsp" method="GET">
    		<p><input name="name" type="text" placeholder="이름" required></p>
			<p><input name="email" type="email" placeholder="이메일" required></p>
    			<button>전송</button>
    	</form>
</fieldset>


<fieldset>
	<legend>POST</legend>
    	<form action="ex05_result.jsp" method="POST">
			<p><input name="name" type="text" placeholder="이름" required></p>
			<p><input name="email" type="email" placeholder="이메일" required></p>
				<button>전송<button>
		</form>
</fieldset>


※ form 에서 작성하는 method는
기본 값이 get이라서 get은 생략이 가능하다
또, 메소드의 값은 보통 대문자로 주기 때문에
get도 상관없지만 GET으로 적어준다고 한다.
<%

request.setCharacterEncoding("UTF-8");GET 방식은 상관이 없지만
  POST 방식은 글자가 꺠지기 때문에
  요청.setc까지 입력하고 ctlr+space로 인코딩자동완성을 사용해
  깨지지 않게 맞춰주도록 하자.
  
String name = request.getParameter("name");
String email = request.getParameter("email");
%>

<ul>
  <li>이름: <%=name %></li>
  <li>이메일: <%=email %></li>
</ul>


GET 방식과
POST 방식이 어떻게 다른지 찍어봤다

주소창과
F12- 네트워크 -문서를 확인해서
요청 메서드를 확인해보자


Quiz1

quiz1.jsp			ID/PW를 입력 받을 수 있는 form을 작성
					데이터는 quiz1_result.jsp로 보낸다
                    단, 요청 메서드는 POST로 할 것
                    
                    
quiz1.result.jsp	문자열 배열로 ID/PW3개 정보 선언부에 생성해 둔다
					quiz1.jsp에서 전송된 ID/PW가 생성해둔 계정과 일치하는 것이 있으면
                    로그인 성공을 화면에 출력                                       
  • quiz1
<style>
fieldset { display: inline-block; }
</style>


<fieldset>
	<legend>quiz1</legend>

		<form action="quiz1_result.jsp" method="POST">
        <p><input name="userid" type="text" placeholder="ID입력" required></p>
        <p><input name="userpw" type="password" placeholder="PW입력" required>></p>
        <button>전송</button>
        
        </form>
</fieldset>
  • quiz1_result.jsp
선언부의 private 두 줄은 스켈레톤 코드
<%!
private String[] ids = new String[] { "itbank", "root", "user1" };
private String[] pws = new String[] { "it", "qwe", "1234" };
%>
<%
request.setCharacterEncoding("utf-8");

String userid = request.getParameter("userid");
String userpw = request.getParameter("userpw");

String result = login(userid, userpw);
String msg = "로그인 실패!!!";

if (result != null) {
	msg = result + "님 로그인!!!";
}
%>

이라고 정해두고
String result에 들어갈
userid와 userpw를 받을 수 있는 함수
login(,)을 만들어야 한다

<%!
private String[] ids = new String[] { "itbank", "root", "user1" };
private String[] pws = new String[] { "it", "qwe", "1234" };
------------------------------------------------------------



public String login(String id,String pw) {
	for (int i = 0; i < ids.length; i++) {
    	boolean sameId = ids[i].equals(userid);
        boolean samePw = pws[i].equals(userpw);
        
        if (sameId && samePw) {
        	return ids[i];
        }
    }
	return null;
}
%>
  
<h1>결과</h1>
<hr>
  
<h4><%=msg %><h4>

여러 변수를 만들지만 결국엔
login을 위한 변수들이다

html한다고 까먹은 기초적인 자바/c/파이썬 문법들이고
문법들이 java로 되어있다고 생각하면 편할것이다

모르겠으면 java든 c든 python이든
저 문제를 어떻게 풀지 해결하고
그 코드를 java로 써볼것!


지역변수VS맴버변수(= 필드)

자바에서 우선은 배운 내용인데
JSP에서 어떻게 사용하는가에 대해서
조금 더 짚고 넘어가보자

<%
  int n1 = 10; 		// 지역 변수
  					// - 페이지 요청시 생성되고
					// - 응답 후 메모리에서 제거
%>
    
    
<%!
  private int n2 = 10; // 맴버 변수

// - 서버 실행 후 페이지 최초 요청시 생성되고 서버가 종료되면 제거된다
// 페이지를 이동해도 서버가 꺼지기 전까지 유지됨
// 다른 페이지로 주소를 이동했다가
// 주소를 입력해서 해당 페이지로 돌아오더라도 값이 남아있다    
%>
    
  
  
  
그리고
private 는 선언부에서만 사용이 가능하다
아래의 긁어온 그림을 보고 어느정도 외워두면 좋다

위의 코드를 실행시키는 코드

<h4>F5를 눌려서 새로고침 해보기</h4>

<ul>
  <li>n1 = <%=n1++ %></li>
  <li>n2 = <%=n2++ %></li>
</ul>

결과는
n1 = 10
n2 = 11... 12... 13.. F5를 누를때마다 증가한다

왜 이런지를 설명을 위해
이전에 올린 ex03의 그림을 참조하면

Client가 서버에 요청(request)을 하면
순서대로
jsp -> java -> class 번역하며 컨파일하고
이후 응답(response)으로 돌려주는 과정이다.

하지만
서버도 효율을 위해서
이미 번역한 내용이 똑같은 내용이면
즉, 수정이나 서버를 새로 작동시키지 않는다면
다시 번역을 할 필요가 없어서 class를 바로 넘겨준다
request -> class -> response

무슨 언어를 배우든
지역변수에 선언한 내용들은 프로그램이 종료됨에 따라 거기서 끝나지만
전역변수에 선언한 내용은 프로그램이 종료되어도 남아있다

그래서 이 남아있는 함수를 처리하기 위해서
c언어에서는
n = 10으로 선언했으면
free(n)
n=NULL 해주면서 처리를 해줬었다

하지만...!
무려 자바는 가비지컬렉터 라는 녀석이
자동으로 알아서 해제를 도와준다.
즉, 프로그램이 끝나면 자동으로 사라지는 것이다.
하지만 그 해제가 더이상 참조되지 않는 단계에서 사라지는 것이기 때문에 언제인지는 정확하게 알 수 없다.

자동으로 없애준다는 것만 알아두자
하지만 우리는 F5를 통해서 다시 계속 불러오고 있으므로
남아있는 n2++의 값이 계속해서 실행되어 값이 증가하는 것을 볼 수 있다


Java Beans

  • Java Beans : 웹에서 데이터를 주고 받기 위한 객체
  • ex05_2.jsp
<form action="ex05_2_result.jsp" method="POST">
	<p><input name="name" type="text" placeholder="이름" required></p>
	<p><input name="age" type="number" placeholder="나이" required></p>
	<p><input name="height" type="number" step="0.1" placeholder="신장" required></p>
	<p><input name="email" type="email" placeholder="이메일" required></p>
		<button>전송</button>
</form>
  • ex05_2_result.jsp
<% request.setCharcterEncoding("utf-8"); %>

<jsp:useBean id ="per" class="beans.Person"/>
<%-- useBean은 데이터를 저장 받기 위한 객체를 생성하는 키워드 --%>
<%-- ctlr + space 누르고 jsp:u를 입력하면 자동완성 됨 --%>
  
<jsp:setproperty property="*" name="per"/> 
<%-- jsp:s 까지 입력해도 나옴 --%>
<%-- *는 파라미터명과 필드명이 같은 것을 찾아내서 대입한다 --%>
  
<ul>
  <li><%=per.getName() %></li>
  <li><%=per.getAge() %></li>
  <li><%=per.getHeight() %></li>
  <li><%=per.getEmail() %></li>
</ul>  

※ -1 << 위의 내용을 아래의 같은 문양에서 이어서 읽으면 됨


  • 보충설명 하고 넘어감
1) 이 문구는 스크립틀릿을 작성할 때 맨 위에 적는 것을 추천한다.
(어디서 써야할지 우리는 아직 잘 모르기 때문에)
(코드 쓰다가 중간에 쓰면 코드가 더러워질까봐..?가독성)
<% request.setCharacterEncoding("utf-8"); %>

  
2)
<jsp:useBean id="per" class="beans.Person">

이 구문은

Person per2 = new Person(); 이 코드를
태그형식으로 제공하는 것 뿐임


3)
<jsp:setPeroperty property="*" name="per"/>
파라미터를 받아서 위에서 생성한 per 객체에 모두 저장한다는 말임.

무슨 소리냐면

지금부터 이 스크립틀릿 <% %>class="beans.Peron"을 참조하여 - 2)
  
받아 온 파라미터들을 모두 per에 저장하겠다 - 3)
라는 말을 코드로 적은 것이다

이 코드들 덕분에
per.getName() 등등등 사용이 가능한 것이다.

※ -1 << 위의 내용을 이어서 아래의 내용을 읽으면 됨 ( 보충설명이 길어서..)

위의 처리방법 중에 beans의 도움을 받는데
이 beans의 위치는

Java Resources 의
src에
패키지를 beans로 만들어주고
그 안에 Person 이라는 클래스를 생성하였다

src에서 패키지를 만들지 않고 생성하게 되면
아래의 그림처럼 나오게 된다

이렇게 만들 수 있긴 하지만
패키지 default가 불가능하여 끌어 올 수 없다
그러므로 패키지를 생성해서 만들길 권장한다.

아래의 옵션들을 하나씩 보면
Modifiers 는 어떻게 만들것이냐이고
공유를 해야하므로 public으로 생성해야한다
Superclass는 자바오브젝트이고
뭐 그냥 손대지말고 패키지 만들어서 하자..

  • Person
package beans;

public class Person {
 private String name,email;
 pribate int age;
 private double height;
// 작성할 때 순서는 상관없고 int의 경우 자동 형변환까지 가능하다
  
}

일단 이렇게 작성을 해주고
private로 생성했기 때문에 접근제한자
겟/셋을 이용해서 public으로 사용가능하게
만들어 줘야한다.

어디에서?
private가 있는 클래스에서.

어떻게만드냐?
페이지에서 아무곳이나 우클릭
-> Source(소스) 클릭
-> Generate Getters and Setters.. 클릭
이러면 아래처럼 파일창이 만들어지는데

해당 하위 폴더에 겟터/세터 체크하는 부분이 각 각 있고
오른쪽에 Select All을 누르면 모두 체크가 된다
그 아래에는 게터만 다 체크인지 / 세터만 다 체크인지
정할 수 있다.
하위의 옵션은
After 'height' 뒤에다가 생성할건지 물어보는거고
Sort by: 정렬방식을 물어본다
Access modifier은 접근제어자를 어떻게 만들지인데
게터세터를 외부로 넘겨야하니
자연스레 public을 설정하면된다

이것도 위와 마찬가지로 그냥 손대지 않으면 알아서 만들어준다.
Select All만 누르면 됨.

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public double getHeight() {
		return height;
	}
	public void setHeight(double height) {
		this.height = height;
	}

그럼 이렇게 샤라락~ 다 알아서 만들어준다.
겟과 셋은 사실 정확하게 이해하고 있는 게 아니라..
get 으로 private의 값을 떙겨와서 함수로 return 시키고
그 return 시켜서 받은 값을
set 으로 밖으로 내보낼 준비를 하는 과정이라 생각한다.

그리고 이클립스에서 이렇게 긴 줄을 보기 싫다면
각 줄들을 모두 접는(맨 위의 줄만 보이게)기능이 있는데

ctlr + Shift + (키패드의) */ 를 조작하면
접었다 펼쳤다를 할 수 있다.

※ Java Beans 의 작성 규칙
1. 기본 생성자가 필수
ㄴ 기본 생성자는 안적으면 알아서 만들어지고
ㄴ 생성자를 만들었다면 기본 생성자를 틀이라도 적어줘야한다

  1. 필드는 private, 메서드는 public으로

  2. 파라미터명과 필드명이 같으면 처리가 수월해진다
    ㄴ 이해를 다 하고 나면 맞춰주는 것을 권장함


Quiz2

  • 문제)
quiz2.jsp			ID/PW를 입력 받을 수 있는 form을 작성
					데이터는 quiz2_result.jsp로 보낸다
                    단, 요청 메서드는 POST로 할 것
                    
                    
                    
quiz2_result.jsp	Account 배열로 계정을 3개 정도
					선언부에 생성해 둔다
                    quiz2.jsp에서 전송된 ID/PW와 생성해둔 계정과 일치하는 것이 있으면
                    로그인 성공을 화면에 출력
                    
                    
Account.java		JavaBeans
					필드 : userid, userpw, nick을 가진다                   

  • quiz2.jsp
<form action="quiz2_result.jsp" method="POST">
	<p><input name="userid" placeholder="ID" required></p>
	<p><input name="userpw" placeholder="PW" required></p>
		<button>로그인</button>
</form>

  • quiz2_result.jsp
    선언부 new까진 스켈레톤코드
<%!
  private Account[] accs = new Account[] {
    new Account("root", "qwe", "관리자"),
    new Account("itbank", "it", "아뱅"),
    new Account("test", "1234", "테스트")
  };





  %>
  • quiz2_result.jsp
1)
<% request.setCharaterEncoding("utf-8"); %>

<jsp:useBean id="input" class="beans.Account"/>
<jsp:setProperty property="*" name="input"/>
  
  • beans -> Account
2)
package beans;

public class Account {
		private String userid;
  		private String userpw;
  		private String nick;
  
  		public Account(String userid, String userpw, String nick) {
         this.userid = userid;
         this.userpw = userpw;
         this.nick = nick;
        }
  
  		public Account() {}
  
  
  
  	public String getUserid() {
		return userid;
	}
	public void setUserid(String userid) {
		this.userid = userid;
	}
	public String getUserpw() {
		return userpw;
	}
	public void setUserpw(String userpw) {
		this.userpw = userpw;
	}
	public String getNick() {
		return nick;
	}
	public void setNick(String nick) {
		this.nick = nick;
	}
  
  -------------------------------------------------
    
    @Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((userid == null) ? 0 : userid.hashCode());
		result = prime * result + ((userpw == null) ? 0 : userpw.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Account other = (Account) obj;
		if (userid == null) {
			if (other.userid != null)
				return false;
		} else if (!userid.equals(other.userid))
			return false;
		if (userpw == null) {
			if (other.userpw != null)
				return false;
		} else if (!userpw.equals(other.userpw))
			return false;
		return true;
	}
}

ㄴ 보충 설명 //

오버라이딩해서 덮어쓰는 형식인데
이것 역시 게터/세터 처럼
마우스 우클릭
-> Source
-> HashCode() and equals.. 를 선택해서 자동생성된 것이다.
  • quiz2_result.jsp
3)
<%
  Account user = login(input);
  String msg = "로그인 실패";
  
  if (user != null) {
   		msg = user.getNick() + "님 로그인"; 
  }
  %>
    
<h4><%=msg %></h4>    
<%!
  private Account[] accs = new Account[] {
	new Account("root", "qwe", "관리자"),
	new Account("itbank", "it", "아뱅"),
	new Account("test", "1234", "테스트")
		};
-----------------------------------------
  
  4)
  public Account login(Account input) {
  	for (int i = 0; i < accs.length; i++) {
    	if (accs[i].equals(input)) {
     		return accs[i]; 
    	}
 	}
    return null;
}
  %>

필요한게 있으면 만들고
필요한걸 틀을 만들고 부속품을 만들고
이렇게 진행한다 보면 된다.

이것이 여러 페이지를 연결시켜서 만드는 jsp의 매력!
막이럼;;ㅠㅠ



  • 후기

1) 첫번째 ex05.result.jsp 창에서 알아냄
드디어 뭔가 보인다
파라미터는 주고 받는 변수이고
ex00 에서 ex00_result.jsp로 넘긴다면
넘기는 역할이 form의 action이고

다른 페이지에서 받는 역할은 request.getParameter() 인것이다

대박적.... 이걸 왜 쓰지 궁금해 했는데
직접 타이핑 하다보니까 이해가 된다... 굿!

2) 너무 지친다.. 솔직히 java는 단기간에
8일동안 하루 5시간씩 공부했는데
겨우 40시간으로 완성될것도 아니고

깊은 설명이나 이해하거나 자주 사용해서
내가 직접 코드를 만들어 봐야 하는데
시간이 없어 만들어보지 못했던 것이 너무 안타깝다
java가 주력인데 안타까워서 죽겠넹ㅜㅜ

복습하라는 것만 좀 복습해서 가면...
어떻게든 비벼볼것같기도 하고...

기초 지식이 너무 없으니까
이 글을 어떻게 정리해서 어떻게 써야할지부터
나도 모르는 것을 설명..?어떻게..?하니까
계속 코드 읽어보고 이해하고
혼자서 끼워맞추고 검색하면서 작성하는데
오래걸린다...이것만 이틀째 잡은거같은데..

그래두 남는게 있어 다행이긴 하다..ㅠㅠ

profile
바보는 타이핑으로 공부하자

0개의 댓글