반응형
Servlet
- 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램으로 자바 클래스의 일종
- HttpServlet 를 상속받아 사용
- JSP와 비슷한 점이 있지만, JSP가 HTML 문서 안에 자바 코드를 포함하고 있는 반면, 서블릿은 자바 코드 안에 HTML을 포함하고 있다.
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;
@WebServlet("/hs")
public class HelloSsafy extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = "sasca";
// text를 html로 인식 및 utf-8로 인코딩 설정 , PrintWriter 스트림에 연결하기 전에 바꿔줘야된다.
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("");
out.println("<html>");
out.println("<body>");
out.println("Hello!!!<br>");
out.println("안녕하세요" + name);
out.println("</body>");
out.println("</html>");
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("doPost call!!!!");
// 1. data get
request.setCharacterEncoding("utf-8");
String name = request.getParameter("username");
System.out.println(">>>>>>>>>>>>" + name);
String id = request.getParameter("userid");
int area = Integer.parseInt(request.getParameter("area"));
// 2. logic >> 인사의 글자색을 서울 : 파랑, 대전 : 오렌지, 구미 : 핑크, 광주 : 초록, 부울경 : 보라
String color[] = {"blue", "orange", "pink", "green", "purple"};
// 3. response page
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println(" <body>");
out.println(" <h2 style=\"color:" + color[area] + "\">안녕하세요. " + name + "(" + id + ")님!!!</h2>");
out.println(" </body>");
out.println("</html>");
}
- post 방식은 내부적으로 IO가 일어나기 때문에 request.setCharacterEncoding("utf-8") 을 설정해줘야 한다.
LifeCycle
- Sevlet class 는 class와 다르게 메인 메서드가 없다. 즉 객체의 생성부터 사용의 주체가 사용자가 아닌 Servlet Container(WAS)에게 있다.
- request 요청이 오면 Servlet Container는 객체를 한번만 생성하고, 초기화도 한번만 하며 요청에 대한 처리를 하게 된다. 필요없어지면 제거하는 일까지 Container가 담당
public class DeptListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
// Dept 의 list 정보를 받아올 것이 기 때문에 select 구문 사용 즉, Get 방식을 사용하기 때문에 HttpServlet의 doGet을 재정의
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
DeptService deptService = new DeptService();
try {
List<Dept> list = deptService.getDeptList();
// 리스트를 request에 포함하여 넘겨줄 것이기 때문에 (포워드 방식으로) setAttribute에 키와 값으로 넘겨준다.
request.setAttribute("deptList", list);
// 리스트를 보여줄 화면에 값 전달을 위해 포워드 방식으로 전달
request.getRequestDispatcher("/dept/list.jsp").forward(request, response);
} catch (SQLException e) {
e.printStackTrace();
// 에러페이지 이동
request.setAttribute("exception", e);
request.setAttribute("errorMsg", "부서 목록 조회에 실패하였습니다.");
request.getRequestDispatcher("/error.jsp").forward(request, response);
return;
}
}
}
- 컨트롤러(서블렛) -> 서비스 -> DAO -> DB -> DAO -> 서비스 -> 컨트롤러(서블렛)으로 동작한다. (MVC 패턴)
- 포워드 방식을 적용할 때는 request에 담아서 보낸다.
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
int deptNo = Integer.parseInt(request.getParameter("deptNo"));
String dName = request.getParameter("dName");
String loc = request.getParameter("loc");
DeptService deptService = new DeptService();
try {
deptService.modifyDept(new Dept(deptNo, dName, loc));
response.sendRedirect(request.getContextPath()+"/index.jsp");
} catch (SQLException e) {
e.printStackTrace();
}
}
- doPost를 재정의할 경우 Http Header에 값을 넣어서 보내기 때문에 별도의 utf-8 설정이 필요하다.
- 원하는 서비스 요청 수행 후 별도로 값을 보낼 일이 없으면 response에 리다이렉트로 원하는 뷰를 전달한다.
WebServlet
@WebServlet(value = {"/dept/list.do", "/dept/list.ss"}, loadOnStartup = 1)
public class DeptListServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
- WebServlet 어노테이션은 톰캣에서 설정해야 할 servlet, servlet-mapping 기능을 대신 수행 해준다. 프로젝트 버전 4.0(이클립스 다이나믹 웹 프로젝트)이상부터 가능
- 여러 url 을 지정할 경우 {} 를 통해 설정할 수 있다. loadOnStartUp은 컨테이너 시작할 때 우선순위를 두는설정
<servlet>
<servlet-name>DeptListServlet</servlet-name>
<servlet-class>com.ssafy.controller.DeptListServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DeptListServlet</servlet-name>
<url-pattern>/dept/list.do</url-pattern>
<url-pattern>/dept/list.ss</url-pattern>
</servlet-mapping>
- 톰캣에 직접 정의하고 싶은 경우 프로젝트 - WebContent - WEB-INF - lib - web.xml에서 정의 가능
JSP
- JavaServerPage : HTML내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹 페이지를 생성하여 웹 브라우저에 돌려주는 언어. (웹 애플리케이션 서버에서 동작)
- JSP는 실행 시 자바 서블릿으로 변환된 후 동작하므로 서블릿과 유사. JSTL 등 태그 라이브러리를 사용하면 자바 코딩 없이 태그만으로 사용이 가능하므로 생산성을 높일 수 있다.
JSP 문법
- Expression, Scriptlet, Declaration, Comment, Directive 총 5가지 방식이 존재
Expression
<td><input type="text" name="deptNo" placeholder="부서번호를 입력하세요" required="required" readonly ="readonly" value="<%=dept.getDeptno()%>"/></td>
- Expression은 String으로 변환되어 Servlet의 출력에 삽입된다.
- 동적인 페이지를 생성할 수 있으며, 끝에 세미콜론을 붙이지 않는다.
Scriptlet
<% Dept dept = (Dept) request.getAttribute("dept"); %>
- 간단한 값이 아닌 조금 복잡한 기능을 수행하고자 할 때 Scriptlet을 사용한다.
- 임의의 자바 코드를 삽입하여 사용 (세미콜론 사용)
- 메서드가 아닌 변수만 선언할 수 있다.
Declaration
<%! int age = 0; %>
<%= ++age %>
- 서블릿 클래스에 삽입되는 메서드나 필드를 정의할 수 있다.
Comment
<%-- comment --%>
- 주석 처리 방식
Directive
<%@ page attr1="val1" attr2="val2" %>
- page Directive (<%@ %>) : 컨테이너에게 현재 JSP 페이지를 어떻게 처리할 것인가에 대한 정보
<%@ include file="/template/header.jsp" %>
- include Directive : 특정 jsp 파일을 페이지에 포함 (정적)
- 여러 jsp 페이지에서 반복적으로 사용하는 부분을 include (헤더, 푸터 등)
- jsp:page 도 동일 기능이나, 동적으로 사용 가능하다.
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
- JSTL 또는 커스텀 태그를 이용할 때 사용되며 불필요한 자바 코드를 줄일 수 있다.
예제
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" import="com.ssafy.guestbook.model.MemberDto"%>
<%@ include file="/template/header.jsp" %>
<div align="center">
<h3>방명록</h3>
<%
MemberDto memberDto = (MemberDto) session.getAttribute("userInfo");
if(memberDto == null) {
%>
<a href="<%= root %>/user?act=mvregister">회원가입</a>
<a href="<%= root %>/user?act=mvlogin">로그인</a>
<%
} else {
%>
<strong><%= memberDto.getUserName()%>(<%= memberDto.getUserId() %>)</strong>님 안녕하세요
<a href="<%= root %>/user?act=logout">로그아웃</a>
<br>
<a href="<%= root %>/article?act=list">글목록</a>
<%
}
%>
</div>
<%@ include file="/template/footer.jsp" %>
반응형