[JSP] 서블릿과 서블릿 맵핑
서블릿클래스 구현하기
1.HttpServlet 클래스를 상속받기
2.서블릿이 get방식의 요청을 처리해야한다면 doGet()메소드 정의
doGet메소드는 HttpServletRequest와 HttpServletResponse의 두 파라미터를 가지며,
이 두 파라미터는 각각 jsp의 request 기본객체와 response 기본 객체에 해당
3.재정의한 메소드는 request를 이용해 웹 브라우저의 요청정보를 읽어오거나 response를 이용하여 응답을 전송할 수있다.
응답을 전송하려면 response.setContentType()메소드를 이용하여 응답의 컨텐츠 타입을 지정해야한다.
response.setContentType("text/html; charset=utf-8");
웹브라우저에 데이터를 전송하려면 19행과 같이 response, getWriter() 로 문자열 데이터를 출력할 수 있는 printWriter 를 구해야한다. PrinterWriter는 println()메소드를 제공하며 이를 이용하여 전송할 응답데이터를 전다라한ㄷ.
web.xml로 매핑하기 ->web.xml파일에서 서블릿 클래스를 등록한다.
- 서블릿으로 사용할 클래스
- 서블릿과 url간의 매핑
<servlet-name>=해당 서블릿을 참조할때 사용할 이름
<servlet-class>=서블릿으로 사용할 클래스의 완전한 이름
<servlet-mapping> =매핑정보 등록
<servlet-name>= 매핑할 서블릿의 이름
<url-pattern>=매핑할 url 패턴 지정
예를들어
이러한 web.xml이 있다면 NowSerbvlet클래스를 now라는 이름의 서블릿으로 등록했고,
/now 라는 url을 NowServlet이 처리하게 된다.
애노테이션으로 매핑
@WebServlete 애노테이션을 이용하면 web.xml파일에 서블릿을 등록하지 않아도 된다.
예를들어 @WebServlet("/ex01", "/ex02"); 라고한다면
/ex01, /ex02로 들어오는 url을 해당서블릿이 처리하도록 설정하는 것이다.
ex01.jsp
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page import="java.util.Date" %>
<%@page import="java.time.LocalDateTime" %>
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
Date now=new Date();
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-mm-dd");
String strDate=sdf.format(now);
int age=20;
String today=getNow();
%>
<%! //변수 선언문=> 변수, 메소드
String name="홍길동";
public String getNow(){
return LocalDateTime.now().toString();
}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="shortcut icon" type="image/x-icon" href="../images/SiSt.ico">
<title>2022. 6. 19.-오전 10:59:34</title>
</head>
<body>
<h3></h3>
날짜(now):<input type="text" value="<%=now.toLocaleString()%>"><br>
이름(name):<input type="name" value="<%=name %>"><br>
나이:<input type="age" value="<%=age %>"><br>
날짜:<input type="date" value="<%=strDate%>"><br>
날짜:<input type="date" value="<%=today%>"><br>
날짜(today) : <span><%=today%></span><br>
<script>
$(document).ready(function(){
});
</script>
</body>
</html>
이제 서블릿으로
ex01.java
package prac;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.Date;
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 ex01
*/
@WebServlet("/ex01")
public class ex01 extends HttpServlet {
private static final long serialVersionUID = 1L;
String name="홍길동";
public String getNow() {
return LocalDateTime.now().toString();
}
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html: charset=UTF-8");
Date now=new Date();
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-mm-dd");
String strDate=sdf.format(now);
int age=20;
String today=getNow();
PrintWriter out=response.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<meta charset=\"UTF-8\">");
out.println("<title>Insert title here</title>");
out.println("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">");
out.println("<script src=\"https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js\"></script>");
out.println("<link rel=\"stylesheet\" type=\"text/css\" href=\"\">");
out.println("<style>");
out.println("</style>");
out.println("<script>");
out.println("$(document).ready(function (){ });");
out.println("</script>");
out.println("</head>");
out.println("<body>");
out.println("날짜(now) : <input type='text' value='"+ now.toLocaleString() +"'> <br>");
out.println("이름(name) : <input type='text' value='"+ name +"'> <br>");
out.println("나이(age) : <input type='text' value='"+age+"'> <br>");
out.println("날짜(today) : <span>"+today+"</span><br>");
out.println(strDate +"<br>");
out.println("</body>");
out.println("</html>");
}
}
web.xml 을 수정
<servlet>
<description>현재 날짜 ,시간 응답하는 첫번째 서블릿</description>
<description>jsp Ex01</description>
<servlet-name>Ex01</servlet-name>
<servlet-class>prac/Ex01.java</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Ex01</servlet-name>
<url-pattern>/now</url-pattern>
<url-pattern>/prac/Ex01 </url-pattern>
<url-pattern>/test/* </url-pattern> <!--폴더경로가 일치하는경우 -->
<url-pattern>*.htm </url-pattern> <!-- 확장자패턴이 일치하는경우 -->
<url-pattern>/ex01.htm </url-pattern>
<url-pattern>*.ss</url-pattern>
</servlet-mapping>
애노테이션 이용
@WebServlet("/ex01")
ex02.jsp
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
<link rel="shortcut icon" type="image/x-icon" href="../images/SiSt.ico">
<title>2022. 6. 19.-오후 3:48:17</title>
</head>
<body>
<h3></h3>
<%
String contextPath=request.getContextPath();
%>
<a href="http://localhost/jspPro/prac/now">NowServlet.java</a><br>
<a href="<%= contextPath %>/prac/Ex01">days01/now</a><br>
<a href="<%= contextPath %>/now">/now</a><br>
<a href="<%= contextPath %>/servlet/sample.ss">/servlet/sample.ss</a><br>
</body>
</html>