본문 바로가기
국비 학원 가서 개발새발

국비학원 26일차) JSP에서 서블릿으로 데이터를 가져오자(데이터 저장공간, 유효범위)

by 휴일이 2022. 11. 4.

Enumeration : 데이터 가져올때 쓰는데 복잡하고 하나하나 설정해줘야해서 잘 안씀

Map : Set -> Iterator로 가져올 수 있어서 쉽게 가져옴 개꿀띠

 

 

 

Enumeration으로 가져오는 법

 

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>
<body>
	
	<form action="EnumerationServlet">
	
	이름 <input type="text" name="userName"><br>
	나이 <input type="text" name="userAge"><br>
	<input type="submit" value="전송"><br>
	 
	
	</form>
	
</body>
</html>

 

 

package step1;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;

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

/**
 * Servlet implementation class EnumerationServlet
 */
@WebServlet("/EnumerationServlet")
public class EnumerationServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public EnumerationServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		
		PrintWriter out = response.getWriter();
		Enumeration e = request.getParameterNames();
		Enumeration<String> em = request.getParameterNames();
		
		while(e.hasMoreElements()) {
			String info = request.getParameter(e.nextElement().toString());
			out.print(info+"<br>");
			out.print(em.nextElement().toString()+"<br>");
			out.close();
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 

Map으로 가져오는 법

 

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>

</head>
<body>
	
	<form name="friendForm" method="get" action="MapServlet">
	<input type="radio" name="gender" value="남">남<br>
	<input type="radio" name="gender" value="여">여<br>
	
	기수 <input type="text" name="kosta"><br>
	<input type="checkbox" name="friend" value="b">홍길동<br>
	<input type="checkbox" name="friend" value="lee">장동건<br>
	<input type="checkbox" name="friend" value="m">마동석<br>
	
	<input type="checkbox" name="friend" value="pizza">피자<br>
	<input type="checkbox" name="friend" value="flower">꽃등심<br>
	<input type="checkbox" name="friend" value="fish">다금바리<br>
	
	<input type="submit" value="전송">
	</form>
	
</body>
</html>

 

 

package step2;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

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

/**
 * Servlet implementation class MapServlet
 */
@WebServlet("/MapServlet")
public class MapServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public MapServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		//요청시 넘어온 데이터를 name, value 형태로 가져옴
		//String key, String[] value
		Map<String, String[]> map = request.getParameterMap();
		
		//Map으로부터 key들을 반환받는 keyset();
		//keyset()은 set을 반환하므로 iterator()를 열거할 수 있다
		//Iterator()을 수행하며 next()를 호출하면 key가 반환되고
		//이는 html name이다, name을 map에 get(name)하면 value가 반환되는데
		//이 value의 타입은 String[]이므로
		//for loop를 수행하고 name과 value를 출력하면 된다
		Set<String> set = map.keySet();
		Iterator<String> it = set.iterator();
		
		String str = "";
		String str1[];
		
		while(it.hasNext()) {
			str=it.next();
			str1 = map.get(str);
			
			for(String s : str1) {
				out.print(s+"<br>");
			}
		}
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 

 

 

<라이프 사이클>

 

init()

생성자 같은 역할

맨 처음 서블릿이 객체 생성될 때 한번만 실행됨

초기화 목적으로 사용

 

 

destroy()

서블릿 객체가 없어질 때 한 번만 실행됨

마무리 작업, 메모리 해제해줄 때, 정리할 때 사용

 

 

service()

서블릿이 호출될 때마다 계속 실행됨

직접적인 작업을 해줄 때 사용

 

 

 

 

package step3;

import java.io.IOException;

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

@WebServlet("/LifeServlet")
public class LifeServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       


	@Override
	public void init(ServletConfig config) throws ServletException {
		//서블릿 객체는 1개 생성됨
		//서블릿 객체 생성 이후에 한번 호출
		System.out.println("init() call...");
	}
	
	private int count;
	

	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println(++count+"service call....");
	}



	@Override
	public void destroy() {
		//server를 stop할 경우 싱행됨
		//destroy() 서블릿 객체 해제 직전 호출
		System.out.println("destroy() call...");
	}
	
	
	

	

}

 

 

 

 

ServletContext

서블릿과 컨테이너의 연동

서블릿끼리 데이터를 공유하기 위해 사용

컨테이너마다 하나의 서블릿컨텍스트가 생성되고 종료시 소멸

 

Map형식으로 데이터가 들어갑니다~

 

 

 

 

dto

package vo;

public class ProductVo {
	
	private String id;
	private String name;
	private int price;
	
	public ProductVo(String id, String name, int price) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
	}
	
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	
	@Override
	public String toString() {
		return "ProductVo [id=" + id + ", name=" + name + ", price=" + price + "]";
	}
	
	
}

 

Set

 

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		ServletContext context = this.getServletContext(); //데이터를 공유하는 공간
		
		context.setAttribute("product", new ProductVo("nexus","넥서스s",1234));
		
		
		out.print("ServletContext에 data setting...");
		out.print(this.getServletName()+"ServletContext에 vo setting"+"<hr>");
		
		out.print("<a href=GetProductServlet> GetProductServlet로 이동 </a>");
		out.close();
	}

 

 

Get

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		ServletContext context = this.getServletContext(); //데이터를 공유하는 공간
		ProductVo vo = (ProductVo)context.getAttribute("product");
		out.print(vo);
		out.print(this.getServletName()+"ServletContext로부터 vo getting");
		out.print("<hr>");
		out.print("아이디 :"+vo.getId()+"<hr>"+"이름"+vo.getName()+"<hr>"+"가격"+vo.getPrice());
		out.close();
	}

 

 

 

누르면

 

데이터 가지고 이동!

 

 

 

 

 

주는애


	private List list = new ArrayList();
	
	
	
	@Override
	public void init() throws ServletException {
		ServletContext context = this.getServletContext();
		//list는 주소값을 저장하고 있으므로 새로운 사람 추가는 list.add()로 한다
		//결국 list가 가리키는 주소값은 고정이지만 list의 객체에는 계속 추가된 인원이 증가한다
		context.setAttribute("table", list);
		System.out.println("init() list add");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		out.print(request.getParameter("nick")+"님 입장 환영합니다"+"<hr>");
		list.add(new PersonVo(request.getParameter("id"),request.getParameter("nick")));
		
		out.print("<a href=ListViewServlet>입장 명단 확인</a>");
		out.close();
		
		
		
		
	}

 

 

 

 

받는애

	private List<PersonVo> list;
	
    

	@Override
	public void init() throws ServletException {
		ServletContext context = this.getServletContext();
		list = (ArrayList)context.getAttribute("table"); //Object타입을 return해서 형번환 해주는 것
		
	}



	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html; charset=utf-8");
		PrintWriter out = response.getWriter();
		
		if(list==null) {
			out.print("입장한 사람이 아무도 없습니다");
		} else {
			int count = 1;
			out.print("<table border=1>");
			out.print("<td>인원 수 </td> <td>아이디 </td> <td>닉네임 </td>");
			for(PersonVo p : list) {
				out.print("<tr>");
				out.print("<td>"+count+"</td>");
				out.print("<td>"+p.getId()+"</td>");
				out.print("<td>"+p.getNick()+"</td>");
				out.print("</tr>");
				count++;
			}
			out.print("</table>");
		}
	}

 

 

 

로그인하고

 

 

 

참가하면

 

 

리스트에 넣어진 애들이 나온다

 

 

 

 

 

http는 클라이언트 정보를 저장할 수 있는 능력이 없다

그래서 우리는 데이터를 저장할 수 있는 데이터 저장 공간을 쓰게 되는데....

 

<데이터 저장 공간>

Request

응답와따가따하는애 요청마다 하나씩, 서버가 응답해서 클라이언트한테 가면 소멸됨

 

Session

어디든지 갈 수 있는 애(클라이언트마다 하나, 많은 정보를 담으면 서버 과부하 올 수 있음)

대표적인 거 로그인 로그아웃

 

Application 

서버마다 한개씩 있는 애 얘는 데이터 전체 총괄함

 

pageContext

한 페이지안에서만 동작하는 애

 

유효 범위가 서로 달라서 그때그때 맞춰서 사용하면 됨!

유효범위가 넓은 세션이 제일 편할 거 같지만...클라이언트마다 하나씩 가지고 있는 저장 공간이라

클라이언트가 많아지면 서버 과부하가 오기 때문에

최대한 효율적으로 사용하는 것이 좋다, 세션 객체에 담아온다면 데이터 쓸모가 없어지면 바로세션에서 삭제하는 식으로...

 

 

 

 

728x90