반응형

 

 

 

 

 

 

1. 데이터베이스에 접속하기

mysql -h127.0.0.1 -uconnectuser -p connectdb

 

2. 비밀번호 입력

쏼라쏼라

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

1. Web API 디자인 가이드

  • URI는 정보의 자원을 표현해야 합니다.
  • 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE)로 표현합니다.

 

 

자원에 대한 행위는 HTTP Method로 표현

 

 

 

 

2. URI는 정보의 자원을 표현해야 한다.

  • GET /members
    : 위의 표현은 맴버의 모든 정보를 달라는 요청입니다.
  • GET /members/delete/1
    : GET은 정보를 요청할 때 사용합니다. 위와 같이 동사로 삭제를 표현하면 안 됩니다.
  • DELETE /members/1
    : HTTP Method 중의 하나인 DELETE를 이용하여 삭제를 표현해야 합니다.

 

3. 자원에 대한 행위는 HTTP Method로 표현

  • GET /members/1                   (o)
  • GET /members/get/1             (x)
  • GET /members/add                 (x)
  • POST /members                       (o)
  • GET /members/update/1        (x)
  • PUT /members/1                     (o)
  • GET /members/del/1               (x)
  • DELETE /members/1               (o)

 

 

 

 

4. 슬래시 구분자(/)는 계층을 나타낼 때 사용

http://domain/houses/apartments

http://domain/departments/1/employees

  • URI 마지막 문자로 슬래시 구분자(/)를 포함하지 않습니다.
  • 하이픈(-)은 URI가독성을 높일 때 사용합니다.
  • 언더바(_)는 사용하지 않습니다.
  • URI경로는 소문자만 사용합니다.
  • RFC 3986(URI 문법 형식)은 URI스키마와 호스트를 제외하고는 대소문자를 구별합니다.
  • 파일 확장자는 URI에 포함하지 않습니다.
  • Accept Header를 사용합니다.

 

 

 

 

5. 상태 코드

상태 코드 (성공)

 

 

 

 

 

상태 코드 (클라이언트로 인한 오류)

 

 

 

 

 

 

 

상태 코드 (서버로 인한 오류)

 

 

 

 

 

6. Web API 실습 코드

 

<!-- web.xml 파일을 삭제해도 eclipse에서 오류가 발생하지 않는다. -->
		<failOnMissingWebXml>false</failOnMissingWebXml>
	</properties>
	<dependencies>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.45</version>
		</dependency>

		<!-- json 라이브러리 databind jackson-core, jackson-annotaion에 의존성이 있다. -->
		<dependency>
			<groupId>com.fasterxml.jackson.core</groupId>
			<artifactId>jackson-databind</artifactId>
			<version>2.9.4</version>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId>
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>3.8.1</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

pom.xml

 

 

 

package kr.or.connect.webapiexam.api;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;

import kr.or.connect.jdbcRole.dao.RoleDao;
import kr.or.connect.jdbcRole.dto.Role;


@WebServlet("/roles")
public class RoleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public RoleServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setCharacterEncoding("utf-8");
		response.setContentType("application/json");		// 

		RoleDao dao = new RoleDao();

		List<Role> list = dao.getRoles();
		
		// json 패키지가 제공 : json문자열로 바꾸거나, json문자열을 객체로 바꾸어줌
		ObjectMapper objectMapper = new ObjectMapper();
		String json = objectMapper.writeValueAsString(list);
		
		PrintWriter out = response.getWriter();
		out.println(json);
		out.close();
	}

}

 RoleServlet.java

 

 

 

 

 

 

 

 

 

 

7. Web API 실습 코드 2

 

package kr.or.connect.webapiexam.api;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.fasterxml.jackson.databind.ObjectMapper;

import kr.or.connect.jdbcRole.dao.RoleDao;
import kr.or.connect.jdbcRole.dto.Role;


@WebServlet("/roles/*")			// 어떤 문자든지 올 수 있다.
public class RoleByIdServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public RoleByIdServlet() {
        super();
        // TODO Auto-generated constructor stub
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setCharacterEncoding("utf-8");
		response.setContentType("application/json");

		String pathInfo = request.getPathInfo(); // /roles/{roleId}
		String[] pathParts = pathInfo.split("/");
		String idStr = pathParts[1];
		int id = Integer.parseInt(idStr);

		RoleDao dao = new RoleDao();

		Role role = dao.getRole(id);

		ObjectMapper objectMapper = new ObjectMapper();
		String json = objectMapper.writeValueAsString(role);

		PrintWriter out = response.getWriter();
		out.println(json);
		out.close();
		
	}

}

RoleByIdServlet.java

 

 

 

 

 

-> url 의 정보를 가져와서 roleId 가 501 번인 정보를 가져와서 json 형식으로 출력한다.

 

 

이처럼 JDBC와 서블릿을 이용해서 직접 API 를 만드는 경우는 매우 드물다.

대부분 Spring Framework 에서 API를 작성한다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

1. JSTL이란?

  • JSTL(JSP Standard Tag Library)은 JSP 페이지에서 조건문 처리, 반복문 처리 등을 html tag형태로 작성할 수 있게 도와줍니다.
  • for 웹디자이너
  • 자바 코드를 없애고 html 형태로 작성한다.

 

 

 

2. JSTL을 사용하려면?

 

 

 

3. JSTL이 제공하는 태그의 종류

 

 

 

 

4. 코어 태그

 

 

 

5. 코어 태그: 변수 지원 태그 - set, remove

 

 

 

5 -1). 코어 태그 : 실습

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="value1" scope="request" value="song"></c:set>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
성 : ${value1 }<br />
<c:remove var="value1" scope="request"/>
성 : ${value1 }<br />
</body>
</html>

jstl01.jsp

 

 

 

 

 

5 -2). 코어태그: 변수 지원 태그 - 프로퍼티, 맵의 처리

 

 

 

 

 

5 -3). 코어 태그: 흐름제어 태그

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	request.setAttribute("score", 83);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:choose>
	<c:when test="${score >= 90 }">
		A학점입니다.
	</c:when>
	<c:when test="${score >= 80 }">
		B학점입니다.
	</c:when>
	<c:when test="${score >= 70 }">
		C학점입니다.
	</c:when>
	<c:when test="${score >= 60 }">
		D학점입니다.
	</c:when>
	<c:otherwise>
		F학점입니다.
	</c:otherwise>
</c:choose>

</body>
</html>

jstl03.jsp

 

 

-> choose, when, otherwise는 if / else 와 똑같은 기능을 한다.

 

 

 

 

5 -4). 코어 태그: 흐름제어 태그 - forEach

 

 

실습

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
	List<String> list = new ArrayList<>();	
	list.add("hello");
	list.add("world");
	list.add("!!!!!");
	
	request.setAttribute("list", list);
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<c:forEach var="item" items="${list }" begin="1" >
	${item } <br />
</c:forEach>

</body>
</html>

 

jstl04.jsp

 

 

 

-> 인덱스가 1부터 시작하기 때문에 두 번째 리스트값부터 출력한다.

 

 

 

 

 

 

 

5 -5) 코어 태그: 흐름제어태그 - import

 

 

 

실습

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

jstlValue.jsp

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
<c:import url="http://localhost:8080/JSTL_example/jstlValue.jsp" var="urlValue" scope="request"></c:import>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

${urlValue }

</body>
</html>

jstl05.jsp

 

 

-> jstlValue.jsp 에 있는 내용이 jstl05.jsp 에서 출력된다.

 

 

 

 

 

 

5 -6) 코어 태그: 흐름제어태그 - redirect

 

 

 

 

 

5 -7) 코어 태그: 기타태그 - out

 

 

 

실습

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:set var="t" value="<script type='text/javascript'>alert(1);</script>" />

<c:out value="${t }" escapeXml="true"/>
<c:out value="${t }" escapeXml="false"/>

</body>
</html>

jstl07.jsp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

 

 

1. 표현 언어란?

  • 표현 언어(Expression Language)는 값을 표현하는 데 사용되는 스크립트 언어로서 JSP의 기본 문법을 보완하는 역할을 한다.

 

 

2. 표현 언어가 제공하는 기능

  • JSP의 스코프(scope)에 맞는 속성 사용
  • 집합 객체에 대한 접근 방법 제공
  • 수치 연산, 관계 연산, 논리 연산자 제공
  • 자바 클래스 메소드 호출 기능 제공
  • 표현언어만의 기본 객체 제공

 

 

3. 표현언어의 표현방법

${expr}

 

 

 

 

4. 표현언어의 기본 객체

 

pageContext

pageScope

requestScope

sessionScope

applicationScope

param

paramValues

header

headerValues 등

 

 

 

 

5. 표현 언어의 기본 객체 사용 예

 

${pageContext.request.requestURI}

${requestScope.name}

${param.code}

 

 

 

 

6. 표현 언어의 데이터 타입

  • 불리언 타입 - true와 false
  • 정수타입 - 0~9로 이루어진 정수 값 음수의 경우 '-'가 붙음
  • 실수타입 - 0~9로 이루어져 있으며, 소수점('.')을 사용할 수 있고, 3.24e3과 같이 지수형으로 표현 가능하다.
  • 문자열 타입 - 따옴표( ' 또는" )로 둘러싼 문자열. 만약 작은 따옴표(')를 사용해서 표현할 경우 값에 포함된 작은 따옴표는 \' 와 같이 \ 기호와 함께 사용해야 한다.
  • \ 기호 자체는 \\ 로 표시한다.
  • 널 타입 - null

 

 

 

 

 

7. 객체 접근 규칙

${<표현1}.<표현2>}
  • 표현 1이나 표현 2가 null이면 null을 반환한다.
  • 표현1이 Map일 경우 표현2를 key로한 값을 반환한다.
  • 표현1이 List나 배열이면 표현2가 정수일 경우 해당 정수 번째 index에 해당하는 값을 반환한다.
  • 만약 정수가 아닐 경우에는 오류가 발생한다.
  • 표현1이 객체일 경우는 표현2에 해당하는 getter메소드에 해당하는 메소드를 호출한 결과를 반환한다.

 

8. 표현 언어의 수치 연산자

  • + : 덧셈
  • - : 뺄셈
  • * : 곱셈
  • / 또는 div : 나눗셈
  • % 또는 mod : 나머지
  • 숫자가 아닌 객체와 수치 연산자를 사용할 경우 객체를 숫자 값으로 변환 후 연산자를 수행 : ${"10"+1} → ${10+1}
  • 숫자로 변환할 수 없는 객체와 수치 연산자를 함께 사용하면 에러를 발생 : ${"열"+1} → 에러
  • 수치 연산자에서 사용되는 객체가 null이면 0으로 처리 : ${null + 1} → ${0+1}

 

 

 

 

9. 비교 연산자

  • == 또는 eq
  • != 또는 ne
  • < 또는 lt
  • > 또는 gt
  • <= 또는 le
  • >= 또는 ge
  • 문자열 비교: ${str == '값'} str.compareTo("값") == 0 과 동일

 

 

 

10. 논리 연산자

  • && 또는 and
  • || 또는 or
  • ! 또는 not

 

11. empty 연산자, 비교선택 연산자

empty <값>

 

1) <값>이 null이면 true를 리턴한다.

2) <값>이 빈 문자열이면 true를 리턴한다.

3) <값>이 길이가 0인 배열이면 true를 리턴한다.

4) <값>이 빈 Map이면 true를 리턴한다.

5) <값>이 빈 Collection이면 true를 리턴한다.

6) 이 외의 경우에는 false를 반환한다.

 

 

예제)

<수식> ? <값1> : <값2>

-> <수식>의 결과값이 true이면 <값1>을 리턴하고, false이면 <값2>를 리턴한다. 

 

 

 

 

 

 

12. 연산자 우선순위

  1. [] .
  2. ()
  3. - (단일) not ! empty
  4. * / div % mod
  5. + -
  6. < > <= >= lt gt le ge
  7. == != eq ne
  8. && and
  9. || or
  10. ? :

 

 

 

 

13. 표현 언어 비활성화 : JSP에 명시하기

  • <%@ page isELIgnored = "true" %>

 

 

 

 

 

 

 

14. EL 예제 1)

4가지 scope에 값을 넣어서 EL 문법을 사용하여 출력해 보았다.

- pageScope.p1 에서 pageScope을 생략해줘도 출력이 가능하지만, 의미의 명확성을 위해 써 주는 것이 좋다.

 

* 만약 EL 태그에서 값이 중복될 때에는 범위가 작은 pageScope부터 탐색한다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<%
	pageContext.setAttribute("p1", "page scope value");
	request.setAttribute("r1", "request scope value");
	session.setAttribute("s1", "session scope value");
	application.setAttribute("a1", "application scope value");
%>

<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	pageContext.getAttribute("p1") : <%=pageContext.getAttribute("p1") %> <br />
	
	pageContext.getAttribute("p1") : ${pageScope.p1} <br />
	request.getAttribute("r1") : ${requestScope.r1} <br />
	session.getAttribute("s1") : ${sessionScope.s1} <br />
	application.getAttribute("a1") : ${applicationScope.a1} <br />
	
	pageContext.getAttribute("p1") : ${p1} <br />
	request.getAttribute("r1") : ${r1} <br />
	session.getAttribute("s1") : ${s1} <br />
	application.getAttribute("a1") : ${a1} <br />

</body>
</html>

el01.jsp

 

 

 

 

 

 

 

 

15. EL 예제 2)

EL문법으로 사칙연산 해보기

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

<%
	request.setAttribute("k", 10);
	request.setAttribute("m", true);	
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

k : ${requestScope.k } <br />
k + 5 : ${k + 5 } <br />
k - 5 : ${k - 5 } <br />
k * 5 : ${k * 5 } <br />
k / 5 : ${k div 5 } <br /><br />

k : ${k } <br />
m : ${m } <br />

k > 5 : ${k > 5 } <br />
k < 5 : ${k < 5 } <br />
k <= 5 : ${k <= 5 } <br />
k >= 5 : ${k >= 5 } <br />
m : ${m } <br />
!m : ${!m } <br />


</body>
</html>

el02.jsp

 

 

<%@ page isELIgnored = "true" %> 를 추가해서 EL을 비활성화 해보기

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isELIgnored = "true" %>
<%
	request.setAttribute("k", 10);
	request.setAttribute("m", true);	
%>

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

k : ${requestScope.k } <br />
k + 5 : ${k + 5 } <br />
k - 5 : ${k - 5 } <br />
k * 5 : ${k * 5 } <br />
k / 5 : ${k div 5 } <br /><br />

k : ${k } <br />
m : ${m } <br />

k > 5 : ${k > 5 } <br />
k < 5 : ${k < 5 } <br />
k <= 5 : ${k <= 5 } <br />
k >= 5 : ${k >= 5 } <br />
m : ${m } <br />
!m : ${!m } <br />


</body>
</html>

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

'Programming > JSP & Servlet & Mysql' 카테고리의 다른 글

부스트캠프 7) Web API  (0) 2020.12.16
부스트캠프 6) JSTL  (0) 2020.12.16
부스트캠프 4) 4가지 Scope  (0) 2020.12.14
부스트캠프 3) 서블릿과 JSP 연동  (0) 2020.12.14
부스트캠프 2) REST API 란?  (0) 2020.11.21
반응형

 

 

 

 

 

 

 

 

 

 

 

1. 4가지 Scope

 

  • Application : 웹 어플리케이션이 시작되고 종료될 때까지 변수가 유지되는 경우 사용
  • Session : 웹 브라우저 별로 변수가 관리되는 경우 사용
  • Request : http요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수가 유지되는 경우 사용
  • Page : 페이지 내에서 지역변수처럼 사용

 

 

 

Q. 회사 관리 프로그램을 만듭니다. 회사 전체적으로 사용되는 특정 정보가 약 1메가 정도 있습니다. 이 정보는 자주 바뀌지 않고, 모든 사원들이 공통적으로 사용하는 코드입니다. 이러한 정보는 어떤 scope로 사용하는 것이 좋을까요?

 

A. Application Scope으로 만드는 게 좋을 것 같습니다.

왜냐하면 모든 사원들이 공통적으로 사용하고, 정보가 자주 바뀌지 않기 때문입니다.

 

 

 

 

 

 

2. Page Scope

  • PageContext 추상 클래스를 사용한다.
  • JSP 페이지에서 pageContext라는 내장 객체로 사용 가능 하다.
  • forward가 될 경우 해당 Page scope에 지정된 변수는 사용할 수 없다.
  • 사용방법은 Application scope나 Session scope, request scope와 같다.
  • 마치 지역변수처럼 사용된다는 것이 다른 Scope들과 다릅니다.
  • jsp에서 pageScope에 값을 저장한 후 해당 값을 EL표기법 등에서 사용할 때 사용됩니다.
  • 지역 변수처럼 해당 jsp나 서블릿이 실행되는 동안에만 정보를 유지하고자 할 때 사용됩니다.

 

- 요청이 끝날 때까지 유지되는 request 객체와 다르게,

page scope과 pageContext 객체는 해당 페이지가 실제 실행되는 동안에만 사용할 수 있다.

- 사용 방법은 pageContext.setAttribute, pageContext.getAttribute 를 사용하면 된다.

 

 

 

 

 

 

 

 

 

 

3. Request Scope

  • http 요청을 WAS가 받아서 웹 브라우저에게 응답할 때까지 변수값을 유지하고자 할 경우 사용한다.
  • HttpServletRequest 객체를 사용한다.
  • JSP에서는 request 내장 변수를 사용한다.
  • 서블릿에서는 HttpServletRequest 객체를 사용한다.
  • 값을 저장할 때는 request 객체의 setAttribute()메소드를 사용한다.
  • 값을 읽어 들일 때는 request 객체의 getAttribute()메소드를 사용한다.
  • forward 시 값을 유지하고자 사용한다.
  • 앞에서 forward에 대하여 배울 때 forward 하기 전에 request 객체의 setAttribute() 메소드로 값을 설정한 후, 서블릿이나 jsp에게 결과를 전달하여 값을 출력하도록 하였는데 이렇게 포워드 되는 동안 값이 유지되는 것이 Request scope를 이용했다고 합니다.

 

Q. 리다이렉트 될 경우에도 request scope를 이용하면 정보를 유지할 수 없는데, 그 이유는 무엇인가요?

A. 리다이렉트는 여러개의 요청과 응답객체를 통해 작업이 이루어지기 때문에

하나의 요청과 응답이 끝날 때까지만 정보가 유지되는 request Scope로는 정보를 유지할 수 없음

 

 

 

 

 

4. Session Scope

  • 웹 브라우저별로 변수를 관리하고자 할 경우 사용한다.
  • 웹 브라우저간의 탭 간에는 세션정보가 공유되기 때문에, 각각의 탭에서는 같은 세션정보를 사용할 수 있다.
  • HttpSession 인터페이스를 구현한 객체를 사용한다.
  • JSP에서는 session 내장 변수를 사용한다.
  • 서블릿에서는 HttpServletRequest의 getSession()메소드를 이용하여 session 객체를 얻는다.
  • 값을 저장할 때는 session 객체의 setAttribute()메소드를 사용한다.
  • 값을 읽어 들일 때는 session 객체의 getAttribute()메소드를 사용한다.
  • 장바구니처럼 사용자별로 유지가 되어야 할 정보가 있을 때 사용한다.

ex) 로그인 정보를 유지시킬 때

 

 

 

 

 

 

5. Application Scope

  • 웹 어플리케이션이 시작되고 종료될 때까지 변수를 사용할 수 있다.
  • ServletContext 인터페이스를 구현한 객체를 사용한다.
  • jsp에서는 application 내장 객체를 이용한다.
  • 서블릿의 경우는 getServletContext()메소드를 이용하여 application객체를 이용한다.
  • 웹 어플리케이션 하나당 하나의 application객체가 사용된다.
  • 값을 저장할 때는 application객체의 setAttribute()메소드를 사용한다.
  • 값을 읽어 들일 때는 application객체의 getAttribute()메소드를 사용한다.
  • 모든 클라이언트가 공통으로 사용해야 할 값들이 있을 때 사용한다.

 

 

 

5. -1) 예시

 

ApplicationScope01.java 에서 value 값을 1로 설정하고, application scope에 넣어준다.

ApplicationScope02.java에서 value 값을 받아서 1을 더해준 다음, application scope에 다시 넣어준다.

ApplicationScope01.jsp에서 value 값을 받아서 2를 더해준 다음, application scope에 다시 넣어준다.

 

package example;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/ApplicationScope01")
public class ApplicationScope01 extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public ApplicationScope01() {
        super();
        
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		
		response.setContentType("text/html; charset=UTF-8");
		
		PrintWriter out = response.getWriter();
	    ServletContext application = getServletContext();
	    
	    int value = 1;
	    application.setAttribute("value", value);
	    
	    out.println("<h1>value : " + value + "</h1>");
		
	}

}

ApplicationScope01.java

 

 

 

 

package example;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/ApplicationScope02")
public class ApplicationScope02 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       

    public ApplicationScope02() {
        super();
        // TODO Auto-generated constructor stub
    }


	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		response.setContentType("text/html; charset=UTF-8");
		PrintWriter out = response.getWriter();
		
	    ServletContext application = getServletContext();
	    try {
		    int value = (int)application.getAttribute("value");
		    value++;
		    application.setAttribute("value", value);
		    
		    out.println("<h1>value : " + value + "</h1>");
	    } catch(NullPointerException e) {
	    	out.println("value의 값이 설정되지 않았습니다.");
	    }
	}

}

ApplicationScope02.java

 

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
	try {
	    int value = (int)application.getAttribute("value");		// jsp는 이미 application 내장객체를 가지고 있음
	    value += 2;
	    application.setAttribute("value", value);
%>
	<h1>value : <%=value %></h1>

<%
	} catch(NullPointerException e) {
%>
	<h1>설정된 값이 없습니다.</h1>
<%
	}
%>

</body>
</html>

ApplicationScope01.jsp

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형

 

 

 

 

 

 

 

1. 서블릿과 JSP 차이

서블릿은 자바이기 때문에 프로그램 로직을 짜기가 편리하다.

반면, JSP는 자바 코드를 사용하기 위해 스크립트릿이라든지 선언문이라든지를 통해 써야하기 때문에 번거롭다.

 

하지만, JSP는 html을 사용할 수 있기 때문에 "출력"면에서 편리하다.

서블릿에서는 html을 사용할 때 out.println에서 문자열로 html 태그를 다 넣어줘야 하기 때문에 매우 번거롭다.

 

즉, 프로그램 로직을 짜기에는 서블릿이 편하고, html을 출력하기 위해서는 JSP가 편하다.

따라서, 서블릿과 JSP를 연동하여 서블릿에서 프로그램 로직을 짜고, JSP로 포워딩한다.

 

 

 

 

2. 코드

: 2개의 랜덤 값을 더해서 출력하는 코드를 작성해본다.

 

 

package example;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/logic")
public class LogicServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
 
    public LogicServlet() {
        super();

    }

	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		int v1 = (int)(Math.random() * 100) + 1;
		int v2 = (int)(Math.random() * 100) + 1;
		int result = v1 + v2;
		
		request.setAttribute("v1", v1);
		request.setAttribute("v2", v2);
		request.setAttribute("result", result);
		
		RequestDispatcher rd = request.getRequestDispatcher("/result.jsp");		// 루트 : WebContent
		rd.forward(request, response);
		
	}

}

LogicServlet.java

 

: v1과 v2 랜덤값을 발생시키고, result에 그 합을 넣는다

: request에 v1, v2, result 를 담아서 보낸다.

: RequestDispatcher로 result.jsp로 forward 한다.

 

 

 

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<!-- jsp -->
<%
	int v1 = (int)request.getAttribute("v1");
	int v2 = (int)request.getAttribute("v2");
	int result = (int)request.getAttribute("result");
%>
<%=v1 %> + <%=v2 %> = <%=result %>
<br />


<!-- jstl -->
${v1 } + ${v2 } = ${result}

</body>
</html>

result.jsp

 

 

: request 객체에서 v1, v2, result 값을 받아온다.

: JSTL로 구현도 가능하다.

 

 

 

 

 

: forward 이기 때문에 url 매핑은 바뀌지 않는다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형

+ Recent posts