'JSP'에 해당되는 글 28건

  1. 2013.07.29 Session
  2. 2013.07.29 Request
  3. 2013.07.29 JSP 개요
  4. 2013.07.29 연산자 검색
  5. 2013.07.29 달력
  6. 2013.07.29 MVC2 구현예제
  7. 2013.07.25 getParameterValues 처리
  8. 2013.07.25 아파치 톰캣 연동 & 이유
2013. 7. 29. 13:56

session 내부 객체



   session 객체는 클라이언트 용처에 관한 context 정보의 세션과 관련된 정보(데이터)를 저장하고 관리하는 내부 객체로 

   javax.servlet.http.HttpSection 클래스 타입이다.

session 객체는 웹브라우저(클라이언트) 당 1개가 할당되며, 사용자가 로그인후 세션을 설정 일정시간이 지난 경우 다시    사용자가 인증을 요구하거나 쇼핑몰에서 장바구니 기능 구현시, 사용자가 다녀간 페이지 확인 및 웹페잊 트래킹 구현 시 

사용된다.

또한 session 객체를 사용하는데 page지시어의 session 속성 값을 false로 설정하면 에러가 발생한다.

 


* JSP는 session에 직접 접근, 서블릿은 request가 갖고 있다.


서블릿에서 session에 접근

HttpSession session = req.getSession(); //세션에 클라이언트의 정보를 저장

session.setMaxInactiveInterval(60*30); //클라이언트의 요청이 없으면 (60초*30) 후 로그아웃

session.setAttribute("userId", dto.getUserId());
session.setAttribute("userName", dto.getUserName());
resp.sendRedirect(cp);
return;


EL에서 서블릿이 전달한 session에 접근

sessionScope.속성명


   ..로그아웃 상태 시 표시할 태그



   ..로그인 상태 시 표시할 태그


로그아웃

//세션에 저장된 정보를 삭제한다.
session.removeAttribute("userId");
session.removeAttribute("userName");

//세션의 모든 정보를 삭제하고 세션을 초기화
session.invalidate();

resp.sendRedirect(cp);



■ 주요 메소드

⋅String  getId()

각 접속에 대한 세션 고유  ID 를 문자열 형태로 반환

⋅long  getCreationTime()

세션이 생성된 시간을  January  1  ,1970 GMT 부터  long 형 밀리세컨드 값으로 반환

⋅long  getLastAccessedTime()

웹 브라우저의 요청이 마지막으로 시도된 시간을  long 형 ms 값으로 반환

⋅int  getMaxInactiveInterval()

세션 유지 시간을 초로 반환. 기본 값은  30분으로 지정된다.

⋅void  setMaxInactiveInterval(int  interval)

세션을 유지할 시간을  interval에 설정된 초 값으로 설정

⋅void  invalidate()

현재 세션을 종료. 세션관련 모든 값 삭제

⋅boolean  isNew()

클라이언트 세션  ID를 할당하지 않은 경우  true 값을 리턴 한다.



'JSP > Jsp 내장객체' 카테고리의 다른 글

JSP 내장객체의 스코프  (0) 2013.08.16
HTML 문서에서 인자로 사용  (0) 2013.08.16
EL 개요  (0) 2013.08.16
Request  (0) 2013.07.29
JSP 개요  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 13:50


String method = request.getMethod();
//: method 확인(get|post)
//: GET
 
String ip = request.getRemoteAddr();
//: 클라이언트 아이피주소
//: 127.0.0.1
 
String cp = request.getContextPath();
//: ContextPath(문맥경로)
//: /study
 
String url = request.getRequestURL().toString();
//클라이언트가 요청한 전체주소
//: http://localhost:9090/study/0222/test3_ok.jsp

String uri = request.getRequestURI();
//URI : cp부터 나머지 주소
//: /study/0222/test3_ok.jsp

String path = request.getScheme() + "://" + request.getServerName()
     + ":" + request.getServerPort() + request.getContextPath();
//path
//http://localhost:9090/study
 
String referer = request.getHeader("Referer");
if(referer==null)
 referer="";
//클라이언트의 이전 주소
//: http://localhost:9090/study/0222/test3.jsp

String lang = request.getHeader("Accept-Language");
//언어정보 : ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4

String bw = request.getHeader("User-Agent");
//브라우저, 운영체제정보
//Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.17 (KHTML, like Gecko) Chrome/24.0.1312.57 Safari/537.17



여부 (true/false 값)
       Secure Channel : <%= request.isSecure() %>

 □ 요청에 대한 URI, 컨텍스트 경로, 서블릿 경로, GET/POST 등의 메소드
  // User-Agent : 유저 에이전트는 브라우저 명 알기
  // Referer : 래퍼러는 전페이지 주소를 얻으며 전페이지가 없으면 null

String method = request.getMethod();

StringBuffer url = request.getRequestURL();
String uri = request.getRequestURI();

  /*
     // Tomcat 5.5 이후 forward 된 jsp 에서 getRequestURI() 메소드나 getRequestURL()
            //메소드의 값이 이상해진 경우
     
     예를 들어 서블릿 에서
     uri : cp/bbs/list.ation
     jsp 위치(포워딩 jsp) : /WEB-INF/views/bbs/list.jsp 인경우

     포워딩된 jsp에서 위 메소드를 사용하면

     /cp/WEB-INF/views/bbs/list.jsp
           http://localhost:8080/cp/WEB-INF/views/bbs/list.jsp 로 jsp가 존재하는 경로가 표시된다.
           
     하지만 서블릿에서 위 메소드를 사용하면

           /cp/bbs/list.ation
           http://localhost:8080/cp/bbs/list.ation 로 표시된다.

           만약 포워딩된 jsp에서 브라우저 주소를 가져오기 위해서는 다음 방법을 이용한다.

     String url=request.getAttribute("javax.servlet.forward.request_uri");

           - 기타 속성
             javax.servlet.forward.request_uri
             javax.servlet.forward.context_path
             javax.servlet.forward.servlet_path
             javax.servlet.forward.path_info
             javax.servlet.forward.query_string

         -  http://localhost:8080/study/jsp/test.jsp?name="hong" 에서의 출력 결과
            javax.servlet.forward.request_uri -> /study/jsp/test.jsp
            javax.servlet.forward.servlet_path -> /jsp/test.jsp
            javax.servlet.forward.context_path -> /studt
            javax.servlet.forward.path_info -> null
            javax.servlet.forward.query_string -> name="hong"
  */

String cp = request.getContextPath();
String path =request.getScheme()
+"://"+request.getServerName()+":"+request.getServerPort()+cp;
 String useBrowser = request.getHeader("User-Agent");
 String fileType = request.getHeader("Accept");
 String referer = request.getHeader("Referer");
 if(referer==null)
  referer="";


 □ include 된 페이지 uri가져올 경우
    <%= request.getAttribute( "javax.servlet.include.request_uri" ) %>

    기타 include 된 페이지 정보 구하기
    
    request.getAttribute("javax.servlet.include.query_string")
    request.getAttribute("javax.servlet.include.path_info")
    request.getAttribute("javax.servlet.include.servlet_path")
    request.getAttribute("javax.servlet.include.context_path")
    request.getAttribute("javax.servlet.include.request_uri")


 □ 세션 ID에 대한 정보
       Session ID : <%= request.getRequestedSessionId() %>
       Session ID from Cookie : <%= request.isRequestedSessionIdFromCookie() %>
       Session ID from URL : <%= request.isRequestedSessionIdFromURL() %>
       Session ID is still valid : <%= request.isRequestedSessionIdValid() %>

 □  Header 정보 보는 방법
       <%
           Enumeration eHeader = request.getHeaderNames();
       
           while(eHeader.hasMoreElements()) {
               String hName = (String)eHeader.nextElement();
               String hValue = request.getHeader(hName);
               
               out.println(hName + " : " + hValue);
           }
       %>
       
 □ Request 객체를 통해서 쿠키 정보 보는 방법
       <%
           Cookie cookies[] = request.getCookies();
       
           for(int i=0 ; i
       
  □ HTML 폼을 통해 넘어온 데이터를 받는 부분
       <%
           Enumeration eParam = request.getParameterNames();
       
           while(eParam.hasMoreElements()) {
               String pName = (String)eParam.nextElement();
               String pValue = request.getParameter(pName);
               
               out.println(pName + " : " + pValue);
           }
       %>

 □  attribute를 가져오는 부분
       <%
           Enumeration eAttr = request.getAttributeNames();
       
           while(eAttr.hasMoreElements()) {
               String aName = (String)eAttr.nextElement();
               String aValue = (String)request.getAttribute(aName);
               
               out.println(aName + " : " + aValue);
           }
       %>


 □  [[request로 넘어오는 데이타들]], form 에서 enctype="multipart/form-data" 인경우 만 사용 가능
    <%
         DataInputStream dis = new DataInputStream(request.getInputStream());
         String str;
         while((str = dis.readLine()) != null){
               out.println(new String(str.getBytes("ISO-8859-1"), "euc-kr")+"
"); // utf-8로 전송된 한글은 깨짐 } %>

■ request header 정보


□ Accept : 브라우저나 기타 클라이언트가 다룰 수 있는 MIME 형식들을 지정하는 것이다.

 

□ Accept-Charset : 브라우저가 사용할 수 있는 문자셋(ISO-8859-1)을 의미한다.

 

□ Accept-Encoding :  클라이언트가 원하는 인코딩 방식들을 의미한다. 문서를 네트웍 너머로 보내기에 적합한 형태로 

변환하는것 을 의미한다.

 

□ Accept-Language : 클라이언트가 원하는 기본 언어를 의미한다.  

 

□ Authorization : 헤더는 패스워드로 보호된 웹 페이지에 접근하려 하는 클라이언트가 자신의 신원 정보를 보내는 용도로 쓰인다.

 

□ Cache-Control : 프록시 서버에서의 캐시 설정을 의미한다.  

 

□ Connection : 클라이언트가 영속적 HTTP 연결을 처리할 수 있는지의 여부를 뜻한다.

 

□ Content-Length : post만 해당하는 것으로, post 데이터에 담긴 데이터의 크기를 의미한다.

 

□ Content-type : 주로 응답에서 쓰이지만, 클라이언트가 post나 put을 이용해서 어떤 문서를 첨부했다면 클라이언트 요청 안에 

포함되기도 한다.

 

□ Cookie : 서버가 브라우저에게 보냈던 쿠키를 다시 서버로 돌려 보낼 때 쓰인다.

 

□ Expect : 클라이언트가 바라는 서버의 행동이 어떤 것인지를 의미하는 헤더로 별로 쓰이지는 않는다.

 

□ From : HTTP 요청에 대해 책임이 있는 사람의 전자 우편주소이다.

 

□ Host : URL안에 호스트와 포트 번호로 브라우저는 반드시 이 헤더를 포함해야함. 브라우저가 원하는 구체적인 자원을 정확하게 

돌려주기 위한 용도로 쓰임.

 

□ If-Match : put요청에 해당하는 헤더

 

□ If-Modified-Since : 어떤 페이지의 최종 수정일시가 특정항 일시 이후인 경우만 그 페이지를 돌려 받기 원하는 경우 이헤더에 

그 일시를 헤더에 설정해서 요청한다.

 

 □ If-None-Match : If-Match와 반대

 

□ If-Range : 다운로드 관리자의 이어받기 기능에서 주로 이용된다. 어떤 하나의 문서의 일부분만을 가지고 있을 때 수정 일시를 

지정해서 그 일시 이후에 변한 것이 없으면 이미 가지고 있는 부분 이외의 것만 받게하고 아니면 문서 전체를 받는 용도로 쓰인다.

 

□ If-Unmodified-Since : If-Modified-Since 반대

 

□ Pragma : 헤더 값이 no-catch이면 프록시 서버 또는 하나의 프로시로서 작동하는 서블릿은 캐시에 복사본이 있다고 해도 

서버에서 처리한 response를 전달한다.

 

□ Procy-Authorization

 

□ Range : If-Range 와 비슷하다.

 

□ Referer : 이전 url정보를 얻을 때 사용하지만, 너무 믿으면 곤란하다.

 

□ Upgrade : 클라이언트가 서버에게 HTTP1.1 이상의 어떠한 프로토콜을 지정하는 용도로 쓰인다.

 

□ User-Agent : 브라우저의 소프트웨어 종류와 버전을 의미한다.   

 

□ Via : 요청이 거쳐간 중간 사이트들을 의미한다 주로 게이트웨이나 프록시 서버가 설정한다.  

 

□ Warning : 클라이언트가 캐싱이나 내용 변환 관련 에러게 대해 경고 할 때 쓰이는 헤더로 자주 쓰이지 않는다.   

'JSP > Jsp 내장객체' 카테고리의 다른 글

JSP 내장객체의 스코프  (0) 2013.08.16
HTML 문서에서 인자로 사용  (0) 2013.08.16
EL 개요  (0) 2013.08.16
Session  (0) 2013.07.29
JSP 개요  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 13:48

■ 주석(comment) 처리

● HTML 주석 : 클라이언트에게 전달된다.

<!-- 주석내용 -->


● JSP 주석 : 클라이언트에게 전달하지 않는다.

<%-- 주석내용 --%>


● 스크립릿 에서의 주석 

/** 주석내용 */

/* 주석내용 */

// 주석내용


■ directive, 디렉티브(지시어)  링크_디렉티브

디렉티브는 페이지에  대한 설정  정보를 지정하거나 클래스의 속성을  변경한다. 

<%@  디렉티브_이름 속성1="값1" 속성2="값2"  ... %>


● 주로 쓰이는 설정

 

<%@ Page import="java.util.Calendar" %>   // JSP의 import
 
<%@ page contentType="text/html; charset=UTF-8" %> 
// contentType = 생성할 문서 타입. 기본 값 
// "text/html" 서버가 클라이언트에 전송하는 문자인코딩
 
<%@ page trimDirectiveWhitespaces="true" %>
//JSP 2.1 버전에서는 page 디렉티브에 새롭게 추가된 속성으로
//불필요하게 생성되는 줄 바꿈 공백 문자를 제거 할 수 있다. 기본 값 : "false"
 
<%   String cp = request.getContextPath();  // ContextPath(문맥경로) : ex) .../study
    request.setCharacterEncoding("utf-8"); %>
// 페이지 자체의 캐릭터 인코딩 지정. 기본 값 : "ISO-8859-1"



● page 디렉티브와 속성

 : page는 페이지에 대한 기본 정보 입력(생성하는 문서의 타입, 출력 버퍼의 크기, 에러 페이지등. 현재 문서를 나타내는 객체다.

- language : 스크립트 코드에서 사용되는 프로그래밍 언어 지정. 기본 값 : "java"

- contentType : 생성할 문서 타입. 기본 값 : "text/html"

- import : 사용할 자바 클래스 지정

- session : 세션 사용 여부 지정("true" : 사용, "false" : 미사용). 기본 값 : "true"

- buffer : 출력 버퍼 크기 지정("none" : 미사용, "12kb" : 출력 버퍼 12kb 사용). 기본 값 : "8kb"

- autoFlush

 : 출력 버퍼가 다 찼을 경우 자동으로 버퍼에 있는 데이터를 출력 스트림에 보내고 비울지의 여부 

  ("true" : 버퍼의 내용을 웹 브라우저에 보 낸 후 버퍼 비움, "false" : 에러 발생시킴. 기본 값 : "true")

- info : 페이지에 대한 설명

- errorPage : 실행 도중 에러 발생 시 보여줄 페이지 지정

                     <%@ page contentType="text/html; charset=UTF-8" errorPage="e.jsp"%>

    //에러 발생 시 클라이언트에 e.jsp 를 보여준다. 안쓴다.

    // 이 방법으로 에러처리를 하게 되면 모든 페이지에 설정을 해야 함.

- isErrorPage : 현재 패이지가 에러가 발생할 때 보여 지는 페이지 인지의 여부("true" : 에러, "false" : 에러아님). 기본 값 : "false"

- pageEncoding : 페이지 자체의 캐릭터 인코딩 지정. 기본 값 : "ISO-8859-1"

- isELIgnored

 : JSP 2.0에 새롭게 추가된 내용 ("true" : EL 무시, "false" : EL 사용). 기본 값 : web.xml 파일이 사용하는 JSP 버전 및 설정에 따라 다름

- extends : JSP 페이지가 Servlet 소스로 변환되는 시점에서 자신이 상속 받을 클래스를 지정할때 사용. 거의 사용되지 않는 속성

- isThreadSafe : 하나의 JSP 페이지가 동시에 여러 브라우저의 요청을 처리할 수 있는지 여부를설정. 기본 값 : "true"

- trimDirectiveWhitespaces

 : JSP 2.1 버전에서는 page 디렉티브에 새롭게 추가된 속성으로 불필요하게 생성되는 줄 바꿈 공백 문자를 제거 할 수 있다. 기본 값 : "false"


● taglib

 : 태그 라이브러리(tag library). 사용자가 만든 태그 모음. taglib는 JSTL 항목 참조 바로가기


● include

 : 다른 문서를 포함하는 기능. include 지시어는 JSP에서 서블릿 코드를 생성할 때 텍스트나코드를 jsp 파일 안으로 포함 시키며 포함되는 파일의 내용은   include  지시어가 있는 위치에 삽입된다.  

<%@  include file="URL"%>  

include 디렉티브의 처리과정은 정적으로 include 지시자를 사용한 JSP 페이지가 컴파일 되는 과정에서 include 되는 JSP 페이지의 소스 내용을 그대로 포함해서 컴파일 한다.  즉, 복사 & 붙여넣기 방식으로 두개의 파일이 하나의 파일로 구성된 후 같이 변환되고 컴파일 된다.


하지만 다른 문서를 포함해야 한다면 디렉티브로 사용하는것보다는 액션태그에서 사용하는편이다. 디렉티브의 include는 jsp파일을 그대로 복사하는 반면 액션태그의 include는 jvm이 랜더링한 결과, 즉 html 소스만 가져온다. 액션태그의 include는 액션태그 페이지에서 다룬다.


어찌됐건 디렉티브 사용방법은 다음과 같다.

1
2
3
4
5
//test1.jsp
<%
    String name = "홍길동";
%>
<%=name%>


위와 같은 페이지가 있을때 아래처럼 작성하면 문서포함이 완료된다.

1
2
3
4
5
6
//test2.jsp
<body>
include 지시어 예제<br/>
<%@include file="test3_inc.jsp" %>
<%=name%>님
</body>




■ Declaration, 선언부

 스크립트릿이나 표현식에서 사용할 수 있는 메소드나 변수를 정의한다. 선언 부에 선언된 변수는 서블릿으로 바뀔 때 멤버 변수로 변경되며 전역 변수의 성격을  가진다.  또한 _jspInit(), _jspDestory()와 같은 생명주기 운영을 위한 메소드를 재정의 할 수 있다. 선언부의 변수와 스크립릿의 변수는 생존주기가 다른데 가령 스크립릿 변수는 service()메서드의 멤버변수로 페이지가 로딩될 때마다 초기화된다.


<%! 자바_메소드정의 %> 

또는 

<%! 자료형 변수명 [= 초기)값]; %> 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%! int a = 0;%>
<%! int a,  b; double  c;%>
<%!
    public int add(int a, int b) {
        return a+b;
    }
%>
<html>
    <head><title>선언부예제</title></head>
    <body>
        10 * 25 = <%=mutiply(10, 25)%>
    </body>
    .
    .
    .



■ Scriptlet, 스크립릿

 JSP문서 내에 자바코드를 기술하는 부분으로 순수 자바 코드만 올수 있다. 그리고 스크립릿에  선언 된 변수는 로컬 변수의 성격을 가지며 자바에서의  메소드 내에서 선언된 변수와 비슷하다. (실제로 service()메서드의 멤버변수로 포함된다)

<%  자바코드1; 자바코드2;  자바코드3;  ... %> 

1
2
3
4
5
6
7
8
9
10
<% //: 스크립릿은 java 파일로 변경되면서 service() 메소드 안에 추가된다.
    int sum=0, i=1;
    while(i<=100)
    {   sum += i;
        i++;       }
 
out.print(sum);
 
out.print("<tr bgcolor='#ffffff' height='25'>");
%>



■ Expression, 표현식

HTML 문서 결과 값에 포함시키고자 할 때 사용 한다. 

<%=출력할_값 %> 


위는 아래와 같다.

<% out.print(출력할_값) %>

1
2
3
4
5
6
7
8
<%
    String str = "메롱";
%>
<html><head></head>
<body>
    <%=str%>
</body>
</head></html>

이 JSP 문서는 화면에 "메롱"을 출력한다.



■ JSP 예제 - form으로 전달받은 프로퍼티 처리

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
<%
    request.setCharacterEncoding("utf-8");
          //클라이언트에서 전송되는 문자셋 지정. 설정하지 않으면 한글 깨짐
    //데이터를 전송받기 전에 반드시 해야한다.
    String name = request.getParameter("name");
    String gender = request.getParameter("gender");
 
 
    //String hobby = request.getParameter("hobby");
    //동일한 이름을 가진 파라미터를 getParameter() 메소드로 전달받으면 오직 하나만 받을 수 있다.
    String hobby = "";
    String[] h = request.getParameterValues("hobby");
    if(h!=null)
    {
        for(String s:h){
            hobby+=s+", ";
        }
        hobby = hobby.substring(0, hobby.lastIndexOf(", ")); //마지막 쉼표 제거
    }
             
    String hak = request.getParameter("hak");
    String bigo = request.getParameter("bigo");
     
    bigo = bigo.replaceAll("\n", "<br/>"); //엔터 -> 태그
    bigo = bigo.replaceAll(" ", " "); //공백 -> 태그
%>
<html>
<head></head>
<body>
 
출력 첫번째 방법 : <% out.print(bigo); %>
 
출력 두번째 방법 : <%=bigo%>
 
</body>
</html>


'JSP > Jsp 내장객체' 카테고리의 다른 글

JSP 내장객체의 스코프  (0) 2013.08.16
HTML 문서에서 인자로 사용  (0) 2013.08.16
EL 개요  (0) 2013.08.16
Session  (0) 2013.07.29
Request  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 11:47


String su = ""; //입력받는다 가정
String result = "";
 
for (String ele : new String[] { "+", "-", "*", "/" }) {
 
    if (su.indexOf(ele) > 0) {
        double d1 = Double
                .parseDouble(su.substring(0, su.indexOf(ele)));
        double d2 = Double
                .parseDouble(su.substring(su.indexOf(ele) + 1));
 
        switch (ele.charAt(0)) {
        case '+':
            result = String.format("%s = %.1f", su, d1 + d2);
            break;
        case '-':
            result = String.format("%s = %.1f", su, d1 - d2);
            break;
        case '*':
            result = String.format("%s = %.1f", su, d1 * d2);
            break;
        case '/':
            result = String.format("%s = %.1f", su, d1 / d2);
            break;
        }
 
        break;
    }
}


'JSP > JspServlet' 카테고리의 다른 글

Servlet list 작성  (0) 2013.07.29
JSP 개요  (0) 2013.07.29
달력  (0) 2013.07.29
MVC2 구현예제  (0) 2013.07.29
getParameterValues 처리  (0) 2013.07.25
Posted by 1+1은?
2013. 7. 29. 11:46


<%@page import="java.util.Calendar"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
     
<%@ page trimDirectiveWhitespaces="true" %>
<%
    request.setCharacterEncoding("UTF-8");
     
    //클라이언트에서 넘어온 정보 받기
    String y=request.getParameter("year");
    String m=request.getParameter("month");
     
    //현재 컴퓨터 시스템의 날짜 구하기
    Calendar cal = Calendar.getInstance();
    int year = cal.get(Calendar.YEAR);
    int month = cal.get(Calendar.MONTH)+1; //클라이언트에서 넘겨준 값이 없을때 표시하는 값
     
    if(y!=null)
        year = Integer.parseInt(y);
    if(m!=null)
        month = Integer.parseInt(m);
     
    cal.set(year, month-1, 1);
    year = cal.get(Calendar.YEAR);
    month = cal.get(Calendar.MONTH)+1;
 
    // 1일은 무슨 요일?
    int w = cal.get(Calendar.DAY_OF_WEEK);
     
    // 달의 마지막 날짜는?
    int endDays = cal.getActualMaximum(Calendar.DATE);
%>
 




Insert title here
 



 


<% int line = 0; //앞의 공백처리 out.print(""); for(int i=1; i "); line+=1; } //1~마지막날까지 출력하기 String fc; for(int i=1; i<=endDays; i++) { fc = line == 0 ? "red" : (line == 6 ? "blue" : "black"); out.print(""); line+=1; if(line==7 && i!=endDays) { out.print(""); line = 0; } } //뒷부분 공백 처리 while(line>0 && line<7) { out.print(""); line++; } out.print(""); %>
<%=year%>年<%=month%>月
"); out.print(i); out.print("


'JSP > JspServlet' 카테고리의 다른 글

JSP 개요  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
MVC2 구현예제  (0) 2013.07.29
getParameterValues 처리  (0) 2013.07.25
아파치 톰캣 연동 & 이유  (0) 2013.07.25
Posted by 1+1은?
2013. 7. 29. 11:42

목차

■ config.properties
■ web.xml
■ CONTROL
■ MODEL
■ VIEW



■ WebContent/WEB-INF/config.properties

/bbs.do=com.mvc.bbs.BoardAction

/guest.do=com.mvc.guest.GuestAction



 WebContent/WEB-INF/web.xml

1
2
3
4
5
6
7
8
<servlet>
   <servlet-name>my</servlet-name>
   <servlet-class>com.mvc.MyServlet</servlet-class>
   <init-param>
       <param-name>config</param-name>
       <param-value>/WEB-INF/config.properties</param-value>
   </init-param>
 </servlet>



■ CONTROL

● com.mvc.MyServlet.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
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
public class MyServlet extends HttpServlet {
 
    private static final long serialVersionUID = 1L;
 
    private Map<String, Object> map = new Hashtable<String, Object>();
 
    public void init(ServletConfig config) throws ServletException {
 
        super.init(config);
 
        ServletContext context = getServletContext();
        // web.xml 의 servlet 태그안의 init-param 값 읽어오기
        String pathname = config.getInitParameter("config");
 
        if (pathname == null)
            return;
 
        pathname = context.getRealPath(pathname);
 
        try {
            // properties 파일에 저장된 내용을 Properties 객체에 저장
            Properties prop = new Properties();
            FileInputStream fis = null;
 
            fis = new FileInputStream(pathname);
 
            // 파일의 내용을 읽어 Properties 객체에 저장
            prop.load(fis);
            fis.close();
 
            // Properties 객체에 저장된 클래스의 객체를 생성 map에 저장
            Iterator<Object> it = prop.keySet().iterator();
 
            while (it.hasNext()) {
                String key = (String) it.next();
                String className = prop.getProperty(key);
 
                Class<?> cls = Class.forName(className);
                Object ob = cls.newInstance();
 
                map.put(key, ob);
            }
 
        } catch (Exception e) {
            System.out.println(e);
        }
    }
 
    public void destroy() {
    }
 
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
 
        process(req, resp);
    }
 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
 
        process(req, resp);
    }
 
    protected void process(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
 
        MyAction action = null;
 
        try {
            String uri = req.getRequestURI();
 
            if (uri.indexOf(req.getContextPath()) == 0) {
                uri = uri.substring(req.getContextPath().length());
                action = (MyAction) map.get(uri);
                action.execute(req, resp);
            }
 
        } catch (Exception e) {
            System.out.println(e);
        }
    }
}



■ MODEL

● com.mvc.MyAction.java

1
2
3
4
5
6
7
8
9
10
11
12
public abstract class MyAction {
 
    public abstract void execute(HttpServletRequest req,
            HttpServletResponse resp) throws ServletException, IOException;
 
    public void forward(HttpServletRequest req, HttpServletResponse resp,
            String path) throws ServletException, IOException {
 
        RequestDispatcher rd = req.getRequestDispatcher(path);
        rd.forward(req, resp);
    }
}


● com.mvc.BoardAction.java

1
2
3
4
5
6
7
8
9
10
11
12
13
public class BoardAction extends MyAction {
    public void execute(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
 
        String mode = req.getParameter("mode");
 
        if (mode == null || mode.equals("list")) {
            forward(req, resp, "/mvc/bbs/list.jsp");
        } else if (mode.equals("created")) {
            forward(req, resp, "/mvc/bbs/created.jsp");
        }
    }
}


● com.mvc.GuestAction.java

1
2
3
4
5
6
7
8
9
10
11
12
public class GuestAction extends MyAction {
    public void execute(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
 
        String mode = req.getParameter("mode");
 
        if (mode == null || mode.equals("guest")) {
 
            forward(req, resp, "/mvc/guest/guest.jsp");
        }
    }
}



 VIEW

● root/mvc/bbs/list.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<body>
 
<a href="<%=cp%>/bbs.do">게시판</a>
<a href="<%=cp%>/guest.do">방명록</a><br/>
 
게시판 리스트입니다.<br/>
<a href="<%=cp%>/bbs.do?mode=created">글쓰기</a>
 
</body>
 
 
root/mvc/bbs/created.jsp
<body>
 
<a href="<%=cp%>/bbs.do">게시판</a>
<a href="<%=cp%>/guest.do">방명록</a><br/>
게시판 글쓰기입니다.<br/>
 
</body>


● root/mvc/guest/guest.jsp

1
2
3
4
5
6
7
<body>
 
<a href="<%=cp%>/bbs.do">게시판</a>
<a href="<%=cp%>/guest.do">방명록</a><br/>
방명록입니다.<br/>
 
</body>



'JSP > JspServlet' 카테고리의 다른 글

JSP 개요  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
달력  (0) 2013.07.29
getParameterValues 처리  (0) 2013.07.25
아파치 톰캣 연동 & 이유  (0) 2013.07.25
Posted by 1+1은?
2013. 7. 25. 17:11


<%
    String hobby = "";
    String[] h = request.getParameterValues("hobby");
 
    if(h!=null)
    {
        for(String s:h){
            hobby+=s+", ";
        }
 
        hobby = hobby.substring(0, hobby.lastIndexOf(", ")); //마지막 쉼표 제거
    }
    String bigo = request.getParameter("bigo"); //취미1, 취미2, 취미3
 
    //
으로 입력받은 문자열의 공백과 개행을 태그로 변환 bigo = bigo.replaceAll("\n", "
"); //엔터 -> 태그 bigo = bigo.replaceAll(" ", " "); //공백 -> 태그 %>


'JSP > JspServlet' 카테고리의 다른 글

JSP 개요  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
달력  (0) 2013.07.29
MVC2 구현예제  (0) 2013.07.29
아파치 톰캣 연동 & 이유  (0) 2013.07.25
Posted by 1+1은?
2013. 7. 25. 17:10

아파치와 톰캣 연동 이유

 

 성능상의 이유

 

JSP/Servlet Engine 상에서 동작하는 Servlet이나 JSP라는, (동일한 HTTP Request를 보내도 매 번 그 결과가 다를 수 있는) 동적인 HTTP Response를 생성해 보내는 것들입니다. 

그에 비해 단순한 HTML 문서, image, CSS(Cascading Style Sheet), Javascript file은 거의 변할일이 없는 (동일한 HTTP Request를 보내면 그 결과가 늘 같은)정적 contents입니다.

 이런 정적 contents는 통상적으로 Web Server가 JSP/Servlet Engine보다 더 빠르게 service합니다.

결국 정적 content는 정적 contents 처리에 강한 Web Server가 처리하고, 동적 contents는 JSP/Servlet Engine이 맡는 것입니다. 일단 HTTP Request를 Web Server가 먼저 받아보고 정적 contents를 요구하면 자신이 처리하고, 동적 contents request라면 이 request를 JSP/Servlet Engine에게 넘기죠. 

아니면 특정 URL pattern이 들어오면 JSP/Servlet Engine으로 넘기는 방법도 있습니다.

 결국 이렇게 하면 부수적으로 동적 contents 생성하느라 바쁜 JSP/Servlet Engine에 부하를 덜 줄 수 있고 정적 contents service하느라 귀중한 JVM Heap을 아낄 수 있는 이점도 누릴 수 있습니다.

 

보안상의 이유

 

보통 JSP/Servlet Engine은 중요한 업무 절차에 대한 구현을 가지고 있게 마련입니다.

단순한 image, CSS 같은 정적 contents를 담은 Web Server보다 더 안전하게 보호해야 한다는 뜻이 됩니다.

보통 어떤 기업 같은 조직의 network를 구성할 경우 외부 network와 조직의 network를 방화벽(firewall)으로 단절시키고 방화벽에 규칙(rule)을 등록, IP packet이 제한적으로만 그 방화벽을 넘다들 수 있도록 합니다.

 안전성이 더 높아야 하는 server들이 있는 network zone은 여기에 한 번 더 방화벽을 칩니다.

 그리고 이 두 방화벽 사이의 network zone을 DMZ라고 합니다.

이렇게 Web Server와 JSP/Servlet Engine을 따로따로 쓰면 DMZ에 덜 중요한 data를 가진 web server를 놓고 이중 방화벽 뒤에 있는 network zone에 JSP/Servlet Engine을 놓음으로써 높은 보안성을 획득하면서도 외부에 동적 contents를 제공할 수 있게 됩니다.

 

가용성 상의 이유

 

web server도 하나, JSP/Servlet Engine도 하나라면 둘 중 하나만 죽으면 정상적인 service가 불가능합니다. 

따라서 절대 멈추면 안되는 service(세계화가 되면서 이런 요구 사항은 더 늘었습니다. 지구 상 어딘가는 늘 업무 시간이니까요)를 담당하는 web server, JSP/Servlet Engine은 두 개 이상을 가동하는 이중화를 적용합니다.

web server가 어떤 HTTP Request를 받아 이를 JSP/Servlet Engine으로 넘기려 할 때 그 JSP/Servlet Engine이 이중화가 되어 있다면 web server는 이 request를 좀 한가한 JSP/Servlet Engine에 넘긴다던지 할 수 있습니다(물론 실제로는 간단하게는 round robin부터 시작해서 이에 대한 여러가지 방법이 있습니다).

 내지는 JSP/Servlet Engine 중 하나가 비정상적으로 종료한 상태이면 현재 살아 있는 JSP/Servlet Engine에게 이 request 처리를 위임, 전반적인 service 중단을 막을 수 있습니다.

 

 

시작전 준비

 
1.  http://www.apache.org/ 에 접속한뒤 Download를 클릭.

 

2. 미러사이트로 접속합니다.

 

 

3. /httpd/binaries/win32 폴더로 들어가 httpd-2.2.22-win32-x86-no_ssl.msi를 다운로드하고, 설치합니다.

 

 

4. http://tomcat.apache.org/ 에 접속한뒤, Download에 있는 Tomcat 7.0을 클릭합니다.

 

 

5. 32-bit/64-bit Windows Service Installer를 클릭하여 다운로드하고 설치합니다.

tomcat-connectors-1.2.37-windows-i386-httpd-2.2.x.zip


apache-tomcat-7.0.41.exe


httpd-2.2.21-win32-x86-no_ssl.msi


time.jsp


server.xml


workers.properties


mod_jk.conf


 

 

 

Apache2.2와 Tomcat 7.0 연동하기

 

 1. Apache와 Tomcat을 연동하려면 Tomcat Connectors(mod_jk)가 필요.

http://tomcat.apache.org/download-connectors.cgi 에서 다운로드 하거나, 첨부파일에 있는것을 사용. 

 

위의 첨부파일의 압축을 풀고 mod_jk.so 를 Apache가 설치된 곳에 있는 modules에 복사.

(Windows x64 : C:\Program Files (x86)\Apache Software Foundation\Apache2.2\modules)

 

2. Apache2.2\conf\httpd.conf를 수정.

DocumentRoot "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs" 부분을 DocumentRoot "C:/Server" 로 변경.

(C:\Server 폴더를 생성)

<Directory "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs"> 부분을 <Directory "C:/Server">로 변경.

※ 이제 C:\Server가 작업 폴더.

 

LoadModule jk_module modules/mod_jk.so

# mod_jk.conf

Include conf/mod_jk.conf

 

도 추가하고 저장.

(만약 접속한 경로에 있는 index.jsp를 자동으로 실행하게 하고 싶다면 <IfModule dir_module>의 DirectoryIndex 부분에 index.jsp를 추가)

 

3. Apache2.2\conf에 mod_jk.conf 를 생성하고 아래와 같이 입력.

 


JkWorkersFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/conf/workers.properties"
JkLogFile "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/logs/mod_jk.log"
JkLogLevel error
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkRequestLogFormat "%w %V %T"
JkMount /* ajp13
JkMount /*.jsp ajp13
JkMount /*.do ajp13
JkMount /servlet/* ajp13
JkMount /url ajp13
JkMount /dita/j_spring_security* ajp13
JkMount /ppspwc/j_spring_security* ajp13
JkMount /mmea/j_spring_security* ajp13
JkMount /irtv/j_spring_security* ajp13


 

4. Apache2.2\conf에 workers.properties를 생성하고 아래와 같이 입력.

 



# workers.tomcat_home에는 Tomcat이 설치된 경로를 입력.
workers.tomcat_home=C:/Program Files/Apache Software Foundation/Tomcat 7.0
# workers.java_home에는 JDK가 설치된 경로를 입력.
workers.java_home=C:/Program Files/Java/jdk1.6.0_45
ps=/ 
worker.list=ajp13
worker.ajp13.port=8009
worker.ajp13.host=localhost
worker.ajp13.type=ajp13
worker.ajp13.lbfactor=1
worker.loadbalancer.type=lb
worker.loadbalancer.balanced_workers=ajp13
worker.inprocess.type=jni
worker.inprocess.class_path=$(workers.tomcat_home)$(ps)lib$(ps)tomcat.jar
worker.inprocess.cmd_line=start
worker.inprocess.stdout=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stdout
worker.inprocess.stderr=$(workers.tomcat_home)$(ps)logs$(ps)inprocess.stder


 

5. 이제 Tomcat이 설치된 폴더에 있는 conf 폴더로 이동. 

(C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf)

conf 폴더에 있는 server.xml 파일을 수정.

 

<Host name="localhost"  appBase="webapps" unpackWARs="true" autoDeploy="true">

<Host name="localhost"  appBase="C:/Server" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false">로 변경하고, </Host> 앞에

<Context path="/" docBase="C:/Server" unpackWARs="true" debug="g" reloadble="true" xmlValidation="false" xmlNamespaceAware="false" crossContext="true"></Context>를 추가합니다.

 

6. Apache와 Tomcat을 리셋.

C:\Server 폴더안에 time.jsp 파일을 만들고 아래와 같이 작성.

 time.jsp


<%@ page contentType="text/html; charset=utf-8" %>

<%@ page import="java.util.Date" %>

<%Date now = new Date();%>

 

<html>

<body>

<%= now %>

</body>

</html>

 

7. http://localhost/time.jsp 에 접속.

 



'JSP > JspServlet' 카테고리의 다른 글

JSP 개요  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
달력  (0) 2013.07.29
MVC2 구현예제  (0) 2013.07.29
getParameterValues 처리  (0) 2013.07.25
Posted by 1+1은?