[JSP]

얘는 대체 얼마나 더 정리해야 하는가....

JSP 는 웹 상에서 동적인 어플리케이션을 개발하는 방법 중의 하나로 사용자로부터 호출 될 때 자동으로 servlet으로 변환된다.
JSP는 내부적으로 서블릿에서 Exception보다 한 단계 위 클래스인 Throwable클래스를 try ~catch하기때문에 서블릿처럼 예외처리를 안 해줘도 됨!  기본적인 예외는 처리 됨

자바 코드와 HTML 코드를 적절히 조합하여 사용이 가능하다(하지만 규모가 커지면 분리 해 줘야 함)
디자인 부분과 로직 부분을 분리시킬 수 있다. (java가 로직, html은 디자인이라고 생각)

서블릿보다 쉽고, 빠르다.
(프로그래머가 직접 코딩한 Servlet보다 최적화된 Servlet을 생성시켜 효율적인 코드가 만들어진다.)

 

파일은 어디서 찾는 가..

이클립스로 작업시에는 workspace아래
.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work아래에 서 찾으면 됨

 

 

[JSP구성요소]  - 우선 크게보고 자세한건 하나 씩 !! 

1.지시어 (Directive)  :   형태는 <%@지시어%>    , 띄어쓰기 저 형태는 띄어쓰기 하면 안됨 !! 

     1-1.page 지시어  : servlet 컨테이너에게 JSP파일에 대한 "정보"를 알려주는 역할 ex) import,info, errorPage

     1-2.include 지시어  : 페이지를 삽일 할때 사용.

     1-3.taglib : EL(Expression Language), JSTL(JSP Standard Tag Library), Custom Tag를 JSP 페이지내에 사용할때 사용한다.

 

2.스크립팅 원소 :  jsp페이지에서 자바 코드를 직접 작성할 수 있게 하는 기능

   2-1선언부 : <%! 자바코드 %>  , _jspService() 메소드 외부에 선언된다.(클래스 안에 생성!!)

   2-2 스크립트렛 : <% 자바코드 %> , _jspService() 메소드내에 삽입되기 때문에 이 안에서는 메소드를 구성할 수 없다

   2-3 표현식 :  <%= 자바코드 %> , 결과를 화면에 출력함!(system.out.println() 같은거라 끝에 절대 ; 안 붙임!!)

 


 

[page  지시어 중 에러 페이지 관련  : errorPage, isErrorPage(두개가 한 쌍이라고 생각!!) ]

 

여기서도 코드 작성 하다 보면 에러가 뜨겠지...

젤 무섭다 시뻘건 에러... 여기서도 try~catch 로 에러 잡을 수 있고 에러 페이지를 띄워주는 방법도 있다 !

 

우선 에러가 날 수 있는 코드 작성(HTML문서)-- 이건 에러가 발생하는 페이지의 body에 작성 

<body>
	<fieldset class=" form-group border p-3">
	   <legend class="w-auto px-3">에러를 발생시킬 페이지</legend>
		   <form>
		       <div class="form-group">
			   <label for="age">나이를 입력하세요?</label>
				  <input class="form-control" type="text" name="age" id="age"/>
			    </div>
			    <input class="btn btn-success" type="submit" value="확인"/>
		   </form>
		   <% if(after10Years !=-1) {%>  <!-- 사용자 입력 전에는 안보이게 하려고 if절로 묶음! 물론 제대로 입력 할 땐 떠야지 !-->
			  당신의 10년 후 나이는<%= after10Years %>살 입니다. 
		   <% }; %>
 	</fieldset>
 </body>

잘 입력 했을 때

 

사용자가 숫자가 아닌 문자를 입력하면 에러 뙇!!!

이걸 잡아야 겠죠

 

 

 

방법 1. 에러페이지로 이동시키기 !   

  errorPage: 에러가 발생하는 페이지 !  상단부분 !  

  자바코드로 사용자 입력 값 받고 에러처리 할 로직을 작성한다 .

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"  
    errorPage="ErrorInfo.jsp"     <!---요거로 페이지 연결!!  page지시어의 errorPage속성 사용 ---->
%>
<% 
     //사용자가 입력한 값 받기
	String stringAge=request.getParameter("age");
	//out.println("stringAge:"+stringAge);
	int after10Years=-1;
	String errorMessage="";
	if(stringAge != null){  //최초 페이지 요청 시 null 체크 이거 안하면 처음엔 걍 에러페이지 뜸 !
		//방법1.에러페이지 띄우기  page지시어의 errorPage속성 사용 : try~catch 불필요
		after10Years = Integer.parseInt(stringAge)+10;
	 }	    
%>

   

  isErrorPage: 현재 JSP 가 에러처리를 담당하는 페이지가 맞는지 구분하는 속성( 쉽게말해 에러나면 보이는 페이지!!)
        ex) "false"(기본값)/ "true"  

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"
    isErrorPage="true"   <!---요거를 true로 하고 body안에 띄울 에러 내용을 넣는다!--->
%>

<body>
 		<fieldset class=" form-group border p-3">
			<legend class="w-auto px-3">에러발생</legend>
			<h2>관리자에게 문의하세요 &#9742; 010-1234-5678</h2>
			<h3 class='text-danger'>에러 내용</h3>
			<!-- 
				JSP의 exception내장객체는 page지시어의 isErrorPage속성이
				true인 jsp페이지에서만 사용가능	
	     	--> 
			<%= exception.getMessage() %>
		</fieldset>

</body>

새로운 페이지로 이동시킨다.

 

 

방법2. 여기서도 try~catch 가 가능함! 이건 별도 페이지를 만들지 않아도 된다!

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"  
    errorPage="ErrorInfo.jsp"
    %>
<%
     //사용자가 입력한 값 받기
	String stringAge=request.getParameter("age");
	//out.println("stringAge:"+stringAge);
	int after10Years=-1;
	String errorMessage=" ";
	if(stringAge != null){  // 최초 페이지 요청 시 null 체크
		//방법 1. trycatch로 직접처리 !!
		try{
			after10Years = Integer.parseInt(stringAge)+10;
		}
		catch(NumberFormatException e){
			errorMessage="나이는 숫자만 !!!";
		}
	}	    
%>

<body> 
	<fieldset class=" form-group border p-3">
		<legend class="w-auto px-3">에러를 발생시킬 페이지</legend>
		<form>
			<div class="form-group">
				<label for="age">나이를 입력하세요?</label>
				<input class="form-control" type="text" name="age" id="age"/>
			</div>
			<input class="btn btn-success" type="submit" value="확인"/>
		</form>           
		<% if(after10Years !=-1) {%>  <!-- 사용자 입력 전에는 안보이게 하려고 if절로 묶음! 물론 제대로 입력 할 땐 떠야지 !-->
			당신의 10년 후 나이는<%=after10Years %>살 입니다. 
		<% }; %>
                
		<!-- try catch로 에러잡을 때 사용  -->
		<% if(errorMessage.length() !=0 ){ %>
			<div class="alert alert-warning mt-2">
				<button type="button" class="close" data-dismiss="alert">&times;</button>
				<strong>Not Number!</strong><%= errorMessage %>
			</div>
		<% } %>
 	</fieldset>	  
</body>

try~catch 로 잡을 때 !

 


[Include]  :  <%@  include 지시어  %>

A,B 두개의 jsp 파일이 있는데

B.jsp 파일 자체를 A.jsp 파일안으로 삽입시키는 것.

이 때 중요한 사실 !!

A.jsp파일을 서블릿으로 변환 할 때 B.jsp파일은 변환되지 않는다 .

 

A파일   

<body>  
  <nav class="navbar navbar-expand-sm bg-secondary navbar-dark fixed-top">
 
    <!-- Brand -->
    <a class="navbar-brand" href="#">
      <img src="../images/logo.png" alt="로고이미지" style="width:70px;"/>
    </a>
  
    <!-- Toggler/collapsibe Button -->
    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#collapsibleNavbar">
      <span class="navbar-toggler-icon"></span>
    </button>
  
    <!-- Navbar links -->   
    <div class="collapse navbar-collapse justify-content-end" id="collapsibleNavbar">
      
      <ul class="navbar-nav">    
        
        <li class="nav-item">
          <a class="nav-link" href="#">Link1</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link2</a>
        </li>
        <li class="nav-item">
          <a class="nav-link" href="#">Link3</a>
        </li>
        <li class="nav-item dropdown">
          <a class="nav-link dropdown-toggle" href="#"  data-toggle="dropdown">
            Link4
          </a>
          <div class="dropdown-menu">
            <a class="dropdown-item" href="#">Link 1</a>
            <a class="dropdown-item" href="#">Link 2</a>
            <a class="dropdown-item" href="#">Link 3</a>
          </div>
        </li>
        <li class="nav-item">
          <form class="form-inline" action="#">
            <input class="form-control mr-sm-2" type="text" placeholder="검색어 입력">
            <button class="btn btn-success" type="submit">검색</button>
          </form>
        </li>
      </ul>
     
    </div>
  </nav>
  
  <div class="container" style="margin-top:50px;">

    <div class="jumbotron bg-warning">
      <h1>include 지시어</h1>      
    </div>
    <%@ include file="IncludedPage.jsp" %>    <!--- 요렇게 연결시키는 것 !!---->
    <h2>오늘은 <%=getDate("yyyy-MM-dd")%>일 입니다.</h2>
	현재 페이지명은 <%= currentPageName %>입니다.

  </div>
</body>

 

B파일

<%@page import="java.util.Date"%>
<%@page import="java.text.SimpleDateFormat"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!-- IncludedPage.jsp -->
<!-- 여러 JSP페이지에서 공통으로 사용할 변수나 상수, 메소드 정의 -->
<%!  
      // 공용으로 쓰는데 private?? 어차피 통채로 가져가서 쓸거라 괜춘! 
	private SimpleDateFormat dateFormat = new SimpleDateFormat();
	   //공통 메소드
	private String getDate(String pattern){
		dateFormat.applyPattern(pattern);
		return dateFormat.format(new Date());
	}
%> 
<%
	//공통 변수
	String requestURL = request.getRequestURL().toString();
	String currentPageName=requestURL.substring(requestURL.lastIndexOf("/")+1);
%>

 

 

 

+ Recent posts