서블릿

w ho
17 min readJan 24, 2020

--

#서블릿이란?

관련 링크 : https://m.blog.naver.com/acornedu/221128616501

서블릿 경로 오류 시 : https://acua.tistory.com/entry/import-javaxservlet-cannot-be-resolved 링크 참고

클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시 전송해주어야 하는데, 이러한 역할을 하는 자바 프로그램입니다.

요즘은 JSP와 Servlet을 동시에 사용 한다고 한다. 값을 요청하면 servlet에서 그 값을 반환하여 jsp에서 홈페이지로 넘겨준다.

xml 파일 생성법

해당 프로젝트에서 오른쪽 버튼후, javaEE TOOLS에서 Descriptor stub를 통해서 web.xml 생성 가능
<body><form action="Math" method="post"><input name="before" type="number"><input name="after" type="number"><input type="submit"></form></body>

form 태그로 값 전달 post 식으로 url에 저장은 안함 .!!

package servlet;@WebServlet("/Math")  // 어노테이션 기법public class Math extends HttpServlet{@Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{resp.setCharacterEncoding("UTF-8");PrintWriter out = resp.getWriter();String before = req.getParameter("before");String after = req.getParameter("after");int I_before=Integer.parseInt(before);int I_after=Integer.parseInt(after);out.print(I_before+I_after);}}

서블릿 어노테이션을 이용하여 Math라는 url에 before 와 after 값을 받아 더한값을 반환

# 서블릿에서 application / session / cookies 이해하기

  1. application / session 으로 서블릿 전송 해보기

calc.html

<form action="calc2" method="post"><div><label> 입력: </label><input type ="text" name="v"/></div><div><input type ="submit" name="operator" value="+"/><input type ="submit" name="operator" value="-"/><input type ="submit" name="operator" value="="/></div><div>결과 : 0</div></form>

calc2.java

@WebServlet("/calc2")  // 어노테이션 기법
public class calc2 extends HttpServlet{

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
// ServletContext application= req.getServletContext();
resp.setCharacterEncoding("UTF-8");

HttpSession session = req.getSession();



String v_ = req.getParameter("v");
String op = req.getParameter("operator");
int reuslt=0;
int v=0;
if(!v_.equals("")) v = Integer.parseInt(v_);

if(op.equals("="))
{

//int x=(Integer) application.getAttribute("value");
int x=(Integer) session.getAttribute("value");
int y= v;
//String operator = (String) application.getAttribute("op");
String operator = (String) session.getAttribute("op");
if(operator.equals("+"))
{
reuslt =x+y;
}
else
{
reuslt =x-y;
}
}
else
{

// application.setAttribute("value", v);
//application.setAttribute("op", op);
session.setAttribute("value", v);
session.setAttribute("op", op);

// int I_before=Integer.parseInt(before);
// int I_after=Integer.parseInt(after);
}


resp.getWriter().println(reuslt);


}
}
  • > 결론 application(주석) session 으로 값을 전달 받아 두 전송 값을 가지고 더해보기
  • application은 어플리케이션 범주 내 session은 session 범주내 당연한 소리같지만 (servletContext 가 application 과 같다 생성시)
    application 은 두 브라우저가 있다면 두 브라우저가 모두 공유하게 되고,
    session 은 각 브라우저에서 해당 유저만 값을 가지게 된다. 즉 회원 가입 로그인에서 주로 사용한다. ( 쉽게 설명하면 헬스장에서 application은 공용 저장소 이고 session은 개인 사물함에 해당된다.)

2. cookies 서블릿 해보기

  • > cookies 다른 전송방식과 다르게 서버에 저장하지 않아 서버에 부담을 줄이는 방식이다. ( 쉽게 설명하면 헬스장에 샴푸나 개인 용품을 개인이 들고 다니는 모습을 상상하면 됨 .)
@WebServlet("/calc2")  // 어노테이션 기법
public class calc2 extends HttpServlet{

@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{

resp.setCharacterEncoding("UTF-8");

Cookie[] cookies =req.getCookies();

String v_ = req.getParameter("v");
String op = req.getParameter("operator");

int v=0;

if(!v_.equals("")) v = Integer.parseInt(v_);
int reuslt=v;
if(op.equals("="))
{

int x=0;
for ( Cookie c : cookies)
{
if(c.getName().equals("value"))
{

x=Integer.parseInt(c.getValue());
break;
}
}

int y= v;

String operator ="";
for ( Cookie c : cookies)
{
if(c.getName().equals("op"))
{
operator=c.getValue();
break;
}
}


if(operator.equals("+"))
{
reuslt =x+y;
}
else
{
reuslt =x-y;
}
}
else
{


Cookie valuecookie =new Cookie("value",String.valueOf(v));
Cookie opcookie =new Cookie("op",op);

resp.addCookie(valuecookie);
resp.addCookie(opcookie); // client에게 전달


}


resp.getWriter().println(reuslt);


}
}

쿠키 경로 설정 및 저장 시간 설정

valuecookie.setPath(“/notice/”);
// notice 가 포함된 url을 가져올경우만 valuecookie라는 변수에 저장된 쿠키를 가져와라
valuecookie.setMaxAge(24*60*60); //24시간 보관 하겠다 valuecookie.setMaxAge(0);
//valuecookie값을 없애고 싶을땐 값을 null로 만들고 나서 0을 넣어주면 삭제됨

xml 을 가지고 servlet 지정해서 사용해보기

해당 프로젝트에서 오른쪽 버튼후, javaEE TOOLS에서 Descriptor stub를 통해서 web.xml 생성 가능

web.xml

<servlet><servlet-name>InitParam</servlet-name><servlet-class>param</servlet-class><init-param><param-name>dirPath</param-name><param-value>c:\\path</param-value></init-param><init-param><param-name>userID</param-name><param-value>admin</param-value></init-param></servlet><!-- 해당 서블릿 네임 값을 지정하고 java 에서 어노테이션 한 url 가져오기  --><servlet-mapping><servlet-name>InitParam</servlet-name><url-pattern>/param</url-pattern></servlet-mapping>

praram 서블릿 java 클래스

public class param extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String dirPath= getInitParameter("dirPath");String userid= getInitParameter("userID");response.setContentType("text/html;charset=UTF-8");PrintWriter out = response.getWriter();out.println(dirPath);out.println(userid);}

서블릿 filter 이용해보기 — Encoding 과 같이 값을 전달하기 전에 중간에서 filter 역할을 통해서 그 값을 filter

web.xml 에서 filter 만드는 법

<filter><filter-name>a</filter-name><filter-class>servlet.Encoding</filter-class></filter><filter-mapping><filter-name>a</filter-name><url-pattern>/*</url-pattern></filter-mapping>-->

servlet.Encoding class 에서 xml 을 안만들고 어노테이션만 사용해도 적용 가능

@WebFilter("/*")public class Encoding implements Filter {@Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)throws IOException, ServletException {resp.setCharacterEncoding("UTF-8");chain.doFilter(req, resp);}}
  • > chain.doFilter를 통해서 filter 역할을 하기전에 setCharater 라는 함수를 이용실행하고 값을 보낸다

JSP ( + 서블릿)

# MVC패턴 2 이해하기

JSP 안에서 JAVA 서블릿을 구현하지 않고 서플릿 파일을 따로 분리하여 사용

<title>Model2 방식  - servlet 파일 따로 정리 </title>
<body>
<! --<%=request.getAttribute("result")%>-->${result} <!-- EL 표기법으로 가능 --></body>

위에는 jsp 파일 밑에는 java (servlet) 파일

@WebServlet("/spag")public class Spag extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {int num=0;String num_ = req.getParameter("n");if(num_!=null && !num_.equals("")){num =Integer.parseInt(num_);}String result;if(num%2==0) { result="짝수";}else {result="홀수";}req.setAttribute("result", result);  // req에 값을 담고// 둘사이에 연결 하는 저장소 - > java -> jsp = forwrading / redirect// forwarding 현재 작업 하는 것을 이어가는거RequestDispatcher dispacher =  req.getRequestDispatcher("spag.jsp");dispacher.forward(req, resp); // req 와 resp 를 공유 할수 있는 공간

forwarding 기법 : 현재 진행하고 있는 req resp 값을 저장소에 저장해서 불러오고 가져오는 방식
EL 표기법 : JSP 에서 복잡한 값을 단순히 변수명만 가지고 화면에 표현 가능

Map<String, Object>  notice = new HashMap<String, Object>();
notice.put("name", "김민준");
notice.put("id", 1);
req.setAttribute("notice", notice);
----------------------------------------------
${notice.id} 의 결과는 1로 나옴

PageContext 및 page / request / session / application 저장소에 저장한 변수가 같을 경우 위 순서대로 불러 오기 때문에 Scope를 이용하여 어떤 저장소의 값을 가져올지 판단,.

<%pageContext.setAttribute("aa","hello");%><meta charset="EUC-KR"><title>Model2 방식  - servlet 파일 따로 정리 </title></head><body><! --<%=request.getAttribute("result")%>-->${result} <!-- EL 표기법으로 가능 --><br>${notice.id}${ pageScope.aa}</body>

forwarding 방식 외 redirect 은 setAttribute 값이 전달되지 않고 getParameter 값에 sendRedirect를 통해서 직접 값을 넣어 전달해야한다.

String id = (String) request.getParameter("memberid");request.setAttribute("request","requestValue");response.sendRedirect("redirect.jsp?memberid=admin2"); // forward 방식이 아닌 redirect 방식으로 보내보기// redirect는 setAttribute 값은 전달ㄷ되지 않고 getParameter 값만 전달이 된다 .

서블릿 정리

현재 시간을 불러오는 MVC패턴2를 통해서 총정리

date.java

@WebServlet("/date")public class date extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {Date d = new Date();SimpleDateFormat sf =new SimpleDateFormat("yyyy년 MM월 dd일");String fd =sf.format(d);Calendar c = Calendar.getInstance();int hour = c.get(Calendar.HOUR);int min = c.get(Calendar.MINUTE);ArrayList<Integer> list = new ArrayList<Integer>();for(int i=0; i<10;i++){list.add(i);}req.setAttribute("list", list);req.setAttribute("hour", hour);req.setAttribute("minute", min);req.setAttribute("fd", fd);System.out.println(hour);RequestDispatcher dispacher =  req.getRequestDispatcher("date.jsp");dispacher.forward(req, resp); // req 와 resp 를 공유 할수 있는 공간}}

date. jsp

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%><!DOCTYPE html><html><head><meta charset="UTF-8"><title>Insert title here</title></head><body><div>현재 시간은 ${fd} ,${hour}시 ,${minute}분 </div><c:forEach var="n" items="${list}"><!-- items에 원하는 값을 넣고 var에  변수명을 넣어 forEach 태크로 배열이나 리스트와 같은 변수를 jsp view 단에서 처리  --><!-- forEach를 쓰기 위해서는 jstl .jar를 다운 받아 WEB-INF 안에 lib에 넣어야 됨  --><td>${n}</td></c:forEach>

# 결론 : Controller 와 view를 따로 코드 분리 / jstl.jar 를 활용하여 list 와 같은 형태도 java코드를 사용하지 않고 태그 를 활용

파일 경로 캡쳐 JSTL /data.java / date.jsp

--

--

No responses yet