티스토리 뷰

 

 

 

 

 

 

 

 

 

 

📍   서블릿과 JSP페이지 연결

–   데이터 통신. (el표현식)
–   서블릿에서 데이터를 주면 JSP에서 받기.

 

 

 

 

 


📃  TestServlet1.java


•   서블릿 작성

–   작성 규칙에 따라 서블릿 만들기.

 

1.   HttpServlet 클래스 상속

2.   doget() 메서드 오버라이딩
      →   dopost()는 어차피 지금 실현 못하니까 doget()만 오버라이딩 함 .
3.   헷갈리지 않게 매개변수를 request, response로 변경

4.   JSP페이지로 정보 전달하기 위해 정보 저장하고 페이지 이동

public class TestServlet1 extends HttpServlet{
	// 부모가 서블릿이니 자식도 서블릿

	@Override
	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("TestServlet1 - doGet() 호출");
		
//		response.getWriter().append("Hello!");
		
		// 서블릿 → JSP페이지 정보 전달
		// request 영역객체 사용하여 정보 저장 
		request.setAttribute("test1", 1000);

		// session 영역객체 사용하여 정보 저장
		HttpSession session = request.getSession();
		session.setAttribute("test1", 1000);
		
		// JSP페이지 연결
		RequestDispatcher dis
			= request.getRequestDispatcher("./el/attribute.jsp"); // webapp 폴더 밑의 실제주소
		dis.forward(request, response);
	}
		
}
코드 분석
10
  –   이렇게 화면에 출력이 가능 하지만 사용해야 할 코드들이 너무 길고 복잡함.
       →   JSP페이지에 코드를 작성하고 서블릿에 연결해서 사용.

12, 13
  –   영역객체를 사용하여 서블릿 → JSP페이지로 정보 전달하기
  –   JSP 영역객체 : page(pageContext),  request,  session,  application

14
  –   request 객체 사용하여 정보 저장함.

  ▪   set.Attribute() 메서드의 정보
  –   void javax.servlet.ServletRequest.setAttribute(String name, Object o)
  –   파라미터의 Object타입에 int타입 1000 데이터가 들어감.  (업캐스팅)
       →   엥?  Object타입을 상속할 수 있는건 '참조형'만 가능,  '기본형'은 불가능.
       →   오토박싱으로 int타입이 integer타입(객체)으로 변경되어 가능했던 것.

17, 18
  –   session 객체 사용하여 정보 저장함.
  –   request 객체는 기본적으로 '요청'의 역할 → 대부분의 web정보를 들고올 수 있음.

21, 22
  –   RequestDispatcher 인터페이스 사용.
       →   인스턴스 생성X,  내장객체를 이용하여 포워딩방식으로 페이지 이동함.
  –   괄호 안에 이동할 JSP페이지 작성.

  –   ./   상위폴더에 접근하기 위한 경로를 나타냄.

23
  –   이동 방식 → 포워딩 방식
  –   해당 request는 test1 변수의 '1000' 이라는 데이터를 가지고 이동함.
  –   포워딩 방식은 request,  session,  application 영역의 정보 모두 이동 가능.

 

 

 

 

 

▸   경로

 

1.   절대 경로

–   최초의 시작점으로 경유한 경로를 전부 기입하는 방식.
–   어떠한 OS던 최상위 루트 로부터 경유한 경로를 전부 기입한 절대 경로로만 파일을 찾을 수 있음.
     ex )   C:\Users\UserID\Desktop\test.txt

 

 

 

2.   상대 경로

–   상대 경로는 항상 비교할 대상이 있어야 함.
–   기준 경로를 기준으로 절대 경로가 구성되며,  
     상대 경로로 파일의 위치를 찾을 수 있는 이유는 기준 경로가 절대 경로로 변환하여 OS에게 전달 하기 때문.
      →   즉,  비교 대상이 '지금 내 위치'에 주어지는 상황.
      ex )   C:\Mommoo\Desktop\test.txt
               C:\Mommoo\test.txt

 

   최상위 경로 (root)    /
   현재 내위치    ./ 파일명
   현재폴더     파일명
   상위폴더    ../ 파일명
   하위폴더     디렉토리명 / 파일명

 

 

 


📃   WEB.xml


•   TestServlet1 매핑

–   어노테이션으로 간단하게 사용 가능 하지만,  서블릿으로 구현하는 기존의 방법도 알아야하므로 작성함.

<servlet>
	<servlet-name>TestServlet1</servlet-name>
	<servlet-class>com.itwillbs.servlet.TestServlet1</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>TestServlet1</servlet-name>
	<url-pattern>/test1</url-pattern>
</servlet-mapping>
코드 분석
2
  –   설정 파일 내부에서 사용되는 임의의 서블렛명.

3
  –   실질적으로 요청에 대해 처리될 물리적인 서블렛 클래스명.

7
  –   설정파일 내부에서 사용되는 임의의 서블렛명.
       '<servlet>' 엘리먼트에 정의된 이름과 일치해야함.


8

  –   url 상에서 실질적으로 요청되는 서블렛명.

 

 

 


📃   TestServlet1.java


•   매핑 확인

public class TestServlet1 extends HttpServlet{
	
    // http://localhost:8088/JSP7/test1

–   xml파일에서 매핑값을 줬으므로 제대로 매핑되었는지 확인하기.
–   페이지 실행 시,  화면 url에 해당 주소가 뜨고 빈 페이지면 제대로 매핑된 것.

–   이제부터 해당 파일 실행할 때 Ctrl + URL + 클릭으로 실행하기.

 

 

 


📃   attribute.jsp


•   '속성' 으로 전달된 정보 저장

–   서블릿 페이지에서 attribute 속성을 사용하여 JSP페이지로 정보를 전달했으므로 해당 정보를 가져와 저장하겠음.

<h1>/el/attribute.jsp</h1>

<!-- 서블릿에서 전달된 '속성'정보 저장 -->
<%
	int num1 = (Integer)request.getAttribute("test1");
%>


<!-- 스크립틀릿 엘리먼트 : (변수) Java코드로 작성 -->
속성(jsp) : <%=num1 %> <br>


<!-- el표현식 엘리먼트 : (속성) attribute -->
속성(el)  : ${num1 }
속성(el)  : ${requestScope.test1 }	<!-- 정확한 표현 (영역객체.변수) -->
속성(el)  : ${test1 }
<hr>


<!-- 영역객체에서 데이터 전달받아 저장 -->
test1(requestScope) : ${requestScope.test1 } <br>
test1(sessionScope) : ${sessionScope.test1 } <br>
test1 : ${test1 } <br>
코드 분석
5
  ▪   서블릿에서 전달된 '속성' 정보 저장
  –   Object타입을 integer로 캐스팅하고,  integer에서 int로 오토 박싱.
  –   변수 num1은 자바코드로 작성되어있을 뿐,  
       실제로 request 객체에 저장되어있는 데이터는 '변수 test1'이며 'test1'이 담고 있는 데이터는 '1000'

14
  –   Java코드로 작성된 변수는 출력 안됨.

15
  –   정확한 표현 (영역객체.변수)
  –   request에 있는 '속성' 정보를 받음.
       →   getAttribute() 와 같음.

16
  –   영역객체 생략 가능.
  –   영역객체 생략 시,  순차적으로 접근 (p → r s a)하여 해당 객체를 찾을 때까지 진행.
       해당 객체를 찾을 경우,  다른 영역에 동일한 객체가 있어도 무시.
  –   전달 정보가 많다면 헷갈리지 않기 위해 하나의 영역객체를 사용할게 아닌,

       각자 영역객체를 따로 지정해주면 됨.

21~23
  –   이렇게 영역객체를 이용해서 서블릿의 데이터를 JSP 페이지로 전달할 수 있음.

 

 

•   TestServlet1.java 실행

–   TestServlet1.java 페이지를 실행해야 서블릿에서 저장한 정보를 attribute.jsp 페이지로 전달하여 출력할 수 있으므로

     attribute.jsp 페이지가 아닌 TestServlet1.java 페이지를 실행함. 

     →   서블릿 페이지를 실행하여 정보 전달하고 해당 정보들로 JSP 페이지의 코드를 실행하는 것.

   실행 결과

 

 

 


📃   TestServlet2.java


•   서블릿 작성

 

1.   HttpServlet 클래스 상속

2.   doget() 메서드 오버라이딩
3.   헷갈리지 않게 매개변수를 request, response로 변경

public class TestServlet2 extends HttpServlet {
	
	@Override
	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("TestServlet2-doGet()");
		
	}
}

 

 

 


📃   WEB.xml


•   서블릿 매핑

<servlet>
	<servlet-name>TestServlet2</servlet-name>
	<servlet-class>com.itwillbs.servlet.TestServlet2</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>TestServlet2</servlet-name>
	<url-pattern>/test2</url-pattern>
</servlet-mapping>

 

 

 


📃   TestServlet2.java


•   매핑 확인

public class TestServlet2 extends HttpServlet {

	// http://localhost:8088/JSP7/test2
	
}

 

 

•    서블릿 정보 → jsp페이지로 전달

public class TestServlet2 extends HttpServlet {
	
	// http://localhost:8088/JSP7/test2
	
	@Override
	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {
		
		System.out.println("TestServlet2-doGet()");
		
		// 서블릿 정보 저장
		String[] foods = {"짜장면", "짬뽕", "삼겹살", "국밥", "돈까스", "밀면"};
		request.setAttribute("foods", foods);	
		
		// 리스트 객체 정보 저장
		ArrayList<String> sports = new ArrayList<String>();
		sports.add("축구");
		sports.add("야구");
		sports.add("배구");
		sports.add("농구");
		sports.add("탁구");
		sports.add("당구");
		request.setAttribute("sports", sports);
		
		// 페이지 이동
		RequestDispatcher dis
			= request.getRequestDispatcher("./el/arrays.jsp");
		System.out.println("/el/arrays.jsp 페이지로 이동");
		
		dis.forward(request, response);

	}
}
코드 분석
13
  –   request 영역객체에 배열 객체 정보 저장하여 전달함.

16~22
  –   리스트 생성해서 데이터 입력함.
  –   데이터는 항상 페이지 이동하는 코드 위에서 생성하고 저장해야 함.


23
  –   request 영역객체에 리스트 객체 정보 저장하여 전달함.

23~30
  –   request 영역의 데이터를 전달하기 위해 포워딩 방식으로 페이지 이동함.

 

 

 


📃    arrays.jsp


1.   JSP 코드로 전달정보 저장하고 '표현식' 으로 출력

–   JSP 반복문 사용으로 모든 배열의 요소에 접근하여 출력 가능.

<%
	// 전달 정보 저장 (다운캐스팅)
	String[] foods = (String[])request.getAttribute("foods");
%>

음식 : <%=foods %> <br>

<!-- 반복문으로 모든 배열의 요소에 접근하여 출력 -->
<%
	for(int i=0; i<foods.length; i++){
%>
	음식 : <%=foods[i] %> <br>
<%
	} 
%>

   실행 결과

 

 

2.   영역객체로 전달정보 저장하고 'el표현식' 으로 출력

–   JSP 반복문 사용 불가.

음식(el) : ${requestScope.foods } <br>

음식(el) : ${requestScope.foods[0] } <br>
음식(el) : ${requestScope.foods[1] } <br>

<hr>

–   String배열로 담아옴.
–   toString() 메서드의 기본형이 출력됨.

   실행 결과

 

 

3.    전달받은 리스트 객체 정보 출력

<%
	ArrayList sports = (ArrayList) request.getAttribute("sports");
%>

스포츠     : <%=sports.get(0) %> <br>
스포츠     : <%=sports %> <br>

스포츠(el) : ${requestScope.sports[0] } <br> 
스포츠(el) : ${sports } <br>

–   ArrayList 객체로 담아옴.
–   toString() 메서드의 오버라이딩 된 출력 결과가 나옴.

–   String 배열은 배열 크기가 고정되어 있지만,  ArrayList는 가변길이 언제든지 배열크기가 바뀔 수 있음.

   실행 결과

 

 

 


📃   TestServlet3.java


•   서블릿 작성

–   이클립스 도구를 활용하여 파일 생성 시 HttpServlet 을 상속받음.

–   이제 xml파일에 매핑하지 않고 어노테이션을 사용하여 바로 매핑함.
      →   @WebServlet("/test3")
      →   만약 어노테이션도 적용하고 xml파일도 적용하면 충돌되어 에러 발생하므로 하나만 선택해서 서블릿 매핑하기.

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

	// http://localhost:8088/JSP7/test3
	
	@Override
	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {

	}
}

   실행 결과

더보기
매핑이 잘 되었음을 주소줄을 통해 확인 가능.

 

 

 


📃    Person.java


•   Person 클래스 정의

public class Person{

	private String name;
	private Phone phone;	// Phone 클래스의 phone
	
	// getter setter 
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Phone getPhone() {
		return phone;
	}
	public void setPhone(Phone phone) {
		this.phone = phone;
	}
	
	// toString() 메서드 오버라이딩
	@Override
	public String toString() {
		return "Person [name=" + name + ", phone=" + phone + "]";
	}
	
}

–    객체 속성 (멤버변수)을 정해줌.

–    멤버변수로 지정한 phone의 Phone 클래스가 정의되지 않았으므로 정의해야 함.

–    private 접근제한자니까 getter & setter 만들고 toString() 메서드 오버라이딩 함.

 

 

 


📃   Phone.java


•   Phone 클래스 정의

public class Phone {

	private String model;
	private String telNo;
	
	// getter & setter
	public String getModel() {
		return model;
	}
	public void setModel(String model) {
		this.model = model;
	}
	public String getTelNo() {
		return telNo;
	}
	public void setTelNo(String telNo) {
		this.telNo = telNo;
	}
	
	// toString() 메서드 오버라이딩
	@Override
	public String toString() {
		return "Phone [model=" + model + ", telNo=" + telNo + "]";
	}
	
}

–   Phone 객체가 없으므로 객체 생성함.
–   객체 속성 (멤버변수)을 정해줌.
–   private 접근제한자니까 getter & setter 만들고 toString() 메서드 오버라이딩 함.

 

 

 


📃   TestServlet3.java


•   서블릿 → JSP 페이지 정보 전달

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

	// http://localhost:8088/JSP7/test3
	
	@Override
	protected void doGet(HttpServletRequest request, 
			HttpServletResponse response) throws ServletException, IOException {

		// 서블릿 → JSP페이지 정보 전달		
		// 1. 객체 정보 생성
		Phone p = new Phone();
		p.setModel("아이폰20");
		p.setTelNo("010-1234-5678");
		
		Person hong = new Person();
		hong.setName("홍길동");
		hong.setPhone(p);
		
		// 2. 객체 정보 저장
		request.setAttribute("person", hong);
		
		// 페이지 이동
		RequestDispatcher dis
				= request.getRequestDispatcher("./el/object.jsp");
		System.out.println("./el/object.jsp 페이지로 이동.");
		
		dis.forward(request, response);
	}
}
코드 분석
12~14
  –   Person 객체에 Phone 정보가 포함되므로 Phone 객체 먼저 생성 후 Person 객체 생성함.

18
  –   Person의 Phone 정보에 Phone 객체를 바로 저장해주면 멤버변수인 핸드폰 모델과 번호 다같이 저장 가능.

21
  –   request 객체의 setAttribute("변수명", 저장할 데이터) 메서드를 사용하여 데이터 저장.

24~28
  –    RequestDispatche 인터페이스를 사용하여 포워딩 방식으로 페이지 이동.
  –    포워딩 방식으로 이동 시,  request 객체의 정보도 같이 전달할 수 있음.
        →   저장한 데이터와 함께 'object.jsp' 페이지로 이동함.

 

 

 


📃   object.jsp


•   전달된 정보 출력

<h1>object.jsp</h1>

사용자 정보 : ${requestScope.person } <br>
사용자 이름 : ${person.name } <br>

사용자 휴대폰 모델명 : ${requestScope.person.phone.model } <br>
사용자 휴대폰 전화번호 : ${person.phone.telNo } <br>
코드 분석
3, 4
  –   requestScope 영역객체명 생략 가능.
  –   el표현식으로 request영역에 저장된 person정보 출력해야함.
  –   requestScope 객체 사용하여 person정보,  person의 name정보 출력 가능.

6, 7
  –   Person 객체 정보 안에 있는 Phone 객체 정보 안에 있는 model 정보 == 모델명
  –   Person 객체 정보 안에 있는 Phone 객체 정보 안에 있는 telNo 정보 == 폰번호
  –   Person 객체의 phone 정보에 p (Phone 객체)를 저장했으므로 정보를 불러올 수 있음.
  –   좀 더 많은 정보를 주고 받을 때는 '배열'을 이용함.

   실행 결과

 

 

 

 

 

 

 

 

 

 


🐾 참조 도서 및 사이트 🐾

 

—  https://mommoo.tistory.com/82

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함