12. MVC pattern
Client (html) |
----> | Controller (servlet, interface, class) |
----> | Model (DTO, DAO-sql) |
----> | DB |
----> | View (FormBean, jsp) |
1) Client : html의 <form>,<a>태그로 값을 전달한다.
<form action="path" method="get">
<input type="text" name="name1" value="value1">
<input type="submit">
</form>
<a href="sang.do?command=sang">상품</a><br> // Parameter로 값 전달
<a href="sang.do">상품</a> // 요청명으로 값 전달
<a href="buser.do">부서</a>
2) Controller
① servlet
@WebServlet("/hobby.do") : 단일
@WebServlet({"/hobby.do","/nicd.do"}) : 배열(복수)
@WebServlet({"*.do","*.kor"}) : 확장자(복수)
=> ( )안 설정한 url pattern을 사용하여 servlet 호출할 수 있다.
private HobbyModel model;
public void init() throws ServletException {
model = new HobbyModel();
}
=> servlet의 service에 구현시 요청마다 new 객체 생성시 메모리를 많이 소모 함으로 init()에 작성한다.
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
=> get/post방식에 상관없이 동작하도록 구현.
try {
name=request.getParameter("name");
} catch (Exception e) {
name=null;
}
=> 요청처리 방법 1 : parameter사용. request.getParameter()로 html의 value를 전달받는다.
String str1 = request.getRequestURI();
// 요청명 : /mvc_ex3_db/sang.do
int idx = str1.lastIndexOf('/');
// 11
String str2 = str1.substring(idx+1); // idx+!부터 끝까지 자름
// sang.do
StringTokenizer str3 = new StringTokenizer(str2,"."); // str2를 .을 기준으로 토큰화
// sang , do
str4 = str3.nextToken();
// sang
String command = str4;
=> 요청처리 방법 2 : 요청명을 사용
"/프로젝트명/uripattern.확장자"로 전달받는다.
CommandInter inter = null;
String viewName = "views/";
try {
if(command.equals("sang")) {
inter = SangpumImpl.instance();
}else if(command.equals("buser")) {
inter = BuserImpl.instance();
}else if(command.equals("jikwon")) {
inter = JikwonImpl.instance();
}else {
viewName += "error.html";
response.sendRedirect(viewName);
return;
}
viewName += inter.showData(request, response);
} catch (Exception e) {
System.out.println("service : "+e);
}
=> interface를 상속받은 클래스의 singletone 객체를 받아온다.
=> 명령에 따른 다른 table의 객체를 받아오도록 오버라이딩을 진행한 메소드를 실행한다.
//HobbyModel model = new HobbyModel();
ArrayList<String> list = model.getHobby(hobby);
request.setAttribute("datas", list);
=> 다음의 모델은 interface를 상속받은 클래스에 구현한다.(다형성을 사용)
//response.sendRedirect(viewName+"?result="+result); // 컬렉션 류의 객체는 전달X
request.setAttribute("result", result); // 객체 전달 가능.
RequestDispatcher rd = request.getRequestDispatcher(viewName);
rd.forward(request, response);
}
=> request setAttribute(), getAttribute()으로 값 전달.
=> sendRedirect의 경우 객체를 전달할 수 없어 forward로 요청 재지정하여 값 전달.
* web.xml를 이용한 url pattern 등록 (경로 : Context/WEB_INF/web.xml)
<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>
=> <welcom-file>내 파일명을 입력하면, 도메인만 입력시에 해당 파일이 실행된다.
=> 위쪽 부터 우선순위를 가진다.
<servlet>
<servlet-name>hobby</servlet-name>
<servlet-class>pack.controller.HobbyController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>hobby</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
=> url pattern 등록
② Interface
public interface CommandInter {
String showData(HttpServletRequest request, HttpServletResponse response);
}
③ class
public class SangpumImpl implements CommandInter{
//Singleton
static SangpumImpl impl = new SangpumImpl();
public static SangpumImpl instance() {
return impl;
}
@Override
public String showData(HttpServletRequest request, HttpServletResponse response) {
SangpumModel model = new SangpumModel();//원래는 싱글으로 작성된 클래스를 읽어야함.
ArrayList<SangpumDto> list = model.getDataAll();
request.setAttribute("datas", list);
return "sangpum.jsp";
}
}
=> 모델에 있는 클래스와 통신을 하는 컨트롤러 영역내의 클래스를 선언한다.
* Singletone : 한클래스당 하나의 객체만 사용하도록 하는 인스턴스.
class 클래스명{
private static 클래스명 singleton명 = new 클래스명();
static 클래스명 getInstance(){
return singleton;
}
}
3) Model
① DTO
public class SangpumDto {
private String code;
private String sang;
private String su;
private int dan;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
...
}
=> 필드, getter, setter 선언
② DAO (or Model)
* JDBC Connection pooling
public class SangpumModel {
private Connection conn;
private PreparedStatement ptmt;
private ResultSet rs;
private DataSource ds;
public SangpumModel() {
try {
Context context = new InitialContext();
ds= (DataSource)context.lookup("java:comp/env/jdbc_maria");
} catch (Exception e) {
System.out.println("SangpumModel err"+e);
}
}
public ArrayList<SangpumDto> getDataAll(){
ArrayList<SangpumDto> list = new ArrayList<>();
try {
conn=ds.getConnection();
String sql = "select * from sangdata";
ptmt = conn.prepareStatement(sql);
rs= ptmt.executeQuery();
while(rs.next()) {
SangpumDto dto = new SangpumDto();
dto.setCode(rs.getString("code"));
dto.setSang(rs.getString("sang"));
dto.setSu(rs.getString("su"));
dto.setDan(rs.getInt("dan"));
list.add(dto);
}
} catch (Exception e) {
System.out.println("getDataAll err"+e);
}finally {
try {
if(conn!=null) conn.close();
if(ptmt!=null) ptmt.close();
if(rs!=null) rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return list;
}
}
* Mybatis (xml)
- db.properties : 계정정보
- Configuration.xml : <alias>, <mapper> 수정
- DataMapper.xm : xml 형식 sql문 작성
- SqlMapConfig : SqlSessionFactory 객체 생성
- DAO(or model)
public class SangpumModel {
private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
public ArrayList<SangpumDto> getDataAll(){
ArrayList<SangpumDto> list = null;
SqlSession sqlSession = factory.openSession();
list = (ArrayList)sqlSession.selectList("selectDataAll");
sqlSession.close();
return list;
}
}
* Mybatis (@어노테이션)
- db.properties : 계정정보
- Configuration.xml : <alias>, <mapper> 삭제
- DataMapper.xm : 삭제
- SqlMapperInter : 테이블수에 맞게 작성. sql문 작성
public interface SqlMapperInter_Jikwon {
@Select("select jikwon_no, jikwon_name, buser_num, jikwon_jik from jikwon where buser_num = #{buser_no}")
public List<JikwonDto> selectPartJikwon(String buser_no);
}
- SqlMapConfig : SqlMapperInter의 class 배열에 연결.
Class[] mappers = {SqlMapperInter_Buser.class, SqlMapperInter_Jikwon.class, SqlMapperInter_Gogek.class};
for(int i=0; i<mappers.length;i++) {
sqlSession.getConfiguration().addMapper(mappers[i]);
}
- DAO(or model) : SqlSessionFactory객체사용하여 sql 메소드 호출.
public class JikwonDao {
private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
public ArrayList<JikwonDto> selectPartJikwon(String buser_no){
ArrayList<JikwonDto> list = new ArrayList<>();
SqlSession sqlSession = factory.openSession();
try {
SqlMapperInter_Jikwon inter = sqlSession.getMapper(SqlMapperInter_Jikwon.class);
list = (ArrayList)inter.selectPartJikwon(buser_no);
} catch (Exception e) {
System.out.println("selectPartJikwon err"+e);
}finally {
if(sqlSession != null) sqlSession.close();
}
return list;
}
}
4) View
① jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
*상품자료(MVC pattern)
<table border="1">
<tr>
<td>코드</td><td>품명</td><td>수량</td><td>단가</td>
</tr>
<c:forEach var = "s" items="${datas}">
<tr>
<td>${s.code}</td>
<td>${s.sang}</td>
<td>${s.su}</td>
<td>${s.dan}</td>
</tr>
</c:forEach>
</table>
</body>
</html>
'BACK END > Servlet' 카테고리의 다른 글
[Servlet] Servlet 정리9 - Mybatis2 (0) | 2021.01.06 |
---|---|
[Servlet] Servlet 정리8 - Mybatis (0) | 2021.01.06 |
[Servlet] Servlet 정리7 - JDBC (0) | 2021.01.06 |
[Servlet] Servlet 정리6 - EL, JSTL (0) | 2021.01.04 |
[Servlet] Servlet 정리5 - Ajax (0) | 2021.01.03 |