본문 바로가기

국비필기노트/jsp

jsp_Servlet, Filter

 

Servlet

 

 

서버에서 웹페이지 등을 동적으로 생성하거나 데이터 처리를 수행하기 위해 자바(JAVA)로 작성된 프로그램을 말한다.

하단의 코드는 이클립스 JSP의 서블릿 Class이다.

하나씩 따져보자

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package com.koreait.web.servlet;
 
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("/hello")
public class MyServlet extends HttpServlet{
    
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) 
            throws ServletException, IOException {
 
       arg0.setCharacterEncoding("UTF-8");
 
        arg1.setCharacterEncoding("UTF-8");   
        arg1.setContentType("text/html charset=UTF-8");
        

      PrintWriter out = arg1.getWriter(); 
 
String title = arg0.getParameter("title"); 
String content = arg0.getParameter("content"); 
 
out.println(title); 
out.println(content);
    }
}
 
cs

 

 

 

@WebServlet

 

 

1
@WebServlet("/hello")
cs

 

 

WebServlet이라는 어노테이션이다. 어노테이션은 @Override처럼 문법 에러를 체크할 수도 있지만, 실행시 특정 기능을 실행하도록 정보를 제공하게 하는 기능도 있다.

 

그래서 JAVA는 어노테이션을 활용하여 해당 어노테이션안에 경로를 입력하면 클라이언트에서 해당 경로를 입력할 때 알아서 톰캣서버가 찾아서 알아서 실행해 줄 수있도록 개발되었다. 

 

 

 

UTF-8변경

 

 

1
2
3
4
        arg0.setCharacterEncoding("UTF-8");
 
        arg1.setCharacterEncoding("UTF-8");    
        arg1.setContentType("text/html charset=UTF-8");
cs

 

 

arg0은 클라이언트의 요청을 받는 값이고 arg1은 클라이언트의 요청에 답하는 값이다. 

그래서 요청이 오고 가는 부분에 모두 UTF-8을 설정해주어야한다.

 

  • SetCharacterEncoding: 한글이 나타나게 인코딩
  • setContentType: 한글이 깨지지않게 내용의 type을 설정

만약 SetCharacterEncoding만 했다면 단순 ??으로 나왔던 Text가 한글인 "뒘뀃"정도로 나올 수 있다. 한글은 나왔지만 한글이 깨지는 것이다. 이를 밑의 setContentType으로 type을 설정을 해야만 정상적으로 한글 출력이 가능하다.

 

 

 

웹으로 데이터 출력

 

 

1
PrintWriter out = arg1.getWriter(); 
cs

 

 

자바에서 웹으로 데이터를 출력하기 위해 PrintWriter를 사용한다. 원하는 내용을 출력하기 위한 코드이다.  new로 초기화 하지않아도 바로 사용 가능하다.

 

 

 

Servlet Filter

 

어플리케이션의 HTTP요청 및 응답을 가로채는데 사용되는 개체이다. 

 

예를들어 회원가입을 할 때 회원정보가 틀렸을 경우 백엔드까지 갈 필요없이 필터영역에서 클라이언트에서 회원정보가 틀렸다고 알림정도만 줄 때 사용될 수 있으며 각 상황에 맞추어 여러 방면으로 수행된다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.koreait.web.servlet.filter;
 
import java.io.IOException;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
 
@WebFilter("/*"
public class CharacterEncodingFilter implements Filter {
 
    
    @Override
    public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2)
            throws IOException, ServletException {
        
        arg0.setCharacterEncoding("UTF-8");
        
        arg1.setCharacterEncoding("UTF-8");
        arg1.setContentType("text/html charset=UTF-8"); 
        
 
        arg2.doFilter(arg0, arg1);
        
    }
    
    
    @Override
    public void destroy() {
        
    }
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
        
    }
    
}
 
cs

 

 

(*/)

 

모든 요청에 대하여 공통적인 처리를 해줄 때는 어노테이션안에 /를 입력해준다. 단, /를 적용하였는데 CSS가 깨지는 경우가 발생할 때가 있는데 이 땐 웹필터에 url을 넣어 조정해준다.

 

 

doFilter

 

doFilter( ) 메소드는 필터링 설정한 서블릿을 실행할 때 마다 호출되는 메소드로서 실제 필터링 기능을 구현하는 메소드이다.

 

 

 

Server를 사용한 예시(계산기)

 

 

덧셈 Submit 1개

 

 

*Calc.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="add" method="post">
        <div>
            <lable>x: </lable>
            <input type="text" name="x">
        </div>
        <div>
            <lable>y: </lable>
            <input type="text" name="y">
        </div>
        <input type="submit">
    </form>
</body>
</html>
cs

 

 

 

 

*ServletAdd

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package com.koreait.web.servlet.filter;
 
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("/add")
public class ServletAdd extends HttpServlet{
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) 
throws ServletException, IOException {
        
        String xStr = arg0.getParameter("x");
        String yStr = arg0.getParameter("y");
        
        int x = 0, y = 0;
        
        if(xStr != null && !xStr.equals("")) {
            x = Integer.parseInt(xStr);
        }
        if(yStr != null && !yStr.equals("")) {
            y = Integer.parseInt(yStr);
        }
    
        
        int result = x+y;
        arg1.getWriter().println("result is " + result);
    }
}
 
cs

 

 

 

*덧샘과 뺄샘 Submit 2개

 

 

*clac.html

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="calc" method="post">
        <div>
            <lable>x: </lable>
            <input type="text" name="x">
        </div>
        <div>
            <lable>y: </lable>
            <input type="text" name="y">
        </div>
        <input type="submit" value ="덧셈" name = "operator">
        <input type="submit" value ="뺄샘" name = "operator">
    </form>
    
    
 
</body>
</html>
cs

 

 

 

*ServletCalc.java

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@WebServlet("/clac")
public class ServletCalc extends HttpServlet{
    @Override
    protected void service(HttpServletRequest arg0, HttpServletResponse arg1) 
throws ServletException, IOException {
        
        String xStr = arg0.getParameter("x");
        String yStr = arg0.getParameter("y");
        String op = arg0.getParameter("operator");
        
        int x = 0, y = 0, result = 0;
        
        if( xStr != null && !xStr.equals("")) {
            x = Integer.parseInt(xStr);
        }
        
        if( yStr != null && !yStr.equals("")) {
            y = Integer.parseInt(yStr);
        }
        
        if(op.equals("sum")) {
            result = x + y;
        } else {
            result = x - y;
        }
            
        arg1.getWriter().println("result is " + result);
 
        
    }
}
 
cs

 

 

 

'국비필기노트 > jsp' 카테고리의 다른 글

jsp_MVC패턴  (0) 2022.06.03
jsp_jsp태그  (0) 2022.06.01
jsp_attribute scope  (0) 2022.06.01
jsp_액션태그, 디렉티브태그,forward,redirect  (0) 2022.06.01
Application, Cookie, Session 저장공간  (0) 2022.05.27