JSP Servlet 기초 (2)
<form> 태그를 이용해 데이터를 입력하고 그 데이터를 java로 가져와보자
▷ form.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>
<form action="Form" method="post">
<!-- 이름 입력 -->
이름 : <input type="text" name="name" size="10" /><br />
<!-- 아이디 입력 -->
아이디 : <input type="text" name="id" size="10" /><br />
<!-- 비밀번호 입력 -->
비밀번호 : <input type="password" name="pw" size="10" /><br />
<!-- 취미 입력 -->
취미 :
<input type="checkbox" name="hobby" value="read" />독서
<input type="checkbox" name="hobby" value="cook" />요리
<input type="checkbox" name="hobby" value="run" />조깅
<input type="checkbox" name="hobby" value="swim" />수영
<input type="checkbox" name="hobby" value="sleep" />취침<br />
<!-- 전공 입력 -->
전공 :
<input type="radio" name="major" value="kor" />국어
<input type="radio" name="major" value="eng" />영어
<input type="radio" name="major" value="math" />수학
<input type="radio" name="major" value="des" />디자인
<!-- 서버로 전송 -->
<input type="submit" value="전송" />
</form>
</body>
</html>
<input>
- name : 각각의 input 태그의 이름 지정
- type="checkbox" : 체크박스 생성 ( 여러 개 선택 가능 )
- value : 체크박스 클릭 시 입력되는 데이터
- type="radio" : 라디오 버튼 생성 ( 하나만 선택 가능 )
▷ Form 서블릿 파일 생성
form.jsp에서 <form action="Form" method="post">
: choongang.web.jsp.ch2 패키지에 Form이름의 서블릿 파일 생성 → 생성시킬 method stub에서 doPost( ) 메서드만 선택
- actionDo( ) 메서드를 따로 작성하여, doPost( ) 메서드에서 actionDo( ) 메서드를 호출시키자.
- 클라이언트가 post로 정보를 요청했을 경우, 처리 구현하는 순서에 대해 알아보자
▶ post 요청 시 처리 구현하는 순서
① 데이터 호환을 위한 문자코드체계 설정 : 보통 UTF-8로 설정
request.setCharacterEncoding("UTF-8");
② 요청 브라우저의 요청값 분리 → 이 데이터를 바탕으로 비즈니스 로직 전개
request 객체 : 웹 브라우저의 요청 정보를 저장 → request의 getParameter( ) 메서드를 이용해 요청정보를 가져오자.
String name = request.getParameter("name");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
hobby의 경우, checkbox이니가 파라미터 변수 hobby에 저장된 모든 변수값을 얻어내는 배열로 처리해야 함
→ request의 getParameterValues( ) 메서드 이용해 String [ ] 배열로 얻자
String[] hobby = request.getParameterValues("hobby");
String major = request.getParameter("major");
※ 보안상의 이유로 자바파일의 변수명과 Form의 요청값 변수명(= name으로 지정된 key값)은 다르게 하는 것을 권장함
③ 비즈니스 로직 실행
④ 처리된 결과를 이용하여 응답객체에 데이터를 보내거나 다른 객체에 필터 또는 파이프 처리(후처리)
→ 처리된 결과를 View로 보내자.
❶ 웹 브라우저의 요청의 결과로 보일 페이지의 contentType을 설정함
( jsp 스크립트 파일의 <%@ page contentType 태그와 같은 역할 )
response.setContentType("text/html; charset=UTF-8");
❷ 웹 브라우저에 응답으로 값을 출력할 수 있는 출력스트림 얻기
PrintWriter writer = response.getWriter( );
- 위 코드는 HttpServletResponse 인터페이스의 상위 인터페이스인 ServletResponse의 getWriter( ) 메서드를 호출하고 있음
- getWriter( ) 메서드의 선언문을 살펴보면, 리턴타입이 java.io의 PrintWriter 클래스임을 알 수 있음
PrintWriter javax.servlet.ServletResponse.getWriter() throws IOException
- PrintWriter 클래스는 문자 기반 출력 스트림인 Writer 클래스를 상속받은 클래스로, println(String x) 메서드를 통해 스트림에 텍스트를 기록해 출력시킬 수 있음
void java.io.PrintWriter.println(String x)
❸ 실제 코드문자열 출력 → HTML 형식의 코드 생성시켜 View 페이지 만들자.
단순하게 HTML 코드를 작성한 후, 각각을 출력메서드로 감싸기
write.println("<HTML>");
❹ 다 마친 후, 출력스트림 종료 ( 자원 해제 )
writer.close();
▶ 전체 코드
package choongang.web.jsp.ch2;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class Form
*/
@WebServlet("/Form")
public class Form extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Form() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
actionDo(request, response);
}
protected void actionDo(HttpServletRequest request, HttpServletResponse response) throws IOException {
// ① 문자코드체계 설정 : 요청처리객체(=request 객체)의 문자코드체계를 UTF-8로 설정!
request.setCharacterEncoding("UTF-8");
// ② 요청값 가져오기
String name = request.getParameter("name");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String[] hobbys = request.getParameterValues("hobby");
String major = request.getParameter("major");
// ③ 비즈니스 로직
// ④-❶ 웹 브라우저의 요청의 결과로 보일 페이지의 contentType을 설정함
// ( 출력할 문자코드체계 설정 )
response.setContentType("text/html; charset=UTF-8");
// ④-❷ 웹 브라우저에 응답으로 값을 출력할 수 있는 출력스트림 얻기
PrintWriter writer = response.getWriter();
// ④-❸ 실제 코드문자열 출력
// 단순하게 HTML 코드 작성한 후, 각각을 출력메서드로 감싸자
writer.println("<html>");
writer.println("<head>");
writer.println("</head>");
writer.println("<body>");
writer.println("이름 : " + name + "<br/>");
writer.println("아이디 : " + id + "<br/>");
writer.println("비밀번호 : " + pw + "<br/>");
writer.println("취미 : " + Arrays.toString(hobbys) + "<br/>");
writer.println("전공 : " + major + "<br/>");
writer.println("</body>");
writer.println("</html>");
// ④-❹ 다 마친 후, 출력스트림 종료
writer.close();
}
}
▷ 서버에서 form.jsp를 요청해보자
* 위 코드에서 변수가 많다고 가정하고 VO 클래스인 User 클래스를 만든 후, 외부에서 생성자를 통해 변수를 초기화시켜보자.
▷ User 클래스
package choongang.web.jsp.ch2.domain;
// VO 클래스
public class User {
// 멤버변수
private String name;
private String id;
private String pw;
private String[] hobbys;
private String major;
// 생성자
public User(
String name,
String id,
String pw,
String[] hobbys,
String major) {
setAllMember(name, id, pw, hobbys, major);
}
// 속성함수 - Getter / Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getId() { return id; }
public void setId(String id) { this.id = id; }
public String getPw() { return pw; }
public void setPw(String pw) { this.pw = pw; }
public String[] getHobbys() { return hobbys; }
public void setHobbys(String[] hobbys) { this.hobbys = hobbys; }
public String getMajor() { return major; }
public void setMajor(String major) { this.major = major; }
// 기능 메서드 : setAllMember - 전체 변수의 초기값 설정
public void setAllMember(
String name,
String id,
String pw,
String[] hobbys,
String major) {
this.name = name;
this.id = id;
this.pw = pw;
this.hobbys = hobbys;
this.major = major;
}
}
▷ Form.java
protected void actionDo(HttpServletRequest request, HttpServletResponse response)
throws IOException {
// ① 문자코드체계 설정 : 요청처리객체(=request 객체)의 문자코드체계를 UTF-8로 설정!
request.setCharacterEncoding("UTF-8");
// ② 요청값 가져오기
String name = request.getParameter("name");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String[] hobbys = request.getParameterValues("hobby");
String major = request.getParameter("major");
// ③ 데이터 정제를 위한 비즈니스 로직 실행
User user = new User(name, id, pw, hobbys, major);
③ request 객체에서 가져온 요청값을 생성자의 매개변수로 한 후, user 객체 생성
* 처리된 결과를 View로 보내는 ④과정을 writeHtml( ) 메서드를 생성해 따로 분리시켜보자.
또한, 단순하게 HTML 코드를 작성해서 출력했던 부분(④-❸)을 자바의 텍스트 블럭을 사용해서 더 간단히 표현해보자.
public void writeHtml(
HttpServletResponse response,
String name,
String id,
String pw,
String[] hobbys,
String major
) throws IOException {
// ④-❶ 웹 브라우저의 요청의 결과로 보일 페이지의 contentType을 설정함
// ( 출력할 문자코드체계 설정 )
response.setContentType("text/html; charset=UTF-8");
// ④-❷ 웹 브라우저에 응답으로 값을 출력할 수 있는 출력스트림 얻기
PrintWriter writer = response.getWriter();
// ④-❸ 실제 코드문자열 출력했던 부분을 자바의 텍스트 블럭을 사용해 표현해보자.
String htmlMsg = """
<html>
<head>
</head>
<body>
이름 : %s <br />
아이디 : %s <br />
비밀번호 : %s <br />
취미 : %s <br />
전공 : %s <br />
</body>
</html>
""".formatted(name, id, pw, Arrays.toString(hobbys), major);
writer.println(htmlMsg);
// ④-❹ 다 마친 후, 출력스트림 종료
writer.close();
}
formatted( ) : 텍스트 블록 내 %s를 문자열로 반환시켜주는 메서드
텍스트 블록의 경우, 들여쓰기 기준 : 마지막 """
→ 브라우저에서 요청한 결과, 출력화면에서 HTML 코드의 들여쓰기가 제대로 되었음을 확인할 수 있음
( 하단 출력결과 이미지 참고 )
* writeHtml( ) 메서드의 매개변수로 user 객체를 이용해보자. ( 메서드 오버로딩 )
그 후, 브라우저에서 form.jsp를 요청해보자.
package choongang.web.jsp.ch2;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
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 choongang.web.jsp.ch2.domain.User;
/**
* Servlet implementation class Form
*/
@WebServlet("/Form2")
public class Form2 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public Form2() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
actionDo(request, response);
}
protected void actionDo(HttpServletRequest request, HttpServletResponse response) throws IOException {
// ① 문자코드체계 설정 : 요청처리객체(=request 객체)의 문자코드체계를 UTF-8로 설정!
request.setCharacterEncoding("UTF-8");
// ② 요청값 가져오기
String name = request.getParameter("name");
String id = request.getParameter("id");
String pw = request.getParameter("pw");
String[] hobbys = request.getParameterValues("hobby");
String major = request.getParameter("major");
// ③ 데이터 정제를 위한 비즈니스 로직 실행
User user = new User(name, id, pw, hobbys, major);
// ④ 처리된 결과를 View로 보내
writeHtml(response, user);
}
// 메서드 오버로딩
public void writeHtml(HttpServletResponse response, User user)
throws IOException {
writeHtml(response,
user.getName(),
user.getId(),
user.getPw(),
user.getHobbys(),
user.getMajor()
);
}
public void writeHtml(
HttpServletResponse response,
String name,
String id,
String pw,
String[] hobbys,
String major
) throws IOException {
// ④-❶ 웹 브라우저의 요청의 결과로 보일 페이지의 contentType을 설정함
// ( 출력할 문자코드체계 설정 )
response.setContentType("text/html; charset=UTF-8");
// ④-❷ 웹 브라우저에 응답으로 값을 출력할 수 있는 출력스트림 얻기
PrintWriter writer = response.getWriter();
// ④-❸ 실제 코드문자열 출력했던 부분을 자바의 텍스트 블럭을 사용해 표현해보자.
String htmlMsg = """
<html>
<head>
</head>
<body>
이름 : %s <br />
아이디 : %s <br />
비밀번호 : %s <br />
취미 : %s <br />
전공 : %s <br />
</body>
</html>
""".formatted(name, id, pw, Arrays.toString(hobbys), major);
writer.println(htmlMsg);
// ④-❹ 다 마친 후, 출력스트림 종료
writer.close();
}
}
브라우저에서 요청한 결과, 출력된 모습.
'백엔드 > JSP' 카테고리의 다른 글
JSP Servlet 기초 (3) : JSP 태그 (0) | 2023.06.11 |
---|---|
내장객체 request와 response (0) | 2023.06.11 |
JSP lifestyle (0) | 2023.06.10 |
JSP Servlet 기초(1) (0) | 2023.06.08 |
Tomcat 다운로드 및 서버 연동시키기 (0) | 2023.06.07 |