본문 바로가기
개발 교육

11.28 JSP

by azure05 2023. 11. 28.

오늘의 시작은 Jsp이다.

 

 

 


디자인 패턴

디자인 패턴에는 약 23가지의 디자인 패턴이 존재한다. 

 

디자인 패턴의 구조

1. 콘텍스트(Context)

    문제가 발생하는 여러 상황으로 즉, 패턴이 적용될 상황을 뜻한다.

     패턴은 상황에 맞게 써야 하고, 항상 유효하지 않는다.

 

2. 문제(Problem)

    패턴이 적용되어서 해결되어야 할 필요가 있는 디자인 이슈들을 말한다.

    이는 여러 제약사항과 영향력도 문제 해결을 위해 고려해야 한다.

 

3. 해결(Solution)

   문제를 해결하도록 설계를 구성하는 요소들과 그 요소들 사이의 관계, 책임, 협력을 말한다.

   Solution은 구체적인 구현 방법 및 다양한 상황에 적용할 수 있는 일종의 템플릿을 뜻한다.

 

 

Gof 디자인 패턴(Design pattern)

1995년 GoF(Gang of Four)라고 불리는 4명의 유명한 개발자들인

Erich Gamma, Richard Helm, Ralph Johnson, John Vissides가 처음으로 디자인 패턴을 구체화하였다.

GoF의 디자인 패턴은 소프트웨어 공학에서 가장 많이 사용되는 디자인 패턴이다.

 

 

목적에 따라 Gof 디자인 패턴은  생성, 구조, 행위 3가지로 분류하였다.

1. 생성 패턴 (Creational Pattern)

객체 생성과 관련된 패턴으로 객체의 생성 및 조합을 캡슐화해 객체가 생성되거나 변경되어도

프로그램에 영향을 미치지 않게 하는 유연성을 높여주는 패턴

 

2. 구조 패턴 (Structural Pattern)

더 큰 구조를 형성하기 위해 클래스, 객체들을 어떻게 구성하고 합성할지 정하는데 활용할수 있는 패턴

복잡한 구조 개발과 유지보수를 쉽게 만들어 준다.

 

3. 행동 패턴 (Behavioral Pattern)

반복적으로 사용되는 객체들의 상호작용을 패턴화한 것

객체나 클래스 사이에서 상호작용하는 방법과 책임을 분산하는 방법을 정의하는 패턴

객체나 클래스의 유형을 정의하는 것이 아니라 클래스 사이의 책임과 협력에 대한 유형을 제시한다.

 

 


jsp 스크립트

1. 스크립트

2. 주석

3. 표현식

4. 선언문

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

pageEncoding="UTF-8"%>

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

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

<%

String color = "blue";

%>

 

 

<body bgcolor=<%=color%>>

<h1>Tiger!!!</h1>

<%

Date date = new Date();

System.out.println(date + "JSP");

%>

 

<h1>Tiger2</h1>

<%="독수리 "%><br />

<%=3 + 5%><br />

<%=date%><br />

<%!int num = 100;

int count = 200;%>

<%

int num = 300;

%>

<%=num%>

 

 

</body>

</html>

 

실행 결과화면

 

 

 

java 파일을 jsp에 import할때

 

java파일 작성

package Pack01;

 

public class Apple {

public void f1() {

System.out.println("사과 ");

}

 

}

 

index.jsp에 java파일 import

 

맨 위에 코드 추가 

<%@page import="Pack01.Apple" %>

 

jsp 파일 중간에 java클래스에서 사용할 내용 작성

apple객체 생성하여 apple객체 안에 쓸 수 있는 f1 메소드 호출하였다.

<%

Apple apple = new Apple();

apple.f1();

%>

 

<%@page import="Pack01.Apple" %>

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

pageEncoding="UTF-8"%>

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

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

 

<body>

<h1>Tiger!!!</h1>

<%

Date date = new Date();

System.out.println(date + "JSP");

%>

 

<%

Apple apple = new Apple();

apple.f1();

%>

 

</body>

</html>

 

java코드를 jsp에서 유연하게 가져와서 쓸 수 있는 것을 확인하였다.

 

 

 

 

 


 

<%@ 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>

<form method="post" action="if.jsp">

이름: <input type="text" name="name">

<p>

좋아하는 색깔 : <select name="color">

<option value="blue" selected>파란색</option>

<option value="red">붉은색</option>

<option value="orange">오렌지색</option>

<option value="etc">기타</option>

</select><br/>

<input type="submit" value="보내기">

</form>

 

</body>

</html>

 

 

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

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>if JSP</title>

</head>

<body bgcolor="blue">

<%

request.setCharacterEncoding("UTF-8");

 

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

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

 

 

%>

 

 

<p><%=name %>님이 좋아하시는 색깔은 <%=color %> 입니다!! </p>

 

 

 

</body>

</html>

 

 

 

 

index.jsp

 

if.jsp

 

 

 

 

 


 

index.jsp

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

pageEncoding="UTF-8" language="java"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

 

 

 

<body>

<%

int sum = 0;

for (int i = 1; i <= 9; i++) {

out.print(i+"+");

sum+=i;

}

 

out.print(" = " + sum);

%>

 

</body>

</html>

 

 

결과화면


메인화면에서 반복할 문구와 반복 횟수를 입력하면 

repeat.jsp에 반복문구+숫자가 뜨게끔 하는 기능을 구현해보았다.

 

index.jsp

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

pageEncoding="UTF-8" language="java"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

 

 

 

<body>

<form method="post" action="repeat.jsp">

반복문구 : <input type="text" name="name"><br>

반복횟수 : <input type="number" name="number"><br>

<input type="submit" value="전송">

</form>

 

</body>

</html>

 

repeat.jsp

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

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>결과</title>

</head>

<body>

 

<%

request.setCharacterEncoding("UTF-8");

 

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

int num = Integer.parseInt(request.getParameter("number"));

 

for(int i=1; i<=num; i++){

out.println(name+i+"<br/>");

}

 

%>

</body>

</html>

 

실행화면

index.jsp

 

repeat.jsp

 

 

 

 


오후 교육

 

include 지시자      VS      include 액션태그

 

include 지시자 (directive include)

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

지시자 include 는 단순하게 소스의 내용이 텍스트로 포함되어 컴파일 된다. 

즉, a.jsp에 b.jsp를 directive include 할 경우 b.jsp 파일의 소스는 a.jsp 안에 복사되어 컴파일 되는 것이다. 

 

지시자 include의 처리과정은 정적이라고 할 수 있다. 

 

 

include 액션태그

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

액션태그 include는 페이지의 처리결과를 포함한다는 점에서 지시자 include와 차이점이 있다. 

 

a.jsp파일에서 b.jsp 파일을 <jsp:include>를 이용해 실행했을 경우 그 안의 소스가 복사되는 것이 아니라 프로그램의 실행제어가 넘어갔다가 되돌아오게 하는 것이다. 

브라우저가 a.jsp에 요청을 하고 a.jsp 페이지를 처리하는 도중에 include 액션태그를 만나면 프로그램의 실행제어가 b.jsp로 넘어가서 

b.jsp를 처리하게 된다. 그리고 b.jsp 실행이 끝나면 다시 a.jsp 제어로 복귀하여 남은 코드를 실행한다. 

 

그 결과를 마지막으로 클라이언트(웹 브라우저)에 보내주게 된다. 

 

 

 

JSP forward VS redirect

jsp 환경에서 페이지를 이동하는 방식이 2가지가 있다. 

redirect와 forward이다. 

 

Forward 방식

포워드는 페이지 전환 주체가 서버이다. 

: 웹 컨테이너 차원의 페이지 이동이다. 웹 브라우저는 다른 페이지로 이동했음을 알 수 없고, 브라우저에 최초 호출한 URL이 표시된다. 

  • forward는 요청정보를 was내에서 다른 리소스로 전달한다. 
  • 요청 정보를 함께 전달하여 다른 리소스에서 이를 처리 가능하다.
  • 페이지 이동이 없이 WAS내부에서 다른 리소스를 호출하기 때문에 속도가 Redirect보다 빠르다. 
  • 내부에서 forward하기 때문에 최초 요청한 URL이 변경되지 않는다. 
  • 포워드는 특정 URL에 대해 외부에 공개되지 말아야 하는 부분을 가리는 데 사용하거나 조회를 위해 사용된다. 
    • 예) 스프링의 경우 /WEB-INF에 있는 view에 대한 정보들이 외부에 직접 공개되지 말아야할 때 내부에서 포워딩을 통해 /WEB-INF 경로를 가리키도록 한다. helloworld.com/95로 요청하면 helloworld.com/WEB-INF/95를 응답하는 방식이다.

 

 

 

Redirect 방식

리다이렉트는 페이지 전환 주체가 클라이언트이다.

: 다른 웹 컨테이너에 있는 주소로 이동 가능, 웹 브라우저는 URL을 지시된 주소로 바꾸고 그 주소로 이동한다. 

  • 요청을 Web Browser에게 전달하여 새로 요청하게 만든다. 
  • forward와 달리 WAS 서버와 Web Brower 간에 두 번의 통신이 일어나게 되어 forward보다 속도가 느리다. 
  • 새로운 URL로 요청하기 때문에 request 정보가 기본적으로 전달되지 않는다. 
  • forward와 달리 외부에 있는 다른 서버나 혹은 같은 서버에서도 콘텍스트가 다른 URL에 요청을 redirect할 수 있다.
  • 클라이언트의 요청에 의해 서버의 DB에 변화가 생기는 작업에 사용된다. 
    • 예) DB유저 테이블 변경하는 회원가입과 같은 경우에는 리다이렉트가 사용되어야 요청을 중복해서 보내는 것을 방지할 수 있다. 

 

 

 

forward와 redirect 차이점

Forward 방식 Redirect 방식
jsp 액션 태그 jsp 내장 객체 (response)
요청 정보가 유지된다. 새로운 요청이 수행된다. 
URL 변화하지 않는다. URL이 변화한다. 
객체를 재사용한다. 객체 재사용XXX(새로운 요청)
시스템 변화가 생기지 않는 요청에 적합(검색 등의 단순 조회) 시스템 변화가 생기는 요청에 적합(로그인, 글쓰기)

 

 

사용 예제 *jsp 활용

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

pageEncoding="UTF-8" language="java"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>Insert title here</title>

</head>

 

<body>

<form method=post action="index.jsp">

비밀번호 입력: <INPUT TYPE="text" NAME="num"> <INPUT TYPE="submit"

VALUE="보내기">

</form>

 

 

<%

String pw = request.getParameter("num");

if (pw == null) {

} else if (!pw.equals("1234")) {

%>

<script>

alert("다시 입력하십시오.");

window.location.href = "index.jsp";  //redirect 하는 부분

</script>

<%

} else {

request.getRequestDispatcher("pwOK.jsp").forward(request, response);

}

%>

 

</body>

</html>

 

 

리다이렉트 형식?

response.sendRedirect("index.jsp");

 

포워드 형식?

request.getRequestDispatcher("pwOK.jsp").forward(request, response);

 

 

 

 

참고자료

https://seohee-ha.tistory.com/167

 

[IT지식] 디자인 패턴[Design pattern]이란?

📌 디자인 패턴(Design pattern)이란? - 프로그램 개발에서 빈번하게 나타나는 과제를 해결하기 위한 방법 중 하나다. - 소프트웨어 개발 과정에서 같은 실수를 반복하지 않기 위해 자신들의 시행착

seohee-ha.tistory.com

 

https://dev-handbook.tistory.com/35

 

[java] jsp에서 forward vs redirect, 포워드와 리다이렉트 비교

Java 기반의 웹 애플리케이션에서 JSP는 forward 혹은 redirect의 두 가지 방법을 사용하여 한 서블릿(Servlet)에서 다른 서블릿 혹은 JSP로 제어를 전달합니다. forward와 redirect는 요청을 전달하지만 완전

dev-handbook.tistory.com

 

'개발 교육' 카테고리의 다른 글

12.7 자바스크립트  (1) 2023.12.08
11.29 쿠키와 세션  (2) 2023.11.29
11.24 웹 서비스 (jsp, 서블릿servlet)  (1) 2023.11.24
11.17 리눅스  (1) 2023.11.17
11.15 DB  (2) 2023.11.15