스탭코딩

안녕하세요 스탭코딩 게시글 작성자 페이퍼클립입니다.


웹이서 클라이언트가 사용하는 브라우저의 정보는 html의 header에 저장됩니다.


클라이언트의 브라우저 정보를 확인 하는 방법은 크게 3가지가 있습니다.


1. JavaScript를 이용한 정보 호출


1
2
3
4
5
6
<head>
<script>
    var userAgentInfo = window.navigator.userAgent;
    document.write(userAgentInfo);
</script>
</head>
cs



2. JSP(java code)를 이용한 정보 호출


1
2
3
4
5
6
<body>
    <%
        String userAgentInfo = request.getHeader("User-Agent");
        out.print(userAgentInfo);
    %>
</body>
cs



3. JSTL을 이용한 정보 호출


1
2
3
4
5
6
7
8
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<body>
    <c:set var="userAgentInfo" value="${header['User-Agent']}" />
    <c:out value="${userAgentInfo}" />
</body>
</html>
cs

 



[ 호출 결과 ]



Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36



저는 크롬으로 페이지(리소스)를 실행하여 위와 같은 결과를 얻었습니다. (브라우저별 호출 결과는 아래 링크한 모질라 홈페이지에서 확인 할 수 있습니다)


아래에 호출 결과를 분석하는 내용 추가했습니다.


내용과 저의 호출 결과를 보면 저의 브라우저는 모질라 기반으로 시스템은 원도우 NT 10.0 64비트 버전을 사용하고 있고  Gecko기반과 유사한 애플웹킷, 크롬, 사파리 중 하나의 브라우저를 사용한다는 의미입니다. 세 브라우저는 모우 호환가능 한것으로 판단됩니다.








  • Mozilla/5.0 는 일반적으로 사용 브라우저가 모질라와 호환가능 함을 의미하며, 현재 대부분의 브라우저에 해당합니다.
  • platform 은 브라우저가 실행중인 기본 플랫폼과 휴대전화(윈도우, 맥 리눅스, 안드로이드 등) 인지 여부를 나타냅니다. 파이어 폭스 OS폰은 단순히 Mobile이라고 표시됩니다. 플랫폼은 여러 개의 세미콜론으로 설명됩니다.
  • rv:geckoversion은 Gecko의 출시 버전을 나타냅니다(예:"17.0"). 최근 브라우저에서 geckoversion은 파이어폭스 버전과 동일합니다.
  • Gecko/geckotrail 은 브라우저가 Gecko을 기반으로한다는 것을 나타냅니다.
  • 데스크톱에서 geckotrail 은 고정 문자열 "20100101"입니다.
  • Firefox/firefoxversion은 브라우저가 Firefox입을 나타내며 "17.0"은 버전을 의미합니다.



검색중에 User-Agent와 관련해서 자세히 블로깅해 둔 페이지가 있어서 링크합니다. http://ohgyun.com/292




출처 : 모질라 (https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/User-Agent)


안녕하세요 스탭코딩 글 게시자 페이퍼클립입니다.




자바 코딩을 하다보면 객체를 필요 이상으로 생성하는 경우가 있는데 싱글톤 패턴을 사용하여 if문을 통해 같은 객체를 중복해서 생성하는 경우를 방지 할 수 있습니다




싱글톤 클래스의 생성자는 보통 아래와 같이 코딩됩니다.



1
2
3
4
5
public class Singleton {
 
       public Singleton() {
       }
}
cs



 


그러나 아래와 같이 싱글톤 패턴을 사용 할 경우 동일한 객체를 한번만 생성하게 되어 메모리 관리를 효율 적으로 할 수 있습니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class Singleton {
 
 
 private static Singleton instance;
 
 
       public static Singleton getInstance() {
 
              if (instance == null) {
 
                    instance = new Singleton();
 
              }
 
              return instance;
       }
 
       private Singleton() {
 
       }
 
}
cs




위 예제를 토대로 설명하겠습니다.




 [STEP 1. 생성자를 private 변경하기]


public 이었던 접근 한정자를 private로 변경하여 외부에서 new 키워드를 이용하여 객체를 생성 할 수 없게 방지합니다.


 



[STEP 2. private static으로 필드 생성하기]



외부에서 필드를 변경, 수정 할수 없도록 private 접근 한정자를 사용하고 외부에서 메소드를 바로 호출 할수 있도록 static으로 인스턴스화 해줍니다.





[STEP 3. 객체를 생성하는 메소드 만들기]


static으로 인스턴스화 해주고 public 접근 한정자를 사용하여  외부 클래스에서 메소드를 호출 할 수 있도록 합니다.


메소드 내용은 if 문으로 앞에서 만들어둔 필드가 null 일 경우(객체를 가리키고 있지 않은 경우)만 새로운 객체를 생성하여 리턴 하도록 합니다.


안녕하세요 스탭코딩 게시글 작성자 페이퍼클립입니다.


HTML에서 파일을 업로드 하기 위해서는 cos.jar 파일이 필요합니다

http://www.servlets.com/cos/ 에서 다운 받으셔도 되고 첨부해둔 파일을 다운 받아도 됩니다.


cos.jar


받은 파일은 프로젝트의 WEB_INF 아래 lib 폴더에 복사해 주세요


파일업로드를 위해 upload.jsp와 upload_result.jsp 파일을 준비했습니다.



[upload.jsp]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp"%>
<script src="${pageContext.request.contextPath}/include/jquery-3.1.1.min.js"></script>
<script>
    
</script>
</head>
<body>
    <h2>파일 업로드 예제</h2>
    <form name="form1" method="post" enctype="multipart/form-data" action="upload_result.jsp">
        파일1 : <input type="file" name="file1"><br
        파일2 : <input type="file" name="file2"><br
        <input type="submit" value="업로드">
    </form>
</body>
</html>
cs



[upload_result.jsp]


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
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@ page import="java.io.*"%>
<%@ page import="com.oreilly.servlet.*"%>
<%@ page import="com.oreilly.servlet.multipart.*"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<%@ include file="../include/header.jsp"%>
<script src="http://code.jquery.com/jquery-3.2.1.min.js"></script>
</head>
<body>
 
    <%
        
        String upload_path = "D:/upload";
        int size = 10 * 1024 * 1024; 
        String filename = "", filename2 = "";
        int filesize = 0, filesize2 = 0;
        try {
            
            MultipartRequest multi = new MultipartRequest(request, upload_path, size, "utf-8", new DefaultFileRenamePolicy());
                
            Enumeration files = multi.getFileNames();
            String file1 = (String) files.nextElement();  
            String file2 = (String) files.nextElement();  
        
            filename = multi.getFilesystemName(file1);  
            File f1 = multi.getFile(file1);
        
            filesize = (int) f1.length(); 
        
            filename2 = multi.getFilesystemName(file2);
            File f2 = multi.getFile(file2);
        
        
            filesize2 = (int) f2.length();
        } catch (Exception e) {
            e.printStackTrace();
        }
    %>
 
 
    파일1 이름 :    <%=filename%><br
    파일1 크기 :    <%=filesize%><br
    파일2 이름 :    <%=filename2%><br
    파일2 크기 :    <%=filesize2%><br>
    
</body>
</html>
cs



[STEP1 form태그 작성하기]


파일 업로드를 위해 upload.jsp에서 form 태그를 작성합니다. cos.jar 파일을 이용해 파일을 업로드 하기 위해서는 반드시  method를 post 방식으로, 인코딩타입을 multipart/form-data로 해야 합니다. action 속성으로 버튼 클릭시 upload_result.jsp로 (데이터를 가지고)이동하게 합니다.



[STEP2 upload_result.jsp 임포트]

cos.jar 파일을 이용하기 위해서 <%@ page import="com.oreilly.servlet.*"%>와 <%@ page import="com.oreilly.servlet.multipart.*"%>를 임포트 합니다. 

첨부파일을 받아 오기 위해 사용 될 File 클래스와 Enumeration 클래스를 위해 <%@ page import="java.util.*"%>와 <%@ page import="java.io.*"%>를 입포트 합니다.


[STEP3 MultipartRequest 객체 생성하기]

  
upload_result.jsp 페이지 이동 후 form으로 보낸 데이터를 업로드하기 위해서 

MultipartRequest 클래스의 객체를 만들어야 합니다. 멀티파트리퀘스트의 객체 생성자의 의미는 아래와 같습니다. 

new MultipartRequest(request객체,업로드경로 ,최대사이즈, 파일이름 인코딩방식 , 파일이름중복되었을때의 처리방식)
※최대 사이즈 단위는 byte 


[STEP4 form에서 보낸 데이터 받아오기]


첨부파일 집합 생성(클라이언트로 부터 받아 온 파일 이름의 집합)
Enumeration files = multi.getFileNames();

개별 파일의 이름 받아오기
String file1 = (String) files.nextElement();  
String file2 = (String) files.nextElement();  

업로드한 파일 이름 가져오기(서버로 부터 파일 이름 가져오기)
String filename = multi.getFilesystemName(file1);

파일 크기 구하기  (long타입으로 구하지기 때문에 int형으로 형변환함)
int filesize = (int) f1.length();

[STEP5 파일 이름과 크기 출력하기 ]

파일1 이름 : <%=filename%> 

파일1 크기 : <%=filesize%>