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_tableuser_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

BoardMappergetInfo 메서드를 호출하여 콘텐츠 세부 정보를 가져옴

public Content getInfo(int content_idx) {
    return boardMapper.getInfo(content_idx);
}

BoardService

BoardDaogetInfo 메서드를 호출하여 콘텐츠 세부 정보를 가져옴

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

+ Recent posts