Notice
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

DeFacto-Standard IT

Servlet - Dynamic Web Project, 로그인 구현, 배포(.war) 본문

SpringFramework/Examples

Servlet - Dynamic Web Project, 로그인 구현, 배포(.war)

defacto standard 2017. 11. 16. 21:35
1. Dynamic Web Project 생성, Next 클릭

 

 

애플리케이션의 Context root는 helloServlet 이다.

아래의 Generate web.xml deployment descriptor를 체크한다.

(애플리케이션의 설정을 할 수 있는 xml파일 - 서블릿의 매핑 정보 등)


 - Dynamic Web Project 의 구조
Java Resources - src : 서블릿의 자바 프로그램을 작성

   - Libraries : 라이브러리 집합

-Apache Tomcat v8.0 : Apache Tomcat에서 제공하는 라이브러리

-JRE System Library : JRE에서 제공하는 라이브러리

WebContent - WEB-INF - 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>helloServlet</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>
</web-app>

web.xml에서 <welcom-file-list> <welcom-file> 파일명 </></>은 클라이언트가 URL에 파일명을 명시하지 않아도 이 리스트에서 선택이 되어 파일명을 기본 화면으로 디스플레이. 클라이언트는 서버에 어떤 파일이 있는지 알 수 없다.

 

ex. 네이버 접속시 URL에 파일명을 명시하지 않아도 기본 화면으로 간다.

WebContent - New - HTML File - index.html 생성


*WebContent는 JSP, HTML, xml, 그림과 같은 각종 리소스 파일들이 들어간다


index.html :

<!DOCTYPE html>
<head>
<meta charset="EUC-KR">
<title>Insert title here</title>
</head>

 

DoLogin Form 작성한 index.html

 

<!DOCTYPE html>
<html>
<head>
<meta charset="EUC-KR">
<title> Servlet Example </title>
</head>
<body>
    <form action="DoLogin" method="POST">
        Username : <input type="text" name="username"> <br/>
        Password : <input type="password" name="password"> <br/>
        <input type="submit" value="Press" />
    </form>
</body>
</html>

- action 속성은 form태그에서 생성된 폼에서 submit을 했을 경우, 실행될 URL이 "DoLogin"이라는 것을 명시한다. URL에서는 기술된 서블릿이 실행되게 된다.

 - method 는 GET, POST 2가지 방식을 많이 쓰는데, 패스워드같은 경우는 보이면 안되기 때문에 GET보다는 POST를 쓰는 것이 적절하다.

 - POST 방식으로 보내게되면 httpRequest의 Body 부분에 문자값이 들어가게 된다.

 - input 태그는 사용자의 입력을 받는 부분이고, type속성이 'text'면 그냥 타이핑 친것이 다 보이고, 'password'면 비밀번호를 친것과 같이 ●모양으로 보인다.

 - name 속성은 파라미터의 이름이다.

 - input 태그의 type 속성이 submit 이면 버튼이 생성되고, value 속성은 버튼에 쓰여진 글자를 "Press"로 표시한다.

 - 실행 결과는 다음과 같다.

- URL에서 helloServlet는 ContextRoot라고 하고, 프로젝트 생성 시에 설정했던 사항이다. 그리고 web.xml파일에 welcom파일은 index.html이라고 기술되어있다.

즉,URL 주소창에 http://local~/helloServlet 과  http://local~/helloServlet/index.html  을치고 들어가면 동일한 결과를 얻을 수 있다.


아직 DoLogin 에 해당되는 서블릿을 만들지 않았기 때문에 Press를 누르면 다음과 같이 페이지가 없다는 오류인 HTTP Status 404를 띄움

이제 DoLogin URL에 매핑이 되는 서블릿을 작성해야한다.

 

Java Resources - src에 패키지를 만든다. 만들때 모든 파일을 동일한 패키지(default)로 하는 것보다 패키지를 나누어서 작성하는 것이 올바르다.패키지명은 servlets.


servlets 패키지 안에 DoLogin 서블릿을 만든다.

URL 매핑은  "/DoLogin" 으로 지정

 

 

오버라이드할 메서드를 선택한다. 서블릿은 HttpServlet을 상속받고, 여기에 doPost()가 있으므로 POST 방식을 쓰려면 doPost()를 오버라이드 해야한다.

 

index.html에서 DoLogin에 대한 폼의 메서드는 "POST"였기 떄문에 doPost() 만 있으면 되므로 doGet()은 체크를 해제하여 불필요한 코드를 없앤다.

 

생성된 DoLogin 서블릿 코드.

 

@WebServlet("/DoLogin")
public class DoLogin extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public DoLogin() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
    }
 
}

 - URL 매핑은 @WebServlet("/DoLogin") 에 나와있다. @WebServlet이라는 애노테이션을 사용하여 URL 매핑이 됨

 - index.html에서 사용자가 submit버튼을 누르면 결국 DoLogin 서블릿이 실행되고, 쓰레드가 실행이 된다. 쓰레드가 doPost 라는 메서드를 실행하게 된다.

 - doPost()의 인자인 HttpServletRequest의 객체와 HttpServletResponse의 객체는 사용자가 Request를 할 때마다(index.html의 submit 버튼을 누를때마다) 만들어져서 넘어온다.

 - DoLogin이라는 서블릿에 정의된 멤버나 static 멤버는 request올 때마다 생성되는 쓰레드에서 공유되기 때문에 조심하여야 하지만 request, response 객체는 요청이 올때마다 만들어져서 상관이 없다.

 

@WebServlet("/DoLogin")
public class DoLogin extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public DoLogin() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // read form data
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        
        // perform business logic
        // 출력 시 response.getWriter()를 사용헤서 PrintWriter 객체에 바인딩 후 HTML을 출력
        PrintWriter out = response.getWriter();
        
        // Build HTML code
        String htmlResponse = "";
        
        htmlResponse += "<h2> Your name is : " + username + "<br/>";
        htmlResponse += "Your password is : " + password + "<h2>";
        htmlResponse += "";
        
        // 실질적인 HTML 출력
        out.println(htmlResponse);
    }
} 

  - request.getParameter("username");

 index.html에서 사용자가 입력한 첫 번째 input의 name속성이 "username" 이었고, request의 body에 저장된다고 하였다. 이 username이라는 파라미터의 값을 가져오는 문장이다. 즉, input 의 name 속성의 값인 문자열과 request.getParameter()의 인자로 쓰이는 문자열은 동일하여야 한다. (password 또한 마찬가지)

 - 반대로 출력할 때는 response 객체를 사용하여야 한다.

 - htmlResponse라는 스트링 변수를 만들고, 이에 html 코드를 작성한다.

 - PrintWriter 객체에 pirntln(String) 메서드를 사용하여 HTML을 출력한다.

Press 버튼을 눌러 form을 submit을 POST 방식으로 요청을 하면 서블릿은 이를 받아 파라미터를 얻어 변수에 바인딩 한 후 다음과 같은 HTML 문서가 나온다.

 

이는 다른 html로 forwarding시킨 것이 아니라, 클라이언트에서 Request를 보낸 후 서블릿으로부터 돌아온 Response 객체에 담겨진 내용을 보여준 것이다.


위 과정을 배포(Deploy)하는 것을 실습 한다( WAR 파일 ). WAR 파일만 있으면 이클립스가 없는 시스템에서도 Tomcat을 통해 프로젝트를 실행시킬 수 있다.

이클립스에서 File - Export - Web - WAR file

 

 

Web Project : 배포할 프로젝트

Destination : 톰캣이 있는 경로의 webapps 폴더 ( C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps )

* 사진은 권한 문제때문에 다른 경로에 저장했다가 war 파일을 직접 수동으로 옮겨서 경로가 다르다.


이후 톰캣이 실행되면 war파일을 읽어서 서비스를 수행을 한다


1. Tomcat Stop

 

2. Tomcat 실행

Start 버튼을 누르면 C:\Program Files\Apache Software Foundation\Tomcat 8.0\webapps\ 에 있는 was 파일을 읽어서 폴더를 만들고 압축을 푼다.

 

톰캣 실행 시 war 파일을 읽어서 프로젝트와 같은 이름의 폴더를 만들고 압축을 해제한 모습


이클립스의 서버를 멈추고 톰캣만 실행시킨 상태이므로 웹 브라우저에서 정상 작동해야한다.

다음은 웹 브라우저에서 접속하여 제대로 작동되는 것을 확인한 그림이다.

 

 

*개발, 배포는 윈도우즈에서 , 실제 운영 시에는 리눅스서버에 Deploy 한 war 파일을 옮겨서 실행

Comments