form에서 데이터 전송방식을 get으로 명시하면 servlet에서 doGet()이 데이터를 받는다.
<form action="Login_test" method="get">
<input type="text" name="userid" placeholder="ID">
<br>
<input type="password" name="password" placeholder="PASSWORD">
<br>
<input type="submit" value="로그인">
</form>
input에 name을 붙여야 데이터를 받았을 때 구분지을 수 있음
요청이 오면 doGet()의 매개변수 HttpServletRequest에 데이터를 준다.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(CLASSNAME+" : doGet() 호출");
String ip=request.getRemoteAddr();
System.out.println('['+ip+']');
}
String userid=request.getParameter("userid");
String password=request.getParameter("password");
getParameterValues() : String[] 배열로 값을 가져온다
http://localhost:8080/경로?userid=test&password=1234
글자 깨짐을 막기 위해 응답데이터 인코딩 설정하기 response.setCharacterEncoding("UTF-8");
PrintWriter 클래스 : HTML 페이지를 생성해주는 클래스. 요청에 대한 응답을 쓰는 페이지
PrintWriter out=response.getWriter();
out.append("<!DOCTYPE HTML>")
.append("<html>")
.append("<head><meta charset='utf-8'></head>")
.append("<body>")
.append("<h1 style='color:red;'>로그인 결과 페이지</h1>")
.append("아이디 : "+userid+"<br>")
.append("비밀번호 : "+password+"<br>")
.append("</body>")
.append("</html>");
html은 데이터를 읽어오는 동적 기능이 없기때문에 jsp로 데이터를 받아와야함.
JSP는 html 태그가 있고 특정부분에서 자바코드를 사용할 수 있게 함. 자바와 통신할 수 있는 웹페이지를 만들 수 있다.
html에서 데이터를 입력하고 java에서 데이터를 처리하고 결과를 jsp가 받아서 출력한다.
원래는 페이지가 이동하면 URL이 변경되게 됨.
그러나 forward 방식에서 페이지를 이동할때는 페이지가 덮어씌워지는것이기 때문에 URL이 변경되지않고 이동.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println(CLASSNAME+" : doGet() 호출");
String name=request.getParameter("name");
int age=Integer.parseInt(request.getParameter("age"));
String email=request.getParameter("email");
System.out.println("이름 : "+name +", 나이 : "+age +", 이메일 : " +email);
//생성된 페이지에 데이터를 보내는 방식
//info.html->ForwardTestServlet.java(forward)->result.jsp
ServletContext context=getServletContext();
//보낼 위치(jsp 파일)를 설정함
RequestDispatcher dispatcher=context.getRequestDispatcher("/result.jsp");
//request에 있는 데이터(모든 정보)를 jsp에 전달함
dispatcher.forward(request, response);
}
RequestDispatcher 인터페이스의 forward(request, response) 메소드를 사용한다.
jsp에 request객체를 전달하고 jsp는 전달받은 request에서 parameter을 꺼내서 사용한다.
<%!
String name, age, email;
%>
<%
name=request.getParameter("name");
age=request.getParameter("age");
email=request.getParameter("email");
%>
<h1>결과 페이지</h1>
<p>제 이름은 <%=name %>입니다.</p>
<p>제 나이는 <%=age %>입니다.</p>
<p>제 이메일은 <%=email %>입니다.</p>
request는 forward에서 넘겨받은 request 객체
html에서 입력한 데이터를 서블릿이 변형없이 그대 로 jsp로 옮겨주는 방식이다.
데이터를 서블릿에서 가공하고 jsp로 전달하는 방식
데이터를 key-value 형식으로 전송하는 방식이다
문자열뿐만아니라 다양한 변수 및 객체를 전송할수있다
servlet단
request.setAttribute("name", "고길동");
request.setAttribute("lived", "서울 도봉구");
request.setAttribute("age", 40);
request.setAttribute("vo", new InfoVO());
ServletContext context=getServletContext();
RequestDispatcher dispathcer=context.getRequestDispatcher("/my_info.jsp");
dispathcer.forward(request, response);
jsp단
<%!
String name, lived;
int age;
InfoVO vo;
%>
<%
name=(String)request.getAttribute("name");
lived=(String)request.getAttribute("lived");
age=(int)request.getAttribute("age");
vo=(InfoVO) request.getAttribute("vo");
%>
<p>이름 : <%=name %></p>
<p>사는곳 : <%=lived %></p>
<p>나이 : <%=age %></p>
<p><%=vo.toString() %></p>
<% %>
이 jsp에서 자바공간은 Servlet 속 doGet() 공간과 동일하다고 볼 수 있음. 그래서 doGet()의 매개변수를 사용할 수 있다.
각 데이터들은 Object타입으로 전달되기 때문에 형변환을 해줘야합니다.
attribute()와 parameter()의 차이점
- parameter은 html form 태그를 통해서만 데이터를 전송받는다.
form 외에는 데이터 추가 불가능, String 형태의 값만 전송한다- attribute는 client/server 에서 생성하여 전송가능하다.
문자열부터 다양한 변수 및 객체를 전송한다
redirect를 이용해 데이터를 전송할 수 있긴하다. (get 방식만 가능함).
String name=request.getParameter("name");
String age=request.getParameter("age");
String email=request.getParameter("email");
String path=request.getContextPath();
String pageName="/result.jsp";
String location =
path+pageName+"?name="+name+"&age="+age+"&email="+email;
System.out.println(location);
response.sendRedirect(location);
get방식을 사용해서 url로 데이터를 전송한다. 입력된 사용자 정보가 url에 노출됨. url에 parameter의 key-value가 그대로 드러나서 좋은방식이 아니다!
response.sendRedirect("https://www.google.com");
외부서버의 링크로 페이지 이동도 가능하다. (forward는 같은서버만 가능해서 불가능함)
forward 방식은 클라이언트(html/jsp..)가 다른 서버로 데이터를 보낼때 request를 그대로 보낸다.
클라이언트 A, 서버 a , 클라이언트 B 가 있을 때
A의 form에서 데이터를 입력해서 a로 전송하면 request의 파라미터로 전송되고 request를 그대로 B에 전달한다. 이때 B는 a에 귀속되어 있어서 페이지가 이동해도 url이 안보인다.
요청이 계속 유지되는 것이 forward방식이다.
redirect 방식은 똑같이 A가 form으로 데이터를 보내 똑같은 request가 요청되는데 a에서 B로 보내는 request와 A가 a로 보내는 request는 서로 다르다. request를 그대로 전달하는게 아니라 a에서 요청이 끝나고 다시 a에서 새로운 요청이 B로 전달되는 것이다. 페이지 이동 목적으로 redirect를 사용한다.
ex) 외부사이트로 이동할 때 사용한다.
JSP 파일 생성 시 utf-8 자동으로 설정하기
window->preferences->Web->jsp files->encoding을 UTF-8로 바꿔주세요.