이클립스 실습 : Form을 통한 실습
HTML 파일을 만들어 form태그로 소스를 작성 한 후
서블릿과 연동하여 작동 원리를 확인해보는 과정을 단계별로 해보자
1) 서블릿 소스파일 만들기
- 서버세팅과 이클립스 프로젝트 세팅을 마친다
관련 포스팅 : 61번 포스팅 - 서블릿 생성하기
- 이클립스 패키지 오른클릭 new > Servlet
- 서블릿이 저장되는 패키는 보통 controller (src/main/java/com/rh/controller)
- 클래스명은 대문자로 짓는다. - 매핑값 입력하기
- Next를 눌러 URL mappings에 연결시킬 매핑값을 입력한다 ( /test1.do )
- 생성된 소스파일에서 @WebServlet 어노테이션이 ("/test1.do") 으로 자동 설정됨
- url/contextPath/매핑값 으로 요청 시 해당 서블릿이 구동된다.
- 매핑값은 서블릿간에 중복되어서는 안된다.
- form의 action에 들어가는 값이다.
package com.rh.controller;
import javax.servlet.ServletException;
...
@WebServlet("/test1.do")
public class Test1Servlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// doGet 메소드 : GET 요청을 처리
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 요청 처리 로직을 여기에 작성합니다.
response.getWriter().write("Hello from Test1Servlet - GET method!");
}
// doPost 메소드 : POST 요청을 처리
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 요청 처리 로직을 여기에 작성합니다.
response.getWriter().write("Hello from Test1Servlet - POST method!");
}
}
2) form 태그 작성하기
- form 태그 작성
- form내의 제출버튼 클릭시 action 속성의 값의 url로 요청되면서 사용자가 입력한 값들이 넘어간다.
- method 속성은 "get"으로 설정한다. - 경로값 입력 주의사항
- 상대경로로 입력 시 현재 url의 마지막 '/'뒤에 경로값이 붙는다.
>> 원치 않는 경로로 매핑되는 원인
- '/'로 시작하는 절대경로로 입력해야 기본경로 뒤에 매핑값이 붙는다
* 기본경로는 포트번호까지 포함임
** 매핑값에는 ContextRoot까지 포함된다
*** 예: 기본경로 http://localhost:8888, action="/Servlet/test.do"일 시
http://localhost:8888/Servlet/test.do로 연결됨
<form action="/01_Servlet/test1.do" method="post">
<label for="name">이름:</label>
<input type="text" id="name" name="name" required>
<label for="age">나이:</label>
<input type="number" id="age" name="age" required>
<input type="submit" value="제출">
</form>
4) 서블릿 처리 과정 : doGet, doPost
- GET방식으로 요청 시 doGet 메소드가 호출된다.
이때 컨테이너에서 HttpServletRequest( 변수명 request )와 HttpServletResponse( 변수명 response )객체를 전달한다 - 요청데이터 뽑기 : request
- getParameter로 사용자 입력 데이터들을 뽑는다
** 사용자가 입력하지 않으면 빈문자열 또는 null이 오는데 이를 parsing 할때 예외가 발생하므로 주의한다.
- 요청처리(=> Service => Dao => sql문 실행) 후 응답 데이터가 있을경우 Attribute에 담는다 - 응답데이터 보내기 : response
- 응답 형태와 문자셋을 지정한다 > setContentType("text/html; charset=UTF-8")
- 응답하고자하는 사용자와의 스트림을 생성한다 > PrintWriter out = response.getWriter();
- println/print/printf 메소드로 응답 html 구문을 한줄씩 보낸다.
** 해당 방식은 코드가 복잡해서 JSP 방식이 등장하였다
관련포스팅 : 99번 포스팅 외 - doPost 메소드가 호출된경우
- 자동으로 doGet() 메소드가 호출되도록 작성되어있으므로 doGet에서 비즈니스로직을 처리한다.
- 단, 한글이 포함된 경우 문자셋을 변경해주어야한다.
setCharacterEncoding("UTF-8");
//이름, 나이, 성별, 좋아하는 음식들 정보를 넘겨받은 서블릿의 doGet메소드 처리
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String gender = request.getParameter("gender");
//체크박스와 같은 복수개의 밸류값들을 뽑고자 할때
String[] foods = request.getParameterValues("food");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("</head>");
out.println("<body>");
out.println("<h2>개인정보 응답화면</h2>");
out.printf("<span>%s</span>님은 ", name);
out.printf("<span>%d</span>살이며, ", age);
out.print("성별은 ");
if(gender == null ) {
out.println("선택을 안했습니다. <br>");
}else {
if(gender.equals("M")) {
out.println("<span id='gender'>남자</span>입니다 <br>");
}else {
out.println("<span id='gender'>여자</span>입니다 <br>");
}
}
out.print("좋아하는 음식은 ");
if(foods==null) {
out.println("없습니다. ");
}else { // 배열
out.println("<ul>");
for(int i=0; i<foods.length; i++) {
out.println("<li>"+foods[i]+"</li>");
}
out.println("</ul>");
}
out.println("</body>");
out.println("</html>");
}
'다양한 기술들 > Web 관련' 카테고리의 다른 글
| [JSP] 간단한 실습 (0) | 2023.01.10 |
|---|---|
| [JSP] HTML 위에서 작성하는 Java / 기본 문법 (0) | 2023.01.10 |
| [서블릿] 동적 웹 만들기 개념 / 주요 인터페이스 (0) | 2023.01.03 |
| [서버] 실습 : 아파치 톰캣 / 이클립스 세팅 (0) | 2022.12.29 |
| [서버] 이론 : 웹서버와 WAS (0) | 2022.12.29 |
댓글