wintertreey 님의 블로그
MVC Model2: DB 연동하기 본문
Views : 사용자 | Controller(Servlet) : 중개자 | Model : 디비연결 | MyBatis | |
상품보기 | go.html | ControllerService / CommandInter, SangpumImpl |
MessageModel / SangpumDto, SqlMapConfig, |
Configuration, DataMapper db.properties |
ControllerService.java
package pack.controller;
import java.io.IOException;
import java.util.StringTokenizer;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("*.do")
public class ControllerService extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//방법1: parameter 사용
//String command = request.getParameter("command");
//방법2: 파일명 요청으로 사용
String ss= request.getRequestURI();
//System.out.println("ss: "+ss);//ss: /wmvc4sangpum/sang.do
int idx = ss.lastIndexOf('/');
StringTokenizer st = new StringTokenizer(ss.substring(idx+1),".");
ss = st.nextToken();
//System.out.println("ss: "+ss); //ss: sang //ss: jikwon
CommandInter inter = null;
String viewName = "/WEB-INF/views/";
String command = ss;
앞에선 parameter로 값을 받아와서 처리했었는데
이번엔 아예 파일명자체로 처리해본다.
(이게 더 Spring에 가까운 방법)
CommandInter.java
package pack.controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface CommandInter {
String showData(HttpServletRequest request, HttpServletResponse response) throws Exception;
}
SangpumImpl.java
package pack.controller;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import pack.model.SangpumDto;
import pack.model.SangpumModel;
public class SangpumImpl implements CommandInter{
//Model과 통신하기 위한 Controller 영역 내 클래스
@Override
public String showData(HttpServletRequest request, HttpServletResponse response) throws Exception {
SangpumModel sangpumModel = new SangpumModel(); // 싱글톤을 써야함
ArrayList<SangpumDto> list = (ArrayList<SangpumDto>)sangpumModel.selectDataAll();
request.setAttribute("datas", list);
return "show.jsp";
}
}
모델로 넘어가서 DB와 연동된 값을 가지고 오자.
DTO주머니
SangpumDto.java
package pack.model;
public class SangpumDto {
private String code, sang, su, dan;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getSang() {
return sang;
}
public void setSang(String sang) {
this.sang = sang;
}
public String getSu() {
return su;
}
public void setSu(String su) {
this.su = su;
}
public String getDan() {
return dan;
}
public void setDan(String dan) {
this.dan = dan;
}
}
세션 연
SqlMapConfig.java
package pack.model;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlMapConfig {
public static SqlSessionFactory sqlSession; //DB의 SQL명령을 실행시킬 때 필요한 메소드를 갖고 있다.
static{
String resource = "pack/mybatis/Configuration.xml";
try {
Reader reader = Resources.getResourceAsReader(resource);
sqlSession = new SqlSessionFactoryBuilder().build(reader);
reader.close();
} catch (Exception e) {
System.out.println("SqlMapConfig 오류 : " + e);
}
}
public static SqlSessionFactory getSqlSession(){
return sqlSession;
}
}
SangpumModel.java
package pack.model;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
public class SangpumModel {
private SqlSessionFactory factory = SqlMapConfig.getSqlSession();
public List<SangpumDto> selectDataAll(){
List<SangpumDto> list = null;
SqlSession session = factory.openSession();
list = session.selectList("selectDataAll");
session.close();
return list;
}
}
Mybatis
db.properties
driver=org.mariadb.jdbc.Driver
url=jdbc:mariadb://localhost:3306/test
username=root
password=123
Configuration.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="pack/mybatis/db.properties" />
<environments default="dev">
<environment id="dev">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="pack/mybatis/DataMapper.xml" />
</mappers>
</configuration>
DataMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="dev">
<select id="selectDataAll" resultType="pack.model.SangpumDto">
select * from sangdata order by code asc
</select>
</mapper>
다시 Controller에게 돌아가자
try {
if(command.equals("sang")) {
inter = new SangpumImpl();
viewName += inter.showData(request, response);
request.getRequestDispatcher(viewName).forward(request, response);
}else if(command.equals("jikwon")){
//....
}else {
viewName = "error.html";
response.sendRedirect(viewName);
}
} catch (Exception e) {
System.out.println("service err: "+e);
}
}
포워드로 값을 받아온다.
출력결과
'백엔드 > JSP' 카테고리의 다른 글
JSTL (0) | 2024.07.03 |
---|---|
Redirect 리다이렉트 vs Forward 포워드 방식 (0) | 2024.07.02 |
MVC Model2: 인터페이스를 사용한 Controller (0) | 2024.07.01 |
빌드 관리 도구 maven gradle (0) | 2024.07.01 |
MVC패턴 (2) | 2024.07.01 |