HttpServlet
service
get / post 상관없이 무조건 호출
doGet
get방식
doPost
post방식
init
생성자 비슷 : 1회만 호출
destory
파라메터 방식
http://localhost:8080/프로젝트명/서블릿명?커맨드=값1 => 뷰1
http://localhost:8080/프로젝트명/서블릿명?커맨드=값2 => 뷰2
URI방식
http://localhost:8080/프로젝트명/서블릿명/값1.do => 뷰1
http://localhost:8080/프로젝트명/서블릿명/값2.do => 뷰2
1.
http://localhost:8080/프로젝트명/controller?action=view1 View1Action view1.jsp
http://localhost:8080/프로젝트명/controller?action=view2 View2Action view2.jsp
Action
http://localhost:8080/프로젝트명/controller?action=form GugudanAction gugudan.jsp
http://localhost:8080/프로젝트명/controller?action=form_ok GugudanOKAction gugudan_ok.jsp
파일질라
GugudanEx02_1.7z - mvc
GugudanEx02_2.7z - source 전부
HttpServlet 상속
HttpServlet 을 상속받는 클래스는 doGet 과 doPost를 오버라이드 할 수 있다

클래스 생성시 Browse에서 HttpServlet 상속받기

<%@ 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>
<form action="./form_ok" method="get">
데이터1 <input type="text" name="data1" />
<input type="submit" value="전송" />
</form>
<form action="./form_ok" method="post">
데이터1 <input type="text" name="data1" />
<input type="submit" value="전송" />
</form>
</body>
</html>

form.jsp
위의 form은 get방식
아래의 form은 post방식이다
form클래스에서 실행
package servlet1;
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 ServletEx01 extends HttpServlet {
@Override
// service는 get post 방식 상관없이 무조건호출(많이쓰이지는 않음)
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
// 입력처리
req.setCharacterEncoding("utf-8");
String data1 = req.getParameter("data1");
// 출력처리
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
out.println("Hello Servlet : " + data1);
out.println("</body>");
out.println("</html>");
out.close();
}
}
ServletEx01.java
서블릿 클래스
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>ServletEx02</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>servlet1.ServletEx01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/form_ok</url-pattern>
</servlet-mapping>
</web-app>
web.xml


현재 서블릿클래스에서 호출하는 방식은 service방식이다
service방식은 get과 post를 상관하지않고 호출시킬수있지만
보안상의 이유로 많이 쓰이지는 않음
servlet클래스와 form클래스 web.xml을 연결할수 있다
1.web.xml에서 url 패턴을 원하는 경로로 지정
2. form클래스에서 action을 url패턴에서 지정해준 경로로 지정
package servlet1;
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 ServletEx02 extends HttpServlet {
// doget(get방식 호출 / ctrl + 엔터)
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
out.println("Hello Servlet : get 호출");
out.println("</body>");
out.println("</html>");
out.close();
}
// dopost(post방식 호출 / ctrl + 엔터)
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
out.println("Hello Servlet : post 호출");
out.println("</body>");
out.println("</html>");
out.close();
}
}
ServletEx02.java
서블릿클래스
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>ServletEx02</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>servlet1.ServletEx02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/form_ok</url-pattern>
</servlet-mapping>
</web-app>
web.xml


service 방식이 아닌 get방식과 post방식을 따로 만들어주어 실행 시킬수 있다
( doget / dopost 입력후 ctrl + enter 로 추가시키면 됨 )
package servlet1;
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 ServletEx03 extends HttpServlet {
//service가 아닌 get과post 통합호출
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
try {
req.setCharacterEncoding("utf-8");
String data1 = req.getParameter("data1");
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
out.println("Hello Servlet : 통합 호출 : " + data1);
out.println("</body>");
out.println("</html>");
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("[에러]" + e.getMessage());
}
}
}
ServletEx03.java
서블릿클래스
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>ServletEx02</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>servlet1</servlet-name>
<servlet-class>servlet1.ServletEx03</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>servlet1</servlet-name>
<url-pattern>/form_ok</url-pattern>
</servlet-mapping>
</web-app>
web.xml


통합요청방식
get방식과 post방식을로 소스코드를 2개를 작성할 필요없이
하나로 통합해 작성할 수 있음

package servlet;
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 Gugudan1 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
for(int i=1; i<=9; i++) {
out.println("1 * " + i + " = " + (1 * i) + "<br>");
}
out.println("</body>");
out.println("</html>");
out.close();
}
}
Gugudan1.java
서블릿클래스
package servlet;
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 Gugudan2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
for(int i=1; i<=9; i++) {
out.println("2 * " + i + " = " + (2 * i) + "<br>");
}
out.println("</body>");
out.println("</html>");
out.close();
}
}
Gugudan2.java
서블릿클래스
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>GugudanEx01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>gugudan1</servlet-name>
<servlet-class>servlet.Gugudan1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gugudan1</servlet-name>
<url-pattern>/gugudan/1dan</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>gugudan2</servlet-name>
<servlet-class>servlet.Gugudan2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gugudan2</servlet-name>
<url-pattern>/gugudan/2dan</url-pattern>
</servlet-mapping>
</web-app>
web.xml


구구단 form문 없이 서블릿클래스로 실행
(service방식)
package servlet;
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 Gugudan extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
resp.setContentType("text/html; charset=utf-8");
PrintWriter out = resp.getWriter();
String dansu = req.getRequestURI().replaceAll("/GugudanEx01/gugudan", "");
if(dansu.equals("/*") || dansu.equals("/1dan")) {
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
for(int i=1; i<=9; i++) {
out.println("1 * " + i + " = " + (1 * i) + "<br>");
}
out.println("</body>");
out.println("</html>");
} else if(dansu.equals("/2dan")){
out.println("<!DOCTYPE html>");
out.println("<html>");
out.println("<head>");
out.println("<meta charset='utf-8' />");
out.println("</head>");
out.println("<body>");
for(int i=1; i<=9; i++) {
out.println("2 * " + i + " = " + (2 * i) + "<br>");
}
out.println("</body>");
out.println("</html>");
}
}
}
Gugudan.java
서블릿클래스
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>GugudanEx01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>gugudan</servlet-name>
<servlet-class>servlet.Gugudan</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gugudan</servlet-name>
<url-pattern>/gugudan/*</url-pattern>
</servlet-mapping>
</web-app>
web.xml


클래스를 나누지 않고 한 클래스로 실행
package servlet2;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
// 한 페이지 내에서 구구단문출력
public class Gugudan extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
try {
req.setCharacterEncoding("utf-8");
String startdan = req.getParameter("startdan");
String enddan = req.getParameter("enddan");
resp.setContentType("text/html; charset=utf-8");
StringBuilder sbHtml = new StringBuilder();
sbHtml.append("<!DOCTYPE html>");
sbHtml.append("<html>");
sbHtml.append("<head>");
sbHtml.append("<meta charset='utf-8' />");
sbHtml.append("</head>");
sbHtml.append("<body>");
sbHtml.append("<form action='./gugudan.do' method='post' >");
sbHtml.append("시작단 <input type='text' name='startdan' />");
sbHtml.append(" ~ ");
sbHtml.append("끝단 <input type='text' name='enddan' />");
sbHtml.append("<input type='submit' value='구구단 출력' />");
sbHtml.append("</form>");
if(startdan != null && enddan != null) {
sbHtml.append("<br>결과 : <br>");
int iStartdan = Integer.parseInt(startdan);
int iEnddan = Integer.parseInt(enddan);
sbHtml.append("<table border='1' width='800'>");
for(int i=iStartdan; i<=iEnddan; i++) {
sbHtml.append("<tr>");
for(int j=1; j<=9; j++) {
sbHtml.append("<td>" + i + "X" + j + "=" + (i*j) + "</td>");
}
sbHtml.append("</tr>");
}
sbHtml.append("</table>");
}
sbHtml.append("</body>");
sbHtml.append("</html>");
PrintWriter out = resp.getWriter();
out.println(sbHtml.toString());
out.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
}
}
}
servlet2 패키지의 Gugudan.java
서블릿 클래스
통합호출시 doProcess의 throw구문을 삭제하고 내부에서 try catch를 잡아준다
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>GugudanEx01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>gugudan</servlet-name>
<servlet-class>servlet2.Gugudan</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>gugudan</servlet-name>
<url-pattern>/gugudan.do</url-pattern>
</servlet-mapping>
</web-app>
web.xml

데이터베이스를 연결해 servlet클래스로 우편번호 검색기 만들기
db연결시 필수사항
1. META-INF 폴더에 context.xml 집어넣기
2. lib폴더에 db연결 jar집어넣기

package model1;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;
public class ZipcodeDAO {
private DataSource dataSource;
public ZipcodeDAO() {
// TODO Auto-generated constructor stub
try {
Context initCtx = new InitialContext();
Context envCtx = (Context)initCtx.lookup("java:comp/env");
DataSource dataSource = (DataSource)envCtx.lookup("jdbc/mariadb2");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
}
}
public ArrayList<ZipcodeTO> listZipcode(String strDong){
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
ArrayList<ZipcodeTO> zipcodeLists = new ArrayList<>();
try {
conn = this.dataSource.getConnection();
String sql = "select zipcode, sido, gugun, dong, ri, bunji from zipcode where dong like ?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, strDong + "%");
rs = pstmt.executeQuery();
while(rs.next()) {
ZipcodeTO to = new ZipcodeTO();
to.setZipcode(rs.getString("zipcode"));
to.setSido(rs.getString("sido"));
to.setGugun(rs.getString("gugun"));
to.setDong(rs.getString("dong"));
to.setRi(rs.getString("ri"));
to.setBunji(rs.getString("bunji"));
zipcodeLists.add(to);
}
}catch(SQLException e) {
System.out.println("[에러] : " + e.getMessage());
}finally {
if(pstmt != null) try{pstmt.close();} catch(SQLException e){}
if(rs != null) try{rs.close();} catch(SQLException e){}
if(conn != null)try { conn.close();} catch(SQLException e){}
}
return zipcodeLists;
}
}
ZipcodeDAO
package model1;
public class ZipcodeTO {
private String zipcode;
private String sido;
private String gugun;
private String dong;
private String ri;
private String bunji;
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
public String getSido() {
return sido;
}
public void setSido(String sido) {
this.sido = sido;
}
public String getGugun() {
return gugun;
}
public void setGugun(String gugun) {
this.gugun = gugun;
}
public String getDong() {
return dong;
}
public void setDong(String dong) {
this.dong = dong;
}
public String getRi() {
return ri;
}
public void setRi(String ri) {
this.ri = ri;
}
public String getBunji() {
return bunji;
}
public void setBunji(String bunji) {
this.bunji = bunji;
}
}
ZipcodeTO
package servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model1.ZipcodeDAO;
import model1.ZipcodeTO;
public class servletEx01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
protected void doProcess(HttpServletRequest req, HttpServletResponse resp){
// TODO Auto-generated method stub
try {
req.setCharacterEncoding("utf-8");
String strDong = req.getParameter("dong");
resp.setContentType("text/html; charset=utf-8");
StringBuilder sbHtml = new StringBuilder();
sbHtml.append("<!DOCTYPE html>");
sbHtml.append("<html>");
sbHtml.append("<head>");
sbHtml.append("<meta charset='utf-8' />");
sbHtml.append("</head>");
sbHtml.append("<body>");
sbHtml.append("<form action='./zipcodesearch.do' method='post' >");
sbHtml.append("동이름 <input type='text' name='dong' />");
sbHtml.append("<input type='submit' value='우편번호 검색' />");
sbHtml.append("</form>");
if(strDong != null) {
sbHtml.append("<br>결과 : <br>");
ZipcodeDAO dao = new ZipcodeDAO();
ArrayList<ZipcodeTO> zipcodeLists = dao.listZipcode("도화");
sbHtml.append("데이터 갯수: " + zipcodeLists.size());
}
sbHtml.append("</body>");
sbHtml.append("</html>");
PrintWriter out = resp.getWriter();
out.println(sbHtml.toString());
out.close();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("[에러] : " + e.getMessage());
}
}
}
servletEx01.java

<?xml version="1.0" encoding="utf-8" ?>
<Context>
<Resource
name="jdbc/mariadb1"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mysql://localhost:3306/sample"
username = "root"
password = "!123456" />
<Resource
name="jdbc/mariadb2"
auth="Container"
type="javax.sql.DataSource"
driverClassName="org.mariadb.jdbc.Driver"
url="jdbc:mysql://localhost:3306/project"
username = "project"
password = "1234" />
</Context>
context.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
<display-name>ZipcodeSearchEx01</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.jsp</welcome-file>
<welcome-file>default.htm</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>zipcodeserch</servlet-name>
<servlet-class>servlet.servletEx01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>zipcodeserch</servlet-name>
<url-pattern>/zipcodeserch.do</url-pattern>
</servlet-mapping>
</web-app>
web.xml
어노테이션(Annotation) 기법
어노테이션이란 프로젝트 생성시 web.xml을 생성하는 체크박스

를 체크해 web.xml로 맵핑을 할 필요없이 서블릿 클래스안에서 맵핑을 할수 있는것을 말한다.

package servlet1;
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;
// 어노테이션 기법 = web.xml 에서 servlet 맵핑을 할 필요 없음
@WebServlet( { "/servlet/*" } ) // 요청 url / ({"/servlet1", "/servlet2"}) 도 가능
public class ServletEx01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) {
// TODO Auto-generated method stub
System.out.println("doProcess 호출");
}
}
ServletEx01.java
서블릿 클래스


@WebServlet 을 import시켜 ( { " " } ) 의 따옴표안에 web.xml에서 썼던 맵핑의 url패턴을 넣어주면
web.xml없이도 서블릿 실행가능
({"/servlet1", "/servlet2"}) 처럼 맵핑을 여러개 할 수있음
위의 어노테이션을 수기로 작성할수도 있지만 eclipse의 기능을통해
자동으로 @WebServlet 구문이 생성되는 클래스를 만들 수 있음.
1.

패키지 안에 클래스 생성시 Servlet이라는 클래스 생성
2.

Class name에 원하는이름 넣고 Next
3.

URL mappings안에있는 ServletEx03 클릭 후 Edit.. 클릭
4.

url 패턴 입력하기
5.

Constructors from superclass 체크 해제,
doGet, doPost 체크
package servlet2;
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;
/**
* Servlet implementation class ServletEx03
*/
@WebServlet("/servlet3/*")
public class ServletEx03 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.getWriter().append("Served at: ").append(request.getContextPath());
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
생성시 기본 디폴트값
(예시로 만든 클래스)
package servlet2;
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;
/**
* Servlet implementation class ServletEx02
*/
@WebServlet( urlPatterns = {"/servlet2/*"} )
public class ServletEx02 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println("123");
}
}
ServletEx02.java


doGet과 doPost를 통합하는 Process를 만든다
또한 doGet과 doPost에 doProcess(request, response); 코드를 넣어준다
디폴트값의 클래스에서 @WebServlet 은 하나의 맵핑만 할수있지만
ServletEx02 에서 @WebServlet( urlPatterns = { "/servlet2/*" } )
이코드로 작성하면 여러개의 맵핑을 할 수 있음.
ex) @WebServlet( urlPatterns = { "/servlet1/*", "/servlet2/*" } )
package servlet1;
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;
// init 과 loadOnStartup
@WebServlet( urlPatterns = { "/servlet1" }, loadOnStartup = 1 )
public class ServletEx01 extends HttpServlet {
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
System.out.println("init() 호출");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(req, resp);
}
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("doProcess() 호출");
}
}
init() / loadOnStartup
서블릿은 브라우저에서 최초요청시 init() 메서드를 실행한 후 메모리에 저장되어 기능을 수행한다.
서블릿은 init() 메서드를 이용해서 필요한 초기화 작업을 수행한다.
따라서 최초요청에 대해 실행시간이 길어질수 있는 단점이 있다
이 단점을 보완하기위해 생긴 기능이 loadOnStartup 기능이다.
init() = init() 메서드는 최초 요청시에만 호출하는 메서드이다, 필요한 초기화 작업 수행
loadOnStartup = 톰캣이 실행될때 같이실행되어 속도가 빨라짐
(지정한 숫자가 0보다 크면 톰켓 컨테이너가 실행되면서 서블릿 초기화
지정한 숫자는 우선순위, 작은숫자부터 먼저 초기화)


init()은 톰캣과 같이실행
새로고침을 해도 doProcess는 호출되지만 init()메서드는 호출x
모델 2 구조와 MVC 패턴


- 컨트롤러 = 서블릿
- 모델 = DAO, TO, 자바빈
- 뷰 = JSP
- 사용자 = 웹 브라우저, 휴대폰 등..

WEB-INF 폴더안에
views폴더를 만들고 view클래스를 집어넣는다
(WEB-INF 폴더는 보안구역/ 직접view클래스로 실행시 에러)
컨트롤러 클래스에서 경로를 직접 지정해주어야함
<%@ 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>
<form action="./controller" method="get">
데이터 <input type="text" name="data" />
<input type="submit" value="전송" />
</form>
<form action="./controller" method="post">
<input type="hidden" name="action" value="view1" />
데이터 <input type="text" name="data" />
<input type="submit" value="전송" />
</form>
</body>
</html>
form.jsp
package servlet;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model2.View1Action;
import model2.View2Action;
import model2.ViewAction;
/**
* Servlet implementation class ControllerEx01
*/
@WebServlet("/controller")
public class ControllerEx01 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
try {
request.setCharacterEncoding("utf-8");
String action = request.getParameter("action");
//System.out.println(action);
String url = "";
// 다형성(부모의 오버라이드)
ViewAction viewAction = null;
if( action == null || action.equals("") || action.equals("view1")) {
viewAction = new View1Action();
viewAction.execute(request, response);
url = "/WEB-INF/views/view1.jsp";
} else if(action.equals("view2")){
viewAction = new View2Action();
viewAction.execute(request, response);
url = "/WEB-INF/views/view2.jsp";
} else {
url = "/WEB-INF/views/error.jsp";
}
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ControllerEx01.java
컨트롤러
package model2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface ViewAction {
public abstract void execute(HttpServletRequest request, HttpServletResponse response);
}
ViewAction.java
모델

interface 클래스생성
package model2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class View1Action implements ViewAction {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println("View111Action 호출");
}
}
View1Action.java
모델
package model2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class View2Action implements ViewAction {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println("View222Action 호출");
}
}
View2Action.java
모델
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String data = (String)request.getAttribute("data");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
Hello view1.jsp : <%=data %>
</body>
</html>
view1.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>
Hello view2.jsp
</body>
</html>
view2.jsp
뷰



모델 클래스들이 상속받는 이유는
다형성(부모의 오버라이드) 과 execute가 아닌 다른 메서드로 호출할수 있기때문
model2 로 구구단출력

package servlet;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import model2.Action;
import model2.GugudanAction;
import model2.GugudanOKAction;
/**
* Servlet implementation class ControllerEx01
*/
@WebServlet("/controller")
public class ControllerEx01 extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(request, response);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doProcess(request, response);
}
protected void doProcess(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
try {
request.setCharacterEncoding("utf-8");
String action = request.getParameter("action");
String url = "";
Action gAction = null;
if(action == null || action.equals("") || action.equals("gugudan")) {
gAction = new GugudanAction();
gAction.execute(request, response);
url = "/WEB-INF/views/gugudan.jsp";
}else if(action.equals("gugudan_ok")){
gAction = new GugudanOKAction();
gAction.execute(request, response);
url = "/WEB-INF/views/gugudan_ok.jsp";
}else {
}
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ServletException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
ControllerEx01.java
컨트롤러
package model2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public abstract void execute(HttpServletRequest request, HttpServletResponse response);
}
Action.java
모델
interface클래스 생성
package model2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GugudanAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println("GugudanAction 호출");
}
}
GugudanAction.java
모델
package model2;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class GugudanOKAction implements Action {
@Override
public void execute(HttpServletRequest request, HttpServletResponse response) {
// TODO Auto-generated method stub
System.out.println("GugudanOKAction 호출");
// 받기 gugudan.jsp에서..
String startdan = request.getParameter("startdan");
String enddan = request.getParameter("enddan");
// 로직
// 넘기기 gugudan_ok로..
request.setAttribute("startdan", startdan);
request.setAttribute("enddan", enddan);
}
}
GugudanOKAction.java
모델
<%@ 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>
gugudan.jsp<br>
<form action="./controller" method="post">
<input type="hidden" name="action" value="gugudan_ok" />
시작단 <input type="text" name="startdan" />
~
끝단 <input type="text" name="enddan" />
<input type="submit" value="구구단 출력" />
</form>
</body>
</html>
gugudan.jsp
뷰
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
String startdan = (String)request.getAttribute("startdan");
String enddan = (String)request.getAttribute("enddan");
int iStartDan = Integer.parseInt(startdan);
int iEndDan = Integer.parseInt(enddan);
StringBuilder sbHtml = new StringBuilder();
sbHtml.append("<table border='1' width='800'>");
for(int i=iStartDan; i<=iEndDan; i++) {
sbHtml.append("<tr>");
for(int j=1; j<=9; j++) {
sbHtml.append("<td>" + i + "X" + j + "=" + (i*j) + "</td>");
}
sbHtml.append("</tr>");
}
sbHtml.append("</table>");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
gugudan_ok.jsp<br>
<%=sbHtml.toString() %>
</body>
</html>
gugudan_ok.jsp
뷰

