🔷 JSP 2.3 & Servlet3.1 - 내장 객체와 액션 태그, 자바빈 : 인자전송
✔ 내장 객체
- 웹 컨테이너가 JSP 페이지를 서블릿 클래스로 변환하면서 사용자의 요청에 맞는 응답 페이지를
생성하기위해 사용되는 javax.servlet 패키지 내부에 있는 고정된 이름의 객체
💡 내장 객체의 종류
✔ request 객체
- 서블릿에게 사용자의 요청에 관련된 데이터들을 보내주는 역할을 하는 객체
💡 request(요청) 파라미터와 관련된 메소드
- 예제(form)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>Request Test</title> <style> // h1태그 영역과 아이디 속성 값이 commandCell인 영역의 내용들을 가운데 정렬해서 출력 h1,#commandCell{ text-align: center; } // table 태그 영역을 화면의 가운데 정렬하고 width 속성값과 border속성 값을 설정 table{ margin : auto; width: 400px; border : 1px solid red; } </style> </head> <body> <h1>Request 예제입니다.</h1> <form action="requestTest1.jsp" method="post"> <table> <tr> <td><lable for ="name">이름</lable></td> <td><input type="text" name="name" id="name"></td> </tr> <tr> <td><lable for ="gender">성별</lable></td> <td>남<input type="radio" name="gender" value="male" id="gender"> 여<input type="radio" name="gender" value="female"> </td> </tr> <tr> <td><label for="hobby">취미</label></td> <td>독서<input type="checkbox" name="hobby" value="독서" id="hobby"> 게임<input type="checkbox" name="hobby" value="게임" id="hobby"> TV시청<input type="checkbox" name="hobby" value="TV시청" id="hobby"> 축구<input type="checkbox" name="hobby" value="축구" id="hobby"> 기타<input type="checkbox" name="hobby" value="기타" id="hobby"> </td> </tr> <tr> <td colspan="2" id="commandCell"><input type="submit" value="전송"></td> </tr> </table> </form> </body> </html>
▶ 출력화면
🎈 위 화면에서 이름을 입력하고 성별, 취미를 선택한 후 버튼을 누르면 소스의 form 태그에서 지정된 requestTest1.jsp 페이지로 요청이 전송된다전송>
- 코드(test)
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> // 파라미터의 한글 처리를 위해 request 객체의 문자셋 인코딩 방식을 UTF-8 로 지정 <%request.setCharacterEncoding("UTF-8"); %> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>Request Test</title> <style> h1 { text-align:center; } table{ margin : auto; width: 400px; border : 1px solid red; } </style> </head> <body> <h1>Request 예제입니다.</h1> <table> <tr> <td>이름</td> <%-- name이란 이름을 가진 파라미터 값을 얻어와 표현식으로 출력 --%> <td><%=request.getParameter("name") %></td> </tr> <tr> <td>성별</td> <td> // gender란 이름을 가진 파라미터 값이 male일 경우 성별을 남자,female경우 여자로 출력 <%if(request.getParameter("gender").equals("male")) {<%남자<%}else {<%여자%>} %> </td> </tr> <tr> // hobby란 이름을 가진 차라미터는 여러개의 값을 가질 수 있기 때문에 getParameterValues 메소드를 사용하여 // String 배열로 값을 가져온 뒤 for문을 이용해 String 배열에 저장된 값을 모두 출력 <td>취미</td> <td> <% String[] hobby=request.getParameterValues("hobby"); for(int i=0; i<hobby.length;i++){ %> <%=hobby[i] %> <%} %> </td> </tr> </table> </body> </html>
▶ 출력화면
🎈 전송받은 파라미터들을 내장 객체인 request를 통해서 얻어내 화면에 출력한다
🖋 request 연습
- html 작성
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <!-- form의 이름은 frm이고 action1.jsp파일의 액션을 수행하고 get타입으로 인자를 받는다 --> <form name="frm" action="action1.jsp" method="get"> - 아이디 : <input type="text" id="id" name="id" /><br> - 패스워드 : <input type="password" id="pw" name="pw" /><br> - 이름 : <input type="text" id="name" name="name" /><br> - 주소 : <input type="text" id="address" name="address" /><br> - 취미 : 스포츠<input type="checkbox" id="hobby1" name="hobby" value="스포츠"/> 독서<input type="checkbox" id="hobby2" name="hobby" value="독서" /> 영화감상<input type="checkbox" id="hobby3" name="hobby" value="영화감상" /> 요리<input type="checkbox" id="hobby4" name="hobby" value="요리"/><br> <input type="submit" value="전송"> </form> </body> </html>
▶ 출력화면
- jsp 작성
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> // Map,Set,Iterator import <%@page import="java.util.Map , java.util.Set, java.util.Iterator" %> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>action</title> </head> <body> <% // UTF-8로 무조건 인코딩 request.setCharacterEncoding("UTF-8"); // 1) id : 파라미터 id 를 얻어 값이 null이면 없음출력하고 값이 있으면 id를 출력한다 String id = request.getParameter("id") == null ? "없음" : request.getParameter("id"); String pw = request.getParameter("pw") == null ? "없음" : request.getParameter("pw"); String name = request.getParameter("name") == null ? "없음" : request.getParameter("name"); String address = request.getParameter("address") == null ? "없음" : request.getParameter("address"); // 2) out JSP 기본 객체 활용 (인자 전송) //out.println("id : " + id + "<br>"); //out.println("pw : " + pw + "<br>"); //out.println("name : " + name + "<br>"); //out.println("address : " + address ); // 3) 표현식(expression) 활용 (인자 전송) // id : <%=id %><br> // pw : <%=pw %><br> // name : <%=name %><br> // address : <%=address %> // 4) EL(Expressional Language) 기본객체(param)활용 (인자 전송) // id : ${param.id}<br> // pw : ${param.pw}<br> // name : ${param.name}<br> // address : ${param.address}<br> // hobby 값 저장할 배열 생성 // map은 key와 value로 구성되어있다 Map<String, String[]> map = request.getParameterMap(); // set은 저장순서가 고정되어있지 않다 // keySet() : 모든 key를 set객체에 담아서 리턴한다 Set<String> keys = map.keySet(); // Iterator : 반복자 => 순서가 없는 것에 순서를 부여하는 클래스 // 반복자로 key를 하나씩 얻어서 get() 메소드로 값을 얻는다 Iterator<String> it = keys.iterator(); while(it.hasNext()){ String key = it.next(); // key를 뽑아온다 String values[] = map.get(key);// key의 값을 리턴하는 배열 values if(values.length == 1){ // 배열의 값이 1이라면 // Key 와 배열의 0번째 있는 값을 출력한다 out.println(key + " = " + values[0] + "<br>"); }else{ // 1이 아니라면 // key 만 출력한다 out.print(key + " = "); // s : values에 들어있는 것과 같은 타입으로 선언 // values 의 길이만큼 반복하면서 for(String s : values) { // s에 배열의 값을 대입하여 출력한다 out.print(s + " ") ; } // 한줄 띄기 } out.print("<br>"); } %> </body> </html>
▶ 출력화면(parameter 입력)
▶ 출력화면(정보 출력)
🖋 Enumeration 사용 1)
- 코드
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import = "java.util.Enumeration" %> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>action2</title> </head> <body> <% // Enumeration : 리턴타입 => 각각의 객체들을 한번에 하나씩 처리할 수 있는 메소드 제공 // getParameterNames() 메소드 : 요청에 포함된 모든 파라미터 이름을 Enumeration 객체로 리턴한다 Enumeration<String> keys = request.getParameterNames(); // hasMoreElements() : 커서 바로 앞에 데이터가 들어있는지 체크 while(keys.hasMoreElements()) { // nextElement() : 현재 커서가 가리키고 있는 데이터(객체)를 리턴해주고 커서의 위치를 다음칸으로 옮긴다 String key = keys.nextElement(); if(key.equals("hobby")){ // key의 값이 hobby와 같으면 out.print("hobby = "); // hobby = 을 출력한다 // s : values에 들어 있는것고 같은 타입으로 선언 // 배열에 hobby가 입력된것만큼 반복하면서 // hobby 이름으로 지정된 파라미터의 모든 값을 String 배열로 리턴한다 for(String s : request.getParameterValues("hobby")){ // s에 입력받은 배열의 값을 대입하여 출력한다 out.print(s + " "); } // 한줄 띄기 out.print("<br>"); }else { // key의 값이 hobby와 같지않다면 // key 와 입력받은 key값을 출력한다 out.print(key + " = " + request.getParameter(key) + "<br>" ); } } %> </body> </html>
▶ 출력화면(정보 출력)
🖋 Enumeration 사용 2)
- 코드
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import = "java.util.Enumeration" %> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>action3</title> </head> <body> <% // Enumeration : 리턴타입 => 각각의 객체들을 한번에 하나씩 처리할 수 있는 메소드 제공 // getParameterNames() 메소드 : 요청에 포함된 모든 파라미터 이름을 Enumeration 객체로 리턴한다 Enumeration<String> keys = request.getParameterNames(); // hasMoreElements() : 커서 바로 앞에 데이터가 들어있는지 체크 while(keys.hasMoreElements()) { // nextElement() : 현재 커서가 가리키고 있는 데이터(객체)를 리턴해주고 커서의 위치를 다음칸으로 옮긴다 String key = keys.nextElement(); // 문자열 배열 values 선언 // key란 이름으로 지정된 파라미터의 모든 값을 String 배열로 리턴한다 String values[] = request.getParameterValues(key); if(values.length == 1){ // 배열의 길이가 1 이면 // key와 values의 0번째 인덱스 요소를 출력한다 out.print(key + " = " + values[0] + "<br>"); }else{ // 1이 아니라면 // key = 출력한다 out.print(key + " = "); // s : values에 들어 있는것고 같은 타입으로 선언 // 배열에 hobby가 입력된것만큼 반복하면서 for(String s : values) { // s에 입력받은 배열의 값을 대입하여 출력한다 out.print(s + " "); } // 한줄 띄기 out.print("<br>"); } } %> </body> </html>
▶ 출력화면
💡HTTP 헤더 정보와 관련된 메소드들
💡세션 정보와 관련된 메소드들
💡쿠키, URL/URI, 요청 방식과 관련된 메소드들
✔ 자바빈(JavaBean)
- 디자이너와 프로그래머의 원활한 협업을 위해 디자인 부분과 비지니스 로직 부분을 분리하기 위해 사용되는 기능
- 사용하는 목적 : JSP 페이지에 화면 표시 부분과 로직들이 함께 존재해서 복잡하게 구성되는 것을 가능한 피하고,
JSP 페이지의 로직 부분을 분리해서 코드를 재사용함으로 프로그램의 효율을 높이는 것.
✔ 자바빈 설계 규약
✔ 자바빈 영역
- 자바빈 DTO
package bean; import java.util.Arrays; public class MemberDto { private String id; private String pw; private String name; private String address; private String[] hobby; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPw() { return pw; } public void setPw(String pw) { this.pw = pw; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String[] getHobby() { return hobby; } public void setHobby(String[] hobby) { this.hobby = hobby; } @Override public String toString() { return "id=" + id + ", pw=" + pw + ", name=" + name + ", adress=" + address + ", hobby=" + Arrays.toString(hobby) + "]"; } }
- 자바빈 jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="bean.MemberDto" %> <!DOCTYPE html> <html lang="ko"> <head> <meta charset="UTF-8"> <title>action4</title> </head> <body> // <jsp:useBean/> : 자바빈 객체를 생성하기 위한 태그 // <id=빈이름, class= 자바빈 클래스 명 , scope= 사용 범위 > // page : 빈 객체 공유 범위가 현재 페이지의 범위에만 한정, 페이지가 변경되면 공유가 유지되지 않는다 <jsp:useBean id="dto2" class="bean.MemberDto" scope="page"> //<jsp:setProperty/> : 자바빈 클래스의 속성 값을 설정하기 위한 태그 //name = 빈 이름 , property=속성명 , value= 설정할 속성 값 //<jsp:setProperty name="dto2" property="id" value="java" /> // property= * : 와일드카드 => 클라이언트에서 전송되어 오는 파라미터 값이 // 모두 같은 이름의 빈 객체의 속성 값으로 자동으로 할당, // 정보를 저장하는 빈 클래스를 작성 - <jsp:setProperty name="dto2" property="*" /> </jsp:useBean> // <jsp:getProperty/> : 자바빈 클래스의 속성 값을 가져오기 위한 태그 // < name = 빈 이름, property=속성명 > id : <jsp:getProperty property="id" name="dto2" /><br> pw : <jsp:getProperty property="pw" name="dto2" /><br> name : <jsp:getProperty property="name" name="dto2" /><br> address : <jsp:getProperty property="address" name="dto2" /><br> hobby : <% for(String s : dto2.getHobby()) { %> <%=s + " " %> <% } %> </body> </html>
▶ 출력화면