day 09
[JSP 방식]
a.jsp → b.jsp → c.jsp
↑↓
DB
각 페이지마다 필요시 자바코드가 작성되며, DB와 연결되는 코드도
JSP 파일 안에서 모두 작성된다. 분리되어 있지 않기 때문에
소규모 프로젝트에는 어울리는 방식이지만 가독성이 떨어지고 분업과
유지보수가 좋지 않으므로 규모가 커지면 불편해진다.
[Model1 방식]
a.jsp → b.jsp → c.jsp
↑↓
DAO, DTO
↑↓
DB
b.jsp에서 DAO의 메소드를 호출함으로써 자바코드가 섞이게 된다.
하지만 선언은 분리되어 JAVA 파일에 구현되어 있으므로 JSP 내의
JAVA 코드의 양이 굉장히 줄어듥데 된다. 하지만 페이지가 확장될 수록
유지보수가 상대적으로 좋지 않다.
[Model2 방식]
a.jsp → web.xml → Servlet(b.java)-Controller → c.jsp
↑↓
DAO, DTO
↑↓
DB
a.jsp에서 다음 페이지로 이동하기 전에 필요한 비즈니스 로직을
b.java 서블릿에 완벽히 분리하여 관리한다. 요청시 알맞은 서블릿으로
찾아가기 위해 web.xml을 참고하고 그 후 그곳에서 처리 완료된
결과를 들고 c.jsp로 이동하여 출력하는 형태이다.
• a.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>a</title>
</head>
<body>
<form action ="b">
숫자1<input type="text" name="num1"><br>
숫자2<input type="text" name="num2"><br>
<input type = "submit">
</form>
</body>
</html>
• WEB-INF → web.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>day09</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Test</servlet-name>
<!-- 어디로 보내줄지 servlet-class로 알려준다. -->
<servlet-class>com.koreait.servlet.B</servlet-class>
</servlet>
<servlet-mapping>
<!-- Test라는 서블릿 이름이 있으면 혹시 /b라는게 있으면 com.koreait.servlet.B 보내줘 -->
<servlet-name>Test</servlet-name>
<url-pattern>/b</url-pattern>
</servlet-mapping>
</web-app>
• com.koreait.servlet → servlet 생성(이름 : B)
package com.koreait.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;
public class B extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int num1 = Integer.parseInt(request.getParameter("num1"));
int num2 = Integer.parseInt(request.getParameter("num2"));
///DB처리///
///////////
int result = num1 + num2;
request.setAttribute("result", result);
// ↓ 이렇게 보내주면 날라가서 ${result}해도 나오지 않는다.
/* response.sendRedirect("c.jsp"); */
request.getRequestDispatcher("c.jsp").forward(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
• C.jsp 생성
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>C</title>
</head>
<body>
결과 : ${result}
</body>
</html>
*.do
a.jsp → web.xml → Servlet(FrontController)
↓
if, switch
↓
Controller(~~~Action)
• index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>index</title>
</head>
<body>
<h2>최종 예제 게시판</h2>
<a href="UserJoin.us">회원가임</a>
<a href="UserLogin.us">로그인 </a>
</body>
</html>
• web.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>board_mvc2</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>UserFrontController</servlet-name>
<!-- 밑에서 간 컨트롤러가 이 클래스를 뜻한다. -->
<servlet-class>com.koreait.app.user.UserFrontController</servlet-class>
</servlet>
<servlet-mapping>
<!-- User이라는 컨트롤러로 갈 것이고 -->
<servlet-name>UserFrontContrller</servlet-name>
<!-- 모든것의.us면 ↑ -->
<url-pattern>*.us</url-pattern>
</servlet-mapping>
</web-app>
• ActionTo
객체를 포장해주기 위한 역할
package com.koreait.action;
public class ActionTo {
private String path;
private boolean isRedirect;
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
}
• com.koreait.app.user → UserFrontCotroller.java
package com.koreait.app.user;
import java.io.IOException;
import java.lang.ProcessBuilder.Redirect;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.koreait.action.ActionTo;
public class UserFrontController extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 여기에 이걸 작성해주면 get으로 와도 doGet으로 날라오고
// doPost로 날라와도 doGet으로 날라간다.
doGet(req,resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 길나누는 코드
// request는 요청에 대한 정보를 가지고 있기 때문에
// getRequestURI를 사용해서 요청한 URI를 알 수 있다.
String requestURI = req.getRequestURI(); // /board_MVC2/UserJoin.us
String contextPath = req.getContextPath(); // /board_MVC2
// .substring(contextPath.length()) : contextPath의 길이만큼 문자열을 잘라줘
String command = requestURI.substring(contextPath.length());
// JSP에는 이동방식이 2가지
// forward 와 redirect
// 일괄처리
// 어디로 이동할지 / 어떤 방식일지(forward, redirect)
ActionTo acto = null;
switch(command) {
case "/UserJoin.us":
acto = new ActionTo();
// redirect는 true로 세팅, forward방식이면 false로 세팅
acto.setRedirect(false);
acto.setPath("/app/user/jopinview.jsp");
System.out.println("조인!");
break;
case "/UserLogin.us":
acto = new ActionTo();
acto.setRedirect(false);
acto.setPath("/app/user/jopinview.jsp");
System.out.println("로그인!");
break;
// 만약에 test를 어떤 데이터를 처리하기 위해서 다른곳으로 보내주는데
// 이동한 곳에서 어떻게 어떤 곳으로 갈지 정해지는데
// 그러면 그 두 가지 정보를 return해줘야 하는데 return은 두 가지를 할 수 없다.
// 그래서 객체를 만들어주고 포장되어 있는 그 객체를 return해준다.
case "test":
}
// 어떤 곳에도 들어가지 못했으면 null
if(acto != null) {
// isRedirect()가 true면 이게 redirect라는 의미다.
if(acto.isRedirect()) {
// acto가 가지고 있는 path로 보내주는 것이다.
resp.sendRedirect(acto.getPath());
} else {
// else면 forward라는 방식이다.
// RequestDispatcher : 페이지를 이동시킬 때 사용한다.
// 클라이언트로부터 최초에 들어온 요청을 JSP/Servlet 내에서 원하는 자원으로 요청을 넘기는(보내는) 역할을 수행하거나,
// 특정 자원에 처리를 요청하고 처리 결과를 얻어오는 기능을 수행하는 클래스입니다.
// 즉 /a.jsp 로 들어온 요청을 /a.jsp 내에서 RequestDispatcher를 사용하여 b.jsp로 요청을 보낼 수 있습니다.
// 또는 a.jsp에서 b.jsp로 처리를 요청하고 b.jsp에서 처리한 결과 내용을 a.jsp의 결과에 포함시킬 수 있습니다.
RequestDispatcher disp = req.getRequestDispatcher(acto.getPath());
disp.forward(req, resp);
}
}
}
}