class도 페이지에서 인식할 수 있도록 가상 url Mapping
<?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>MyWeb</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>
<servlet>
<servlet-name>basic</servlet-name>
<servlet-class>kr.co.jsp.servlet_basic.ServletBasic</servlet-class>
</servlet>
<!-- servlet 경로와 원하는 이름을 지정 -->
<servlet-mapping>
<servlet-name>basic</servlet-name>
<url-pattern>/basic</url-pattern>
</servlet-mapping>
</web-app>
값을 보내줄 수 있는 form 제작
<%@ 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>
<form action="/MyWeb/basic" method = "post">
# 아이디 : <input type = "text" name = "account"><br>
<input type = "submit" value = "서블릿페이지 열어보기">
</form>
<%-- class에 값을 이동하기를 원한다면 web.xml에서 가상의 url지정 --%>
</body>
</html>
기존에 jsp에서 작성한 내용을 메서드에 작성하여 class에서도 controller의 역할을 할 수 있는 것을 확인
Client에서 요청이 들어오게 되면 servlet객체가 생성되는 것을 확인
HttpServlet 클래스를 상속하며 주요 메서드로는 init(), doGet(), doPost(), destroy() 등이 존재
package kr.co.jsp.servlet_basic;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import kr.co.jsp.user.model.UserDAO;
import kr.co.jsp.user.model.UserVO;
/*
- 서블릿이란 웹 페이지를 자바 언어로만 구성하는 기법
즉, jsp파일을 자바 언어로만 구성
tomact을 사용해서 jsp 파일을 자동으로 class로 변환했다면 이제는 직접 클래스를 생성해서 클래스로 요청을 처리
*/
public class ServletBasic extends HttpServlet{
//# servlet 클래스를 만드는 방법
// 1. HttpServlet 클래스 상속
// 2. 생성자 선언(선택)
public ServletBasic() {
System.out.println("페이지에 요청이 들어옴");
System.out.println("서블릿 객체 생성!");
// 요청이 들어오면 객체가 생성되는 것을 확인하기 위해 사용
}
// 3. HttpServlet이 제공하는 상속 메서드를 오버라이딩
// init(), doGet(), doPost(), destroy()...
@Override
public void init() throws ServletException {
/*
- 페이지 요청이 들어왔을 때 처음 실행할 로직을 작성
- init()은 컨테이너(서버 프로그램)에 의해 서블릿 객체가 생성될 때
최초 1회 자동으로 호출
- 객체의 생성자와 비슷한 역할을 수행
*/
System.out.println("init 메서드 호출 ");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// http 통신 중 get 요청이 발생했을 때 자동으로 호출되는 메서드
// 매개값으로 내장객체인 request와 response가 전달되므로 객체의 메서드를 통해 파라미터 값을 가져오거나 페이지 이동 가능
System.out.println("doGet메서드가 호출");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// http 통신 중 post 요청이 발생했을 때 자동으로 호출되는 메서드
// doget과 마찬가지로 내장객체인 request와 response를 매개값으로 받음
System.out.println("doPost 메서드가 호출");
String account = request.getParameter("account");
// 사용자에게 입력받은 값을 가져옴
UserVO vo = UserDAO.getInstance().getUserInfo(account);
// 입력받은 값을 바탕으로 유저 정보 찾아오는 메서드를 통해 유저 객체 찾아옴
// 자바클래스에서 세션을 사용하는 방법
HttpSession session = request.getSession();
session.setAttribute("user", vo);
// session을 user라는 이름으로 UserVO객체 값을 넣음
response.sendRedirect("servlet/info.jsp");
// 해당 페이지로 이동
}
@Override
public void destroy() {
// 서블릿 객체가 소멸될 때 호출되는 메서드 (객체 소멸 시 1회 자동으로 호출)
System.out.println("destroy 메서드가 호출");
}
}
doPost메서드에서 session에 저장한 결과물을 가지고 와서 화면에 출력
JSP는 view의 역할을 수행
<%@ 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>
<p>
# 아이디 : ${ sessionScope.user.id}<br>
# 이름 : ${ sessionScope.user.name}<br>
# 이메일 : ${ sessionScope.user.email}<br>
# 주소 : ${ sessionScope.user.address}<br>
</p>
</body>
</html>
package kr.co.jsp.servlet_basic;
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("*.do")
// annotation(그냥 기능이 있는 주석이라고 생각)
// web.xml에서 등록했던 것을 자동으로 해주는 기능
public class FrontController extends HttpServlet {
private static final long serialVersionUID = 1L;
public FrontController() {
super();
// TODO Auto-generated constructor stub
}
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
}
public void destroy() {
// TODO Auto-generated method stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doget메서드 호출");
System.out.println("요청 URL : " + request.getRequestURI());
String uri = request.getRequestURI();
String conPath = request.getContextPath();
// 현재의 contextroot인 /MyWeb이 옴
uri = uri.substring(conPath.length()+1, uri.lastIndexOf("."));
// /MyWeb/write.do에서 write만 골라내기 위해서 작성
if (uri.equals("/MyWeb/write.do")) {
System.out.println("글 작성 요청이 들어옴 ");
}
else if (uri.equals("/MyWeb/list.do")) {
System.out.println("글 목록 요청이 들어옴");
}
}
// 이렇게 uri를 통해서 하나의 컨트롤러에서 요청을 구분할 수 있음
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}