1월 2023 | ||||||
---|---|---|---|---|---|---|
일 | 월 | 화 | 수 | 목 | 금 | 토 |
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | <sec:authorize access= "isAnonymous()" ><!-- 로그인 안한 유저 --> <c:choose> <c:when test= "${not empty q.password}" > <a href= "#" class = "pop_klover" onclick= "pop_klover(this, '#klover-layer')" data-board_id= "${q.board_id}" data-subject= "${q.subject}" data-href= "board/qna/qnaDetail?board_id=${q.board_id}&pageNum=${page.currentPage}&field=${field}&word=${word}" >${q.subject}</a> </c:when> <c:otherwise> <a href= "board/qna/qnaDetail?board_id=${q.board_id}&pageNum=${page.currentPage}&field=${field}&word=${word}" >${q.subject}</a> </c:otherwise> </c:choose> </sec:authorize> <sec:authorize access= "isAuthenticated()" > <sec:authorize access= "hasRole('ROLE_MEMBER')" ><!-- 일반유저 --> <c:choose> <c:when test= "${not empty q.password}" > <a href= "#" class = "pop_klover" onclick= "pop_klover(this, '#klover-layer')" data-board_id= "${q.board_id}" data-subject= "${q.subject}" data-href= "board/qna/qnaDetail?board_id=${q.board_id}&pageNum=${page.currentPage}&field=${field}&word=${word}" >${q.subject}</a> </c:when> <c:otherwise> <a href= "board/qna/qnaDetail?board_id=${q.board_id}&pageNum=${page.currentPage}&field=${field}&word=${word}" >${q.subject}</a> </c:otherwise> </c:choose> </sec:authorize> <sec:authorize access= "hasRole('ROLE_ADMIN')" > <!-- 관리자 --> <a href= "board/qna/qnaDetail?board_id=${q.board_id}&pageNum=${page.currentPage}&field=${field}&word=${word}" >${q.subject}</a> </sec:authorize> </sec:authorize> |
2022-11-16 14:49:12
UTF 한글 깨짐
@GetMapping("/listall/{prodNum}") public ResponseEntity<?> listSellerReviewAll(@PathVariable Integer prodNum , PageMaker pageMaker) throws Exception{ log.info(" pageMaker {}" , pageMaker.getPage()); pageMaker.setProdNum(prodNum); pageMaker.setPerPageNum(5); //전체 갯수 가져오기 int totalCount=serllerReviewService.listSellerReviewAllTotalCount(pageMaker); pageMaker.setTotalCount(totalCount); List<SellerReviewVO> serList=serllerReviewService.listSellerReviewAll(pageMaker); Map<String, Object> map=new LinkedHashMap<String, Object>(); String pagination=pageMaker.bootStrapPagingSearchHTML("/api/review/listall/"+prodNum); map.put("code","success"); map.put("totalCount", totalCount); map.put("pageMaker", pageMaker); map.put("serList", serList); map.put("pagination", pagination); log.info( "list : {}" , serList.size() ); HttpHeaders responHeaders=new HttpHeaders(); responHeaders.add("Content-Type", "text/html;charset=utf-8"); return new ResponseEntity(new ObjectMapper().writeValueAsString(map), responHeaders, HttpStatus.OK); }
2022-11-14 23:34:57
그래들 WAR 파일로 배포
1 . SpringBootServletInitializer 추가
다음과 같은 형식으로 변경
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; @SpringBootApplication public class Application extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(PcwApplication.class, args); } protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(Application.class); } }
2. build.gradle 변경
id 'war' 추가
plugins { id 'org.springframework.boot' version '2.7.0' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'eclipse' id 'war' }
war 플러그인 추가
apply plugin:'war'
bootWar 추가
bootWar { archiveName 'ROOT.war' archiveBaseName = "ROOT" archiveFileName = "ROOT.war" archiveVersion = "0.0.0" }
spring-boot-starter-tomcat 추가
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
build.gradle 전체 샘플 예
plugins { id 'org.springframework.boot' version '2.7.5' id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'java' id 'eclipse' id 'war' } group = 'com.sample' version = '0.0.1-SNAPSHOT' apply plugin:'war' sourceCompatibility = '11' configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } bootWar { archiveName 'ROOT.war' archiveBaseName = "ROOT" archiveFileName = "ROOT.war" archiveVersion = "0.0.0" } dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.2' compileOnly 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'mysql:mysql-connector-java' annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' implementation 'org.apache.tomcat.embed:tomcat-embed-jasper' implementation 'javax.servlet:jstl:1.2' implementation 'org.jsoup:jsoup:1.15.1' implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.4' implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16' providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat' } tasks.named('test') { useJUnitPlatform() }
3. Gradle Tasks 메뉴 에서 bootWar 를 클릭해서 빌드
Navigator 메뉴와 Gradle Tasks 메뉴가 없다면
window -> show view 에서 Navigator 메뉴와 Gradle Tasks 를 연다.
Gradle Tasks 메뉴 에서 bootWar 를 클릭
Navigator 에서 build -> libs 디렉토리에 빌드된 ROOT.war 파일이 생성 된다.
2022-11-13 03:17:17
공통 에러 페이지
<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> <!DOCTYPE html> <html lang="ko" > <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Error</title> <style> @import url('https://fonts.googleapis.com/css?family=Creepster|Nosifer|Roboto'); html {background-color: #000121;font-family: 'Roboto', sans-serif; } .maincontainer{position:relative;top:-50px;transform:scale(0.8);background:url("https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/HauntedHouseBackground.png");background-repeat:no-repeat;background-position:center;background-size:700px 600px;width:800px;height:600px;margin:0px auto;display:grid} .foregroundimg{position:relative;width:100%;top:-230px;z-index:5} .errorcode{position:relative;top:-200px;font-family:'Creepster',cursive;color:white;text-align:center;font-size:6em;letter-spacing:0.1em} .errortext{position:relative;top:-260px;color:#FBD130;text-align:center;text-transform:uppercase;font-size:1.8em} .bat {opacity: 0;position: relative;transform-origin: center;z-index: 3;} .bat:nth-child(1){top:380px;left:120px;transform:scale(0.5);animation:13s 1s flyBat1 infinite linear} .bat:nth-child(2){top:280px;left:80px;transform:scale(0.3);animation:8s 4s flyBat2 infinite linear} .bat:nth-child(3) { top: 200px; left: 150px; transform: scale(0.4);animation: 12s 2s flyBat3 infinite linear;} .body {position: relative;width: 50px;top: 12px;} .wing {width: 150px;position: relative;transform-origin: right center;} .leftwing {left: 30px;animation: 0.8s flapLeft infinite ease-in-out;} .rightwing {left: -180px;transform: scaleX(-1);animation: 0.8s flapRight infinite ease-in-out;} @keyframes flapLeft { 0% { transform: rotateZ(0); } 50% { transform: rotateZ(10deg) rotateY(40deg); } 100% { transform: rotateZ(0); } } @keyframes flapRight { 0% { transform: scaleX(-1) rotateZ(0); } 50% { transform: scaleX(-1) rotateZ(10deg) rotateY(40deg); } 100% { transform: scaleX(-1) rotateZ(0); } } @keyframes flyBat1 { 0% { opacity: 1; transform: scale(0.5)} 25% { opacity: 1; transform: scale(0.5) translate(-400px, -330px) } 50% { opacity: 1; transform: scale(0.5) translate(400px, -800px) } 75% { opacity: 1; transform: scale(0.5) translate(600px, 100px) } 100% { opacity: 1; transform: scale(0.5) translate(100px, 300px) } } @keyframes flyBat2 { 0% { opacity: 1; transform: scale(0.3)} 25% { opacity: 1; transform: scale(0.3) translate(200px, -330px) } 50% { opacity: 1; transform: scale(0.3) translate(-300px, -800px) } 75% { opacity: 1; transform: scale(0.3) translate(-400px, 100px) } 100% { opacity: 1; transform: scale(0.3) translate(100px, 300px) } } @keyframes flyBat3 { 0% { opacity: 1; transform: scale(0.4)} 25% { opacity: 1; transform: scale(0.4) translate(-350px, -330px) } 50% { opacity: 1; transform: scale(0.4) translate(400px, -800px) } 75% { opacity: 1; transform: scale(0.4) translate(-600px, 100px) } 100% { opacity: 1; transform: scale(0.4) translate(100px, 300px) } } /*@media only screen and (max-width: 850px) { .maincontainer { transform: scale(0.6); width: 600px; height: 400px; background-size: 600px 400px; } .errortext { font-size: 1em; } }*/ a {text-decoration: none;color: #fff;margin: 30px;} a:hover {color: #cddb78;} </style> <script> window.console = window.console || function(t) {}; if (document.location.search.match(/type=embed/gi)) { window.parent.postMessage("resize", "*"); } </script> </head> <body translate="no" > <div class="maincontainer"> <div class="bat"> <img class="wing leftwing" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-wing.png"> <img class="body" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-body.png" alt="bat"> <img class="wing rightwing" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-wing.png"> </div> <div class="bat"> <img class="wing leftwing" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-wing.png"> <img class="body" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-body.png" alt="bat"> <img class="wing rightwing" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-wing.png"> </div> <div class="bat"> <img class="wing leftwing" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-wing.png"> <img class="body" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-body.png" alt="bat"> <img class="wing rightwing" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/bat-wing.png"> </div> <img class="foregroundimg" src="https://cdn.jsdelivr.net/gh/braverokmc79/dknbtech@v1.0.1/asset/img/error/HauntedHouseForeground.png" alt="haunted house"> </div> <h1 class="errorcode">ERROR</h1> <div class="errortext">오류발생알림화면 (허용되지 않는 요청을 하셨습니다.)<br> <a href="<c:url value="/" />" >홈으로 </a> <a class="btn btn-success" href="javascript:history.go(-1);">이전페이지 가기</a> </div> </body> </html>
2022-10-11 23:00:47
ObjectMapper 리스트 객체 넣기
라이브러리 추가
implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.12.4'
/** * 인덱스 메인화면 cache 데이터 상품 목록 가져오기 * @return * url :/api/mainProducts * @throws JsonProcessingException * @throws JsonMappingException */ @GetMapping(value = "/mainProducts") public ResponseEntity<?> mainProducts(DanawProductCrawling danawProductCrawling) throws Exception { String data=getIndexCachData(); if(data!=null && !data.equals("")) { ObjectMapper objectMapper =new ObjectMapper(); List<DanawProductDTO> getDataJson=objectMapper.readValue(data, new TypeReference<List<DanawProductDTO>>(){}); return ResponseEntity.status(HttpStatus.OK).body(getDataJson); } return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null); }
2022-10-01 10:09:46
macaronics.net 는 그어떠한 동영상, 이미지, 파일등을 직접적으로 업로드 제공을 하지 않습니다. 페이스북, 트위터 등 각종 SNS 처럼 macaronics.net 는 웹서핑을 통하여 각종 페이지위치등을 하이퍼링크, 다이렉트링크, 직접링크등으로 링크된 페이지 주소만을 수집 저장하여 제공하고 있습니다. 저장된 각각의 주소에 연결된 페이지등은 그 페이지에서 제공하는 "서버, 사이트" 상황에 따라 페이지와 내용이 삭제 중단 될 수 있으며 macaronics.net 과는 어떠한 연관 관련이 없음을 알려드립니다. 또한, 저작권에 관련된 문제있는 글이나 기타 저작권에 관련된 문제가 있는 것은 연락주시면 바로 삭제해 드리겠습니다.
댓글 ( 0)
댓글 남기기