Devlog
article thumbnail

위 글은 해당 카테고리의 수업 강의 자료를 정리한 것입니다. 

 

 

 

1. JSP 태그

  • 기본 태그
Tag Name Purpose
<% %> JSP 스크립트플릿 Java 구문을 JSP 페이지에 삽입
<%= %> JSP 표현식 Java 표현식을 문자열로 출력
<%@ %> JSP 지시자 JSP 페이지 전체에 적용되는 조건을 설정
<%-- --%> JSP 주석 JSP 페이지에 주석 구문을 삽입
<%! %> JSP 선언 인스턴스 변수 및 메소드를 선언
  • Java 클래스를 import하는 JSP 코드
    • <%@ page import="java.util.List" %>
    • <%@ page import="com.javaex.emaillist.dao.EmaillistDao" %>
    • <%@ page import="com.javaex.emaillist.vo.EmailistVo" %>

 

 

2. request 객체 메소드

메소드
설명
getParameter (String param)
주어진 이름의 파라미터가 갖는 값을 리턴한다. 지정된 파라미터가 없는 경우에는 null을 리턴한다.
getParameterValues (String param)
주어진 이름의 파라미터가 갖는 모든 값을 String 타입의 배열로 리턴한다.
파라미터 가 다중 선택이 가능한 리스트 또는 체크 박스 값이라면, 여러 개의 값이 하나의 이름 으로 전달 될 수 있다.
getParameterNames()
request 객체에 포함되어 있는 모든 파라미터의 이름을 Enumeration(열거형) 객체로 리턴한다.
request에 파라미터가 하나도 없는 경우에는 비어있는 Enumeration 객체를 리턴한다.

 

  • request.getParameter() 메소드 (test1.html ➡️ test1.jsp)
<form action="test1.jsp" method="post">
	<input type="text" name="num"/>
    <input type="submit" />
</form>
<%-- num 값으로 123을 넘겨 받았을 떄 --%>
<%= request.getParameter("num")%> <br/> <%-- 123 --%>
<%= request.getAttribute("num")%> <%-- null --%>
<hr/>
<%= request.setAttribute("num", "4321");%>
<%= request.getParameter("num")%> <br/> <%-- 123 --%>
<%= request.getAttribute("num")%> <%-- 4321 --%>

 

  • request.getParameterValue() 메소드 (test2.html ➡️ test2.jsp)
<form action="test2.jsp" method="post">
	<p>
    <select name="color">
    	<option>red</option>
        <option>green</option>
        <option>blue</option>
        <option>white</option>
        <option>black</option>
    </select>
    </p>
    
    <p>
    	<input type="checkbox" name="choice" value="A">A</br>
        <input type="checkbox" name="choice" value="B">B</br>
        <input type="checkbox" name="choice" value="C">C</br>
    </p>
    <input type="submit"/>
</form>
String colorParam = request.getParameter("color");
out.println("<br>colorParm: " + colorParam);

String colorParamVal = request.getParameterValues("color");
for(String c : colorParamVal){
	out.println("<br>colorParamVal: " + c);
}

String one = request.getParameterValues("choice")[0];
out.println("<br>choice[0]: " + one);

String[] choice = request.getParameterValues("choice");

for(String c : choice){
	out.println("<br>choice: " + c);
}

 

  • request.getParameterNames() 메소드 (test3.html ➡️ test3.jsp)
<form action="test3.jsp" method="post">
	<input type="text" name="var1" />
    <input type="text" name="var2" />
    <input type="text" name="myVar" />
    <input type="submit" />
</form>
<%
Enumeration params = request.getParameterNames();
while(params.hasMoreElements()){
	String name= (String) params.nextElement();
    out.print(name + ": "+request.getParameter(name)+"<br>");
}
%>

 

 

3. Get 방식 Post 방식

  • Get 방식
    • 가능한 한 빠르게 데이터를 전송하기 원하는 경우
    • 4KB 보다 작은 데이터를 보내는 경우
    • 파라미터가 URL에 표시되어도 상관없는 경우
    • 사용자가 웹 페이지를 브라우저에 등록(bookmark)할 때 파라미터를 포함하는 경우
  • Post 방식
    • 4KB가 넘는 데이터를 전송하는 경우
    • URL 뒤에 파라미터가 덧붙여지면 안되는 경우

 

 

4. HTTP Get방식의 데이터 전송

  • 데이터를 URL에 포함하여 링크를 통해 값을 전달하는 방식
    • URL의 총 길이가 1024 byte로 제한되기 때문에 전송할 수 있는 데이터에 한계가 있음
    • 모든 데이터가 URL에 그대로 노출되기 때문에 보안이 필요한 경우 적합하지 않음
    • 한글이나 공백은 URLEncoding 처리 해야만 전송할 수 있음
    • 브라우저별로 길이 제한이 다를 수 있음 (참고: http://brainage.egloos.com/4323903)
  • 데이터 전송 방법
    • URL 뒤에 ?를 명시하고 이름=값&이름=값 형태로 전송
<%
    String name="개발자";
    int w = 72;
    int h = 175;
%>

<a href="hello.jsp?name=<%=URLEncoder.encode(name)%>&width=<%=w%>&height=<%=h%>">click</a>
  • 데이터 수신 방법
    • 데이터가 전송된 페이지에서는 request 내장 객체에 이전 페이지로부터 전송된 변수가 저장됨
    • URL에 명시한 변수 이름을 getParameter() 메소드에 전달하여 값을 리턴 받음
<%
    // 모든 페이지에서 파라미터 수신 전 1회 수행해야 함
    request.setCharacterEncoding("UTF-8");
    
    // 전달한 값의 형식에 상관 없이 모두 String으로 리턴됨
    String name= request.getParameter("name");
    String w= request.getParameter("width");
    String h= request.getParameter("height");
%>

 

 

5. HTTP Post방식의 데이터 전송

  • HTML의 <form> 태그 내에 <input> 태그에 입력한 내용을 전송하는 방식
    • 전송할 수 있는 데이터에 한계가 없음
    • 보통 20MB로 설정되어 있기 때문에 GET방식에 비해서 상대적으로 한계가 없음
    • 전송하는 내용이 URL에 노출되지 않기 때문에 GET방식에 비해 상대적으로 보안에 유리함 (절대적으로 안전하지는 않음)
    • 한글이나 공백에 대한 URLEncoding 처리가 필요 없음
  • 데이터 전송 방법
    • <form> 태그의 method 속성에 post라고 명시
    • action 속성에 데이터를 수신할 jsp 페이지의 URL (경로) 지정
    • 이 <form> 내의 submit 버튼이 눌러졌을 때 모든 input 요소에 대한 입력 값 (value 속성 값)이 전송됨
<form method="post" action="post.jsp">
	<input type="text" name="hello" />
    <input type="text" name="world" />
    <button type="submit">click</button>
</form>
  • 데이터 수신 방법
    • 데이터가 전송된 페이지에서는 get 방식과 동일하게 처리함
    • <input> 태그에 명시한 name 속성의 값을 request.getParameter()에 파라미터로 전달하여 입력값을 리턴받음
<%
    // 모든 페이지에서 파라미터 수신 전 1회 수행해야 함
    request.setCharacterEncoding("UTF-8");
    
    // 전달한 값의 형식에 상관 없이 모두 String으로 리턴됨
    String hello= request.getParameter("hello");
    String world= request.getParameter("world");
%>

 

 

6. HTTP GET/POST 파라미터 수신시 주의사항

  • 예외 처리 필요
    • 전송된 값이 null일 수 있음
    • null이 아니더라도 빈 문자열 ("")일 수 있음
<%
	String hello = request.getParameter("hello");
    
    if(hello == null || hello.equal("")){
    	hello="안녕";
    }
%>

 

 

7. 페이지 상태 유지 기법1

  • GET 방식의 경우
    • 이전 페이지에서 전달된 파라미터를 URL에 누적시켜 전달
<%
    int w = request.getParameter("w");
    int h = request.getParameter("h");
%>

<a href="hello.jsp?w=<%=w%>&h=<%=h%>&name=helloworld">click</a>
  • POST 방식의 경우
    • 이전 페이지에서 전달된 파라미터를 hidden field에 포함시켜 submit 처리
<%
    int w = request.getParameter("w");
    int h = request.getParameter("h");
%>

<form method="post" action="foo.jsp">
	<input type="hidden" name="w" value="<%=w%>"/>
    <input type="hidden" name="h" value="<%=h%>"/>
</form>

 

 

8. 페이지 상태 유지 기법2

8.1 Cookie

  • Cookie
    • 변수 값을 사용자의 PC에 텍스트 형태로 저장
    • 초단위의 유효 시간과 유효 도메인을 설정 해야함
    • 서로 다른 도메인 간에는 공유할 수 없지만 서브 도메인 간에는 공유 가능함
    • 보안에 취약하고 데이터 저장시 URLEncode 처리, 데이터 읽어올 때 URLDecodde 처리 필요
    • 지정된 시간 동안은 브라우저를 닫았다가 다시 열어도 삭제되지 않으며 사이트 내의 모든 페이지에서 읽을 수 있는 전역 변수의 역할을 함

 

  • Cookie 저장하기
String input = URLEncoder.encode("저장할 값");

// 쿠키 생성
Cookie info = new Cookie("mycookie", input);

// 쿠키가 유효시간 (초)
info.setMaxAge(60);

// 쿠키가 유효한 경로 설정
info.setPath("/");

// 쿠키가 유효한 도메인 설정 ➡️ 상용화 시에는 사이트에 맞게 수정해야 함
info.setDomain("localhost");

// 쿠키 저장하기
response.addCookie(info);

 

  • Cookie 읽어오기
// 저장된 쿠키 목록을 가져옴
Cookie[] cookies = request.getCookues();

// 쿠키 값을 저장할 문자열
String mycookie = null;

// 쿠키 목록이 있다면
if(cookies != null){
	for(int i=0; i<cookies.length; i++){
    	// 쿠키의 이름을 취득함
        String cookieName = cookies[i].getName();
        // 이름이 내가 원하는 값일 경우 값을 복사함
        if(cookieName.equals("mycookie")){
        	mycookie=cookies[i].getValue(); 
            // 원하는 값을 찾으면 break
            break;
        }
    }
}

 

8.2 Session

  • Session
    • 각 클라이언트의 데이터를 서버의 메모리에 직접 저장하고 사용하는 방식
    • 데이터가 외부로 노출되지 않기 때믄에 상대적으로 보안에 유리 (절대적이진 않음)
  • Session 사용시간 설정 (초 단위)
session.setMaxInactiveIneterval(30);
  • Session 데이터 사용
// 세션 저장하기 ➡️ 모든 형태의 객체 저장 가능
String input = "hello world";
session.setAttribute("mysession", input);

// 세션 읽기 ➡️ 리턴 값을 원래의 형태로 변환 필요함
String input = (String) session.getAttribute("mysession");
  • Session 삭제 (개별, 전체)
session.removeAttribute("mysession"); // 개별
session.invalidate(); // 전체

 

 

9. 웹페이지 강제 이동 처리, 경로 지정 방법

  • JS
    • 브라우저의 히스토리에 남지 않도록 하기 위해서는 js 방식을 사용하면 안됨
    • window.location = "이동할 페이지 URL";
  • JSP
    • servlet 컨트롤러에 의해 즉시 이동
    • <% response.sendRedirect("이동할 페이지 URL"); %>
  • HTML
    • <form> 요소의 submit 처리에 의해 호출된 action 페이지는 요청에 따른 프로그램 로직을 수행한 후 결과 표시를 위한 페이지로 이동해야 함
    • 이때 action 페이지가 브라우저의 히스토리에 남지 않도록 하기 위해 <meta> 태그를 이용한 방식을 사용해야 함
    • <meta http-equiv="refresh" content="지연시간 (초); url=이동할 페이지 주소">
  • 상대 경로, 절대 경로
    • / ➡️ 루트 디렉토리
    • / 또는 .. ➡️ 현재 위치

 


Model1 방식

  • 정의: 모든 요청을 각각의 jsp에게 함
  • 브라우저에서 요청이 들어오면 JSP에서 받음
  • 자신 또는 다른 클래스 (ex: dao)를 이용하여 작업을 처리
  • 처리한 결과를 클라이언트에 출력(응답)
  • 장단점 
장점
단점
구조가 단순하여 익히기가 쉽다.
숙련된 개발자가 아니더라도 구현이 용이하다
출력을 위한 뷰 코드와 로직 처리를 위한 자바 코드가 섞여 코드가 복잡하다.
JSP 코드에서 백엔드와 프론트엔드가 혼재되기 때문 에 분업이 용이하지 않다.
코드가 복잡하고 유지보수가 어렵다.
  • 모델1 방식 예제 (emailist)

  • form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>메일 리스트 가입</h1>
	<p>
		메일 리스트에 가입하려면,<br> 아래 항목을 기입하고 submit 버튼을 클릭하세요.
	</p>
	<form action="insertEmail.jsp" method="post">
		Last name(성): <input type="text" name="last_name" value=""><br>
		First name(이름): <input type="text" name="first_name" value=""><br>
		Email address: <input type="text" name="email" value=""><br>
		<input type="submit" value="등록">
	</form>
	<br>
	<p>
		<a href="list.jsp">리스트 바로가기</a>
	</p>
</body>
</html>

 

  • list.jsp
<%@page import="java.sql.Connection"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.ResultSet"%>
<%@page import="java.sql.SQLException"%>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%! //변수 선언
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;

	String url = "jdbc:oracle:thin:@localhost:1521:XE";
	String user = "webdb";
	String pass = "1234";
	
	String sql = " SELECT * FROM EMAILLIST";
%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h1>메일 리스트에 가입되었습니다.</h1>
	<p>입력한 정보 내역입니다.</p>
	<!-- 메일정보 리스트 -->
	<%-- list에서 하나씩 빼서 테이블를 채운다--%>
	<%
	try{
		//Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDirverz");  //MS-sql
		//Class.forName("org.gjt.mm.msql.Driver");  //mySql
		Class.forName("oracle.jdbc.driver.OracleDriver");
		conn = DriverManager.getConnection(url, user, pass);
		pstmt = conn.prepareStatement(sql);
		rs = pstmt.executeQuery();
	
	while(rs.next()){ %>
	<table border="1" cellpadding="5" cellspacing="2">
		<tr>
			<td align=right width="110">Last name: </td>
			<td width="170"><% out.print(rs.getString("last_name")+"\n");%></td>
		</tr>
		<tr>
			<td align=right >First name: </td>
			<td><% out.print(rs.getString("first_name")+"\n");%></td>
		</tr>
		<tr>
			<td align=right>Email address: </td>
			<td><% out.print(rs.getString("email")+"\n");%></td>
		</tr>
		</br>
		<%} 
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			try{
				if(rs != null) 	 rs.close();
				if(pstmt != null) pstmt.close();
				if(conn != null) conn.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
		
	%>
	</table>
	<br>
	<p>
		<a href="form.jsp">추가메일 등록</a>
	</p>
	<br>
</body>
</html>

 

  • insert.jsp
<%@page import="java.sql.PreparedStatement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
	Connection conn = null;
	PreparedStatement pstmt = null;
	
	String url = "jdbc:oracle:thin:@localhost:1521:XE";
	String user = "webdb";
	String pass = "1234";
	
	String sql = "insert into emaillist values (no.nextval, ?, ?, ?)";

	request.setCharacterEncoding("utf-8");
	
	// String no =   request.getParameter("author_id");
	String last_name = request.getParameter("last_name");
	String first_name = request.getParameter("first_name");
	String email = request.getParameter("email");
	
	try{
		Class.forName("oracle.jdbc.driver.OracleDriver");
		conn = DriverManager.getConnection(url, user, pass);
		
		//미리 미완성의 sql을 등록시켜 놓겠다.
		pstmt = conn.prepareStatement(sql); 
		
		//바인딩 시키기
		//pstmt.setInt(1, Integer.parseInt(author_id)); //첫번째 물음표에 대입!
		pstmt.setString(1, last_name);
		pstmt.setString(2, first_name);
		pstmt.setString(3, email);
		
		pstmt.executeUpdate(); // insert update delete (반영 건수 리턴)
	}catch(Exception e){
		e.printStackTrace();
	}finally{
		try{
			if(pstmt != null) pstmt.close();
			if(conn != null) conn.close();
		}catch(Exception e){
			e.printStackTrace();
		}
	}
  
  response.sendRedirect("list.jsp");
%>
profile

Devlog

@덩이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그