JSP/Servlet

최상민·2023년 8월 6일

천재IT

목록 보기
6/10

JSP/Servlet

라이브러리 기본 설정

  • maven에서 설치

javax.servlet:javax.servlet-api:4.0.1
org.mariadb.jdbc:mariadb-java-client:3.1.4
org.apache.tomcat:tomcat-servlet-api:9.0.78

lib.zip

JSP 기본 문법

  • jsp 언어는 서로 중첩해서 사용 불가. 예컨대, 디렉티브 안에 스크립트릿을 쓰는 것은 불가하다.
  • 디렉티브: 첫머리에 설정, 가져올 자원 등 기술
    • 헤더 등의 중복되는 부분은 디렉티브를 통해 import 해서 사용한다.
  • 선언문(Demension, Declare): 익명의 클래스(또는 인터페이스)를 선언하여, 현재 이 jsp 안에서만 사용.
  • 스크립트릿(Scriptlet): html 내에서 자바를 사용 가능.
  • 표현식(Expression): 값을 가져와 html 출력. html 태그 내에서도 사용 가능
<%--jsp 각주--%> 
<%@ 디렉티브. 문서의 시작, import할 때 사용 %>

<%@include file=""%>
<%@include file="./nav.jsp"%>

<%!
	선언문
%>

<% 스크립트릿 %>
<%=표현식 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Response</title>
    <!-- CSS only -->
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
    <!-- JavaScript Bundle with Popper -->
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>
    <%
        request.setCharacterEncoding("UTF-8"); // 페이지 내 한글 깨짐 문제
        response.setContentType("text/html; charset=utf-8");
        response.setCharacterEncoding("UTF-8");
    %>
</head>
<body>
</body>
</html>

CSS 프레임워크

<!-- CSS only -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-rbsA2VBKQhggwzxH7pPCaAqO46MgnOM80zW1RWuH61DGLwZJEdK2Kadq2F9CUG65" crossorigin="anonymous">
<!-- JavaScript Bundle with Popper -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-kenU1KFdBIe4zVF0s0G1M5b4hcpxyD9F7jL+jjXkk+Q2h455rYXK/7HAuoJl+0I4" crossorigin="anonymous"></script>

JSP 내장 객체 🔗

  • jsp의 기본 내장 객체에는 request, response, page, out, session, application, cookie, config, exception 등이 있다.
  • 내장 객체의 영역은 page, out < request(요청), response(반응) < session 순이다.
  • 내장 객체에 공통적으로 attribute 속성을 설정할 수 있다.
  • 모든 웹의 객체는 attribute가 값을 저장할 수 있고(setAttribute 메소드를 통해), 저장된 값을 가져올 수 있다(getAttribute 메소드를 통해)
object.setAttribute(String name, Object value); // 이름이 name인 속성에 value 값 지정
object.getAttribute(String name); // 이름이 name인 속성의 Attribute 객체 반환
object.removeAttribute(String name); //이름이 name인 속성 삭제
object.getAttributeNames(); // 속성의 이름 목록 반환

out

  • out: 출력 객체. 브라우저에 태그를 포함하여 출력할 수 있는 객체.

request

  • request: 요청 객체. 브라우저에서 요청한 정보를 저장하고 있는 객체. 요청 정보가 전달되는 객체 → 요청한 정보가 해당 페이지를 벗어나면 소멸됨
  • URL(파일식별자): 네트워크 상에서 자원이 어디 있는지를 알려주기 위한 규약
  • URI(통합 자원 식별자): 인터넷에 있는 자원을 나타내는 유일한 주소
request.setCharacterEncoding("UTF-8");
// request 한국어 인식 설정
String id = request.getParameter("id"); 
// form에서 post한 데이터 받을 때
String[] animal = request.getParameterValues("animal"); 
// form에서 checkbox와 같이 복수의 데이터를 받을 때

request.getProtocol()
request.getServerName()
request.getMethod()
request.getQueryString()
request.getRequestURL()
request.getRequestURI()
request.getRemoteHost()
request.getRemoteAddr()
request.getRemotePort()
request.getServerPort()
request.getContextPath() 
request.getHeader("Accept")
request.getHeader("Host")

Untitled

  • request.getContextPath(); 웹상의 어플리케이션들을 구분하기 위한 Path로 link, img 등의 태그에서 src의 위치를 맞춰줄 때 사용한다.
String path = request.getContextPath(); // 현재 프로젝트 디렉토리를 알아서 가져옴.

...

<p>img: <img src="<%=path%>/img/dog%20ears.gif" alt="img"></p>

response

  • response: 응답 객체. 브라우저에서 보낼 정보를 저장하고 있는 객체. 결과를 돌려줄 페이지에 전달할 정보가 객체
    • 한국어 등이 포함된 url로 redirect할 때는 URLEncoder.encode 클래스를 import해야 한다.
response.setCharacterEncoding("UTF-8");
response.addHeader("Site", "https://chunjae.co.kr"); // 있는 헤더 추가
response.setHeader("Url2", "https://www.naver.com"); // 없는 헤더 추가

response.sendRedirect("test05.jsp?msg="+msg);

<%@ page import="java.net.URLEncoder" %>
<%@ page import="java.nio.charset.StandardCharsets" %>
response.sendRedirect("test05.jsp?msg="+URLEncoder.encode(msg, StandardCharsets.UTF_8));

response.setStatus(200); // 수동 정상 처리
response.sendError(200, "페이지가 정상적으로 처리되었습니다.");

response.setStatus(404); // 수동 오류 처리
response.sendError(404, "해당페이지가 존재하지 않습니다.");

response.getContentType()
response.getCharacterEncoding()
response.containsHeader("Site") // 헤더 존재 유무
response.getStatus()

session

  • session: 세션 객체. 로그인 정보를 저장하고 있는 객체. 로그인을 하고, 로그아웃 전까지 정보가 저장되는 객체 → 로그아웃 시에 소멸됨
    • Attribute 객체로 반환하므로 (String)으로 cast 필요
String pw = (String) session.getAttribute("pw");
session.setAttribute("id", id);
session.invalidate(); // 로그아웃 처리. 모든 session의 설정된 attribute를 지움
session.removeAttribute("id"); // 특정 항목의 session atttribute를 지움

application

  • application: 애플리케이션 객체. 애플리케이션 정보가 담기는 객체로 브라우저가 닫히거나 웹 어플리케이션이 종료되면, 자동으로 소멸된다.

기타

  • page: 현재 페이지 객체. 현재 페이지에서만 사용할 내용을 저장하고 있는 객체
  • config: 응답 객체. 애플리케이션의 설정 정보를 저장하고 있는 객체
  • exception: 예외 처리 객체. 애플리케이션에서 예외 처리를 위한 객체

Servlet의 객체

  • jsp와 달리 servlet에서는 객체를 일일이 생성해야 한다.

request, response, session 많이 사용.

JspWriter pageOut = pageContext.getOut(); // out 
ServletRequest pageRequest = pageContext.getRequest(); // request
ServletResponse pageResponse = pageContext.getResponse(); // response
HttpSession pageSession = pageContext.getSession(); // session
ServletContext pageServlet = pageContext.getServletContext(); // application
ServletConfig pageConfig = pageContext.getServletConfig(); // config
Exception pageException = pageContext.getException(); // exception
Object pageObject = pageContext.getPage(); // page

pageContext

  • pageContext: 데이터를 페이지끼리 주고받는 것.

out은 html(태그 포함) 출력이 가능하여, <%스크립트릿%> 을 열고 닫는 것을 생략해준다.

  • include: 현재 페이지에 target.jsp의 내용을 가져오는 것
  • forward: 현재 페이지로 target.jsp의 내용을 전송하는 것. 페이지 이동과는 다르다.
includeforward
title유지target의 title
주소 url유지유지
내용현재 내용 중간에 그 내용이 들어감target의 내용만을 가져와 표시함

JDBC

  • DAO(Data Access Object): 데이터베이스의 데이터에 접근하기 위한 객체. DataBase 접근 로직과 비즈니스 로직을 분리하기 위해 사용한다.
  • DTO(Data Transfer Object): 계층 간 데이터 교환을 위한 자바 객체로 로직을 가지지 않는 순수한 데이터 객체, getter, setter 메소드만 가진 클래스를 의미함.
  • VO(Value Object): 값 오브젝트로 readOnly라는 특징을 가져, 사용 도중 값을 변경 불가능하고 오직 읽기만 가능하다. DTO와 유사하지만 DTO는 setter를 통해 값 변경이 가능하다.

DAO(Data Access Object)

  • 데이터베이스와 관련된 Java의 객체로 jdbc(드라이버 커넥터)를 통해 Maria DB에 접근
    • Class.forName(Driver): 드라이버를 읽고 자동으로 객체를 생성한다. 드라이버를 찾지 못하거나 문제가 있으면 ClassNotFoundException 예외를 발생시킨다.
    • DriverManger: Class.forName 메소드를 사용함으로써 생성돼, jdbc 드라이버를 통해 jsp 커넥션을 만든다. 인터페이스 드라이버를 구현하는 작업 수행.
    • Connection(conn): 연결자.
    • PreparedStatement(pstmt): ? 변수 처리된 SQL query문을 미리 전송 후, set 메소드로 sql문을 완성하여 가독성을 높여준다.
    • ResultSet(rs): PreparedStatement의 query 수행 결과를 받는 객체이다.
  • Connection → PreparedStatment → ResultSet 순으로 초기화하고, 그 반대 순서로 close해줘야 한다.
package dao;
public class DBConTest {
    public static void main(String[] args) {
        final String DRIVER = "org.mariadb.jdbc.Driver"; // 마리아db lib의 패키지 안의 클래스
        final String DNS = "localhost"; // post server 주소
        final String PORT = "3306";
        final String NAME = "edu";
        final String user = "root";
        final String PW = "1234";
        final String URL = "jdbc:mariadb://" +DNS+":"+PORT+"/"+NAME;
        // jdbc:mariadb://localhost:3306/edu
        // 프로토콜:디비종류://호스트주소:포트번호/데이터베이스
    }
}

XML 🔗

  • xml (extended markup language): html 태그를 사용자 정의해서 만들 수 있게 한 것. 웹에서 제공해야 하는 규정된 태그로 아래와 같은 내용이 있다.
  • display-name: 앱에 대한 이름 부여.
<display-name>ch02</display-name>
  • welcome-file-list: 시작하는 메인 파일을 index.jsp 외에도 여러 목록을 추가. welcome-file 안에 작성함. 목록 중 먼저 있는 것이 우선순위가 높다. 메인 페이지 세팅을 조정한다.
<welcome-file-list>
    <welcome-file>test6.jsp</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>
  • error-page: 에러 또는 Exception에 대해 별도의 형식을 지정하여 보여줄 수 있다. error-page 태그 안에 error-code와 에러 페이지 location을 지정한다. 에러 페이지에는 맨 위 기본 디렉티브 안에 isErrorPage 속성을 추가해야 한다. 페이지를 불법적인 경로를 들어올 때 많이 쓴다.
<error-page>
    <error-code>404</error-code>
    <location>/notFoundErrorPage.jsp</location>
</error-page>
<error-page>
    <exception-type>java.lang.NumberFormatException</exception-type>
    <location>/formatException.jsp</location>
</error-page>
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <%
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=utf-8");
        String notFoundPath = request.getContextPath();
    %>
</head>
<body>
<div class="container">
    <br>
    <h2>요청하신 페이지를 찾을 수 없습니다.</h2>
    <a href="index.jsp">To Home</a>
    <br>
    <img src="<%=notFoundPath%>/img/notfound.gif" alt="This Page is not Found">
</div>
</body>
</html>

Untitled

  • 서블릿 매핑 필터: 파일을 읽어올 수 있도록 함. 서블릿을 거칠 때 보안으로 인해 파일을 접근하지 못할 수 있다. 따라서, 서블릿 보안에 걸리지 않도록 서블릿 매핑을 사용한다.
<servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.js</url-pattern>
    <url-pattern>*.css</url-pattern>
    <url-pattern>*.jpg</url-pattern>
    <url-pattern>*.png</url-pattern>
    <url-pattern>*.gif</url-pattern>
    <url-pattern>*.webp</url-pattern>
</servlet-mapping>
  • 🔗인코딩 필터: 인코딩 필터가 내장되지 않을 때, 한글이 깨지는 등의 문제가 생기면 사용할 수 있지만, 정상 작동할 때 사용하면 문제가 생길 수 있다.

Javascript 설정

javascript로 드래그 및 복사 붙여넣기 금지하기(공통으로 들어가는 head 파일에 추가하기)

profile
상민

1개의 댓글

comment-user-thumbnail
2023년 8월 6일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기