JSP

최주영·2023년 5월 24일
0

Servlet

목록 보기
7/9

✅ JSP

  • JAVA SERVER PAGE
  • JSP도 HTML처럼 F11로 실행 가능
  • JSP도 자바파일임 (페이지가 아님) 브라우저로 열리지않음
  • 확장자는 .jsp 이고, 처음 화면을 webapp -> jsp 파일만들어서 -> index.jsp로 만든다

✅ jsp가 제공하는 태그

지시자
문법 : <%@ 태그명 속성설정(속성명="속성값") %>

  • 태그 종류
    -> page : 페이지에 대한 설정하는 태그, 응답 contenttype, import정보, 언어정보 등을 설정
    -> include : 페이지(jsp)내에 다른 페이지를 불러올 때 사용하는 태그
    -> taglib : jsp에서 적용할 외부 라이브러리 등록(JSTL, springform)
    -> 접근 지정자는 사용 가능

선언문
문법 : <%!> 자바코드 %>

  • 자바클래스 구현부에 작성하는 코드 = 클래스 중괄호 부분에 들어갈 코드를 작성할 때 사용
  • index_jsp 클래스 내부에 작성됨
  • 메소드 선언, 멤버변수 선언 이용할 때 사용 -> 하지만 거의 사용안함!
  • 조건문, 반복문 등은 사용이 불가능함 -> 클래스 내부에는 로직 불가능

스크립트릿
문법 : <% 자바코드 %>

  • 자바의 메소드 내부에 들어갈 코드 작성할 때 사용
  • _jspservice()메소드 내부에 작성됨
  • 코드구현할 때 많이 이용
  • 지역변수, 반복문, 조건문 사용 가능하지만, 접근지정자는 사용 불가능

표현식
문법 : <%= 출력할문구||변수명||메소드호출 %>

  • html 화면에 변수나, 메소드 실행결과를 출력할때 사용

💡 jsp 파일안에서는 html 코드는 그냥 써도 되지만, 자바코드는 무조건 스크립트태그에서 써야함
jsp => HTML코드에 Java코드 삽입한것!

// index.jsp 파일
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="views/error/500error.jsp"%>  <!-- 이 문장이 없으면 안돌아감 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>나의 첫 jsp페이지</title>
</head>
<body>
	<h2>나의 첫 jsp페이지</h2>
	<h3>jsp가 제공하는 태그에 대해 알아보자</h3>
		
	// 선언문 활용하기 (!)
	<%!
		//멤버변수, 멤버메소드를 선언할 때 사용	
		// index_jsp 클래스 내부에 작성되며, 클래스내부라서 조건문,반복문은은 불가능
		// 접근지정자는 가능
		String testData;
		public int age = 19;
		public String getMsg(){
			return "안녕하세요";
		}
		
		//조건문, 반복문은 사용할 수 없다 (오류발생)
		/* if(testData.equals("TEST")){
			
		} */
		/* for(int i=0; i<10; i++){
			
		} */
	%>
	
	// 선언문에서 작성한 내용 이용하기 = 표현식 (=)
	<ol>
		<li>testData : <%=testData %></li>
		<li>age : <%=age %></li>
		<li>getMsg() : <%= getMsg() %></li>
	</ol>
	
    
	// 스크립트릿 활용하기 (기호x)
	<%
		//자바코드를 작성하는 부분
		//_jspservice()메소드 내부에 작성됨.
		// 메소드안에서 작성하는것이라서 접근지정자 사용 x 
		/* public double height = 30; */
		
		String msg="이제 곧 점심시간!";
		
		int rndNum = (int)(Math.random()*10+1);
		if(rndNum>3){ // 조건문 가능함
			out.print("3보다크다!");  // 페이지에 출력하는 문구  -> out.print 
		}
		for(int i=0; i<10; i++){ // for문 가능함
			out.println("출력"+i+"<br>"); 
		}
	%>
	
	<% String[] names = {"유병승","최주영","이은지","김현영","허성현","김찬은"};  %>

	<ul>
		<%for(String name : names){
			if(!name.equals("최주영")){%>
			<li><%=name %></li>
			<% } 
		  } %>
	</ul>
	<% if(msg.contains("점심")){ %>
			<h1>점심 맛있게 드세요</h1>
	<% } %>
	
	<% String[] hobby = {"코딩","독서","게임","등산","취침"}; %>
		<%for(String h : hobby){%>
			<label><input type="checkbox" name="hobby" value="<%=h%>" <%=h.equals("코딩")?"checked":""%>>
			<%=h%></label>	
		<% } %>

✅ jsp 내장객체

  • 서블릿에서 데이터를 저장하거나 정보를 가져왔던 객체를 지역변수로 가지고 있음
  • 밑에있는 객체들을 이제 이름으로만 사용할 수 있다

HttpServletRequest : request
HttpServletResponse : response
HttpSession : session
ServletContext : application
Cookie : request.getCookies()
Header : request.getHeader()
PrintWriter : out

<%
	List<Animal> animals=List.of(
			new Animal("뽀송이",2,"여",4.7),
			new Animal("뽀삐",2,"남",7.2),
			new Animal("유미",5,"여",10.2),
			new Animal("톰",2,"남",8.5)
			);
	request.setAttribute("animals", animals);  // request에 저장된 것
	session.setAttribute("loginId", "admin");  // session에 저장된 것
	application.setAttribute("contextData", "data"); // application에 저장된 것
	
	
	request.getRequestDispatcher("datacheck.jsp").forward(request,response);
	//response.sendRedirect(request.getContextPath()+"/views/datacheck.jsp"); // sendRedirect로 보내면 데이터를 저장하지 않은 상태로 페이지 이동됨
%>



// datacheck.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page import="java.util.List, com.data.model.vo.Animal" %>    
 
 // 전 페이지에서 객체에 저장된 값들을 현재 이 페이지에서 받아서 출력하는 결과
 // 각 데이터 타입에 맞게 형변환 해야함!
<%
	List<Animal> list = (List)request.getAttribute("animals");
	String sessiondata = (String)session.getAttribute("loginId"); 
	String context = (String)application.getAttribute("contextData");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h2>내장객체 저장된 데이터 불러오기</h2> 
	<h3>session : <%=sessiondata %></h3>  // session : admin
	<h3>context : <%=context %></h3>  //    context :  data
	
	<%if(list!=null && !list.isEmpty()){
			for(Animal a : list){%>
			<p><%=a %></p>	
		<%}
	}%>
</body>
</html>

✅ include 태그 활용 (header footer 저장해서 사용하기)

  • include 태그 사용하여 -> 페이지내에서 다른 페이지 불러오기
  • 공통페이지를 반영할 때 사용
//main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
// 원하는 위치에 불러올 수 있음
// include태그를 이용해서 공용페이지(header, footer) 불러오기
<%@ include file="/views/common/header.jsp" %>
	<section> 
		<h2>본문내용</h2>
		<p><%=headerData %></p>
	</section>
<%@ include file="/views/common/footer.jsp" %>
//header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<%
	String headerData="header선언데이터";
%>   

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="http://code.jquery.com/jquery-3.7.0.min.js"></script>
<style>
// 선택자를 이용해서 헤더 꾸미기 가능
</style>
</head>
<body>
	<header>
		<h1>sample header</h1>
		<nav>
			<ul>
				<li><a href="<%=request.getContextPath()%>/views/main.jsp">메인화면</a></li>
				<li><a href="">공지사항</a></li>
				<li><a href="<%=request.getContextPath()%>/views/board.jsp">게시판</a></li>
				<li><a href="">자료실</a></li>
				<li><a href="">추가메뉴</a><li>
				
			</ul>
		</nav>
	</header>
  
  
//footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
	<footer>
		<h2>나의 홈페이지 teacherdev09@gmail.com</h2>
	</footer>
		
</body>
</html>  

✅ page태그 속성알아보기
import : 외부패키지에 있는 클래스를 이용할때 import해줘야한다. ""안에 작성, 여러클래스를 호출할 때 ,로 구분함
errorPage : 페이지에서 (500)에러가 발생했을 때 연결될 페이지정할때 사용
isErrorPage : 에러를 출력하는 페이지에 설정, 설정하면 exception 객체를 이용할 수 있음
session : 세션객체를 자동생성할지 생성하지 않을시 결정

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.List,com.data.model.vo.Animal"%> 
  // 임폴트 두가지 했음 -> java.util.List 와  com.data.model.vo.Animal
  // 이처럼 외부패키지에 있는 클래스를 이용할때는 <%@ 안에 import 속성을 넣어야한다!
<%
	List<Animal> animals=List.of(
			new Animal("뽀송이",2,"여",4.7),
			new Animal("뽀삐",2,"남",7.2),
			new Animal("유미",5,"여",10.2),
			new Animal("톰",2,"남",8.5)
			);
	request.setAttribute("animals", animals);
	session.setAttribute("loginId", "admin");
	application.setAttribute("contextData", "data");
%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" errorPage="error/500error.jsp"%> 
    // 이페이지에서 500 에러발생시 error/500error.jsp로 이동 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<%
		String name=null;  
		name.length();  // 널포인터 오류 발생
	%>
</body>
</html>


// 500error.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isErrorPage="true"%>  
    // 에러페이지라는것을 알려줘야함 -> isErrorPage="true" 
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<h3 style="color:red">500에러발생!</h3>
	<p><%=exception.getMessage() %>
</body>
</html>
  • web.xml 파일에서 에러페이지 등록
<?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>05_jsp</display-name>

	<!-- 에러페이지 등록하기 -->
	<error-page>
		<!-- 기준을 error-code나 exception-type 중 하나 설정 -->	
		<!-- <error-code>500</error-code> -->  <!-- 500에러 발생하면 밑에 주소로 이동하라는 뜻 -->
		<!-- <exception-type>java.lang.NullPointerException</exception-type> --> 널포인터발생시 밑에 주소이동
		<exception-type>com.data.common.exception.MyException</exception-type> 사용자가 정의한 예외발생시 밑 주소이동
		<location>/views/error/500error.jsp</location>
	</error-page>
	
</web-app>
// MyException.java
package com.data.common.exception;

public class MyException extends RuntimeException{
	
	public MyException(String msg) {
		super(msg);
	}
}



// 이페이지에서 에러가 발생되면 강제로 MyException 이 발생됨
@WebServlet("/errorServlet.do")
public class ErrorServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public ErrorServlet() {
        super();
        // TODO Auto-generated constructor stub
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String name = null;
//		name.length();
//		String[] data=new String[3];
//		System.out.println(data[3]);
		
		throw new MyException("나의 예외발생");
	}

}

profile
우측 상단 햇님모양 클릭하셔서 무조건 야간모드로 봐주세요!!

0개의 댓글