반응형

이번에는 게시판에 적힌 글을 조회하는 포스팅을 하도록 하겠습니다.

 

우선 reviewVo에 조회할 때 필요한 조회 종류를 추가해주도록 하겠습니다.

 

reviweVo.java

조회 기능까지 추가된 후의 reviewVo.java

package com.example.mall.domain;


public class reviewVo {

	/*
	 CREATE TABLE reviewTable (
	reNum INT AUTO_INCREMENT PRIMARY key,
	reTitle VARCHAR(20) NOT null,
	reContent text not null,
	reUser VARCHAR(20) NOT null,
	reregisterDate DATE DEFAULT NOW(),
	reCnt INT DEFAULT 0 # 조회수
	
	  
	 */
	
	private int reNum;
	private String reTitle;
	private String reContent;
	private String reUser;
	private String reregisterDate;
	private int reCnt;
	
	private String searchName, searchValue; // 이름별 검색, 제목별 검색
	public String getSearchName() {
		return searchName;
	}
	public void setSearchName(String searchName) {
		this.searchName = searchName;
	}
	public String getSearchValue() {
		return searchValue;
	}
	public void setSearchValue(String searchValue) {
		this.searchValue = searchValue;
	}
	public int getReNum() {
		return reNum;
	}
	public void setReNum(int reNum) {
		this.reNum = reNum;
	}
	public String getReTitle() {
		return reTitle;
	}
	public void setReTitle(String reTitle) {
		this.reTitle = reTitle;
	}
	
	public String getReContent() {
		return reContent;
	}
	public void setReContent(String reContent) {
		this.reContent = reContent;
	}
	public String getReUser() {
		return reUser;
	}
	public void setReUser(String reUser) {
		this.reUser = reUser;
	}
	public String getReregisterDate() {
		return reregisterDate;
	}
	public void setReregisterDate(String reregisterDate) {
		this.reregisterDate = reregisterDate;
	}
	public int getReCnt() {
		return reCnt;
	}
	public void setReCnt(int reCnt) {
		this.reCnt = reCnt;
	}
	
}

reviewMapper.xml

<!-- 게시글 검색하기 -->
	<select id="selectsearch" resultType="reviewVo">
		select * from reviewTable where ${searchName} like concat('%',#{searchValue},'%') <!-- #은 데이터값 -->
	</select>

 

reviewmapper.java

// 게시글 검색하기
	public List<reviewVo> selectsearch(reviewVo reviewvo) throws Exception;

 

reviewService.java

	// 게시글 제목 또는 작성자로 검색하기
	public List<reviewVo> selectsearch(reviewVo reviewvo) throws Exception {
		return reviewmapper.selectsearch(reviewvo);
	}

 

view에 검색할 수 있는 form 양식 작성

 

list.jsp 

기능 검색 추가된 list.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 charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
게시글 불러오기 
<br>
<table border="2">
<tr>
	<th>글번호</th><th>제목</th><th>내용</th><th>작성자</th><th>등록일</th><th>조회수</th>
</tr>
<c:forEach var="item" items="${relist}">
<tr>
<td>${item.reNum}</td>
<td><a href="detailreview?reNum=${item.reNum}">${item.reTitle}</a></td>
<td>${item.reContent}</td>
<td>${item.reUser}</td>
<td>${item.reregisterDate}</td>
<td>${item.reCnt}</td>
</c:forEach>
</table>
<a href="write">글쓰기</a>
<form action="search">
<table>
<tr>
<td><select name="searchName">
		<option value="reUser">작성자</option>
		<option value="reTitle">글제목</option>
		</select></td>
	<td colspan="2">
	<input type="text" name="searchValue">
	</td>
	<td>
	<input type="submit" value="검색">
	</td>
</tr>	
</table>
</form>
</body>
</html>

 

결과창

 

작성자 '롤'이 들어가는 글자로 검색해보겠습니다.

 

반응형
반응형

게시글을 클릭하면 조회수가 올라가도록 하는 글을 포스팅 하도록 하겠습니다.

 

reviewMapper.xml

	<!-- 조회수 올리기 -->
	<update id="updatereviewcnt">
		update reviewTable set reCnt = reCnt + 1 where reNum = #{reNum}
	</update>

update문으로 조회수(reCnt)를 1씩 증가시켜주도록 합니다.

 

reviewmapper.java

	// 문의글 조회수 올리기
	public int updatereviewcnt(String reNum);

reviewService.java

	// 조회수 올리기
	public int updatereviewcnt(String reNum) throws Exception {
		return reviewmapper.updatereviewcnt(reNum);
	}

 

reviewController.java

	// 게시글 자세히보기
	@RequestMapping(value="/detailreview")
	public ModelAndView detail(@RequestParam("reNum") String reNum) throws Exception {
		
		// 기존의 게시글 자세히 보기에서 추가된 부분
		reviewservice.updatereviewcnt(reNum);
		
		return new ModelAndView("detail","detail1",reviewservice.detail(reNum));
	}
    
    // 추가된 부분
    // reviewservice.updatereviewcnt(reNum);

 

글을 누르기 전

글을 누른 후

 

반응형
반응형

게시판 글쓰기 기능

 

글 등록하기

 

reviewController.java

// 게시판 글쓰기 기능
	@GetMapping("/write")
	public String writeform() throws Exception{
		return "/writeform";
	}
	@PostMapping("insert")
	public String insertreview(reviewVo reviewvo) throws Exception{
		boolean result = reviewservice.insertreview(reviewvo);
		if (result) {
			return "success";
		} else {
			return "error";
		}
	}

 

reviewMapper.xml

	<!-- 게시판 글쓰기 기능 -->
	<insert id="insertreview">
		insert into reviewTable(reTitle, reContent, reUser)  values(#{reTitle}, #{reContent}, #{reUser})
	</insert>

reviewmapper.java

	// 문의 글 쓰기
	public boolean insertreview(reviewVo reviewvo) throws Exception;

reviewService.java

	// 게시글 작성 
	public boolean insertreview(reviewVo reviewvo) throws Exception {
		return reviewmapper.insertreview(reviewvo);
	}

 

writeform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
** 글쓰기 **
<form action="insert" method="post">
글제목: <input type="text" name="reTitle"><br>
작성자: <input type="text" name="reUser"><br>
글내용: <textarea rows="5" cols="30" name="reContent"></textarea>
<br><br>
<input type="submit" value="저장">
</form>
</body>
</html>

 

게시글 상세보기

글 제목을 누르면 해당하는 글 번호의 내용을 상세보기로 출력 시켜주도록 하는 방법입니다.

 

list.jsp의 내용을 변경

<td><a href="detailreview?reNum=${item.reNum}">${item.reTitle}</a></td>

 

reviewService.java 추가

	// 게시글 상세보기
	public reviewVo detail(Integer reNum) throws Exception {
		return reviewmapper.detail(reNum);
	}

 

reviewController.java 내용 추가

	// 게시글 자세히보기
	@RequestMapping(value="/detailreview")
	public ModelAndView detail(@RequestParam("reNum") int reNum) throws Exception {
		
		// 
		return new ModelAndView("detail","detail",reviewservice.detail(reNum));
	}

 

reviewmapper.java 내용 추가

	// 문의글 상세 보기
	public reviewVo detail(Integer reNum) throws Exception;

 

reviewMapper.xml 내용 추가

	<!-- 게시글 상세보기 -->
	<select id="detail" resultType="reviewVo">
		select * from reviewTable where reNum = #{reNum}
	</select>

 

detail.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = function() {
	document.getElementById("btnList").onclick = function() {
		location.href="/";
	}
	document.getElementById("btnUpdate").onclick = function() {
		
		if(confirm("정말수정할까요")) {
	
			frm.action="/updatereview";
			frm.submit();
		}
	}
	document.getElementById("btnDelete").onclick = function() {
		if(confirm("정말 삭제할까요?")) {
			frm.action="deletereview";
			frm.submit();
		}
	}
}
</script>

</head>
<body>
** 상세보기 **
<br>
<form name="frm" method="get">
<table border="2">
	<tr>
		<td>번호</td>
		<td>${detail1.reNum}</td>
		<input type="hidden" value="${detail1.reNum}" name="reNum">
		
	</tr>
	<tr>
		<td>작성자</td>
		<td>${detail1.reUser}</td>	
	</tr>
		<tr>
		<td>제목</td>
		<td>${detail1.reTitle}</td>
	</tr>
		<tr>
		<td>글내용</td>
		<td>${detail1.reUser}</td>
	</tr>
	</tr>
	<tr>
		<td>작성일</td>
		<td>${detail1.reregisterDate}</td>
	</tr>
	<tr>
		<td>조회수</td>
		<td>${detail1.reCnt}</td>
	</tr>
		<tr colspan="3">
		<td>
		<input type="button" value="목록" id="btnList">
		<input type="button" value="수정" id="btnUpdate">
		<input type="button" value="삭제" id="btnDelete">
		</td>
	</tr>
</table>
</form>
</body>
</html>

 

글을 눌렀을때 나오는 결과 페이지

 

 

글 수정하기

우선 상세보기에 사용하였던 메소드를 수정할 jsp 폼에 불러옵니다.

 

reviewController.java

	@GetMapping("/updatereview")
	// 여기서 RequestParam("num")은 detail.jsp에서 input 값의 reNum
	public ModelAndView update(@RequestParam("reNum") String reNum) throws Exception {
		
		return new ModelAndView("upform","up",reviewservice.detail(reNum));
	}

upform.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = function() {

	document.getElementById("btnUpdate").onclick = function() {
		
		if(confirm("정말수정할까요")) {
	
			frm.action="updatereviewcommit";
			frm.submit();
		}
	}
}
</script>

</head>
<body>
** 수정하기 **
<br>
<form name="frm" method="post">
<table border="2">
	<tr>
		<td>번호</td>
		<td>${up.reNum}</td>
		<input type="hidden" value="${up.reNum}" name="reNum">
		
	</tr>
	<tr>
		<td>작성자</td>
		<td>${up.reUser}</td>	
	</tr>
		<tr>
		<td>제목</td>
		<td><input type="text" value="${up.reTitle}" name="reTitle"></td>
	</tr>
		<tr>
		<td>글내용</td>
		<td><textarea rows="5" cols="50" name="reContent">${up.reContent}</textarea></td>
	</tr>
	</tr>
	<tr>
		<td>작성일</td>
		<td>${up.reregisterDate}</td>
	</tr>
	<tr>
		<td>조회수</td>
		<td>${up.reCnt}</td>
	</tr>
		<tr colspan="3">
		<td colspan="3">
		<input type="button" value="수정" id="btnUpdate" style="margin: auto; width: 100%;">
		</td>
	</tr>
</table>
</form>
</body>
</html>

 

 

여기서 제목과 내용을 수정 후 수정하기 버튼을 클릭 하면

 

reviewMapper.xml

	// 문의글 수정하기
	int updatereview(reviewVo vo) throws Exception;

 

reviewmapper.java

	// 문의글 수정하기
	int updatereview(reviewVo vo) throws Exception;

 

reviewService.java

	// 게시글 수정하기
	public int updatereview(reviewVo vo) throws Exception {
		return reviewmapper.updatereview(vo);
	}

reviewController.java

	@PostMapping("/updatereviewcommit")
	public String updatesubmit(reviewVo vo) throws Exception {
		int result = reviewservice.updatereview(vo);
		System.out.println("result " + result);
		if ( result > 0 )
			return "redirect:/";
		else
			return "error";
	}

 

현재 10번 글을 수정해보겠습니다.

 

 

 

 

글 삭제하기

 

reviewMapper.xml

	<!-- 글 삭제하기 -->
	<delete id="deletereview">
		delete from reviewTable where reNum = #{reNum}
	</delete>

 

reviewmapper.java

	// 게시글 삭제하기
	public int deletereview(String num) throws Exception;

 

reviewService.java

	// 게시글 삭제하기
	public int deletereview(String num) throws Exception {
		// TODO Auto-generated method stub
		return reviewmapper.deletereview(num);
	}

 

reviewController.java

	
	// 게시글 삭제하기
	@GetMapping("/deletereview")
	public String del(@RequestParam("reNum") String num) throws Exception {
		int delresult = reviewservice.deletereview(num);
		if(delresult > 0 )
			return "redirect:/";
		else
			return "error";
	}
	

 

현재 글이 10번까지 있는 것을 확인 할 수 있습니다.

 

10번 글을 지우도록 하겠습니다.

삭제가 정상적으로 된 것을 볼 수 있습니다.

 

반응형
반응형

가장 기본적인 테이블인 고객 테이블이랑 상품 테이블부터 만들도록 하겠습니다.

 

Maria DB - 데이터베이스 테이블 만들기

 

userTable

CREATE TABLE userTable (
	userId VARCHAR(20),
	userPw VARCHAR(20) NOT null,
	userPw1 VARCHAR(20) NOT null,
	userTel VARCHAR(20) NOT NULL,
	userGender VARCHAR(10) NOT NULL,
	userEmail VARCHAR(50) NOT NULL,
	userAddr1 VARCHAR(20) NOT NULL,
	userAddr2 VARCHAR(20) NOT NULL,
	registerDate DATE DEFAULT NOW(),
 	CONSTRAINT userTable_userId_pk PRIMARY KEY(userId)
	) charset=UTF8;

용도 : 회원 가입시에 사용하기 위함

 

userTable 구성 :

- 고객아이디

- 고객비밀번호

- 고객비밀번호 재확인

- 고객 휴대폰번호

- 고객성별

- 고객 이메일

- 고객주소

- 고객세부주소

- 회원가입 날짜

 

 

productTable

CREATE TABLE productTable (
	prdNum INT auto_increment,
	prdName VARCHAR(20) NOT null,
	categoryCode VARCHAR(20) NOT null,
	prdPrice int,
	prdCount int,
	prdinfor VARCHAR(300) NOT NULL,
	prdImg VARCHAR(200) NOT NULL,
	prdregisterDate DATE DEFAULT NOW(),
 	CONSTRAINT productTable_prdNum_pk PRIMARY KEY(prdNum)
	) charset=UTF8;

용도 : 상품들을 홈페이지에 노출 시키고 등록하기 위함

 

productTable 구성:

- 상품번호

- 상품이름

- 상품카테고리

- 상품가격

- 상품개수

- 상품정보

- 상품이미지

- 상품등록일

 

reviewTable

CREATE TABLE reviewTable (
	reNum INT AUTO_INCREMENT PRIMARY key,
	reTitle VARCHAR(20) NOT null,
	reUser VARCHAR(20) NOT null,
	reregisterDate DATE DEFAULT NOW(),
	reCnt INT DEFAULT 0 # 조회수
	) charset=UTF8;

옹도 : 고객들의 문의 게시판

 

reviewTable 구성

- 문의 글 번호

- 문의 글 제목

- 문의 글 작성자

- 문의 등록일

- 문의 조회수

 

 

MariaDB를 사용하기 위한 Pom.xml 설정
<!-- https://mvnrepository.com/artifact/org.mariadb.jdbc/mariadb-java-client -->
		<dependency>
			<groupId>org.mariadb.jdbc</groupId>
			<artifactId>mariadb-java-client</artifactId>
		</dependency>

 

Java 파일 생성

userVo.java

productVo.java

reviewVo.java

 

여기서 각각 3개씩 만들었지만 우선 게시판과 하는 일이 비슷한 리뷰 테이블로 테스트 해보겠습니다.

Mapper 설정

pom.xml 추가 Mybatis 연동을 위한 설정

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.2</version>
		</dependency>

 

 - 위치 : src/main/resources/mappers/reviewMapper.xml
 - 쿼리문의 id와 mapper interface의 메서드명과 일치시킬 것

<?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="com.example.mall.mapper.reviewmapper">
	<select id="reviewlist" resultType="reviewVo">
		select * from reviewTable 
	</select>
</mapper>

 

application.properties 내용 추가

# mybatis entity scan packages 뜻 Model Class Package 경로
# 선택사항입니다. 하지만 사용하지 않으면 mapper 쿼리문마다 Model 클래스 경로 작성
mybatis.type-aliases-package=com.example.mall.domain

# where mapper
# mybatis.mapper-locations : mapper.xml 경로 작성
# 현재 저는 resources경로 밑에 mappers 폴더 하위 전부를 포함하는 의미로 사용했습니다.
mybatis.mapper-locations=mappers/**/*.xml
com.example.mall.mappers.userMapper는 src/main/resources 밑에 mappers폴더를 만들고 xml 파일명

 

위치 : src/main/java 밑에 mapper 폴더 생성 후 아래와 같이 작성

reviewmapper.java

package com.example.mall.mapper;

import java.util.List;

import com.example.mall.domain.reviewVo;

public interface reviewmapper {
	
	// 문의 글 조회
	public List<reviewVo> reviewlist() throws Exception;
}

 

reviewService.java

위치 src/main/java 밑에 repository 폴더 생성 후 아래와 같이 작성

package com.example.mall.repository;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.example.mall.domain.reviewVo;
import com.example.mall.mapper.reviewmapper;


@Service
public class reviewService {

	@Autowired
	private reviewmapper reviewmapper;
	
	// 게시글 조회
	public List<reviewVo> reviewlist() throws Exception {
		// mapper 패키지 안의 reviewmapper.java의 문의글 조회  reviewlist메소드와 일치
		return reviewmapper.reviewlist();
	}
}

 

Controller 작성
package com.example.mall.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

import com.example.mall.domain.reviewVo;
import com.example.mall.repository.reviewService;

@Controller
@EnableAutoConfiguration
public class reviewController {
	
	@Autowired
	private reviewService reviewservice;
	
	@GetMapping("/")
	public ModelAndView relist() throws Exception{
		ModelAndView mav = new ModelAndView("list");
		List<reviewVo> reviewlist = reviewservice.reviewlist();
		mav.addObject("relist",reviewlist);
		
		return mav;
	}
}

 

Spring boot 의 templates 에서 jsp가 작동하지 않으므로 다음과 같이 설정

pom.xml 에 내용 추가

		<dependency>
			<groupId>org.apache.tomcat.embed</groupId>
			<artifactId>tomcat-embed-jasper</artifactId>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
		</dependency>

추가 후 src/main 폴더 밑에 차례대로 폴더를 생성해줍니다.

webapp -> WEB-INF -> views

application.properties에 다음의 내용 추가

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp

 

총 폴더는 다음과 같다.

 

현재 제 reviewTable의 값들은 다음과 같습니다.

 

jsp 파일 생성 후 웹상으로 출력하도록 하겠습니다.

list.jsp

 

출력 결과

휴 성공,,

+ 추가적으로 콘솔에 SQL문이 실행되는지 보고싶다면

pom.xml 에 다음 내용을 추가

		<!-- MyBatis sql pretty -->
		<dependency>
			<groupId>org.bgee.log4jdbc-log4j2</groupId>
			<artifactId>log4jdbc-log4j2-jdbc4</artifactId>
			<version>1.16</version>
		</dependency>

 

resources 폴더 밑에 2개의 파일은 만들어줍니다.

log4jdbc.log4j2.properties

log4jdbc.spylogdelegator.name=net.sf.log4jdbc.log.slf4j.Slf4jSpyLogDelegator
log4jdbc.dump.sql.maxlinelength=0

 

logback-spring.xml

<configuration>
  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d{yyyyMMdd HH:mm:ss.SSS} [%thread] %-3level %logger{5} - %msg %n</pattern>
    </encoder>
  </appender>
  
  <logger name="jdbc" level="OFF"/>
  
  <logger name="jdbc.sqlonly" level="OFF"/>
  <logger name="jdbc.sqltiming" level="DEBUG"/>
  <logger name="jdbc.audit" level="OFF"/>
  <logger name="jdbc.resultset" level="OFF"/>
  <logger name="jdbc.resultsettable" level="DEBUG"/>
  <logger name="jdbc.connection" level="OFF"/>
  
  <root level="INFO">
    <appender-ref ref="STDOUT" />
  </root>
  
</configuration>

 

콘솔 로그창

 

 

 
반응형
반응형

1. 우선 STS를 설치하였다는 전제하에 글을 작성하고있습니다.

 

다음과 같이 실행되는 장면을 볼 수 있습니다.

 

 

자 다음과 같이 어디에 설치 할지 경로를 잡아 주도록 합니다.

 

 

 

2. [File] > [New] > [Spring Starter Project]

 

3. 설정 화면 필요한 것들을 넣어주도록 한다.

 

 

4. 실행 해주도록 합니다.

 

 

 

위와 같은 에러가 나타났습니다. 해당 오류는 Gradle 프로젝트 생성 후 DB 관련 dependencies를 설정하지 않아서 뜨는 오류입니다.

 

해결 방법: 

 

build.gradle 파일에 아래와 같은 내용을 추가해줍니다.

그리고, /src/main/resources/application.properties 안에 다음과 같은 DB 정보를 입력해주도록 합니다.

 

이후에 다시 실행해주면 성공하는 코드가 나타나야 합니다 !

 

 

5. 이제 jsp 파일을 생성해서 실행해보도록 하겠습니다.

 

아래와 같이 없는 디렉토리들을 생성해준 후 views 디렉토리 아래 테스트해볼 jsp파일을 생성해주고 안에 내용은 자신의 기호에 맞게 작성해주도록 합니다.

 

저는 아래와 같이 만들어 주었습니다.

 

<spring.jsp>

 

그 다음으로 controller 파일을 생성해주도록 하겠습니다.

 

* 중간에 디자인이 바뀐점은 제가 테마를 바꿔서 그렇습니다.

 

<testcontroller.java>

 

6. /src/main/resources/application.properties 에 다시 아래와 같은 내용을 추가 해줍니다.

 

 

이렇게 하고 실행이 되어야하는데 이러한 에러와 로그가 발생합니다.

 

해결 방법 :

 

build.gradle  dependencies 안에 내용을 추가해줍니다.

제가 공부하고자 포스팅하지만 혹시나 검색 도중 필요하신 분이 계시다면 복사 붙여넣기가 가능하실 수 있게 스크린샷이 아닌 코드블럭으로 작성하겠습니다.

	compile('org.apache.tomcat.embed:tomcat-embed-jasper')
	compile('javax.servlet:jstl:1.2')

* 주의 * 작성하신 후 해당 프로젝트 우클릭 [Gradle] -> [Refresh Gradle Project] 해주셔야합니다.

 

 

위와 같이 자신이 views 안에 만든 .jsp 파일이 정상적으로 실행되면 성공한 것입니다.

반응형

+ Recent posts