GET 요청
무엇을 달라고 하는 요청에는 옵션이 있을 수 있다.
여기서 옵션을 QueryString이라고 하는데 http://localhost:8000/hi?cnt에서 ""이거나 null 값이면
기본값 cnt=1을, cnt=숫자이면 숫자만큼의 cnt 값을 가지게 된다.
package com.jsp.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 어노테이션을 이용한 URL 매핑
@WebServlet("/hi")
public class Nana extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
// getParameter) 사용자가 전달할 때 쿼리 값을 심어서 전달하는데 이 쿼리의 키워드를 읽는 것
// 요청할 때 값과 서버에서 읽을 때의 값과 같아야 함(cnt처럼)
String cnt_ = request.getParameter("cnt");
// 임시변수
int cnt=1;
if(cnt_ !=null && !cnt_.equals("")) {
cnt= Integer.parseInt(cnt_);
}
for(int i=0;i<cnt;i++) {
out.println((i+1)+" : 안녕, Hello! <br >");
}
}
}
사용자 입력을 통한 GET 요청
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<form action="hi">
<div>
<label>"안녕하세요"를 몇 번 듣고 싶으세요?</label>
</div>
<div>
<!--사용자의 입력 담당 -->
<input type="text" name="cnt">
<!-- 요청 전달을 담당 -->
<input type="submit" value="출력">
</div>
</form>
</div>
</body>
</html>
입력할 내용이 많은 경우에 사용하는 POST 요청
사용자로부터 여러가지 입력 값을 받을 때 한번에 GET 요청을 하지 못하고
처음에는 입력하기 위한 GET 요청을 하고나서 그 결과를 가지고 POST 한다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<div>
<form action="notice-reg" method="post">
<div>
<label>제목 : </label><input type="text" name="title">
</div>
<div>
<label>내용 : </label><textarea name="content"></textarea>
</div>
<div>
<input type="submit" value="등록">
</div>
</form>
</div>
</body>
</html>
method="post"를 이용해서 전달된 내용인 QueryString을 보이지 않게 할 수 있다.
package com.jsp.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// notice-reg에 있는 값을 받아서 처리할 수 있는 서블릿 코드
@WebServlet("/notice-reg")
public class NoticeReg extends HttpServlet{
public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html; charset=UTF-8");
request.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String title = request.getParameter("title");
String content = request.getParameter("content");
out.println(title);
out.println(content);
}
}
하지만 한글을 입력해서 출력하면 멀티 바이트 문자 전송 문제로 한글이 깨지는 문제가 발생한다.
이를 해결하는 방법이 1) request.setCharacterEncoding("UTF-8");을 사용하는 것과
2) 톰캣 서버 설정 바꾸기가 있는데 톰캣 서버 설정 바꾸는 것은 나의 설정을 바꾸기 위해 다른 사람의 설정에
영향을 끼치게 되는 것이기 때문에 별로 좋지 못한 방법이다. 따라서 1번 방법을 사용하는 것이 낫다.
필터
하지만 한글을 읽어들이는 일이 많은데 모든 서블릿마다 1번 방법을 사용하기엔 비효율적이다.
그래서 서블릿이 실행하기 전과 후로 서블릿 필터를 만들어 사용한다.
NoticeReg 클래스에서 request.setCharacterEncoding("UTF-8");을 주석 처리하고
필터 클래스를 이용해보자. 서블릿 필터 클래스는 아래와 같다.
package com.jsp.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
// 요청이 오면 흐름을 그냥 넘겨서 다음 필터 또는 서블릿을 실행되게 함
chain.doFilter(request,response);
}
}
필터를 설정하는 방법에는 1) web.xml에 코드를 추가해주는 것과 2) 어노테이션을 사용하는 것이 있다.
1) web.xml에 코드 추가
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>com.jsp.web.filter.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<!--모든 url에 대해서 필터가 적용되길 원함(앞으로 어떤 요청이 와도 무조건 동작되게 하겠다) -->
<url-pattern>/*</url-pattern>
</filter-mapping>
2) 어노테이션 사용
package com.jsp.web.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 요청이 오면 before~을 콘솔에 출력 다음 서블릿 또는 필터를 실행 후 결과가 오고 after~를 출력
// System.out.println("before filter");
request.setCharacterEncoding("UTF-8");
// 요청이 오면 흐름을 그냥 넘겨서 다음 필터 또는 서블릿을 실행되게 함
chain.doFilter(request,response);
// System.out.println("after filter");
}
}
'강의 정리하기 > JSP와 Servlet' 카테고리의 다른 글
상태 유지를 위한 방법 (0) | 2023.03.27 |
---|---|
예제 (0) | 2023.03.27 |
URL 매핑 및 인코딩 (0) | 2023.03.19 |
서블릿 프로그램 만들기 (0) | 2023.03.18 |
웹 서버 프로그램 및 톰캣 설치(+Context) (0) | 2023.03.17 |