Servlet์ ๊ฐ๋ ๊ณผ ๋์ ๊ณผ์ ์ ์ดํดํ๋ค.
Goal
Web Service์ ๊ธฐ๋ณธ์ ์ธ ๋์ ๊ณผ์ ์ ์ดํดํ๋ค.
์ฌ์ฉ์ ์
๋ ฅ์ ์ํ HTML Form์ ์ดํดํ๋ค.
Servlet์ ์ดํดํ๋ค.
Web Service์ ๊ธฐ๋ณธ์ ์ธ ๋์ ๊ณผ์
HTML Form -> Servlet -> HTML Page
1. ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง form(HTML Form)์ ํตํด ์์ ์ ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ค. (Input)
2. Servlet์ doGet() ๋๋ doPost() ๋ฉ์๋๋ ์
๋ ฅํ form data์ ๋ง๊ฒ DB ๋๋ ๋ค๋ฅธ ์์ค์์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๊ฒ์ํ๋ค.
3. ์ด ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์ฌ์ฉ์์ ์์ฒญ์ ๋ง๋ ์ ์ ํ ๋์ ์ปจํ
์ธ (HTML Page)๋ฅผ ๋ง๋ค์ด์ ์ ๊ณตํ๋ค. (Output)
HTML Form
input elements(Ex. ํ ์คํธ ์์)๊ฐ ํฌํจ๋ ์น ํ์ด์ง์ ํ ๋ถ๋ถ(section)
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ๋ณด(form contents)๋ฅผ ์น ์๋ฒ๋ก ์ ์กํ๊ธฐ ์ํ submit element(Ex. ๋ฒํผ)๊ฐ ์กด์ฌํ๋ค.
action์๋ form์ ์ฒ๋ฆฌํ๋ ์๋ฒ ์ชฝ URL์ ๋ช ์ํ๋ค.
ํด๋ผ์ด์ธํธ(browser)๊ฐ ์์ฒญํ๋ URL ์ ๋ณด
์์ฒญ์ ๋ณด๋ผ ์๋ฒ์ IP ์ฃผ์ : Port ๋ฒํธ / App ์ด๋ฆ / ๋ฌ๋ผ๊ณ ์์ฒญํ๋ HTML
Ex) localhost:8080/FormHandlingServlet/LoginForm.html
IP ์ฃผ์
์์ฒญ์ ๋ณด๋ผ ์๋ฒ์ “์์น”๋ฅผ ์๋ฏธํ๋ค.
browser์ WAS(Tomcat)๊ฐ ๊ฐ์ PC์ ์์ผ๋ฉด “IP ์ฃผ์ = localhost”
Port ๋ฒํธ
ํด๋น ์์น ์์ “ํน์ ์ฌ๋”์ ์๋ฏธํ๋ค.
HTML ์ด๋ฆ
HTML ์ด๋ฆ์ ํด๋นํ๋ HTML ๋ฌธ์๋ฅผ ๋ฐ์์จ๋ค.
browser๋ ๋ฐ์์จ HTML ๋ฌธ์ ์์ html ํ๊ทธ๋ค(Ex. h2, br ๋ฑ)์ parsing(๊ธฐ๊ณ์ด๋ก ๋ฒ์ญ)ํ๋ค.
๋ง์ง๋ง์ผ๋ก ์ด ๋ด์ฉ์ browser์์ rendering(๊ทธ๋ฆฌ๊ธฐ)ํ๋ค.
LoginForm.html ๋ด์ฉ (๊ฐ๋จํ ์์)
Username:
Password:
<form name="loginForm" method="post" action="loginServlet">
Username: <input type="text" name="username"/> <br/>
Password: <input type="password" name="password"/> <br/>
<input type="submit" value="Login" />
</form>
method=”post”
์ํ๋ ๋์์ ๋ฐ๋ผ HTTP ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
method=”get”
action=”loginServlet”
URL of the servlet
ํด๋น URL๋ก request๊ฐ ๊ฐ๋ค. ์ฆ, WAS์์์ ์ด๋ค Servlet์ธ์ง ์ง์ ํ๋ ๊ฒ
type=”submit”
๋ฒํผ์ ๋๋ฅด๋ฉด ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ธ์๋ค์ด Servlet์ผ๋ก ๋์ด๊ฐ๋ค.
Form Tag ์์ฑ
Form Tag ์์ฑ์ ์ด์ฉํ์ฌ ์ด๋๋ก, ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ์กํ ์ง ์ ํ๋ค.
action : form์ ์ ์กํ ์๋ฒ ์ชฝ ์คํฌ๋ฆฝํธ ํ์ผ ์ง์
name : form์ ์๋ณํ๊ธฐ ์ํ ์ด๋ฆ ์ง์
accept-charset : form ์ ์ก์ ์ฌ์ฉํ ๋ฌธ์ ์ธ์ฝ๋ฉ์ ์ง์
target : action์์ ์ง์ ํ ์คํฌ๋ฆฝํธ ํ์ผ์ ํ์ฌ ์ฐฝ์ด ์๋ ๋ค๋ฅธ ์์น์์ ์ด๋ฆฌ๋๋ก ์ง์
method : form์ ์๋ฒ์ ์ ์กํ๋ ๋ฐฉ์์ผ๋ก, HTTP ๋ฉ์๋ ์ง์ (GET ๋๋ POST)
์๋ ์ถ๊ฐ ์ค๋ช
enctype : ๋๊ธฐ๋ Content์ Type ์ง์ (์ฃผ๋ก ํ์ผ์ ๋๊ธธ ๋ ์ฌ์ฉ)
type์ multipart/form-data ๋ก ์ง์ ํด์ ์ฌ์ฉ
Form Methods
form์ ์๋ฒ์ ์ ์กํ๋ ๋ฐฉ์์ผ๋ก, ๋ ๊ฐ์ง HTTP ๋ฉ์๋ ์ง์ ํ ์ ์๋ค.
GET Method
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ด์ฉ(form data)์ด URL ๋ค์ ํ
์คํธ ๋ฌธ์์ด๋ก ์ถ๊ฐ๋๋ค.
ํฌ๊ธฐ ์ ํ: 1024 characters
data๋ ?๋ฅผ ๊ธฐ์ค์ผ๋ก action URL๊ณผ ๋ถ๋ฆฌ๋๋ค.
Ex. http://www.test.com/hello?key1=value1&key2=value2
๋ธ๋ผ์ฐ์ ์์ ์น ์๋ฒ๋ก ์ ๋ณด๋ฅผ ์ ๋ฌํ๋ ๊ธฐ๋ณธ ๋ฉ์๋(Default Method)
HTTP ๋ฉ์๋๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด GET Method๋ฅผ ํธ์ถํ๋ค.
์๋ฒ์ ์ ๋ฌํ๋ data์ ์ํธ์ ๊ฐ์ ๋ฏผ๊ฐํ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ๋ GET Method๋ฅผ ์ฌ์ฉํ์ง ์๋๋ค.
URL์ ๋ชจ๋์๊ฒ ๋
ธ์ถ๋๋ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ๋ณด์์ ์ ์ ํ์ง ์๋ค.
GET ๋ฉ์๋์ ์ฌ์ฉ
Query-Type actions: DB์ ์ํฅ์ ์ฃผ์ง ์๋ ๋จ์ํ ์ฝ๊ธฐ ์์ฃผ(read operation)์ ์์
Idempotemt actions: ๋ช ๋ฒ์ด๊ณ ๊ฐ์ ์ฐ์ฐ์ ๋ฐ๋ณตํด๋ ๊ฐ์ ๊ฐ์ด ๋์ค๋ ์์
POST Method
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๋ด์ฉ(form data)์ ๋ณ๋์ ๋ฉ์์ง๋ก ๋ณด๋ธ๋ค.
Request Body์ data๋ฅผ ์ถ๊ฐํ๋ค.
URL์ ์ง์ ์ ์ผ๋ก data๊ฐ ๋
ธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ GET Method๋ณด๋ค ๋ณด์์์ผ๋ก ์กฐ๊ธ ๋ ์์ ํ๋ค.
POST ๋ฉ์๋์ ์ฌ์ฉ
actions with side-effects: DB์ ์ํฅ์ ์ฃผ๋ ์์
2. Servlet์ด๋
Servlet์ ๊ฐ๋
์น ๊ธฐ๋ฐ์ ์์ฒญ์ ๋ํ ๋์ ์ธ ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ํ๋์ ํด๋์ค์ด๋ค.
Server Side์์ ๋์๊ฐ๋ Java Program
๊ฐ๋ฐ์๊ฐ ์์ฑํด์ผ ํ๋ ๋ถ๋ถ
Servlet Program์ ๊ธฐ๋ณธ์ ์ธ ๋์ ๊ณผ์
Web Server๋ HTTP request๋ฅผ Web Container(Servlet Container)์๊ฒ ์์ํ๋ค.
1) web.xml ์ค์ ์์ ์ด๋ค URL๊ณผ ๋งคํ๋์ด ์๋์ง ํ์ธ
2) ํด๋ผ์ด์ธํธ(browser)์ ์์ฒญ URL์ ๋ณด๊ณ ์ ์ ํ Servlet์ ์คํ
https://gmlwjd9405.github.io/2018/10/29/web-application-structure.html ์ฐธ๊ณ
Web Container๋ service() ๋ฉ์๋๋ฅผ ํธ์ถํ๊ธฐ ์ ์ Servlet ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฐ๋ค.
1) Web Container๋ ์ ์ ํ Servlet ํ์ผ์ ์ปดํ์ผ(.class ํ์ผ ์์ฑ)ํ๋ค.
2) .class ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค Servlet ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
3) ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ๋ Servlet ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๋ init() ๋ฉ์๋๊ฐ ์คํ๋๋ค.
Web Container๋ Request๊ฐ ์ฌ ๋๋ง๋ค thread๋ฅผ ์์ฑํ์ฌ ์ฒ๋ฆฌํ๋ค.
๊ฐ thread๋ Servlet์ ๋จ์ผ ๊ฐ์ฒด์ ๋ํ service() ๋ฉ์๋๋ฅผ ์คํํ๋ค.
์ฐธ๊ณ Servlet Program์์ Thread์ ์ญํ
Thread๋? ์ด์์ฒด์ ๋ก๋ถํฐ ์์คํ
์์์ ํ ๋น๋ฐ๋ ์์
์ ๋จ์
https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html ์ฐธ๊ณ
Servlet Program์์ thread๊ฐ ์ํํ ๋ฉ์๋๊ฐ ์ง์ /ํ ๋น๋๋ฉด
thread๋ ์์ฑ ํ ์ฆ์ ํด๋น ๋ฉ์๋๋ง ์ด์ฌํ ์ํํ๋ค.
ํด๋น ๋ฉ์๋๊ฐ returnํ๋ฉด thread๋ ์ข
๋ฃ๋๊ณ ์ ๊ฑฐ๋๋ค.
์ฆ, ์ค์ ๋ก thread์ ์ญํ : Servlet์ doGet() ๋๋ doPost()๋ฅผ ํธ์ถํ๋ ๊ฒ์ด๋ค.
Web Container(Servlet Container)๋ thread์ ์์ฑ๊ณผ ์ ๊ฑฐ๋ฅผ ๋ด๋นํ๋ค.
ํ์ง๋ง thread์ ์์ฑ๊ณผ ์ ๊ฑฐ์ ๋ฐ๋ณต์ ํฐ ์ค๋ฒํค๋๋ฅผ ๋ง๋ ๋ค.
์ด๋ฅผ ์ํด Tomcat(WAS)์ “Thread Pool”(๋ฏธ๋ฆฌ thread๋ฅผ ๋ง๋ค์ด ๋์) ์ด๋ผ๋ ์ ์ ํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์ค๋ฒํค๋๋ฅผ ์ค์ธ๋ค.
์ฆ, WAS๋ Servlet์ life cycle์ ๋ด๋นํ๋ค.
์น ๋ธ๋ผ์ฐ์ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์์ ๋ Servlet ๊ฐ์ฒด ์์ฑ์ WAS๊ฐ ์์์ ์ฒ๋ฆฌํ๋ค.
WAS ์์์ Servlet์ด ๋์๋ค๋๊ณ ๊ฐ๋ฐ์๋ ์ด Servlet์ ๋ง๋ค์ด์ผ ํ๋ค.
Servlet Life Cycle
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ค๋ฉด WAS๋ ํด๋น ์์ฒญ์ ๋ง๋ Servlet์ด ๋ฉ๋ชจ๋ฆฌ์ ์๋์ง ํ์ธํ๋ค.
๋ง์ฝ ๋ฉ๋ชจ๋ฆฌ์ ์๋ค๋ฉด ํด๋น Servlet Class๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆฐ ํ(Servlet ๊ฐ์ฒด ์์ฑ) init ๋ฉ์๋ ์คํ
์ดํ service ๋ฉ์๋๋ฅผ ์คํ
๋ฉ๋ชจ๋ฆฌ์ ์๋ค๋ฉด ๋ฐ๋ก service ๋ฉ์๋ ์คํ
if (๋ฉ๋ชจ๋ฆฌ์ ์์) {
// ํด๋น ์๋ธ๋ฆฟ ํด๋์ค๋ฅผ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ฆผ
// init() ๋ฉ์๋๋ฅผ ์คํ
}
// service()๋ฉ์๋๋ฅผ ์คํ
init()
ํ ๋ฒ๋ง ์ํ๋๋ค.
ํด๋ผ์ด์ธํธ(browser)์ ์์ฒญ์ ๋ฐ๋ผ ์ ์ ํ Servlet์ด ์์ฑ๋๊ณ ์ด Servlet์ด ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋ ๋ init() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
์ญํ : Servlet ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํ
service(request, response)
์๋ต์ ๋ํ ๋ชจ๋ ๋ด์ฉ์ service() ๋ฉ์๋์ ๊ตฌํํด์ผ ํ๋ค.
Servlet์ด ์์ ํ ๋ชจ๋ request์ ๋ํด service() ๋ฉ์๋๊ฐ ํธ์ถ๋๋ค.
HttpServlet์ ์์๋ฐ์ Servlet ํด๋์ค(์ดํ ํ์ ํด๋์ค)์์ service() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํ์ง ์์๋ค๋ฉด, ๊ทธ ๋ถ๋ชจ์ธ HttpServlet์ service()๊ฐ ํธ์ถ๋๋ค.
HttpServlet์ service() ๋ฉ์๋๋ ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด์ผ๋ก ๊ตฌํ๋์ด ์๋ค.
service() ๋ฉ์๋๋ request์ type(HTTP Method: GET, POST, PUT, DELETE ๋ฑ)์ ๋ฐ๋ผ ์ ์ ํ ๋ฉ์๋(doGet, doPost, doPut, doDelete ๋ฑ)๋ฅผ ํธ์ถํ๋ค.
์ฆ, ํ์ ํด๋์ค์์ doGet, doPost ๋ฑ์ ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ํด๋๋ฉด HttpServlet์ service() ๋ฉ์๋๊ฐ ์์ฒญ์ ๋ง๋ ๋ฉ์๋(ํ์ ํด๋์ค์์ ์ค๋ฒ๋ผ์ด๋ํ ๋ฉ์๋)๋ฅผ ์์์ ํธ์ถํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
๋ฉ์๋๊ฐ returnํ๋ฉด ํด๋น thread๋ ์ ๊ฑฐ๋๋ค.
destroy()
ํ ๋ฒ๋ง ์ํ๋๋ค.
Web Application์ด ๊ฐฑ์ ๋๊ฑฐ๋ WAS๊ฐ ์ข
๋ฃ๋ ๋ ํธ์ถ๋๋ค.
์ญํ : Servlet ๊ฐ์ฒด๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ๊ฑฐ
Servlet์ ๋ฉ์๋ ๊ตฌํ (๊ฐ๋จํ ์์)
// `javax.servlet.http.HttpServlet`๋ฅผ ์์๋ฐ์ Servlet ํด๋์ค
public class LoginServlet extends HttpServlet {
// doPost()๋ฅผ ์ฌ์ ์
protected void doPost(HttpServletRequest request, HttpServletResponse response throws ServletException, IOException {
// read form fields
String username = request.getParameter("username");
String password = request.getParameter("password");
// get response writer
PrintWriter writer = response.getWriter();
/* ์ฌ๊ธฐ์ -> DB ์ ๊ทผ ๋ฑ Business Logic ๋ถ๋ถ์ ์ฒ๋ฆฌ */
// build HTML code (view ์์ฑ ๋ถ๋ถ)
String htmlResponse = "<html>";
htmlResponse += "<h2>Your username is: " + username + "<br/>";
htmlResponse += "Your password is: " + password + "</h2>";
htmlResponse += "</html>";
// return response
writer.println(htmlResponse);
}
}
// javax.servlet.http.HttpServlet๋ฅผ ์์๋ฐ์ Servlet ํด๋์ค
public class LoginServlet extends HttpServlet {
// doPost()๋ฅผ ์ฌ์ ์
protected void doPost(HttpServletRequest request, HttpServletResponse response throws ServletException, IOException {
// read form fields
String username = request.getParameter("username");
String password = request.getParameter("password");
// get response writer PrintWriter writer = response.getWriter(); /* ์ฌ๊ธฐ์ -> DB ์ ๊ทผ ๋ฑ Business Logic ๋ถ๋ถ์ ์ฒ๋ฆฌ */ // build HTML code (view ์์ฑ ๋ถ๋ถ) String htmlResponse = "<html>"; htmlResponse += "<h2>Your username is: " + username + "<br/>"; htmlResponse += "Your password is: " + password + "</h2>"; htmlResponse += "</html>"; // return response writer.println(htmlResponse); }
}
WAS๋ ์น ๋ธ๋ผ์ฐ์ ๋ก๋ถํฐ ์์ฒญ์ ๋ฐ์ผ๋ฉด
์์ฒญํ ๋ ๊ฐ์ง๊ณ ์๋ ์ ๋ณด๋ฅผ HttpServletRequest๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ ์ฅํ๋ค.
์น ๋ธ๋ผ์ฐ์ ์๊ฒ ์๋ต์ ๋ณด๋ผ ๋ ์ฌ์ฉํ๊ธฐ ์ํ์ฌ HttpServletResponse๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
์์ฑ๋ HttpServletRequest, HttpServletResponse ๊ฐ์ฒด๋ฅผ Servlet์๊ฒ ์ ๋ฌํ๋ค.
๊ฐ๋ฐ์๋ ์ผ๋ฐ์ ์ผ๋ก javax.servlet.http.HttpServlet๋ฅผ ์์๋ฐ์ Servlet ํด๋์ค๋ฅผ ์์ฑํ๋ค.
HttpServletRequest request ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ฌ์ฉ์๊ฐ ์
๋ ฅํ form data๋ฅผ ์ฝ๋๋ค.
HttpServletResponse response ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ถ๋ ฅ/๊ฒฐ๊ณผ Web Page๋ฅผ ์์ฑํ๋ค.
๊ฐ๋ฐ์๋ Servlet ํด๋์ค์ doGet() ๋๋ doPost() ์ค ์ ์ด๋ ํ๋๋ฅผ ์ฌ์ ์ํ์ฌ ์์ฑํ๋ค.
protected doGet()(HttpServletRequest request, HttpServletResponse response){}
protected doPost()(HttpServletRequest request, HttpServletResponse response){}
HttpServletRequest request ๊ฐ์ฒด
์ฌ์ฉ์๊ฐ HTML Form์ ์
๋ ฅํ ๋ด์ฉ(username๊ณผ password)์ request ๊ฐ์ฒด์์ ๋ฐ์์จ๋ค.
์ฆ, HTTP ํ๋กํ ์ฝ์ Request ์ ๋ณด๋ฅผ Servlet์๊ฒ ์ ๋ฌ
ํค๋ ์ ๋ณด, ํ๋ผ๋ฏธํฐ, ์ฟ ํค, URI, URL, Body์ Stream ๋ฑ์ ์ฝ์ด ๋ค์ด๋ ๋ฉ์๋๊ฐ ์๋ค.
getHeader(“์ํ๋ ํค๋ ์ด๋ฆ”)
์ด ๋ฉ์๋๋ฅผ ํตํด ์ํ๋ ํค๋ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์๋ค.
getParameter()
์ด ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ form parameter ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
์ด๋ฐ parameter ๊ฐ์ URL ๋๋ form์ input tag๋ฅผ ํตํด์ ๋์ด์ฌ ์ ์๋ค.
Ex.
String name = request.getParameter("firstname");
int year = Integer.parseInt (request.getParameter("year"));
getParameterValues()
form parameter๊ฐ ๋ ๋ฒ ์ด์ ๋ํ๋๊ณ ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋ฐํํ ๋ ์ด ๋ฉ์๋๋ฅผ ํธ์ถํ๋ค. (Ex. checkbox)
Ex.
String languages[] = request.getParameterValues("language");
HttpServletResponse response ๊ฐ์ฒด
์ธ์์ ๋ด์ฉ์ ๋ง๊ฒ ๋์ ์ธ HTML ์ฝ๋๋ฅผ ์์ฑํ์ฌ response ๊ฐ์ฒด์ ๋ด์ ๋ฐํํ๋ค.
getWriter() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ PrintWriter ๊ฐ์ฒด์ ๊ฐ์ ธ์จ ํ ํด๋น ๊ฐ์ฒด์์ print, println ๋ฉ์๋๋ฅผ ์คํํ๋ค.
์ฆ, form data๋ฅผ ์ฒ๋ฆฌํ ๊ฒฐ๊ณผ๋ฅผ Web Page์ ์์ฑ(view ์์ฑ)ํ์ฌ ๋ฐํํ๋ค.
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<h2> Welcome </h2>");
'๐ ์๋ฐ ์๋ฒ ํ์ด์ง JSP > ๐ ์น \ ์๋ธ๋ฆฟ Web , Servlet' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Web - Servlet ์ค์ต 4 (form -> ์๋ฒ -> html ์ถ๋ ฅ) (0) | 2021.03.15 |
---|---|
Web - Servlet ์ค์ต 3 (์ํ์ฝ๋ , html ์ฝ๋๋ฅผ ๋ฐ์ ์๋ฒ์์ ํ์ธํ ์ถ๋ ฅ) (0) | 2021.03.14 |
Web - Servlet ์ค์ต 2 (ํด๋ผ์ด์ธํธ ๋ฐ์ดํฐ -> ์๋ฒ๋ก ๋๊ฒจ์ฃผ๊ธฐ) (0) | 2021.03.14 |
Web - Servlet ์ค์ต (0) | 2021.03.14 |
Web Server์ ๋ํด (0) | 2021.03.14 |
๋๊ธ