백엔드/JSP

JSP Servlet 기초 (2)

두개의 문 2023. 6. 9. 21:55
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