위 글은 해당 카테고리의 수업 강의 자료를 정리한 것입니다.
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");
%>
'강의 > KOSTA' 카테고리의 다른 글
[Spring] Building a Spring Development Environment (0) | 2022.04.22 |
---|---|
[JSP/Servlet] Model2 구현 (Day25) (0) | 2022.04.11 |
[JSP/Servlet] Session and Cookies (Day23) (0) | 2022.04.05 |
[JSP/Servlet] Database integration with JDBC (Day22) (0) | 2022.04.04 |
[JSP/Servlet] JSP and JavaBeans (Day22) (0) | 2022.04.04 |