230216 Servlet 기초

kangjuju·2023년 2월 16일
0

Acorn2

목록 보기
5/8
post-thumbnail

Servlet

  • Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술.
  • 웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있기 마련이고 이 요청과 응답에는 규칙이 존재한다.
  • 이러한 요청과 응답을 일일이 처리하려면 굉장히 힘들것인데, 서블릿은 이러한 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해주는 기술이다

서블릿 코드는 Java Resources에서 만들지만 실행은 webapp에서 웹을 구현한다.

기초

기존 자바에서는 표준출력장치로 출력을 해봤다면
웹용 자바인 servlet을 이용하여 get방식.
출력방향을 서버에서 클라이언트(브라우저) 측으로 출력을 해보자

Servlet.java

//@WebServlet("/Servlet1Hello")  <--한줄로 매핑
public class Servlet1Hello extends HttpServlet {
	private static final long serialVersionUID = 1L;

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException {
		// Mime type과 문자 코드
		resp.setContentType("text/html;charset=utf-8");
		System.out.println("서버 컴의 표준출력장치로 출력");
		//getWriter로 printwriter객체를 얻음 웹 브라우저 출력
		PrintWriter out = resp.getWriter(); 
		out.println("<html><body>");
		out.println("<h1>서블릿 문서 처리 성공<h1>");
		out.println("</body></html>");
		out.close();
	}
}
 

web.xml

모든 요청은 web.xml을 가장 먼저 읽는다.
그러므로 작성한 servlet은 xml파일에서 매핑해야한다.

//web-app에 추가

  <servlet>
  	<servlet-name>kbs</servlet-name>
  	<servlet-class>pack1.Servlet1Hello</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>kbs</servlet-name>
  	<url-pattern>/Servlet1Hello</url-pattern>
  </servlet-mapping>
  • <servlet> 에 물리적인 파일의 요청명을 명시하고
  • <servlet-mapping> 에서 논리적인 요청명으로 매핑한다.
  1. <servlet-mapping> 의 url을 읽고 servlet-name을 확인한다.
  2. 이와 일치하는 물리적 요청경로로 가서 해당 자료를 출력한다.

그런데 서블릿의 개수가 많을수록 똑같은 매핑을 반복해야하는데 이는 비효율적이다.
그래서 기본 Annotation을 이용하여 요청명을 코드한줄로 매핑한다.

@WebServlet("/hello")

접속시 링크는 http://localhost/javaweb1/hello 가 된다.
이를 html에서 접속해보자

html

<body>
서블릿 문서 방문하기<br/>
<a href="hello">첫번째 서블릿</a>
</body>

a태그에 매핑 명을 넣으면 매우 간단히 가능하다.

기초2

@WebServlet("/Servlet2Go")
public class Servlet2Go extends HttpServlet {
   private static final long serialVersionUID = 1L;
   public void init(ServletConfig config) throws ServletException {
     <!--초기화 담당 : 서비스 실행시 1회 수행-->
      System.out.println("init");
   }
   public void destroy() {
      <!--마무리 담당 : 서비스 종료 시 1회 수행-->
      System.out.println("destroy");
   }
   protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     <!--get, post 요청 수신-->
      System.out.println("service");
   } 
   protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     <!--get, 요청 수신-->
      System.out.println("doGet");
   }
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     <!--post 요청 수신-->
      System.out.println("doPost");
   }

}
 
  • 요청을 수신할때 get,post 상관없이 service가 호출된다.

  • get/post를 지정 사용하고 싶으면 doGet dePost를 사용하면 된다.

  • 요청명을 여러개 쓸 수도 있다.
    @WebServlet({"/Servlet2Go","/nice"})

<a href="Servlet2Go">두번째 서블릿</a><br/>
<a href="nice">두번째 서블릿</a><br/>

기초3

	protected void service(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		// get, post 요청 수신
		response.setContentType("text/html;charset=utf-8");
		System.out.println("서버 컴의 표준출력장치로 출력");
		// getWriter로 printwriter객체를 얻음 웹 브라우저 출력
		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		out.println("<h1>서블릿 문서 이해</h1>");
		
		int a = 10, b=20;
		out.println("a: "+a+",b : " +b);
		out.println("<br>calc메소드 수행" + calc(a,b));
		Servlet2other other = new Servlet2other("홍길동");
		out.println("<br>other의 이름 : " + other.getIrum());
		out.println("<br>other의 display 수행 결과 : " ); 
		other.display(5, out);
        
		out.println("</body></html>");
		out.close();
	}
	
	private int calc(int a, int b) {
		return a+b;
	}
     
public class Servlet2other {
	private String irum;
	
	public Servlet2other(String irum) {
		this.irum = irum;
	}
	public String getIrum() {
		return irum;
	}
	public void display(int n,PrintWriter out) {
		try {
			int su = 10/n;
			out.println("<p>연산 결과 :"+su+"<p>");
			
		} catch (Exception e) {
			System.out.println("display error"+e);
		}
	}
}
 

자바 내에서 html와 자바의 메소드,클래스,변수를 함께 사용한것을 확인할 수 있다.

참고로 객체 생성은 service에서 하는것이 아닌 최초 1회 시행되는 init에서 하는것이 적절하다.


form-get 예제

get방식

form태그의 action에 servlet 명을 작성하고 호출해봤다.

<body>
<h2>get test</h2>
<a href="Servlet3Get?name=신기해&addr=역삼동&age=33">get링크로 자료 전송</a>
<br>
<form action="Servlet3Get">
이름 : <input type="text" name="name" value="신기루"><br/>
주소 : <input type="text" name="addr" value="정자동"><br/>
나이 : <input type="text" name="age" value="22"><br/>
<br>
<input type="submit"/>
</form>
</body>

servlet에서 전송데이터 받기

함수로 구현 후 결과 반환


form-post 예제

<body>
<h2>post test</h2>
<form action="Servlet4Post" method="post">
이름: <input type="text" name="name" value="홍길동"><br/>
주소1: <input type="text" name="addr" value="서울시"><br/>
주소2: <input type="text" name="addr" value="강남구"><br/>
<br>
<input type="submit">
</form>
</body>

같은 name이 2개인것을 확인하자

servlet에서 post로 데이터 받고 출력하기

  • 단일개수의 데이터는 getParameter 사용하여 넘겨받았다.

  • 하지만 name값은 여러개이므로 자바에서 배열로 담았다.
    그때 사용하는 requestgetParameterValues이다.


서블릿 한글 깨질때

  • 콘솔은 request.setCharacterEncoding("utf-8");
    서블릿은 response.setContentType("text/html;charset=UTF-8");
    를 servlet java에 추가한다.

0개의 댓글