서블릿 기초



서블릿 확인

이클립스에서 만든 jsp 파일을 확인해보면 실은 자바 서블릿으로 만들어진 것을 확인할 수 있다.


확인 주소 : 

C:\workspaces\jsp\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\chap03\org\apache\jsp


예를 들어 form.jsp를 만들면 form_jsp.class와 form_java.java가 자동으로 생성되며, form_java.java 파일을 읽어보면 서블릿 구조의 자바 파일인 것이 확인 가능하다.


이제부터 서블릿을 직접 만들어보도록 한다.




1. 서블릿 파일 생성 (java)


1) 이클립스에서 Dynamic Web Project 생성시 web.xml를 첨부하여 생성한다.

(프로젝트명 작성 후 Next로 넘겨 Generate web.xml deployment descriptor에 체크를 하면 된다.)


2) 해당 프로젝트에서 New-Servlet 선택. 패키지 명과 클래스 네임을 정해준 뒤 다음으로 넘어간다.





3) 내용 확인




4) 내용 확인 후 Finish하면 서블릿 파일이 생성된다.





5) 이클립스에 생성한 서블릿 파일이 뜬다.



만든 서블릿 클래스명 이하에 get 방식일 때와 post 방식에 따른 각각의 메서드가 자동 생성된다.

@WebServlet("/LoginAction")

public class LoginAction extends HttpServlet {

private static final long serialVersionUID = 1L;

       

    /**

     * @see HttpServlet#HttpServlet()

     */

    public LoginAction() {

        super();

        // TODO Auto-generated constructor stub

    }


/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

response.getWriter().append("Served at: ").append(request.getContextPath());

System.out.println("doGet 메서드 호출");

}


/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

}

}




2 jsp 파일 생성

form의 action에 위에서 생성한 서블릿 클래스명을 써준다.


<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>로그인 폼</title>

</head>

<body>

<h1>로그인</h1>

<form action="LoginAction" method="post"> // jsp 파일 대신 서블릿으로 한 자바 파일로 넘어가게 할 수도 있다.

아이디 : <input type="text" size="20" name="id" /><br />

비밀번호 : <input type="password" size="20" name="pw"/><br />

<input type="submit" value="로그인" />

</form>

</body>

</html>


------------------------------------------------------------------------------------------------------------


3. 서블릿 파일 수정

자동 생성된 서블릿 파일에서 doGet이나 doPost 메소드 중 하나에

다음과 같은 형식으로 action이 넘어가서 나타날 화면을 구성한다.



import java.io.IOException;     // PrintWriter 클래스를 쓰기 위한 import

import java.io.PrintWriter;


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

// TODO Auto-generated method stub

request.setCharacterEncoding("UTF-8");     // 한글 깨지지 않게 하기 위해 추가

String id = request.getParameter("id");

String pw = request.getParameter("pw");

response.setContentType("text/html; charset=UTF-8");

PrintWriter out = response.getWriter();     // getWriter는 스크림을 연결한 객체를 반환

out.println("<!DOCTYPE html>");

out.println("<html>");

out.println("<head>");

out.println("<meta charset='UTF-8'>");

out.println("<title>로그인 폼</title>");

out.println("</head>");

out.println("<body>");

out.println("<h1>로그인</h1>");

out.println("<form action='LoginAction'>");

out.println("아이디 : " + id + "<br />");

out.println("비밀번호 : " + pw + "<br />");

out.println("</form>");

out.println("</body>");

out.println("</html>");

}


doGet에 있는

response.getWriter().append("Served at: ").append(request.getContextPath());


doPost에 있는 

doGet(request, response);

는 삭제한다.

------------------------------------------------------------------------------------------------------------


4. 결과 확인

jsp를 실행 후 버튼을 눌러 값을 넘겨보면 입력한 값이 이상 없이 넘어가는 것을 확인할 수 있다.


로그인

아이디 : hong
비밀번호 : 1234



------------------------------------------------------------------------------------------------------------


5. web.xml 

서블릿에서 @WebServlet("/LoginAction") 부분은 애노테이션이라고 하여 서블릿 3.0 / 톰캣 7.0부터 생긴 서블릿 자동 등록 기술이다. 하지만 그 이전에는 web.xml에서 설정 내용을 읽어와서 처리했다. 


서블릿에서 @WebServlet("/LoginAction") 을 주석처리 한 뒤 다시 한번 jsp를 실행시키면 넘어가지 않는다.

이를 대신하기 위해 옛날 방식으로 web.xml을 편집해주면 된다.


위치는 WebContent > WEB-INF > lib > web.xml


<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">

  <display-name>chap17Servlet</display-name>

  <welcome-file-list>

    <welcome-file>index.html</welcome-file>

    <welcome-file>index.htm</welcome-file>

    <welcome-file>index.jsp</welcome-file>

    <welcome-file>default.html</welcome-file>

    <welcome-file>default.htm</welcome-file>

    <welcome-file>default.jsp</welcome-file>

  </welcome-file-list>

    

  <servlet>

  <servlet-name>test</servlet-name>

  <servlet-class>com.model.LoginAction</servlet-class> 

  <!--- 서블릿 클래스명 앞에 패키지명까지 붙일 것 -->  

  </servlet>

  

  <servlet-mapping>

  <servlet-name>test</servlet-name>

  <url-pattern>/LoginAction</url-pattern>

  </servlet-mapping>

  

</web-app>


위와같이 web.xml 파일에 서블릿 관련 부분을 추가해주면 @WebServlet("/LoginAction")이 있었을 때와 마찬가지로 jsp의 폼에 입력한 값이 정상적으로 넘어가게 된다.












Posted by netyhobby
,