JSP (자바로 만들어진 서버 페이지)

woom·2022년 12월 5일

JSP

목록 보기
1/4
post-thumbnail

🌼 JSP (Java Server Page)

  • 자바로 만들어진 서버 페이지

  • JSP 처리 과정

    • WAS가 JSP를 서블릿 클래스(java)로 만들고 (컴파일해서)클래스를 메모리에 로딩.
    • 클래스를 객체로 생성 → (_jspinit메소드로 초기화 시킨 후)서비스 메소드 호출해서 요청에대한 처리와 응답(요청할때마다 응답)
    • 응답 결과를 웹문서로 만들어서 전달
  • 웹문서이지만 클라이언트 요청에 의해 서블릿(웹프로그램)으로 바뀌어 요청에 대한 처리와 응답 결과 생성 → 웹프로그램처럼 사용 가능

  • 서블릿 보다 쉽고 빠르게 프로그램을 작성 가능 (서블릿의 상위 개념)


📌 JSP 응답 불가 시

  • jsp로 바꿔서 요청했는데도 이전 결과로 응답하는 경우는 빈번한 수정으로 인한 오류
  • 해결 방법
  1. clean tomcat work directory를 사용해서 work dir 비워주기 (객체를 재생성하여 재요청)

    • work dir : JSP를 서블릿으로 바꿔서 만들어진 폴더 (Jasper : JSP를 서블릿으로 바꾸는 프로그램 )
  2. 웹브라우저의 더보기 → 설정 → 더보기 → 개인 정보 보호 및 보안 → 인터넷 사용 기록 삭제 → 고급 → 인터넷 사용 기록 삭제 click


🌼 JSP 문서

  • new project → web → dynamic web project → 이름 설정 후 next → generate web.xml deployment descriptor 선택하여 JSP 프로젝트 생성

  • <!-- --> HTML 주석 : 설명문이 클라이언트에게 전달 - 소스보기 가능(웹디자이너)

  • <%-- --%> JSP 주석 : 설명문이 클라이언트에게 미전달 - 소스보기 불가능(웹프로그래머)

  • JSP(Java Server Page) : 서블릿보다 쉽게 웹프로그램을 작성하기 위한 기술

    • 스크립트 요소(Scripting Element), 지시어(Directive), 표준 액션 태그(Standard Action Tag)

🐣 예제


<%@page import="java.text.SimpleDateFormat"%>
<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//Java 명령 작성
	Date now=new Date();
	SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분 ss초");
	String displayNow=dateFormat.format(now);
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
<style type="text/css">
#displayDiv {
	width: 600px;
	margin: 0 auto;
	padding: 30px;
	font-size: 2em;
	font-weight: bold;
	text-align: center;
	border: 1px solid black;
}
</style>
</head>
<body>
	<h1>Hello, JSP!!!</h1>
	<p id="displayDiv"><%=displayNow %></p>
	<!--1초마다 현재 시간 변경 -->
	<script type="text/javascript">
	setInterval(function() {
		location.reload();
	}, 1000);
	</script>
</body>
</html>
  
  
  
  
  

🌻 스크립팅 요소

  • 스크립팅 요소(Scripting Element)

    • 스크립틀릿(Scriptlet) : JSP 문서에서 Java 명령을 작성하는 영역을 표현하기 위한 스크립팅 요소(요청 처리 메소드의 명령) - <% Java 명령; Java 명령; ... %>

    • 선언문(Declaration) : JSP 문서에서 필드 또는 메소드를 선언하는 영역을 표현하기 위한 스크립팅 요소(서블릿 클래스의 필드 또는 메소드) - <%! 필드 또는 메소드 선언 %>

    • 표현식(Expression) : JSP 문서에서 Java 명령으로 발생되는 결과값을 표현하여 출력하는 영역을 표현하기 위한 스크립팅 요소(요청 처리 메소드의 명령) - <%={변수명|연산식|메소드호출}%>


🐣 예제

  • 선언문 : 필드 또는 메소드를 선언하기 위한 영역

    • 서블릿 클래스의 필드 - 서블릿 객체가 소멸(WAS 프로그램 종료)되면 필드는 자동 소멸
  • 스크립틀릿 : 요청을 처리하기 위한 Java 명령을 작성하는 영역 - 요청 처리 메소드의 명령

    • 요청 처리 메소드(_jspService 메소드)에 선언된 지역변수
    • 요청 처리 메소드가 종료되면 지역변수는 자동 소멸
  • 표현식 : Java 변수값, 연산식의 결과값, 메소드의 반환값을 문자열로 변환하여 클라이언트에게 전달(응답)하기 위한 영역

    • <%=count%>
  • out 객체 : JSP 문서에서 처리결과를 생성하기 위해 기본적으로 제공되는 출력스트림

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- 선언문 : 필드 또는 메소드를 선언하기 위한 영역 -->    
<%!
	//서블릿 클래스의 필드 - 서블릿 객체가 소멸되면 필드는 자동 소멸
	int count=0;
%>    
<%-- 스크립틀릿 : 요청을 처리하기 위한 Java 명령을 작성하는 영역 --%>
<%
	//요청 처리 메소드가 종료되면 지역변수는 자동 소멸
	//int count=0;
	count++;
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>스크립팅 요소(Scripting Element)</h1>
	<hr>
	<%-- out 객체 : JSP 문서에서 처리결과를 생성하기 위해 제공되는 출력스트림 --%>
	<%-- <p>JSP 문서의 요청횟수 = <% out.println(count); %></p> --%>
	
	<%-- 표현식 : Java 변수값, 연산식의 결과값, 메소드의 반환값을 문자열로 변환하여 
	클라이언트에게 전달(응답)하기 위한 영역 --%>
	<p>JSP 문서의 요청횟수 = <%=count%></p>
</body>	
</html>





🌻 지시어

  • page Directive : JSP 문서에 필요한 정보를 제공하도록 지시
    • <%@page 속성="속성값" 속성="속성값" ... %>
    • <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

  • include Directive : JSP 문서에 외부파일의 코드(Source)를 포함하도록 지시

    • <%@include file="URL" %>
    • include action tag : 실행 결과를 포함 (include directive와 구분)
  • taglib Directive : JSP 문서에 태그 라이브러리 파일(커스텀 태그)을 포함하도록 지시

    • <%@tablib prefix="namespace" uri="tldId" %>

📙 page Directive

  • page Directive : JSP 문서에 필요한 정보를 제공하도록 지시
    • <%@page 속성="속성값" 속성="속성값" ... %>
    • <%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>

🐣 contentType 속성

  • page Directive의 contentType 속성

  • contentType 속성에는 JSP 문서를 요청하여 응답받을 수 있는 파일형식(MimeType)과 파일의 문자형태(CharacterSet - Encoding)를 속성값으로 설정

  • <%@ page language="java" contentType="application/pdf; charset=UTF-8" pageEncoding="UTF-8"%>

  • 다른 형식으로 실행 시 자동 다운로드 → 확장자 바꿔서 실행 가능 (msword 설치 되어있어야 가능)


🐣 import 속성

  • import 속성에는 JSP 문서에서 사용할 클래스 또는 인터페이스를 속성값으로 설정

    • 클래스 또는 인터페이스의 패키지를 명확하게 표현하여 제공
    • page Directive의 import 속성은 자동 완성 기능 사용
    • <%@ page import="java.util.ArrayList" %>
  • page Directive에서는 동일한 속성을 다른 속성값으로 중복 선언할 경우 JSP 문서 실행시 500 에러 발생 (import 속성 제외)


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

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//java.util.List<java.lang.String> nameList=new java.util.ArrayList<java.lang.String>();
	List<String> nameList=new ArrayList<String>();
	
	nameList.add("홍길동");
	nameList.add("임꺽정");
	nameList.add("전우치");
	nameList.add("일지매");
	nameList.add("장길산");
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<ul>
	<% for(String name:nameList) { %>
		<li><%=name %></li>
	<% } %>
	</ul>
</body>
</html>





🐣 errorPage 속성

  • errorPage 속성에는 JSP 문서 실행시 에러(예외)가 발생될 경우 클라이언트에게 500 에러코드 대신 에러페이지로 응답하기 위한 웹문서의 URL 주소를 속성값으로 설정

    • 클라이언트의 URL 주소 미변경
    • errorPage 속성으로 작성시 요청에 대한 응답은 불가 (에러 코드 500만 가능) → 권장하지 않음
    • <%@ page errorPage="page_error.jsp"%>
    • [web.xml] 파일에서 전달하는 에러페이지보다 우선순위
  • ★[web.xml] 파일에서 모든 웹프로그램의 요청과 실행에 의해 발생되는 에러코드(4XX 또는 5XX)를 클라이언트에게 전달하는 대신 에러페이지로 응답되도록 설정 가능 (클라이언트의 URL 주소 미변경)

  • 사용자 편의성을 위해 제공하는 것이기 때문에 프로젝트 마무리 시점에 작성


<%-- <%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="page_error.jsp"%> --%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>    
<%
	String text=null;//에러발생
    
	int num=10/0;//ArithmeticException 예외 발생
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<p>문자열의 문자갯수 = <%=text.length() %></p>
</body>
</html>





📌 web.xml

  • error-page : 에러페이지를 등록하기 위한 엘리먼트

    • exception-type : 웹프로그램 실행시 발생되는 예외에 대한 예외클래스를 설정하기 위한 엘리먼트
    • <exception-type>java.lang.NullPointerException</exception-type>
    • location : 에러코드 대신 응답될 에러페이지의 URL 주소를 설정하는 엘리먼트
    • <location>/error/error_null.jsp</location>
    • error-code : 에러코드를 설정하기 위한 엘리먼트
    • <error-code>500</error-code>
  • web.xml에서 작성하는 것은 Deployment Descriptor.jsp 에서 확인 가능 (Error Pages)


<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org
/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
  <display-name>jsp</display-name>
  
  <error-page>
  	<exception-type>java.lang.NullPointerException</exception-type>
  	<location>/error/error_null.jsp</location>
  </error-page>
  
  <error-page>
  	<error-code>500</error-code>
  	<location>/error/error_500.jsp</location>
  </error-page>
  
  <error-page>
  	<error-code>400</error-code>
  	<location>/error/error_400.jsp</location>
  </error-page>
  
  <error-page>
  	<error-code>404</error-code>
  	<location>/error/error_404.jsp</location>
  </error-page>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.jsp</welcome-file>
    <welcome-file>default.htm</welcome-file>
  </welcome-file-list>
</web-app>





📙 include Directive

  • 웹서버에 존재하는 문서파일의 소스코드를 현재 JSP 문서에 포함하는 지시어 (정적포함)

  • include Directive의 file 속성값으로 동일 서버에 저장된 문서파일의 URL 주소 설정

    • file 속성값으로 설정된 문서파일이 없는 경우 에러 발생
    • 문서파일의 소스코드를 include Directive 명령 위치에 포함하여 실행
    • <%@include file="include_sub.jspf"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<%-- 
	<p>클라이언트에게 응답되는 아주 중요한 내용입니다.</p>
	--%>
	
	<%-- include Directive의 file 속성값으로 동일 서버에 저장된 문서파일의 URL 주소 설정 --%>
	<%-- => file 속성값으로 설정된 문서파일이 없는 경우 에러 발생 --%>
	<%-- => 문서파일의 소스코드를 include Directive 명령 위치에 포함하여 실행 --%>
	<%@include file="include_sub.jspf"%>
</body>
</html>





🐣 include_sub.jspf

  • JSPF 파일 : 클라이언트 요청에 의한 실행이 목적이 아닌 다른 JSP 문서에 소스코드를 제공하기 위한 파일

    • 주의 : JSP 파일과 JSPF 파일에 선언된 page Directive의 contentType 속성값이 반드시 동일
    • 중복되는 코드가 발생 시 생산성 유지보수 효율성 저하 → 사이트를 쉽게 구현하기 위해서 include Directive 사용
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<p>클라이언트에게 응답되는 아주 중요한 내용입니다.</p>
  
  
  
  
  

📙 taglib Directive

  • JSP 문서에 태그 라이브러리 파일(TLD)을 불러와 포함하여 커스텀 태그를 제공하는 지시어

    • 태그 라이브러리 파일 : 태그 클래스를 커스텀 태그로 등록하기 위한 XML 파일
  • <%@taglib prefix="custom" uri="http://www.itwill.xyz/custom"%>

    • uri : [ctrl] + [space] 로 자동완성기능 (tld파일이 하나일 경우)
    • 객체로 만들어서 웹문서에 포함시켜 자바명령 실행시키기 위해 사용
  • 커스텀 태그 명령 실행

    • <custom:display/>

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@taglib prefix="custom" uri="http://www.itwill.xyz/custom"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<custom:display/>
</body>
</html>





🐣 custom tag 클래스

  • Java Resources 폴더 → src → 패키지안에 생성

  • 태그 클래스 : JSP 문서에서 커스텀 태그 사용시 객체로 생성하기 위한 클래스

    • TagSupport 클래스를 상속받아 작성
    • doStartTag() 메소드 오버라이드하여 작성
    • JSP 문서에서 커스텀 태그의 시작태그 사용시 자동 호출되는 메소드
    • pageContext.getOut().println() : 출력스트림 반환받아 웹문서에 포함

package xyz.itwill.custom;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;

public class CustomTag extends TagSupport {
	private static final long serialVersionUID = 1L;

	//JSP 문서에서 커스텀 태그의 시작태그 사용시 자동 호출되는 메소드
	@Override
	public int doStartTag() throws JspException {
		try {
			pageContext.getOut().println("<h3>커스텀 태그 사용</h3>");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return super.doStartTag();
	}
}






🐣 custom.tld (tag lib)

<?xml version="1.0" encoding="UTF-8"?>
<taglib version="2.0" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xml="http://www.w3.org/XML/1998/namespace" xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=
"http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd ">
  <tlib-version>0.0</tlib-version>
  <short-name>NMTOKEN</short-name>
  <uri>http://www.itwill.xyz/custom</uri>
  <tag>
  	<name>display</name>
  	<tag-class>xyz.itwill.custom.CustomTag</tag-class>
  	<body-content>empty</body-content>
  </tag>
</taglib>





📌 .tld 파일 생성 방법

  1. WEB-INF 폴더 → new → other → xml폴더 → xml.file → Next
    → WEB-INF 폴더 안에 파일 이름 생성 후 Next (반드시 확장자는 .tld로 작성)

  1. Create file using a DTD or XML Schema file 체크 후 Next
    (정해져 있는 규칙에 의해 생성 필요)

  1. Select XML Catalog entry 선택 후 Plugin Specified Entries 안에 있는
    java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd 파일 선택 후 Next

  1. Prefix 선택 후 Edit.. 클릭 → 팝업창 Prefix: 공란으로 변경 후 OK → finish


🌻 표준액션태그 (JSP태그)

  • Java 명령으로 구현해야 하는 기능을 표준 액션 태그로 제공

  • HTML 태그와 구분하기 위해 [jsp] 네임스페이스(NameSpace) 사용 : JSP 태그

    • include 태그 : JSP 문서의 스레드를 다른 JSP 문서로 이동하여 실행된 결과(웹문서)를 제공받아 태그를 사용한 위치에 포함하는 태그
    • forward 태그 : JSP 문서의 스레드를 다른 JSP 문서로 이동하여 실행된 결과(웹문서)를 클라이언트에게 전달하여 응답하는 태그
    • param 태그 : JSP 문서에서 스레드가 이동된 JSP 문서로 값을 전달하기 위한 태그
      (include 태그와 forward 태그의 하위태그로 실행)
    • useBean 태그 : JSP 문서에서 사용할 수 있는 객체를 제공하기 위한 태그
      (내장객체에 저장된 속성값을 반환받아 제공하거나 새로운 객체를 생성하여 제공)
    • setProperty 태그 : useBean 태그로 제공된 객체의 필드값을 변경하기 위한 태그
      (Setter 메소드 호출) - useBean 태그의 종속태그
    • getProperty 태그 : useBean 태그로 제공된 객체의 필드값을 반환하기 위한 태그
      (Getter 메소드 호출) - useBean 태그의 종속태그

📒 include 액션 태그

  • include Directive : 외부파일(JSPF)을 읽어 소스코드(CSL 및 SSL)를 JSP 문서에 포함

    • file 속성값으로 설정된 외부파일의 소스코드를 포함하여 실행한 후 실행결과를 전달하여 응답
    • 외부파일의 내용이 변경될 경우 JSP 문서가 변경된 것과 동일하므로 JSP 문서에 대한 재해석 필요(서블릿으로 다시 생성해야함)
    • file 속성값으로 JSP의 표현식(Expression) 사용 불가능
      → 속성값으로 설정된 외부파일의 소스코드만 포함(정적포함)
    • <%@include file="header.jspf" %>
  • include ActionTag : 스레드가 이동된 JSP 문서의 실행결과(CSL)를 제공받아 JSP 문서에 포함

    • 형식) <jsp:include page="JSP"></jsp:include> 또는 <jsp:include page="JSP"/>
    • page 속성값으로 설정된 JSP 문서가 없는 경우 에러 발생 (에러코드 : 500)
    • page 속성값으로 설정된 JSP 문서로 스레드를 이동하여 실행한 후 결과를 제공받아 포함하고 요청 JSP 문서의 실행결과를 클라이언트에게 전달하여 응답
    • 스레드가 이동될 JSP 문서의 내용이 변경될 경우 해당 JSP 문서만 변경된 것이므로 요청 JSP 문서에 대한 재해석 불필요
    • page 속성값으로 JSP의 표현식(Expression) 사용 가능
    • 표현식에서 사용된 변수값에 따라 서로 다른 JSP 문서의 응답결과를 가져와 포함(동적포함)
    • <jsp:include page="header.jsp"/>
  • param ActionTag : 스레드가 이동된 JSP 문서로 값을 전달하는 태그

    • 리퀘스트 메세지(request 객체)의 몸체부에 값을 저장하여 스레드가 이동된 JSP 문서로 전달
    • include 태그 또는 forward 태그의 자식태그로만 사용 가능
    • 주의) include 태그 또는 forward 태그에 자식태그로 param 태그를 제외한 코드가 존재할
      경우 에러 발생 (JSP 주석문은 예외)

🐣 main



<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//요청 JSP 문서 및 스레드가 이동된 JSP 문서에 적용
	request.setCharacterEncoding("utf-8");
	//전달값을 반환받아 저장
	String category=request.getParameter("category");
	if(category==null) {//JSP 문서 요청시 전달된 값이 없는 경우
		category="main";
	}
	
	String headFileName="header.jsp";
	String masterName="";
	//전달값을 비교하여 Header 영역에 포함될 JSP 문서의 파일명 저장 및 관리자명 저장
	if(category.equals("main")) {
		headFileName="header_main.jsp";
		masterName="홍길동(hong@itwill.xyz)";
	} else if(category.equals("blog")) {
		headFileName="header_blog.jsp";
		masterName="임꺽정(lim@itwill.xyz)";
	} else if(category.equals("cafe")) {
		headFileName="header_cafe.jsp";
		masterName="전우치(cheon@itwill.xyz)";
	} else {
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<%-- Header 영역 --%>
	<%-- 
	<h1>메인페이지</h1>
	<a href="index.jsp?category=main">메인</a>&nbsp;&nbsp;
	<a href="index.jsp?category=blog">블로그</a>&nbsp;&nbsp;
	<a href="index.jsp?category=cafe">카페</a>&nbsp;&nbsp;
	<hr>
	--%>
	
	<%-- include ActionTag : 스레드가 이동된 JSP 문서의 실행결과를 제공받아 JSP문서에 포함 --%>
	<%-- <jsp:include page="header.jsp"/> --%>
	<jsp:include page="<%=headFileName %>"/>


	<%-- Content 영역 --%>
	<p>요청에 의해 응답되는 아주 중요한 내용입니다.</p>


	<%-- Footer 영역 --%>
	<%-- 
	<hr>
	<p>Copyright ©itwill Corp. All rights reserved.</p>
	<!-- <p>관리자 : 홍길동(hong@itwill.xyz)</p> -->
	<p>관리자 : <%=masterName %></p>
	--%>
	
	<%-- param ActionTag : 스레드가 이동된 JSP 문서로 값을 전달하는 태그 --%>
	<%-- => 리퀘스트 메세지의 몸체부에 값을 저장하여 스레드가 이동된 JSP 문서로 전달 --%>
	<jsp:include page="footer.jsp">
		<jsp:param value="<%=masterName %>" name="masterName"/>
	</jsp:include>
</body>
</html>





  • 스레드가 이동된 JSP 문서(footer.jsp)는 클라이언트의 요청 JSP 문서(index.jsp)의 request 객체와 response 객체를 제공받아 사용
  • 스레드가 이동된 JSP 문서에서는 request 객체와 response 객체의 사용 제한 발생
  • 문제점 1) 스레드가 이동된 JSP 문서에서는 request 객체에 대한 리퀘스트 메세지 관련 정보 변경 불가능

    • request.setCharacterEncoding() 메소드를 호출하여 리퀘스트 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경 불가능
    • 해결법) 클라이언트의 요청 JSP 문서에서 리퀘스트 몸체부에 저장되어 전달되는 값에 대한 캐릭터셋 변경
  • 문제점 2) 스레드가 이동된 JSP 문서에서는 response 객체를 이용하여 클라이언트에게 에러코드나 URL 주소를 전달 불가능

    • 스레드가 이동된 JSP 문서는 결과를 클라이언트가 아닌 요청 JSP 문서에 전달하므로 에러코드 또는 URL 주소 전달은 무의미
    • 해결법) 자바스크립트로 응답 처리하여 페이지 이동 가능
    • response.sendError(HttpServletResponse.SC_BAD_REQUEST);


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//스레드가 이동된 JSP 문서에서는 request 객체에 대한 리퀘스트 메세지 관련 정보 변경 불가능
	//request.setCharacterEncoding("utf-8");
	String masterName=request.getParameter("masterName");
	
	if(masterName==null) {
		//문제점)스레드가 이동된 JSP 문서에서는 response 객체를 이용하여 클라이언트에게
		//에러코드나 URL 주소를 전달 불가능 
		//해결법) 자바스크립트로 응답 처리하여 페이지 이동 가능
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}
%>    
<hr>
<p>Copyright ©itwill Corp. All rights reserved.</p>
<%-- <p>관리자 : 홍길동(hong@itwill.xyz)</p> --%>
<p>관리자 : <%=masterName %></p>





🐣 header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%-- int su=100; --%>    
<h1>메인페이지</h1>
<a href="index.jsp?category=main">메인</a>&nbsp;&nbsp;
<a href="index.jsp?category=blog">블로그</a>&nbsp;&nbsp;
<a href="index.jsp?category=cafe">카페</a>&nbsp;&nbsp;
<hr>





📒 forward 액션 태그

  • forward ActionTag : 요청 JSP 문서에 page 속성값으로 설정된 JSP 문서로 스레드를 이동하여 명령을 실행하고 처리결과를 클라이언트에게 전달하여 응답하기 위한 태그

    • 형식) <jsp:forward page="JSP"></jsp:include> 또는 <jsp:forward page="JSP"/>
    • page 속성값으로 JSP 표현식(Expression) 사용 가능
    • 포워드 이동 : 요청 JSP 문서에서 응답 JSP 문서로 스레드를 이동하여 응답 처리
    • 클라이언트에 상관없이 서버측에서 이동 (클라이언트 브라우저의 URL 주소 미변경)
    • <jsp:forward page="<%=filePath %>"/>

🐣 쿼리스트링으로 값전달

  • 전달값에 따라 서로 다른 JSP 문서의 응답결과를 클라이언트에게 전달되도록 스레드를
    이동
    하는 JSP 문서 (프로그램의 흐름을 제어하는 기능)

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//전달값을 반환받아 저장
	String category=request.getParameter("category");
	if(category==null) {//전달값이 없는 경우
		//클라이언트에게 URL 주소가 전달되도록 응답 처리
		//URL 주소를 전달받은 클라이언트는 브라우저의 URL 주소를 변경하여 서버의
        //자원을 요청하여 결과를 응답받아 출력 (페이지 이동)
		response.sendRedirect("main.jsp");//리다이렉트 이동
		return;
	}
	
	//전달값을 이용하여 스레드가 이동될 JSP 문서의 파일 경로를 생성하여 저장
	String filePath=category+".jsp";
	//System.out.println("filePath = "+filePath);
%>
<%-- forward ActionTag : page 속성값으로 설정된 JSP 문서로 스레드를 이동하여
명령을 실행하고 처리결과를 클라이언트에게 전달하여 응답하기 위한 태그 --%>
<%-- 클라이언트에 상관없이 서버측에서 이동 (클라이언트 브라우저의 URL 주소 미변경) --%>
<jsp:forward page="<%=filePath %>"/>





🐣 메인페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>메인 페이지</h1>
	<hr>
	<%-- 
	<a href="company.jsp">회사연혁</a>&nbsp;&nbsp;
	<a href="product.jsp">제품소개</a>&nbsp;&nbsp;
	<a href="order.jsp">주문내역</a>&nbsp;&nbsp;
	<a href="review.jsp">사용후기</a>&nbsp;&nbsp;
	--%>
	
	<a href="controller.jsp?category=company">회사연혁</a>&nbsp;&nbsp;
	<a href="controller.jsp?category=product">제품소개</a>&nbsp;&nbsp;
	<a href="controller.jsp?category=order">주문내역</a>&nbsp;&nbsp;
	<a href="controller.jsp?category=review">사용후기</a>&nbsp;&nbsp;
</body>
</html>





🐣 회사연혁 페이지

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>회사연혁 페이지</h1>
	<hr>
	<a href="main.jsp">메인 페이지</a>
</body>
</html>





📒 nonuseBean


🐣 회원정보.jsp

  • 사용자로부터 회원정보를 입력받기 위한 JSP 문서
  • [입력완료]를 클릭한 경우 form 태그를 실행하여 처리페이지(non_useBean_action.jsp)를 POST 방식으로 요청해 입력값 전달
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>회원정보입력</h1>
	<hr>
	<form action="non_useBean_action.jsp" method="post">
	<table>
		<tr>
			<td>이름</td>
			<td><input type="text" name="name"></td>
		</tr>
		<tr>
			<td>전화번호</td>
			<td><input type="text" name="phone"></td>
		</tr>
		<tr>
			<td>주소</td>
			<td><input type="text" name="address"></td>
		</tr>
		<tr>
			<td colspan="2"><button type="submit">입력완료</button></td>
		</tr>
	</table>
	</form>
</body>
</html>





🐣 회원정보 클래스

  • 회원정보를 저장하기 위한 클래스 (VO 클래스)
package xyz.itwill.bean;

public class Hewon {
	private String name;
	private String phone;
	private String address;
	
	public Hewon() { }

	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
}





🐣 처리페이지 (포워드이동)

  • 입력페이지(non_useBean_form.jsp)에서 전달된 값을 반환받아 내장객체의 속성값으로 저장하고 출력페이지(non_useBean_display.jsp)로 포워드 이동 처리하는 JSP 문서
  • Java 명령을 사용하여 현재 요청 JSP 문서가 아닌 다른 JSP 문서로 응답되도록 구현하는 방법
  1. 리다이렉트 이동하여 응답하는 방법 (session scope를 이용하여 이동)
  • 리다이렉트 이동 : 클라이언트에게 URL 주소를 전달하여 다른 JSP 문서를 요청시켜 실행결과로 응답 처리
  • 클라이언트 브라우저의 URL 주소 변경 (클라이언트를 이용하여 JSP 문서 이동)
  • session 내장객체를 이용하여 객체를 속성값으로 저장하여 응답 JSP 문서에서 반환받아 사용 가능
  • 응답 JSP 문서에서는 session 내장객체에 저장된 속성값을 객체로 반환받은 후 반드시 제거
  • response.sendRedirect("non_useBean_display.jsp");(session Scope)
  1. 포워드 이동하여 응답하는 방법 (request scope를 이용하여 이동)
  • 포워드 이동 : 요청 JSP 문서에서 응답 JSP 문서로 스레드를 이동하여 응답 처리
  • 클라이언트 브라우저의 URL 주소 미변경 (서버에서 JSP 문서간의 이동)
  • request 내장객체를 이용하여 객체를 속성값으로 저장하여 응답 JSP 문서에서 반환받아 사용 가능
  • 요청 JSP 문서 및 응답 JSP 문서를 제외한 다른 JSP 문서에서는 request 내장객체의 속성값 사용 불가능
  • request.setAttribute("hewon", hewon);(request Scope)
  • 포워드 이동하기 위한 Java 명령 (forward 태그와 동일한 기능 제공)
    • request.getRequestDispatcher(String url) : URL 주소가 저장된 RequestDispatcher 객체를 반환하는 메소드
    • RequestDispatcher 객체 : 다른 웹프로그램으로 스레드를 이동하기 위한 기능을 제공하는 객체
    • RequestDispatcher.forward(ServletRequest request, ServletResponse response)
      : 요청 웹프로그램에서 다른 웹프로그램으로 스레드를 이동시켜 응답처리하기 위한 메소드 (포워드 이동)
    • 요청 웹프로그램의 request 객체와 response 객체를 스레드가 이동되는 웹프로그램으로 전달
    • request.getRequestDispatcher("non_useBean_display.jsp").forward(request, response);


<%@page import="xyz.itwill.bean.Hewon"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//비정상적인 요청에 대한 처리
	if(request.getMethod().equals("GET")) {
		response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
		return;
	}
	//POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋 변경
	request.setCharacterEncoding("utf-8");
	//전달값을 반환받아 저장
	String name=request.getParameter("name");	
	String phone=request.getParameter("phone");	
	String address=request.getParameter("address");	
	
	//VO 클래스로 객체를 생성하여 전달값으로 필드값 변경
	Hewon hewon=new Hewon();
	hewon.setName(name);
	hewon.setPhone(phone);
	hewon.setAddress(address);
	
	//Java 명령을 사용하여 현재 요청 JSP 문서가 아닌 다른 JSP 문서로 응답되도록 구현하는 방법
	// → 1. 리다이렉트 이동하여 응답하는 방법 및 2.포워드 이동하여 응답하는 방법
	
	//리다이렉트 이동 : 클라이언트에게 URL 주소를 전달하여 다른 JSP 문서를 요청시켜 실행결과로 응답 처리
	session.setAttribute("hewon", hewon);//session 내장객체를 이용하여 속성값 저장 (session Scope)
	response.sendRedirect("non_useBean_display.jsp");//리다이렉트 이동
	
	//포워드 이동 : 요청 JSP 문서에서 응답 JSP 문서로 스레드를 이동하여 응답 처리 (URL 주소 미변경)
	//→ 요청 JSP 문서 및 응답 JSP 문서를 제외한 다른 JSP 문서에서는 request 내장객체의 속성값 사용 불가능
	request.setAttribute("hewon", hewon);//request 내장객체를 이용하여 속성값 저장 (request Scope)
    
	//포워드 이동하기 위한 Java 명령 - forward 태그와 동일한 기능 제공
	//request.getRequestDispatcher(String url) : URL 주소가 저장된 객체를 반환하는 메소드 (스레드 이동)
	//RequestDispatcher.forward(ServletRequest request, ServletResponse response) : 요청
	//웹프로그램에서 다른 웹프로그램으로 스레드를 이동시켜 응답처리하기 위한 메소드 (포워드 이동)
	request.getRequestDispatcher("non_useBean_display.jsp").forward(request, response);
%>





🐣 응답 (client에게 전달)

  • 처리페이지(non_useBean_action.jsp)의 내장객체에 저장된 속성값을 반환받아 클라이언트에게 전달하는 JSP 문서
  1. session 내장객체에 저장된 속성값을 반환받아 저장

    • Hewon hewon=(Hewon)session.getAttribute("hewon");
    • session.removeAttribute("hewon");
  2. request 내장객체에 저장된 속성값을 반환받아 저장

    • Hewon hewon=(Hewon)request.getAttribute("hewon");
    • request scope는 속성값을 저장한 jsp문서와 응답한 jsp문서만 객체 사용가능하므로 session 객체처럼 삭제할 필요 없음
      (자기자신과 스레드가 이동된 문서)

<%@page import="xyz.itwill.bean.Hewon"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%--
	//비정상적인 요청에 대한 처리
	if(session.getAttribute("hewon")==null) {//session 내장객체에 저장된 속성값이 없는 경우
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}
	//1. session 내장객체에 저장된 속성값을 반환받아 저장
	Hewon hewon=(Hewon)session.getAttribute("hewon");
	
	//다른 JSP 문서에서 session 내장객체에 저장된 속성값을 사용하지 못하도록 속성값 제거
	session.removeAttribute("hewon");
--%>
<%
	//비정상적인 요청에 대한 처리
	if(request.getAttribute("hewon")==null) {//request 내장객체에 저장된 속성값이 없는 경우
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}
	
	//2. request 내장객체에 저장된 속성값을 반환받아 저장
	Hewon hewon=(Hewon)request.getAttribute("hewon");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>회원정보확인</h1>
	<hr>
	<p>이름 = <%=hewon.getName() %></p>
	<p>전화번호 = <%=hewon.getPhone() %></p>
	<p>주소 = <%=hewon.getAddress() %></p>
</body>
</html>





📒 useBean 액션 태그

  • useBean ActionTag : JSP 문서에 객체를 제공하기 위한 태그
    • 형식) <jsp:useBean id="식별자" class="클래스" scope="사용범위"/>
    • 내장객체에 저장된 속성값을 객체로 반환받아 제공하거나 속성값이 없으면 객체를 생성하여 내장객체의 속성값으로 저장 후 제공
    • id 속성(필수) : useBean 태그로 제공될 객체를 구분하기 위한 식별자를 속성값으로 설정
    • 내장객체에 저장된 속성값을 구분하기 위한 속성명을 표현하여 속성값을 제공받아 사용
    • class 속성(필수) : useBean 태그로 제공될 객체의 자료형을 속성값으로 설정
    • scope 속성(선택) : useBean 태그로 제공될 객체의 사용범위를 속성값으로 설정
    • page, request, session, application 중 하나를 속성값으로 설정
    • scope 속성이 생략된 경우 page 속성값을 기본값으로 설정하여 사용
    • <jsp:useBean id="hewon" class="xyz.itwill.bean.Hewon" scope="request"/>

🐣 회원정보.jsp

  • 사용자로부터 회원정보를 입력받기 위한 JSP 문서
  • [입력완료]를 클릭한 경우 form 태그를 실행하여 처리페이지(useBean_action.jsp)를 POST 방식으로 요청해 입력값 전달

🐣 setProperty ActionTag

  • 입력페이지(useBean_form.jsp)에서 전달된 값을 반환받아 내장객체의 속성값으로 저장하고 출력페이지(useBean_display.jsp)로 포워드 이동 처리하는 JSP 문서
  • setProperty ActionTag : useBean 태그로 제공된 객체의 필드값을 변경하기 위한 태그
    • 객체 필드의 Setter 메소드를 호출하여 객체의 필드값 변경
    • 형식) <jsp:setProperty name="식별자" property="필드명" value="값"/>
    • name 속성(필수) : useBean 태그로 제공된 객체의 식별자(id 속성값)를 속성값으로 설정
    • property 속성(필수) : 값을 변경할 필드명을 속성값으로 설정
    • 필드명을 기반으로 작성된 Setter 메소드 자동 호출 (필드명으로 작성된 Setter 메소드가 없는 경우 에러 발생)
    • value 속성(선택) : 필드에 저장될 변경값을 속성값으로 설정
      (value 속성을 생략하면 JSP 문서 요청시 전달된 값을 반환받아 필드값 변경)
    • <jsp:setProperty name="hewon" property="name" value="홍길동"/>
    • hewon.setName("홍길동");과 동일
    • 주의) JSP 문서 요청시 전달된 값의 이름과 setProperty 태그의 property 속성값(객체의 필드명)이 반드시 동일해야만 전달값을 반환받아 필드값으로 변경 가능
    • property 속성값을 [*]로 설정한 경우 모든 전달값을 반환받아 객체의 필드값 변경
    • 전달값의 이름과 필드명이 동일한 경우에만 전달값을 반환받아 필드값 변경
    • <jsp:setProperty name="hewon" property="*"/>


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//비정상적인 요청에 대한 처리
	if(request.getMethod().equals("GET")) {
		response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
		return;
	}	
	//POST 방식으로 요청하여 전달된 값에 대한 캐릭터셋 변경
	request.setCharacterEncoding("utf-8");
%>
<%-- useBean ActionTag : JSP 문서에 객체를 제공하기 위한 태그 --%>
<%-- 형식) <jsp:useBean id="식별자" class="클래스" scope="사용범위"/> --%>
<jsp:useBean id="hewon" class="xyz.itwill.bean.Hewon" scope="request"/>
<%--
 	Hewon hewon=new Hewon();
	request.setAttribute("hewon", hewon); 와 동일
--%>
 
<%-- setProperty ActionTag : useBean 태그로 제공된 객체의 필드값을 변경하기 위한 태그 --%>
<%-- 형식)<jsp:setProperty name="식별자" property="필드명" value="값"/> --%>
<%-- <jsp:setProperty name="hewon" property="name" value="홍길동"/> --%> 
<%-- hewon.setName("홍길동"); --%>

<%-- 주의)JSP 문서 요청시 전달된 값의 이름과 setProperty 태그의 property 속성값(객체의 필드명)이
반드시 동일해야만 전달값을 반환받아 필드값으로 변경 가능 --%>
<%-- 
<jsp:setProperty name="hewon" property="name"/>
<jsp:setProperty name="hewon" property="phone"/>
<jsp:setProperty name="hewon" property="address"/>
--%>

<%-- property 속성값을 [*]로 설정한 경우 모든 전달값을 반환받아 객체의 필드값 변경 --%>
<%-- => 전달값의 이름과 필드명이 동일한 경우에만 전달값을 반환받아 필드값 변경 --%>
<jsp:setProperty name="hewon" property="*"/>
<%-- 
	hewon.setName(request.getParameter("name")); 
	hewon.setPhone(request.getParameter("phone")); 
	hewon.setAddress(request.getParameter("address")); 
--%>

<jsp:forward page="useBean_display.jsp"/>
<%--
 	request.getRequestDispatcher("non_useBean_display.jsp").forward(request, response);
    포워드 이동하기 위한 Java 명령 (스레드 이동)
--%>





🐣 getProperty ActionTag

  • 처리페이지(useBean_action.jsp)의 내장객체에 저장된 속성값을 반환받아 클라이언트에게 전달하는 JSP 문서
  • useBean 태그를 사용하여 request 내장객체에 저장된 속성값을 객체로 반환받아 저장

    • <jsp:useBean id="hewon" class="xyz.itwill.bean.Hewon" scope="request"/>
  • getProperty ActionTag : useBean 태그로 제공된 객체의 필드값을 반환받기 위한 태그

    • 객체 필드의 Getter 메소드를 호출하여 객체의 필드값을 반환받아 사용
    • 형식) <jsp:getProperty name="식별자" property="필드명"/>
    • name 속성(필수) : useBean 태그로 제공된 객체의 식별자(id 속성값)를 속성값으로 설정
    • property 속성(필수) : 값을 반환할 필드명을 속성값으로 설정
    • 필드명을 기반으로 작성된 Getter 메소드 자동 호출 (필드명으로 작성된 Getter 메소드가 없는 경우 에러 발생)
    • <jsp:getProperty name="hewon" property="name"/>


<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
	//비정상적인 요청에 대한 처리
	if(request.getAttribute("hewon")==null) {//request 내장객체에 저장된 속성값이 없는 경우
		response.sendError(HttpServletResponse.SC_BAD_REQUEST);
		return;
	}	
%>    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>JSP</title>
</head>
<body>
	<h1>회원정보확인</h1>
	<hr>
	<%-- useBean 태그를 사용하여 request 내장객체에 저장된 속성값을 객체로 반환받아 저장 --%>
	<jsp:useBean id="hewon" class="xyz.itwill.bean.Hewon" scope="request"/>
	<%-- Hewon hewon=(Hewon)request.getAttribute("hewon"); 와 같은 기능 --%>

	<%-- getProperty ActionTag : useBean 태그로 제공된 객체의 필드값을 반환받기 위한 태그 --%>
	<%-- => 객체 필드의 Getter 메소드를 호출하여 객체의 필드값을 반환받아 사용 --%>
	<%-- 형식) <jsp:getProperty name="식별자" property="필드명"/> --%>
	<p>이름 = <jsp:getProperty name="hewon" property="name"/></p>
	<p>전화번호 = <jsp:getProperty name="hewon" property="phone"/></p>
	<p>주소 = <jsp:getProperty name="hewon" property="address"/></p>
</body>
</html>





📌 JavaBean 클래스

  • JavaBean 클래스 : 웹프로그램 실행을 위해 WAS 프로그램에 의해 자동 생성되어 관리되는 객체를 생성하기 위한 클래스

    • useBean 태그에서 사용하기 위한 클래스
    • 웹프로그램 요청시 전달된 값이 저장될 객체를 생성할 목적의 클래스
  • JavaBean 클래스 작성규칙

    • 반드시 전달값의 이름과 동일한 이름으로 필드를 선언
    • public 접근지정자로 선언된 기본 생성자(매개변수가 없는 생성자)가 반드시 존재
    • 필드값을 반환하는 메소드(Getter)와 필드값을 변경하는 메소드(Setter) 메소드를 필드명을 기반으로 작성

profile
Study Log 📂

0개의 댓글