Controller
package kr.or.ddit.controller.noticeboard.web;
import java.util.HashMap;
import java.util.Map;
import javax.inject.Inject;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import kr.or.ddit.ServiceResult;
import kr.or.ddit.controller.noticeboard.service.INoticeService;
import kr.or.ddit.vo.NoticeVO;
@Controller
@RequestMapping("/notice")
public class NoticeInsertController {
@Inject
private INoticeService noticeService;
**// 등록 폼으로 이동하는 메소드**
@RequestMapping(value="/form.do", method = RequestMethod.GET)
public String noticeInsertForm() {
return "notice/form";
}
**// 게시글 등록하는 메소드**
@RequestMapping(value="/insert.do", method = RequestMethod.POST)
public String noticeInsert(
HttpServletRequest req,
RedirectAttributes ra,
NoticeVO noticeVO, Model model) {
String goPage = "";
Map<String, String> errors = new HashMap<String, String>();
if(StringUtils.isBlank(noticeVO.getBoTitle())) {
errors.put("boTitle", "제목을 입력해주세요.");
}
if(StringUtils.isBlank(noticeVO.getBoContent())) {
errors.put("boContent", "내용을 입력해주세요");
}
if(errors.size() > 0) { // 에러가 발생
model.addAttribute("errors", errors);
model.addAttribute("noticeVO", noticeVO);
goPage = "notice/form";
}else {
HttpSession session = req.getSession();
DDITMemberVO memberVO = (DDITMemberVO) session.getAttribute("SessionInfo");
if(memberVO != null) {
noticeVO.setBoWriter(memberVO.getMemId()); // 로그인 한 상용자 아이디로 작성자 셋팅
ServiceResult result = noticeService.insertNotice(noticeVO);
if(result.equals(ServiceResult.OK)) {
goPage = "redirect:/notice/detail.do?boNo="+noticeVO.getBoNo();
}else {
model.addAttribute("message", "서버에러, 다시 시도해주세요!");
goPage = "notice/form";
}
}else {
ra.addFlashAttribute("message","로그인 후에 사용 가능합니다.");
goPage = "redirect:/notice/login.do";
}
}
return goPage;
}
}
TelegramSendController.java
package kr.or.ddit.controller.noticeboard.web;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.beans.propertyeditors.URLEditor;
import org.springframework.stereotype.Controller;
@Controller
public class TelegramSendController {
public void sendGet(String name, String title) throws IOException {
String chatId = "-987525737";
String urlName = "<https://api.telegram.org/bot5808216277:AAFCJNEm3y8vd5QBpUAoE0vjONDjtRp7Nec/sendMessage>";
String text = "";
SimpleDateFormat format1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date time = new Date();
String timeStr = format1.format(time);
text = name + "님께서 글작성을 완료!\\n" +
"[제목]:" + title + "\\n" +
"[작성일]" + timeStr + "\\n";
URL url = new URL(urlName + "?chat_id="+chatId+"&text="+URLEncoder.encode(text, "UTF-8"));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("User-Agent", "Mozilla/5.0");
int respCode = conn.getResponseCode();
System.out.println("[상태코드] : " + respCode);
}
}
Service
package kr.or.ddit.controller.noticeboard.service;
import javax.inject.Inject;
import org.apache.commons.io.input.TaggedInputStream;
import org.springframework.stereotype.Service;
import kr.or.ddit.ServiceResult;
import kr.or.ddit.controller.noticeboard.web.TelegramSendController;
import kr.or.ddit.mapper.NoticeMapper;
import kr.or.ddit.vo.NoticeVO;
@Service
public class NoticeServiceImpl implements INoticeService {
@Inject
private NoticeMapper noticeMapper;
TelegramSendController tst = new TelegramSendController();
@Override
public ServiceResult insertNotice(NoticeVO noticeVO) {
ServiceResult result = null;
int status = noticeMapper.insertNotice(noticeVO);
if(status > 0) {
// 성공 했다는 메시지를 텔레그램 BOT API를 이용하여 알림!
try {
tst.sendGet("조성희", noticeVO.getBoTitle());
} catch (Exception e) {
e.printStackTrace();
}
result = ServiceResult.OK;
}else {
result = ServiceResult.FAILED;
}
return result;
}
}
Mapper
package kr.or.ddit.mapper;
import kr.or.ddit.vo.NoticeVO;
public interface NoticeMapper {
public int insertNotice(NoticeVO noticeVO);
}
NoticeMapper (SQL)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"<https://mybatis.org/dtd/mybatis-3-mapper.dtd>">
<mapper namespace="kr.or.ddit.mapper.NoticeMapper">
**<!-- 공지사항 등록하는 쿼리 -->**
<insert id="insertNotice" parameterType="noticeVO" useGeneratedKeys="true">
<selectKey keyProperty="boNo" resultType="int" order="BEFORE">
select seq_notice.nextval from dual
</selectKey>
insert into notice(
bo_no, bo_title, bo_content, bo_writer, bo_date
)values(
#{boNo}, #{boTitle}, #{boContent}, #{boWriter}, sysdate
)
</insert>
</mapper>
JSP 페이지
<%@page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@ taglib uri="<http://tiles.apache.org/tags-tiles>" prefix="tiles" %>
<%@ taglib uri="<http://java.sun.com/jsp/jstl/core>" prefix="c" %>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>AdminLTE 3 | Simple Tables</title>
<link rel="stylesheet" href="<https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback>">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/plugins/fontawesome-free/css/all.min.css">
<link rel="stylesheet" href="${pageContext.request.contextPath }/resources/dist/css/adminlte.min.css">
<script src="${pageContext.request.contextPath }/resources/plugins/jquery/jquery.min.js"></script>
<script src="${pageContext.request.contextPath }/resources/ckeditor/ckeditor.js"></script>
</head>
<c:if test="${not empty message }">
<script type="text/javascript">
alert("${message}");
<c:remove var="message" scope="request"/>
<c:remove var="message" scope="session"/>
</script>
</c:if>
<body class="hold-transition sidebar-mini">
<div class="wrapper">
<!-- header 영역 -->
<tiles:insertAttribute name="header"/>
<div class="content-wrapper">
<!-- content 영역 -->
<tiles:insertAttribute name="content"/>
</div>
<!-- footer 영역 -->
<tiles:insertAttribute name="footer"/>
<aside class="control-sidebar control-sidebar-dark">
</aside>
</div>
<script src="${pageContext.request.contextPath }/resources/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="${pageContext.request.contextPath }/resources/dist/js/adminlte.min.js"></script>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<section class="content-header">
<div class="container-fluid">
<div class="row mb-2">
<div class="col-sm-6">
<h1>공지사항 상세보기</h1>
</div>
<div class="col-sm-6">
<ol class="breadcrumb float-sm-right">
<li class="breadcrumb-item"><a href="#">DDIT HOME</a></li>
<li class="breadcrumb-item active">공지사항 등록</li>
</ol>
</div>
</div>
</div>
</section>
<section class="content">
<div class="row">
<div class="col-md-12">
<div class="card card-primary">
<form action="/notice/insert.do" method="post" id="noticeForm">
<div class="card-header">
<h3 class="card-title">공지사항 등록</h3>
<div class="card-tools"></div>
</div>
<div class="card-body">
<div class="form-group">
<label for="inputName">제목을 입력해주세요</label>
<input type="text" id="boTitle" name="boTitle" class="form-control" placeholder="제목을 입력해주세요">
</div>
<div class="form-group">
<label for="boContent">내용을 입력해주세요</label>
<textarea id="boContent" name="boContent" class="form-control" rows="14"></textarea>
</div>
<div class="form-group">
<div class="custom-file">
<label for="inputDescription">파일 선택</label>
<input type="file" class="custom-file-input" id="customFile">
<label class="custom-file-label" for="customFile">파일을 선택해주세요</label>
</div>
</div>
</div>
<div class="card-footer bg-white">
<ul class="mailbox-attachments d-flex align-items-stretch clearfix">
<li><span class="mailbox-attachment-icon"><i
class="far fa-file-pdf"></i></span>
<div class="mailbox-attachment-info">
<a href="#" class="mailbox-attachment-name"><i
class="fas fa-paperclip"></i> Sep2014-report.pdf</a> <span
class="mailbox-attachment-size clearfix mt-1"> <span>1,245
KB</span> <a href="#" class="btn btn-default btn-sm float-right"><i
class="fas fa-times"></i></a>
</span>
</div></li>
<li><span class="mailbox-attachment-icon"><i
class="far fa-file-word"></i></span>
<div class="mailbox-attachment-info">
<a href="#" class="mailbox-attachment-name"><i
class="fas fa-paperclip"></i> App Description.docx</a> <span
class="mailbox-attachment-size clearfix mt-1"> <span>1,245
KB</span> <a href="#" class="btn btn-default btn-sm float-right"><i
class="fas fa-times"></i></a>
</span>
</div></li>
<li><span class="mailbox-attachment-icon has-img"><img
src="../../dist/img/photo1.png" alt="Attachment"></span>
<div class="mailbox-attachment-info">
<a href="#" class="mailbox-attachment-name"><i
class="fas fa-camera"></i> photo1.png</a> <span
class="mailbox-attachment-size clearfix mt-1"> <span>2.67
MB</span> <a href="#" class="btn btn-default btn-sm float-right"><i
class="fas fa-times"></i></a>
</span>
</div></li>
<li><span class="mailbox-attachment-icon has-img"><img
src="../../dist/img/photo2.png" alt="Attachment"></span>
<div class="mailbox-attachment-info">
<a href="#" class="mailbox-attachment-name"><i
class="fas fa-camera"></i> photo2.png</a> <span
class="mailbox-attachment-size clearfix mt-1"> <span>1.9
MB</span> <a href="#" class="btn btn-default btn-sm float-right"><i
class="fas fa-times"></i></a>
</span>
</div></li>
</ul>
</div>
<div class="card-footer bg-white">
<div class="row">
<div class="col-12">
<input type="button" id="listBtn" value="목록" class="btn btn-success float-right">
<input type="button" id="insertBtn" value="등록" class="btn btn-primary float-right">
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</section>
<script>
$(function(){
CKEDITOR.replace("boContent", {
footnotesPrefix: "a",
filebrowserUploadUrl: '/imageUpload.do'
});
var listBtn = $("#listBtn");
var insertBtn = $("#insertBtn");
listBtn.on("click", function(){
location.href = "/notice/list.do"
})
insertBtn.on("click", function(){
var title = $("#boTitle"); // 제목
var content = CKEDITOR.instance.boContent.getDate(); //내용
if(title == null || title == ""){
alert("제목을 입력해주세요.")
return false;
}
if(content == null || content == ""){
alert("내용을 입력해주세요.")
return false;
}
noticeForm.submit();
})
})
</script>