본문 바로가기

개발/JAVA

[Servlet] #07. ★html -> 서블릿, 서블릿->서블릿, 서블릿->JSP 링크 옮기기

 

● 링크 전송의 총 집합!

HTML -> 서블릿(Servlet)
서블릿(Servlet) -> 서블릿(Servlet)
서블릿(Servlet) -> JSP
데이터를 옮겨보자

 

 

■ index.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
</head>
<body>
 
 <form id="frm" method="post">
 
 <table>
 <tr>
         <td> 이름 </td>
         <td>
             <input type="text" id="_name" name="name" size="20" placeholder="이름">
         </td>
 </tr>
 <tr>
         <td> 나이 </td>
         <td>
             <input type="text" id="_age" name="age" size="5" placeholder="나이">
         </td>
 </tr>
 </table>
 
<button type="button" id="btn"> 전송 </button>
 
 </form>
 
 <!-- 
         [[ Sample07 로직 ]]
         
         index.html -- >> HelloServlet 으로 보내준다. -- >> SampleServlet -- >> detail.jsp
         name으로 보냄 > Object로 묶는다                 > 데이터를 다시 오픈
                                  setattribute                                getattribute    
         action 없으므로 JQuery
  -->
 
 <script type="text/javascript">
 $(document).ready(function () {
    
     $("#btn").click(function () {
        // alert('click');
            if( $("#_name").val() == '' ){
                alert('이름을 입력해주세요');
                $("#_name").focus();
            }
            else if( $("#_age").val() == ''){
                alert('나이를 입력해주세요');
                $("#_age").focus();
            }
            else{                        // 다 입력했다면
                $("#frm").attr("action""hello").submit();                
            }
         
    });
});
 
 </script>
 
</body>
</html>
cs


■ HelloServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package sample07;
 
import java.io.IOException;
import java.net.URLEncoder;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import dto.HumanDto;
 
public class HelloServlet extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        super.doGet(req, resp);
    }
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //        System.out.println("HelloServlet doPost");
        
        req.setCharacterEncoding("utf-8");
        
        String name = req.getParameter("name");
        int age = Integer.parseInt( req.getParameter("age") );         // 무조건 String으로 넘어오니까 parseInt
        
        System.out.println("name:" + name);
        // 이름이 깨지는 이유 : 인코딩 방식이 문제가 있음. setCharacterEncoding으로 셋팅
        System.out.println("age:" + age);
        
 
        /*
         * // SampleServlet 에서 name 오류 :: 인코딩으로 name을 한 단계 거쳐주는 과정
         String ename = URLEncoder.encode(name); // 한글일 경우만! 그러나, 잘 안 쓴다. 
         * Object로 보내주는 set, get Attribute일 때에는 어떻게? -> Dto 만들어준다! 
        
        // @WebServlet("/sample")과 연결
        resp.sendRedirect("sample?name=" + ename + "&age=" + age); 
        */
 
 
}
 
cs

▶ 문자가 깨져서 나올 때 : 인코딩 방식이 문제가 있을 경우. setCharacterEncoding으로 셋팅해준다.

req.setCharacterEncoding("utf-8");

하지만, 이렇게 해도 제대로 나오지 않는다. 이런 경우, HelloServlet(post)->SampleServlet(get) 으로 전송 방식이 달라졌기 때문이다.

Get->Get일 경우 오류가 나지 않았거나, 혹은 상기의 처리만으로도 해결은 된다.

 

▶ 그렇다면 이럴 때 오류는 어떻게 해결할지에 대한 해답은 다음과 같다.

System.out.println("name:" + name);
// 이름이 깨지는 이유 : 인코딩 방식이 문제가 있음. setCharacterEncoding으로 셋팅
System.out.println("age:" + age);
		
// SampleServlet 에서 name 오류 :: 인코딩으로 name을 한 단계 거쳐주는 과정
String ename = URLEncoder.encode(name); // 한글일 경우만! 그러나, 잘 안 쓴다. 

    
// @WebServlet("/sample")과 연결
resp.sendRedirect("sample?name=" + ename + "&age=" + age); 

req.setCharacterEncoding("utf-8"); 셋팅에 

URLEncoder.encode(name); 를 추가로 기입해준다. 단, 한글일 경우만 가능하다.

하지만 잘 안 쓴다고 한다 ㅎㅅㅎ;;;;ㅋ


 

▶ 그렇다면, 이런 상황에서 Object로 보내주는 set, get Attribute일 때에는 어떻게할까?

-> Dto를 만들어준다! 

■ dto.HumanDto.java

package dto;

import java.io.Serializable;

public class HumanDto implements Serializable {
	
	private String name;
	private int age;
	
	private void HumanDto() {
		// TODO Auto-generated method stub
	}

	public HumanDto(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "HumanDao [name=" + name + ", age=" + age + "]";
	}
	
	

}

 

다시 HelloServlet.java 코드를 이어가보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
        
        
        // Dto 생성 후 
        
        HumanDto dto = new HumanDto(name, age);
        req.setAttribute("hman", dto);
    //    forward("detail.jsp", req, resp);
        
        /*
         * RequestDispatcher dispatcher = req.getRequestDispatcher("sample");
         * dispatcher.forward(req, resp);        // post -> post로 가야 전진이다
         * // Post로 왔을지라도 sendRedirect는 Get으로 간다
         */
        // 이 부분이 너무 길기 때문에 forward 함수를 만들어준다
 
        this.forward("sample", req, resp);
        
    }
    
    public void forward(String linkname, HttpServletRequest req, HttpServletResponse resp) {
        RequestDispatcher dispatcher = req.getRequestDispatcher(linkname);
        try {
            dispatcher.forward(req, resp);
        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
 
    
cs

▶ Dto를 HelloServlet 내에 생성해주고, dto를 "hman"으로 데이터를 받아온다. forward를 통해 detail.jsp로 직진!

▶ dispatcher 변수 생성 문장이 너무 기니까, forward 함수를 생성하여 소환해주는 방법을 택했다.


■ SampleServlet.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package sample07;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import dto.HumanDto;
 
@WebServlet("/sample")
public class SampleServlet extends HttpServlet {
 
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
        req.setCharacterEncoding("utf-8");
        // 이렇게 해도 제대로 나오지 않는다. 
// HelloServlet(post)->SampleServlet(get)으로 갈 경우 인코딩 방식이 맞지 않는다.
        // get -> get 일때는 이 처리로 충분함
        
        System.out.println("SampleServlet doGet");
        
        String name = req.getParameter("name");
        int age = Integer.parseInt( req.getParameter("age"));
            
        System.out.println("name:" + name);    
        System.out.println("age:" + age);
    }
 
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("SampleServlet doPost");
        
        // 데이터 꺼낸다
        HumanDto dto = (HumanDto)req.getAttribute("hman");
        
        System.out.println(dto.toString());
        
        // 최종적으로 Detail 화면에 넘겨준다 -> jsp파일
        // 그리고 다시 짐 싸! => detail로
        req.setAttribute("dto", dto);        
        forward("detail.jsp", req, resp);
                
    }
    
    public void forward(String linkname, HttpServletRequest req, HttpServletResponse resp) {
        RequestDispatcher dispatcher = req.getRequestDispatcher(linkname);
        try {
            dispatcher.forward(req, resp);
        } catch (ServletException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    
}
 
cs

 


■ detail.jsp

<%@page import="dto.HumanDto" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%
		/* 짐을 풀고, 데이터 받는다  */
		HumanDto dto = (HumanDto)request.getAttribute("dto");

%>
    
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>detail</title>
</head>
<body>

<h1> detail.jsp </h1>

<%
	out.println("<b>" + dto.toString() + "</b>");
%>


</body>
</html>

 


결과