● 링크 전송의 총 집합!
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>
결과
'개발 > JAVA' 카테고리의 다른 글
[JAVA&JSP] #02. MVC model 1과 model 2 같은 코드로 비교(CustUser) (0) | 2020.07.23 |
---|---|
[JAVA&JSP] #01. MVC 구조 :: MODEL 1 & MODEL 2 (0) | 2020.07.22 |
[Servlet] #06. Cookie(쿠키) :: id, pwd, 방문횟수 (0) | 2020.07.21 |
[Servlet] #05. Form 태그 사용 유무에 따른 링크 전송 방법 / sendRedirect & forward :: Review (0) | 2020.07.21 |
[Servlet] #04. 예제 :: Error 페이지 전송하기 resp.sendError(); (0) | 2020.07.21 |