기능>
- 조회 : 페이지 처리, 검색 기능
- 수정
소스구조>
테이블 구조
CREATE TABLE BOARD (
NUM NUMBER(9) PRIMARY KEY,
WRITER VARCHAR2(100),--글쓴이
TITLE VARCHAR2(300),--제목
CONTENT CLOB, -- 내용
HIT NUMBER(3), --조회수
REGDATE DATE --등록일시
);
DROP SEQUENCE BOARD_SEQ;
CREATE SEQUENCE BOARD_SEQ;
(1) web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
<display-name>spring06_members</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
<!-- 인코딩필터 설정하기 -->
<filter>
<filter-name>characterEncoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- /// applicationContext.xml을 읽어와 빈으로 등록하는 리스너 설정 /// -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- //////////////////// DispatcherServlet설정 //////////////////// -->
<servlet>
<servlet-name>mvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!-- /////////////////////////////////////////////////////////////// -->
</web-app>
(2) applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- //// 전역적인 자원들이 등록 (Dao,Service,...) ////// -->
<!-- 1. DataSource 설정(url,username,password,..) -->
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
</bean>
<!-- 2. SqlSessionFactory설정(dataSource,Mapper파일설정) -->
<bean id="sqlSessionFactory"
class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocation" value="classpath:test/mybatis/mybatis-config.xml"/>
</bean>
<!-- 3. SqlSessionTemplate설정(SqlSessionFactory주입) -->
<bean id="sqlSessionTemplate"
class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" index="0"/>
</bean>
<bean id="boardDao" class="test.dao.BoardDao">
<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>
<bean id="boardService" class="test.service.BoardService">
<property name="dao" ref="boardDao"></property>
</bean>
</beans>
(3) mvc-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- /////////// MVC관련 Bean객체 등록(컨트롤러,뷰리절버,..) //////// -->
<!-- //////////// 컨트롤러 등록 /////////////////-->
<bean class="test.controller.BoardListController">
<property name="boardService" ref="boardService"/>
</bean>
<bean class="test.controller.BoardDetailController">
<property name="boardService" ref="boardService"/>
</bean>
<!--///////// 뷰리절버등록 //////////////
/WEB-INF/views/insert.jsp
-->
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
(4) main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<ul>
<li><a href="list.do">글목록</a></li>
</ul>
</body>
</html>
(5) boardList.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 PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript">
function setCheckBox(){
if(eval('${not empty title}')){
document.getElementsByName("title")[0].checked=true;
}
if(eval('${not empty content}')){
document.getElementsByName("content")[0].checked=true;
}
if(eval('${not empty writer}')){
document.getElementsByName("writer")[0].checked=true;
}
}
</script>
<body onload="setCheckBox()">
<h2>게시판</h2>
<table border="1" cellpadding="0" cellspacing="0" width="600px">
<tr>
<th>글번호</th><th>작성자</th><th>제목</th><th>등록일</th>
</tr>
<c:forEach var="vo" items="${ list }">
<tr>
<td>${ vo.num }</td>
<td>${ vo.writer }</td>
<td><a href="getInfo.do?num=${ vo.num }">${ vo.title }</a></td>
<td>${ vo.regdate }</td>
</tr>
</c:forEach>
</table>
<div>
<!-- 검색조건 받은것을 변수에 담아서 처리. -->
<c:set var="pms" value="&writer=${ writer }&title=${ title }&content=${ content }&keyword=${ keyword }"/>
<c:forEach var="i" begin="${ startPageNum }" end="${ endPageNum }">
<c:if test="${ pageNum== i }">
<span style="color:red"><a href="list.do?pageNum=${ i }${ pms }">[${ i }]</a></span>
</c:if>
<c:if test="${ pageNum!= i }">
<span><a href="list.do?pageNum=${ i }${ pms }">[${ i }]</a></span>
</c:if>
</c:forEach>
</div>
<div>
<form method="post" action="list.do">
<input type="checkbox" name="title" value="title"/>제목
<input type="checkbox" name="writer" value="writer"/>작성자
<input type="checkbox" name="content" value="content"/>내용
<input type="text" name="keyword" value="${ keyword }"/>
<input type="submit" value="검색"/>
</form>
</div>
<div>
<a href="list.do">전체 글 보기</a>
</div>
</body>
</html>
(6) detail.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1" width="600">
<tr>
<td>글번호</td>
<td>${ vo.num }</td>
</tr>
<tr>
<td>글제목</td>
<td>${ vo.title }</td>
</tr>
<tr>
<td>조회수</td>
<td>${ vo.hit }</td>
</tr>
<tr>
<td>작성자</td>
<td>${ vo.writer }</td>
</tr>
<tr>
<td>내용</td>
<td><textarea cols="60" rows="5" disabled>${ vo.content }</textarea></td>
</tr>
<tr>
<td>이전글</td>
<td><a href="getInfo.do?num=${ prev.num }">${ prev.title }</a></td>
</tr>
<tr>
<td>다음글</td>
<td><a href="getInfo.do?num=${ next.num }">${ next.title }</a></td>
</tr>
</table>
</body>
</html>
(7) mybatis-config.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>
<typeAliases>
<typeAlias alias="board" type="test.vo.BoardVo"/>
</typeAliases>
<!--//////////// SQL구문이 들어있는 SQL Mapper파일 포함 /////////////////-->
<mappers>
<mapper resource="test/mybatis/BoardMapper.xml" />
</mappers>
</configuration>
(8) BoardMapper.xml
- where 만들기 ( 조회조건을 동적으로 )
- CDATA 사용 : 내용을 문자열로 간주함.
<?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="test.mybatis.BoardMapper">
<!-- select로 추출된 컬럼과 자바객체의 필드(멤버변수)와 매핑을 설정.
예) clob 타입 을 string 타입으로 매핑.
select로 뽑아온 컬럼명과 멤버변수의 이름이 다른 경우 매핑
-->
<result column="num" property="num" />
<result column="writer" property="writer" />
<result column="title" property="title" />
<!-- CLOB형을 String타입과 매핑 -->
<result column="content" property="content" jdbcType="CLOB" javaType="string" />
<result column="hit" property="hit" />
<result column="regdate" property="regdate" />
</resultMap>
<insert id="insert" parameterType="board">
insert into board
values
( board_seq.nextval, #{writer}, #{title}, #{content}, #{hit}, sysdate )
</insert>
<!-- 전체 글의 갯수 구하기 -->
<select id="getCount" resultType="int" parameterType="hashmap">
select NVL(count(1),0) from board
<if test="title!=null and title!=''">
title like '%'||#{keyword}||'%'
</if>
<if test="writer!=null and writer!=''">
or writer like '%'||#{keyword}||'%'
</if>
<if test="content!=null and content!=''">
or content like '%'||#{keyword}||'%'
</if>
</where>
</select>
<!-- 상세 글보기 -->
<select id="getInfo" parameterType="int" resultMap="boardmap">
select * from board
where num=#{value}
</select>
<!-- 조회수 증가 -->
<update id="addHit" parameterType="int">
update board
set hit= hit + 1
where num=#{value}
</update>
<!-- 현재 페이지에 해당하는 글목록 얻어오기 -->
<select id="getList" parameterType="hashmap" resultMap="boardmap">
SELECT *
FROM (
SELECT A.*, ROWNUM RNUM
FROM (
SELECT * FROM BOARD
<if test="title!=null and title!=''">
title like '%'||#{keyword}||'%'
</if>
<if test="writer!=null and writer!=''">
or writer like '%'||#{keyword}||'%'
</if>
<if test="content!=null and content!=''">
or content like '%'||#{keyword}||'%'
</if>
</where>
ORDER BY NUM DESC
) A
)
WHERE RNUM >= #{startNum}
AND RNUM <= #{endNum}
]]>
</select>
<!-- 이전글보기
이전 : 최신글
다음 : 과거글
-->
<select id="getPrev" parameterType="int" resultType="board">
<![CDATA[
SELECT *
FROM (
SELECT * FROM BOARD
WHERE NUM > #{value}
ORDER BY NUM ASC
)
WHERE ROWNUM = 1
]]>
</select>
<!-- 다음글 -->
<select id="getNext" parameterType="int" resultType="board">
<![CDATA[
SELECT *
FROM (
SELECT * FROM BOARD
WHERE NUM < #{value}
ORDER BY NUM DESC
)
WHERE ROWNUM = 1
]]>
</select>
</mapper>
(9) BoardVo.java
package test.vo;
import java.sql.Timestamp;
public class BoardVo {
private int num;
private String writer;
private String title;
private String content;
private int hit;
private Timestamp regdate;
public BoardVo(){}
public BoardVo(int num, String writer, String title, String content,
int hit, Timestamp regdate) {
super();
this.num = num;
this.writer = writer;
this.title = title;
this.content = content;
this.hit = hit;
this.regdate = regdate;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getWriter() {
return writer;
}
public void setWriter(String writer) {
this.writer = writer;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public int getHit() {
return hit;
}
public void setHit(int hit) {
this.hit = hit;
}
public Timestamp getRegdate() {
return regdate;
}
public void setRegdate(Timestamp regdate) {
this.regdate = regdate;
}
}
(10) BoardDao.java
package test.dao;
import java.util.HashMap;
import java.util.List;
import org.mybatis.spring.SqlSessionTemplate;
import test.vo.BoardVo;
public class BoardDao {
private SqlSessionTemplate sqlSessionTemplate;
//spring통해 받아 와야 하기 때문에
public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {
this.sqlSessionTemplate = sqlSessionTemplate;
}
//페이지에 대한 글목록 반환
public List<BoardVo> getList(HashMap<String, String> map){
return (List<BoardVo>)sqlSessionTemplate.selectList("getList",map);
}
//글번호에 해당하는 글정보 반환
public BoardVo getInfo(int num){
return (BoardVo)sqlSessionTemplate.selectOne("getInfo",num);
}
//전체 글에 대한 갯수 반환
public int getCount(HashMap<String, String> map){
return (Integer)sqlSessionTemplate.selectOne("getCount", map);
}
//조회수 증가
public int addHit(int num){
return sqlSessionTemplate.update("addHit",num);
}
//이전글 정보 반환
public BoardVo getPrev(int num){
return (BoardVo)sqlSessionTemplate.selectOne("getPrev", num);
}
//다음글 정보 반환
public BoardVo getNext(int num){
return (BoardVo)sqlSessionTemplate.selectOne("getNext", num);
}
//입력
public int insert(BoardVo vo){
return sqlSessionTemplate.insert("insert", vo);
}
}
(11) PageUtil.java
; 페이지 처리를 위해 class를 만든다.
; 전체 페이지, 시작,끝 페이지 번호 등 관련 정보를 가져온다.
package test.page;
public class PageUtil {
private int pageNum; //현재 페이지 번호
private int startRow; //시작행번호
private int endRow; //끝 행번호
private int totalPageCount; //전체페이지갯수
private int startPageNum; //시작페이지번호
private int endPageNum; //끝페이지번호
private int rowBlockCount; //보여줄 글의 행갯수
private int pageBlockCount; //한페이지에 보여줄 페이지 갯수
private int totalRowCount; //전체글의 갯수
public PageUtil() {
// TODO Auto-generated constructor stub
}
/**
*
* @param pageNum 현재페이지번호
* @param totalRowCount 전체글의 갯수
* @param rowBlockCount 한페이지에 보여줄 글의 갯수
* @param pageBlockCount 한페이지에 보여줄 페이지의 갯수
*/
public PageUtil(int pageNum,
int totalRowCount,
int rowBlockCount,
int pageBlockCount ){
this.pageNum = pageNum;
this.totalRowCount = totalRowCount;
this.rowBlockCount = rowBlockCount;
this.pageBlockCount = pageBlockCount;
//시작행번호 구하기
startRow = (pageNum - 1)*rowBlockCount + 1;
//끝행번호 구하기
endRow = startRow + rowBlockCount - 1;
//전체 페이지 갯수 구하기
totalPageCount=(int)Math.ceil(totalRowCount/(double)rowBlockCount);
//시작페이지번호 구하기
startPageNum = (pageNum-1)/pageBlockCount*pageBlockCount + 1;
//끝페이지번호 구하기
endPageNum = startPageNum + pageBlockCount - 1;
if( totalPageCount < endPageNum ){
endPageNum = totalPageCount;
}
}
public int getPageNum() {
return pageNum;
}
public void setPageNum(int pageNum) {
this.pageNum = pageNum;
}
public int getStartRow() {
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
public int getEndRow() {
return endRow;
}
public void setEndRow(int endRow) {
this.endRow = endRow;
}
public int getTotalPageCount() {
return totalPageCount;
}
public void setTotalPageCount(int totalPageCount) {
this.totalPageCount = totalPageCount;
}
public int getStartPageNum() {
return startPageNum;
}
public void setStartPageNum(int startPageNum) {
this.startPageNum = startPageNum;
}
public int getEndPageNum() {
return endPageNum;
}
public void setEndPageNum(int endPageNum) {
this.endPageNum = endPageNum;
}
public int getRowBlockCount() {
return rowBlockCount;
}
public void setRowBlockCount(int rowBlockCount) {
this.rowBlockCount = rowBlockCount;
}
public int getPageBlockCount() {
return pageBlockCount;
}
public void setPageBlockCount(int pageBlockCount) {
this.pageBlockCount = pageBlockCount;
}
public int getTotalRowCount() {
return totalRowCount;
}
public void setTotalRowCount(int totalRowCount) {
this.totalRowCount = totalRowCount;
}
}
(12) BoardService.java
package test.service;
import java.util.HashMap;
import java.util.List;
import test.dao.BoardDao;
import test.vo.BoardVo;
public class BoardService {
private BoardDao dao;
public void setDao(BoardDao dao) {
this.dao = dao;
}
// 페이지에 대한 글목록 반환
public List<BoardVo> getList(HashMap<String, String> map) {
return dao.getList(map);
}
// 상세글보기
public HashMap<String, BoardVo> getInfo(int num) {
HashMap<String, BoardVo> map = new HashMap<>();
map.put("vo", dao.getInfo(num)); //현재글에 대한 정보
map.put("prev", dao.getPrev(num)); //이전글에 대한 정보
map.put("next", dao.getNext(num)); //다음글에 대한 정보
dao.addHit(num);//조회수 증가
return map;
}
// 전체 글에 대한 갯수 반환
public int getCount(HashMap<String, String> map) {
return dao.getCount(map);
}
// 조회수 증가
public int addHit(int num) {
return dao.addHit(num);
}
// 이전글 정보 반환
public BoardVo getPrev(int num) {
return dao.getPrev(num);
}
// 다음글 정보 반환
public BoardVo getNext(int num) {
return dao.getNext(num);
}
// 입력
public int insert(BoardVo vo) {
return dao.insert(vo);
}
}
(13) BoardListController.java
- 파라미터를 받을 때 값이 없으면 NullpointException이 발생한다. 그럴경우
@RequestParam(value="title",required=false) ...
required=false를 사용해서 필수가 아니라는 것을 명시한다.
- 파라미터 값이 없을 경우 기본값을 지정할수 있다.
@RequestParam(value="pageNum",defaultValue="1") int pageNum){
- view 정보를
ModelAndView mv = new ModelAndView("boardList"); 파라미터로 넘기면 따로 지정하지 않아도 된다.
( boardList.jsp페이지로..)
- 페이지 처리에서 검색조건을 받을 경우 넘길때 받은 조건내용를 보내야 한다. 다음 페이지에서도 검색조건으로 보여야 하기 때문에 .
package test.controller;
import java.util.HashMap;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.servlet.ModelAndView;
import test.page.PageUtil;
import test.service.BoardService;
import test.vo.BoardVo;
@Controller
public class BoardListController {
private BoardService boardService;
public void setBoardService(BoardService boardService) {
this.boardService = boardService;
}
@RequestMapping("/list.do")
public ModelAndView list(
@RequestParam(value="title",required=false) String title,
@RequestParam(value="writer",required=false) String writer,
@RequestParam(value="content",required=false) String content,
@RequestParam(value="keyword",required=false) String keyword,
@RequestParam(value="pageNum",defaultValue="1") int pageNum){
HashMap<String, String> map = new HashMap<>();
map.put("title", title);
map.put("writer", writer);
map.put("content", content);
map.put("keyword", keyword);
int totalRowCount = boardService.getCount(map);
PageUtil pu = new PageUtil(pageNum, totalRowCount, 10, 10);
map.put("startNum", String.valueOf(pu.getStartRow()));
map.put("endNum", String.valueOf(pu.getEndRow()));
System.out.println("startNum:" + pu.getStartRow());
System.out.println("endNum:" + pu.getEndRow());
List<BoardVo> list = boardService.getList(map);
ModelAndView mv = new ModelAndView("boardList");
mv.addObject("list",list);
mv.addObject("startPageNum", pu.getStartPageNum());
mv.addObject("endPageNum",pu.getEndPageNum());
mv.addObject("totalPageCount",pu.getTotalPageCount());
mv.addObject("pageNum",pageNum);
//검색조건도 넘긴다. 다시 2page 조회할때 검색조건을 넘기기 위해.
mv.addObject("title",title);
mv.addObject("writer",writer);
mv.addObject("content",content);
mv.addObject("keyword",keyword);
return mv;
}
}
(14) BoardDetailController.java
public String detail(@RequestParam("num") int num, Model model){
파라미터에 Model 추가해서 사용해도 된다.
넘길때는 addAttribute
- 파라미터에 받을 객체를 사용하면 받을 수 있다. HttpSession, ...
import java.util.HashMap;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import test.service.BoardService;
import test.vo.BoardVo;
@Controller
public class BoardDetailController {
private BoardService boardService;
public void setBoardService(BoardService boardService) {
this.boardService = boardService;
}
@RequestMapping("/getInfo.do")
public String detail(@RequestParam("num") int num, Model model){
HashMap<String,BoardVo> map=boardService.getInfo(num);
// model객체에 값을 담으면 뷰페이지에서 출력가능(유효함)
model.addAttribute("vo", map.get("vo"));
model.addAttribute("prev", map.get("prev"));
model.addAttribute("next", map.get("next"));
// String 으로 반환되는 것은 뷰이름을 의미.
return "detail";
}
}
'WEB > Spring3.0' 카테고리의 다른 글
SPRING3.0 #13 (파일 업로드, fileupload/filedownload) (0) | 2013.01.27 |
---|---|
SPRING3.0 #12(게시판 annotation사용) (0) | 2013.01.27 |
SPRING3.0 #11(annotation) (0) | 2013.01.27 |
SPRING3.0 #10( MVC ) (0) | 2013.01.27 |
SPRING3.0 #09( MVC ) (0) | 2013.01.27 |