itemid를 parameter가 아니라 path variable로 처리하기
1.Service 인터페이스에서 detail을 처리해주는 메소드를 추가로 선언
- 파라미터를 읽을 수 없기 때문에 Controller로 부터 itemid를 받아야 합니다.
// 파라미터를 읽지 않고 받는 메소드
public Item getItem(HttpServletRequest request, int itemid);
메소드 오버로딩 : 메소드의 이름은 같고 매개변수의 개수나 자료형이 다른 경우
2.ItemServiceImpl 클래스에 메소드를 구현
@Override
public Item getItem(HttpServletRequest request, int itemid) {
return itemDao.getItem(itemid);
}
3.HomeController 의 상제보기 요청을 처리하는 메소드를 수정
@RequestMapping(value = "/detail/{itemid}", method = RequestMethod.GET)
public String detail(HttpServletRequest request, Model model,
@PathVariable int itemid) {
// 서비스 메소드 호출
Item item = itemService.getItem(request, itemid);
// 데이터 저장
model.addAttribute("item", item);
return "detail";
}
4.home.jsp 의 제목의 링크 수정
- detail 뒤에
/
가 붙어서 디렉토리화가 되었다. 링크 수정해줘야됨.(path variable)
<a href="detail/${item.itemid}"> ${item.itemname}</a>
5.detail.jsp 링크 수정
- detail이 디렉토리화 가 되어서
../
을 붙여야 한다. (path variable)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>${item.itemname}</title>
<link rel="stylesheet" href="../css/item.css">
</head>
<body>
<div align="center">
<h2>상품 상세보기</h2>
<table border="1">
<tr>
<td><img src="../img/${item.pictureurl }" /></td>
<td>
<table>
<tr height="50">
<td width="80">상품명</td>
<th width="160">${item.itemname }</th>
</tr>
<tr height="50">
<td width="80">가격</td>
<th width="160">${item.price }</th>
</tr>
<tr height="50">
<td width="80">효능</td>
<th width="160">${item.description}</th>
</tr>
<tr height="50">
<td colspan="2" align="center"><a href='../'>O.목록보기 </a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</body>
</html>
하이버네이트 적용
1. pom.xml 파일에 hibernate와 spring-orm 라이브러리의 의존성 설정
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.4.2.Final</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${org.springframework-version}</version>
</dependency>
2.dao 패키지에 테이블과 DTO를 매핑하는 xml 파일을 생성하고 작성
- 기본패키지.dao.(이름.hbm.xml) : 하이버네이트 설정 파일이라는 것을 알려주기 위해서 중간에 hbm을 추가
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.gmail.hiwony7933.domain">
<class name="Item" table="ITEM">
<id name="itemid" column="ITEMID">
</id>
<property name="itemname" column="ITEMNAME" />
<property name="pictureurl" column="PICTUREURL" />
<property name="price" column="PRICE" />
<property name="description" column="DESCRIPTION" />
</class>
</hibernate-mapping>
3.root-context.xml 파일에 하이버네이트 사용을 위한 설정을 추가
- tx 네임스페이스를 추가
<!-- 하이버 네이트 사용을 위한 설정 -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>com/gmail/hiwony7933/dao/item.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
</value>
</property>
</bean>
<!-- 하이버 네이트는 트랜잭션 사용이 필수 이기 때문에 추가 -->
<!-- 프로젝트 모든 곳에서 사용가능하기에 여기에 추가함 -->
<tx:annotation-driven />
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
하이버네이트 설정
1. 하이버네이트를 사용하는 Dao 클래스 생성
- 기본 패키지.dao.HibernateDao
//Bean(스프링이 생성하는 인스턴스) 을 자동생성해주고
//데이터 관련된 클래스를 알려주기 위한 어노테이션
@Repository
public class HibernateDao {
//하이버네이트를 사용 할 수 있는 인스턴스를 주입
@Autowired
private SessionFactory sessionFactory;
//전체 데이터 가져오는 메소드
public List<Item> allItem() {
return sessionFactory.getCurrentSession().createCriteria(Item.class).list();
}
//데이터 1개를 가져오는 메소드
public Item getItem(int itemid) {
return sessionFactory.getCurrentSession().get(Item.class, itemid);
}
}
2. ItemServiceImpl 클래스를 수정
- HibernateDao 를 주입받고 itemDao 자리를 hibernateDao로 수정
- 처리하는 메소드 위에 트랜잭션 적용을 위한 @Transactional 추가
//Bean을 자동생성해주는 어노테이션
@Service
public class ItemServiceImpl implements ItemService {
// ItemDao 타입의 Bean이 있으면 자동으로 주입시켜주는 어노테이션
@Autowired
private ItemDao itemDao;
// Hibernate 연동하는 bean을 자동주입
// 동일한 자료형의 bean이 있으면 자동 주입
@Autowired
private HibernateDao hibernateDao;
@Override
@Transactional
public List<Item> allItem(HttpServletRequest request) {
// Dao 메소드에 파라미터가 없는 경우는 Dao 메소드를 호출해서 리턴
// return itemDao.allItem();
return hibernateDao.allItem();
}
@Override
@Transactional
public Item getItem(HttpServletRequest request) {
// 파라미터 읽어오기
String itemid = request.getParameter("itemid");
// 파라미터를 정수로 변환해서 Dao 메소드를 호출
// return itemDao.getItem(Integer.parseInt(itemid));
return hibernateDao.getItem(Integer.parseInt(itemid));
}
@Override
@Transactional
public Item getItem(HttpServletRequest request, int itemid) {
//return itemDao.getItem(itemid);
return hibernateDao.getItem(itemid);
}
}
3.실행했는데 트랜잭션 적용이 안되면 root-context.xml 파일에 있는 트랜잭션 관련 설정을 servlet-context.xml로 이동하고 수정
- servlet-context.xml 파일에 tx 네임스페이스를 추가
- servlet으로 옮길때는
<beans:
추가 해야됨.
<!-- 하이버 네이트는 트랜잭션 사용이 필수 이기 때문에 추가 -->
<tx:annotation-driven />
<beans:bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactory" />
</beans:bean>