포스코DX X 비트교육센터 6기 - Servlet


웹 페이지

사용자 요청에 웹서버를 통해 HTML페이지를 렌더링해서 클라이언트의 브라우저에 띄운다.

proxy (대행)

클라이언트 대신에 타 서버에 접근한다. (보안을 위하여)

우리는

WAS(웹 서버)가 돌리는 servlet JSP를 개발하는 것이다.

정적웹 VS 동적웹

image

image

  • 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

  • image

  • 서버 실행

  • http://localhost:8080/helloweb/hello.html 에서 확인하기

  • jsp 추가하면! 에러 발생!! 에러 해결하는 방법-»>

image

image

  • index.jsp 내용 다 지웠다가 저장하고 다시 쓰기! 그럼 에러 해결

image

image

web.xml

image

  • 보면, index.jsp

이다보니, http://localhost:8080/helloweb/ 라고 해도, index파일이 뜸.

이미지는 어디에?

image

서블릿 실습

  • package 만들기

  • servlet 파일 추가하기

image

image

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);
	}

}

image

  • 설명

  • image

  <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 파일을 열어서 브라우저에서 확인이 가능한 것이다!!


이론수업

image

  • 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);
	}

}

image

  • 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>

image

//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);
	}

}

image


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">

image

image

// 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 응답