포스코DX X 비트교육센터 6기 - Servlet
웹 페이지
사용자 요청에 웹서버를 통해 HTML페이지를 렌더링해서 클라이언트의 브라우저에 띄운다.
proxy (대행)
클라이언트 대신에 타 서버에 접근한다. (보안을 위하여)
우리는
WAS(웹 서버)가 돌리는 servlet JSP를 개발하는 것이다.
- url과 class 파일 정보를 담아두는 것이 web.xml이다.
=> url을 보고 나서 url과 관련한 class 파일에 new를 통해 실행시킨다.
실습
[Eclipse]
오른쪽마우스 - > Java EE Tools -> Generate… -> webapp > WEB-INF > web.xml로 web.xml이 생성된다.
helloweb /pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.poscodx</groupId>
<artifactId>servlet-practices</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>helloweb</artifactId>
<packaging>war</packaging>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.build.outputEncoding>UTF-8</project.build.outputEncoding>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>
<build>
<finalName>helloweb</finalName>
</build>
</project>
-
pom.xml이 바뀌면, maven update 해주기 (오른쪽마우스)
-
서버에서 add and remove
-
-
서버 실행
-
http://localhost:8080/helloweb/hello.html에서 확인하기 -
jsp 추가하면! 에러 발생!! 에러 해결하는 방법-»>
- index.jsp 내용 다 지웠다가 저장하고 다시 쓰기! 그럼 에러 해결
web.xml
- 보면,
index.jsp
이다보니, http://localhost:8080/helloweb/ 라고 해도, index파일이 뜸.
이미지는 어디에?
서블릿 실습
-
package 만들기
-
servlet 파일 추가하기
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet 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");
PrintWriter pw= response.getWriter();
pw.print("<h1>Hello World</h1>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
-
설명
-
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>servlets.HelloServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
여기서 url과 class를 web.xml에 담고 있다.
이 내용을 통해서 url 패턴을 먼저 확인하고, class 파일을 확인해서 servelt 파일을 열어서 브라우저에서 확인이 가능한 것이다!!
이론수업
- Jenkins가 이 과정을 자동화해준다.
: load하고 web.xml copy하고 컴파일한 파일들을 만드는 일…
톰켓에 뿌리는 일. (압축을 푸는 일.)
- jenkins가 적당한 플러그인으로 WAR를 쏴줌.
HelloServlet 의 코드의 실행과정.
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet 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");
PrintWriter pw= response.getWriter();
pw.print("<h1>Hello World</h1>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- doGet에서 이렇게 반대로 적으면 글씨가 깨짐.
PrintWriter pw= response.getWriter();
response.setContentType("text/html; charset=utf-8");
header와 body 사이의 /n개행이 필요하기 때문이다.
데이터를 보내는 방법 (GET)
GET /board?p=10&kwd=바보
//index.jsp
<a href = " /board?p=10&kwd=바보 " > 누르세요 </a>
//index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello World</h1>
<a href=" /helloweb/hello?name=yewon"> 누르세요 </a>
</body>
</html>
package servlets;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloServlet 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");
PrintWriter pw = response.getWriter();
String name = request.getParameter("name");
pw.print("<h1>Hello" + name + "</h1>");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
tags
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>Hello World</h1>
<h2>Hello World</h2>
<h3>Hello World</h3>
<h4>Hello World</h4>
<h5>Hello World</h5>
<h6>Hello World</h6>
<table border="1" cellspacing="0" cellpadding="20">
<tr>
<th>글번호</th>
<th>글제목</th>
<th>작성자</th>
</tr>
<tr>
<td>1</td>
<td>이양</td>
<td>에옹</td>
</tr>
<tr>
<td>2</td>
<td>얏호</td>
<td>에지</td>
</tr>
</table>
<!-- 절대경로 -->
<img src="/helloweb/assets/images/tongi.png" style="width: 100px" />
<!-- 상대경로 -->
<img src="./assets/images/tongi.png" />
<!-- 외부리소스 -->
<img src="https://avatars.githubusercontent.com/u/104685282?s=64&v=4" />
<p>
문장이올시다 <br> 문장2올시다 문장3올시다
</p>
<a href="/helloweb/hello?name=dooly"> hello로 가기</a>
<br>
<!-- 404에러 : 이동할 page가 없다 -->
<a href="form.jsp"> form으로 가기</a>
</body>
</html>
form.jsp = form태그의 post 공부하기
<form action="/helloweb/join.jsp" method="post">
// form.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- method를 작성하지 않으면, Get방식으로 넘어감. -->
<form action="/helloweb/join.jsp" method="post">
<label>이메일:</label> <input type="text" name="email" value="">
<br> <br> <label>비밀번호:</label> <input type="password"
name="password" value=""> <br> <br> <label>생년:</label>
<select name="birthYear">
<option value="2000">2000년</option>
<option value="1999">1999년</option>
<option value="1998">1998년</option>
<option value="1997">1997년</option>
</select> <br>
<br> <label>성별:</label> 남<input type="radio" name="gender"
value="male" checked="checked"> 여<input type="radio"
name="gender" value="female"> <br>
<br> <label>자기소개</label> <br>
<textarea name="description"></textarea>
<br>
<br> <label>취미</label> <br> 코딩: <input type="checkbox"
name="hobby" value="coding"> 술먹기: <input type="checkbox"
name="hobby" value="drinking"> 요리: <input type="checkbox"
name="hobby" value="cooking"> 수영: <input type="checkbox"
name="hobby" value="swimming"> <br>
<br> <input type="submit" value="가입">
</form>
</body>
</html>
//join.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
request.setCharacterEncoding("utf-8");
String email = request.getParameter("email");
String password = request.getParameter("password");
String birthYear = request.getParameter("birthYear");
String gender = request.getParameter("gender");
String description = request.getParameter("description");
String[] hobbies = request.getParameterValues("hobby");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>
<%=email%>
</h1>
<h2>
<%=password%>
</h2>
<h2>
<%=birthYear%>
</h2>
<h2>
<%=gender%>
</h2>
<p>
<%=description.replaceAll("\n", "<br>")%>
</p>
<p>
<%
for (String hobby : hobbies) {
%>
<strong><%= hobby %></strong><br>
<%
}
%>
</p>
</body>
</html>
이론 설명
- model1. JSP만
요청을 jsp가 받아서 요청에 대해 뭔지 살펴봄.
- model2. MVC(JSP(뷰) + servlet(컨트롤러))
****응답에는 2가지가 있다.
- redirect 응답
- html 응답