back-end&DB/Java
Servlet URL
Hoon0211
2023. 6. 13. 12:41
728x90
1. URL Mapping(URL 맵핑)
web browser에서 Servlet을 동작시키기 위해 실제 Java 클래스의 이름 대신,
Servlet을 요청하기 위한 문자열을 Servlet클래스와 Mapping(맵핑)시키는 것.
사용하는 이유
- URL경로가 길고 불편
- URL 경로가 노출 되어 보안상의 문제가 생김
- 실제 서블릿 클래스를 공개하지 않기 위함
- URL 맵핑은 같은 project안에서 중복 불가

2. URL Pattern


- request 함수
System.out.println("requestURL : " + request.getRequestURL());
System.out.println("requestURI : " + request.getRequestURI());
System.out.println("ServletPath : " + request.getServletPath());
System.out.println("ContextPath : " + request.getContextPath());

URL | 네트워크상에서 자원의 위치(웹사이트 주소 + 자원의 경로) |
URI | 자원의 위치 |
ServletPath | url mapping값 |
Contextpath | 서버가 해당 프로젝트를 찾아가는 이름 |
↳ 변경방법 1 | 프로젝트 proerties > web project setting |
↳ 변경방법 2 | servers 폴더 server.xml > 맽밑 context 태그의 path 부분을 변경 |
3. 데이터 전송
데이터 전송 태그 : form태그
- action : 데이터를 어디로 보낼지
- servlet으로 보낼 url mapping값 작성
- name : 보내는 데이터의 이름
- submit : 데이터를 보내는 시점
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="Ex04_get">
DATA : <input type="text" name="data">
<input type="submit">
</form>
</body>
</html>
ex04_send.html 에서 보낸 데이터를 받을 페이지
- action에 주소 페이지
- request객체 : 요청과 관련된 정보를 가진 객체
- action에 작성한 주소를 요청하는 것과 같음
- html에서 보낸 데이터를 받으려면 request객체에서 꺼내야함!
- request.getParameter("html에서 작성한 name 값")
package Servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Ex04_get")
public class Ex04_get extends HttpServlet {
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String getData = request.getParameter("data");
System.out.println(getData);
}
}

오류 1. 404 not found
html에서 요청한 주소와 실제 데이터를 받을 주소가 같은지 확인
form 태그의 action값 = servlet의 url mapping 값
오류 2. 데이터가 null
html에서 보낸 데이터 이름과 받을 때 이름과 받을 때 데이터 이름이 같은지 확인
from 태그의 name값 = getParameter 메소드의 name값
4. 실습
- 두수의 사칙연산을 구하는 페이지를 만드세요!
//Servlet
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
int num3 = Integer.parseInt(request.getParameter("calculation"));
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter( );
if (num3 == 1) {
out.print(num1 +"과 "+ num2 +"의 합은 " + (num1 + num2) + "입니다.");
} else if (num3 == 2) {
out.print(num1 +"과 "+ num2 +"의 빼기은 " + (num1 - num2) + "입니다.");
} else if (num3 == 3) {
out.print(num1 +"과 "+ num2 +"의 곱셈은 " + (num1 * num2) + "입니다.");
} else {
out.print(num1 +"과 "+ num2 +"의 나누기는 " + (num1 / num2) + "입니다.");
}
//html
<body>
<h1>두 수를 입력하세요 </h1>
<form action="Ex06_plus">
<input type="text" name="num1">
<select name="calculation">
<option value= 1>+</option>
<option value= 2>-</option>
<option value= 3>×</option>
<option value= 4>÷</option>
</select>
<input type="text" name="num2">
<input type="submit" value="연산">
</form>
</body>


- 정사각형 방을 만드세요.
// Servlet
int num = Integer.parseInt(request.getParameter("num"));
String color = request.getParameter("color");
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("<table border='1'style='background-color: " + color + ";' >");
int n = 0;
for (int i = 0; i < num; i++) {
out.print("<tr>");
for (int j = 0; j < num; j++) {
out.print("<td>" + (n + 1) + "</td>");
n++;
}
out.print("</tr>");
}
out.print("</table>");
//html
<h1> 정사각형 방 만들기 </h1>
<form action="Ex07_makeTavle">
방 개수 : <input type="text" name="num">
색깔 : <input type="color" name="color">
<input type="submit" value="전송">
</form>


728x90