-
JSP 피피티 02강 GET방식의 데이터 전송(JSP내장객체)JSP 피피티 2020. 8. 21. 18:09
JSP페이지의 실행과정
1. 이클립스에서 JSP 파일 실행
2. JSP파일이 .metadata 폴더 어딘가에 복사가 된다. (.metadata폴더는 workspace 폴더에 생성 되어있다.)
3. 복사된 JSP파일이 자바클래스로 바뀐다.
4. 바뀐 자바클래스는 컴파일을 거쳐 웹브라우저에 보여준다.
*컴파일 : 컴퓨터의 언어(2진수 바이트?)로 읽어 내는 것JSP내장객체
내장객체는 위에 3번에서 JSP파일에서 바뀐 자바클래스를 열어보면
JSP페이지가 메서드로 변환되어 있고 그 메서드 안에
자동으로 생성되거나 파라미터로 전달되는 객체들이 존재한다.
얘들이 JSP내장객체다.
JSP페이지에 있던 HTML코드는 출력문으로 변환된다.
위에 사진을 보면 노란색 형광펜 그어진 곳이 자동으로 생성된 JSP내장객체
아래로는 JSP페이지의 HTML 코드들이 출력문으로 변환되어 있는것을 확인 할 수 있다.
노란색 형광펜으로 그어진 부분을 확인해 보면 아래의 내장객체들을 확인 할 수 있다.
내장 객체
리턴 타입(Return Type)
설명
request
javax.servlet.http.HttpServletRequest
웹 브라우저의 요청 정보를 저장하고 있는 객체
response
javax.servlet.http.HttpServletResponse
웹 브라우저의 요청에 대한 응답 정보를 저장하고 있는 객체
out
javax.servlet.jsp.jsp.jspWriter
JSP 페이지에 출력할 내용을 가지고 있는 출력 스트림 객체이다.
session
javax.servlet.http.HttpSession
하나의 웹 브라우저의 정보를 유지하기 위한 세션 정보를 저장하고 있는 객체
application
javax.servlet.ServletContext
웹 어플리케이션 Context의 정보를 저장하고 있는 객체
pageContext
javax.servlet.jsp.PageContext
JSP 페이지에 대한 정보를 저장하고 있는 객체
page
java.lang.Object
JSP 페이지를 구현한 자바 클래스 객체
config
javax.servlet.ServletConfig
JSP 페이지에 대한 설정 정보를 저장하고 있는 객체
exception
java.lang.Throwable
JSP 페이지서 예외가 발생한 경우에 사용되는 객체
JSP 내장객체는
-JSP 페이지가 실행되는 과정에서 서블릿(자바클래스)으로 변환됨과 동시에 톰켓에 의해 자동으로 주입되는 객체.
-소스코드 변환과정에서 선언과 할당이 모두 이루어지므로 JSP페이지에서는 별도의 생성과정 없이 바로 사용할 수 있다.
JSP 페이지 간의 유효성 범위
- JSP 페이지들은 각각 Main 클래스에 대응된다고 볼 수 있다.
- 때문에 서로다른 JSP 페이지간에는 변수가 공유되지 않는다.
- from.jsp에서 to.jsp로 링크의 이동이 발생하면, to.jsp에서는 name이라는 변수를 인식할 수 없게 된다.
from.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% String name = "JSP 페이지"; %> <a href="to.jsp"><%=name%>로 이동하기</a>
to.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <p> 이곳은 <%=name>입니다. <!-sp 페이지의 name값을 모르기 때문에 선언되지 않은 변수를 사용한것으로 간주하고 에러 발생--> </p>
GET 방식의 데이터 전송(1)
URL에 변수의 이름과 값을 포함시키는 HTTP GET방식의 데이터 전송
- 페이지가 이동되는 과정에서 변수의 값이나 사용자의 입력값을 다른 페이지에서도 인식할 수 있도록 하는 웹 프로그래링 처리기법
사용방법
- 페이지의 URL뒤에 "?"를 명시하고, "변수이름=값"의 형태로 데이터를 추가한다.
- 두 개 이상의 값을 포함시켜야 할 경우 "&"로 구분할 수 있다.
>> 페이지URL?변수명=값&변수명=값&...&변수명=값
ex) http://localhost:8080/MyProject/hello.jsp?userid=jspuser&age=20
위에 from.jsp페이지에서 선언한 name이라는 변수를 to.jsp 에서 인식하게 하려면 get방식으로 데이터를 전송하면 된다.
ex) http://localhost:8080/MyProject/to.jsp?name=JSP 페이지
↑실제로 URL에는 한글과 띄어쓰기가 들어갈 수 없기 때문에 URLEncoder? 이 함수를 사용해 URL에서 인식 할 수 있게 해줘야 한다.
JSP의 변수를 GET 파라미터로 전달하기
1. 직접 값을 전달하기
URL에 변수명과 값을 직접 명시한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <p> <a href="test.jsp?weight=70&height=175">클릭</a> </p>
2. JAVA 변수를 전달하기
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% int w = 70; int h = 175; %> <p> <a href="test.jsp?weight=<%=w%>&height=<%=h%>">클릭</a> </p>
HTML소스출력 결과
<p> <a href="test.jsp?weight=70&height=175">클릭</a> </p>
3.한글이 포함된 값을 전달하기
java.net패키지의 URLEncoder 메서드를 사용해 한글을 인코딩해야한다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <%@ page import="java.net.URLEncoder"%> <% String name = "JSP학생"; name = URLEncoder.encode(name,"UTF-8"); %> <p> <a href="test.jsp?name=<%=name%>">클릭</a> </p>
HTML소스출력 결과
<p> <a href="test.jsp?name=JSP%ED%95%99%EC%83%9D">클릭</a> </p>
URL의 내용을 수신하기 위한 request 내장 객체의 사용
▒전송된 파라미터를 처리하기 위한 문자열 인코딩 방식 설정
request.setCharacterEncoding("UTF-8");
-이 기능은 파라미터를 수신하기 전에 1회만 수행한다.
-일반적으로 모든 JSP페이지에서 가장 처음에 호출
▒전송된 파라미터 수신하기
String request.getParameter("파라미터이름");
-URL에 포함된 변수명을 파라미터로 전달하여 해당 변수에 대한 값을 리턴받으며, 리턴형은 항상 String이다.
-만약 숫자값을 사용해야 한다면 Integer.parseInt() 기능을 사용하여 형변환 해야 한다.
ex)↓↓
send_wnh.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% int w = 70; int h = 175; %> <p> <a href="receive_wnh.jsp?weight=<%=w%>&height=<%=h%>">클릭</a> </p>
receive_wnh.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% request.setCharacterEncoding("UTF-8"); String weight = request.getParameter(weight); String height = request.getParameter(height); %>
- 일반적으로 파라미터 수신 처리에서 변수명의 혼선을 피하기 위해 파라미터 이름과 수신되는 값을 저장하기 위한 변수명을 동일하게 지정한다.
-URL에 명시된 파라미터 이름을 사용해 데이터를 받는다. 수신한 값은 무조건 String형식이 된다.
send_wnh.jsp에서 int로 값을 보냈어도 수신되는 값은 String
파라미터 값이 정상적이지 않은 경우
-GET 파라미터는 변수의 이름과 값이 URL에 그대로 노출되기 때문에 악의적인 목적을 갖는 사용자가 임의로 내용을 변경하거나 삭제할 수 있다.
-JSP 웹 페이지는 변수의 내용이 예상치 못한 값으로 전달될 경우를 대비하여 프로그램의 오작동을 방지해야 한다.
파라미터 전달에 따른 수신값의 예외상황
String user_id = String request.getParameter("user_id");
user_id 변수의 상황 GET 파라미터 전달 케이스 Null인 경우 파라미터 이름이 명시되지 않는다.
Ex) http://localhost:8080/MyProject/test.jsp""인 경우 파라미터 이름만 있고, 값이 명시되지 않는다.
Ex)http://localhost:8080/MyProject/test.jsp?user_id=정상적인 경우 이름과 값이 모두 존재한다.
Ex)http://localhost:8080/MyProject/test.jsp?user_id=jspuser※변수값 하나당 이모든 케이스에 대비
"회원가입의 유효성검사는 자바스크립트에서도 하고 자바에서도 해야한다. 자바는 보안때문에 해야하고 자바스크립트에선 트래픽을 줄이기 위해 한다". 라고 PPT에 써져있었는데 왜 여기에 써져있을까??
▒GET 파라미터 전송하기
from.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello JSP</title> </head> <body> <h1>Q. 100+200=?</h1> <ol> <li><a href='<%=request.getContextPath()%>/04_get/to.jsp?ans=100'>100</a></li> <li><a href='<%=request.getContextPath()%>/04_get/to.jsp?ans=200'>200</a></li> <li><a href='<%=request.getContextPath()%>/04_get/to.jsp?ans=300'>300</a></li> <li><a href='<%=request.getContextPath()%>/04_get/to.jsp?ans=400'>400</a></li> <li><a href='<%=request.getContextPath()%>/04_get/to.jsp?ans=500'>500</a></li> </ol> </body> </html>
-request.getContextPath()는 "/프로젝트이름"의 문자열을 리턴. 링크나 <form>의 action URL을 지정할때 절대경로기반으로 설정할 수 있게 한다.
-ans=n00 각 페이지에 값을 다르게 전송
▒이전 페이지에서 전송된 파라미터 수신 및 예외처리
to.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <% //파라미터 수신에 사용할 문자셋 설정 (각 페이지당 최 상단에서 1회 설정) request.setCharacterEncoding("UTF-8"); //파라미터 받기 String ans = request.getParameter("ans"); //화면에 출력할 결과 문자열 String result = null; //값이 존재하지 않더라도 오작동하지 않을 최소한의 방어장치 if(ans == null || ans.equals("")){ String script = "<script>"; script += "alert('값이 없습니다.');"; script += "history.back();"; script += "</script>"; out.print(script); return; //현재 페이지 강제 종료 } //사용자가 선택한 값을 숫자로 변환 int user_select = Integer.parseInt(ans); if(user_select == 300){ result = "정답입니다."; }else{ result = "정답이 아닙니다."; } %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello JSP</title> </head> <body> <h1>응답결과</h1> <h2>선택한 값: <%=ans%></h2> <h3><%=result %></h3> </body> </html>
GET 방식의 데이터 전송(2)
GET 방식의 데이터 전송(1)에서 기본적인 내용을 배웠다면
여기부턴 하나의 페이지가 여러페이지를 보여주는 효과를 주는 방법을 보겠다.
▒GET 파라미터를 활용한 페이지 작업 효율성 증대
-GET 파라미터의 사용예
하나의 웹 페이지에 변수값을 다르게 전송하는 여러개의 링크를 두고 전송된 변수 값에 따라 표시되는 컨텐츠를 다르게 구성하면 하나의 웹 페이지가 여러 웹 페이지의 효과를 낼 수 있다.
자기 스스로에게 링크를 지정하는 웹 페이지↓
model.department 더보기ㄱㄱ
더보기package study.helloweb.model; import lombok.Data; /*학과정보를 저장하기 위한 클래스*/ @Data public class Department { /** 학과번호 */ private int deptno; /** 학과이름 */ private String dname; /** 학과위치 */ private String loc; }
depratment.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page trimDirectiveWhitespaces="true" %> <%@ page import="study.helloweb.model.Department" %> <% request.setCharacterEncoding("UTF-8");//파라미터 수신에 사용할 문자셋설정 (각페이지당 최상단에서 1회 설정) String deptno = request.getParameter("deptno"); //링크를 통해 전달된 파라미터 추출 Department department = null;// 수신된 deptno 값에 따라서 결과를 저장할 객체 if(deptno != null){ //파라미터가 없는 경우를 대비해야 하므로 deptno값이 null이 아닌 경우만 수행 department = new Department();//데이터를 저장할 객체를 할당한다. if(deptno.equals("101")){ //deptno가 정해진 범위 안에서만 동작하도록 if문을 구성 department.setDeptno(101); department.setDname("컴퓨터공학과"); department.setLoc("1호관"); }else if(deptno.equals("102")){ department.setDeptno(102); department.setDname("멀티미디어학과"); department.setLoc("2호관"); }else if(deptno.equals("201")){ department.setDeptno(201); department.setDname("전자공학과"); department.setLoc("3호관"); }else if(deptno.equals("202")){ department.setDeptno(202); department.setDname("기계공학과"); department.setLoc("4호관"); } } %> <!doctype html> <html> <head> <meta charset="UTF-8" /> <title>Hello JSP</title> </head> <body> <h1>학과정보</h1> <!-- 메뉴 제시 영역 --> <a href="<%=request.getContextPath() %>/04_get/department.jsp?deptno=101">컴퓨터공학과</a> | <a href="<%=request.getContextPath() %>/04_get/department.jsp?deptno=102">멀티미디어학학과</a> | <a href="<%=request.getContextPath() %>/04_get/department.jsp?deptno=201">전자공학과</a> | <a href="<%=request.getContextPath() %>/04_get/department.jsp?deptno=202">기계공학과</a> <hr /> <!-- 결과표시영역 --> <% if (department == null) { %> <h2>메뉴를 선택하세요</h2> <%}else{ %> <table> <tr> <th>학과번호</th> <th><%=department.getDeptno()%></th> </tr> <tr> <th>학과이름</th> <th><%=department.getDname()%></th> </tr> <tr> <th>학과위치</th> <th><%=department.getLoc()%></th> </tr> </table> <%} //end if %> </body> </html>
depratment.jsp가 실행되었을때 일단
이렇게 실행된다. 처음에는 위의 url에서 확인 할수 있듯이 deptno값이 없어서 'department==null'의 조건을 가진 두번째 if문이 실행 되었고 "메뉴를 선택하세요"가 출력되었다. 여기서 "컴퓨터공학과"를 누르면
url에 변수명(deptno)과 값(101)을 써 놓았음으로 deptno값이 생겼다. 그래서 'deptno != null'의 조건을 가진 첫번째 if문이 실행되었고 두번째 if문의 else(deptno 값이있을때 )가 실행 되어 위의 사진과 같은 결과가 출력되었다.
글을 정리하다 보니까 이걸 발견했는데
↓이 6줄을 이해했다면 하산하여도 된다 하심↓
request.setCharacterEncoding("UTF-8");
String deptno = request.getParameter("deptno");
Department input = new Department();
input.setDeptno(Integer.parseInt(deptno));
DepartmentService service = new DepartmentService();
Department output = service.getItem(input);첫번째 줄은 전송된 파라미터를 처리하기 위한 문자열 인코딩 방식을 설정한 것이고
두번째 줄은 전송된 파라미터를 수신 하는 것이고
세번째 줄은 자바 Department 빈즈의 객체이름을 input이라고 선언하고 할당한 것이고
네번째 줄은 파라미터로 수신받은 값을 input 객체에 세팅하는 것이고
다섯번째 줄은 데이터베이스와 연동하여 insert, update, delete, select 요청을 처리할 service 객체를 선언하고 할당한 것이고
여섯번째 줄은 input객체에 세팅해놓은 값을 service가 받아와서 output(Department객체)에 할당 하는거 같은데
다섯번째와 여섯번째 줄은 정확히 모르겠다.
하산 할 뻔 했네...
'JSP 피피티' 카테고리의 다른 글
JSP 피피티 06강 쿠키 (0) 2020.08.23 JSP 피피티 03강 POST방식의 데이터 전송 (0) 2020.08.22 JSP 피피티 06강 컨트롤러 추상화 (0) 2020.08.21 JSP 피피티 06강 JSTL (0) 2020.08.21 JSP피피티 06강 컨트롤러의 이해 (0) 2020.08.20