My Trace/T아카데미

[T아카데미] 모바일 서버 프로그래밍 기본 - 2일차

Junhong Kim 2016. 6. 28. 17:50
728x90
반응형

JSP(Java Server Page)

- JSP도 서블릿과 마찬가지로 자바를 기반으로하는 웹 어플리케이션 프로그래밍 기술이다.

- JSP는 HTML, XML 등 클라이언트가 요청한 문서를 생성하는데 주로 사용된다.

- WebContent 아래에 만들어서 사용


JSP 실행 과정

- 웹 컨테이너는 JSP 문서 전체를 서블릿 클래스의 소스 코드로 변환 후 컴파일하여

  서블릿으로 만든 다음 실행하여 그 결과를 웹브라우저로 전달한다.


[Servlet과 동일한 기능]

init = _jspInit

destory = _jspDestory

service = _jspService


JSP의 기초 문법


● 지시자(Driective)

 : JSP페이지에 대한 설정 정보를 지정할 때 사용, <%@ ... %>


1) page

 : 자바의 import를 쓰려면, <%@ page %> 는 여러개 있어도 된다.


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

<%@ page import = "java.util.Date" %> // import 구문을 대신 만들어 주는 지시자

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


<%@ page import = "java.util,Date,java.util.ArrayList" %> // 한번에 여러개 쓰려면 ,(comma)로 구분


※ 일일히 안쓰고 자바 클래스 뒤에 [ctrl + space] 하면 이클립스가 자동완성으로 도와주기 때문에 직접 타이핑 하는 일은 없다.


2) include

 : include 지시자는 다른 JSP 페이지나 HTML 문서를 불러다가 현재 JSP 페이지의 일부로 포함한다.


2-1) static include (JSP 에서만 가능)

- 불러올 대상은 file 이라는 속성을 이용해 지정할 수 있다.


<%@ include file="d2.jsp" %>

※ 포함할 file에 있는 변수 이름과 포함한 file에서 동일한 변수 이름을 사용할 수 없다


2-2) dynamic include (JSP 에서만 가능)

- 다른 문서를 또다른 jsp에 포함시키기 위함.

- 메소드 단위로 분리 된다.

<jsp:include page="d2.jsp"></jsp:include>


[위 처럼 사용하면 아래 처럼 변환 된다]

org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "d2.jsp", out, false);


2-3) Servlet에서 include 하는 방법

<%

RequestDispatcher dispatcher = request.getRequestDispatcher("d2.jsp");

dispatcher.include(request, response);

%>


3) taglib

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


● 스크립트 요소

 : JSP에서 실시간으로 문서 내용을 생성하기 위해 사용, 스크립트 요소 내의 자바코드는 서버 쪽에서 실행된다.


1) 선언부(Declaration) :  자바 메서드(함수) 생성, <%! 자바 코드 %> 

- 멤버 영역으로 이동시킴

- 멤버 변수를 정의하거나 멤버 메서드를 정의할 때 사용하는 것

2) 스크립트릿(Scriptlet) : 자바코드 실행, <% 자바 코드 %>

3) 표현식(Expression) : 값 출력, <%= 변수명 %> // 얘는 semi-colon이 필요 없다. 왜냐하면 변환하여 자동적으로 만들어주기 때문

4) 주석 : JSP 주석, <%-- 주석 내용 --%> // 소스보기할 때 보이지 않는다.



<%

    for(int i = 0; i < 10; i++) {

%>

    <tr><td>값 <%= i %></td></tr>

<%

    }

%>



● 기본 객체(내장 객체)

 : 웹 어플리케이션 프로그래밍을 하는데 필요한 기능을 제공하는 객체


1) request : 서블릿 doGet, doPost 메소드의 첫번째 파라미터와 동일한 역할

2) response : 서블릿 doGet, doPost 메소드의 두번째 파라미터와 동일한 역할

3) out : 웹 브라우저로 HTML 코드를 출력하는 기능

4) session : 세션에 관련된 기능

.. 등 9개


● 표준 언어 - 익스프레션 언어 ${ ... }

 : JSP 페이지 내부에서 사용되는 간단한 스크립트 언어, ${...}


1) 익스프레션의 식

    <%= nTotal =>

2) 익스프레션 언어의 식 (EL식)

    ${ nTotal }

※ 익스프레션 언어? 복잡한 로직이나 데이터는 서블릿에서 처리하고 그 결과를 출력하는 일만 JSP가 담당하도록 만드는 방법.


● JSP 페이지가 이동에 사용되는 메서드

* forward 메소드

- forward 메소드는 JSP뿐만아니라 서블릿이나 HTML 문서 등 다른 웹 자원의 호출도 가능하다.

  호출할 곳에서 할 일을 모두 마치고 정보처리의 흐름을 넘겨 주고자 할 때 주로 사용 한다.



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%

        // 두 수를 입력받아 그 합을 구하라

String num1 = request.getParameter("num1");

String num2 = request.getParameter("num2");

int su1 = Integer.parseInt(num1);

int su2 = Integer.parseInt(num2);

int sum = su1 + su2;

// g2.jsp에서 출력

        // 두번째 파라미터에 객체형을 넣어야하는데, 요즘은 자동으로 래퍼클래스로 변환 됨.

request.setAttribute("sum", sum); 

//request.setAttribute("num1", num1);

        //다른 문서에 끼기 or 다른 문서에서 가져오기

RequestDispatcher dispatcher = request.getRequestDispatcher("g2.jsp");

dispatcher.forward(request, response);

%>



* forward / sendRedirect

[공통점]

- 다른 JSP 페이지나 HTML 문서를 호출하는 방법으로는 sendRedirect 메소드를 사용하는 방법과 forward 메소드를 사용하는 방법이 있다.


(예: forward)

RequestDispatcher dispatcher = request.getRequestDispatcher("g2.jsp");

dispatcher.forward(request, response);

(예: redirect)

response.sendRedirect("login.html");


[차이점]

1) sendRedirect 메소드는 URL이 브라우저에서 호출되지만, forward 메소드는 서버에서 직접 호출됨

2) sendRedirect 메소드는 다른 웹 서버의 자원도 호출할 수 있지만,

  forward 메소드는 같은 웹 어플리케이션 디렉토리 내에 있는 자원만 호출 가능

- forward 메소드는 서버에서 직접 호출 됨 (서버 내에서만 이동이 가능)

- sendRedirect 메소드는 URL이 브라우저에서 호출 됨 (다시 호출하는 것) - 302가 요청이 오면 다시 응답을 함. 그래서 두번 접속, 2개 뜸

- forward 서버에 다시 접속 / sendRedirect 클라이언트에 다시 접속


※ 모바일 서버 개발자는 sendRedirect 를 사용하면 안된다. (만약 이동해야 한다면 forward를 써야 함)


● 쿠키(Cookie)

 : 여러개의 화면으로 구성된 웹 어플리케이션에서 로컬에 있는 쿠키 데이터 저장소를 이용해 데이터를 주고 받는 방법.

   - 쿠키 기술은 전달할 데이터를 웹 브라우저로 보냈다가 웹 서버 쪽으로 되돌려 받는 방법이다.

   - 로컬에 있는 쿠키 저장소는 브라우저가 관리하는 디렉토리 혹은 메모리 영역이다.

   - 클라이언트 컴퓨터의 하드에 저장된다(C: , D: 에 저장 됨)


쿠키는 (name,value) 쌍이다. 쿠키의 두번째 파라미터는 문자열 밖에 안 됨.


1) 쿠키저장

response.addCookie();


2) 쿠키조회

request.getCookies();


3) 쿠키삭제

/* 1시간 동안 유효한 쿠키 설정 */

cookie.setMaxAge(3600); // 60 * 60


/* 바로 삭제되는 쿠키 */

cookie.setMaxAge(0);


/* 웹 브라우저가 끝날 때 삭제되는 쿠키(default)*/

cookie.setMaxAge(-1);


● 세션(Session)

 : 여러개의 화면으로 구성된 웹 어플리케이션에서 웹 서버에 있는 데이터 영역을 이용해 데이터를 주고 받는 방법.

   - 서버의 메모리에 저장


1) 사용

// default : true

// true    : 세션이 없으면 세션을 생성하고 그 객체를 반환, 세션이 있으면 세션 객체를 반환

// false   : 세션이 없으면 null 반환, 세션이 있으면 세션 객체를 반환

HttpSession session = request.getSession(true); // 세션 만들기

session.setAttribute("name", "BOB");

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


<%@ page %> 지시자에 session ="false" 를 하면 직접 다시 session 객체를 만들어야 한다

    true일 경우에는 기본으로 내장되어있는 session 객체를 그냥 사용하면 됨.


2) 삭제

session.removeAttribute("name"); // 세션 데이터 삭제

session.invalidate(); // 세션 끝내기, logout 등에서 사용


3) 수정

session.setAttribute("name","COC");


● JSP 액션 (표준 액션)

 : XML 태그와 같은 모양을 취하며 JSP 페이지에서 다른 페이지의 서블릿이나 자바 빈의 객체에 접근할 수 있도록 태그를 이용해 구현된 기능

   - JSP 규격서에서는 XML 기술을 이용해 기존의 JSP 문법을 확장하는 방법을 제공.

   - 자바소스를 대체 해주는 것


1) <jsp:useBean>

 - JSP상에서 자바 객체를 만들고자 할 때 사용하는 액션 태그이다.


 

<%@page import="com.tacademy.sam.controller.Data"%>

<%

Data d1 = new Data();

%>

<jsp:useBean id="d2" class="com.tacademy.sam.controller.Data"></jsp:useBean>


 

* <jsp:useBean>의 scope 의미 - 웹에서 사용하는 것

1) page 영역 : 하나의 JSP페이지를 처리할 때 사용되는 영역 -- 현재

2) request 영역 : 하나의 HTTP 요청을 처리할 때 사용되는 영역 -- 서로 같은 객체

3) session 영역 : 하나의 웹 브러우저와 관련된 영역 -- 서로 다른 객체, 서울 사람/제주도 사람 다르게

4) application 영역 : 하나의 웹 어플리케이션과 관련된 영역 -- 서로 같은 객체, 모든 서버에서 하나만


 

2) <jsp:jsp:setProperty>

 - useBean 태그를 통해 생성한 객체의 속성을 변경하고자 할 때 사용하는 액션 태그이다.


 

<%@page import="com.tacademy.sam.controller.Data"%>

<%

Data d1 = new Data();

d1.setName("korea");

%>


<jsp:useBean id="d2" class="com.tacademy.sam.controller.Data"></jsp:useBean>

<jsp:setProperty property="name" name="d2" value="korea"/>




3) <jsp:jsp:getProperty>

 - useBean 태그를 통해 생성된 객체의 멤버 변수값을 클라이언트로 전송하는 액션태그이다.


 

<body>

name <%= d1.getName() %><br>

name <jsp:getProperty property="name" name="d2">

</body>


 

4) <jsp:forward>

 - 다른 JSP 페이지로 제어를 넘기자고할 때 사용하는 액션태그이다.

RequestDispatcher dispatcher = request.getRequestDispatcher("g2.jsp");

dispatcher.forward(request, response);

 

<jsp:forward page="a4.jsp"></jsp:forward>

 

- 위 두가지 코드는 동일한 기능 -

 

● JSTL(JSP Standard Tag Library) : 표준 태그 라이브러리

 : 커스텀 태그 중 자주 사용되는 것들을 별도로 표준화한 태그 라이브러리

  - JSP에서 사용할 수 있는 다양한 커스텀 액션과 함수를 제공하는 외부 라이브러리

 

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

 

<c:forEach var="cnt" begin="1" end="5"/> // step 생략하면 step="1"

<c:forEach var="dish" items="${MENU}"/>


● 커스텀 태그

 : JSP를 확장시켜 주는 기능으로 액션 태그와 마찬가지로 태그 형태로 기능 제공


<%@taglib prefix="util tagdir="/WEB-INF/tags" %>

                  ㄴ표준은 jsp       ㄴ태그의 위치

 

● 서버 응답 코드 값

100대 : 아직 서버가 클라이언트에 다온게 아니다 (버퍼링 중) - 잠시 대기중, 거의 안함

 

200대 : 성공, 서버가 클라이언트로 잘 보냈습니다.  (사실상 200대는 200밖에 없음)

 

300대 : 서버에서 클라이언트로 보내는게 아니라 다른 애한테 붙어서 받아가라, 브라우저가 다시 접속 (예) sendRedirect - 모바일은 X

 

400대

 - 404 : 클라이언트가 없는 파일을 요청하면 발생

 - 405 : 클라이언트 요청을 서버에 처리할 것이 있는지, 없는지

 

500대 : 서버쪽에서 실행하다가 서버가 오류나면 클라이언트에게 알려 줌


 

Project Path

C:\webDev\work\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost


Eclipse Shortcut

ctrl + f11 : 런 (실행)

ctrl + shif + f : 자동 정렬


*Error

405 : HTTP method Get is not supported by this URL (GET방식이 없음)


500 : 서버 에러 - org.apache.jasper.JasperException (JSP 를 .java 만들다가 에러, 즉 오타)

 

---

 

아파치 : 서버역할만 한다.

톰캣은 서버 역할과 웹엔진 역할을 한다.


웹 응용 프로그램 3가지


1) Filter 2)Listener 3)Servlet

 

---

 

 - json 객체로 보내야 모바일 os가 받을 수 있따.

 - gson으로 list를 객체로 가져오면 공백이 발생한다.

   json은 { } 로 시작해야하는데 공백(\r)이 날라오는 현상이 있는데 이는 줄바꿈 때문에 의해서 발생하는것임. 그러므로 delete로 댕겨야함

 

* json data 들을 list로 만들어서 객체화 시켜서 넘겨줘야 함

 

 

 public class ProductListResult {
 String status;
 int size;
 ArrayList<Product> list;
 
 public String getStatus() {
  return status;
 }
 public void setStatus(String status) {
  this.status = status;
 }
 public int getSize() {
  return size;
 }
 public void setSize(int size) {
  this.size = size;
 }
 public ArrayList<Product> getList() {
  return list;
 }
 public void setList(ArrayList<Product> list) {
  this.list = list;
 }
 
 @Override
 public String toString() {
  return "ProductListResult [status=" + status + ", size=" + size + ", list=" + list + "]";
 }
}

 

 

* gson을 사용하여 json 객체를 넘겨줌.

 

 

 ArrayList<Product> list = new ArrayList();
 list.add(new Product("p10001","온도계1",2000));
 list.add(new Product("p10002","온도계2",3000));
 list.add(new Product("p10003","온도계3",4000));
 list.add(new Product("p10004","온도계4",5000));
 
 //request.setAttribute("list", list);
 Gson gson = new Gson();
 ProductListResult listResult = new ProductListResult();
 listResult.setList(list);
 listResult.setStatus("success");
 listResult.setSize(list.size());
 String result = gson.toJson(listResult);
 
 //String result = gson.toJson(list);
 
 request.setAttribute("result", result);
 
 RequestDispatcher dispatcher = request.getRequestDispatcher("d4.jsp");
 dispatcher.forward(request, response);

 

 

 

 


728x90
반응형