일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- SpringBoot 2
- 자바입력
- Easy
- heroku
- R
- scanner
- 사칙연산
- JAVA11
- 카데인 알고리즘
- 수학
- input
- 자바 thread 실행 순서 제어
- array
- hash table
- 자바 스레드 실행 순서 제어
- Kadane's Algorithm
- Today
- Total
DeFacto-Standard IT
Servlet - Dynamic Web Project, 로그인 구현, 배포(.war) 본문
Servlet - Dynamic Web Project, 로그인 구현, 배포(.war)
defacto standard 2017. 11. 16. 21:35
애플리케이션의 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 파일을 옮겨서 실행