JSP

부트캠프41일차(servelt , JSP)

동곤일상 2025. 4. 1. 16:17
반응형
 
Moment
아티스트
이창민
앨범
상속자들 OST Part 3
발매일
2013.10.23

 

언제까지 이짓을 할수있을까
끝나고 그냥 운동이나 갔다가 자빠자 버리겠습니다
오늘의 곡 하나 추천하고 시작할게요

 


1)servlet

1-1) web의 구성요소 실행순서

1-2) URL , 서블릿(Servlet)

1-3)Tomcat 설치 및 등록법

1-4) 서블릿매칭

1-5)URL 매핑

1-6) 파라미터

 

2)Jsp

2-1) jsp페이지구성요소

2-2)Directive(지시어)

2-3)Script(영역)

2-4) comment(주석)

 


 

1) Servlet

 

1-1) 웹의 구성요소 , 실행순서


1-2) URL , 서블릿(Servlet)

Uniform Resource Locator

예: http://www.google.com/search?hl=en&q=jsp&aq=f&oq=

프로토콜: http

호스트: www.google.com

포트: 80 (http 프로토콜의 기본 포트)

경로: /search

쿼리문자열: hl=en&q=jsp&aq=f&oq=

 

서블릿(Servlet)

Server + Applet의 합성어로 JAVA언어를 이용하여 사용자의 요청을 받아 처리하고

그 결과를 다시 사용자에게 전송하는 역할의 Class파일을 말함

즉 웹에서 동적인 페이지를 java로 구현한 서버 측 프로그램

https://tomcat.apache.org/tomcat-9.0-doc/servletapi/

서블릿 설계 규약

  1. 모든 서블릿은 javax.servlet.Servlet 인터페이스를 상속 받아 구현
  2. 서블릿 구현 시 Servlet 인터페이스와 ServletConfig 인터페이스javax.servlet.GenericServlet에 구현
  3. HTTP프로토콜을 사용하는 서블릿은 javax.servlet.http.HttpServlet 클래스는 javax.servlet.GenericServlet을 상속한 클래스로 서블릿은 HttpServlet클래스를 상속 받음
  4. 서블릿 Exception처리를 하기 위해서는 javax.servlet.ServletException을 상속 받아야 함

 

1-3) Tomcat 설치 및 등록법

Tomcat

Apache Software Foundation(아파치 소프트웨어 재단)에서 개발한 Java 기반의 서블릿 컨테이너이자 웹 서버

Tomcat은 수컷 고양이를 의미함 Jsp/Spring을 이용한 웹 사이트 구축에서 거의 필수적으로 사용되는 웹 애플리케이션 서버(WAS)

 

Tomcat 공식홈페이

 https://tomcat.apache.org/

Apache Tomcat 9.0

• Servlet 4.0

• Jsp 2.3 •

 EL 3.0 •

Java 8.0 이상

Download -> Tomcat9.0 => zip 클릭

 

다운받은 zip을 압축을 푼 후 어딘가에 저장해두자 

 

이클립스에Tomcat 등록

 

servers 를 찾아!

더블클릭 해

 

Apache 폴더를 열어

 

Tomcat 9.0 클릭 후 next

 

 

Browse 를 눌러 다운받은 폴더를 클릭 후 next--> finish

 

하면 다음과같이 server프로젝트가 만들어질것임

 


1-4) 서블릿 매칭

Dynamic Web project 생성

 

다음과같이 프로젝트 만들기 완료


servlet 생성

* 1. servletStudy프로젝트 하위의  java폴더에

       ex01_lifcycle패키지생성

*2.  new> servlet

* servlet name : HelloServlet

다음과같은형식의 servlet 파일이만들어질것임

package ex01_lifecycle;

import java.io.IOException;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/HelloServlet")
public class HelloServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public HelloServlet() {
        super();
        System.out.println("생성자 호출");
    }
    

	@Override  //init(ServletConfig) 오버라이딩
	public void init(ServletConfig config) throws ServletException {
		//config객체 : 서블릿 환경설정값을 저장하고있는 객체
		System.out.println("init메서드호출");
	}


	@Override //service(HttpServletRequest,HttpServletResponse) 오버라이딩
	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		/*
		 * req : 요청객체(request 객체)
		 * resp : 응답객체(reponse 객체)
		 */
		System.out.println("서비스메서드호출");
		switch(req.getMethod()) {
		case "GET" -> doGet(req, resp);
		case "POST" -> doPost(req, resp);
		}
	}


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// request : 요청객체 .클라이언트로부터 전달받은 정보 저장
		// response : 응답객체 . 클라이언트에 전달할 정보 저장
		System.out.println("doGET 메서드 호출");
		//PrintWriter getWriter() : 문자형출력스트림
		// append() , write() , print() , println()
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doPOST 메서드 호출");
		doGet(request, response);
	}

}

1.생성자
     *  1)가장먼저 호출됨
     *  2)한번생성된 객체는 재사용됨
     *  3) 생성자호출 후 init메서드호출

 

2.init()
     * 1) 서블릿환경 설정 담당
     * 2) init() 메서드호출 후 service() 메서드호출 

 

 3.service()
 * 1) 클라이언트의 요청시 호출되는 메서드
 * 2) 클라이언트요청 처리
 * 3)요청방식 (Get ,Post)방식에따라 doGet , doPost 메서드호출
 * 4) service() 메서드를 구현하지않아도, doGet , doPost메서드 호출

 

4.doGet()
 * 1)Get방식 요청 처리하는 메서드
 * 2) Get방식 요청
 *   (1) <a href="http://localhost:8080/servletStudy/HelloServlet">;
 *   (2) <form action="http://localhost:8080/servletStudy/HelloServlet">;
 *   (3) location.href= "http://localhost:8080/servletStudy/HelloServlet";
 *   (4)open("http://localhost:8080/servletStudy/HelloServlet");
 *   (5) $.ajax({
 *   type :"GET", (type생략가능)
 *   url : "http://localhost:8080/servletStudy/HelloServlet"
 *   })

request : 요청객체 .클라이언트로부터 전달받은 정보 저장
response : 응답객체 . 클라이언트에 전달할 정보 저장

 

 5.doPost()
 * 1)POST 방식의요청을 처리하는 메서드
 * 2) POST 방식의 요청 방법
 * (1) <form method="POST" action="http://localhost:8080/servletStudy/HelloServlet">;
 * (2) $.ajax({
 *   type :"POST", 
 *   url : "http://localhost:8080/servletStudy/HelloServlet"
 *   })

 


 

 해당파일  실행 클릭 시  다음과같이 프로젝트와연동되어있어야함

 

생성자 호출

init메서드호출

서비스메서드호출

doGET 메서드 호출

==2번쨰 실행 시=====

서비스메서드호출

doGET 메서드 호출

 

다음과같은 콘솔이 나오며 다음과같은 웹이 켜질것임


 

웹브라우저가 뜨지않는다면  javaEE로 설정 후 

Window--> webBrowser -> chrome 으로 변경해보자

 


1-5) URL 매핑

 

URLMapping 방법

* 1. @WebServlet 에노테이션방식 (한개 이상의 요청만들수있음)

* @WebServlet(urlmapping)

* 2. web.xml 파일에 <servlet>태그와 <servlet-mapping>방식

 

 프로토콜://호스트:포트번호/ContextPath/URLMapping

package ex02_urlMapping;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet({"/hi","/hello"}) //http://localhost:8080/servletStudy/hi 
						//http://localhost:8080/servletStudy/hello 
						// 2개 이상의 urlMapping이 가능함 

public class HiServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public HiServlet() {
        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());
	}

	/**
	 * @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);
	}

}

 

UrlMapping부분을 주목!

프로토콜://호스트:포트번호/ContextPath/URLMapping


web.xml 방식(servlet 부분만 추가한것임) 

 

@WebServlet({"/hi","/hello"})부분을 주석처리 해줘야 정상실행될것임

<?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_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>servletStudy</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
  <servlet>
  	<servlet-name>HiServlet</servlet-name>
  	<servlet-class>ex02_urlMapping.HiServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>HiServlet</servlet-name>
  	<url-pattern>/hi</url-pattern>
  	<url-pattern>/hello</url-pattern>
  </servlet-mapping>
</web-app>

 


1-6) 파라미터

코드변경 시

servers 에 restart표시가있다면 초록색버튼(Restart)를 눌러주자

webapp.ex03_parameter.client.html

 

get방식 (파라미터값 노출)

 

파라미터값노출(아이디 등에는 GET방식 부적합)

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul>
  <li> <a href="http://localhost:8080/servletStudy/GetServlet">이동</a></li>
  <li> <a href="/servletStudy/GetServlet">이동2</a></li>
  <li> <a href="/GetServlet">이동3(오류)</a></li>
  <!-- url에서 /로 시작하면 Tomcat은 ContextPath(프로젝트명)로 인식함 -->
  <li> <a href="GetServlet">이동4(오류)</a></li>
  <!-- http://localhost:8080/servletStudy/ex03_parameter/client.html
  	==>http://localhost:8080/servletStudy/ex03_parameter/ GetServlet 요청
  	==>정상접근 : http://localhost:8080/servletStudy/ GetServlet
  	urlmapping HTML경로에 따라 오류가날수도 안날수도있음
   -->
  
  <!-- GetServlet 호출 -->
</ul>
<div>
	<a href="/servletStudy/GetServlet?model=냉장고&price=200">파라미터전송</a>
	<!-- query(?) 이후 : 파라미터 -->
</div>
<div>
	<form action="/servletStudy/GetServlet">
	<label for="model">모델명</label>
	<input type="text" id="model" name="model" placeholder="모델명">
	<label for="price">가격</label>
	<input type="text" id="price" name="price" placeholder="가격(원)">
	<button type="submit">파라미터 전송</button>
	</form>
</div>
</body>
</html>
package ex03_parameter;

import java.io.IOException;
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 GetServlet
 */
@WebServlet("/GetServlet")
public class GetServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public GetServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//파라미터의 인코딩방식 UTF-8
		request.setCharacterEncoding("UTF-8");
        
        //클라이언트로부터 정보를 전달받음(request)
		//name=model인 입력값 조회
		String model = request.getParameter("model");
		String price = request.getParameter("price");
		
		//내가전달해주는 코드의 언어를 명시해줘야함
		response.setContentType("text/html; charset=UTF-8");
		response.getWriter().append("모델명: "+model).append(", 가격 : "+price);
	}

	
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

 



POST방식(URL 파라미터 노출X)

<h3>Post 방식으로 전송</h3>
<div>
<!-- action 쪽으로 요청을 보냄 --><!-- method : "전송방식" -->
 <!-- PostServlet의 doPost(request,response)가 실행될것임 -->
	<form action="/servletStudy/PostServlet" method="post">
	<label for="model">모델명</label>
	<input type="text" id="model" name="model" placeholder="모델명">
	<label for="price">가격</label>
	<input type="text" id="price" name="price" placeholder="가격(원)">
	<button type="submit">파라미터 전송</button>
	</form>
</div>
package ex03_parameter;

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 PostServlet
 */
@WebServlet("/PostServlet")
public class PostServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public PostServlet() {
        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());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("UTF-8");
		response.setContentType("text/html; charset=UTF-8");
		String model = request.getParameter("model"); //name이model인 파라미터 get
		String price = request.getParameter("price");//name이price인 파라미터 get
		//response응답객체
		PrintWriter pw = response.getWriter();//브라우저로보내기위함
//		pw.print("모델명 : "+model+",가격 : "+price);
		pw.print("<html><head><title>파라미터연습</title></head><body>");
		pw.print("<table border='1'><tr><th>모델명</th><th>가격</th></tr>");
		pw.print("<tr><td>"+model+"</td><td>"+price+"</td></tr></table></body></html>");
		//위내용들이 브라우저로 전송됨(코딩할게 너무많음)
	}
}

 여기까지가 Servlet의 한계

 


2) JSP

 

Servlet의 문제점

자바코드를이용해서웹화면을구현하는것이바로Servlet의원리임

Servlet을 활용하면 복잡한 웹 화면을구현하기가어려움 자바코드를모르면간단한웹화면도구현할수없음

웹화면을전문적으로구현하는웹디자이너의경우자바코드를아는경우는매우드문케이스임

 

Jsp를 도입하면서결과화면은Jsp로구현

비즈니스로직은Servlet으로구현하는작업의분리가이루어짐

 

2-1) Jsp 페이지 구성 요소

패키지생성 및 폴더생성

Dynamic web pakage생성

 

webapp 폴더 하위에 폴더하나 생성 후 ex01_pageDirective.jsp 생성

 

/jspStudy/src/main/webapp/ex01_directive/ex01_pageDirective.jsp

 


 

 

2-2)Directive(지시어)

 

1) page directive : jsp페이지의 특징을 설정하는기능

2) include directive : 다른페이지를 포함시키는 기능

3) taglib directive : 커스텀태그(JSTL)사용시 설정(설명안할것임)

 

1) page directive

  • page의 정보를 설정하는기능
  • 형식 : <%@ page 속성1="속성값1" .... %>정보를 설정하는 기능
  • contentType : 반드시 기술해야함 . MIME(text/html)타입으로 설정함
  • import : 사용되는 클래스의 패키지명 생략할수있도록 설정, 여러번설정가능
  • isErrorPage : "true | false" => 기본값:false
    ture : 현재 페이지가 오류인 경우

2)include directive

webapp\ex01_directive\ex02_IncludeDirective.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	String msg = "ex02_includeDirective.jsp 페이지의 msg 변수";
%>
<h1>ex02_includeDirective.jsp 입니다</h1>
<!--Tomcat이 ex02_IncludeDirective2.jsp에게 이동-->
<%@ include file = "ex02_IncludeDirective2.jsp" %>
<%-- ex02_IncludeDirective2.jsp
<hr>
<p>
	ex02_includeDirective.jsp 페이지에 포함됩니다 <br>
	2개의 페이지가 같은 서블릿으로 변경되므로 변수공유가 가능.
	msg : <%=msg %>
</p>
<hr>
 --%>
<h3>include 지시어를 이용해 다른 페이지의 내용을 가져올 수 있음 <br>
	2개의 jsp페이지는 하나의 servlet으로 변환되므로 변수 공유 가능</h3>
</body>
</html>

webapp\ex01_directive\ex02_IncludeDirective2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<hr>
<p>
	ex02_includeDirective.jsp 페이지에 포함됩니다 <br>
	2개의 페이지가 같은 서블릿으로 변경되므로 변수공유가 가능.
	msg : <%=msg %>
</p>
<hr>

 

ex02_IncludeDirective.jsp 실행 시


C:\java\workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\jspStudy\org\apache\jsp 

(아마 .metadata까지의 경로는 다를수있음)
다음과같은 파일에 들어가면 jsp파일-->servlet 파일을 확인해볼수있음

 


2-3) Script

스크립트의종류

  1. 스크립트릿(scriptlet) : <% ... %> : 자바소스의영역
  2. 표현식(experssion) : <%= ... %> : 브라우저에 내용출력
  3. 선언문(declaration) : <%! ... %> : servlet의 멤버로변환.(사용안함)

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>script 예제</title>
</head>
<body>
<h1>스크립트의 종류</h1>
<ol>
  <li>스크립트릿(scriptlet) : &lt;% ... %&gt; : 자바소스의영역</li>
  <li>표현식(experssion) :  &lt;%= ... %&gt; : 브라우저에 내용출력</li>
  <li>선언문(declaration) :  &lt;%! ... %&gt; : servlet의 멤버로변환.(사용안함)</li>
</ol>
<h1>스크립트릿(&lt;% %&gt;) : _jspService() 메서드 소스에 설정</h1>
<%
	String msg = "스크립트 예제";
	for(int i=1 ; i<=10;i++){	
	
%>
<%=i+":"+msg /*여러줄주석*/%><br>
<% } %>
<h1>표현식(&lt;%= %&gt;) : 브라우저에 내용 출력하기</h1>
<ul>
<li>문장에 끝에 ; 사용</li>
<li>값이 존재해야함 : 변수,수식,return값 존재하는 함수</li>
<%-- <%=System.out.println("aaa")%> =>오류발생 --%>
<%= "aaa"  %>
<li>주석은 반드시 /* */ 만 사용가능 //주석 불가능 </li>
<%= "##"+ msg %><br>
<%=  "##"+(10 * 20) %>
</ul>
<h1>선언문 : jsp Servlet의 멤버로설정됨(거의사용하지않음)</h1>
<%= this.msg %><br>
<%= this.getMsg() %><br>
<%!
	String msg = "선언문의 msg변수";
	String getMsg(){
		return msg;
	}
%>

</body>
</html>

 


2-4) commet(주석)

  1. JSP 주석 : <%-- JSP 주석 --%>
  2.  
  3. JAVA 주석 : <% //java 주석 , /*자바 주석*/ %>
    자바에서 사용되는 주석 . 스크립트내부에서 사용됨
    자바주석은 JSP , 서블릿페이지에서 볼 수 있습니다.
    서블릿페이지가 컴파일 될 때 주석으로 처리됩니다.
  4.  
  5. HTML주석 : <!-- HTML 주석 --> JSP나 서블릿에서는 주석이 아님 .
    브라우저에서 화면출력시 주석으로인식
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP에서 사용되는 주석</title>
</head>
<body>
<h1>JSP에서 사용되는 주석 : 3가지</h1>
<ol>
	<li> JSP 주석 : &lt;%-- JSP 주석 --%&gt;</li>
	<%-- JSP 주석입니다 . JSP페이지가 servlet으로 변경될 떄 제외됨
	servlet소스에서 볼 수 없음 --%>
	<li>JAVA 주석 : &lt;% //java 주석 , /*자바 주석*/ %&gt; <br>
		자바에서 사용되는 주석 . 스크립트내부에서 사용됨 <br>
		자바주석은 JSP , 서블릿페이지에서 볼 수 있습니다.<br>
		서블릿페이지가 컴파일 될 때 주석으로 처리됩니다.
	</li>
	<li>HTML주석 : &lt;!-- HTML 주석 --&gt; 
		JSP나 서블릿에서는 주석이 아님 . <br>
		브라우저에서 화면출력시 주석으로인식
		<% String msg = "JSP 메시지"; %>
		<!--  <%=msg %> : 이곳은 HTMl주석입니다 . 서블릿까지 주석이아님.<br>
		HTML 주석은 브라우저의 소스보기에 보여집니다-->
	</li>
</ol>
</body>
</html>