파라미터
파라미터 생성
URL 뒤에 ?를 추가하고 직접 작성 : 검색을 한 후 상세보기를 할 때 대부분 이방법, get 방식으로만 전송 가능
- 파라미터를 입력받지 않고자 할 때 사용
form을 만들고 그 안에 name 속성을 부여해서 전송
- form 안에 입력객체를 만들었더라도 name 속성을 부여하지 않으면 전송이 안됩니다.
ajax에서는 파라미터를 별도로 만들어서 전송
서버에서 파라미터 읽기
String request.getParameter(String name)
: name에 해당하는 파라미터 값을 문자열로 리턴, 없는 name이면 null이고 name은 있는데 입력을 하지 않으면 ""
String[] request.getParameterValues(String name)
: name에 해당하는 파라미터 값을 문자열 배열로 리턴하는데 name이 없으면 null, 체크박스나 select는 여러 개 선택이 가능하기 때문에 여러 개 선택한 경우에는 배열로 받아야 합니다.
- 파라미터 인코딩 : 파라미터에 한글이 있는 경우
- get 방식 - WAS : tomcat 8.0 이상을 사용하면 할 필요가 없습니다.
- post 방식 - 서버쪽 코드 : 파라미터를 읽기 전에
request.setCharacterEncoding("utf-8");
이 코드를 먼저 호출해서 인코딩 방식을 변경해야 합니다. 그렇지 않으면 한글 파라미터는 깨지게 됩니다. - 설계할 때 부터 인코딩은 정확하게 해서 들어가게 해야 한다.
파라미터 처리
- parameter: 클라이언트에서 서버로 넘기는 데이터
- argument(매개변수): 함수를 호출할 때 넘겨주는 데이터
1.파라미터를 만들어주는 방법
1) URL 뒤에 ?를 하고 이름 과 값을 기재하는 방법
- 여러 개가 있는 경우는 &로 구분
- 검색된 결과에서 제목 등을 클릭해서 제목에 해당하는 데이터를 가져오는 경우 - 상세보기에 많이 이용
2) form에 name 속성을 갖는 입력 객체를 만드는 방법
- 데이터를 사용자로부터 입력받아서 전달하는 것이 목적
3) ajax 나 웹에 요청을 하는 애플리케이션에서 별도로 만들어서 전달하는 방법
- html을 요청하는 것이 아니고 데이터가 필요한 경우
2.html 페이지에 form 만들기
<form method="" action="" enctype="" id="">
</form>
1) id
: 자바스크립트에서 사용하기 위해서 설정
- 자바스크립트에서 form을 사용할 의도가 없다면 생략 가능
2) action
: 폼의 데이터를 전송받을 서버의 url
- 생략하면 현재 URL이 그대로 설정
3) method : 파라미터 전송 방식
- 생략하면 get
- post 나 put, delete를 사용할 때는 설정을 해야 합니다.
4) enctype : 전송방법
- 분할 전송을 하고자 할 때는
multipart/form-data
라고 설정- 분할 전송을 해야 하는 경우는 파일을 업로드 해야 하는 경우
- 파일은 크기 때문에 쪼개서 보내야 된다 - multipart, 받을때도 마찬가지로 쪼개서 받는거다
- 웹서버와의 파일 주고 받기할때 주로 사용한다.
- 소켓서버로 하려면 클라이언트언어와 서버언어를 맞추는게 중요하다.
실습
1) Dynamic Web Project 생성(web.xml 파일을 포함하도록 설정)
2) tomcat 디렉토리 안의 lib 디렉토리에서 servlet-api.jar 파일을 프로젝트의 WebContent/WEB-INF/lib 디렉토리에 복사
- jsp 나 servlet을 생성해서 사용할 때 에러 표시를 없애기 위해서
3) 프로젝트의 메인 페이지로 사용할 index.html을 WebContent 디렉토리에 만들고 작성
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>java web 2일차</title>
</head>
<body>
<a href="./param/paraminput.jsp">파라미터 입력</a><br/>
</body>
</html>
4) WebContent 디렉토리에 param 디렉토리를 생성하고 paraminput.jsp 파일을 만들어서 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터 만들기</title>
</head>
<body>
<!-- 링크에 파라미터 만들기 : 직접 파라미터 입력-->
<a href="./process.jsp?query=korea&name=park">대한민국</a><br/>
<!-- form을 이용한 파라미터 만들기 -->
<h1>GET 방식 전송</h1>
<form method="get" action="get.jsp">
이름:<input type="text" name="name"/><br/>
취미:<input type="checkbox" name="hobby" value="game">게임
<input type="checkbox" name="hobby" value="reading">독서
<input type="checkbox" name="hobby" value="billiard">당구
<br />
나이:<select name="age">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
</select>
<br/>
<input type="submit" value="전송"/>
</form>
<h1>POST 방식 전송</h1>
<form method="post" action="post.jsp">
비밀번호:<input type="password" name="pw" /><br/>
하고싶은 이야기:<textarea name="words" rows="5" cols="20"></textarea>
<br />
<input type="submit" value="전송"/>
</form>
</body>
</html>
5) project 실행해서 index.html에서 링크를 눌러서 이동되는지 확인
<body>
<h2>처음 만들어보는 Java Web Project</h2>
<!-- 0211 -->
<h3>0211 study</h3>
<ol>
<li><a href="./0211/second.jsp" target="content">JSP 파일 호출하기</a></li>
<li><a href="first" target="content">서블릿 호출하기 </a></li>
<li><a href="./0211/requestUse.jsp" target="content">request 객체의 메소드 </a></li>
</ol>
<!-- 0212 -->
<h3>0212 study</h3>
<ol>
<li><a href="./0212/parameter/para.jsp" target="content">0212 파라미터 수정 </a></li>
</ol>
<iframe name="content" width="700" height="500"> </iframe>
6) para.jsp 만들기
<title>파라미터 만들기</title>
</head>
<body>
<!-- 1. 링크에 파라미터 만들기 : 직접 파라미터 입력 -->
<a href="./process.jsp?query=korea&name=park"> 대한민국 </a><br/>
<!-- 2. form을 이용한 파라미터 만들기 -->
<h1>Get 방식 전송 </h1>
<form method="get" action="get.jsp">
이름 : <input type="text" name="name"/><br/>
취미 : <input type="checkbox" name="hobby" value="game">게임
<input type="checkbox" name="hobby" value="reading">독서
<input type="checkbox" name="hobby" value="billiard">당구
<br/>
나이 : <select name="age">
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
</select>
<br/>
<input type="submit" value="전송"/>
</form>
<h1>Post 방식 전송</h1>
<form method="post" action="post.jsp">
비밀번호 : <input type="password" name="pw" /><br/>
하고싶은 이야기(여러줄) : <textarea name="words" rows="5" cols="20"></textarea>
<br/>
<input type="submit" value="전송"/>
</form>
</body>
서버 페이지에서 파라미터 읽기
- String request.getParameter(String name) : name 에 해당하는 파라미터를 문자열로 리턴
- String [] request.getParameterValues(String name) : name에 해당하는 파라미터를 문자열 배열로 리턴 체크박스나 List처럼 여러 개를 선택할 수 있는 경우에 사용
실습
1) param 디렉토리에 process.jsp 파일을 만들고 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터 처리 페이지</title>
</head>
<body>
<%
//파라미터 읽기 - 없는 name을 사용하면 null 이 리턴되고 입력을 안하면 ""
String query = request.getParameter("query");
String name = request.getParameter("name");
%>
<p>query:<%=query%></p>
<p>name:<%=name%></p>
</body>
</html>
2) param 디렉토리에 get.jsp 파일을 만들고 파라미터 읽어서 출력하는 코드를 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>get 방식 파라미터 읽기</title>
</head>
<body>
<%
String name = request.getParameter("name");
//hobby는 체크박스인데 getParameter로 읽으면 첫번째 선택된 항목 하나만 넘어옵니다.
//이런 경우에는 getParameterValues로 읽어서 배열로 리턴받아야 합니다.
//String hobby = request.getParameter("hobby");
String [] hobby = request.getParameterValues("hobby");
String age = request.getParameter("age");
%>
<p>name:<%=name %></p>
<!-- 배열은 바로 출력하면 안되고 반복문을 이용해서 출력 -->
<p>hobby:<%for(String imsi : hobby){out.write(imsi + "\t");} %></p>
<p>age:<%=age %></p>
</body>
</html>
3) param 디렉토리에 post.jsp 파일을 만들고 파라미터 읽는 코드를 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터 처리</title>
</head>
<body>
<%
String pw = request.getParameter("pw");
String words = request.getParameter("words");
%>
<p>비밀번호:<%=pw %></p>
<p>하고싶은 이야기:<%=words %></p>
</body>
</html>
파라미터 한글 처리
1. 파라미터를 만들 때 직접 작성하는 경우 한글이 있으면 인코딩해서 붙여야 합니다.
- ajax 나 애플리케이션에서 요청할 때는 한글이 깨지게 됩니다.
2.get 방식의 파라미터를 처리할 때 인코딩은 WAS가 처리
- Tomcat 의 경우 8.0 이상 버전이면 utf-8로 처리
- 8.0보다 낮은 버전이면 한글 인코딩 처리 코드를 직접 삽입해야 합니다.
- Connector 태그에 URIEncoding="utf-8" 을 입력해주어야 합니다.
3.post 방식의 파라미터를 처리할 때 인코딩은 서버의 코드가 수행
- 파라미터 읽기 전에 request.setCharacterEncoding("utf-8"); 호출해서 인코딩 방식을 변경해주어야 합니다.
실습 : post.jsp 파일 수정
- 서버에서 처리하는 부분을 잘 만들어서 어디에서든지 동일한 요청은 동일한 URL을 갖고 처리할 수 있도록 하자는 것이 Restful API의 가장 큰 목적입니다.
<%
//파라미터 인코딩 설정
request.setCharacterEncoding("utf-8");
String pw = request.getParameter("pw");
String words = request.getParameter("words");
%>
<p>pw : <%=pw %></p>
<p>words : <%=words %></p>
클라이언트의 헤더(header)읽기
- header: 클라이언트가 서버에게 요청을 할 때 파라미터 이외의 데이터가 필요한 경우 숨겨서 전송하기 위해서 사용
- post 방식으로 전송을 하면 파라미터가 header에 숨겨져서 전송됩니다.
- Open API (데이터나 라이브러리를 가진 곳에서 데이터나 라이브러리를 다운로드 받아서 사용할 수 있도록 제공하는 것)에서 예전에는 key를 발급해서 key를 파라미터 형태로 전송하도록 했는데 이 방식을 이용하면 URL에 key가 노출됩니다.
- 최근에는 key를 header에 숨겨서 전송하도록 하는 방식이 사용이 됩니다.
- 우리나라 공공 데이터 Open API는 아직도 URL에 key 값을 입력하는 구조이고 다른 곳은 대부분 key를 header에 숨기는 방식을 이용합니다.
- Open API가 무료로 데이터를 사용하도록 하기는 하지만 어떤 유저가 얼만큼의 데이터나 라이브러리를 사용하는지 파악하고 제한을 가하기 위해서 key를 발급합니다.
1.읽는 메소드
String request.getHeader(String name)
: 이름에 해당하는 헤더의 값을 문자열로 리턴long request.getDateHeader(String name)
: 이름에 해당하는 헤더의 값을 epoch time에 해당하는 정수로 리턴- 팝업창 15일간 보지 않기 등과 날자 계산이 필요할 경우 사용함.
response 객체
- 클라이언트의 출력을 만들어주는 객체로 응답 객체라고 합니다.
- jsp 파일에서는 response 라는 이름으로 제공되고 servlet에서는 doGet 메소드와 doPost 메소드의 2번째 매개변수입니다.
1.헤더 설정 메소드
void addDateHeader(String name, long date)
void addHeader(String name, String value)
void addIntHeader(String name, int value)
void setDateHeader(String name, long date)
void setHeader(String name, String value)
void setIntHeader(String name, int value)
2.캐시 만료 날짜 설정
- 현재 페이지를 읽어서 브라우저에 저장하고 있다가 다음에 요청하면 브라우저에 있는 페이지를 읽도록 해주는 기능이 캐싱입니다.
- 캐싱을 하고자 할 때는 Expires 라는 헤더를 추가하고 1970년1월1일 자정 이후의 시간을 1/1000 초 단위로 설정하면 됩니다.
//현재 페이지를 5일 동안 캐싱
int long = System.currentTimeMillis();
response.setDateHeader("Expires", long + 5*24*60*60*1000);
예전에는 네트워크 사정이 별로 좋지 못했기 때문에 캐싱 기능을 많이 이용
- 캐싱을 삭제 : 브라우저 마다 방법이 달라서 4개의 코드를 모두 작성해야 합니다.
response.setHeader("Pragma", "no-cache");
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Cache-Control", "no-store");
response.setHeader("Expires", 1L);
3.sendRedirect(String url)
- url로 리다이렉트
리다이렉트는 현재까지 요청 흐름을 끝내고 새로운 요청을 만들어서 url로 이동하는 것
- 브라우저 창의 URL이 변경되고 request 와 response 객체가 새로 만들어 집니다.
- 리다이렉트는 모든 URL로 이동이 가능
새로고침을 하면 결과만 다시 출력
이와 반대로 현재 요청 흐름을 유지하고 url로 이동하는 것을 forwarding 이라고 합니다.
- forwarding을 하게되면 URL이 변경되지 않고 request 와 response도 계속 유지
- 자신의 도메인 내에서만 이동이 가능
- 새로고침을 하면 서버에 다시 요청을 해서 처리를 하고 결과를 다시 출력
입력 --> 분석 --(rediret)--> 출력 : 출력에서만 새로고침.
입력 --> 분석 --(forwarding)--> 출력 : 분석으로 갔다가 다시 출력으로 옴 (검색)Java -> Java Web -> Spring
- java를 이해해야 웹 페이지 만들때 최적화를 할 수 있다.
java, Ruby on rails -> Web Service 공부
out 객체
- html 출력을 위한 객체
- jsp에서는 처음부터 제공이 되고 servlet에서는 response.getWriter()를 호출해서 생성
- Model1(jsp에서 처리와 출력을 모두 수행) 에서는 Model2(처리는 서블릿과 자바가 수행하고 출력만 jsp가 담당 - EL 과 JSTL을 이용해서 출력)에서는 중요하지 않음
- 출력 스트림이므로 PrintWriter 클래스의 메소드를 사용해서 출력
실습
1) index.jsp 파일에 실습 파일 링크 설정
<a href="./out/out.jsp">out 객체 이용</a><br/>
2) WebContent 디렉토리에 out 디렉토리를 생성하고 out.jsp 파일을 만들어서 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.println("<h2>out을 이용한 출력</h2>");
out.println("<p>나이<select name='age'>");
//<option value=1>1</option>
for(int i=1; i<100; i=i+1){
out.println("<option value=" + i + ">" + i + "</option>");
}
out.println("</select></p>");
%>
<div id="disp"></div>
<script>
//스크립트는 소스보기를 하면 코드 확인 가능 - 보안이 취약
//java 코드는 소스보기를 하면 결과만 보이지 소스 코드가 보이지 않음 - 보안이 스크립트보다 우수
//클라이언트 코드는 보안이 안됨. 서버에서 보안하자.
var disp = document.getElementById("disp");
var html = "<select name='year'>";
for(var i=1900; i<2021; i=i+1){
html = html + "<option value=" + i + ">" + i + "</option>";
}
html = html + "</select>";
disp.innerHTML = html;
</script>
</body>
</html>
pageContext
- jsp 페이지 1개와 매칭이 되는 객체
- 이 객체는 다른 내장 객체를 가져와서 사용할 수 있도록 해주는 메소드를 소유
- request 객체를 가져와서 사용하고자 하면 HttpServletRequest request = pageContext.getRequest();
web.xml
- 반드시 WebContent(webapp)/WEB-INF/ 디렉토리에 존재해야 하는 웹 애플리케이션 설정 파일
- 웹 서버가 구동될 때 자신의 설정 파일을 읽고 그 다음 웹 애플리케이션을 실행할 때 가장 먼저 읽어내는 설정 파일
- 이 파일이 프로젝트 내에 없으면 서버 디렉토리에서 파일을 찾아서 읽습니다.
설정 내용 1) 시작 페이지(welcome file) 2) 에러 페이지 3) 서블릿, 필터, 리스너 설정 4) 세션 5) 초기화 파라미터 정보
시작 페이지 설정 : 맨 위에 있는 파일을 찾아보고 있으면 출력하고 없으면 그 아래 파일을 찾아봅니다.
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
- 초기화 파라미터 설정
<context-param>
<param-name>파라미터이름</param-name>
<param-value>파라미터값</param-value>
</context-param>
웹 애플리케이션을 시작할 때 읽을 수 있는 파라미터
어떤 데이터가 처음 한 번 읽으면 애플리케이션내에서는 다시는 변하지 않는 경우 그리고 이 데이터는 애플리케이션이 실행되는 환경마다 변해야 하는 경우가 있습니다.
대표적인 데이터가 데이터베이스 URL 이나 id 또는 password 같은 데이터입니다.
개발환경과 운영환경이 다른 경우 개발환경에서 사용하는 데이터베이스 URL은 로컬이 될 가능성이 높고 실제 개발이 끝나고 운영을 하는 경우에는 로컬이 아니고 실제 데이터베이스 URL로 변경이 되어야 합니다.
이런 데이터를 자바 코드안에 입력해서 사용하면 개발이 끝나고 운영환경으로 이행할 때 자바코드를 수정해서 컴파일을 다시하고 빌드를 다시해서 운영해야 합니다.
컴파일을 다시 하면 예기치 않은 오류가 발생할 수 있습니다.
이런 경우에는 데이터베이스 URL을 파일이나 데이터베이스에 기록해두고 불러와서 사용하는 형태로 만들어야 이행을 할 때 소스 코드를 수정하지 않습니다.
그 방법 중의 하나로 web.xml 파일의 초기화 파라미터를 이용합니다.
application 객체
- 웹 애플리케이션이 매핑이 되는 객체
- 웹 애플리케이션 전체에 1개만 생성됩니다.
1.초기화 파라미터 읽어내기
String getInitParameter(String name)
: web.xml 파일에 만든 context-param 중에서 name에 해당하는 value를 리턴
2.logs 디렉토리에 만들어진 오늘 날짜에 해당하는 log 파일에 기록
void log(String msg)
3.프로젝트 내의 존재하는 경로를 절대 경로 변경해주는 메소드
String getRealPath(String 프로젝트 내의 경로)
: servlet 3.0 아래 버전에는 이 메소드가 없습니다. 이 경우는 request.getRealPath(String 프로젝트 내의 경로) 이용
4.application 객체는 jsp 페이지에서는 처음부터 존재하고 servlet 에서는 request.getServletContext()
로 찾아와야 합니다.
초기화 파라미터 읽기 실습
1) 초기화 파라미터 생성 - web.xml 파일에서 작성
<!-- 초기화 파라미터 -->
<context-param>
<param-name>dburl</param-name>
<param-value>211.183.6.60:1521/xe</param-value>
</context-param>
2) index.html 파일에 링크를 설정
<a href="./app/application.jsp">application 객체</a><br/>
3) WebContent 디렉토리에 app 디렉토리를 만들고 application.jsp 파일을 만들고 작성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//초기화 파라미터 읽기
String url = application.getInitParameter("dburl");
out.println("<h3>초기화 파라미터 url:" + url + "</h3>");
//프로젝트 내의 경로의 절대 경로를 확인
//파일을 업로드할 때나 특정 디렉토리에 파일을 생성할 때는 절대 경로가 필요
//현재 프로젝트가 실행되고 있는 디렉토리를 확인하고자 할 때 사용해도 됩니다.
String path = application.getRealPath("/app");
out.println("<h3>app의 절대경로:" + path + "</h3>");
%>
</body>
</html>
4) html 이나 jsp만 수정한 것이 아니고 web.xml 도 수정했기 때문에 웹 애플리케이션을 다시 실행시켜야 적용이 됩니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>초기화 파라미터 읽기</title>
</head>
<body>
<%
// 프로젝트 내의 경로의 절대 경로를 확인
// 파일을 업로드할 때나 특정 디렉토리에 파일을 생성 할 때는 절대 경로가 필요
String path = application.getRealPath("/app");
out.println("<h3>app의 절대경로 : " + path + "</h3>");
%>
</body>
</html>