728x90
게시판 시스템에서 특정 콘텐츠의 정보를 조회하고 표시하는 기능
Main.jsp
<tbody>
<c:forEach var="obj" items="${contentLi}">
<tr>
<td class="text-center d-none d-md-table-cell">${obj.content_idx}
</td>
<td><a href="${root }board/read?board_info_idx=${board_info_idx}
&content_idx=${obj.content_idx}&page=${page}">${obj.content_subject}</a>
</td>
<td class="text-center d-none d-md-table-cell">${obj.content_writer_name }
</td>
<td class="text-center d-none d-md-table-cell">${obj.content_date}
</td>
</tr>
BoardController
@GetMapping("/read")
public String read(
@RequestParam("board_info_idx") int board_info_idx,
@RequestParam("content_idx") int content_idx,
@RequestParam("page") int page,
Model model)
{
model.addAttribute("board_info_idx", board_info_idx);
model.addAttribute("content_idx", content_idx);
return "board/read";
}
BoardMapper
content_table과 user_table을 조인하여 콘텐츠와 작성자에 대한 세부 정보를 가져온다.
쿼리문 추가
@Select("SELECT a2.user_name AS content_writer_name, " +
"DATE_FORMAT(a1.content_date, '%Y-%m-%d') AS content_date, " +
"a1.content_subject, a1.content_text, a1.content_writer_idx " +
"FROM content_table a1 JOIN user_table a2 " +
"ON a1.content_writer_idx = a2.user_idx " +
"WHERE content_idx = #{content_idx}")
Content getInfo(int content_idx);
BoardDao
BoardMapper의 getInfo 메서드를 호출하여 콘텐츠 세부 정보를 가져옴
public Content getInfo(int content_idx) {
return boardMapper.getInfo(content_idx);
}
BoardService
BoardDao의 getInfo 메서드를 호출하여 콘텐츠 세부 정보를 가져옴
public Content getInfo(int content_idx) {
return boardDao.getInfo(content_idx);
}
BoardController(코드추가)
BoardController에서는 특정 콘텐츠의 상세 페이지 요청을 처리하는 메서드를 가지고 있다.
이 메서드는 content_idx를 기반으로 콘텐츠의 세부 정보를 가져와 모델에 추가한다.
- 파라미터: 이 메서드는 요청 URL에서 board_info_idx, content_idx, page를 받아온다.
- 모델 속성: 이 파라미터들과 조회된 콘텐츠(readContent)를 모델에 추가하여 뷰에서 사용할 수 있게 한다.
@GetMapping("/read")
public String read(
@RequestParam("board_info_idx") int board_info_idx,
@RequestParam("content_idx") int content_idx,
@RequestParam("page") int page,
Model model)
{
model.addAttribute("board_info_idx", board_info_idx);
model.addAttribute("content_idx", content_idx);
Content readContent = boardService.getInfo(content_idx);
model.addAttribute("readContent",readContent);
model.addAttribute("loginBean", loginBean);
model.addAttribute("page", page);
return "board/read";
}
Controller에 loginBean 추가해서 주입받게함
Read.jsp
에서 표시되는것들을 다 자동으로 주입되게 바꿈
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="root" value="${pageContext.request.contextPath }/"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fighting, Our Class</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp"/>
<div class="container" style="margin-top: 100px">
<div class="card shadow">
<div class="card-body">
<div class="form-group">
<label for="board_writer_name">Writer</label>
<input type="text" value="${readContent.content_writer_name}" disabled="disabled" class="form-control"
id="board_writer_name" name="board_writer_name"/>
</div>
<div class="form-group">
<label for="board_date">Date</label>
<input type="text" value="${readContent.content_date}" disabled="disabled" class="form-control"
id="board_date" name="board_date"/>
</div>
<div class="form-group">
<label for="board_subject">Subject</label>
<input type="text" value="${readContent.content_subject}" disabled="disabled" class="form-control"
id="board_subject" name="board_subject"/>
</div>
<div class="form-group">
<label for="board_content">Content</label>
<textarea style="resize: none" rows="10" disabled="disabled"
class="form-control" id="board_content"
name="board_content">${readContent.content_text}</textarea>
</div>
<div class="form-group">
<div class="text-right">
<a href="${root }board/main?board_info_idx=${board_info_idx}&{page}=${page}"
class="btn btn-primary">List</a>
<c:if test="${loginBean.user_idx == readContent.content_writer_idx}">
<a href="${root }board/modify?board_info_idx=${board_info_idx}&content_idx=${content_idx}&page=${page}"
class="btn btn-info">Modify</a>
<a href="${root }board/delete?board_info_idx=${board_info_idx}&content_idx=${content_idx}"
class="btn btn-danger">Delete</a>
</c:if>
</div>
</div>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp"/>
</body>
</html>
write_success
코드추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="root" value="${pageContext.request.contextPath }/"/>
<script>
alert('Saved Successfully.')
location.href = "${root}board/read?board_info_idx=${writeBean.content_board_idx}&content_idx=${writeBean.content_idx}&page=1"
</script>
WriterInterceptor
(작성자 외 다른이가 수정,삭제 하지 못하도록)
package kr.bit.interceptor;
import kr.bit.beans.Content;
import kr.bit.beans.User;
import kr.bit.service.BoardService;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class WriterInterceptor implements HandlerInterceptor {
private User loginBean;
private BoardService boardService;
//인터셉터는 주입 불가
//게시글 작성자가 아닌 다른 살마이 수정, 삭제를 하지 못하도록
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String str = request.getParameter("content_idx");
int content_idx = Integer.parseInt(str);
Content con = boardService.getInfo(content_idx);
if (con.getContent_writer_idx() != loginBean.getUser_idx()) {
String str2 = request.getContextPath();
response.sendRedirect(str2 + "/board/not_writer");
return false;
}
return true;
}
}
BoardController
매핑작업 추가
@GetMapping("/not_wirter")
public String not_wirter() {
return "not_writer";
}
}
not_writer.jsp 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<c:set var="root" value="${pageContext.request.contextPath }/" />
<script>
alert('Invalid access.')
location.href="${root}main"
</script>
ServletAppContext
코드 추가
boardService, loginBean 주입
WriterInterceptor 추가
package kr.bit.config;
import kr.bit.beans.User;
import kr.bit.interceptor.LoginInterceptor;
import kr.bit.interceptor.TopMenuInterceptor;
import kr.bit.interceptor.WriterInterceptor;
import kr.bit.mapper.BoardMapper;
import kr.bit.mapper.TopMenuMapper;
import kr.bit.mapper.UserMapper;
import kr.bit.service.BoardService;
import kr.bit.service.TopMenuService;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.context.support.ReloadableResourceBundleMessageSource;
import org.springframework.web.servlet.config.annotation.*;
import javax.annotation.Resource;
@Configuration
@EnableWebMvc
@ComponentScan("kr.bit.controller")
@ComponentScan("kr.bit.dao")
@ComponentScan("kr.bit.service")
@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer {
@Value("${db.classname}")
private String db_classname;
@Value("${db.url}")
private String db_url;
@Value("${db.username}")
private String db_username;
@Value("${db.password}")
private String db_password;
@Autowired
private TopMenuService topMenuService; //@service
@Resource(name = "loginBean")
private User loginBean; // 로그인 여부에 따라 상단메뉴바가 다르게 보이도록 하기위해 주입받음
@Autowired
private BoardService boardService;
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
WebMvcConfigurer.super.configureViewResolvers(registry);
registry.jsp("/WEB-INF/views/", ".jsp");
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
registry.addResourceHandler("/**").addResourceLocations("/resources/");
}
@Bean
public BasicDataSource dataSource() {
BasicDataSource source = new BasicDataSource();
source.setDriverClassName(db_classname);
source.setUrl(db_url);
source.setUsername(db_username);
source.setPassword(db_password);
return source;
}
@Bean
public SqlSessionFactory factory(BasicDataSource source) throws Exception {
SqlSessionFactoryBean fac = new SqlSessionFactoryBean();
fac.setDataSource(source);
SqlSessionFactory factory = fac.getObject();
return factory;
}
@Bean
public MapperFactoryBean<BoardMapper> board_mapper(SqlSessionFactory factory) throws Exception {
MapperFactoryBean<BoardMapper> fac =
new MapperFactoryBean<BoardMapper>(BoardMapper.class);
fac.setSqlSessionFactory(factory);
return fac;
}
@Bean
public MapperFactoryBean<TopMenuMapper> top_mapper(SqlSessionFactory factory) throws Exception {
MapperFactoryBean<TopMenuMapper> fac =
new MapperFactoryBean<TopMenuMapper>(TopMenuMapper.class);
fac.setSqlSessionFactory(factory);
return fac;
}
@Bean
public MapperFactoryBean<UserMapper> user_mapper(SqlSessionFactory factory) throws Exception {
MapperFactoryBean<UserMapper> fac =
new MapperFactoryBean<UserMapper>(UserMapper.class);
fac.setSqlSessionFactory(factory);
return fac;
}
//인터셉터 -> 등록
public void addInterceptors(InterceptorRegistry re) {
WebMvcConfigurer.super.addInterceptors(re);
TopMenuInterceptor top = new TopMenuInterceptor(topMenuService, loginBean);
InterceptorRegistration re1 = re.addInterceptor(top);//TopMenuInterceptor등록
re1.addPathPatterns("/**"); //모든경로로 매핑해도 다 뜨도록..컨트롤러 전에 preHandle
LoginInterceptor login = new LoginInterceptor(loginBean);
InterceptorRegistration re2 = re.addInterceptor(login); // LoginInterceptor등록
re2.addPathPatterns("/user/modify", "/user/logout", "/board/*");
// 이 주소로 들어가기 전에 로그인 여부를 알아내서 로그인이 안되어있다면 user/not_login 으로 강제이동
re2.excludePathPatterns("/board/main");
WriterInterceptor writer = new WriterInterceptor(loginBean, boardService);
InterceptorRegistration re3 = re.addInterceptor(writer);
re3.addPathPatterns("/board/modify", "/board/delete");
}
@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
@Bean
public ReloadableResourceBundleMessageSource messageSource() {
ReloadableResourceBundleMessageSource res =
new ReloadableResourceBundleMessageSource();
res.setBasename("/WEB-INF/properties/error");
return res;
}
}
게시글 수정
modify.jsp
form으로 변환
modifyBean 코드 추가
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="root" value="${pageContext.request.contextPath }/"/>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Fighting, Our Class</title>
<!-- Bootstrap CDN -->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.0/umd/popper.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.1.0/js/bootstrap.min.js"></script>
</head>
<body>
<c:import url="/WEB-INF/views/include/top_menu.jsp"/>
<div class="container" style="margin-top: 100px">
<div class="card shadow">
<div class="card-body">
<form:form action="${root }board/modify_pro" method="post" modelAttribute="modifyBean">
<form:hidden path="content_idx"/>
<form:hidden path="content_board_idx"/>
<input type="hidden" name="page" value="${page}">
<div class="form-group">
<form:label path="content_writer_name">Writer</form:label>
<form:input readonly="true" class="form-control" path="content_writer_name"/>
</div>
<div class="form-group">
<form:label path="board_date">Date</form:label>
<form:input class="form-control" path="content_date" readonly="true"/>
</div>
<div class="form-group">
<form:label path="content_subject">Subject</form:label>
<form:input class="form-control" path="content_subject"/>
<form:errors path="content_subject" style='color:red'/>
</div>
<div class="form-group">
<form:label path="content_text">Content</form:label>
<form:textarea class="form-control" path="content_text"
rows="10" style="resize:none"></form:textarea>
<form:errors path="content_text" style='color:red'/>
</div>
<div class="form-group">
<div class="text-right">
<button type="submit" class="btn btn-primary">Complete Modification</button>
<a href="${root }board/read?board_info_idx=${board_info_idx}&content_idx=${content_idx}&page=${page}" class="btn btn-info">Cancel</a>
</div>
</div>
</form:form>
</div>
</div>
</div>
<c:import url="/WEB-INF/views/include/bottom_menu.jsp"/>
</body>
</html>
BoardController
modify 매핑
@GetMapping("/modify")
//매핑 및 요청 파라미터:
public String modify(@RequestParam("board_info_idx") int board_info_idx,
@RequestParam("content_idx") int content_idx,
@RequestParam("page") int page,
@ModelAttribute("modifyBean") Content modifyBean,
Model model) {
//모델에 데이터 추가:
model.addAttribute("board_info_idx", board_info_idx);
model.addAttribute("content_idx", content_idx);
model.addAttribute("page", page);
//수정할 글정보 ( 작성자, 제목 etc..) 를 가져와서 업데이트 시킨 후 출력함
Content temp = boardService.getInfo(content_idx);
//폼 데이터 설정:
modifyBean.setContent_writer_name(temp.getContent_writer_name());
modifyBean.setContent_date(temp.getContent_date());
modifyBean.setContent_subject(temp.getContent_subject());
modifyBean.setContent_text(temp.getContent_text());
modifyBean.setContent_writer_idx(temp.getContent_writer_idx());
modifyBean.setContent_board_idx(board_info_idx);
modifyBean.setContent_idx(content_idx);
//뷰 반환:
return "board/modify";
}
매핑 및 요청 파라미터:
- @GetMapping("/modify"): /modify URL로 GET 요청이 들어오면 이 메서드가 실행됨
- @RequestParam: URL에서 board_info_idx, content_idx, page 파라미터를 받아옴
- @ModelAttribute("modifyBean"): modifyBean이라는 이름으로 모델에 바인딩된 폼 데이터를 사용
modify_pro 추가
@PostMapping("/modify_pro")
public String modify_pro(@Valid @ModelAttribute("modifyBean") Content modifyBean,
BindingResult result,
@RequestParam("page") int page, Model model) {
model.addAttribute("page", page);
if(result.hasErrors()) {
return "board/modify";
}
// boardService.modifyInfo(modifyBean);
return "board/modify_success";
}
BoardMapper
쿼리문 추가
- 게시물의 수정이 있을 때 게시물 테이블을 업데이트하는 쿼리문을 실행하는 메소드(제목, 내용, 게시물 번호)
- ModifyContentBean을 매개변수로 한다.
@Update("UPDATE content_table " + "SET content_subject = #{content_subject}, "
+ "content_text = #{content_text} " + "WHERE content_idx = #{content_idx}")
void modifyInfo(Content modifyContentBean);
}
BoardDao
public void modifyInfo(Content modifyBean) {
boardMapper.modifyInfo(modifyBean);
}
BoardService
public void modifyInfo(Content modifyBean) {
boardDao.modifyInfo(modifyBean);
}
modify_success
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<c:set var="root" value="${pageContext.request.contextPath }/"/>
<script>
alert("Your Post has been updated")
location.href = "${root}board/read?board_info_idx=${modifyBean.content_board_idx}&content_idx=${modifyBean.content_idx}&page=${page}"
</script>
728x90
'Frameworks > Spring' 카테고리의 다른 글
[Spring] BOARD CRUD 기능 설명 (0) | 2024.05.17 |
---|---|
[Spring] Board CRUD (Board Delete, Page ) (0) | 2024.05.17 |
[Spring] Board CRUD (Modify, Update List, Page) (0) | 2024.05.16 |
[Spring] Board CRUD (Login(orNot) TopMenu/ Modify) (0) | 2024.05.16 |
[Spring] Board CRUD (Validator + DB insert) III (0) | 2024.05.14 |