'JSP/JspServlet'에 해당되는 글 22건

  1. 2013.07.29 파입업로드/다운로드
  2. 2013.07.29 포워딩과 리다이렉트
  3. 2013.07.29 JSP 페이지기본설정
  4. 2013.07.29 JSTL
  5. 2013.07.29 Servlet
  6. 2013.07.29 Servlet list 작성
  7. 2013.07.29 JSP 개요
  8. 2013.07.29 연산자 검색
  9. 2013.07.29 달력
  10. 2013.07.29 MVC2 구현예제
2013. 7. 29. 15:19


test1.jsp
제목:
//req.getParameter(“subject”) = null 파일:
//form 객체에 enctype 속성을 주면 기존처럼 request객체의 getParameter로 받는것은 불가능하다. //해당 속성이 없으면 전송한 파일의 제목만 가져올뿐 파일의 내용은 알 수 없다. test1_ok.jsp out.print("request로 넘어온 데이터
"); DataInputStream dis = new DataInputStream(request.getInputStream()); String str; while((str=dis.readLine())!= null) { out.print(new String(str.getBytes("ISO-8859-1"), "euc-kr") + "
"); }//form에서 전송된 파일을 출력

test2.jsp
이름:
제목:
파일:
test2_ok.jsp <% String root = session.getServletContext().getRealPath("/");//서블릿에서 루트경로 구하기 → D:\web\work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps\study\ String pathname = root + File.separator + "saveFile"; File f = new File(pathname); if(! f.exists()) //폴더가 존재하지 않으면 폴더 작성 f.mkdirs(); String encType = "UTF-8"; int maxFilesize = 5*1024*1024; //MultipartRequest(request, 파일을 저장할 경로, 문자셋, 동일한 파일명 보호(덮어쓰기방지)) MultipartRequest mr = new MultipartRequest(request, pathname, maxFilesize, encType, new DefaultFileRenamePolicy()); //사실상 이부분에서 업로드가 완료됨 String name = mr.getParameter("name"); String subject = mr.getParameter("subject"); String saveFilename = mr.getFilesystemName("upload"); //서버에저장된파일명 String originalFilename = mr.getOriginalFileName("upload"); //클라이언트가업로드한파일명 long fileSize = mr.getFile("upload").length(); //File.length() 파일의 길이, return long %> 이름:<%=name %>
제목:<%=subject %>
클라이언트가업로드한파일명:<%=originalFilename %>
서버에저장된파일명:<%=saveFilename %>
파일의크기:<%=fileSize %>Bytes.


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

MVC 관련 핸들러 매핑 및 컨트롤러  (0) 2013.07.29
액션 태그와 커스텀 태그  (0) 2013.07.29
포워딩과 리다이렉트  (0) 2013.07.29
JSP 페이지기본설정  (0) 2013.07.29
JSTL  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 15:17

포워딩과  리다이렉트  


Forwarding, 포워딩

: 요청을  포워딩할  때  해당  요청은  서버의  다른  자원(서블릿  또는  JSP)  에  전달된다.  이때에는  다른  

자원에서  이  요청을  처리할  것을  클라이언트에  알리지  않는다.  이런  방식의 처리는  웹  컨테이너  안에

서만  일어나고,  클라이언트는  알 수  없게 된다. 포워딩은  리다이렉트와는  다르게 객체를  요청에  담고,  

해당 요청을  사용할  다음 자원에  전송한다.


 따라서 클라이언트는  포워딩이  발생한 사실을  알지  못한다.  포워딩은  클라이언트와  통신  없이  서버

에서만 처리되기  때문에 리다이렉트보다 나은 성능을 보여준다.



 ο 포워딩 (Forwarding) 요청을 포워딩할 때 해당 요청은 서버의 다른 자원(서블릿 또는 JSP) 에 전달된다. 이때에는 다른 자원에서 이 요청을 처리할 것을 클라이언트에 알리지 않는다. 이런 방식의 처리는 웹 컨테이너 안에서만 일어나고, 클라이언트는 알 수 없게 된다. 포워딩은 리다이렉트와는 다르게 객체를 요청에 담고, 해당 요청을 사용할 다음 자원에 전송한다. 따라서 클라이언트는 포워딩이 발생한 사실을 알지 못한다. 포워딩은 클라이언트와 통신 없이 서버에서만 처리되기 때문에 리다이렉트보다 나은 성능을 보여준다. request 객체와 response 객체는 포워딩된 서블릿(jsp)로 전달된다. - jsp 포워딩 


 - servlet 포워딩 
RequestDispatcher rd = request.getRequestDispatcher("/view/bbs/list.jsp"); rd.forward(request, response); 
- 포워딩될 jsp 또는 서블릿에 정보를 전달하는 방법 
request.setAttribute("name", "홍길동"); BoardDTO d=dao.getReadData(num); 
// 객체인 경우 request.setAttribute("dto", d); - 포워딩된 페이지에서 포워딩한 페이지가 전달(setAttribute)한 값 받는 방법 <%String name=(String)request.getAttribute("name"); BoardDTO d=(BoardDTO)request.getAttribute("dto"); %> <%=name%><%=d.getName()%>
 - 포워딩된 페이지(jsp)에서 포워딩한 페이지가 전달(setAttribute)한 값 받는 방법(EL)
 ${name} ${dto.name}   


test1_ok.jsp


//request 객체에 attribute를 저장
request.setAttribute("result", msg); //(String, Object) %>

안보이는 text
//전송되지 않는 소스

test1_for.jsp


 //포워딩 된 jsp 또는 servlet은 request와 response객체가 그대로 전달됨
 String name = request.getParameter("name"); //파라미터 받기 
 String msg = (String)request.getAttribute("result"); //설정한 Attribute값 가져오기
%>


<%=name %>님
<%=msg %>
//정상출력


 


 

Redirect, 리다이렉트

: 클라이언트의 요청을  처리 한 후, 컨테이너는 sendRedirect()  메소드가 호출되면 브라우저에  응답을 보낸다.  이 응답에는  브라우저가  웹  컨테이너의  응답을  받은 후  다시 요청을  보낼  새로운  URL  을 포함한다.  여기에서  하나의  요청이  종결된다.  새로  부여받은  URL  로  브라우저에서  완전히  새롭게 요청하기  때문에 이전의 요청 스코프에  저장되어  있는 객체는 새로운 요청  전에 소멸된다.


리다이렉트는 추가적으로  발생한 왕복  처리  때문에  포워딩보다  느리다.  기억해야  할  것은  최종적으

로  수행하는  작업은  새로운  요청에  의한  것이고,  이것을 클라이언트가  알고  있기  때문에 브라우저  창

의  주소가  처음  요청한  주소가  아니고  최종  주소  값으로  변한다.  또한  하나의  요청에  담겨있던  객체



ο 리다이렉트 (Redirect)

클라이언트의 요청을 처리 한 후, 컨테이너는 sendRedirect() 메소드가 호출되면 브라우저에 응답을  보낸다. 이 응답에는 브라우저가 웹 컨테이너의 응답을 받은 후 다시 요청을 보낼 새로운 URL 을 포함한다. 여기에서 하나의 요청이 종결된다. 새로 부여받은 URL 로 브라우저에서 완전히 새롭게 요청하기 때문에 이전의 요청 스코프에 저장되어 있는 객체는 새로운 요청 전에 소멸된다. 리다이렉트는 추가적으로 발생한 왕복 처리 때문에 포워딩보다 느리다. 기억해야 할 것은 최종적으로 수행하는 작업은 새로운 요청에 의한 것이고, 이것을 클라이언트가 알고 있기 때문에 브라우저 창의 주소가 처음 요청한 주소가 아니고 최종 주소 값으로 변한다. 또한 하나의 요청에 담겨있던 객체들은 소멸되어 다음 작업까지 전달되지 않는다.

 request 객체와 response 객체가 초기화 된다.


 - jsp 리다이렉트
   <%
        String cp=response.getContextPath();
    response.sendRedirect(cp+"/bbs/list.kh"); 
   %>


 - servlet 리다이렉트
   String cp=response.getContextPath();
   response.sendRedirect(cp+"/bbs/list.kh"); 



test2_ok.jsp

//request 객체에 attribute를 저장
request.setAttribute("result", msg); //(String, Object) %>

안보이는 text
//전송되지 않는 소스 <% //리다이렉트(클라이언트가 다시 요청하도록 함) //일반적으로 DB에 INSERT, UPDATE, DELETE하거나 loing, logout 후에 리다이렉트를 한다. response.sendRedirect("test2_rs.jsp");

test2_rs.jsp

 String name = request.getParameter("name");
 String msg = (String)request.getAttribute("result");
%>


리다이렉트 된 페이지
request, response는 초기화 된다.
이름 : <%=name %>
<%=msg %>




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

액션 태그와 커스텀 태그  (0) 2013.07.29
파입업로드/다운로드  (0) 2013.07.29
JSP 페이지기본설정  (0) 2013.07.29
JSTL  (0) 2013.07.29
Servlet  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 14:58


<%@ page contentType="text/html; //contentType = 생성할 문서 타입. 기본 값 : "text/html"
 charset=UTF-8" %>

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

<% String cp = request.getContextPath();  // ContextPath(문맥경로) : ex) .../study
 request.setCharacterEncoding("utf-8");
// 페이지 자체의 캐릭터 인코딩 지정. 기본 값 : "ISO-8859-1" %>


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

파입업로드/다운로드  (0) 2013.07.29
포워딩과 리다이렉트  (0) 2013.07.29
JSTL  (0) 2013.07.29
Servlet  (0) 2013.07.29
Servlet list 작성  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 14:55

JSTL, JSP  Standard  Tag  Library

: JSP에는  XML처럼 사용자가 태그를 정의해서 사용하는 것이 가능하며 이런 사용자 정의 태그를 커

스텀  태그라고  하는데  이들  중  자주  사용하는  것을  표준으로  만들어  놓은  것이  JSTL  이다.  JSP

Standard  Tag  Library(JSTL)는 일반적인 웹 애플리케이션 기능인 반복(iteration)과 조건, 데이터 관리

포맷,  XML 조작, 데이터베이스 액세스를 구현하는 커스텀 태그 라이브러리 모음이다.


 JSP의 스크립트와 HTML 코드를 같이 혼용하여 사용하면 개발의 편리성을 제공하기 하지만, 코드의

복잡성을  증대시키는  문제점이  있다.  이러한  문제를  해결하기  위해  로직  부분의  JSP  코드를  태그로

대치시켜서 HTML과 같은 태그로 이루어진 코딩 방법이 제시되었다.


 JSTL은  JSP  페이지의  로직을 담당하는  부분인  if,  for,  while,  데이터베이스 처리등과  관련된  표준

커스텀 태그를 제공함으로써 코드를 깔끔하게 하고 가독성을 좋게 하며 데이터 포맷, 반복 콘텐트 또

는 조건 콘텐트 같은 전형적인 표현 레이어를 위한 표준 구현을 제공하기 때문에,  JSP 작성자들이 애

플리케이션 개발에 집중하는데 도움이 된다.


 JSTL 작성 시 한 가지 주의할 사항은 액션 태그도 그렇지만  JSTL과 커스텀 태그도  XML 기반에서

작성이 되었기 때문에 모든 태그는 시작 태그와 종료 태그의 쌍으로 이루어져야 한다.


기존의 컨텍스트에서  JSTL을 사용하기 위해서는 웹 어플리케이션의  WEB-INF/lib 디렉토리에 필요

한 라이브러리를 복사하면 된다.  JSTL의 주된 라이브러리 파일은  jstl.jar,  standard.jar 이고,  xml에서

지원되는 기능을 사용하기 위해서  jaxen-full.jar,  saxpath.jar,  jaxp-api.jar 파일 등이 필요하다. 이 파

일들을 웹 어플리케이션의 WEB-INF/lib 에 복사하고, 컨텍스트를 리 로드 한다.



태그의 종류

1. 코어

⋅기능  : 변수지원, 흐름제어, URL처리

⋅접두어(Prefix)  :  c

⋅directive : <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>


■ 표현 언어(EL) 지원 기능

 <c:catch>,  <c:out>,  <c:remove>,  <c:set>

■ 흐름 제어 기능

 <c:choose>(<c:when>,  <c:otherwise>),  <c:forEach>,  <c:forTokens>,  <c:if>

■ URL 관리 기능

 <c:import>(<c:param>),  <c:redirect>  (<c:param>),  <c:url>  (<c:param>)


조건문, if

수:
//액션이 없어서 자기 자신에게 parameter를 전송하는 폼 ${param.num}은 짝수
${param.num}은 홀수
등록된게시물이음슴 ${pageIndexList}


조건문, if~when


 
  ${param.num1 }은 3과 4의 배수
${param.num1 }은 3의 배수
${param.num1 }은 4의 배수
${param.num1 }은 3또는 4의 배수가 아님


반복문, forEach



 ${param.num}*${n}=${param.num*n}
이름:${dto.name}, 제목:${dto.subject}
이름:${dto.name}, 제목:${dto.subject}
현재아이템:${s.current}
0부터의순서:${s.index}
1부터의순서:${s.count}
처음이냐?:${s.first}
마지막이냐?:${s.last}
${dto.num}
${dto.subject}
${dto.name}
${dto.created}
${dto.hitCount}





ㅎㅎㅎ


구글?


여긴어디게


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

포워딩과 리다이렉트  (0) 2013.07.29
JSP 페이지기본설정  (0) 2013.07.29
Servlet  (0) 2013.07.29
Servlet list 작성  (0) 2013.07.29
JSP 개요  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 14:23

Servlet

: 서블릿은 Sun 사에서 내놓은 기술로서 Java 라는 언어를 기반으로 하여 동적인 컨텐츠를 생성하며Java 코드 안에 HTML 태그가 혼재되어 있어서 그 효율성이 떨어진다.


서블릿은 멀티쓰레딩에 의해 사용자 요구를 처리하고 가공해서 이에 대한 결과를 보내며, 서블릿과 JSP 는 상호 연계되어 JSP에서 정적인 부분을 담당하고 서블릿 에서는 동적인 처리를 위한 부분으로

사용 되어 보다 효율적인 웹 사이트를 구성 할 수 있다. 즉, JSP 는 주로 사용자용 뷰(View) 의 구현에 사용되고 서블릿은 사용자용 뷰와 프로그램 로직사이를 제어해주는 역할에 주로 사용 되어 진다.


서블릿은 Servlet 인터페이스를 구현하여 GenericServlet을 만들고 이를 다시 http 프로토콜에 맞게확장한 HttpServlet 클래스를 상속한 후 내부 메소드를 재정의 하여 사용한다. 그리고 HttpServlet 클래스는 상속한 후 재정의해서 사용할 수 있는 주요 멤버 메소드인 service(), doGet(), doPost(),doHead() 메소드를 가지고 있다.


■ 서블릿의 동작 순서

1) 클라이언트의 요청

2) 서블릿 Handler  8080포트에서 요청 받음

3) 서블릿 컨테이너에서 해당 서블릿 검색

4) 해당 서블릿이 데이터베이스 작업을 해야 한다면 DB연결,

5) 모든 작업이 완료 되었다면 응답으로 결과를 리턴 한다.



 ■ 서블릿 작성 방법

ο 서블릿 클래스 작성

    1. 다음의 한가지 방법을 이용하여 서블릿 클래스를 작성 한다.

       1) 첫번째 방법

     GenericServlet abstract 클래스를 상속 받는 서블릿 클래스를 작성하여

     abstract void service(ServletRequest req, ServletResponse res) 메소드를 재정의 한다.

       2) 두번째 방법

            HttpServlet 클래스를 상속 받는 서블릿 클래스를 작성하여 다음의 메소드를 재정의 한다.

      - GET 방식을 처리하는 경우

              void doGet(HttpServletRequest req, HttpServletResponse resp)

      - POST 방식을 처리 하는 경우

               void doPost(HttpServletRequest req, HttpServletResponse resp)


ο WEB-INF/web.xml 파일에서 환경 설정

 : 디플로이먼트 디스크립터(deployment descriptor, 배포 설명자) 파일

     <servlet> 과 <servlet-mapping> 태그를 이용하여 서블릿을 uri와 매핑 한다.

 
          서블릿이름
          패키지명을 포한한 서블릿 클래스 파일명
      

      
          서블릿이름
         경로패턴
     

.../.../WebContent/WEB-INF/web.xml: 톰캣의 동작을 정의하는 환경설정 파일





study
 
   index.html
   index.htm
   index.jsp
   default.html
   default.htm
   default.jsp
 


fServlet
com.svt.FirstServlet
 //톰캣이 생성한 객체의 service()를 호출한다.

 //언제?
fServlet
/first // url 패턴을 찾을 때

//service() 메서드는 GenericServlet 클래스에 존재하며 HttpServlet클래스는 이 GenericServlet 클래스를 상속한다. 따라서 HttpServlet클래스를 상속받은 클래스는 service() 메서드를 갖게 된다.


//service() 메서드는 같은 클래스의 doGet() 또는 doPost()를 실행하도록 정의되어 있다.

만약 전송방식(request객체의 getMethod())을 알 수 없다면 doGet()을 호출한다.


 

URI-pattern 유형

1) 이그잭틀리 매칭(Exactly matching)  : 반드시  "/"로 시작해야 한다.

  예)   /User/abc

2) 디렉토리 매칭(Directory matching)  : 반드시  "/"로 시작하고,  "*"로 끝나야 한다.

  예)  /User/* →  *  : 모두

3)  Extension matching  :  "/"로 시작하면 안 되고, 확장자로 끝나야 한다.

  예)  *.do





■  디플로이먼트 디스크립터(deployment descriptor,  배포 설명자)  이점

 ⋅이미  테스트된 소스 코드에  대한 수정을 최소화  한다.

 ⋅소스  코드  없이 애플리케이션을 목적에  맞게 수정할  수  있다. 

 ⋅코드  변경이나 컴파일을  하지  않고도 서버  자원(DB 등등)을  바꿀 수  있다.

 ⋅접근  제어 목록, 보안  역할과 같은 보안에  관련된  업무도 관리할  수  있다.

 ⋅xml  파일로 되어  있으므로 프로그래머가  아닌 사람도 설정할  수  있다.

■ web.xml  파일의  태그

 ⋅icon  : 웹  애플리케이션을  나타내기 위해  IDE나 GUI  툴에서  사용 되는  하나  또는  두  개의  이미지  

   파일들의 위치를  지정하는데  사용한다.

 ⋅display-name  : GUI  툴이 웹  애플리케이션을 표시하기 위해  사용하는  이름을 지정 하는데 사용

 ⋅description  : 웹  어플리케이션에  대한 설명을  나타낸다.

 ⋅distributable  : distributable  요소가  있다는 것은 웹  어플리케이션이다 중  서버  간에  분산  배치 될 수  있다는 것을 

   의미한다.

 ⋅context-param  :  어플리케이션의 초기화 파라미터를 선언하는데  사용

 ⋅filter  : 서블릿이나 jsp  페이지로 들어오는 요청정보를  사전에 걸러내는 기능

 ⋅filter-mapping  : 필터를  지정했다면 filter-mapping을  지정하여 하나  이상의 서블릿과  연결함

 ⋅listener  :  서블릿2.3  버전으로부터  세션이나  서블릿  컨텍스트가  생성  또는  수정  되거나  소멸되는 것을  알려주는 

  이벤트  리스너

 ⋅servlet  : 서블릿이나 jsp  페이지에  초기화파라미터나사용자url  들을  할당  할  때 사용되는  서블릿이나 jsp  이름을 지정

 ⋅servlet-mapping  : 상대 url  경로를 좀  더 쉽게  다루기 위해  기본 url를  변경 할  때 사용

 ⋅session-config  :  일정  시간  동안  세션으로  접근이  없을  경우  서버는  메모리를  절약하기  위해  사용  하지  않는  

  메모리를 삭제한다. 세션의  시간 유지  기능

 ⋅mime-mapping  : 특정한 mime형을 가진 파일을 웹  어플리케이션에  넣어 두고 싶은  경우 사용

 ⋅welcome-file-list  :  url이  파일명이  아닌  디렉토리  명으로  받았을  경우  기본적으로  불러올 파일명을 지정하는데 사용

 ⋅error-page  : http  상태코드가  반환되거나 예외가  발생했을 때 그  내용을 출력하는 페이지

 ⋅tag-lib  :  태그라이브러리 설명자  파일의  별칭을 지정하는데  사용

 ⋅resource-envref  : 자원(resource)과  연관  되어  관리  되는  객체를  선언하는  역할을 한다.

 ⋅resource-ref  : resource-ref 요소는 외부에서  참조해야 할  자원을 선언할  때 사용

 ⋅security-constraint  :  url이  보호  되도록  지정하는  역할을  한다.  login-config와  연결되어 사용

 ⋅login-config  : 보안된 페이지로 들어가려는  사용자에  대한 서버의  인증  방식을 지정해 준다.

 ⋅security-role  : 통합개발 환경에서  보안  정보를 좀  더 조작하기 쉽게  만들어준다.

 ⋅env-entry  : 웹  어플리케이션의 환경  항목을 선언한다.

 ⋅ejb-ref  :  엔터프리이즈  빈의 홈에  대한  레퍼런스를 선언

 ⋅ejb-local-ref  :  엔터프라이즈  빈의 로컬  홈에  대한 레퍼런스를 선언


* ServletRequest : 클라이언트의 요청을 받음

* ServletResponse : 클라이언트의 요청에 응답

위 클래스는 인터페이스로 자바에서 객체를 직접 생성할 순 없다.(톰캣이 처리함)



1. GenericServlet 을 상속받는 경우


public class FirstServlet extends GenericServlet { private static final long serialVersionUID = 1L; @Override public void service(ServletRequest req, ServletResponse resp)throws ServletException, IOException { //service() 메소드 : 클라이언트가 요청할 때마다 호출되는 메소드 Calendar now = Calendar.getInstance(); String str = String.format("%1$tF %1$tT", now); //서버에서 클라이언트에게 전송하는 문서타입 설정 resp.setContentType("text/html;charset=utf-8"); //서버에서 클라이언트로 전송하기 위한 출력 스트림 PrintWriter out = resp.getWriter(); //서버에서 클라이언트로 데이터 전송 out.println(""); out.println(""); out.println("처음 작성해 보는 서블릿 프로그램
"); out.println("현재 날짜 및 시간 : " + str); out.println(""); out.println(""); } }


public class DemoServlet extends GenericServlet {
 private static final long serialVersionUID = 1L;
 
 @Override
 public void destroy() {
  // 서블릿이 메모리에서 해제되기 직전에 한 번만 실행
 }

 @Override
 public void init(ServletConfig config) throws ServletException {
  // 서블릿이 메모리에 로딩됨과 동시에 한 번만 실행. 초기화 목적으로 사용
 }
 
 /*
  * service() 메서드
  *   클라이언트가 호출할 때 마다 실행되어지는 메서드
  *   ServletRequest: 클라이언트의 요청을 전달 받기 위한 클래스
  *     클라이언트 -> 서버
  *   ServletResponse: 클라이언트에게 응답하기 위한 클래스
  *     서버 -> 클라이언트

 @Override 
public void service(ServletRequest req, ServletResponse resp)
   throws ServletException, IOException
{
 // 클라이언트에서 서버로 전송되는 인코딩 설정
 req.setCharacterEncoding("utf-8");
  
 // 클라이언트에서 전송된 데이터 받기
 String name = req.getParameter("name");
 int age = Integer.parseInt(req.getParameter("age"));
 String msg = name + "님";
 if (age >= 19)
  msg += "의 나이는 " + age + "세이고 성인입니다.";
 else
  msg += "의 나이는 " + age + "세이고 미성년자입니다.";
 
 // 서버에서 클라이언트로 전솓되는 문자 타입
 resp.setContentType("text/html; charset=utf-8");
 
 // 서버에서 클라이언트로 전송하기 위한 출력 스트림
 PrintWriter out = resp.getWriter();
 
 // 전송하기
 out.println("");
 out.println(msg);
 out.println("");
}

2. HttpServlet 을 상속받는 경우


public class BoardServlet extends HttpServlet
{
 private static final long serialVersionUID = 1L;

//service()는 클라이언트의 요청 시 전송방식에 따라
//doGet()이나 doPost() 메서드를 실행하도록 프로그램 되어 있다.
//전송방식을 알 수 없으면 get이라 간주한다.

 @Override
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
 {
  process(req, resp);
 }

 @Override
 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
 {
  process(req, resp);
 }
 
 protected void forward(HttpServletRequest req, HttpServletResponse resp, String path)
throws ServletException, IOException
 {
  //서블릿의 포워딩 방식
  RequestDispatcher rd = req.getRequestDispatcher(path);
  rd.forward(req, resp);
 }
 
 protected void process(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
 {
  req.setCharacterEncoding("utf-8");
  
  String cp = req.getContextPath();
  String uri = req.getRequestURI(); //클라이언트가 요청한 URI


  BoardDAO dao = new BoardDAO();
  MyUtil util = new MyUtil();
  
  if(uri.indexOf("list.kh") != -1) //URI에 따른 응답을 달리한다.
  {
   //게시물 리스트
   forward(req, resp, "/sbbsView/list.jsp");
  } else if(uri.indexOf("created.kh") != -1)

  {
   //글쓰기 폼
   forward(req, resp, "/sbbsView/created.jsp");
  } else if(uri.indexOf("created_ok.kh") != -1)
                  //request의 uri가 "created_ok.kh"를 포함하면
  {
   BoardDTO dto = new BoardDTO();
   dto.setSubject(req.getParameter("subject"));
   dto.setName(req.getParameter("name"));
   dto.setContent(req.getParameter("content"));
   dto.setPwd(req.getParameter("pwd"));
   
   dto.setIpAddr(req.getRemoteAddr());
   
   dao.insertBoard(dto);
   
   resp.sendRedirect(cp + "/sbbs/list.kh");
  }
 }
}


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

JSP 페이지기본설정  (0) 2013.07.29
JSTL  (0) 2013.07.29
Servlet list 작성  (0) 2013.07.29
JSP 개요  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 14:14

Servlet

글리스트

  URI : cp/sbbs/list.kh

  JSP : sbbsView/list.jsp

글쓰기폼

  URI : cp/sbbs/created.kh

  JSP : sbbsView/created.jsp

글저장

  URI : cp/sbbs/created_ok.kh --> 리스트로 리다이렉트

글보기

  URI : cp/sbbs/article.kh

  JSP : sbbsView/article.jsp

글수정폼

  URI : cp/sbbs/update.kh

  JSP : sbbsView/created.jsp

글수정완료

  URI : cp/sbbs/update_ok.kh --> 리스트로 리다이렉트

글삭제

  URI : cp/sbbs/delete.kh --> 리스트로 리다이렉트



* 서블릿 기본 코드


package com.bbs; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class BoardServlet extends HttpServlet{ private static final long serialVersionUID = 1L; // 추상클래스 제네릭서블릿을 받아서 재정의해야됨 // HttpServlet 을 상속받아서 사용 -> doGet, doPost만 재정의 // 서비스에서 get,post 방식 으로 부를때 super 로 보내면 안됨 @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 서비스에서 get 방식으로 부를때.. process(req, resp); }// @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 서비스에서 post 방식으로 부를때.. process(req, resp); }// protected void forward(HttpServletRequest req, HttpServletResponse resp, String path) throws ServletException, IOException { // 서블릿에서 포워딩(path로 포워딩). // 포워딩에서의 /는 cp 까지를 의미한다. RequestDispatcher rd = req.getRequestDispatcher(path); rd.forward(req, resp); }// protected void process(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); String cp=req.getContextPath(); String uri=req.getRequestURI(); BoardDAO dao = new BoardDAO(); MyUtil util = new MyUtil(); // url = 전체주소 // uri = cp(context path : 문맥경로)부터시작되는 주소 // 디자인만 jsp로 위임 if (uri.indexOf("list.kh")!=-1){ // 게시물 리스트 String pageNum=req.getParameter("pageNum"); int current_page=1; if(pageNum!=null) current_page=Integer.parseInt(pageNum); // 검색키,값 String searchKey = req.getParameter("searchKey"); String searchValue = req.getParameter("searchValue"); if(searchKey==null) { searchKey="subject"; searchValue=""; } // GET 방식인 경우 디코딩 if(req.getMethod().equalsIgnoreCase("GET")) { searchValue=URLDecoder.decode(searchValue, "UTF-8"); } int numPerPage=10; int total_page=0; int dataCount=0; if(searchValue.length()==0) // 검색이 아닌 경우 데이터개수 dataCount=dao.totalnum(searchKey, searchValue); else // 검색인 경우 dataCount=dao.totalnum(searchKey, searchValue); total_page=util.getpageCount(numPerPage, dataCount); if(current_page>total_page) current_page=total_page; int start=(current_page-1)*numPerPage+1; int end=current_page*numPerPage; List

lists=dao.selectBoard(start, end, searchKey, searchValue);//1 List lists=null; if(searchValue.length()==0) // 검색이아닌경우글리스트 lists=dao.selectBoard(start, end, searchKey, searchValue); else // 검색인경우길리스트 lists=dao.selectBoard(start, end, searchKey, searchValue); String listUrl; String articleUrl; String params=""; if(searchValue.length()!=0) { params="searchKey="+searchKey+"&searchValue="+ URLEncoder.encode(searchValue, "UTF-8"); // 인코딩 } if(params.length()==0) { listUrl=cp+"/sbbs/list.kh"; articleUrl=cp+"/sbbs/article.kh"; } else { listUrl=cp+"/sbbs/list.kh?"+params; articleUrl=cp+"/sbbs/article.kh?"+params; } // 페이징 처리 String pageIndexList = util.pageIndexList(current_page, total_page, listUrl); // 포워딩하는 JSP 파일에 값을 전달하기 위해 req.setAttribute("lists", lists); req.setAttribute("pageIndexList", pageIndexList); req.setAttribute("pageNum", current_page); req.setAttribute("dataCount", dataCount); req.setAttribute("articleUrl", articleUrl); forward(req, resp, "/sbbsView/list.jsp"); } else if (uri.indexOf("created.kh")!=-1){ // 글쓰기폼 forward(req, resp, "/sbbsView/created.jsp"); } else if (uri.indexOf("created_ok.kh")!=-1){ //글저장 BoardDTO dto = new BoardDTO(); dto.setSubject(req.getParameter("subject")); dto.setName(req.getParameter("name")); dto.setContent(req.getParameter("content")); dto.setPwd(req.getParameter("pwd")); dto.setIpAddr(req.getRemoteAddr()); dao.insertBoard(dto); resp.sendRedirect(cp+"/sbbs/list.kh"); } else if (uri.indexOf("article.kh")!=-1){ BoardDTO dto = new BoardDTO(); int num = Integer.parseInt(req.getParameter("num")); String pageNum=req.getParameter("pageNum"); dto = dao.selectContent(num); req.setAttribute("dto", dto); int lineSu = dto.getContent().split("\n").length; String content = dto.getContent().replaceAll("\n", "
").replaceAll(" ", " "); req.setAttribute("pageNum", pageNum); req.setAttribute("lineSu", lineSu); req.setAttribute("content", content); forward(req, resp, "/sbbsView/article.jsp"); } }// }//



ο 포워딩 (Forwarding)

  요청을 포워딩할 때 해당 요청은 서버의 다른 자원(서블릿 또는 JSP) 에 전달된다. 이때에는 다른 자원에서 이 요청을 처리할 것을 클라이언트에 알리지 않는다. 이런 방식의 처리는 웹 컨테이너 안에서만 일어나고, 클라이언트는 알 수없게 된다. 포워딩은 리다이렉트와는 다르게 객체를 요청에 담고, 해당 요청을 사용할 다음 자원에 전송한다.

  따라서 클라이언트는 포워딩이 발생한 사실을 알지 못한다. 포워딩은 클라이언트와 통신 없이 서버에서만 처리되기 때문에 리다이렉트보다 나은 성능을 보여준다.

  request 객체와 response 객체는 포워딩된 서블릿(jsp)로 전달된다.


ο web.xml -> 추가


</welcome-file-list> -> 다음


 
   bbs
   com.bbs.BoardServlet
  
  
   bbs
   /sbbs/*
  


기본은 get방식

form 일때만 post방식

bbs : 서버가 켜질때 객체가 생성됨

com.bbs.BoardServlet 톰캣이 BoardServlet안의 service를 불러옴

url-pattern : 어떤주소를 입력할때..

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

JSTL  (0) 2013.07.29
Servlet  (0) 2013.07.29
JSP 개요  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
달력  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 14:03


■  형식

<%@  include file="상대_URL"%>  


 include  디렉티브의  처리  과정은  정적으로  include  지시자를  사용한 JSP  페이지가  컴파일  되는  과

정에서  include  되는 JSP  페이지의  소스  내용을  그대로  포함해서  컴파일  한다.  즉,  복사  &  붙여넣기   

방식으로 두개의  파일이  하나의 파일로  구성된 후  같이  변환되고 컴파일 된다.



 

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

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

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

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

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

  ⋅info : 페이지에 대한 설명

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

  ⋅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"   



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

<%@ page contentType="text/html; charset=UTF-8"%> //중요

<%@ page trimDirectiveWhitespaces="true" %> //소스로 변환할 때 불필요한 공백을 제거한다.


스크립트 구성요소

1. Declaration, 선언부

: 스크립트  릿  이나  표현식에서  사용할  수  있는  메소드나  변수를  정의한다.  선언  부에  선언된  변수는  

서블릿으로  바뀔  때  멤버  변수로  변경되며  전역  변수의 성격을  가진다.  또한 _jspInit(), _jspDestory()  

와 같은 생명주기 운영을 위한  메소드를 재정의 할 수  있다.


*선언부의 변수와 스크립릿의 변수는 생존주기가 다르다

(스크립릿 변수는 service()메서드의 변수로 페이지가 로딩될 때마다 초기화된다.)

■  형식
<%!  자바_메소드정의 %>
   또는
<%!  자료형  변수명  [= 초기)값]; %>

■  사용  예
<%!  int a = 0;%>
<%!  int a,  b; double  c;%>
<%!
   public int add(int  a,  int  b) {
        return a+b;
   }
%>

■  사용  예 -  선언 부  예제
<%@  page contentType="text/html;  charset=utf-8"  %>
<%!  
   public int  mutiply(int a,  int  b) {
        int c  = a  *  b;
        return c;
   }
%>

   선언 부  예제
   
    10 * 25 =  <%=  mutiply(10, 25)  %>
   


2. Scriptlet, 스크립릿

: JSP  문서  내에  자바코드를  기술하는  부분으로  순수  자바  코드만  올수  있다.  그리고  스크립트  릿에  

선언 된  변수는 로컬  변수의 성격을  가지며  자바에서의  메소드 내에서 선언된  변수와 비슷하다.


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

<% //: 스크립릿은 java 파일로 변경되면서 service() 메소드 안에 추가된다.
 int sum=0, i=1;
 while(i<=100)
 { sum += i;
  i++;       }

out.print(sum);

out.print("");
%>



3. Expression, 표현식

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


■  형식
<%=  출력할_값 %> //out.print(출력할_값)



예제)


<%
 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", "
"); //엔터 -> 태그 bigo = bigo.replaceAll(" ", " "); //공백 -> 태그 %> ... <% … out.print(bigo); %>


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

Servlet  (0) 2013.07.29
Servlet list 작성  (0) 2013.07.29
연산자 검색  (0) 2013.07.29
달력  (0) 2013.07.29
MVC2 구현예제  (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은?