'Spring/Java'에 해당되는 글 6건

BLOB으로 저장 된 이미지 출력

2014. 8. 13. 17:46 Spring/Java

파일을 BLOB 형으로 DB에 저장하곤 한다-

이미지 역시 파일이니까 BLOB으로 저장하였는데,

출력하는 방법을 모르겠다-


생각보다 간단하다-


1. DB에서 BLOB형 이미지를 byte[]형으로 가져온다-

1
2
3
4
5
6
7
@RequestMapping("/logoShowForStudent/{num}")
public void imageView(HttpServletRequest req, HttpServletResponse res, @PathVariable("num") int num) throws IOException {
	res.setContentType("image/jpeg");
	byte[] imagefile = service.showlogo(num);
	InputStream in1 = new ByteArrayInputStream(imagefile);
	IOUtils.copy(in1, res.getOutputStream());
}


2. 어노테이션으로 지정한 request에 맞는 url을 이미지의 src로 준다-

1
<img  src ="/logoShowForStudent/${comp_detail.company_detail_seq }"></img>


'Spring/Java' 카테고리의 다른 글

Excel Insert, poi  (0) 2014.08.12
AOP 사용, 어노테이션  (0) 2014.08.10
ppt to image/pdf 변환  (0) 2014.08.10
간단한 암호화, MD5, SHA1  (0) 2014.08.10
MyBatis 연결 설정  (0) 2014.08.09

Excel Insert, poi

2014. 8. 12. 22:01 Spring/Java

관리자 쪽 서비스를 구현하다 보면, 엑셀에 있는 내용을 일괄적으로 DB에 넣는 작업이 필요할 때가 있다-
Cell에 있는 값의 유효성(null, text, numeric 구분 등)을 하나하나 체크하는 것은 일이 너무 많은 관계로 기본적 내용만을 구현하였다-
나중에 손쉬운 방법을 알아내면 다시 포스팅해야 겠다-

1. pom.xml에 poi를 넣어준다-
1
2
3
4
5
6

<!-- Apache POI --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.10-FINAL</version> </dependency>


2. Browser에 보여질 내용을 작성한다-
파일 처리, 파일 유효성 체크, Devoops로 진행중인 프로젝트라 페이지 이동보단 ajax submit을 이용한 ajax 처리를 하였다-
<html 부분> 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19

<div class="card"> <h4 class="page-header"><strong>**주의 사항**</strong></h4> <form id="excelUpForm" class="form-horizontal panel-body" role="form" action="" method="post" enctype="multipart/form-data"> <p>* 엑셀 파일만 업로드 가능합니다.</p> <p>* 첫 번째 시트에 데이터가 있어야 합니다. [시트명 : Sheet1]</p> <p>* 엑셀 작성 시, 중간에 빈 줄이 없어야 합니다.</p> <a href="/resources/template/Company_Form.xls" class="btn btn-primary">양식 다운로드</a> <div class="form-group"> <label class="col-sm-2 control-label" style="padding-top : 0px;">엑셀 파일</label> <div class="col-sm-6">

<input id="excel" type="file" class="form-control" name="excel" /> </div> </div> <div class="form-inline"> <button type="button" id="excelUp" onclick="check()" class="btn btn-success pull-right">등록하기</button> </div> </form> </div>

<jquery.form.js 추가>

1
<script src="/resources/js/jquery.form.js"></script>

<javascript 부분>

 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
function checkFileType(filePath){
	var fileFormat = filePath.split(".");
	if(fileFormat.indexOf("xls") > -1){
	    return true;
	}else{
	    return false;
	}
}

function check(){
    var file = $("#excel").val();
    if(file == "" || file == null){
        alert("파일을 선택해주세요.");
        return false;
    }else if(!checkFileType(file)){
        alert("엑셀 파일만 업로드 해주세요.");
        return false;
    }
    
    if(confirm("업로드 하시겠습니까?")){
        $("#excelUpForm").attr("action", "/admin/compExcelUpload");
   		var options = {
   			success : function(data) {
   				alert("모든 데이터가 업로드 되었습니다.");
   				$("#ajax-content").html(data);
   			},
   			type : "POST"
   		};
   		$('form').ajaxSubmit(options);
    }
}


3. Server에서 excel 처리-

파일을 따로 저장할 필요가 없어서, 받은 파일의 input stream으로 workbook을 만들고-

각 Column을 VO객체에 담아서 ArrayList를 만들었다-

 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
@RequestMapping(value = "admin/compExcelUpload")
public ModelAndView excelUpload(MultipartHttpServletRequest req) throws ParseException{
	mav = new ModelAndView("/admin/comp_list");
	
	MultipartFile file = req.getFile("excel");

	ArrayList<CompanyDetailVO> comp_list = new ArrayList<>();
	if (file != null && file.getSize() > 0) {
		try {
			Workbook wb = new HSSFWorkbook(file.getInputStream());
			Sheet sheet = wb.getSheetAt(0);
			
			int last = sheet.getLastRowNum();
			System.out.println("Last : " + last);
			for(int i=1; i<=last; i++){
				Row row = sheet.getRow(i);
				CompanyDetailVO company = new CompanyDetailVO();
				
				String company_name = row.getCell(0, Row.CREATE_NULL_AS_BLANK).getStringCellValue();
				
				if(!company_name.equals("") && company_name != null){
					company.setCompany_name(company_name);
					company.setCompany_ceo(row.getCell(1, Row.CREATE_NULL_AS_BLANK).getStringCellValue());					
					company.setIncorp_date(row.getCell(2, Row.CREATE_NULL_AS_BLANK).getDateCellValue());
					company.setStaff_cnt((int) row.getCell(3, Row.CREATE_NULL_AS_BLANK).getNumericCellValue());
					company.setCompany_url(row.getCell(4, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_sales((int) row.getCell(5, Row.CREATE_NULL_AS_BLANK).getNumericCellValue());
					company.setCompany_type(row.getCell(6, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
						
					String zipcode = row.getCell(7, Row.CREATE_NULL_AS_BLANK).getStringCellValue();
					String[] zipArray = zipcode.split("-");					
					company.setCompany_zipcode1(zipArray[0]);
					company.setCompany_zipcode2(zipArray[1]);
					
					company.setCompany_addr(row.getCell(8, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_detail_addr(row.getCell(9, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_telnumber(row.getCell(10, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_ad_url1(row.getCell(11, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_ad_url2(row.getCell(12, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_ad_url3(row.getCell(13, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_ad_url4(row.getCell(14, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_ad_url5(row.getCell(15, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
					company.setCompany_ad_url6(row.getCell(16, Row.CREATE_NULL_AS_BLANK).getStringCellValue());
						
					comp_list.add(company);	
				}					
			}				
		} catch (IllegalStateException | IOException e) {
			e.printStackTrace();
		}
	}
		
	service.insertCompExcel(comp_list);		
	mav.addObject("comp_list", service.getCompanies());
		
	return mav;
}


4. 추가적으로 MyBatis 다중 Insert

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15

<insert id="insertCompExcel" parameterType="HashMap"> INSERT INTO COMPANY_DETAIL( `COMPANY_NAME`, `COMPANY_CEO`, `INCORP_DATE`, `STAFF_CNT`, `COMPANY_URL`, `COMPANY_SALES`, `COMPANY_TYPE`, `COMPANY_ZIPCODE1`, `COMPANY_ZIPCODE2`, `COMPANY_ADDR`, `COMPANY_DETAIL_ADDR`, `COMPANY_TELNUMBER`, `COMPANY_AD_URL1`, `COMPANY_AD_URL2`, `COMPANY_AD_URL3`, `COMPANY_AD_URL4`, `COMPANY_AD_URL5`, `COMPANY_AD_URL6` ) VALUES <foreach collection="comp_list" item="item" separator=" , "> ( #{item.company_name}, #{item.company_ceo}, #{item.incorp_date}, #{item.staff_cnt}, #{item.company_url}, #{item.company_sales}, #{item.company_type}, #{item.company_zipcode1}, #{item.company_zipcode2}, #{item.company_addr}, #{item.company_detail_addr}, #{item.company_telnumber}, #{item.company_ad_url1}, #{item.company_ad_url2}, #{item.company_ad_url3}, #{item.company_ad_url4}, #{item.company_ad_url5}, #{item.company_ad_url6} ) </foreach> </insert>


'Spring/Java' 카테고리의 다른 글

BLOB으로 저장 된 이미지 출력  (0) 2014.08.13
AOP 사용, 어노테이션  (0) 2014.08.10
ppt to image/pdf 변환  (0) 2014.08.10
간단한 암호화, MD5, SHA1  (0) 2014.08.10
MyBatis 연결 설정  (0) 2014.08.09

AOP 사용, 어노테이션

2014. 8. 10. 14:59 Spring/Java

Spring에서 AOP를 사용하면 여러가지 기능을 구현할 수 있다-
가장 간단하게 로그인 처리하는 부분을 남기려 한다-

1. pom.xml에 다음을 추가한다-
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<!-- AOP 관련 -->
<dependency>
	<groupid>org.aspectj</groupid>
	<artifactid>aspectjweaver</artifactid>
	<version>1.7.4</version>
</dependency>
<dependency>
	<groupid>cglib</groupid>
	<artifactid>cglib</artifactid>
	<version>2.2.2</version>
</dependency>


2. Aspect.java
pointcut, advice, joinpoint 구현(?)
*req.getRequestURI()를 통해 특정 uri의 통과를 구현할 수 있다-
 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
42
43
44
45
46
47
48
49
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.web.servlet.ModelAndView;

@Aspect
public class AdminAspect {	
	@Pointcut("bean(adminController) || bean(adminStudentController)")
	public void adminOperation(){}	

	@Around("adminOperation()")
	public Object aroundAnyAdminOperation(ProceedingJoinPoint joinPoint) throws Throwable {
		HttpServletRequest req = null;
		for (Object obj : joinPoint.getArgs()) {
			if (obj instanceof HttpServletRequest) {
				req = (HttpServletRequest) obj;
			}
		}
		
		String connUri = req.getRequestURI();
		System.out.println(connUri);
		
		boolean isPass = false;
		boolean isLogined = false;
		HttpSession session = req.getSession();		
		String adminLogined = (String)session.getAttribute("adminLogined");
		
		if(adminLogined != null || !adminLogined.equals("")){			
			isLogined = true;		
		}else if(connUri.startsWith("/login")){
			isPass = true;
		}
		
		if(!isLogined || !isPass){
			ModelAndView mav = new ModelAndView("/admin_login");
			session.setAttribute("error", "관리자 로그인 후 이용 가능합니다.");
			
			return mav;
		}else{
			Object result = joinPoint.proceed();
			
			return result;
		}		
	}
}


'Spring/Java' 카테고리의 다른 글

BLOB으로 저장 된 이미지 출력  (0) 2014.08.13
Excel Insert, poi  (0) 2014.08.12
ppt to image/pdf 변환  (0) 2014.08.10
간단한 암호화, MD5, SHA1  (0) 2014.08.10
MyBatis 연결 설정  (0) 2014.08.09

ppt to image/pdf 변환

2014. 8. 10. 01:51 Spring/Java

ppt 파일을 pdf로 변환하기 위해서는-
image로 변환 후, image를 pdf로 다시 변환시켜야 한다-

1.먼저 poi-scratchpad와 itextpdf가 필요하다-
다음을 pom.xml에 추가해 준다-
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
<!-- ppt -->
<dependency>
	<groupid>org.apache.poi</groupid>
	<artifactid>poi-scratchpad</artifactid>
	<version>3.10-FINAL</version>
</dependency>

<!-- iText pdf -->
<dependency>
	<groupid>com.itextpdf</groupid>
	<artifactid>itextpdf</artifactid>
	<version>5.5.2</version>
</dependency>


2. PPTtoPDFConverter.java
저장되어 있는 ppt 파일의 경로를 입력하면-
pdf 파일로 변환 후, pdf파일의 경로를 출력한다-
 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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.UUID;

import javax.imageio.ImageIO;

import org.apache.poi.hslf.model.Slide;
import org.apache.poi.hslf.usermodel.SlideShow;

import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.pdf.PdfWriter;

public class PPTtoPDFConverter {
	String realFolder = FileManager.realFolder;
	private String pdfFileName;
	
	public PPTtoPDFConverter(){
	}
	
	public PPTtoPDFConverter(String fileName){
		try {
			setPdfFileName(this.convert(fileName));
		} catch (IOException | DocumentException e) {
			e.printStackTrace();
		}
	}
	
	private void setPdfFileName(String pdfFileName) {
		this.pdfFileName = pdfFileName;		
	}
	
	public String getPdfFileName() {
		return pdfFileName;
	}

	private String convert(String fileName) throws IOException, DocumentException{
		//1.Read PPT file
		FileInputStream fis = new FileInputStream(realFolder + fileName);
		SlideShow ppt = new SlideShow(fis);
		
		fis.close();
		
		//2.Draw Image
		Dimension pageSize = ppt.getPageSize();
		Slide[] slide = ppt.getSlides();

		for(int i=0; i<slide.length; i++){
			BufferedImage image = new BufferedImage(pageSize.width, pageSize.height, BufferedImage.TYPE_INT_RGB);
			
			Graphics2D graphics = image.createGraphics();
			graphics.setPaint(Color.white); //이미지 영역을 클리어
			graphics.fill(new Rectangle2D.Float(0, 0, pageSize.width, pageSize.height));
			
			slide[i].draw(graphics);
			
			File dir = new File(realFolder + "tempImg/");
		    if (!dir.isDirectory()) {
		      dir.mkdirs();
		    }
		    
		    FileOutputStream fos = new FileOutputStream(dir + "temp" + (i+1) + ".png");
		    ImageIO.write(image, "png", fos);
		}
		
		//3.Image To PDF
		Document document = new Document();
		File dir = new File(realFolder + "portfolioPDF/");
		if (!dir.isDirectory()) {
			dir.mkdirs();
		}
	    
		String pdfFileName = "portfolioPDF/" + UUID.randomUUID().toString();
		PdfWriter.getInstance(document, new FileOutputStream(realFolder + pdfFileName));
		document.open();
		
		for(int i=1; i&lt;=slide.length; i++){
			String imagePath = realFolder + "tempImg/temp" + i + ".png";
			Image image = Image.getInstance(imagePath);
			document.add(image);
			
			//4.Delete Image
		    File file = new File(imagePath);
		    file.delete();
		}
		
		document.close();
		
		return pdfFileName;
	}	
}

'Spring/Java' 카테고리의 다른 글

BLOB으로 저장 된 이미지 출력  (0) 2014.08.13
Excel Insert, poi  (0) 2014.08.12
AOP 사용, 어노테이션  (0) 2014.08.10
간단한 암호화, MD5, SHA1  (0) 2014.08.10
MyBatis 연결 설정  (0) 2014.08.09

간단한 암호화, MD5, SHA1

2014. 8. 10. 01:21 Spring/Java

아마 큰 의미는 없을 것으로 예상되나,
비밀번호나 개인신상과 관련된 내용을 DB에 저장할 때 암호화를 해야겠다는 취지에서 사용했다-

1.CEncrypt.java 추가
MD5 와 SHA1 중 선택하여 암호화, 복호화, 값 비교가 가능하다-
 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
42
43
44
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CEncrypt {
	MessageDigest md;
	String strSRCData = "";
	String strENCData = "";

	public CEncrypt() {
	}

	public CEncrypt(String EncMthd, String strData) {
		this.encrypt(EncMthd, strData);
	}

	public void encrypt(String EncMthd, String strData) {
		try {
			MessageDigest md = MessageDigest.getInstance(EncMthd); // "MD5" or "SHA1"
			byte[] bytData = strData.getBytes();
			md.update(bytData);
			byte[] digest = md.digest();
			for (int i = 0; i &lt; digest.length; i++) {
				strENCData = strENCData	+ Integer.toHexString(digest[i] &amp; 0xFF).toUpperCase();
			}
		} catch (NoSuchAlgorithmException e) {
		};

		strSRCData = strData;
	}

	public String getEncryptData() {
		return strENCData;
	}

	public String getSourceData() {
		return strSRCData;
	}

	public boolean equal(String strData) {
			if (strData == strENCData)
			return true;
		return false;
	}
}


2.코드 내부에서 사용
생성자에 암호화 방식과 암호화할 값을 매개변수로 잡고 생성자를 호출하고, getEncrptData()로 암호화된 값을 불러옴-
1
2
CEncrypt enc = new CEncrypt("SHA1", adminPass);
String PW = enc.getEncryptData();

'Spring/Java' 카테고리의 다른 글

BLOB으로 저장 된 이미지 출력  (0) 2014.08.13
Excel Insert, poi  (0) 2014.08.12
AOP 사용, 어노테이션  (0) 2014.08.10
ppt to image/pdf 변환  (0) 2014.08.10
MyBatis 연결 설정  (0) 2014.08.09

MyBatis 연결 설정

2014. 8. 9. 22:08 Spring/Java

Spring과 MyBatis를 연결하기 위해 몇 가지 설정 파일이 필요하다-

1.pom.xml
Pom 파일에 MyBatis 관련 maven(?) 등록
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<!--MyBatis -->
<dependency>
	<groupid>org.mybatis</groupid>
	<artifactid>mybatis</artifactid>
	<version>3.2.5</version>
</dependency>
<dependency>
	<groupid>org.mybatis</groupid>
	<artifactid>mybatis-spring</artifactid>
	<version>1.2.2</version>
</dependency>


2.MapperConfig.xml
MyBatis 연결 설정과 VO(DTO) 타입 설정, Mapper 등록을 한다-
 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
<!--?xml version="1.0" encoding="UTF-8"?-->
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
	<settings>
		<setting name="cacheEnabled" value="true"></setting>
		<setting name="lazyLoadingEnabled" value="false"></setting>
		<setting name="multipleResultSetsEnabled" value="true"></setting>
		<setting name="useColumnLabel" value="true"></setting>
		<setting name="useGeneratedKeys" value="false"></setting>
		<setting name="defaultExecutorType" value="SIMPLE"></setting>
		<setting name="defaultStatementTimeout" value="25000"></setting>
		<!-- 전통적인 데이터베이스 컬럼명 형태인 A_COLUMN을 CamelCase형태의 자바 프로퍼티명 형태인 aColumn으로 자동으로 매핑하도록 함 -->
		<setting name="mapUnderscoreToCamelCase" value="false"></setting>
		<setting value="VARCHAR" name="jdbcTypeForNull"></setting>
	</settings>

	<typealiases>		
		<typealias alias="resumeComment" type="com.miram.portal1.client.vo.ResumeCommentVO"></typealias>	
	</typealiases>

	<mappers>		
		<mapper resource="mybatis/home.xml"></mapper>
	</mappers>
</configuration>


3.Mapper.xml
DAO와 연결하여 Query문 작성
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<!--?xml version="1.0" encoding="UTF-8"?-->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.miram.portal1.admin.dao.AdminDAO">
	<select id="getAdmin" parametertype="String" resulttype="admin">
		SELECT *
		FROM MEM_ADMIN
		WHERE ADMIN_ID = #{admin_id}
	</select>
</mapper>


4.context.xml
Context 파일에 SqlSessionTemplate와 SqlSessionFactoryBean을 등록하고, DAO 빈을 등록하며 이 둘을 property로 준다-
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<bean id="HomeDAO" class="org.mybatis.spring.mapper.MapperFactoryBean">
	<property name="mapperInterface" value="com.miram.portal1.client.dao.HomeDAO"/>
	<property name="sqlSessionFactory" ref="sqlSessionFactory"/>
	<property name="sqlSessionTemplate" ref="sqlSessionTemplate"/>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
	<property name="dataSource" ref="dataSource"/>
	<property name="configLocation" value="classpath:/mybatis/MapperConfig.xml"/>
</bean>

<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
	<constructor-arg ref="sqlSessionFactory"/>
</bean>

'Spring/Java' 카테고리의 다른 글

BLOB으로 저장 된 이미지 출력  (0) 2014.08.13
Excel Insert, poi  (0) 2014.08.12
AOP 사용, 어노테이션  (0) 2014.08.10
ppt to image/pdf 변환  (0) 2014.08.10
간단한 암호화, MD5, SHA1  (0) 2014.08.10

Recent Posts

Recent Comments

Recent Trackbacks