- 강의 소리가 너무 작아서 크롬 확장 프로그램 Volumn Control을 사용함.
Day 3
8. form 데이터 처리
- 사용자의 form 데이터를 서블릿에서 처리하는 방법에 대해서 학습
8.1. form 태그
- form 태그에 유저의 데이터가 들어가서 submit 버튼을 클릭, request를 통해 웹 컨테이너(tomcat)로 전달된다. 내부에선 request 객체를 통해 유저 데이터를 받을 수 있다.
- doGet으로 받을 수도, doPost로 받을 수도 있다.
8.2. doGet
-
method="get"
으로 설정하고 form태그를 날려주면 서버에서doGet() 메서드
가 받는다. - method를 따로 설정안해주면 디폴트가 get이다.
- 사용자 정보가 URL에 노출되어 웹 서버로 전송된다. URL에 프로토콜, 도메인주소 나오고 맨 끝에
?
가 붙고 그 뒤에{name}={value}
값으로 붙는다. - => 보안에 취약하다. 눈에 보이기 때문에 누가 저 데이터를 그대로 가져와서, parsing을 해서 가로챌 수가 있다.
- URL 길이의 한계가 있으므로, 너무 너무 많은 데이터를 보내기엔 적합하지 않다.
8.3. doPost
-
method="post"
로 설정하고 form 태그를 날려주면 서버에서doPost() 메서드
가 받는다. - 데이터가 HTTP Request에 포함되어 웹서버로 전송되며, 도메인주소 뒤에는 맵핑 정보만 노출된다 (ex.
http://localost:8090/lec08prj001/mSignUp
의mSignUp
) - 데이터가 헤더파일에 암호화되어서 전송된다.
-
로그인, 회원가입, 설문조사는 다 post방식으로 전송한다.
- 하나의 데이터 : getParameter()
-
여러개의 데이터 : getParameterValues()
- formEx.html
<form action="mSignUp" method="post">
name : <input type="text" name="m_name"></br>
...
- MemSignUp.java
@WebServlet("/mSignUp")
public class MemSignUp extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(" -- doGet() -- ");
String m_name = request.getParameter("m_name");
String m_pass = request.getParameter("m_pass");
String m_gender = request.getParameter("m_gender");
String[] m_hobbys = request.getParameterValues("m_hobby");
String m_residence = request.getParameter("m_residence");
System.out.println("m_name : " + m_name);
System.out.println("m_pass : " + m_pass);
System.out.println("m_gender : " + m_gender);
System.out.println("m_hobbys : " + Arrays.toString(m_hobbys));
System.out.println("m_residence : " + m_residence);
Enumeration<String> names = request.getParameterNames();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
System.out.println("name : " + name);
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(" -- doPost() -- ");
doGet(request, response);
}
}
- mSignUp이라고 서블릿 매핑이 되어있다.
- doGet과 doPost를 모두 작성하되, doPost로 넘어오면 doGet을 호출해주는 것은, post로 넘기든 get으로 넘기든간에 하나의 함수로 처리해주기 위해서. (실무에서 많이 쓰는 방법)
-
getParameterValues
를 이용해서 받은 객체는 String 배열로 받는 것을 확인할 수 있다. -
Enumeration<String> names = request.getParameterNames();
은 속성값을 받아 input tag의 이름을 확인해보기 위함이다. 가령 html코드는 현재 없고, BE만 구성하고 있다면 그렇게 받아온 names를 순회하면서 서버쪽으로 날아오는 데이터의 속성값을 확인해볼 수 있다.
9. JSP스크립트
9.1. Servlet vs JSP
- Servlet : JAVA코드로 HttpServlet을 상속받아 사용 (xxx.java -> xxx.class로 변환됨)
- JSP : 자바 코드와 html을 합쳐서 jsp파일을 만들고, jvm이 해석할 수 있는 자바코드로 컴파일러가 바꿔준다 (xxx.jsp -> xxx_jsp.java -> xxx_jsp.class)
- 결과적으로 jsp도 서블릿 파일이라고 볼 수 있다.
9.2. JSP 파일 HTML5 포맷 설정
- html5를 표준으로 사용하기 위해 포맷을 설정해준다.
- window - Preferences
- Web - JSP Files - Editor - Templates 에서 New Template
- Name: html5 format, Context: New JSP, description: html5 format으로 넣고 Pattern은 하단의 코드 첨부
<%@ page language="java" contentType="text/html; charset=${encoding}"
pageEncoding="${encoding}"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="${encoding}">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
- jsp파일을 만들 땐 이렇게 만든 html5 포맷을 활용하면 된다.
9.3. JSP 주요 스크립트
- 선언태그 : JSP 페이지에서 body 안에 Java의 멤버변수 또는 메서드를 선언
-
<%!
…변수 선언 및 초기화, 객체 생성 및 인스턴스 초기화, 메서드 선언 및 정의…%>
로 사용한다.
-
- 주석태그 : jsp 주석은 jsp 파일이 서블릿 파일로 변환될 때 제외된다.
-
<%--
주석--%>
-
- 스크립트릿 태그 : jsp 페이지에서 자바 코드를 넣기 위한 태그.
-
<%
자바 코드 내용%>
- 가령 <% if(..) { >% <p> num > 0 </p> <% } %> 이런 식으로 들어가기도 함. 다만 html과 섞이기 때문에 규모있는 로직을 짜는 데에 사용하진 않는다.
-
- 표현식 태그 : 자바의 변수 및 메서드의 반환값을 출력하는 태그
-
num is <%= num %>
-
- 지시어 : 서버에서 jsp 페이지를 처리하는 방법에 대한 정의
- page : 페이지 기본 설정 -
<%@ page language="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>
- include : include 파일 설정 -
<%@ include file= "header.jsp" %>
- taglib : 태그라이브러리. 외부라이브러리 태그 설정, prefix={네임스페이스명} -
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
10. JSP request, response
- 사용자의 요청과 웹서버의 응답을 담당하는 객체에 대해서 학습
10.1. request 객체
-
form을 이용해서 데이터를 받고, action에 어떠한 jsp파일로 데이터를 넘길 것인지를 설정해준다.
-
formEx.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="mSignUp.jsp" method="get">
name : <input type="text" name="m_name"><br>
password : <input type="password" name="m_pass"><br>
hobby : sport<input type="checkbox" name="m_hobby" value="sport">,
cooking<input type="checkbox" name="m_hobby" value="cooking">,
travel<input type="checkbox" name="m_hobby" value="travel">,
<input type="submit" value="sign up">
</form>
</body>
</html>
- mSignUp.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 m_name;
String m_pass;
String[] m_hobby;
%>
<%
m_name=request.getParameter("m_name");
m_pass=request.getParameter("m_pass");
m_hobby=request.getParameterValues("m_hobby");
%>
m_name = <%= m_name %> <br>
m_pass = <%= m_pass %> <br>
m_hobby :
<%
for(int i=0; i<m_hobby.length; i++) {
%>
<%= m_hobby[i] %>
<%
}
%><br>
</body>
</html>
10.2. response 객체
-
reponse.sendRedirect() 등을 통해 다른 jsp 페이지로 넘겨줄 수 있다.
-
firstPage.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>
<p> First Page!! </p>
<%
response.sendRedirect("secondPage.jsp");
%>
</body>
</html>
- secondPage.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>
<p> Second Page!! </p>
</body>
</html>