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>

results matching ""

    No results matching ""