백엔드/JSP
JSP
코딩 화이팅
2023. 3. 8. 14:44
- Servlet 표준을 기반으로 작성된 웹 어플리케이션 개발 언어
- HTML 내에 Java를 작성하여 동적으로 웹페이지를 생성하여 브라우저에게 돌려주는 페이지
- 실행 시 Servlet으로 변환된 후 실행
JSP 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Hello</title>
</head>
<body>
<%
String name = "강현";
%>
<%-- <% %>를 사용하여 자바 코드 사용 가능 --%>
<h2>Hello JSP</h2>
<h4>안녕하세요. <%=name %>입니다.</h4>
<%-- <%= %>으로 입력된 변수를 사용 가능 --%>
</body>
</html>
스크립트릿
스크립팅 언어(java)로 작성된 코드 조각을 포함하는데 사용
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>스크립트릿</title>
</head>
<body>
<h2>스크립트릿 연습</h2>
<%
int A = 10;
int B = 20;
int sum = A + B;
out.print(A+"+"+B+"="+sum);
%>
</body>
</html>
선언부
멤버변수 선언이나 메서드를 선언하는 영역
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
String name = "SSAFY";
//두정수를 더하는 메서드
public int add(int A, int B){
return A+B;
}
//절대값을 반환하는 메서드
public int abs(int A){
return A > 0 ? A : -A;
}
int a = 10;
int b = -20;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>선언</title>
</head>
<body>
<%out.print(add(a, b));%> <br>
<%out.print(abs(a));%> <br>
<%out.print(abs(b));%> <br>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
int cnt1 = 0;
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
int cnt2 = 0;
out.print("cnt1 : ");
out.print(++cnt1);
out.print("<br>");
out.print("cnt2 : ");
out.print(++cnt2);
out.print("<br>");
%>
</body>
</html>
쉽게 생각하면 <%! %>으로 선언하면 전역변수가 되고 body안에 <% %>를 사용하면 지역 변수가 되어 f5를 누를 때마다 cnt2는 변하지 않지만 cnt1은 계속해서 올라가는 것을 볼 수가 있다.
표현식
변수의 값이나 계산식 혹은 함수를 호출한 결과를 문자열 형태로 웹문서에 출력
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%!
String name = "강현";
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.print(name);
%>
<br>
<!-- 표현식(계산식, 변수, 메서드가 올 수 있다.) -->
<!-- 뒤에 ;없어야 된다. -->
<%=name %>
</body>
</html>
같은 것을 출력하는 것을 볼 수 있다.
주석문
- 작성한 코드에 대한 설명을 기술할 경우 사용
- HTML 주석문과 동일한 기능을 하지만 HTML 주석문은 클라이언트에게 보여지고, JSP 주석문은 보여지지 않는다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Comment</title>
</head>
<body>
<!-- 이것은 HTML 주석입니다. -->
<%-- 이것은 JSP 주석입니다. --%>
<%
//스크립트릿에서 사용한 주석입니다.
%>
<h2>주석</h2>
</body>
</html>
f12를 보면 html주석은 보여지고 jsp주석은 보여지지 않는 것을 볼 수 있다.
지시자
- 웹컨테이너가 JSP 번역하고 실행하는 방법을 서술
- page : 해당 JSP 전반적으로 환경을 설정할 내용 지정
- include : 현재 페이지에 다른 파일의 내용 삽입할 때 사용
- taglib : 태그 라이브러리에서 태그를 사용할 수 있는 기능 제공
Page
- JSP 페이지 실행 매개변수를 제어
- 출력처리, 오류처리 등의 내용을 포함
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="error.jsp" %>
<!-- 에러가 나면 여기로 가라 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>강제로 0으로 나누어</title>
</head>
<body>
0으로 나누는것은 불가넝~~
<%= 2/0 %>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page errorPage="error.jsp" %>
<!-- 에러가 나면 여기로 가라 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>강제로 0으로 나누어</title>
</head>
<body>
0으로 나누는것은 불가넝~~
<%= 2/1 %>
<!-- 0이었던 걸 1로 바꾼다면? -->
</body>
</html>
Include
- JSP 내에 다른 HTML 문서나 JSP 페이지의 내용을 삽입할 때 사용한다.
- 반복적으로 사용되는 부분(header, footer 등) 별도로 작성하여 페이지 내에 삽입하면 반복되는 코드의 재작성을 줄일 수 있다.
include안에 파일을 가기 위해 파일 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<header>head 수정 혹은 메뉴가 들어갈 내용입니다.</header>
===================================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>인클루드 써보자</title>
</head>
<body>
<%@ include file="/template/header.jsp"%>
<h3>메인내용입니다.</h3>
<p>가나다라마사바사</p>
</body>
</html>
페이지 이동
요청을 받아서 화면을 변경하는 방법
포워드 방식
- 요청이 들어오면 요청을 받는 JSP 또는 Servlet이 직접 응답을 작성하지 않고, 요청을 서버내부에서 전달하여 해당 요청을 처리하게 하는 방식
- request, response 객체가 전달되어 사용되기 때문에 객체가 사라지지 않는다. 브라우저에는 최초 요청한 주소가 표시된다.
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>메인</title>
</head>
<body>
<a href="regist.jsp">등록하기</a>
<a href="main?action=list">목록으로</a>
</body>
</html>
등록하기를 누른다면
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>등록</title>
</head>
<body>
<!-- 여기서 /는 컨테이너 루트를 의미함 그래서 생략 -->
<form action="main" method="POST">
<input type="hidden" name="action" value="regist">
<label>이름 : </label>
<input type="text" placeholder="이름을 입력하세요" name="name"><br>
<label>나이 : </label>
<input type="number" min="0" placeholder="나이를 입력하세요" name="age"><br>
<input type="radio" id="man" name="gender" value="man">
<label for="man">남자</label>
<input type="radio" id="woman" name="gender" value="woman">
<label for="woman">여자</label>
<fieldset>
<legend>취미</legend>
<input type="checkbox" id="sleep" name="hobby" value="sleep">
<label for="sleep">수면</label>
<input type="checkbox" id="eat" name="hobby" value="eat">
<label for="eat">먹기</label>
<input type="checkbox" id="study" name="hobby" value="study">
<label for="study">공부</label>
<input type="checkbox" id="jump" name="hobby" value="jump">
<label for="jump">점프</label>
</fieldset>
<input type="submit">
</form>
</body>
</html>
아래와 같은 창이 뜨고 아래와 같은 정보를 입력 후 제출을 누르면
package com.ssafy.manager;
import java.util.ArrayList;
import java.util.List;
import com.ssafy.dto.Person;
//사람의 목록 관리를 하는 매니저
//싱글턴으로 만들고 싶어요!!
public class PersonManager {
//사람 목록
private List<Person> list = new ArrayList<>();
private static PersonManager manager = new PersonManager();
//기본생성자막기
private PersonManager() {
}
//외부에서 그래도 만들어진 매니저를 가져다 써야되니까~~~
public static PersonManager getInstance() {
return manager;
}
//사람을 등록하는 기능
public void regist(Person p) {
list.add(p);
}
//사람의 목록을 반환하는 기능
public List<Person> getAll(){
return list;
}
//... 다양하게 분류를 지어 가져오도록 만들어 볼수도있음...
}
====================================================================
package com.ssafy.servlet;
import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.ssafy.dto.Person;
import com.ssafy.manager.PersonManager;
//Front Controller 패턴을 이용해서
@WebServlet("/main")
public class MainServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
doProcess(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
doGet(request, response);
}
private void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String action = request.getParameter("action");
switch (action) {
case "regist":
doRegist(request, response);
break;
case "list":
doList(request, response);
break;
default:
break;
}
}
private void doList(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
PersonManager pm = PersonManager.getInstance();
request.setAttribute("list", pm.getAll());
request.getRequestDispatcher("/WEB-INF/list.jsp").forward(request, response);
}
private void doRegist(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String gender = request.getParameter("gender");
String[] hobbies = request.getParameterValues("hobby");
Person p = new Person(name, age, gender , hobbies);
PersonManager pm = PersonManager.getInstance();
pm.regist(p);
request.setAttribute("person", p);
request.setAttribute("size", pm.getAll().size());
//response를 이용해서 여기다가 쭉 썼다면~~
RequestDispatcher disp=request.getRequestDispatcher("/result.jsp");
disp.forward(request, response);
// response.sendRedirect(request.getContextPath()+"/result.jsp");
}
}
===========================================================================
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="com.ssafy.dto.Person" %>
<%@ page import="java.util.Arrays" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
Person p = (Person)request.getAttribute("person");
%>
<h2>결과창</h2>
등록된 총인원 : <%=request.getAttribute("size") %> <br>
<table>
<tr>
<td>이름</td>
<td><%=p.getName() %></td>
</tr>
<tr>
<td>나이</td>
<td><%=p.getAge() %></td>
</tr>
<tr>
<td>성별</td>
<td><%=p.getGender() %></td>
</tr>
<tr>
<td>취미</td>
<td><%=Arrays.toString(p.getHobbies()) %></td>
</tr>
</table>
<a href="/BackEnd03_JSP">홈으로</a>
</body>
</html>
아래와 같이 입력한 횟수에 따라 총인원이 바뀌고 입력한 정보들이 출력된다.
만약 이렇게 입력 후 목록으로를 들어간다면
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList"%>
<%@ page import="com.ssafy.dto.Person"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>목록</h2>
<%
ArrayList<Person> list = (ArrayList<Person>) request.getAttribute("list");
for (int i = 0; i < list.size(); i++) {
out.print(list.get(i).getName());
%>
<br>
<%
}
%>
</body>
</html>
리다이렉트 방식
- 요청이 들어오면 내부 로직 실행 후, 브라우저의 URL을 변경하도록 하여 새로운 요청을 생성함으로써 페이지를 이동한다.
- 브라우저가 새로운 요청을 만들어 내기 때문에 최초 요청 주소와 다른 요청주소가 화면에 보여진다.