Coding 공부/IntelliJ
[IntelliJ] 웹 프로그램의 기본 구조, form, EL, Dispatcher, getParameter
CBJH
2024. 4. 16. 15:20
728x90
반응형
1. 잡담
1.1 이벤트 리스너
- 이벤트가 발생했는지 어떻게 알 수 있을까? 이벤트 리스너가 사용자의 입력값을 받는다.
- 콘솔 프로그램은 문자열을 사용자에게 입력받아 순차적으로 처리한다.
- 웹에서는 이벤트리스너에 목록이 있어서 마우스에서 특정 버튼을 누르거나 기능을 실행했을 때 입력값을 받는다. 평소에는 리스너가 계속 사용자의 행동을 지켜보고 있다.
1.2 웹 프로그램의 기본 구조
- 브라우저에서 요청이 발생(Request) -> 서버(웹 서버, 웹 어플리케이션 서버)에서 응답(Response) 받음 -> 데이터 베이스에서 데이터가 있는지 체크해서 받아옴 -> 서버에서 정보를 받아 데이터를 보낼지 없으면 새로운 것을 만들지 처리함 -> 브라우저에 응답을 보냄.
- HTML+CSS -> (Servlet, 톰캣), FastAPI, Flask -> MySQL, Oracle 등
2. Intellij VM 옵션 설정하기
- -Xmx2048m
- 이 설정은 JVM이 사용할 수 있는 최대 힙 메모리 크기를 설정합니다. 여기서 2048m은 2048 메가바이트, 즉 2기가바이트의 메모리를 최대로 사용하도록 지정합니다. 이는 Java 애플리케이션이 사용할 수 있는 최대 메모리 양을 제한하여, 더 많은 메모리가 필요할 경우 OutOfMemoryError를 발생시키게 합니다. 이 설정을 통해 메모리 리소스의 사용을 관리할 수 있습니다.
- -Dconsole.encoding=UTF-8
- 이 옵션은 Java 애플리케이션에서 콘솔 입출력에 사용되는 문자 인코딩을 UTF-8로 설정합니다. 이는 다양한 국제 문자가 포함된 데이터를 콘솔에서 올바르게 읽고 쓰기 위해 필요합니다. 특히 다국어를 다루는 애플리케이션에서 중요한 설정입니다.
- -Dfile.encoding=UTF-8
- 이 설정은 파일 입출력 작업에 사용되는 기본 문자 인코딩을 UTF-8로 설정합니다. 이는 파일을 읽거나 쓸 때 UTF-8 인코딩을 사용하여 문자 데이터를 올바르게 처리하도록 합니다. UTF-8은 광범위한 문자를 지원하므로, 국제적으로 사용되는 애플리케이션에 적합합니다.
3. HelloServelt.java 코드 살펴보기
package org.zerock.w11;
import java.io.*;
import jakarta.servlet.http.*;
import jakarta.servlet.annotation.*;
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;
public void init() {
message = "Hello World!";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
public void destroy() {
}
}
- 서블릿 컨테이너 : 서블릿을 담아두는 장소
- name으로 구분한다.
- 서블릿에서 name으로 다른 서블릿을 호출 할 수 있다.
- urlPatterns = "/"
- @WebServlet 어노테이션의 역할 : 밑의 코드를 웹 서블릿 형식으로 사용하겠다. 즉시성을 부여한다.
- PrintWriter : response할 것을 담는 역할. 스트림에 값을 출력한다. java.io 모듈안에 있다. (Web이랑은 상관 없음, 출력 스트림, 문자 데이터를 출력하는 것에 특화되어 있다.)
4. index.jsp 코드 살펴보기
<%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<!DOCTYPE html>
<html>
<head>
<title>JSP - Hello World</title>
</head>
<body>
<h1><%= "Hello World!" %></h1>
<br/>
<a href="hello-servlet">Hello Servlet</a>
</body>
</html>
- JSP의 내장 객체 : request, response, session(일정 기간동안 저장하는 변수, 로그인 10분 연장), application(전체 프로그램이 종료할때까지 저장하는 변수) (내장 객체는 인스턴스를 생성하지 않아도 언제든지 사용할 수 있다.)
- <% %> 스크립트 태그 : javaScript를 jsp 중간에 넣고 싶은 경우 태그에 삽입할 수 있다.
5. jsp, Sevlet 예제
5.1 form + post 예제(webapp/calc/input.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="/calc/calcResult" method="post">
<input type="number" name="num1">
<input type="number" name="num2">
<button type="submit">SEND</button>
</form>
</body>
</html>
- form의 submit을 보내면 input한 변수를 param 인스턴스에 담아서 action한 곳으로 보낸다.
- action한 곳에서 ${param.변수명}으로 값을 반환 받을 수 있다.
- ${} : EL(Expression Language) 구문입니다. JSP EL을 사용하여 웹 페이지에 동적 데이터를 삽입하고, 서버에서 받은 파라미터 값을 표시하는 데 사용됩니다.
5.2 EL 예제 (webapp/calc/calResult.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>NUM1 = ${param.num1}</h1>
<h1>NUM2 = ${param.num2}</h1>
<h1>SUM = ${param.num1 + param.num2}</h1>
<h1>SUM = ${param.num1} + ${param.num2}</h1>
</body>
</html>
5.3 Dispatcher예제 (java/org.zerock.w11/calc/InputController)
@WebServlet(name="inputController", urlPatterns = "/calc/input")
public class InputController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
RequestDispatcher dispatcher = req.getRequestDispatcher("/calc/input.jsp");
dispatcher.forward(req, resp);
}
}
- Dispatcher : 전달자
- jsp파일을 전달받아 브라우저 화면에 보여준다.
- urlPatterns에서의 경로는 웹브라우저에서의 경로이다. /calc/input을 경로로 해놓은 이유는 폴더의 경로를 이해하기 위해, 개발자의 편의를 위해서다. 실무에선 미리 정해놓은 규칙대로 url을 구성한다. 즉, 원하는 값을 넣어도 문제가 없다.
- RequestDispacher는 기본 폴더가 wepapp이다. 상대경로여서 헷갈릴 수 있는 부분이므로 잘 생각해서 작성하자.
5.4 getParameter예제
@WebServlet(name ="calcController", urlPatterns = "/calc/calcResult")
public class CalcController extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String num1 = req.getParameter("num1");
String num2 = req.getParameter("num2");
System.out.println(num1 + " " + num2);
System.out.printf("num1 :%s", num1);
System.out.printf("num2 :%s", num2);
// resp.sendRedirect("/index.jsp");
}
}
- getParameter로 post로 보낸 pram 인스턴스에 접근해 name값을 key값으로 value값을 반환 받을 수 있다.