** 자바(jsp)에서 처리를 수행한 후 결과 페이지로 이동하기
1. forwarding : url을 변경하지 않고 이동
- 새로고침을 하면 처리를 다시 수행
1) 태그로 이동하는 방법
<jsp:forward page="이동할 url"/>
2) 자바 코드로 이동하는 방법
<%
RequestDispatcher ? = request.getRequestDispatcher("이동할 url");
?.forward(request, response)
%>
2. redirect : url을 변경해서 이동
- url을 변경했기 때문에 새로고침을 하면 처리를 다시 수행하지 않고 결과 페이지만 다시 출력
<%
response.sendRedirect("이동할 url")
%>
**처리한 후 결과를 출력하는 페이지에 전달하기
- request, session, application 이용 가능
- request는 forwarding 했을 때만 데이터가 전달
- session 과 application은 이동 방법 상관없이 데이터가 전달
1. 저장하는 메소드
<%
setAttribute(String name, Object value);
%>
2. 읽어오는 메소드
<%
Object getAttribute(String name);
%>
3. 삭제하는 메소드
<%
void removeAttribute(String name);
%>
** EL
- Expression Language : jsp에서 java로 만들어진 데이터를 편리하게 출력하기 위한 식.
1. attribute 출력
${attribute이름}
- null은 출력되지 않습니다.
- 자동으로 형 변환하기 때문에 숫자 데이터 나 문자 데이터의 경우 연산이 가능.
- Boolean, 숫자 데이터, 문자열이 아닌 경우는 toString의 결과를 출력.
실습
- attribute를 생성하고 forwarding 하는 파일 : el/attrcreate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% //데이터 저장 request.setAttribute("name", "루루"); //결과 페이지로 포워딩 RequestDispatcher dispatcher = request.getRequestDispatcher("attrdisplay.jsp"); dispatcher.forward(request, response); %> |
- attribute를 출력하는 파일 : el/attrdisplay.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <style> h1{ text-align:center; } img{ display:block; margin-left:auto; margin-right:auto; } </style> </head> <body> <p> <h1>고양이 이름: ${name}</h1> <img src="../images/루루5.gif"> </p> </body> </html> |
2. el에서 전달되는 데이터가 없는 경우 null로 간주해서 출력을 하지 않는데 산술연산의 경우는 0으로 간주해서 연산을 합니다.
3. el에서 이름만 사용한 경우 page → request → session → application 순으로 찾아서 데이터를 사용합니다.
직접 지정을 하고자 하는 경우는 pageScope.이름의 형태로 scope를 직접 지정해주면 됩니다.
** parameter
- 클라이언트에서 서버로 전달하는 데이터
1. 전달 방법
- url?이름=값&이름=값‥‥
- form을 만들어서 사용자의 입력을 받아서 전송 : name이 있는 데이터만 전송이 됨.
- el로 parameter를 출력하고자 하는 경우
${param.파라미터이름}
${paramValues.파라미터이름}
** Cookie
- 클라이언트의 정보를 클라이언트의 브라우저에 저장하고 서버가 이용하는 데이터
1. 생성 및 저장
Cookie ? = new Cookie(String name, String value);
response.addCookie(?);
2. 모든 쿠키 가져오기
Cookie [] ? = request.getCookies();
- 배열을 순회하면서 getName(), getValue()를 이용해서 쿠키의 이름과 값을 읽을 수 있습니다.(null 이 아닌 값만 순회하도록 코드 작성)
3. 쿠키 삭제
setMaxAge(초단위)를 이용해서 삭제되는 시간을 지정해서 시간이 되면 삭제되도록 합니다.
4. el에서의 쿠키 출력
${cookie.쿠키이름}
실습
- 파라미터와 쿠키를 생성하고 다른 jsp 파일에서 el을 이용해서 출력하기
- 파라미터와 쿠키를 생성하는 파일 : paramcookiecreate.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>파라미터와 쿠키 생성 및 저장</title> </head> <body> <% //쿠키 생성과 저장 Cookie cookie = new Cookie("sessionid", "디디"); response.addCookie(cookie); %> <a href="paramcookiedisplay.jsp?name=츄츄">파라미터 출력</a> </body> </html> |
- 파라미터와 쿠키를 출력하는 파일:paramcookiedisplay.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <p>파라미터 : ${param.name}</p> <img src="../images/chuchu.gif" width="300px"/> <p>쿠키의 해시코드 : ${cookie.sessionid}</p> <p>쿠키 : ${cookie.sessionid.value}</p> <img src="../images/디디1.gif" width="300px"/> </body> </html> |
** 초기화 파라미터
- web.xml 파일에 name 과 value 를 설정해두고 애플리케이션이 시작할 때 읽어서 application 객체에 저장하는 데이터
- 초기화 파라미터는 처음에 설정된 내용을 읽을 수는 있지만 수정할 수는 없습니다.
- 어떤 설정 내용이 변경 가능성이 있는 경우 web.xml 파일에 작성해두는 것이 좋습니다.
- 변경 가능성이 있는 내용을 java 코드에 문자열 상수를 이용해서 대입하면 변경을 하게 되면 문자열 상수를 변경해야 하는데 코드가 변경된 것이므로 java 파일들을 다시 컴파일해서 class 파일로 만들어 주어야 합니다.
- 컴파일을 다시 해서 클래스를 다시 만들게 되면 예기치 않은 오류가 발생할 수 있습니다.
- 이러한 오류를 줄이는 방법으로 변경 가능성이 있는 설정 내용을 파일에 기록해두고 읽게 되면 내용이 변결되더라도 자바 코드를 변경한 것이 아니기 때문에 컴파일을 다시 할 필요가 없습니다.
- .java(Source File - 개발자가 작성) -> .class(중간 코드-IDE가 생성하거나 직접 컴파일) -> run
- .java를 만들면 .java 파일을 수정하면 IDE가 자동으로 인식해서 .class를 다시 만들어줍니다.
- IDE가 종종 class 파일을 만드는데 실패하는 경우가 있습니다.
- .java는 있어도 .class가 없기 때문에 ClassNotFoundException 이 발생합니다.
- 소스 수정이 거의 없도록 만들어 주어야 합니다.
- 변경 가능성이 있는 숫자나 문자열 데이터는 되도록이면 별도의 파일에 작성해서 읽도록 해주는 것이 좋습니다.
- 이렇게 하면 숫자나 문자열 데이터가 변경이 되더라도 소스코드 변경 없이 데이터를 사용할 수 있습니다.
- java web application은 시작될 때 web.xml 파일을 읽고 시작합니다.
-변경 가능한 데이터를 web.xml 파일에 기록해 두게 되면 다른 파일을 생성해서 저장할 필요가 없어집니다.
1. 데이터 저장 : web.xml
<context-param>
<param-name>파라미터이름</param-name>
<param-value>파라미터 데이터</param-value>
</context-param>
2. 데이터 읽기
application.getinitParameter(String 파라미너이름)
3. el을 이용해서 출력하기
${initParam.파라미터이름}
- 데이터 베이스 접속 정보를 이러한 형태로 저장하는 경우가 많습니다.
** EL 1에서의 배열과 List
= 배열과 List(ArrayList, LinkedList Stack, Queue, Deque) 모두 비교 가능한 여러 개의 데이터를 하나의 이름으로 묶는 것이 목적입니다.
= Java에서 각각의 데이터를 접근할 때 배열은 [인덱스]를 이용하고 List는 get(인덱스)를 이용합니다.
= EL에서는 [인덱스]를 이용해서 List의 데이터도 접근할 수 있도록 해줍니다.
***
= 이런 이유로 EL을 이용해서 출력하게 되면 배열과 List는 동일한 접근방법을 이용하게 됩니다.
= 요청 -> 처리 -> 출력을 구분해서 프로그램을 작성하게 되면 처리 부분에서 자료구조를 변경하더라도 출력부분을 변경하지 않아도 됩니다. : MVC 패턴을 사용하는 근본적인 이유
실습 : 배열과 List의 출력
- 배열과 List를 만들어서 데이터를 전달해주는 페이지 : listcreate.jsp
데이터를 전달해주는 페이지는 나중에 Java 파일로 변경됩니다.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>배열과 리스트 생성</title> </head> <body> <% /* //배열을 생성 String [] ar = { "JavaScript", "Java", "Swift" }; //배열의 데이터를 List라는 이름으로 request 객체에 저장 request.setAttribute("List", ar); */ //리스트 생성 List<String> list = new ArrayList<>(); list.add("HTML"); list.add("CSS"); list.add("JavaScript"); //배열의 데이터를 List라는 이름으로 request 객체에 저장 request.setAttribute("List", list);
//결과를 출력할 페이지로 포워딩 RequestDispatcher dispatcher = request.getRequestDispatcher("listdisplay.jsp"); dispatcher.forward(request,response); %> </body> </html> |
-결과를 출력하는 페이지 : listdisplay.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>배열과 List 출력 페이지</title> </head> <body> <!-- EL을 이용해서 배열의 데이터 출력 --> ${List[0] }<br/> ${List[1] }<br/> ${List[2] }<br/> </body> </html> |
= 첫번째 파일을 실행 - 배열과 List 생성하는 부분을 주석처리하면서 실행
= 출력하는 파일의 내용을 변경하지 않아도 변경 내용이 적용됩니다.
** EL에서의 Map 과 DTO(VO)
= EL에서는 Map 과 DTO 가 프로퍼티에 접근하는 방법도 동일합니다.
= ["키이름 이나 프로퍼티이름"] 또는 .키이름 이나 프로퍼티이름 을 이용해도 됩니다.
= 프로퍼티는 변수명이 아니고 getter 와 setter에서 get 과 set을 제외한 부분입니다.
= 프로퍼티라고 할 때는 접근자 메소드를 의미하는 것입니다.
1. Map
1) Map 생성
Map<String, Object> 변수명 = new HashMap<>();
2) 데이터 저장
변수명.put("키이름", 데이터);
3) 데이터 읽기
변수명.get("키이름");
4) 데이터 삭제
변수명.remove("키이름");
※에러 메시지
vo.Person1 cannot be resolved to a type는 vo.Person1.class 파일이 없다는 에러입니다.
만약 .java 파일이 있는데도 이런 에러가 발생한다면 다른 패키지에 동일한 클래스를 만들어서 코드를 수정한 후 다시 실행하면 됩니다.
원래 패키지 이름을 사용하고자 하면 다시 만들면 됩니다.
2. property (프로퍼티)
= 사용은 변수처럼 하는데 실제로는 getter 와 setter 메소드를 호출하는 것이다.
실습 : Map과 VO 클래스를 생성해서 전달하고 출력
- dto.Cats 클래스 생성
package dto; public class Cats { protected String name; protected int _age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { System.out.println("get 호출"); return _age; } public void setAge(int age) { this._age = age; } } |
- Map 과 Cats 인스턴스를 생성해서 request에 저장하고 포워딩하는 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> <% /* //Map 데이터 생성 Map <String, Object> map = new HashMap<>(); map.put("name", "루루"); map.put("age", "24"); //request에 저장 request.setAttribute("data", map); */ //DTO(VO) 클래스로 데이터 생성 dto.Cats cats = new dto.Cats(); cats.setName("루루"); cats.setAge(24); //request에 저장 request.setAttribute("data", cats); //결과를 출력할 페이지로 포워딩 RequestDispatcher dispatcher = request.getRequestDispatcher("mapdisplay.jsp"); dispatcher.forward(request,response); %> </body> </html> |
- 출력하는 페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> ${data["name"]} ${data.age } </body> </html> |
- 자바의 데이터를 jsp에서 출력하기 위한 식 [본문으로]
'Front End' 카테고리의 다른 글
서블릿 (0) | 2018.08.31 |
---|---|
커스텀태그(JSTL) (0) | 2018.08.30 |
javabean & error (0) | 2018.08.29 |
쿠키와 세션 (0) | 2018.08.28 |
[0827]javaweb2 (0) | 2018.08.27 |