: Servlet의 실행 mechanism
: Build Tool
: Maven - (Spring Legacy Project)
: Maven/Gradel - (Spring boot)
: Ant - x
Build는 우리가 작성한 source code를 실행할 수 있는 독립적인 형태로 변환하는 과정 + 결과물
① 프로젝트 생성
: 이 과정을 조금 더 효율적으로 처리하기 위해 Maven
② 라이브러리 생성
③ code 작성
④ compile 과정 : 기계가 인식할 수 있도록하는 과정
⑤ Test 과정
⑥ Packaging 과정
⑦ 배포
maven download
https://maven.apache.org/download.cgi
환경변수 설정
/Library/Java/apache-maven-3.9.0
vi ~/.zshrc : zsh 편집기 열기
I : insert mode
:wq : 저장하고 나오기
source ~/.zshrc: 적용 꼭 꼭
maven-test 폴더 생성 후
-> 터미널에
mvn archetype:generate -DgroupId=com.test -DartifactId=myProject -DarchetypeArtifactId=maven-archetype-quickstart
-> ~maven-test폴더에 myProject폴더 생성~
-> Maven으로 생성된 Java project 컴파일
mvn compile
4.pom.xml 수정
-> Maven으로 생성된 Java project 컴파일
mvn compile
-> 5.
mvn package
->
java -cp myProject-1.0-SNAPSHOT.jar com.test.App
이클립스에 import
이렇게 하면 됨..^^
1. 프로젝트 생성
configure-convert to maven project
2. pom.xml 설정
: <dependencies></dependencies>
추가
https://mvnrepository.com/search?q=tomcat9+servlet
https://mvnrepository.com/
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>MyWebProject</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- 여기에 필요한 라이브러리를 포함시켜야함 -->
<!-- Servlet에 대한 library를 포함시켜야 함
우리는 Tomcat9 버전 안에 있는 Servlet -->
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>9.0.71</version>
</dependency>
<!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
</project>
여기가 maven의 repository
servlet instance는
최초의 한번만 생성함
계속 생성하면 느려지고, 컴퓨터가 감당할 수 없어짐
package container;
import ThreadInvoker.ClientThread;
import arguments.HttpServletRequest;
import arguments.HttpServletResponse;
// Tomcat(WAS) 안에 Servlet Container역할을 하는 클래
public class ServletContainer {
// 일반 자바 프로그램이기 때문에 있는거고,
// 실제로 Servlet Container는 가지고 있지 않음
public static void main(String[] args) {
// 1. 사용자의 요청사항(request)을 분석
// 어떤 서블릿을 실행하는지 알아내기 => Add Servlet을 실행 !
// 2. Add라는 서블릿의 instance가 있는지 확인
// Container안에 객체가 있는지 확인
// 3. 객체가 없기 때문에 Add Servlet을 찾아서 객체를 생성함
AddServlet servlet = new AddServlet();
// 4. Servlet instance가 생성되면 바로 다음에 해당 서블릿의 init()를 호출함
// init : 서블릿의 초기화 담당
servlet.init();
// 5. 클라이언트가 보내준 request내용을 기반으로 객체를 하나 생성
// 당연히 이 객체에는 클라이언트가 보내준 데이터가 들어가 있어야함
HttpServletRequest request = new HttpServletRequest();
// 6. 클라이언트에게 최종 결과를 보내주기 위해 response객체를 하나 만들어야 함
HttpServletResponse response = new HttpServletResponse();
// 7. 클라이언트요청을 실제로 처리하기 위해 Thread가 있어야 함
// servlet, request, response 세개를 인자로 넘겨 줌
ClientThread thread = new ClientThread(servlet, request, response);
thread.start(); // thread 기동
}
}
package container;
import arguments.HttpServletRequest;
import arguments.HttpServletResponse;
// Servlet(서블릿)이라고 불리는 이 클래스는
// 원래 특정 클래스(HttpServlet)를 상속해서 만들어야 함
public class AddServlet {
public void init() {
// Servlet init 초기화를 담당
// 생성자에서 하지않고 여기서 함
}
public void service(AddServlet servlet, HttpServletRequest request, HttpServletResponse response) {
// 이 메소드는 이미 하는 일이 정해져 있음
// request 객체를 뒤져서, 클라이언트의 요청방식이 어떤 방식인지 알아낸다
// 만약 GET 방식이면 =>
// doGet(request, response);
// 만약 POST 방식이면
doPost(request, response);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) {
// 여기에서 request객체와 response객체를 이용해
// 입력처리, 로직처리, 출력처리를 진행 !
}
public void doPost(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
}
}
package ThreadInvoker;
import arguments.HttpServletRequest;
import arguments.HttpServletResponse;
import container.AddServlet;
public class ClientThread extends Thread {
private AddServlet servlet;
private HttpServletRequest request;
private HttpServletResponse response;
public ClientThread(AddServlet servlet,HttpServletRequest request,HttpServletResponse response) {
// TODO Auto-generated constructor stub
}
@Override
public void run() {
// TODO Auto-generated constructor stub
}
}
package arguments;
public class HttpServletRequest {
}
package arguments;
public class HttpServletResponse {
}
web project 생성
context root : 우리 project를 client가 web상에서 식별하기 위한 논리적인 이름
-> first
maven project로 바꾸기
pom.xml에 dependencies 추가
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>HelloWorld</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.tomcat/tomcat-servlet-api -->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-servlet-api</artifactId>
<version>9.0.71</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<version>3.2.3</version>
</plugin>
</plugins>
</build>
</project>
package controller;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.Charset;
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 HelloWorldServlet
*/
@WebServlet("/HelloWorldServlet")
public class HelloWorldServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public HelloWorldServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().append("Served at: ").append(request.getContextPath());
// GET방식이 호출되면, 결국 돌고 돌아서 이 method가 Thread에 의해 호출됨
// 1. 클라이언트가 보내준 데이터를 받음 => request객체 이용
// 2. 로직처리를 함 (DB처리 포함)
// 3. 출력처리를 함 => response객체를 이용
// 1. 처리된 결과를 보내주기 전에,
// 먼저 처리한 결과가 어떤데이터인지를 먼저 알려줘야함
response.setContentType("text/html; charset=UTF-9");
// 2. 실제 결과 데이터를 전송하면 됨
// 네트워크를 통해서 전송해야 하기때문에 stream을 열어서 데이터를 전송함 !
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>까꿍?ㅋ</body></html>");
out.close(); // stream을 닫아줌
}
/**
* @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);
}
}
GET방식으로 request를 보내야함
add 후 서버 기동
Parameter 전달(Data 전달)
client가 Servlet에게 Data를 전달하고 싶어요 !
web에서 URL뒤에 특정문자열(Query String)
을 이용해서 Data를 전달하는 방법
GET방식 : ? key=value&key=value&...
문제) 클라이어언트가 2개의 숫자를 보내요! 그 합의 결과를 알려주는 Servlet 작성
package controller;
import java.io.IOException;
import java.io.PrintWriter;
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 AddServlet
*/
@WebServlet("/sum")
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AddServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 이 서블릿을 호출하려면
// http://127.0.0.1:8080/first/sum?num1=10&num2=20
// 1. 입력처리
// Query String으로부터 데이터를 받으려면
// 입력받은 데이터는 무조건 문자열 ! 임을 기억해야함
String num1 = request.getParameter("num1"); // "10"
String num2 = request.getParameter("num2"); // "20"
// 2. 로직처리
int sum = Integer.parseInt(num1) + Integer.parseInt(num2);
// 3. 출력처리
response.setContentType("text/html; charset=UTF-8");
// "text/html; charset=UTF-8" -> 문자열이라는 뜻이다. html;-> 오류나면 다운로드 창이 뜬다.
// 실제 결과 데이터를 전송해야 하기 때문에 stream을 열어서 데이터 전송!
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>" + sum + "</body></html>");
out.close();
}
/**
* @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);
}
}
package controller;
import java.io.IOException;
import java.io.PrintWriter;
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 AddServlet
*/
@WebServlet("/sum")
public class AddServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public AddServlet() {
super();
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// // 이 서블릿을 호출하려면
// // http://127.0.0.1:8080/first/sum?num1=10&num2=20
//
// // 1. 입력처리
// // Query String으로부터 데이터를 받으려면
// // 입력받은 데이터는 무조건 문자열 ! 임을 기억해야함
// String num1 = request.getParameter("num1"); // "10"
// String num2 = request.getParameter("num2"); // "20"
//
// // 2. 로직처리
// int sum = Integer.parseInt(num1) + Integer.parseInt(num2);
//
// // 3. 출력처리
// response.setContentType("text/html; charset=UTF-8");
// // "text/html; charset=UTF-8" -> 문자열이라는 뜻이다. html;-> 오류나면 다운로드 창이 뜬다.
// // 실제 결과 데이터를 전송해야 하기 때문에 stream을 열어서 데이터 전송!
// PrintWriter out = response.getWriter();
// out.println("<html><head></head><body>" + sum + "</body></html>");
// out.close();
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1. 입력처리
// http://127.0.0.1:8080/first/sum
// Form으로부터 Post방식으로 데이터를 받으려면
// 입력받은 데이터는 무조건 문자열 ! 임을 기억해야함
String num1 = request.getParameter("myNum1"); // html과 servlet의 내용이 매칭이되야함 myNum1
String num2 = request.getParameter("myNum2"); // "20"
// 2. 로직처리
int sum = Integer.parseInt(num1) + Integer.parseInt(num2);
// 3. 출력처리
response.setContentType("text/html; charset=UTF-8");
// "text/html; charset=UTF-8" -> 문자열이라는 뜻이다. html;-> 오류나면 다운로드 창이 뜬다.
// 실제 결과 데이터를 전송해야 하기 때문에 stream을 열어서 데이터 전송!
PrintWriter out = response.getWriter();
out.println("<html><head></head><body>" + sum + "</body></html>");
out.close();
}
}