✅ JSP
✅ jsp가 제공하는 태그
지시자
문법 : <%@ 태그명 속성설정(속성명="속성값") %>
선언문
문법 : <%!> 자바코드 %>
스크립트릿
문법 : <% 자바코드 %>
표현식
문법 : <%= 출력할문구||변수명||메소드호출 %>
💡 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 저장해서 사용하기)
//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>
<?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("나의 예외발생");
}
}