session이란 ? 

HTTP 프로토콜을 이용하는 웹 환경에서 상태를 유지 방법이다.

HTTP는 새로고침을 할 때마다 새로운 HTTP가 생성이 되는데, 예를 들어 어떠한 페이지에서 로그인을 했을 시 다음 화면으로 넘어갈 때 로그인이 바로 풀리지 않는다. 그 이유는 세션에 로그인 정보가 저장되어 있기 때문이다.

저장공간은 server이며, 저장기한 등을 설정할 수 있다.

 

 

session사용 예시

html 예시

<body>

<a href="hello">hello servlet</a>

</body>

java 예시

package serv;

import java.io.IOException;
import java.io.PrintWriter;

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

@WebServlet("/hello")
public class HelloServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html; charset=utf-8");
		
		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("</head>");
		
		pw.println("<body>");
	
		HttpSession session = req.getSession();
		
		session.setMaxInactiveInterval(2 * 60 * 60);
		session.setAttribute("member", "abc123");
		String member = (String)session.getAttribute("member");
		
		pw.println("<p>session정보:" + member + "</p>");
        
		session.invalidate();
		
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
	}
}

 

HttpSession 

session사용을 위한 객체

HttpSession 메소드

getSession() getSession(true) → default
session object가 존재하면, 현재 HttpSession을 반환한다
존재하지 않으면 새로 생성한다.
getSession(false)
session object가 존재하면, 현재 HttpSession을 반환한다
존재하지 않으면 null을 반환한다.
setMaxInactiveInterval() 저장기한(유효시간)을 설정한다. 
기한계산방법
- 1년 : 365 * 24 * 60 * 60
- 10분 : 10 * 60
setAttribute(String name, Obejct value) 세션에 데이터를 저장한다.
name은 저장할 데이터의 변수명, value는 저장값이 된다.
getAttribute(String name) name에 저장한 value를 가져온다. 형변환은 필수이다.
invalidate 세션을 종료합니다.

 

실행화면

클릭 후 실행화면

sendRedirect란?

java Servlet에서 이동을 위한 메소드이다. 오직 이동만 한다. 데이터를 가지고 가지 않는다.

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.sendRedirect("sample");
	}

 

forward란?

java Servlet에서 이동을 위한 메소드이다.  클라이언트에게 받은 데이터를 가지고 이동한다.

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		RequestDispatcher rd = req.getRequestDispatcher("sample");
		rd.forward(req, resp);
	}        

forward 사용예시

 

html 예시

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

 <h1>정보를 입력해주세요.</h1>
 <form action="packing" method="get">
 이름 : <input type="text" name="name" size="5"><br><br>
 연령대 :
 <select name="age">
 	<option value="10대">10대</option>
 	<option value="20대">20대</option>
 	<option value="30대">30대</option>
 	<option value="40대">40대</option>
 	<option value="50대">50대</option>
 </select><br><br>
 성별 :  
 <input type="radio" name="trans" value="남자">남자
 <input type="radio" name="trans" value="여자">여자<br><br>
 취미 : 
 <input type="checkbox" name="hobby" value="독서">독서
 <input type="checkbox" name="hobby" value="코딩">코딩
 <input type="checkbox" name="hobby" value="영화감상">영화감상
 <input type="checkbox" name="hobby" value="게임">게임
 <input type="checkbox" name="hobby" value="운동">운동<br><br>
 
 <input type="submit" value="제출">
 </form> 
 
</body>
</html>

Java Servlet 예시1 (forward사용)

package server;

import java.io.IOException;

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;

import dto.Dto;
@WebServlet("/packing")
public class Packing extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String name = req.getParameter("name");
		String age = req.getParameter("age");
		String trans = req.getParameter("trans");
		String[] hobby = req.getParameterValues("hobby");
		
		// 콘솔에 찍어보기
		System.out.println(name);
		System.out.println(age);
		System.out.println(trans);
		
		if(hobby != null) {
			for (int i = 0; i < hobby.length; i++) {
				System.out.println(hobby[i]);
			}
		}
		
		Dto dto = new Dto(name, age, trans, hobby); // 데이터 연결객체
		req.setAttribute("data", dto); //포장하기 포장박스 : data
		
		//resp.sendRedirect("sample"); 사용시 데이터는 가지고 가지 않습니다.
        
		// 이민가기
		RequestDispatcher rd = req.getRequestDispatcher("sample");
		rd.forward(req, resp);
	}
}

checkbox는 데이터를 배열로 넘겨주기 때문에 getParameterValues를 사용하여야 한다.


Java Dto 예시

package dto;

public class Dto {
	private String name;
	private String age;
	private String trans;
	private String hobby[];
	
	Dto(){
		
	}

	public Dto(String name, String age, String trans, String []hobby) {
		super();
		this.name = name;
		this.age = age;
		this.trans = trans;
		this.hobby = hobby;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getAge() {
		return age;
	}

	public void setAge(String age) {
		this.age = age;
	}

	public String getTrans() {
		return trans;
	}

	public void setTrans(String trans) {
		this.trans = trans;
	}

	public String[] getHobby() {
		return hobby;
	}

	public void setHobby(String[] hobby) {
		this.hobby = hobby;
	}
}

Java Servlet 예시2

package server2;

import java.io.IOException;
import java.io.PrintWriter;

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

import dto.Dto;
@WebServlet("/sample")
public class Unpacking extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html; charset=utf-8");
		
		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("</head>");
		
		pw.println("<body>");
		
		pw.println("<h1>회원정보</h1>");
		
		// 출력하기
		Dto dto = (Dto) req.getAttribute("data");
		pw.println("<h3>이름 : " + dto.getName() + "</h3>");
		pw.println("<h3>연령대 : " + dto.getAge() + "</h3>");
		pw.println("<h3>성별 : " + dto.getTrans() + "</h3>");
		
		if(dto.getHobby() != null) {
			pw.print("<h3>취미 : ");
			for (int i = 0; i < dto.getHobby().length; i++) {
				if(i < dto.getHobby().length-1)
						pw.print(dto.getHobby()[i]+", ");
				else if(i == dto.getHobby().length-1) 
					pw.print(dto.getHobby()[i]);	
			}
		}
		pw.println( "</h3>");	
			
		pw.println("</body>");
			
		pw.println("</html>");
		pw.close();
	
	}
}

위 예시는 html파일에 작성을 하고 제출을 하면 Packing class에서 데이터를 받고 forward를 사용하여 Unpacking class에서 데이터를 출력하는 예시이다. 위에 언급대로 Packing class에서 sendRedirect 사용할 경우 페이지 이동은 하되, 데이터는 가져가지 않는다. 그렇기 때문에 forword를 사용한다.

 

실행화면

html 화면

 

Packing class 이클립스 console화면

 

Unpacking class 실행화면

 

get과 post의 차이점

Servlet 데이터 통신 방식
GET POST
<a>, <form>, <location.href> 사용가능 <form>에서만 사용가능.
전송할 때 입력결과를 URL 뒤에 name=value 형태로 전송하고, 여러 개일때는 '&'으로 연결한다. 전송할 때 입력결과가 TCP/IP Protocal의 HEAD 영역에 숨겨진 채 전송한다.
전송 데이터는 최대 255자 전송데이터는 무제한
Servlet의 doGet() 호출한다 Servlet의 doPost()를 호출한다
default 전송방식이며, 보안에 취약하다
처리속도가 GET 방식보다 느리고, 보안에 유리하다.

 

Web에서 Web으로 입력값 전달하기

 

html 예시

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>IO Test</h1>
<form action="test" method="get">
<textarea name="text" rows="5" cols="30">
</textarea><br>
<input type="submit" value="get제출"> 
</form>
<form action="test" method="post">
<textarea name="text" rows="5" cols="30">
</textarea><br>
<input type="submit" value="post제출"> 
</form>
</body>
</html>

Java 예시

package sample2;

import java.io.IOException;
import java.io.PrintWriter;

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("/test")
public class Test extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		resp.setContentType("text/html; charset=UTF-8");
		
		String text = req.getParameter("text");
		
		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("</head>");
		pw.println("<body>");
				
		pw.println("<h1>GET 방식</h1>");
		pw.println("<p>"+ text+"</p>");
		
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html; charset=UTF-8");
		
		String text = req.getParameter("text");
		
		PrintWriter pw = resp.getWriter();
		
		pw.println("<html>");
		
		pw.println("<head>");
		pw.println("<title>제목</title>");
		pw.println("</head>");
		pw.println("<body>");
				
		pw.println("<h1>POST 방식</h1>");
		pw.println("<p>"+ text+"</p>");
		
		pw.println("</body>");
		pw.println("</html>");
		pw.close();
	}
}

 

설명

웹에서 웹으로 출력시, html문서의 구조를 그대로 작성해주어야한다.

@WebServlet("/url")

@WebServlet("/test")에 test는 html는 form tag의 url이다.

web.xml문서없이 Servlet실행이 가능하다.

HttpServletRequest

웹브라우저가 요청할 때 정보를 가져오는 객체

HttpServletResponse

웹브라우저에게 응답을 하기위한 객체

HttpServletRequest.setContentType(" ")

메소드 안의 문자열은 출력될 html의 인코딩 방식을 지정한다.

HttpServletRequest.getParameter("name명")

html의 name명을 작성할 시 해당tag의 value을 얻어온다.

HttpServletResponse.getWriter()

쓰기를 통해 응답을 하는 메서드

HttpServletRequest.setCharacterEncoding("utf-8")

입력된 데이터의 인코딩을 UTF-8로 변경한다.

Post방식은 위 메소드가 있어야 한글이 깨지지 않는다.

 

 

실행화면

 

console에서 java메소드 실행시키기 예시

(1) html, web.xml, java 총 3개의 파일이 필요하다.

(2) java servlet에서 @WebServlet사용시 html, java 2개의 파일이 필요하다.(업그레이드가 되면서 web.xml 파일이 생략가능)

 

 

(1)방법을 예시로 들어보겠다.

Html 예시

<h2>Servlet 기본</h2>

<form action="location" method="get">
	<input type="submit" value="Get방식">
</form>

<form action="location" method="post">
	<input type="submit" value="Post방식">
</form>	

action

값으로 적힌 url, 객체 등.. 이동해준다.

method

form태그 데이터 전송시의 통신방식, defualt값은 get방식이다.

submit

데이터를 전송하기 위한 전송버튼


web.xml예시

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
  version="4.0">

<servlet>
	<servlet-name>hello</servlet-name>
	<servlet-class>sample1.Hello</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>hello</servlet-name>
	<url-pattern>/location</url-pattern>
</servlet-mapping>
</web-app>

 

위 예시는 가장 기초적인 문법 예시이다.

servlet-name

servlet, servlet-mapping안의 servlet-name 문자열이 같아야 한다.

servlet-class

java파일의 Package명.class명을 의미한다.

url-pattern

연결할 url을 작성한다.

 


Java 예시

package sample1;

import java.io.IOException;

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

public class Hello extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Hello doGet()");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Hello doPost()");
	}
}

 

Java Servlet의 조건사항

상속 HttpServlet(== 부모class)
class의 접근제한자 public
import javax.servlet.http.HttpServlet 
전송방식에 따른 메소드 선언 doGet(), doPost()
메소드의 매개변수 HttpServletRequest(요청을 위한 객체)
HttpServletResponse(응답을 위한 객체)

doGet()

html파일 form tag의 method="get"이였을 때 실행된다.

doPost()

html파일 form tag의 method="post"이였을 때 실행된다.

 

 

실행화면

Get방식 버튼을 눌렀을 때 페이지가 넘어가면서 이클립스 콘솔창에 Hello doGet() 출력이 되고,

Post방식 버튼을 눌렀을 때 페이지가 넘어가면서 이클립스 콘솔창에 Hello doPost()이 출력이 된다.

 

 

(2)방법을 예시로 들어보겠다.

Html 예시

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h2>Servlet 기본</h2>

<form action="location2" method="get">
	<input type="submit" value="Get방식">
</form>

<form action="location2" method="post">
	<input type="submit" value="Post방식">
</form>	

</body>
</html>

Java 예시

package sample2;

import java.io.IOException;

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("/location2")
public class Hello extends HttpServlet {

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Hello doGet()");
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("Hello doPost()");
	}
}

class선언 전 @WebServlet("/url") 작성 시 xeb.xml파일 없이도 Servlet이 실행된다.

실행화면은 위와 동일하다.

Servlet이란?

자바 서블릿은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. 위키백과

 

Servlet = Server + Applet

Model2에 주로 사용을 한다.

Servlet은 언어가 Java이다.

java코드 안에 Html코드를 사용한다.

 

web.xml파일 생성하기(이클립스)

Dynamic Web Project 생성후 Project 우클릭

Java EE Tools → Generate Deployment Descriptor Sub 클릭

WEB-INF 폴더를 클릭하면 web.xml파일이 생성된다.

web.xml은 정해여진 이름이라 수정을 하면 안 된다.

 

빨간박스 체크 내용은 굳이 없어도 된다.

web-app태그 안에서 구문을 작성한다.

+ Recent posts