System.out.println("Hello, World");

● 액션 태그 (Action Tag)

- JSP 내에서 자바코드를 줄이기 위한 태그

- 액션 태그는 JSP내에서 Java 코드 없이 태그를 이용해 동적인 실행을 처리 하기 위해 제한됨

- 태드와 Java 코드를 연결하여 JSP가 Servlet으로 변환 시 Web Container가 그에 알맞은 동적인 실행을 처리


● 종류

- 표준 Action 태그 : JSP 스펙에서 제공하는 태그

- Custom tag : 사용자 정의 액션 태그

- 기본 구문 

- <prefix : 태그명 속성  = "속성값" [속성 = "속성값".. ]>

- prefix : 태그 library를 구분하기 위한 이름 (접두어)

- xml 문법을 따른다.

- 대소문자 구분    ※ HTML은 대소문자 구분 없다.

- 속성의 값은 ' 또는 " 으로 감싸준다.

- 태그는 반드시 닫아야 한다.

ex)

<c:forEach item="list" var="mto"> </c:forEach>

<jsp:getProperty name='cto' property='name'/>


● 표준 액션 태그

 - JSP 스펙에서 제공하는 액션태그

- 따로 library를 설정할 필요 없이 web container가 제공한다.

- 구문

<jsp:태그명 속성='값' ...>

- 주요 태그

- Attribute로 설정된 빈 객체와 연동하기 위한 태그

- useBean, setProperty (특정 빈에 값 셋팅), getProperty (

- 수행을 이동하기 위한 태그

- include, forword, param


※ <jsp:useBean>

- 속성 영역(page, request, session, application) 에 binding 된 속성 객체를 lookup 한다. 만약 가져오지 못하면 생성하여 그 영역에 binding 한다.

- 태그의 attribute(속성)

- id : 자바 식별자, binding시 설정 이름

- class : lookup 할 클래스의 이름. fully name으로 설정

- scope : 속성 영역, 값 : page(기본), request, session, application

ex )

<jsp:useBean id="mto" class="dto.MemberDTO" scope="request"/>

→ 의미

- MemberDTO mto = (MemberDTO)request.getAttribute("mto");

if(mto==null){

mto = new MemberDTO();

request.setAttribute("mto", mto);

}


※ <jsp:setProperty>

- <jsp:useBean> 태그로 lookup 한 객체 (Attribute)의 property에 값을 설정하는 태그

- Lookup 한 Attribute의 setter메소드를 호출하여 값을 설정 한다.

- 명시적인 값을 설정

- 요청 파라미터로 넘어온 값을 설정

- 속성

- name : 값을 설정할 bean의 이름. useBean의 id 값

- property : 값을 설정할 property 명. (setter메소드에서 set을 제외한 이름)

- value : 설정할 값

- param : 요청파라미터의 값을 설정할 경우, 요청 파라미터의 이름

  - 요청 파라미터로 넘어온 값을 설정할 경우 property의 이름과 요청 파라미터의 이름이 동일한 경우 param을 생략 할 수 있다.

  - ex)

<jsp:setProperty name = "mto" property="id" value = "myid" />

 → 의미 : mto.setId("myid");

--------------------------------------------------------------------------------

<jsp:setProperty name="mto" property = "name" param="p_name" />

 → 의미 : mto.setName(request.getParameter("p_name"));



※ <jsp:getProperty> 태그

- <jsp:useBean> 태그로 lookup한 객체의 property 값을 조회하여 출력하는 태그

- bean 객체의 getter 메소드를 호출한다. (getXXX 또는 isXXX)

- 속성

- name : 프라퍼티를 조회할 객체의 이름. useBean의 id값

- property : 조회할 프라퍼티의 이름 (getter 메소드의 이름)

- ex) <jsp:getProperty name = "mto" property="age" />

→ 의미

 <%= mto.getAge() %>



※ <jsp:forword>

- JSP의 수행을 다른 컴포넌트로 (JSP, Servlet, HTML) 로 이동하는 태그

- RequestDispacher객체.forword() 실행을 태그화 하는 것.

- 요청 Dispatch 방식으로 이동

- 속성

- page : 수행을 이동항 컴포넌트의 url 설정

- ex)<jsp:forword page="abc.jsp/>

→ 의미

  RequestDispatcher rdp = request.getRequestDispatcher("abc.jsp");

  rdp.forword(request, response);

Posted by 김마농

JSP -> 서블릿


서블릿

-callBack 

-init() - jspInit()

-service() _jspService()

-destroy() _jspDestroy()


JSP TAG

 - 스크립트 태그(Script) - java 코드를 넣는 tag

 - 액션 태그(tag) - JSP에서 JAVA코드를 대신하기 위한 tag

○ 표준 액션 tag : servlet/jsp spce에서 제공

○ Custom tag : 사용자 정의 태그


JSP TAG

 - 스크립트

 - action

 - Expression Language : 표현언어



JSP 스크립트 태그

- 지시자(Directive)태그


- 표현식(Expression) 태그

<%=dto.getId() %>


- 선언자(Declaration) 태그 (X)

쓰이는 경우는 거의 없다.


- 스크립트릿(Scriptlet) 태그

가장 많이 쓰인다.


 - 주석



○ 지시자 태그

- Web container가 JSP를 Servlet으로 변환 할때 특정 지시를 내리기 위해서 사용하는 태그

- 구문

<%@ 지시어 속성="값" [속성="값" . . ..] %>

<%@page import="member.dto.MemberDTO"%>

- 지시어

- page : 페이지의 기능, 특징을 지시

- include : jsp 페이지에 다른 페이지를 포함시킬 것을 지시

- taglib : jsp페이지에서 사용할 customer tag 라이브러리를 등록을 지시


-page 지시자

-페이지에 관련된 기능 환경을 정의하는 지시어

- 속성

import : jsp에서 사용할 클래스들을 import할때 사용

contentType : response.setContentType()의 인수로 들어갈 값 설정

session : 내장객체 session의 생성 여부 설정. 값 : true/false,true가 default

errorPage : jsp가 실행 도중 exception이 발생했을때 이동할 url 지정


○ 표현식 태그

-응답 Stream을 통해 출력하기 위한 태그

-구문

<%=출력내용%>

ex)

<%="안녕하세요"%> -> 서블릿 변환 -> out.print("안녕하세요");

<%int i=10;%><%=i> -> 서블릿 변환 -> out.print(i);

<%=dto.getId() %>

-서블릿으로 변환시 out.print(출력내용); 으로 변환됨


○ 선언자 태그

-JSP가 서블릿으로 변환될때 서블릿의 member 변수(Field)나 member 메소드를 선언할때 사용

-jspInit(), jspDestroy() 오버라이딩시 사용

_jspService()는 오버라이딩해서는 안된다.

-구문

<%! 선언문 %>


○ 스크립트 태그

-클라이언트의 요청에 대해 서비스하는 동적 코드(java 실행 구문)을 작성 하기 위한 태그

-태그내의 코드는 _jspService()의 로컬 코드로 삽입된다.

- 구문

<% java 코드%>

-ex)

<%if(i){%> ->java code

10보다 큽니다.-> html코드
<%}%> ->java 코드


-> _jspService(){

if(i>10){

out.println("10보다 큽니다.");

}

}


○ 주석

-jsp에서의 주석

-html주석 <!-- 주석 내용 --!> : client에 전송이 됨

-JSP 주석 : <%-- 주석내용 --%> : client에 전송이 안됨

-java 주석 : //, /*주석내용 */

-스크립트릿, 선언자 태그에서 사용 가능


○ 내장 객체(Implicit variable)

-JSP에서 기본적으로 제공해주는 객체

-변수의 선언, 객체의 생성, 할당 없이 JSP 태그에서 사용할 수 있는 객체

-JSP가 서블릿으로 변환될때 web container가 생성해서 제공

-종류

-request : HttpServletRequest

-response : HttpServletResponse

-out : JspWriter -Servlet에서의 PrintWriter 역할

-session : HttpSession -<%@ page session="false"%>로 설정하면 안 생긴다.

-application : ServletContext

-config : ServletConfig(초기 파라미터 조회 말고 안쓰인다)

-pageContext : PageContext - Servlet에는 없는 객체로 다른 내장 객체들을 생성할 수 있다.(커스텀 태그 만들때 쓰인다)

-page : this - 서블릿 객체 자신

-exception : Throwable -<%@ page isErrorPage="true"@%>로 설정된 경우만 생성(default는 false)


Posted by 김마농

-HttpSession을 이용한 Session관리

-클라이언트의 상태값을 서버측에 저장하여 Session관리

-javax.servlet.httpSession 객체를 이용하여 관리한다.

-클라이언트의 상태값은 Attribute로 관리됨


-장점

-관리할 수 있는 상태값(클라이언트 데이터)의 종류나 크키나 개수의 제한이 없다.

-서버에 저장되므로 cookie에 비해 보안상 유리

-단점

-서버에 부담을 준다


-HttpSession 객체 생성

-HttpServletRequest객체.getSessioin()

-기존 Session이 있으면 기존 Sessioin객체를, 없으면 새로 생성하여 리턴


-HttpServletRequest객체.getSession(false)

-기존 Session이 있으면 기존 Sessioin객체를, 없으면 null을 return

- JSP와 Servlet을 같이 쓰면 이걸 쓸 경우는 거의 없다.


-HttpSession 객체의 주요 메소드

-setAttribute(String name, Object Value);

-getAttribute(String name) : Object value

-removeAttribute(String name)

-getAttributeNames() : Enumeration

-invalidate() : session 객체를 소멸시킨다 -로그아웃할때 이용한다.

-setmaxInactiveInterval(int 초) : 클라이언트가 마지막 요청을 한 뒤 인수로 받은 시간만큼 지나도 요청이 안들어 오면 session을 소멸시킨다. (자동로그아웃)

-getId() : String - jsessionID값 리턴



<HttpSession 예제 만들기>

개요

- Write_form.html을 이용하여 텍스트박스를 만든뒤 아무 String값을 넣었을떄 저장한다.

- 저장한 String 값을 ShowServlet을 이용하여 출력해준다.

- 저장된 String 값을 RemoveServlet을 이용하여 제거한다.


package : servlet.session

name :     WriteServlet - /session_write

               ShowServlet - /session_show

               RemoveServlet - /session_remove


- html

WebContent

폴더  : session

이름 : write_form.html


[WriteServlet.java]


[ ShowServlet]


[RemoveServlet]


[write_form.html]


결과 화면

1. Write_form.html을 실행하여 아무 단어나 쳐본다.


2. 현재까지 입력된 값과 jSessionID가 출력되면 성공한것이다. 


3. RemoveServlet을 실행하였을 경우 모든 List가 사라지기 때문에 <입력한 글 보기>를 선택해봤자 아까 list가 null값이면 write_form.html로 리다이렉트 설정을 해줬기 때문에 write_form.html로 이동하게 된다.


Posted by 김마농

 요청 디스패치(Request Dispatch)방식

-Request(요청)이 살아있는 상태에서 수행을 이동시킨다.

-Request Scope를 이용해 데이터(attribute)를 공유 할 수 있다.

-javax.servlet.RequestDispatcher 객체를 이용해 처리

- 요청 디스패치가 더 많이 쓰이는 방식이다.


-구문

RequestDispatcher drp = request.getRequestDispatcher("url");

- 웹브라우저를 기준으로 해야 하기 때문에 절대경로를 쓰지 않는다.

rdp.forward(request,response);


<요청 디스패치 예제>

개요

 - 체크박스를 선택하면 정상적으로 화면이 출력된다.

 - 만약 체크박스를 선택하지 않았다면 error.jsp로 이동하여 에러화면이 출력된다.


servlet

package : servlet.dispatch

name : ErrorPronServlet

url : /error_pron_dispatch


html

folder : dispatch

이름 :req.html

  error.jsp


[ErrorPronServlet.java]


[req.html]


[error.jsp]


결과 화면

1. 체크를 선택했을 경우



2. 체크를 선택하지 않았을 경우



위 화면과 같이 출력되면 성공이다.



Posted by 김마농

ServletContext를 이용한 회원검색 서비스



위와 같은 사진처럼 ID, 이름, 나이, 성별을 입력하고 전송을 누르면 회원정보들이 출력되는 서비스를 만들 것이다.


<html>

request_member_form.html


<Listener>

SaveRequestMemberListener.java


ShowAllReqMemberServlet.java


SaveReqMemberServlet.java


<MemberDTO>

MemberDTO.java



Posted by 김마농

Session 관리

-Http프로토콜은 stateless한 특징을 가진다.

-stateless -상태유지를 못한다 -> 클라이언트의 데이터를 유지하지 못함


-Session

○하나의 클라이언트가 프로그램을 시작해서 종료할때까지

○하나의 세션동안 여려번의 요청과 응답이 반복 될 수 있다.

○하나의 세션동안 클라이언트의 데이터는 유지되어야 한다.


-Session 관리 개념

○HTTP 프로토콜의 특징은 클라이언트의 상태를 유지 못하므로 CGI에서 지원

○방식

-Cookie를 이용

-Session을 이용

-URLRewriting을 이용


-Cookie를 이용한 Session관리

○쿠키

- 서버가 브라우저(client)로 전송하는 text 데이터

- 쿠키는 클라이언트의 정보를 유지하기 위한 데이터로 Web Browser에 저장된다.

->클라이언트 단에 저장

- key-value 형태로 관리된다.

- 저장 데이터의 종류는 문자열만 가능

-Web Browser는 쿠키를 사이트 별로 관리한다.

-웹브라우저가 종료되면 쿠키는 죽어버린다.


○장점

-서버에 부하를 줄일 수 있다.


○단점

-관리 할 수 있는 데이터의 종류, 크기에 제약이 있다.

-보안상 문제가 있다.


○구문

-쿠키 생성

-javax.servlet.http.Cookie 사용 - 하나의 쿠키 값을 가지는 객체

-HttpServletResponse.addCookie(Cookie c) : 쿠키를 client로 전송

ex)Cookie c = new Cookie("name","value");

response.addCookie(c);


-쿠키값 조회

-HttpServletRequest.getCookies() : Cookie[]

ex)Cookie[] c = request.getCookies();


- Cookie 클래스 주요 메소드

-getName() : String  - name 값 조회

-getValue() : String  -value 값 조회

-setMaxAge(int 초(sec)) - 쿠키가 웹 브라우저에 저장될 시간 설정

- 초: 양수 = 지정될 시간

: 음수 = web browser가 살아있는 동안까지만

: 0초 = 삭제

- 한글 encode처리




<Cookie 예제>

개요

- SetCookie로 현재 시간을 알아내서 cookie에 저장한다. 

- GetCookie로 SetCookie에서 넘겨준 값을 출력한다.

Servlet

folder : servlet.cookie

GetCookieServlet.java

SetCookieServlet1.java

url : /getServlet

/setServlet


HTML

folder : cookie

cookie.html


[GetCookieServlet.java]


[SetCookieServlet1.java]


[cookie.html]


결과화면

1. SetCookie를 실행한다.


2. GetCookie요청을 누르면 getCookie가 실행되어 set에서 넘겨준 값을 출력한다.


SetCookieServlet을 통해 쿠키 정보를 전송하고 GetCookieServlet을 조회하면 전송된 쿠키가 출력된다. 하지만 GetCookieServlet을 통해 서버를 재 시작하면 request.getCookie()를 통해 조회한 값이 없어진다. 즉, 웹브라우저가 살아 있는 동안만 쿠키 정보를 조회할 수 있다.


Posted by 김마농

○ Multi-thread상황에서 Data 동기화(Synchronized)

- 데이터를 공유하는 상황에서 한 클라이언트가 데이터 사용중인 다른 클라이언트가 이 데이터를 수정했을때 데이터의 무결성이 깨져 버린다.


○ Multi thread 상황에서 Data동기화 문제의 소지(synchronized)

- Local 변수 (X)

- Instance 변수 (O) : 동시에 변경을 시도 할때

- Static 변수 (O)

- Attribute

◎ request scope (X)

◎ session scope 이론적으로는 가능(O), 실제로는 불가능(X)

◎ application scope (O)


○ Data 동기화 처리 개념

- 사용중인 데이터에 Lock을 건다.


구문

synchronized(this){


데이터 사용


} //데이터 사용 끝(Lock 해제)


◆ synchronized 사용전

- 동시에 두 클라이언트가 접속을 시도하면 5초후 둘다 같은 숫자를 부여 받는다.


◆ synchronized 사용후

- 동시에 두 클라이언트가 접속을 시도하면 조금이라도 먼저 시도한 클라이언트가 5초 후 앞 번호를 가져간다. (다른 숫자 부여)

  그리고 2번쨰 클라이언트는 총 10초의 sleep time을 갖는다.(앞 클라이언트의 작업이 끝날 동안 Lock이 걸리기 때문)

Posted by 김마농

리다이렉트(Redirect)방식

- 응답시 클라이언트에게 요청할 url을 알려주어 다시 요청하도록 하는 방식

- 요청과 응답이 한번 더 일어난다.

- Request Scope를 이용한 데이터(Attribute) 공유를 할 수 없다.

-HttpServletResponse 객체를 이용하여 처리




-구문

response.sendRedirect("url");

- 웹브라우저를 기준으로 해야 하기 때문에 절대경로를 쓰지 않는다.

 

<요청 리다이렉트 예제>

개요

 - 체크박스를 선택하면 정상적으로 화면이 출력된다.

 - 만약 체크박스를 선택하지 않았다면 error.jsp로 이동하여 에러화면이 출력된다.


Servlet

package : servlet.redirect

name : ErrorPronServlet

url :/error_pron


html

folder : /redirect/req.html

                 error.jsp


[ErrorPronServlet.java]


[req.html]


[error.jsp]


결과 화면

1. 체크를 선택했을 경우




2. 체크를 선택하지 않았을 경우



위 화면과 같이 출력되면 성공이다.


Posted by 김마농

Attribute(속성)

-Attribute(속성)이란?

Web Application 구성 컴포넌트들(Servlet,m JSP, Listener)이 공유하는 객체



-scope(적용영역)

- Attribute들을 공유하기 위한 공유 장소의 영역(저장장소)

- 공유 범위에 따라 3가지 영역이 있다.


1. requset scope : HttpServletRequest 이용

-요청 ~ 응답까지 공유


2. session scope : HttpSession 이용

-한명의 클라이언트(웹브라우저)가 로그인 ~ 로그아웃

3. application scope : ServletContext 이용

-Application 시작 ~ 종료시까지 공유


- 관련 메소드

Attribute는 key-value쌍으로 관리된다.

*setAttribute(String key, Object value) : 공유영역에 Attribute 저장 [Binding]


*getAttribute(String key) : Object value : 저장된 Attribute 조회 [lookup]


*removeAttribute(String key) : 저장된 Attribute 삭제


*getAttributeNames() : Enumeration : Attribute들에 연결된 name들 조회



<예제>

[SetAttributeServlet.java]


[GettAttributeServlet.java]


결과




Posted by 김마농

Event 모델

- Event : 컴포넌트에 가해진 동작, 변화

- Event Listenter

1. 컴포넌트에서 Event가 발생하는 것을 감시하는 Container.

2. 발생한 Event를 처리하는 동작을 가진 객체(Listener class)

- Event Handler : 발생한 Event를 처리하는 동작(메소드)

- Event Source : Event가 발생한 컴포넌트 

ex)버튼을 클릭하면 안녕이라고 출력한다.


Event Source : 버튼

Event : 클릭

Event Handler : 안녕을 출력하는 동작


ServletContextEvent

시작하고 종료될때 2번 생성된다.


<예제>

1. Listener를 다음과 같이 추가한다.


2. 패키지와 클래스 이름은 다음과 같이 작성해준다. 그리고 Next를 선택한다.


3. LiftCycle 체크박스를 체크를 해주고 Finish를 선택하여 완료한다. 


4. Listener코드는 다음과 같이 작성한다. 우리는 이 코드로 Listener가 언제언제 작동하는지 확인할 것이다.



5. 그리고 서버를 올리게 되면 contextInitialized가 작동하여 다음과 같이 출력된다.


6. 서버를 stop하면 contextDestroy가 작동하여 다음과 같이 출력한다.


Posted by 김마농