1. 정의

여과기 역할을 하는 프로그램.

서블릿 클래스가 실행되기 전/후에 어떤 데이터를 미리 실행시키거나, 아예 가로채서 서블릿이 실행되지 못하도록 한다.

자바 클래스 형태로 구현해야 한다.

http 요청, 응답을 변경 가능하고 재사용이 가능한 코드. 객체 형태를 띈다.

request와 최종 자원(jsp / servlet) 사이에 위치한다.


* 보통은 클라이언트 - 자원 사이에 필터가 1개가 존재는게 일반적이나, 다수도 가능하다.



2. 구조

1) 단일 필터 구조




2) 다중 필터 구조



3. 인터페이스

- Filter : 클라이언트와 최종 자원 사이의 객체 인터페이스

- ServletRequestWrapper : 필터가 요청을 변경하거나, 응답을 변경한 결과를 저장할 래퍼 클래스

- ServletResponseWrapper : 필터가 요청을 변경하거나, 응답을 변경한 결과를 저장할 래퍼 클래스



4. 용도

- 데이터 인코딩 : 서블릿 doPost 메소드에서 한글 인코딩을 대신 하는 역할

- 세션 데이터 인증 : 로그인 세션 체크

- 이벤트, 공지 등 팝업 추가



5. 예제


* 순서 : html -> filter 클래스 -> servlet 클래스 -> view jsp 페이지


1) 시작이 되는 html 페이지

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>필터 적용 예제</title>
</head>
<body>
<form method="post" action="ExampleS.do">
    이름 : <input type="text" name="name">
    <input type="submit" value="확인">
</form> 
</body>
</html>
cs


2) filter 클래스 작성

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
44
45
46
47
48
49
package com.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;
 
/**
 * Servlet Filter implementation class ExampleBFilter
 */
//@WebFilter("/ExampleBFilter")
public class ExampleBFilter implements Filter {
 
    /**
     * Default constructor. 
     */
    public ExampleBFilter() {
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see Filter#destroy()
     */
    public void destroy() {
        // TODO Auto-generated method stub
    }
 
    /**
     * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
     */
    // doFilter 메소드에서 한글 인코딩을 해줬다.
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
        
        request.setCharacterEncoding("utf-8");
        
        chain.doFilter(request, response);
    }
 
    /**
     * @see Filter#init(FilterConfig)
     */
    public void init(FilterConfig fConfig) throws ServletException {
        // TODO Auto-generated method stub
    }
}
cs


3) web.xml 설정

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 <filter>
    <filter-name>ExampleBFilter</filter-name>
     <filter-class>com.filter.ExampleBFilter</filter-class>
 </filter>
  
 <filter-mapping>
    <filter-name>ExampleBFilter</filter-name>
    <!-- url-pattern : 같은 웹 애플리케이션 디렉터리 내 웹 컴포넌트에 적용할 때 -->
    <!--                 (ex. /* : 모든 웹 컴포넌트, *.jsp : 디렉터리 내의 jsp페이지에만 적용-->
    <!-- servlet-name : 특정 서블릿에만 적용할 때-->
    <url-pattern>/*</url-pattern>
 </filter-mapping>
cs


4) servlet 클래스 작성

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
44
45
46
package com.servlet;
 
import java.io.IOException;
 
import javax.servlet.RequestDispatcher;
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 ExampleSServlet
 */
@WebServlet("/ExampleS.do")
public class ExampleSServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public ExampleSServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
 
    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
                    throws ServletException, IOException {
//        System.out.println("############");
        
        String name = request.getParameter("name");
        
//        System.out.println("name : " + name);
        
        request.setAttribute("name", name);
        
//        System.out.println("after name : " + request.getAttribute("name"));
        
        RequestDispatcher rd = request.getRequestDispatcher("result.jsp");
        
        rd.forward(request, response);
    }
}
cs


5) view 용 jsp 페이지 작성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>화면 결과 출력 예제</title>
</head>
<body>
    name : ${name}
</body>
</html>
cs


'BackEnd > Java' 카테고리의 다른 글

Java :: PrintWriter 객체 인코딩 오류시  (0) 2016.08.04
Servlet :: 필터로 한글 인코딩 설정하기  (0) 2016.06.18
Java :: Random 함수  (0) 2016.06.05
Jsp :: jsp 내장객체  (0) 2016.06.03
Java :: JDBC DAO 소스  (0) 2016.04.26

1. java.util.Random

new Randon() 을 사용하여 객체 생성

다양한 메소드를 사용하여 원하는 타입의 random 값을 사용 가능

주사위를 던지거나 카드를 섞는 난수를 사용할 때 주로 사용

 

 

종류 

 nextBoolean()

 nextDouble()

 nextBytes(byte[] bytes)

 nextFloat()

 nextGaussian()

 nextInt()

 nextInt(int n)

 nextLong()

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package com.random;
 
import java.util.Random;
 
public class ExampleA_Main {
    public static void main(String[] args) {
    
        Random random = new Random();
        
        // nextBoolean() : true와 false중 랜덤 출력
        System.out.println("nextBoolean() : " + random.nextBoolean());
        System.out.println("nextFloat() : " + random.nextFloat());
        System.out.println("nextInt() : " + random.nextInt());
        // nextInt(int n) : n 이내의 정수를 랜덤으로 출력
        System.out.println("nextInt(10) : " + random.nextInt(10));
        System.out.println("nextDouble() : " + random.nextDouble());
        System.out.println("nextLong() : " + random.nextLong());
    }
}
cs

 

 

2. java.util.Math

double 타입으로 리턴하기 때문에 int로 형을 변환하여 사용 가능

주로 최소값과 최대값을 구할 때 사용,

((int) Math.random() * (최대값 - 최소값 + 1) 수식을 사용하여 최소값 ~ 최대값 범위를 지정

'BackEnd > Java' 카테고리의 다른 글

Servlet :: 필터로 한글 인코딩 설정하기  (0) 2016.06.18
Servlet :: 필터 (Filter)  (1) 2016.06.10
Jsp :: jsp 내장객체  (0) 2016.06.03
Java :: JDBC DAO 소스  (0) 2016.04.26
Java :: 패키지 이름 명명 규칙  (0) 2016.04.02

1. 정의

모든 jsp는 서블릿 컨테이너에 의해서 서블릿으로 변환된다.

서블릿은 자바 프로그램이기 때문에 객체를 선언하여 인스턴스 변수를 개발자 마음대로 정의하여 사용할 수 있으나,

jsp는 서블릿이 상속받는 HttpServletRequest, HttpServletResponse 클래스에 선언된 객체들을 사용해야 한다.

(모든 jsp 파일들은 결국 서블릿으로 변환되기 때문에 = 서블릿이기 때문에)

 

서블릿에서는 직접 인스턴스 변수명을 마음대로 정의 가능하나 jsp는 서블릿으로 이루어져 있기 때문에(하위 단계라고 생각하는게 이해가 빠름) 서블릿에서 상속받은 HttpServletRequest, HttpServletResponse 클래스 안의 객체들을 사용할 수밖에 없다. (인스턴스 변수명이 이미 서블릿 안에서 지정되어 있다는 이야기)

 

별도의 import 없이 자유롭게 사용이 가능하고 스크립트릿 내에서 변수 이름으로 사용해서는 안 된다.

 

 

2. 속성

 범위

선언부

설명

 Page

pageContext

현재 페이지 내

해당 페이지가 클라이언트에 서비스를 제공하는 동안만 유효

 Request

request

클라이언트로부터 요청을 받아 처리하는 동안

( forward, include 이용시 여러 페이지에서 요청 정보가 유지되므로 request 영역의 속성을 여러 페이지에서 공유 가능 )

 Response

response 

클라이언트로 요청을 보내는 동안

request 객체와 반대의 속성

헤더 정보 설정, 오류 발생, 쿠키 추가 등에도 쓰임

 Session

session

한 브라우저 내 세션이 유지되는 동안

1 브라우저당 1 세션이 생성되므로 같은 웹 브라우저 내에서 실행되는 페이지들이 속성을 공유 가능

 Application

application

해당 웹 애플리케이션이 start -> stop 될 때까지

가장 범위가 큼

 

 

- removeAttribute(key) : 해당 정보 제거. key 값으로 등록된 속성을 제거

'BackEnd > Java' 카테고리의 다른 글

Servlet :: 필터 (Filter)  (1) 2016.06.10
Java :: Random 함수  (0) 2016.06.05
Java :: JDBC DAO 소스  (0) 2016.04.26
Java :: 패키지 이름 명명 규칙  (0) 2016.04.02
Servlet :: Servlet(서블릿) 이란?  (0) 2016.04.01

1. phpMyAdmin에 root로 접속한다.

 

 

 

 

2. (생성한 user와 연동할) db를 먼저 생성한다.

 

 

 

db를 생성하면 이렇게 db를 생성했다는 화면이 뜬다.

 

 

3. user를 생성한다.

 

 

왼쪽 메뉴 부분에 mysql > user > 삽입 을 클릭한다.

 

* Host : localhost(본인 컴퓨터에서 접속하므로 왠만하면 localhost로 입력)

  User : 아이디

  Password : 비밀번호, password 함수를 선택하여 암호화를 시킨다.

 

 

4. 계정과 db 연동

 

 

db > 삽입 을 클릭한 뒤,

 

* Host : localhost

  Db : (생성되어 있는 연동할 db 이름)

  User : db와 연동할 계정 id

권한은 전부 Y를 클릭한다.

 

 

5. mysql 재시작

 

 

 

6. 연동한 계정으로 로그인

 

 

1
2
3
4
5
<insert id="insert" parameterType="com.vo.Member" useGeneratedKeys="true" keyProperty="id">
        INSERT INTO members
        (password) 
        VALUES (password(#{password}));
</insert>
cs

 

password나 주민등록번호 같은 경우 암호화를 하여 저장해야 할 때가 있다.

INSERT INTO 테이블명 컬럼명 VALUES password(암호화할 문자열); 을 하면 된다.

1. export

phpAdmin에 접속한 뒤 export할 해당 테이블의 위에 있는 '내보내기'버튼을 누르고,

 

 

단에 있는 '파일로 저장' 부분에서 zip 압축을 클릭한 뒤 '실행' 버튼을 누르고 저장 경로를 설정 후 다운받는다.

설정한 경로에 가보면 sql 텍스트 파일로 안에 있는 테이블 정보를 확인할 수 있다.

 

 

2. import

import를 하기 전에, 데이터베이스 내에 동일한 이름으로 된 테이블이 존재하면 안 된다.

 

1) phpMyAdmin에서 import

 

 

데이터베이스를 클릭 >  'Import' > SQL 텍스트파일의 위치 찾아보기 > 압축을 푼 sql 파일 선택 > 업로드 > 실행 

 

 

성공적으로 import 되었음을 확인할 수 있다.

 

 

2) 명령 프롬프트 창에서 import

 

압축을 푼 sql 파일을 특정 경로에 놓고 명령 프롬프트에서 sql 파일이 있는 경로로 이동한다.

그 후 mysql -u 계정이름 -p 데이터베이스명 < 파일명.sql 을 하면 원하는 테이블을 import할 수 있다.

Servlet + jstl + JDBC 를 이용한 게시판 소스 중 JDBC DAO 파일 소스 전문 JDBC를 공부하다가, 

Mybatis로 발전해서 게시판 프로젝트 공부를 했었는데

다시 JDBC를 이용하여 혼자 힘으로 해보려니 조금 어려운 면이 있기도 했다.

 

확실히 Mybatis가 편하다.

 

 

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
package com.dao;
 
import java.sql.*;
import java.util.*;
 
import com.vo.Person;
 
public class PersonDAO implements PersonDAOImpl {
 
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    
    String url = "jdbc:mysql://localhost:3306/basicjsp?useUnicode=true&amp;characterEncoding=utf8&amp;zeroDateTimeBehavior=convertToNull";
    String id = "jspid";
    String pass = "jsppass";
    
    String sql = "";
        
    public void connectDB() {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            
            conn = DriverManager.getConnection(url, id, pass);
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    @Override
    public List<HashMap<String, Object>> selectAll() {
        List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
    
        try {
            
            sql = "SELECT id, name, sex, age, DATE_FORMAT(date, '%Y-%m-%d') AS date, rcount FROM persons";
            
            pstmt = conn.prepareStatement(sql);
            rs = pstmt.executeQuery();
            
            while (rs.next()) {    
                connectDB();
                
                HashMap<String, Object> params = new HashMap<String, Object>();
                
                params.put("id", rs.getInt("id"));
                params.put("name", rs.getString("name"));
                params.put("sex", rs.getString("sex"));
                params.put("age", rs.getInt("age"));
                params.put("date", rs.getShort("date"));
                params.put("rcount", rs.getInt("rcount"));
                
                params.put("column""id");
                params.put("sort""ASC");
                
                list.add(params);
            }
            
            conn.close();
            pstmt.close();
            rs.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        
        return list;
    }
 
    @Override
    public List<HashMap<String, Object>> selectAllLimit(int offset, int recordsPerPage,
            String sortItem, String sortMethod) {
        List<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
         
        try {
            connectDB();
            
            sql = "SELECT id, name, sex, age, DATE_FORMAT(date, '%Y-%m-%d') AS date, rcount FROM persons ";
            
            if (sortItem != null && sortItem.equals("id")) {
                sql += "ORDER BY id ";
            }
            else if (sortItem != null && sortItem.equals("name")) {
                sql += "ORDER BY name ";
            }
            else
                sql += "ORDER BY age ";
            
            if (sortMethod != null && sortMethod.equals("ASC")) {
                sql += "ASC ";
            }
            else {
                sql += "DESC ";
            }
            
            sql += "LIMIT " + offset + ", " + recordsPerPage;
            
            pstmt = conn.prepareStatement(sql);
 
            rs = pstmt.executeQuery();
            
            while (rs.next()) {
                HashMap<String, Object> params = new HashMap<String, Object>();
                
                params.put("id", rs.getInt("id"));
                params.put("name", rs.getString("name"));
                params.put("sex", rs.getString("sex"));
                params.put("age", rs.getInt("age"));
                params.put("date", rs.getString("date"));
                params.put("rcount", rs.getInt("rcount"));
                
                params.put("offset", offset);
                params.put("recordsPerPage", recordsPerPage);
                params.put("sortItem", sortItem);
                params.put("sortMethod", sortMethod);
                
                list.add(params);
            }
            
            conn.close();
            pstmt.close();
            rs.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
        
        return list;
    } 
    
    @Override
    public Person selectById(int id) {
        Person person = new Person();
        
        try {
            connectDB();
            
            sql = "SELECT * FROM persons WHERE id = ?";
            
            pstmt = conn.prepareStatement(sql);
            
            pstmt.setLong(1, id);
            
            rs = pstmt.executeQuery();
            
            while (rs.next()) {
                person.setId(rs.getInt(1));
                person.setName(rs.getString(2));
                person.setSex(rs.getString(3));
                person.setAge(rs.getInt(4));
                person.setDate(rs.getString(5));
                person.setrCount(rs.getInt(6));
            }
            
            conn.close();
            pstmt.close();
            rs.close();
            
        } catch (Exception e) { }
        
        return person;
    }
 
    @Override
    public int selectCount() {
        int n = 0;
        
        try {
            connectDB();
            
            String sql = "SELECT COUNT(*) FROM persons";
            
            pstmt = conn.prepareStatement(sql);
            
            rs = pstmt.executeQuery();
            
            rs.next();
            
            n = rs.getInt(1);
            
            pstmt.close();
            rs.close();
            
        } catch (Exception e) { }
        
        return n;
    }
 
    @Override
    public int insert(Person person) {
        int id = -1;
        
        sql = "INSERT INTO persons (name, sex, age, rcount) VALUES (?, ?, ?, 0)";
        
        try {
            connectDB();
            
            pstmt = conn.prepareStatement(sql);
            
            pstmt.setString(1, person.getName());
            pstmt.setString(2, person.getSex());
            pstmt.setInt(3, person.getAge());
            
            pstmt.executeUpdate();
            
            pstmt.close();
            conn.close();
        }
        catch (SQLException e) {
            e.printStackTrace();
        }
        
        return id;
    }
 
    @Override
    public void update(Person person) {    
        sql = "UPDATE persons SET name = ? , sex = ?, age = ? WHERE id = ?";
        
        try {
            connectDB();
            
            pstmt = conn.prepareStatement(sql);
            
            pstmt.setString(1, person.getName());
            pstmt.setString(2, person.getSex());
            pstmt.setInt(3, person.getAge());
            pstmt.setInt(4, person.getId());
            
            pstmt.executeUpdate();
            
            pstmt.close();
            conn.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public void updateCount(int id) {    
        sql = "UPDATE persons SET rcount = rcount + 1 WHERE id = ?";
        
        try {
            connectDB();
            
            pstmt = conn.prepareStatement(sql);
            
            pstmt.setInt(1, id);
            
            pstmt.executeUpdate();
            
            pstmt.close();
            conn.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Override
    public void delete(int id) {
        sql = "DELETE FROM persons WHERE id = ?";
        
        try {
            connectDB();
            
            pstmt = conn.prepareStatement(sql);
            
            pstmt.setInt(1, id);
            
            pstmt.executeUpdate();
            
            pstmt.close();
            conn.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }    
    }
}
cs

 

 

- selectAll : 리스트 전체 출력 메소드

- selectAllLimit : 정렬 방식에 따라 변경되는 리스트 출력 메소드

if문과 LIMIT 를 이용한 쿼리를 구현하는데에서 시행착오가 조금 있었다.

- selectById : 특정 게시글을 선택했을 때 해당 글 하나의 정보만을 출력하는 메소드

- selectCount : 전체 리스트 수를 출력하는 메소드

- insert : 게시글 삽입 메소드

- update : 게시글 수정 메소드

- updateCount : 게시글 조회수 증가 메소드

- delete : 게시글 삭제 메소드

'BackEnd > Java' 카테고리의 다른 글

Java :: Random 함수  (0) 2016.06.05
Jsp :: jsp 내장객체  (0) 2016.06.03
Java :: 패키지 이름 명명 규칙  (0) 2016.04.02
Servlet :: Servlet(서블릿) 이란?  (0) 2016.04.01
Java :: 다형성  (1) 2016.03.23

앱 어플리케이션을 구분하는 역할을 함

 

 

1. com.회사이름.프로젝트이름

 

2. com.회사이름.플랫폼.프로젝트이름

 

3. kr.co.회사이름.프로그램이름

 

4. kr.co.회사이름.플랫폼.프로젝트이름

 

 

회사 이름이나 혹은 도메인(url) 등은 유니크하기 때문에 사이트명으로 많이 구분함

웹사이트 주소를 반대로 기재한 모양으로 패키지 이름을 부여함

명칭 소문자 사용

패키지명에 대문자는 사용하지 않는게 좋음

소스 파일들을 각각의 그룹으로 구분하기 위해 점으로 구분

패키지 이름에 따라 소스가 들어가는 폴더가 자동으로 만들어짐

'BackEnd > Java' 카테고리의 다른 글

Jsp :: jsp 내장객체  (0) 2016.06.03
Java :: JDBC DAO 소스  (0) 2016.04.26
Servlet :: Servlet(서블릿) 이란?  (0) 2016.04.01
Java :: 다형성  (1) 2016.03.23
Java :: this  (0) 2016.03.21

1. 정의

javax.servlet / javax.servlet.http 패키지


네트워크 프로토콜과 무관하게 설계되었지만, 대부분 HTTP 프로토콜을 사용하는 웹 환경에서 동적인 컨텐츠를 만들 때 사용하는 기술

jsp는 서블릿 기술을 기반으로 탄생했고 복잡한 html 디자인으로 구성된 동적인 페이지를 만드는데 서블릿보다 좋은 생산성을 가짐


* javax.servlet.Serlvet 인터페이스 : 모든 서블릿이 구현해야 함

  javax.servlet.GenericServlet 추상클래스 : 대부분의 서블릿이 상속 받아야 함

  javax.servlet.http.HttpServlet 클래스 : http 프로토콜을 사용하는 서블릿이 상속 받아야 함


* GenericServlet은 개발자가 사용하기 편하도록 javax.servlet.ServletConfig 인터페이스로 구현하였음

 

 

2. 구성

ㄱ. Servlet 인터페이스

모든 서블릿은 Servlet 인터페이스를 구현해야 함

서블릿의 라이프사이클 메소드가 선언되어 있음

- init() : ServletConfig 인터페이스 객체를 인자로 전달 받는데, DD에 초기화 파라미터가 존재할 경

우 init(ServletConfig config) ~ 가 됨

- service()

- destroy()

ㄴ. GenericServlet 추상클래스

부모 클래스로 쓰이고 ServletConfig 인터페이스를 구현함

Servlet 인터페이스를 불완전하게 구현하기 때문에 service() 메소드는 Abstract로 선언해야 하고 GenericServlet은

추상 클래스가 됨

(ex. public abstract void service(       ,     ) ~ )

인자가 없는 init() 메소드는 편의상 추가되었음

=> init(ServletConfig config)의 경우 자식 클래스에서 오버라이딩응ㄹ 하려면 첫번째 줄에 super(config); 코드

넣어야 함

ㄷ. HttpServlet 클래스

요청 : HttpServletRequest / 응답 : HttpServletResponse



3. 동작 과정

ㄱ. 사용자의 url 요청

url 요청이 서블릿 요청이라는 것을 웹 서버가 알기 위해서는 사전에 웹서버 측에 url과 서블릿 클래스를 미리 매핑시켜 놓은 배포 서술자가 필요

(배포 서술자 : web.xml => 웹서버가 알아챌 수 있도록 적어놓은 파일)

ㄴ. request, response 객체 생성

웹 컨테이너는 지금 받은 요청을 처리하기 위해 HTTP 요청(request)을 처리하기 위한 request 객체와 HTTP 응답을 위한 response 객체를 생성

ㄷ. 서블릿 인스턴스와 스레드 생성

request, response 객체 생성 뒤 사용자의 url 요청이 어떤 서블릿 클래스를 필요로 하는지 배포 서술자를 통해 알아냄

- 한 번도 실행된 적 없는 경우 : 새로 인스턴스를 생성(메모리에 로드함)

init() 메소드를 실행하여 초기화한 뒤 스레드를 하나 생성함

- 이미 인스턴스가 존재할 경우 : 기존의 인스턴스에 스레드만 하나 새로 생성

 

* 각 서블릿 인스턴스는 웹컨테이너당 하나씩만 존재하므로 init() 메소드는 각 서블릿당 한 번씩만 호출됨

 

ㄹ. service() 메소드 호출, 서블릿 클래스 작성

스레드가 생성되면 각 스레드에서 Service() 메소드 호출

- get방식 : doGet() 메소드가 response.request 객체를 인자로 호출

- post방식 : doPost() 메소드가 response.request 객체를 인자로 호출

ㅁ. 응답과 스레드의 소멸

doGet, doPost 메소드가 호출되어 사용자 요청에 따른 동적 웹페이지를 생성하면 그 결과물이 담긴 request 객체를

웹컨테이너가 HTTP response 형태로 바꿔 웹서버로 전송

사용이 끝난 request, response 객체를 소멸시키고 스레드 종료

 

* 클라이언트가 url 요청

  => 웹서버 : 요청된 서블릿 확인 후 컨테이너로 요청

  => 컨테이너 : request, response 생성 후 web.xml참조하여 해당 서블릿의 스레드 생성 후 service 메소드 호출

  => sevice() 메소드에서 요청 방식에 따라 doGet, doPost 메소드 호출

  => doGet, doPost 메소드에서 응답 생성

'BackEnd > Java' 카테고리의 다른 글

Java :: JDBC DAO 소스  (0) 2016.04.26
Java :: 패키지 이름 명명 규칙  (0) 2016.04.02
Java :: 다형성  (1) 2016.03.23
Java :: this  (0) 2016.03.21
Java :: 상속(Inheritance)  (0) 2016.03.20

1. 정의

하나로 여러가지 일을 하는 것

 

* 상속과 함께 사용되는 다형성의 기법들

- 오버라이딩 (Overriding)

- 추상 클래스(Abstract Class) 와 추상 메소드(Abstaract Method)

- 인터페이스 (Interface)

- 업캐스팅(Upcasting), 다운캐스팅(Downcasting)

 

 

2. Abstract

추상 메소드 : 미완성 클래스. 몸체가 없는 메소드를 포함하고 있음. 몸체가 없는 메소드의 선언부에 abstract 키워드를 사용해야 함

추상 클래스 : 추상 메소드를 포함하는 클래스

 

 

 

미완성 메소드를 포함하고 있기 때문에 클래스 자체가 미완성

 

ㄱ. 단점

- 완전한 클래스가 아니기 때문에 추상 클래스를 이용하여 객체 생성 불가

- 완전한 클래스로 만들기 위해서는 상속의 기법을 이용하여 추상 메소드를 구현해야 함

=> 추상 클래스를 상속받아 모든 추상 메소드를 구현 (상속을 통해 추상 메소드를 전부 구현해야만 객체 생성 가능)

=> 추상 메소드를 모두 구현하지 않으면 다시 abstract 클래스가 됨

 

 

<추상 클래스인 Example044를 상속하여 추상 메소드를 구현함>

 

 

<메인 메소드에서 상속된 클래스의 객체를 불러옴>

 

 

 

3. 인터페이스 (Interface)

골격만 가지고 있는 클래스. 몸체 없는 메소드(추상 클래스)의 집합 (구현된 메소드가 아예 들어가지 못함)

 

* 추상 클래스 : 일부분이 추상 메소드, extends 이용하여 추상 메소드 구현

  인터페이스 : 전체가 구현되지 않은 추장 메소드로 이루어진 클래스, implements 이용하여 추상 메소드 구현

 

인터페이스 내의 모든 메소드들은 구현을 목적으로 하기 때문에 디폴드로 public 속성을 가지고 있다

(일반 클래스는 디폴트가 private이다)

 

추상 메소드로 이루어져 있지만 멤버 변수로 static 상수는 포함시킬 수 있다 => static 전역 상수 변수가 됨

 

 

 

 

4. 업캐스팅 (Upcasting)

하위 클래스의 객체가 상위 클래스의 형으로 캐스팅되는 것

별도의 작업 없이 형만 정확하다면 자동으로 캐스팅됨

추상클래스, 인터페이스의 업캐스팅도 같음

다형성의 극대화

 

* 업캐스팅과 연결되는 기술들 : 상속, 오버라이딩, 가상 메소드, 추상 클래스, 인터페이스

 

 

 

 

* 캐스팅 (Casting)

기본 데이터 타입 : 큰 데이터 타입의 데이터를 작은 데이터 타입에 할당시 데이터의 손실 발생

클래스 : 하위 클래스의 객체를 사우이 클래스 형의 객체로 캐스팅하는 것이 가능

 

 

 

 

'BackEnd > Java' 카테고리의 다른 글

Java :: 패키지 이름 명명 규칙  (0) 2016.04.02
Servlet :: Servlet(서블릿) 이란?  (0) 2016.04.01
Java :: this  (0) 2016.03.21
Java :: 상속(Inheritance)  (0) 2016.03.20
Java :: 생성자(Constructor)  (0) 2016.03.18

+ Recent posts