java.util.regex 패키지에 있는 Match 클래스와 Pattern 클래스를 사용하여 문자열을 정규표현식으로 검증할 수 있다.

 

boolean bln = Pattern.matches("^[a-zA-Z0-9]*$", this.input);

 


정규표현식은 다음과 같은 문법으로 되어 있다.

^ : 문자열의 시작을 나타냄.

$ : 문자열의 종료를 나타냄.

. : 임의의 한 문자를 나타냄. (문자의 종류는 가리지 않는다)

| : or를 나타냄.


? : 앞 문자가 없거나 하나있음을 나타냄.

+ : 앞 문자가 하나 이상임을 나타냄.

* : 앞 문자가 없을 수도 무한정 많을 수도 있음을 나타냄.


 만약, .* 으로 정규식이 시작한다면 시작하는 문자열과 같은 문자열이 뒤에 없거나 많을 수도 있는 경우에만 일치를 시킨다. 즉, abc 일 경우 시작문자인 a를 기준으로 a가 없을경우와 a가 무한정 많은 경우에도 true를 반환하기 때문에 abc의 경우는 true를 반환한다.


[] : 문자 클래스를 지정할 때 사용한다. 문자의 집합이나 범위를 나타내면 두 문자 사이는 '-' 기호로 범위를 나타낸다. []내에서 ^ 가 선행하여 나타나면 not 를 나타낸다.


{} : 선행문자가 나타나는 횟수 또는 범위를 나타낸다.

a{3} 인 경우 a가 3번 반복된 경우를 말하며, a{3,}이면 a가 3번 이상 반복인 경우를 말한다. 또한 a{3,5}인 경우 a가 3번 이상 5번 이하 반복된 경우를 나타낸다.



\w : 알파벳이나 숫자

\W : 알파벳이나 숫자를 제외한 문자

\d : 숫자 [0-9]와 동일

\D : 숫자를 제외한 모든 문자


 

기본적인 문자열 검증 정규식)

^[0-9]*$  :  숫자만

^[a-zA-Z]*$  :  영문자만

^[가-힣]*$  :  한글만

^[a-zA-Z0-9]*$  :  영어/숫자만


 

정규식 표현 예제)

이메일 : ^[a-zA-Z0-9]+@[a-zA-Z0-9]+$  or  ^[_0-9a-zA-Z-]+@[0-9a-zA-Z-]+(.[_0-9a-zA-Z-]+)*$


휴대폰 :  ^01(?:0|1|[6-9]) - (?:\d{3}|\d{4}) - \d{4}$


일반전화 : ^\d{2,3} - \d{3,4} - \d{4}$


주민등록번호 : \d{6} \- [1-4]\d{6}


IP 주소 : ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3}) \. ([0-9]{1,3})


Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

Directive 문법 <%@ include file="파일 위치" %> 와

Action Tag <jsp:include page="파일위치" /> 의 차이점



예> main.jsp  sub_1.jsp  sub2.jsp 가 있다고 가정

Directive 문법을 이용한 include 는 main.jsp 에 sub1.jsp sub2.jsp 이 함께 합쳐져서 컴파일되므로 중복된 변수를 쓸수없다.


하지만


Action Tag 문법을 이용한 include는 모든페이지가 따로 컴파일되고 메인에서 필요할때마다 가져다 쓰는것이기때문에 중복된 변수 사용이 가능하다.




    main.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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<!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=EUC-KR">
<title>Insert title here</title>
</head>
<body>
<%
    int i;
    i = 10;
%>
 
<!-- Directive 문법을 통한 include -->
<%@ include file="../includes/header.jsp" %>
 
<hr/>
<h1>include 액션태그 예제1</h1>
이 페이지는 액션태그를 이용한 인클루드를 사용하고 있습니다.
<hr/>
 
<!-- Action Tag를 통한 include -->
<jsp:include page="../includes/footer.jsp"/>
 
</body>
</html>





  header.jsp
1
2
3
4
5
6
7
8
9
10
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h2>여기는 헤더의 내용입니다.</h2>
<b>작성 : 홍길동</b>
<br/>
 
<!-- 만약 i변수를 새로 주면 에러가 남 main.jsp에서 header.jsp를 
    Directive 문법으로 include 했기때문 -->
<!-- i를 출력 -->
i = <%=i%>



    footer.jsp
1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<h2>여기는 푸터의 내용입니다.</h2>
<div align="right">&copy;Copyright reserved</div>
 
<!-- main.jsp 에서 footer.jsp를 Action Tag로 include 를 했기때문에 
    같은 i변수로 지정이 가능하다 -->
<%
    int i;
    i= 20;
%>
i = <%= i %>



Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

1. session과 application의 차이점

session은 각 개인 클라이언트만 사용할 수 있는 전용 메모리

application은 서버가 처음동작할 때 딱 하나 만들어져서 모든사용자가 공동으로 사용할수있는 메모리 


세션 저장
1
2
3
<%
         session.setAttribute("sessionVal""이것은 세션변수에 값을 저장한 내용입니다.");    
%>

세션사용

1

<%=    session.getAttribute("sessionVal") %>


application저장
1
2
3
<%
         application.setAttribute("sessionVal""이것은 세션변수에 값을 저장한 내용입니다.");    
%>

application사용

1

<%=    application.getAttribute("sessionVal") %>


사용 방법은 비슷하지만 세션은 다른컴퓨터에서는 저장된값을 불러올 수 없다.
반면 application에서는 저장된것을 불러올 수 있다



2. application의 다른 사용방법 web.xml의 <context-param> 

application객체를 통해서 꺼내 쓸수있는 그런 데이터를 저장하는 엘리먼트


web.xml 파일에 설정
1
2
3
4
5
<context-param>
      <param-name>adminEmail</param-name>
      <param-value>admin@admin.com</param-value>
  </context-param>
 



   JSP 파일에서 사용
1
<%=application.getInitParameter("adminEmail") %>





웹에서 세션(session)의 사용


1. 세션(session)의 개요


쿠키가 웹 브라우저에 사용자의 상태를 유지하기 위한 정보를 저장했다면, 세션(session)은 웹 서버 쪽의 웹 컨테이너에 상태를 유지하기 위한 정보를 저장한다.


세션은 사용자의 정보를 유지하기 위해 javax.servlet.http 패키지의 HttpSession 인터페이스를 구현해서 사용한다. 쿠키는 사용자의 상태 유지를 위한 정보를 웹 브라우저에 저장해서 웹 서버가 쿠키 정보를 읽어서 사용한다.

이것은 웹 브라우저에 저장된 쿠키는 웹 서버에서 열어볼 수 있다는 점에서 보안상 문제가 발생할 수 있다.

따라서 사용자의 정보를 유지하기 위해서는 쿠키를 사용하는 것보다 세션을 사용한 웹 브라우저와 웹 서버의 상태 유지가 훨씬 안정적이고, 보안상의 문제도 해결할 수 있다.


세션은 웹 브라우저 당 1개씩 생성되어 웹 컨테이너에 저장된다.




웹 서버는 각각의 웹 브라우저로부터 발생한 요청에 대해서 특별한 식별자를 부여한다. 이후에 이 식별자를 웹 브라우저에서 발생한 요청들과 비교해서 같은 식별인지를 구별하게 된다. 이 특별한 식별자에 특정한 값을 넣을 수 있으며, 이것을 사용해서 세션을 유지하게 된다.



2. 세션(Session) 메소드 리스트


 메소드 이름

리턴 타입 

설명 

getAttribute(String name) 

 java.lang.Object

 세션 속성명이 name인 속성의 값을 Object 타입으로 리턴한다. 해당 되는 속성명이 없을 경우에는 null 값을 리턴한다.

getAttributeNames() 

java.util.Enumeration 

 세션 속성의 이름들을 Enumeration 객체 타입으로 리턴한다.

getCreationTime() 

long 

1970년 1월 1일 0시 0초를 기준으로 하여 현재 세션이 생성된 시간까지 경과한 시간을 계산하여 1/1000초 값으로 리턴한다. 

getId() 

java.lang.String 

세션에 할당된 고유 식별자를 String 타입으로 리턴한다. 

getMaxInactiveInterval()

int 

현재 생성된 세션을 유지하기 위해 설정된 세션 유지시간을 int형으로 리턴한다.

invalidate() 

void 

현재 생성된 세션을 무효화 시킨다.

removeAttribute(String.name)

void 

세션 속성명이 name인 속성을 제거한다. 

setAttribute(String name, Object value)

void 

세션 속성명이 name인 속성에 속성값으로 value를 할당한다. 

setMaxInactiveInterval(int interval) 

void 

세션을 유지하기 위한 세션 유지시간을 초 단위로 설정한다. 





3. 세션(Session)의 속성


- 세션의 속성 설정은 session 객체의 setAttribute() 메소드를 사용한다.


session.setAttribute("id", "value");


이때 주의할 사항은 세션의 속성 값은 객체 형태만 올 수 있다는 것이다.

session 객체는 웹 브라우저와 매핑되므로 해당 웹 브라우저를 닫지 않는 한 같은 창에서 열려진 페이지는 모두 같은 session 객체를 공유하게 된다. 따라서 session 객체의 setAttribute() 메소드를 사용해서 세션의 속성을 지정하게 되면 계속 상태를 유지하는 기능을 사용할 수 있게 된다.



- 세션의 속성을 사용하려면 session 객체의 getAttribute() 메소드를 사용한다.


String id = (String)session.getAttribute("id");


getAttribute() 메소드는 리턴 타입이 Object 타입이므로 사용 시 실제 할당된 객체 타입으로 형변환(casting)을 해야 한다.


- 세션의 속성을 삭제하려면 session 객체의 removeAttribute() 메소드를 사용한다.


session.removeAttribute("id");


- 세션의 모든 속성을 삭제할 때는 session 객체의 invalidate() 메소드를 사용한다.


session.invalidate();







4. 세션(Session) 사용 예제


- 세션(Session) 설정 (로그인 성공시에 로그인 아이디를 세션에 저장한다.)


<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>


<% request.setCharacterEncoding("euc-kr");%>


<%

String id = request.getParameter("id");                        // request에서 id 파라미터를 가져온다

String passwd = request.getparameter("passwd");      // request에서 passwd 파라미터를 가져온다.


--- 로그인 처리 ...   로그인 성공시 check 는 TRUE --


if(check){                                                        // 로그인 성공시


session.setAttribute("id", id);                 // 세션에 "id" 이름으로 id 등록

response.sendRedirect("main.jsp");               // 로그인 성공 메인페이지 이동


}else{%>                                                        // 로그인 실패

<script>

alert("로그인 실패");

history.go(-1);                                    // 이전 페이지로 이동

</script>

<%}%>


- 세션(Session) 가져오기 (세션에서 아이디를 가져와 로그인 상태를 인증하고, 값이 없을 경우 로그인 페이지로 넘긴다.)


<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>


<% request.setCharacterEncoding("euc-kr");%>


<%


String id = "";


try{

id = (String)session.getAttribute("id");            // request에서 id 파라미터를 가져온다


if(id==null||id.equals(""){                            // id가 Null 이거나 없을 경우

response.sendRedirect("loginform.jsp");    // 로그인 페이지로 리다이렉트 한다.

}

<%}%>


- 세션(Session) 제거하기 (로그아웃 시 현재의 세션 정보를 제거한다.)


<%@ page language ="java" contentType="text/html; charset=EUC-KR" pageEncoding="EUC-KR"%>


<% session.invalidate(); %>                         // 세션 정보 제거


<script>

alert("로그아웃 되었습니다.");

location.href="logout.jsp";                                    // 로그아웃 페이지로 이동

</script>



Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

최범균의 JSP2.2 웹프로그래밍 책을보다보니 Chapter17 답변형 게시판 구하기 를 보다보니

<c:if test="${listModel.totalPageCount > 0 }"> 요부분에서 분명히 listModel 이란 .java 파일도 없고
비슷한 이름의 ArticleListModel.java에 들어가도 totalPageCount가 없는거다 문론 gettotalPageCount는 있었다.
뭐지뭐지? 하고 검색을 해보니 내가 공부해놓고 잃어버린거였다.. 더 집중해서 봐야겠네...


1
2
3
4
5
6
7
<c:if test="${listModel.totalPageCount > 0 }">    <!-- ${a.bcd} = a.getBcd 와 같다 -->
    <!-- listModel의 설명 ${a.bcd} 는 a.getBcd() 메서드를 호출해서 값을 가져오게 됩니다.
        따라서, listModel.totalPageCount 는 listModel에 매칭되는 객체의 getTotalPageCount() 
        메서드를 호출하는 것과 같은 효과를 갖습니다.
        list.jsp 에서 ArticleListmodel 을 listModel 로 참조해하도록 만들었다.
        EL 부분 참조
     -->



listModel은 list.jsp 에


1
request.setAttribute("listModel",articleListModel);        //(객체명,객체)



이렇게 떡!!! 하니 articleListModel 을 listModel 로 참조해놨고...

${a.bcd} 는 a.getBcd 와 같은것이다!!! 

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

출처 : http://blog.daum.net/_blog/BlogTypeView.do?blogid=0K5ES&articleno=7866582&_bloghome_menu=recenttext#ajax_history_home


request.setAttribute() 와 request.getAttribute()


request.setParameter() 와 getParameter()를 이용하면 String의 값 밖엔 받을 수 없다. 
List를 받기 위해서는 setAttribute()와 getAttribute()를 써야 한다. 
이때 type이 Object 이기 때문에 반드시 형변환을 해줘야 한다.

 

혹시나 해서 문법도 쓴다.

 

action에서 객체를 request에 담을 때.

request.setAttribute("객체명", 객체);

 

이렇게 해서 jsp를 호출하면 jsp에서 "객체명"을 이용해서 객체를 받을 수 있다.

< %
Object x = request.getAttribute("객체명");
% >

 

Object 형으로 받는 다는 것. 핵심 포인트.

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

JDBC 프로그램의 일반적인 실행순서

1. JDBC 드라이버 로딩

2. 데이터베이스 커넥션 구함

3. 쿼리 실행을 위한 Statement 객체 생성

4. 쿼리실행

5. 쿼리실행 결과 사용

6. Statement 종료

7. 데이터베이스 커넥션 종료


예제

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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
<%@ page import = "java.sql.*" %>
 
<!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=EUC-KR">
<title>회원 목록</title>
</head>
<body>
MEMBER 테이블의 내용
<table width="100%" border="1">
<tr>
    <td>이름</td><td>아이디</td><td>이메일</td>
</tr>
<%
    //1. jdbc 드라이버 로딩
    Class.forName("com.mysql.jdbc.Driver");
 
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    
    try
    {
        String jdbcDriver = "jdbc:mysql://localhost:3306/chap12?" +
                "useUnicode=true&characterEncoding=euckr";
        String dbUser = "jspexam";
        String dbPass = "jspex";
 
        String query = "select * from MEMBER order by MEMBERID";
        
        //2.데이터베이스 커넥션 생성
        conn = DriverManager.getConnection(jdbcDriver, dbUser, dbPass);
        
        //3.Statements 생성 쿼리 실행을 위한
        stmt = conn.createStatement();
        
        //4.쿼리 실행
        rs = stmt.executeQuery(query);
        
        //5.쿼리 실행 결과 출력
        while(rs.next()){
%>
 
<tr>
    <td><%= rs.getString("NAME") %></td>
    <td><%= rs.getString("MEMBERID") %></td>
    <td><%= rs.getString("EMAIL") %></td>    
</tr>
<%
    }
    }
    catch(SQLException ex)
    {
        out.println(ex.getMessage());
        ex.printStackTrace();
    }
    finally
    {
        //6.사용한 Statement 종료
        if(rs != nulltry {rs.close();} catch(SQLException ex){}
        if(stmt != nulltry{stmt.close();}catch(SQLException ex){}
        
        //7.커넥션 종료
        if(conn != nulltry{conn.close();}catch(SQLException ex){}
    }
%>
</table>
</body>
</html>


자세한 내용은 최번균의 jsp2.2 웹프로그래밍 Chapter12  315 Page에 나와있다 




statement & preparedStatement


1. Statement 

String sqlstr = "SELECT name, memo FROM TABLE WHERE num = " + num 
Statement stmt = conn.credateStatement(); 
ResultSet rst = stmt.executeQuerey(sqlstr);

2. PreparedStatement 

String sqlstr = "SELECT name, memo FROM TABLE WHERE num = ? " 
PreparedStatement stmt = conn.prepareStatement(sqlstr); 
pstmt.setInt(1, num); 
ResultSet rst = pstmt.executeQuerey(); 

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

1. jstl 국제화태그 사용방법

1.톰뱃 7버전 JSTL 1.2 다운로드후 설치된 톰캣폴더의 lib 또는 현재 진행중인 WEB-INF/lib 밑에 넣어준다


javax.servlet.jsp.jstl-1.2.1.jar


javax.servlet.jsp.jstl-api-1.2.1.jar



2.리소스 번들 작성후 resource 폴더에 넣기

이클립스에서는 프로젝트 소스 디렉토리에 resource패키지를 생성한 뒤 넣기

이클립스가 아니라면 WEB-INF/classes/resource에 작성


예시>xxxxxx.properties 로 저장 (번들이름_언어_국가.properties 국가코드는 생략가능하고 영어는 언어국가 둘다 안씀)


1
2
3
4
TITLE = MadVirus's Learning JSP 2.2
GREETING = HI! I'm BK
VISITOR = your ID is {0}                  // {0} 이부분은 변경가능한 요소를 제공하는 위치
 


3. 사용할 jsp 파일 상단에

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" />



4. 예제파일


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
<%@ page language="java" contentType="text/html; charset=EUC-KR"
    pageEncoding="EUC-KR"%>
 
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>    //fmt 국제화 태그 사용준비
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>   // c 코어 태그 사용준비
 
<fmt:setBundle basename="chap16.resource.message" var="message" />   <!-- 사실 var="message 는 없어도됨 없애면 밑에도 다 없애야됨  -->
<!-- var가 있으면 출력되지않고 key 값을 저장  var가 없으면 바로 출력-->
<fmt:message bundle="${message }" key="TITLE" var="title" />    
 
<!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=EUC-KR">
<title>${title }</title>
</head>
<body>
 
<fmt:message bundle="${message }" key="GREETING" />
<br>
<c:if test="${! empty param.id }">      <!-- 파라메터가 비어있지않으면 메시지 출력 -->
    <fmt:message bundle="${message }" key="VISITOR">
        <fmt:param value="${param.id }" />
    </fmt:message>    
</c:if>
</body>
</html>

결과물은 
HI! I'm BK 
가 나옵니다

만약 주소 맨 뒤에 ?id=aaa를 넣어주면
결과물은
HI! I'm BK 
your ID is aaa

2. jstl 국제화태그 태그 사용


1.메시지 처리 태그


2.숫자 및 날짜 포맷팅 처리 태그

- <fmt:formatNumber> 태그(태그가 숫자를 문자열로 변환)

- <fmt:parseNumber> 태그(문자열을 숫자로 변환)


- <fmt:formatDate> 태그 (날짜정보를 담고있는 객체를 포맷팅하여 출력)

- <fmt:parseDate> 태그 (문자열로 표시된 날짜 및 시간의 값을 java.util.Date 로 파싱해주는 기능)

- <fmt:timeZone> 태그와 <fmt:setTimeZone>태그 (각나라마다의 시간대 별로 시간을 처리할수 있는 기능)

Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거

파일 입출력에서  if(var_byte == 10 || var_byte == 13) continue;    이부분이 왜 있는것인가 고민하다가 찾아보니 
아스키10번은 그줄의 맨 앞으로  13번은 바로 다음줄로 이동하는 코드였다 
그래서 저 코드가 나오면 다음코드를 읽지않고 바로 do{ 처음으로 가는것이다

ex> 

예를 들어....

 

Hi my name is _

 

... 라고 치고 _ 위치가 커서라고 치면....

 

Hi my name is

_

 

... 와 같이 커서가 다음 줄 첫번째 위치로 가려면 실제적으로

 

Hi my name is

                         _

 

... 와 같이 줄을 넘기고

 

Hi my name is

_

 

... 와 같이 옮긴 다음 줄의 처음으로 지이익 당기는 두단계로 이루어집니다.

 

여기서 다음 줄로 넘기는 것이 Line Feed 아스키코드 13 이고

옮기 다음 줄에서 제일 처음으로 지이익 당기는 것이 CR 아스키코드 10

... 이라고 생각하시면 무난하리라 생각됩니다.

 

printf 같은 곳에서 \n 의 개행문자로 위와 같은 동작을 하는데

문자는 \n 이지만 이에 대응되는 아스키코드는 CR+LF 라고 보아야 합니다.



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
import java.io.*;
 
public class Ex_Inputstream 
{
    
    public static void main(String[] args)
    {
        int var_byte=-1;
        
        System.out.println("값을 입력하세요 :");
        
        do
        {
            try
            {
                var_byte = System.in.read();
            }
            catch(IOException e)
            {
                e.printStackTrace();
            }    
            
             // 아스키코드 10=>     Line feed(줄 맨처음으로) 13=>다음줄로    
            if(var_byte == 10 || var_byte == 13) continue;        ← 이부분
            if(var_byte == -1) break;            
            System.out.println("읽은값 : "+(char)var_byte);            
        }
        while(true);
    }
 
}



알아본 김에 아스키코드표






Posted by 앗뜨거워 ( @bok3937 ) 앗뜨거


티스토리 툴바