lkd9125
1 year ago
23 changed files with 12411 additions and 22482 deletions
@ -1,11 +1,16 @@ |
|||||||
package com.palnet.biz.api.acnt.terms.model; |
package com.palnet.biz.api.acnt.terms.model; |
||||||
|
|
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Builder; |
||||||
import lombok.Data; |
import lombok.Data; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
|
||||||
@Data |
@Data |
||||||
public class AcntTermsRqModel{ |
@Builder |
||||||
|
@NoArgsConstructor |
||||||
private String siteCd; |
@AllArgsConstructor |
||||||
|
public class AcntTermsRqModel { |
||||||
private String langDivCd; |
private String siteCd; |
||||||
|
private String termsCtgryCd; |
||||||
|
private String langDivCd; |
||||||
} |
} |
||||||
|
@ -1,35 +1,24 @@ |
|||||||
package com.palnet.biz.api.acnt.terms.service; |
package com.palnet.biz.api.acnt.terms.service; |
||||||
|
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
import org.slf4j.Logger; |
|
||||||
import org.slf4j.LoggerFactory; |
|
||||||
import org.springframework.beans.factory.annotation.Autowired; |
|
||||||
import org.springframework.stereotype.Service; |
|
||||||
|
|
||||||
import com.palnet.biz.api.acnt.terms.model.AcntTermsRqModel; |
import com.palnet.biz.api.acnt.terms.model.AcntTermsRqModel; |
||||||
import com.palnet.biz.api.acnt.terms.model.AcntTermsRsModel; |
import com.palnet.biz.api.acnt.terms.model.AcntTermsRsModel; |
||||||
import com.palnet.biz.jpa.repository.pty.PtyTermsQueryRepository; |
import com.palnet.biz.jpa.repository.pty.PtyTermsQueryRepository; |
||||||
|
import lombok.RequiredArgsConstructor; |
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
@Slf4j |
||||||
|
@RequiredArgsConstructor |
||||||
@Service |
@Service |
||||||
public class AcntTermsService { |
public class AcntTermsService { |
||||||
|
|
||||||
private Logger logger = LoggerFactory.getLogger(getClass()); |
private final PtyTermsQueryRepository query; |
||||||
|
|
||||||
// @Autowired
|
public List<AcntTermsRsModel> list(AcntTermsRqModel rq) { |
||||||
// private CtrCntrlBasRepository ctrCntrlBasRepository;
|
return query.list(rq); |
||||||
|
} |
||||||
@Autowired |
|
||||||
private PtyTermsQueryRepository query; |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public List<AcntTermsRsModel> list(AcntTermsRqModel rq){ |
|
||||||
|
|
||||||
List<AcntTermsRsModel> resultList = query.list(rq); |
|
||||||
|
|
||||||
return resultList; |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
} |
} |
||||||
|
@ -0,0 +1,26 @@ |
|||||||
|
package com.palnet.biz.api.bas.flight.model; |
||||||
|
|
||||||
|
import com.fasterxml.jackson.annotation.JsonIgnore; |
||||||
|
import lombok.AllArgsConstructor; |
||||||
|
import lombok.Builder; |
||||||
|
import lombok.Data; |
||||||
|
import lombok.NoArgsConstructor; |
||||||
|
|
||||||
|
/** |
||||||
|
* packageName : com.palnet.biz.api.bas.flight.model |
||||||
|
* fileName : BasFlightPlanErrorRS |
||||||
|
* author : dhji |
||||||
|
* date : 2023-09-19(019) |
||||||
|
* description : |
||||||
|
* =========================================================== |
||||||
|
* DATE AUTHOR NOTE |
||||||
|
* ----------------------------------------------------------- |
||||||
|
* 2023-09-19(019) dhji 최초 생성 |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@Builder |
||||||
|
@NoArgsConstructor |
||||||
|
@AllArgsConstructor |
||||||
|
public class BasFlightPlanCreateRs { |
||||||
|
private String pdfUrl; |
||||||
|
} |
@ -0,0 +1,109 @@ |
|||||||
|
package com.palnet.biz.api.bas.flight.template.service; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.StringReader; |
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.nio.file.Paths; |
||||||
|
import java.time.Instant; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Map.Entry; |
||||||
|
|
||||||
|
import javax.transaction.Transactional; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.stereotype.Service; |
||||||
|
|
||||||
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
||||||
|
import com.palnet.biz.api.bas.flight.template.vo.LaancPdfVO; |
||||||
|
import com.palnet.biz.jpa.entity.ComFileBas; |
||||||
|
import com.palnet.biz.jpa.repository.com.ComFileBasRepository; |
||||||
|
import com.palnet.comn.utils.InstantUtils; |
||||||
|
import com.palnet.comn.utils.PdfUtils; |
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j; |
||||||
|
|
||||||
|
@Service |
||||||
|
@Slf4j |
||||||
|
public class TemplateService { |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private PdfUtils pdfUtils; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private JwtTokenUtil jwtTokenUtil; |
||||||
|
|
||||||
|
@Autowired |
||||||
|
private ComFileBasRepository comFileBasRepository; |
||||||
|
|
||||||
|
@Value("${base-url}") |
||||||
|
private String BASE_PATH; |
||||||
|
|
||||||
|
private final String FILE_EXTENSION = ".pdf"; |
||||||
|
|
||||||
|
/** |
||||||
|
* 파일명 만들기, 앞에 기본으로 금일 날짜있음 |
||||||
|
* [예시] 20230102_[추가파라미터] |
||||||
|
* @param etcName |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
private String getLaancSaveName(String ...etcName){ |
||||||
|
|
||||||
|
String date = InstantUtils.toDateString(Instant.now()).replace("-", ""); |
||||||
|
|
||||||
|
StringBuilder result = new StringBuilder(); |
||||||
|
result.append(date); |
||||||
|
|
||||||
|
for(String name : etcName){ |
||||||
|
result.append("-") |
||||||
|
.append(name); |
||||||
|
} |
||||||
|
|
||||||
|
result.append(this.FILE_EXTENSION); |
||||||
|
|
||||||
|
return result.toString(); |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* PDF 생성 |
||||||
|
* @param vo |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public ComFileBas makeLaancPdf(LaancPdfVO vo){ |
||||||
|
|
||||||
|
String airUser = vo.getUserName(); |
||||||
|
String etc = String.valueOf(System.currentTimeMillis()); // 동명이인 방지
|
||||||
|
String fileName = getLaancSaveName(airUser, etc); |
||||||
|
|
||||||
|
String htmlContent = pdfUtils.getHtmlToString(vo); |
||||||
|
ComFileBas comFileBas = pdfUtils.generatePDF(htmlContent, fileName); |
||||||
|
|
||||||
|
String userId = jwtTokenUtil.getUserIdByToken(); |
||||||
|
comFileBas.setCreateUserId(userId); |
||||||
|
|
||||||
|
return comFileBas; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* DB 인서트, 최신데이터 가져온 후 Group NO 1추가함 |
||||||
|
* @param comFileBas |
||||||
|
*/ |
||||||
|
@Transactional |
||||||
|
public void save(ComFileBas comFileBas){ |
||||||
|
|
||||||
|
// DB Insert
|
||||||
|
ComFileBas lastComFileBas = comFileBasRepository.findFirstByOrderByFileSnoDesc(); |
||||||
|
int fileGroupNo = (lastComFileBas == null) ? 1 : lastComFileBas.getFileGroupNo() + 1; |
||||||
|
|
||||||
|
comFileBas.setFileGroupNo(fileGroupNo); |
||||||
|
|
||||||
|
comFileBasRepository.save(comFileBas); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,54 @@ |
|||||||
|
package com.palnet.biz.api.bas.flight.template.vo; |
||||||
|
|
||||||
|
import java.lang.reflect.Field; |
||||||
|
import java.util.HashMap; |
||||||
|
|
||||||
|
import lombok.Getter; |
||||||
|
import lombok.Setter; |
||||||
|
import lombok.ToString; |
||||||
|
|
||||||
|
@Getter |
||||||
|
@Setter |
||||||
|
@ToString |
||||||
|
public class LaancPdfVO extends PdfBaseVO{ |
||||||
|
|
||||||
|
// TODO : 아직 파라미터가 정해지지 않음
|
||||||
|
private String userName; // 조종사 이름
|
||||||
|
|
||||||
|
private int userAge; // 조종사 나이
|
||||||
|
|
||||||
|
private String userGender; // 조종사 성별
|
||||||
|
|
||||||
|
|
||||||
|
public LaancPdfVO (){ |
||||||
|
init(); |
||||||
|
} |
||||||
|
|
||||||
|
public HashMap<String, Object> getParam(){ |
||||||
|
|
||||||
|
Field[] fields = getClass().getDeclaredFields(); |
||||||
|
|
||||||
|
HashMap<String, Object> result = new HashMap<>(); |
||||||
|
|
||||||
|
try { |
||||||
|
for(Field field : fields){ |
||||||
|
Object value = field.get(this); |
||||||
|
String key = field.getName(); |
||||||
|
|
||||||
|
result.put(key, value); |
||||||
|
} |
||||||
|
} catch (IllegalArgumentException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (IllegalAccessException e){ |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
@Override |
||||||
|
public void init() { |
||||||
|
super.setTemplate("official_document"); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,16 @@ |
|||||||
|
package com.palnet.biz.api.bas.flight.template.vo; |
||||||
|
|
||||||
|
import java.util.Map; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
@Data |
||||||
|
public abstract class PdfBaseVO { |
||||||
|
|
||||||
|
private String template; |
||||||
|
|
||||||
|
public abstract void init(); |
||||||
|
|
||||||
|
public abstract Map<String, Object> getParam(); |
||||||
|
|
||||||
|
} |
@ -0,0 +1,70 @@ |
|||||||
|
package com.palnet.biz.jpa.entity; |
||||||
|
|
||||||
|
import lombok.Data; |
||||||
|
|
||||||
|
import javax.persistence.*; |
||||||
|
import java.io.Serializable; |
||||||
|
import java.time.Instant; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* The persistent class for the COM_IDNTF_BAS database table. |
||||||
|
* |
||||||
|
*/ |
||||||
|
@Data |
||||||
|
@Entity |
||||||
|
@Table(name="COM_FILE_BAS") |
||||||
|
@NamedQuery(name="ComFileBas.findAll", query="SELECT c FROM ComFileBas c") |
||||||
|
public class ComFileBas implements Serializable { |
||||||
|
private static final long serialVersionUID = 1L; |
||||||
|
|
||||||
|
@Id |
||||||
|
@Column(name="FILE_SNO") |
||||||
|
private int fileSno; |
||||||
|
|
||||||
|
@Column(name="FILE_GROUP_NO") |
||||||
|
private int fileGroupNo; |
||||||
|
|
||||||
|
@Column(name="FILE_SAVE_NM") |
||||||
|
private String fileSaveNm; |
||||||
|
|
||||||
|
@Column(name="FILE_ORI_NM") |
||||||
|
private String fileOriNm; |
||||||
|
|
||||||
|
@Column(name = "FILE_PATH") |
||||||
|
private String filePath; |
||||||
|
|
||||||
|
@Column(name="FILE_EXT") |
||||||
|
private String fileExt; |
||||||
|
|
||||||
|
// @Temporal(TemporalType.TIMESTAMP)
|
||||||
|
@Column(name="FILE_SIZE") |
||||||
|
private String fileSize; |
||||||
|
|
||||||
|
// @Temporal(TemporalType.TIMESTAMP)
|
||||||
|
@Column(name="DEL_YN", columnDefinition = "TIMESTAMP") |
||||||
|
private String delYn = "N"; |
||||||
|
|
||||||
|
@Column(name="DEL_USER_ID") |
||||||
|
private String delUserId; |
||||||
|
|
||||||
|
@Column(name="DEL_DT") |
||||||
|
private Instant delDt; |
||||||
|
|
||||||
|
@Column(name="CREATE_USER_ID") |
||||||
|
private String createUserId; |
||||||
|
|
||||||
|
@Column(name="CREATE_DT" , columnDefinition = "TIMESTAMP") |
||||||
|
private Instant createDt; |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -0,0 +1,12 @@ |
|||||||
|
package com.palnet.biz.jpa.repository.com; |
||||||
|
|
||||||
|
import org.springframework.data.jpa.repository.JpaRepository; |
||||||
|
import org.springframework.stereotype.Repository; |
||||||
|
|
||||||
|
import com.palnet.biz.jpa.entity.ComFileBas; |
||||||
|
|
||||||
|
@Repository |
||||||
|
public interface ComFileBasRepository extends JpaRepository<ComFileBas, String>{ |
||||||
|
|
||||||
|
public ComFileBas findFirstByOrderByFileSnoDesc(); |
||||||
|
} |
@ -0,0 +1,169 @@ |
|||||||
|
package com.palnet.comn.utils; |
||||||
|
|
||||||
|
import java.io.File; |
||||||
|
import java.io.FileOutputStream; |
||||||
|
import java.io.IOException; |
||||||
|
import java.io.InputStream; |
||||||
|
import java.io.StringReader; |
||||||
|
import java.nio.charset.Charset; |
||||||
|
import java.nio.file.Files; |
||||||
|
import java.nio.file.Paths; |
||||||
|
import java.time.Instant; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Map.Entry; |
||||||
|
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||||
|
import org.springframework.beans.factory.annotation.Value; |
||||||
|
import org.springframework.stereotype.Component; |
||||||
|
import org.thymeleaf.TemplateEngine; |
||||||
|
import org.thymeleaf.context.Context; |
||||||
|
|
||||||
|
import com.itextpdf.text.Document; |
||||||
|
import com.itextpdf.text.DocumentException; |
||||||
|
import com.itextpdf.text.pdf.PdfWriter; |
||||||
|
import com.itextpdf.tool.xml.XMLWorker; |
||||||
|
import com.itextpdf.tool.xml.XMLWorkerFontProvider; |
||||||
|
import com.itextpdf.tool.xml.XMLWorkerHelper; |
||||||
|
import com.itextpdf.tool.xml.css.CssFile; |
||||||
|
import com.itextpdf.tool.xml.css.StyleAttrCSSResolver; |
||||||
|
import com.itextpdf.tool.xml.html.CssAppliers; |
||||||
|
import com.itextpdf.tool.xml.html.CssAppliersImpl; |
||||||
|
import com.itextpdf.tool.xml.html.Tags; |
||||||
|
import com.itextpdf.tool.xml.parser.XMLParser; |
||||||
|
import com.itextpdf.tool.xml.pipeline.css.CSSResolver; |
||||||
|
import com.itextpdf.tool.xml.pipeline.css.CssResolverPipeline; |
||||||
|
import com.itextpdf.tool.xml.pipeline.end.PdfWriterPipeline; |
||||||
|
import com.itextpdf.tool.xml.pipeline.html.HtmlPipeline; |
||||||
|
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext; |
||||||
|
import com.palnet.biz.api.acnt.jwt.utils.JwtTokenUtil; |
||||||
|
import com.palnet.biz.api.bas.flight.template.vo.PdfBaseVO; |
||||||
|
import com.palnet.biz.jpa.entity.ComFileBas; |
||||||
|
|
||||||
|
@Component |
||||||
|
public class PdfUtils { |
||||||
|
|
||||||
|
|
||||||
|
@Autowired |
||||||
|
private TemplateEngine templateEngine; |
||||||
|
|
||||||
|
@Value("${base-url}") |
||||||
|
private String BASE_PATH; |
||||||
|
|
||||||
|
private final String FILE_EXTENSION = ".pdf"; |
||||||
|
|
||||||
|
|
||||||
|
/** |
||||||
|
* Thymeleaf HTML 파일을 데이터 바인딩하여 String으로 변환 |
||||||
|
* @param <T> |
||||||
|
* @param pdfDto |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public <T extends PdfBaseVO> String getHtmlToString(T pdfDto){ |
||||||
|
|
||||||
|
Map<String, Object> param = pdfDto.getParam(); |
||||||
|
|
||||||
|
// Thymeleaf 방식 html에 입힐 데이터 바인딩
|
||||||
|
Context context = new Context(); |
||||||
|
|
||||||
|
for(Entry<String, Object> entry : param.entrySet()){ |
||||||
|
String key = entry.getKey(); |
||||||
|
|
||||||
|
context.setVariable(key, param.get(key)); |
||||||
|
} |
||||||
|
|
||||||
|
// 앞 뒤 prefix, suffix는 yml에 정의해놓음
|
||||||
|
// html에 바인딩할 데이터 넣고 파싱이후 String형식으로 뽑아옴
|
||||||
|
String htmlContent = templateEngine.process(pdfDto.getTemplate(), context); |
||||||
|
|
||||||
|
return htmlContent; |
||||||
|
} |
||||||
|
|
||||||
|
/** |
||||||
|
* HTML 태그로 이루어진 String값을 PDF로 변환 |
||||||
|
* @param htmlContent |
||||||
|
* @param fileName |
||||||
|
* @return |
||||||
|
*/ |
||||||
|
public ComFileBas generatePDF(String htmlContent, String fileName){ |
||||||
|
|
||||||
|
// PDF 용지 설정하기
|
||||||
|
Document pdfDocument = new Document(); |
||||||
|
ComFileBas result = new ComFileBas(); |
||||||
|
|
||||||
|
String pdfPath = new StringBuilder() |
||||||
|
.append(this.BASE_PATH) |
||||||
|
.append(InstantUtils.toDateString(Instant.now()).replace("-", "")) |
||||||
|
.append("/").toString(); |
||||||
|
|
||||||
|
try { |
||||||
|
|
||||||
|
// 폴더 생성
|
||||||
|
new File(pdfPath).mkdirs(); |
||||||
|
|
||||||
|
// File 저장 기본경로는 main 아래로 기본으로 잡힘
|
||||||
|
PdfWriter writer = PdfWriter.getInstance(pdfDocument, new FileOutputStream(pdfPath + fileName)); |
||||||
|
writer.setInitialLeading(12.5f); |
||||||
|
|
||||||
|
pdfDocument.open(); |
||||||
|
|
||||||
|
/* |
||||||
|
CSS 설정 |
||||||
|
TODO : CSS 파일이 따로 있을시 임포트해주는 방법, CSS 파일 적용은 필수는 아니지만, 글꼴 적용은 꼭해야만 함 |
||||||
|
jar변환 시 CSS파일을 못 찾을수도 있어서 InputStream 사용 |
||||||
|
CSS의 색깔은 키워드로 표기 X, #e73a3a 등 16진법으로 표기 해야함 |
||||||
|
*/ |
||||||
|
InputStream cssStream = getClass().getClassLoader().getResourceAsStream("static/css/pdf.css"); |
||||||
|
CssFile cssFile = XMLWorkerHelper.getCSS(cssStream); |
||||||
|
CSSResolver cssResolver = new StyleAttrCSSResolver(); |
||||||
|
cssResolver.addCss(cssFile); |
||||||
|
|
||||||
|
// Font 설정
|
||||||
|
XMLWorkerFontProvider fontProvider = new XMLWorkerFontProvider(XMLWorkerFontProvider.DONTLOOKFORFONTS); |
||||||
|
fontProvider.register("static/font/NanumGothic.ttf", "NanumGothic"); |
||||||
|
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider); |
||||||
|
|
||||||
|
// XML Worker에 넣을 PipeLine객체 생성, CssResolverPipeline 이 객체를 최종적으로 넣어야 Font,Css가 적용됨
|
||||||
|
HtmlPipelineContext htmlPipelineContext = new HtmlPipelineContext(cssAppliers); |
||||||
|
htmlPipelineContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); |
||||||
|
|
||||||
|
PdfWriterPipeline pdfWriterPipeline = new PdfWriterPipeline(pdfDocument, writer); |
||||||
|
HtmlPipeline htmlPipeline = new HtmlPipeline(htmlPipelineContext, pdfWriterPipeline); |
||||||
|
CssResolverPipeline cssResolverPipeline = new CssResolverPipeline(cssResolver, htmlPipeline); |
||||||
|
|
||||||
|
StringReader stringReader = new StringReader(htmlContent); |
||||||
|
|
||||||
|
XMLWorker xmlWorker = new XMLWorker(cssResolverPipeline, true); |
||||||
|
XMLParser xmlParser = new XMLParser(xmlWorker, Charset.forName("UTF-8")); |
||||||
|
|
||||||
|
xmlParser.parse(stringReader); |
||||||
|
|
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (DocumentException e){ |
||||||
|
e.printStackTrace(); |
||||||
|
} catch (Exception e){ |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
finally{ |
||||||
|
pdfDocument.close(); |
||||||
|
} |
||||||
|
|
||||||
|
result.setFileGroupNo(0); |
||||||
|
result.setFilePath(pdfPath); |
||||||
|
result.setFileExt(this.FILE_EXTENSION); |
||||||
|
result.setCreateDt(Instant.now()); |
||||||
|
result.setFileSaveNm(fileName); |
||||||
|
result.setFileOriNm(fileName); |
||||||
|
|
||||||
|
try { |
||||||
|
String filePath = result.getFileOriNm(); |
||||||
|
long fileSize = Files.size(Paths.get(pdfPath + filePath)) / 1024; |
||||||
|
|
||||||
|
if(fileSize >= 0) result.setFileSize(String.valueOf(fileSize)); |
||||||
|
} catch (IOException e) { |
||||||
|
e.printStackTrace(); |
||||||
|
} |
||||||
|
|
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,12 @@ |
|||||||
|
|
||||||
|
body{ |
||||||
|
font-family: NanumGothic; |
||||||
|
} |
||||||
|
|
||||||
|
p{ |
||||||
|
background-color: #e73a3a; |
||||||
|
} |
||||||
|
|
||||||
|
div { |
||||||
|
background-color: #e73a3a; |
||||||
|
} |
Binary file not shown.
@ -0,0 +1,12 @@ |
|||||||
|
<html lang="ko" xmlns:th="http://www.thymeleaf.org"> |
||||||
|
<head> |
||||||
|
<meta charset="UTF-8" /> |
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> |
||||||
|
</head> |
||||||
|
<body> |
||||||
|
<p>Thymeleaf Tutorials</p> |
||||||
|
<p>이름 : [[${userName}]]</p> |
||||||
|
<p>나이 : [[${userAge}]]</p> |
||||||
|
<p>성별 : [[${userGender}]]</p> |
||||||
|
</body> |
||||||
|
</html> |
Loading…
Reference in new issue