EL과 Servlet : RequestDispatcher.forward 로 페이지 이동 후 데이터별 출력방법

Servlet

  • .java파일을 서블릿을 통해서 html처럼 나타낼 수 있다.
    • 설정방법
      1. web.xml 파일에 코드 추가
      2. TestServlet.java 생성 : java페이지를 실행하면 jsp페이지가 출력된다.
      3. AttributeTest.jsp생성




forward 페이지이동예시1 : web.xml + 기본속성출력

web.xml 파일에 코드 추가

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//기본형
<servlet>
<servlet-name>서블릿이름(적당한 이름으로 내가 지정)</servlet-name>
<servlet-class>서블릿 클래스 위치(java 패키지이름까지 함께 작성)</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>위와 동일한 서블릿이름</servlet-name>
<url-pattern>접근할 주소이름</url-pattern>
</servlet-mapping>

//예시
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>com.itwill.ex.TestServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test</servlet-name>
<url-pattern>/test.com</url-pattern>
</servlet-mapping>
</web-app>




TestServlet.java 생성

  • 화면에 텍스트도 출력해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TestServlet extends HttpServlet {

@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
//페이지 요청시 GET방식일때 처리 되는 메서드

System.out.println("doGet() 호출");

//화면에 텍스트를 출력해보기
PrintWriter pr = response.getWriter();
pr.write("<html>");
pr.write("<head>");
pr.write("</head>");
pr.write("<body>");
pr.write("<h1> Hi This is Servlet Test.</h1>");
pr.write("</body>");
pr.write("</html>");
pr.close();
}




AttributeTest.jsp 생성

  • EL태그 사용
  • 주소는 내가 설정한 test.com인데 화면은 jsp가 출력된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<%
//int cnt = (int)request.getAttribute("cnt");
//Integer cnt = (Integer)request.getAttribute("cnt");

int cnt = 1000;
%>

<h2>1. 스크립트 엘리먼트 (변수라고 부름) </h2>
전달값 : <%=cnt +100%><br>

<h2>2. EL 표현식 사용 cnt값 출력 (속성-attribute라고 부름) </h2>
${ requestScope.cnt+100 }<br> <!-- requestScope생략가능 -->
${ cnt+100 } <br>

<h2>4. requestScope(영역의 표시)없을경우 어떤 순서로 처리되는가? </h2>
<!-- 왜 생략이 가능할까? 생략되면 어떤 방식으로 구동할까?
영역의 표시가 생략되거나 지정하지 않은 경우 모든 영역을 순차적으로 돌아다니면서 검색한다.
영역의 크기가 작은순부터 : pageScope > requestScope > sessionScope > applicationScope
즉 pageScope에서 검색하여 있으면 찾아와서쓰고 없으면 requestScope 검색하여 영역모두에서 찾기를 반복한다
중요 : 이전 영역에서 해당 값을 발견한 경우 다음 영역의 값을 사용할 수 없음.
-->
session: ${sessionScope.cnt+100 }<br>

//출력값
1. 스크립트 엘리먼트 (변수라고 부름)
전달값 : 1100
2. EL 표현식 사용 cnt값 출력 (속성-attribute라고 부름)
100
1100
4. requestScope(영역의 표시)없을경우 어떤 순서로 처리되는가?
session: 1100




forward 페이지이동예시2 : web.xml + 객체출력

web.xml에 mapping추가

1
2
3
4
5
6
7
8
 <servlet>
<servlet-name>test2</servlet-name>
<servlet-class>com.itwill.ex.TestServlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test2</servlet-name>
<url-pattern>/test2.com</url-pattern>
</servlet-mapping>




TestServlet2.java 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class TestServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
System.out.println("TestServlet2 doGet()호출");

//3.ItwillBean 객체 생성 후 정보 저장 -> request영역에 저장 (객체전달하는 경우)
//3-1.객체생성
ItwillBean ib = new ItwillBean();
ib.setId("admin");
ib.setPw("1234");
ib.setName("관리자");
ib.setAge(20);
ib.setTel("010-1234-5678");
//3-2. request영역에 저장
request.setAttribute("itBean", ib);

//4. ItwillUser 사용자 객체생성 (객체안의 객체까지 전달하는 경우)
ItwillUser kim = new ItwillUser("김학생", 22, new Phone("노트20", "010-4567-4567"));
request.setAttribute("kim", kim);

//2. BeanTest.jsp페이지생성 : forward사옹해서 이동
RequestDispatcher dis = request.getRequestDispatcher("./EL/BeanTest.jsp");
dis.forward(request, response);

}
}




BeanTest.jsp 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<h3>TestServlet2에서 전달받은 객체 정보 출력</h3>
아이디 : ${requestScope.itBean.id} <br>
이름 : ${requestScope.itBean.name} <br>
비밀번호 : ${itBean.pw} <br>
나이 : ${itBean.age} <br>
전화번호 : ${itBean.tel} <br>

<h3>TestServlet2에서 전달받은 객체의 객체 정보 출력</h3>
이름 : ${ requestScope.kim.name }<br>
나이 : ${ requestScope.kim.age }<br>
전화번호 : ${ requestScope.kim.note20.tel }<br>
모델 : ${kim.note20.model }<br>

//출력값
TestServlet2에서 전달받은 객체 정보 출력
아이디 : admin
이름 : 관리자
비밀번호 : 1234
나이 : 20
전화번호 : 010-1234-5678
TestServlet2에서 전달받은 객체의 객체 정보 출력
이름 : 김학생
나이 : 22
전화번호 : 010-4567-4567
모델 : 노트20




forward 페이지이동예시3 : @WebServlet("/경로") + 배열, 컬랙션출력

TestServlet3.java파일 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package com.itwill.ex;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//1. @WebServlet(주소)어노테이션 - 특수한 기능 가짐 : 해당 클래스가 서블릿처럼 사용되도록 지정.
//web.xml파일에 매핑해썬 정보 없이 바로 지정한 주소로 접근 가능
//web.xml에서 아래코드를 지정해줄 필요가 없다
/*<servlet>
<servlet-name>test3</servlet-name>
<servlet-class>com.itwill.ex.TestServlet3</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>test3</servlet-name>
<url-pattern>/test3.com</url-pattern>
</servlet-mapping>*/

@WebServlet("/test3")
public class TestServlet3 extends HttpServlet {

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("/test3 주소호출");

//3.배열 데이터 array_collection페이지로 넘기기
String[] Food = {"순대", "떡볶이", "대패삼겹살", "오리고기"};

//3-1.request영역에 배열 Food를 저장
// req.setAttribute(키값, 데이터값);
req.setAttribute("food", Food);

//4.컬렉션 데이터 array_collection페이지로 넘기기
ArrayList<String> movie = new ArrayList<String>();
movie.add("작은아씨들");
movie.add("겨울왕국");
movie.add("우리집");
movie.add("벌새");
req.setAttribute("movie", movie);

//2. 화면 페이지 array_collection.jsp로 forward 사용하여 페이지 이동
RequestDispatcher dis = req.getRequestDispatcher("/EL/array_collection.jsp");
dis.forward(req, resp);

}
}




array_collection.jsp 생성해서 배열출력

array_collection.jsp는 TestServlet3.java에서 부터 페이지 이동해서 TestServlet3.java의 데이터를 출력할 페이지.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
//배열 출력방법4-1. core 라이브러리추가
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<body>
<h2>TestServlet3.java에서 전달받은 음식정보ArrayList출력</h2>
<!-- 배열 출력방법1. 자바코드 -->
<%
String[] food = (String[]) request.getAttribute("food"); //다운캐스팅
//1-1.Arrays.toString()
out.print(Arrays.toString(food));
//1-2 for each구문
for(String s : food){
out.print(" "+s);
}
%>
<hr>

<!-- 배열 출력방법2. jsp표현식 -->
<%=food[0] %>
<%=food[1] %>
<hr>

<!-- 배열 출력방법3. EL표현식 -->
${requestScope.food[2] }
${ food[3] }
<hr>

<!-- 배열 출력방법4. jstl반복문사용 -:taglib core라이브러리추가 -->
<c:forEach var="f" items="${food }">
${f }<br>
</c:forEach>

//출력값
[순대, 떡볶이, 대패삼겹살, 오리고기] 순대 떡볶이 대패삼겹살 오리고기
순대 떡볶이
대패삼겹살 오리고기
순대
떡볶이
대패삼겹살
오리고기




array_collection.jsp 생성해서 컬렉션출력

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<!-- 컬렉션 출력방법1. 자바코드 -->
<%
ArrayList<String> movie = (ArrayList<String>) request.getAttribute("movie");
for(String m : movie){
out.print("movie : "+m+"<br>");
}
%>
<hr>

<!-- 컬렉션 출력방법2. jsp표현식 -->
<%-- <%=movie[0] %> 이건 배열이고 ArrayList는 get을 쓴다--%>
<%=movie.get(0) %>
<%=movie.get(1) %>
<hr>

<!-- 컬렉션 출력방법3. EL표현식 -->
${requestScope.movie[2] }
${requestScope.movie[3] }
<hr>

<!-- 컬렉션 출력방법4. jstl반복문사용 -:taglib core라이브러리추가 -->
<c:forEach var="m" items="${movie }">
${m }<br>
</c:forEach>

//출력값
movie : 작은아씨들
movie : 겨울왕국
movie : 우리집
movie : 벌새
작은아씨들 겨울왕국
우리집 벌새
작은아씨들
겨울왕국
우리집
벌새

Comments