"내가 연락처 알려줄테니까 얘한테 다시 물어봐"
- 명령 : response.sendRedirect("이동할URL");
- 이동할 URL은 전체 URL 주소를 기술한다.
"내가 물어봐서 알려줄게"
- 명령 :
1. request.setAttribute("키 값", 데이터);
- request.setAttribute("키 값");
- 데이터를 읽을 때 :
request
객체의setAttribute()
메서드로 데이터를 세팅하여 보낸다.- 데이터를 받을 때 :
request
객체의getAttribute()
메서드로 데이터를 읽어온다.
글쓰기나 회원가입과 같은 데이터가 변경되는 경우
forward를 사용하면 요청이 중복으로 발생할 수 있기 때문에 주의해야한다. (request, response 데이터가 계속 남아있기 때문)
이름과 나이를 Client로부터 전달받아 Redirect로 웹 페이지에 출력하기
기본적으로, Servlet1
과 Servlet2
가 있다고 가정하면 Redirect는 Servlet1
을 통과한 후 파라미터를 소멸시키기 때문에 Servlet1
에서 데이터를 받아서 Servlet2
로 다시 넘겨주는 작업을 해야한다.
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
파라미터를 전달하는 Redirect 처리하기
prac02A -> Prac02B
-->
<a href="/01_Servlet/Prac02A?name=오리&age=24">링크</a>
</body>
</html>
Servlet1
@WebServlet("/Prac02A")
public class Prac02A extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String strAge = request.getParameter("age");
int age = 0;
if(strAge != null) {
age = Integer.parseInt(strAge);
}
// 응답
response.setContentType("text/html; charset=UTF-8");
// 요청으로 받은 정보를 다시 Prac02B으로 보냄
response.sendRedirect("/01_Servlet/Prac02B?name=" + URLEncoder.encode(name) + "&age=" + age);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Servlet2
@WebServlet("/Prac02B")
public class Prac02B extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String age = request.getParameter("age");
// 응답
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<h1>이름 : " + name + " 나이 : " + age + "살</h1>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
결과
를 누르면
편지를 받아서 파일로 만들어내면서 출력하기
Servlet1
에서 편지를 받고, Servlet2
에서는 파일을 생성했다는 alert창을 띄우자.
HTML
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!--
편지 쓰기
1. 파일명 : YYYY-MM-DD-작성자.txt
2. 파일내용
To. 찰리푸스
사랑해요 찰리푸스
아이러브유 찰리푸스
From. 오리
Prac03A : 파일생성
PRac03B : 경고창(YYYY-MM-DD-작성자.txt 파일이 생성되었습니다.)
-->
<form method="POST" action="/01_Servlet/Prac03A">
<div>
<input type="text" name="from" placeholder="보내는사람">
</div>
<div>
<input type="text" name="to" placeholder="받는사람">
</div>
<div>
<textarea rows="5" cols="40" name="content"></textarea>
</div>
<div>
<button>편지쓰기</button>
</div>
</form>
</body>
</html>
Servlet1
@WebServlet("/Prac03A")
public class Prac03A extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청
request.setCharacterEncoding("UTF-8");
String from = request.getParameter("from");
String to = request.getParameter("to");
String content = request.getParameter("content");
// 파일명 (날짜-작성자.txt)
String filename = new Date(System.currentTimeMillis()) + "-" + from + ".txt";
// 디렉터리생성 servletContext(이 프로그램의). realPath(진짜경로)
// C:\GDJ\jspstudy\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\01_Servlet\storage\2022-10-07-히랭쓰.txt
File dir = new File(request.getServletContext().getRealPath("storage"), filename);
if(dir.exists() == false) {
dir.mkdirs();
}
// 파일 객체
File file = new File(dir, filename);
// Writer 객체
BufferedWriter bw = new BufferedWriter(new FileWriter(file));
bw.write("To." + to + "\n");
bw.write(content + "\n");
bw.write("From. " + from);
bw.close();
// 이동(Redirect, Forward 둘다 상관없으나 신규생성하는걸 전달하므로 Redirect로 해보겠따)
response.sendRedirect("/01_Servlet/Prac03B?filename=" + URLEncoder.encode(filename));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Servlet2
@WebServlet("/Prac03B")
public class Prac03B extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 요청
request.setCharacterEncoding("UTF-8");
String filename = request.getParameter("filename");
// 응답
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<script>");
out.println("alert('" + filename + " 파일이 생성되었습니다.')");
out.println("history.back()"); // 실행 후에 원래창으로 돌아오라는 뜻
out.println("</script>");
out.close();
}
// 생성된 파일은 서버가
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
결과
를 작성하면
라고 메세지가 뜨고,
이렇게 파일이 생성됐다.