검색결과 리스트
개발에 해당되는 글 144건
- 2023.11.02 JAVA에서 ZPL 프린터 연결 (IP)
- 2023.10.20 AWS서버 FileZilla Root 권한으로 접속하는 방법.
- 2022.09.20 java Excel upload 및 DB 연동
- 2021.10.07 json 한글 깨짐
- 2020.11.30 부적합한 열이름(동적으로 컬럼명 사용할 시 )
- 2020.08.10 엑셀 다운로드 로딩바 만들기2
- 2020.05.28 ajax, JSON 사용하기
- 2020.05.15 JSON 데이터 추출
- 2020.05.13 websocket 실시간 알림.
- 2020.04.24 자바스크립트 문자열 치환
글
JAVA에서 ZPL 프린터 연결 (IP)
try {
Socket clientSocket = new Socket("10.200.23.4",9100); //ZPL 프린터 IP
DataOutputStream outToServer = new DataOutputStream(clientSocket.getOutputStream() );
//The data being sent in the lines below illustrate CPCL one can change the data for the corresponding
//language being used (ZPL, EPL)
outToServer.writeBytes("^XA^FO20,20^A0N,25,25^FDThis is a ZPL test.^FS^XZ");
clientSocket.close();
} catch (IOException e) {
e.printStackTrace();
}
이렇게만 해주면 되넴
'개발 > 실전' 카테고리의 다른 글
톰캣에 SSL 설정 (0) | 2020.02.19 |
---|---|
PermGen Space 에러 (0) | 2018.08.14 |
이클립스 세로줄 플러그인 (0) | 2018.03.23 |
자바스크립트, style 블럭처리 display none,block,inline (0) | 2017.10.31 |
자바스크립트 날짜 계산 (0) | 2016.06.20 |
설정
트랙백
댓글
글
AWS서버 FileZilla Root 권한으로 접속하는 방법.
나의 경우에는 파일이 전부 root 권한이라
먼저 root 계정으로 접속한다
sudo -i
vi /etc/ssh/sshd_config
파일은 보면
#LoginGraceTime 2m 밑에
PermitRootLogin yes
를 하고 esc 누른 후 :wq 를 이용해서 저장한다.
cd /home/ec2-user 이동 후에
cp .ssh/authorized_keys /root/.ssh/ 명령어를 입력하면 복사 할거냐고 물어보는데 y를 입력 하면 된다.
그 후에 파일질라로 접속해보면 되는걸 확인할 수 있다.
'개발 > 리눅스' 카테고리의 다른 글
리눅스 톰캣 다중 띄우기 (0) | 2020.02.18 |
---|---|
리눅스 스프링 프로젝트 띄우기 (0) | 2020.02.14 |
리눅스 톰캣 설치 (0) | 2020.02.14 |
리눅스 JAVA 설치 (0) | 2020.02.14 |
설정
트랙백
댓글
글
java Excel upload 및 DB 연동
오랜만에 글을 써본다.. 이직으로 개발이 주 업무가 아니라 운영업무만 하다보니...
엑셀 파일을 읽어서 DB연동하는것 까지 기록해본다.
## 기본 class 파일 (그냥 갖다 생성해서 쓰면 된다) ##
1.ExcelCellRef.java
package egovframework.comm;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.util.CellReference;
public class ExcelCellRef {
/**
* Cell에 해당하는 Column Name을 가져온다(A,B,C..)
* 만약 Cell이 Null이라면 int cellIndex의 값으로
* Column Name을 가져온다.
* @param cell
* @param cellIndex
* @return
*/
public static String getName(Cell cell, int cellIndex) {
int cellNum = 0;
if(cell != null) {
cellNum = cell.getColumnIndex();
}
else {
cellNum = cellIndex;
}
return CellReference.convertNumToColString(cellNum);
}
@SuppressWarnings("deprecation")
public static String getValue(Cell cell) {
String value = "";
if(cell == null) {
value = "";
}
else {
if( cell.getCellType() == Cell.CELL_TYPE_FORMULA ) {
value = cell.getCellFormula();
}
else if( cell.getCellType() == Cell.CELL_TYPE_NUMERIC ) {
value = cell.getNumericCellValue() + "";
}
else if( cell.getCellType() == Cell.CELL_TYPE_STRING ) {
value = cell.getStringCellValue();
}
else if( cell.getCellType() == Cell.CELL_TYPE_BOOLEAN ) {
value = cell.getBooleanCellValue() + "";
}
else if( cell.getCellType() == Cell.CELL_TYPE_ERROR ) {
value = cell.getErrorCellValue() + "";
}
else if( cell.getCellType() == Cell.CELL_TYPE_BLANK ) {
value = "";
}
else {
value = cell.getStringCellValue();
}
}
return value;
}
}
2.ExcelFileType.java
package egovframework.comm;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelFileType {
public static Workbook getWorkbook(String filePath) {
FileInputStream fis = null;
try {
fis = new FileInputStream(filePath);
} catch (FileNotFoundException e) {
throw new RuntimeException(e.getMessage(), e);
}
Workbook wb = null;
if(filePath.toUpperCase().endsWith(".XLS")) {
try {
wb = new HSSFWorkbook(fis);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
else if(filePath.toUpperCase().endsWith(".XLSX")) {
try {
wb = new XSSFWorkbook(fis);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
return wb;
}
}
3.ExcelRead.java
package egovframework.comm;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
public class ExcelRead {
public static List<Map<String, String>> read(ExcelReadOption excelReadOption) {
// 엑셀 파일 자체
// 엑셀파일을 읽어 들인다.
// FileType.getWorkbook() <-- 파일의 확장자에 따라서 적절하게 가져온다.
Workbook wb = ExcelFileType.getWorkbook(excelReadOption.getFilePath());
// 엑셀 파일에서 첫번째 시트를 가지고 온다.
Sheet sheet = wb.getSheetAt(0);
System.out.println("Sheet 이름: " + wb.getSheetName(0));
System.out.println("데이터가 있는 Sheet의 수 :" + wb.getNumberOfSheets());
// sheet에서 유효한(데이터가 있는) 행의 개수를 가져온다.
int numOfRows = sheet.getPhysicalNumberOfRows()+2; //빈 cell은 카운터를 안하길래 +2를 추가 시켜줌
int numOfCells = 0;
Row row = null;
Cell cell = null;
String cellName = "";
/**
* 각 row마다의 값을 저장할 맵 객체 저장되는 형식은 다음과 같다. put("A", "이름"); put("B",
* "게임명");
*/
Map<String, String> map = null;
/*
* 각 Row를 리스트에 담는다. 하나의 Row를 하나의 Map으로 표현되며 List에는 모든 Row가 포함될 것이다.
*/
List<Map<String, String>> result = new ArrayList<Map<String, String>>();
/**
* 각 Row만큼 반복을 한다.
*/
for (int rowIndex = excelReadOption.getStartRow() - 1; rowIndex < numOfRows; rowIndex++) {
/*
* 워크북에서 가져온 시트에서 rowIndex에 해당하는 Row를 가져온다. 하나의 Row는 여러개의 Cell을 가진다.
*/
row = sheet.getRow(rowIndex);
if (row != null) {
/*
* 가져온 Row의 Cell의 개수를 구한다.
*/
numOfCells = row.getPhysicalNumberOfCells();
System.out.println("row의 cell의 갯수 : "+numOfCells);
/*
* 데이터를 담을 맵 객체 초기화
*/
map = new HashMap<String, String>();
/*
* cell의 수 만큼 반복한다.
*/
for (int cellIndex = 0; cellIndex < numOfCells; cellIndex++) {
/*
* Row에서 CellIndex에 해당하는 Cell을 가져온다.
*/
cell = row.getCell(cellIndex);
/*
* 현재 Cell의 이름을 가져온다 이름의 예 : A,B,C,D,......
*/
cellName = ExcelCellRef.getName(cell, cellIndex);
/*
* 추출 대상 컬럼인지 확인한다 추출 대상 컬럼이 아니라면, for로 다시 올라간다
*/
if (!excelReadOption.getOutputColumns().contains(cellName)) {
continue;
}
/*
* map객체의 Cell의 이름을 키(Key)로 데이터를 담는다.
*/
map.put(cellName, ExcelCellRef.getValue(cell));
}
/*
* 만들어진 Map객체를 List로 넣는다.
*/
result.add(map);
}
}
return result;
}
}
4.ExcelReadOption.java
package egovframework.comm;
import java.util.ArrayList;
import java.util.List;
public class ExcelReadOption {
// 엑셀파일의 경로
private String filePath;
// 추출할 컬럼 명
private List<String> outputColumns;
// 추출을 시작할 행 번호
private int startRow;
public String getFilePath() {
return filePath;
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public List<String> getOutputColumns() {
List<String> temp = new ArrayList<String>();
temp.addAll(outputColumns);
return temp;
}
public void setOutputColumns(List<String> outputColumns) {
// 이걸 A,B,C,D 이런 식으로 추가하던데
List<String> temp = new ArrayList<String>();
temp.addAll(outputColumns);
this.outputColumns = temp;
}
public void setOutputColumns(String ... outputColumns) {
if(this.outputColumns == null) {
this.outputColumns = new ArrayList<String>();
}
for(String ouputColumn : outputColumns) {
this.outputColumns.add(ouputColumn);
}
}
public int getStartRow() {
return startRow;
}
public void setStartRow(int startRow) {
this.startRow = startRow;
}
}
## jsp ##
<form name="searchForm" id="searchForm" enctype="multipart/form-data" method="post">
<button onClick="javascript:excelClick()" class="editUploadBtn">Excel Upload</button>
</form>
<script>
function excelClick(){
var insertData = new FormData($('#searchForm')[0]);
$.ajax({
enctype : "multipart/form-data",
type : "POST",
url : "/management/commutingTimeExcelUpload.do",
data : insertData,
processData: false, //엑셀 업로드 하려면 설정해줘야한다
contentType: false, //엑셀 업로드 하려면 설정해줘야한다
success : function(data) {
}
});
}
</script>
## Controller ##
@ResponseBody
@Transactional
@RequestMapping(value = "/management/commutingTimeExcelUpload.do", produces = "application/text; charset=UTF-8")
public String commutingTimeExcelUpload(MultipartHttpServletRequest request, Model model, MultipartFile testFile) throws Exception{
MultipartFile excelFile = request.getFile("EXCEL_UPLOAD");
String result = "N";
if(excelFile == null || excelFile.isEmpty()) {
throw new RuntimeException("엑셀파일을 선택해주세요");
}
File destFile = new File("c:\\upload\\"+excelFile.getOriginalFilename()); //엑셀을 업로드 할 위치
try {
//설정한 위치에 올린 파일을 만든다
excelFile.transferTo(destFile);
} catch(Exception e) {
throw new RuntimeException("e.getMessage()",e);
}
//업로드 진행
managementService.excelUpload(destFile);
result = "Y";
//업로드 후 삭제
destFile.delete();
return result;
}
## service ##
//엑셀 업로드
void excelUpload(File destFile);
## serviceImpl ##
@Override
public void excelUpload(File destFile) {
ExcelReadOption excelReadOption = new ExcelReadOption();
//파일경로 추가
excelReadOption.setFilePath(destFile.getAbsolutePath());
System.out.println("#### destFile.getAbsolutePath() : "+destFile.getAbsolutePath());
//추출할 컬럼명 추가
excelReadOption.setOutputColumns("A", "B", "C", "D", "E", "F");
//시작행
excelReadOption.setStartRow(6); //DB에 저장할 시작 위치
//A행~ F행의 내용이 excelContent로 들어감
List<Map<String, String>>excelContent = ExcelRead.read(excelReadOption);
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("excelContent", excelContent);
try {
managementDAO.excelUpload(paramMap);
}catch(Exception e) {
e.printStackTrace();
}
}
## DAO ##
public Integer excelUpload(Map<String , Object>inputMap) {
int seq = (int) insert("managementDAO.excelUpload", inputMap);
return seq;
}
## xml ##
<insert id="managementDAO.excelUpload" parameterClass="java.util.Map">
/* managementDAO.excelUpload */
<selectKey keyProperty="seq" resultClass="java.lang.Integer" >
SELECT 1
</selectKey>
<dynamic>
<iterate property="excelContent" conjunction=";" >
MERGE INTO COMMUTING_TIME C
USING (SELECT 1 AS DUAL) AS B
ON (
C.SYS_CREATE_DATE = #excelContent[].A#
AND C.EMP_CODE = #excelContent[].C#
AND C.DEVICE_CODE = #excelContent[].F#
)
WHEN MATCHED THEN
UPDATE SET C.SYS_CREATE_TIME = #excelContent[].B#
WHEN NOT MATCHED THEN
INSERT(
SYS_CREATE_DATE,
SYS_CREATE_TIME,
EMP_CODE,
EMP_NAME,
DEVICE_ID,
DEVICE_CODE
)
VALUES
(
#excelContent[].A#,
#excelContent[].B#,
#excelContent[].C#,
#excelContent[].D#,
#excelContent[].E#,
#excelContent[].F#
)
</iterate>
</dynamic>
;
</insert>
'개발 > 코딩' 카테고리의 다른 글
json 한글 깨짐 (0) | 2021.10.07 |
---|---|
엑셀 다운로드 로딩바 만들기2 (0) | 2020.08.10 |
ajax, JSON 사용하기 (0) | 2020.05.28 |
JSON 데이터 추출 (0) | 2020.05.15 |
websocket 실시간 알림. (0) | 2020.05.13 |
설정
트랙백
댓글
글
json 한글 깨짐
ajax로 json 타입으로 한글을 받아와야하는데 깨짐 현상이 발생했다
생각보다 간단한데
java에서
@RequestMapping(value = "/main/kchtest.do")
의 부분을
@RequestMapping(value = "/main/kchtest.do", produces = "application/text; charset=UTF-8")
추가해주면 된다
'개발 > 코딩' 카테고리의 다른 글
java Excel upload 및 DB 연동 (0) | 2022.09.20 |
---|---|
엑셀 다운로드 로딩바 만들기2 (0) | 2020.08.10 |
ajax, JSON 사용하기 (0) | 2020.05.28 |
JSON 데이터 추출 (0) | 2020.05.15 |
websocket 실시간 알림. (0) | 2020.05.13 |
설정
트랙백
댓글
글
부적합한 열이름(동적으로 컬럼명 사용할 시 )
티베로 DB를 사용 하던 도중
JDBC-90611:ERRJD 해당 에러를 확인했다.
쿼리도 이상없고, 소스도 이상없는것 같아서 한참동안 헤메다가 원인을 발견했다.
ibatis를 사용하는 경우 동적으로 table name과 column name을 생성하여
쿼리를 실행해야 하는 경우가 발생한다.
예를 들면 다음과 같다.
<select id="fileInfo" resultClass="java.lang.String" parameterClass="java.util.Map">
SELECT $columnName$
FROM $tableName$
WHERE $pkName$ = #pkValue#
</select>
전혀 이상없는 구문이나 실행시 에러가 발생한다.
이상하게도 처음 실행시에는 에러가 발생하지 않으나,
두번째 부터 에러가 발생하기 시작한다.
WAS를 재기동하면 또 첫번째는 이상없으나, 두번째 부터 에러가 발생한다.
ibatis는 특정 id의 쿼리를 실행 한 후 해당 id의 쿼리를
캐쉬로 보관하고 있다가
동일한 id에 대한 요청시 캐쉬에 저장된 쿼리정보를 토대로 result값을 맵핑 시킨다고 한다.
(ibatis에서 제공하는 CacheModel과는 전혀무관한 얘기임)
이를 해결하기 위해선 remapResults="true" 속성을 추가해 주면 된다.
default remapResults="false" 이기때문에 항상 요청된 id와 동일한게
캐쉬에 저장되어 있다면 캐쉬의 내용으로 맵핑하려 할것이고
에러가 날것이다. 위 속성을 true로 지정하면
캐쉬의 내용을 무시하고 현재의 값을 가지고 맵핑시킴.
즉 아래와 같이 사용하면 된다.
<select id="fileInfo" remapResults="true" resultClass="java.lang.String" parameterClass="java.util.Map">
SELECT $columnName$
FROM $tableName$
WHERE $pkName$ = #pkValue#
</select>
출처: https://jace.tistory.com/57 [Jace's Blog]
'개발 > DB' 카테고리의 다른 글
MySQL database, data 복사하기 (0) | 2020.03.25 |
---|---|
Clob 타입을 varchar2 타입으로 (0) | 2018.02.14 |
오라클 REGEXP_LIKE (0) | 2015.12.16 |
ORA-00054 에러 (0) | 2015.11.25 |
해당 컬럼이 있는 테이블 찾기 (0) | 2015.09.14 |
설정
트랙백
댓글
글
엑셀 다운로드 로딩바 만들기2
파일을 다운받을 경우, 용량이 많아서 로딩바가 필요한 경우가 있다.
로딩바 이미지는 파일첨부 했습니다
function fn_excelDown(){ //파일 다운버튼을 눌렀을때 호출되는 함수
setCookie("fileDownload","false"); //쿠키 셋팅
blockUI(); //로딩바 호출
var frm = document.frmFillExcel;
frm.submit(); //엑셀 파일 다운 폼
}
function setCookie(c_name,value){
var date = new Date(1000);
document.cookie = "fileDownload=; expires="+date.toUTCString()+";path=/";
}
function getCookie(name){
var parts = document.cookie.split(name+"=");
if(parts.length == 2){
return parts.pop().split(";").shift();
}
}
var downloadTimer;
function blockUI() {
FunLoadingBarStart();
downloadTimer = setInterval(function() {
var token = getCookie("fileDownload");
if(token == "true") {
unBlockUI();
}
}, 1000 );
}
function unBlockUI() {
FunLoadingBarEnd();
clearInterval(downloadTimer);
}
function FunLoadingBarStart() {
var backHeight = $(document).height(); //뒷 배경의 상하 폭
var backWidth = window.document.body.clientWidth; //뒷 배경의 좌우 폭
var backGroundCover = "<div id='back'></div>"; //뒷 배경을 감쌀 커버
var loadingBarImage = ''; //가운데 띄워 줄 이미지
loadingBarImage += "<div id='loadingBar'>";
loadingBarImage += "<img src='../img/cultivation/loadingbar.gif' />";
loadingBarImage += "</div>";
$('body').append(backGroundCover).append(loadingBarImage);
$('#back').css({ 'width': backWidth, 'height': backHeight, 'opacity': '0.3' });
$('#back').show();
$('#loadingBar').show();
}
function FunLoadingBarEnd() {
$('#back, #loadingBar').hide();
$('#back, #loadingBar').remove();
}
<style>
#back{ position: absolute; z-index: 100; background-color: #000000; display:none; left:0; top:0; width:100%; height:100%}
#loadingBar{ position:absolute; left:50%; top: 40%; display:none; z-index:200; }
</style>
java 단에
Cookie cookie = new Cookie("fileDownload", "true");
response.addCookie(cookie);
추가해준다.
'개발 > 코딩' 카테고리의 다른 글
java Excel upload 및 DB 연동 (0) | 2022.09.20 |
---|---|
json 한글 깨짐 (0) | 2021.10.07 |
ajax, JSON 사용하기 (0) | 2020.05.28 |
JSON 데이터 추출 (0) | 2020.05.15 |
websocket 실시간 알림. (0) | 2020.05.13 |
설정
트랙백
댓글
글
ajax, JSON 사용하기
1. SELECT로 하나의 데이터가 나올때 쓰는 경우
# JSP #
$.ajax({
contentType:"application/x-www-form-urlencoded; charset=UTF-8",
type:"POST",
url:"/userLogin.do",
data: $("#form").serialize(),
dataType : 'json',
async: false,
success:function(data){
var resultCode = data.resultCode;
}
});
# JAVA #
@ResponseBody
@Transactional
@RequestMapping(value = "/userLogin.do")
public String loginUser(@ModelAttribute("vo") PlanResearcherVO vo, PlanResearcherVO failVo, ModelMap model, HttpServletRequest request, HttpSession sess) throws Exception {
JSONObject json = new JSONObject();
vo = planService.UserLogin(vo);
json.put("resultCode","0000"); //클라이언트 단에서 data.resultCode; 이런식으로 데이터를 꺼낼 수 있다
return json.toString();
}
2.JSON array 를 사용할 경우 (SELECT로 로우데이터를 가져올 경우 쓴다)
# JSP #
var addData = { "FM_SEQ": seq };
$.ajax({
contentType:"application/x-www-form-urlencoded; charset=UTF-8",
type:"POST",
url:"/farmerCropInfo.do",
data: addData,
dataType : 'json',
success:function(data){
for(ver i=0; i<data.length; i++){
var crType = data[i].CR_TYPE;
}
}
});
# JAVA #
@ResponseBody
@Transactional
@RequestMapping(value = "/planMapSelect.do")
public String planMapSelect(@ModelAttribute("vo") PlanLandVO vo, ModelMap model, HttpServletRequest request, HttpSession sess) throws Exception {
List<PlanLandVO> list = planService.PlanAddrList(vo);
JSONObject json = new JSONObject();
JSONArray jsonArray = new JSONArray();
for(int i =0; i<list.size(); i++){
json.put("SEQ", list.get(i).getSEQ());
jsonArray.add(json); //클라이언트 단에서 data[i].SEQ; 이런식으로 데이터를 꺼낼 수 있다
}
return jsonArray.toString();
}
'개발 > 코딩' 카테고리의 다른 글
json 한글 깨짐 (0) | 2021.10.07 |
---|---|
엑셀 다운로드 로딩바 만들기2 (0) | 2020.08.10 |
JSON 데이터 추출 (0) | 2020.05.15 |
websocket 실시간 알림. (0) | 2020.05.13 |
자바스크립트 문자열 치환 (0) | 2020.04.24 |
설정
트랙백
댓글
글
JSON 데이터 추출
## 1 ##
{
"response":{
"service":{"name":"data","version":"2.0","operation":"getfeature","time":"140(ms)"},
"status":"OK",
"record":{"total":"1","current":"1"},
"page":{"total":"1","current":"1","size":"10"},
"result":{
"featureCollection":{
"type":"FeatureCollection",
"bbox":[14099848.519760042,4222017.192630637,14102257.127454491,4224338.827704868],
"features":[{
"type":"Feature",
"geometry":{
"type":"MultiPolygon",
"coordinates":[[[[14101983.644347072,4223638.7044454515],[14102014.844596948,4223626.199630966]]]]
},
"properties":{
"li_eng_nm":"Jugok-ri",
"full_nm":"전라북도 고창군 고창읍 주곡리",
"li_kor_nm":"주곡리",
"li_cd":"4579025031"
},
"id":"LT_C_ADRI_INFO.159350"
}]
}
}
}
}
위와 같은 데이터를 받고
나는 coordinates 값을 가져오고 싶다면
data.response.result.featureCollection.features[0].geometry.coordinates
## 2. JSON Array 형태, ajax로 ##
{
"result1":[
{"INX":2,"DRAW_TYPE":"circle","DRAW_ID":"admin_2020429152853","CIRCLE_SIZE":"19.642358412966132","coordinate":"14103421.623586332,4223354.067356597"},
{"INX":4,"DRAW_TYPE":"area","DRAW_ID":"admin_2020429155920","CIRCLE_SIZE":"","coordinate":"14103439.376051702,4223339.665497251"}
]
}
$.ajax({
contentType:"application/x-www-form-urlencoded; charset=UTF-8",
type:"POST",
data:$("#researchForm").serialize(),
dataType:'json',
success:function(data){
var count = data.result1.length;
for(var i=0; i<count; i++){
var getId = data.result1[i].DRAW_ID;
}
}
});
'개발 > 코딩' 카테고리의 다른 글
엑셀 다운로드 로딩바 만들기2 (0) | 2020.08.10 |
---|---|
ajax, JSON 사용하기 (0) | 2020.05.28 |
websocket 실시간 알림. (0) | 2020.05.13 |
자바스크립트 문자열 치환 (0) | 2020.04.24 |
java file resize (이미지 사이즈) 수정하기 (0) | 2020.03.24 |
설정
트랙백
댓글
글
websocket 실시간 알림.
websocket : 사용자의 브라우저와 서버 사이의 인터렉티브 통신 세션을 설정할 수 있게 하는 기술.
## pom.xml 에 아래를 추가 한다 ##
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-websocket</artifactId>
<version>4.2.4.RELEASE</version>
</dependency>
## servlet-context.xml (전자정부프레임워크에선 egov-com-servlet.xml) ##
<bean id = "echoHandler" class="egovframework.plantation.web.websocket"/>
<websocket:handlers>
<websocket:mapping handler="echoHandler" path="/websocket/echo.do" />
</websocket:handlers>
// localhost:8080/websocket/echo.do 를 호출하면 echoHandler를 가진 id 인 class 를 호출하게 된다
## websocket.java ##
package egoveframework.plantation.web;
import java.util,ArrayList;
import java.util.List;
import org.springframework.web.socket.CloseStatus;
import org.springframework.web.socket.CloseStatusTextMessage;
import org.springframework.web.socket.CloseStatusWebSocketSession;
import org.springframework.web.socket.handler.CloseStatusTextWebSocketHandler;
public class websocket extends TextWebSocketHandler{
private List<WebSocketSession>sessionList = new ArrayList<WebSocketSession>();
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
sessionList.add(session); //접속되어 있는 유저들을 담는다
System.out.println("연결됨 : " +session.getId());
}
// 클라이언트가 서버로 메시지를 전송했을 때 실행되는 메서드
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
System.out.println("받음 : "+message);
String senderId = session.getId();
for(WebSfor (WebSocketSession sess : sessionList) {
sess.sendMessage(new TextMessage(senderId +" : " + message.getPayload()));
}
}
// 클라이언트와 연결을 끊었을 때 실행되는 메소드
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
sessionList.remove(session);
System.out.println("끊김 : "+ session.getId());
}
}
## top.jsp (어느 페이지에 있던 알림을 받기 위해서 공통적으로 쓰이는 페이지) ##
<div id="socketAlert" class="alert alert-success" role="alert" style="display:none;"></div>
<script>
var socket = null; //전역 변수로 선언
$(document).ready(function(){
connectWS();
});
function connectWS(){
var ws = new WebSocket("ws://localhost:8080/websocket/echo.do");
socket = ws;
ws.open = function(message){
console.log(message);
};
ws.onmessage = function(event){
$("#socketAlert").text(event.data);
$("#socketAlert").css("display", "block");
};
ws.onclose = function(event){
console.log("Server disConnect");
};
ws.onerror = function(event){
console.log("Server Error");
};
</script>
## 클라이언트 화면 ##
<input id="btnSend" value="Send" type="button">
<input type="text" id="msg" value="1212테스트test" class="form-control" />
<script>
$(document).ready(function(){
$("#btnSend").on("click", function(evt){
evt.preventDefault();
if(socket.readyState != 1) return;
let msg = $("#msg").val();
socket.send(msg); //소켓에 입력된 메시지를 보낸다
)};
});
</script>
== 더 간단한 방법 아래 참조==
https://nowonbun.tistory.com/285
== 위 참조한걸 바탕으로 내 소스 적용 ==
jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<c:import url="/layout/header.do"></c:import>
</head>
<body>
<form>
<!-- 송신 메시지를 작성하는 텍스트 박스 -->
<input id="textMessage" type="text" style="padding-top:100px;">
<!-- 메시지 송신을 하는 버튼 -->
<input onclick="sendMessage()" value="Send" type="button">
<!-- WebSocket 접속 종료하는 버튼 -->
<input onclick="disconnect()" value="Disconnect" type="button">
</form>
<br />
<!-- 콘솔 메시지의 역할을 하는 로그 텍스트 에리어.(수신 메시지도 표시한다.) -->
<script type="text/javascript">
// 「WebSocketEx」는 프로젝트 명
// 「websocket」는 호스트 명
// WebSocket 오브젝트 생성 (자동으로 접속 시작한다. - onopen 함수 호출)
var webSocket = new WebSocket("ws://localhost:8080/WebSocketEx/websocket.do");
// 콘솔 텍스트 에리어 오브젝트
var messageTextArea = $(".messageTextArea").val();
// WebSocket 서버와 접속이 되면 호출되는 함수
webSocket.onopen = function(message) {
$(".messageTextArea").val("Server connect...\n"); // 콘솔 텍스트에 메시지를 출력한다.
};
// WebSocket 서버와 접속이 끊기면 호출되는 함수
webSocket.onclose = function(message) {
$(".messageTextArea").val($(".messageTextArea").val()+"Server Disconnect...\n"); // 콘솔 텍스트에 메시지를 출력한다.
};
// WebSocket 서버와 통신 중에 에러가 발생하면 요청되는 함수
webSocket.onerror = function(message) {
$(".messageTextArea").val($(".messageTextArea").val()+"error...\n"); // 콘솔 텍스트에 메시지를 출력한다.
};
// WebSocket 서버로 부터 메시지가 오면 호출되는 함수
webSocket.onmessage = function(message) {
$(".messageTextArea").val($(".messageTextArea").val()+"Recieve From Server => "+message.data+"\n"); // 콘솔 텍스트에 메시지를 출력한다.
};
// Send 버튼을 누르면 호출되는 함수
function sendMessage() {
var message = $("#textMessage").val(); // 송신 메시지를 작성하는 텍스트 박스 오브젝트를 취득한다.
$(".messageTextArea").val($(".messageTextArea").val()+"Send to Server => "+message+"\n"); // 콘솔 텍스트에 메시지를 출력한다.
webSocket.send(message); // WebSocket 서버에 메시지를 송신한다.
message.value = ""; // 송신 메시지를 작성하는 텍스트 박스를 초기화한다.
}
// Disconnect 버튼을 누르면 호출되는 함수
function disconnect() {
webSocket.close(); // WebSocket 접속 해제
}
</script>
</body>
</html>
java
package egovframework.main.service;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.server.ServerEndpoint;
@ServerEndpoint("/WebSocketEx/websocket.do")
public class websocket {
// WebSocket으로 브라우저가 접속하면 요청되는 함수
@OnOpen
public void handleOpen() {
// 콘솔에 접속 로그를 출력한다.
System.out.println("client is now connected...");
}
// WebSocket으로 메시지가 오면 요청되는 함수
@OnMessage
public String handleMessage(String message) {
// 메시지 내용을 콘솔에 출력한다.
System.out.println("receive from client : " + message);
// 에코 메시지를 작성한다.
String replymessage = "echo " + message;
// 에코 메시지를 콘솔에 출력한다.
System.out.println("send to client : "+replymessage);
// 에코 메시지를 브라우저에 보낸다.
return replymessage;
}
// WebSocket과 브라우저가 접속이 끊기면 요청되는 함수
@OnClose
public void handleClose() {
// 콘솔에 접속 끊김 로그를 출력한다.
System.out.println("client is now disconnected...");
}
// WebSocket과 브라우저 간에 통신 에러가 발생하면 요청되는 함수.
@OnError
public void handleError(Throwable t) {
// 콘솔에 에러를 표시한다.
t.printStackTrace();
}
}
'개발 > 코딩' 카테고리의 다른 글
ajax, JSON 사용하기 (0) | 2020.05.28 |
---|---|
JSON 데이터 추출 (0) | 2020.05.15 |
자바스크립트 문자열 치환 (0) | 2020.04.24 |
java file resize (이미지 사이즈) 수정하기 (0) | 2020.03.24 |
자바 다른 서버로 sftp 파일 전송 (0) | 2020.03.23 |
설정
트랙백
댓글
글
자바스크립트 문자열 치환
GIS 개발을 하다가 좌표값을 db에 저장했는데 문자열을 치환해야하는 경우가 생겼다.
14102895.763908967,4224317.671008111,14102432.364424989,4223753.947924509,14103225.398593448,4223553.30072526,14103555.033277927,4223992.813637899,14102895.763908967,4224317.671008111
위의 좌표값을 아래와 같이 표시를 해야한다.
[[
[14105239.988929166, 4223257.282268806],
[14105234.785437182, 4223249.518770073],
[14105234.465436349 , 4223235.271775984],
[14105239.988929166 , 4223257.282268806]
]];
var getCoordinate =
14102895.763908967,4224317.671008111,14102432.364424989,4223753.947924509,14103225.398593448,4223553.30072526,14103555.033277927,4223992.813637899,14102895.763908967,4224317.671008111;
규칙을 살펴보면 두번째 콤마에 , -> ],[ 를 해주면 될 것 같다.
맨 앞의 [[[ 와 맨뒤의 ]]] 는 나중에 붙여주자.
var chg = getCoordinate.replace(/,/g, function (match, i, original) {
nth++;
return (nth%2 === 0) ? "],[" : match;
});
chg = '[[['+chg+']]]';
이렇게 하면 원하는 데이터가 나온다
match : 여기서는 콤마(,)
i : 콤마의 자릿수
original : 원래 데이터
nth%2 === 0 : 2로 나누어 떨어지는 콤마에 대해서만 치환을 해주기 위해서
'개발 > 코딩' 카테고리의 다른 글
JSON 데이터 추출 (0) | 2020.05.15 |
---|---|
websocket 실시간 알림. (0) | 2020.05.13 |
java file resize (이미지 사이즈) 수정하기 (0) | 2020.03.24 |
자바 다른 서버로 sftp 파일 전송 (0) | 2020.03.23 |
JSP 로딩바, 화면 반투명 레이어 (0) | 2019.06.05 |