@Entity(name = "test_jojo")
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Jojo {

    @Id
    @GeneratedValue
    @Column(name = "jo_id")
    private Long joId;

    @Column
    private LocalDateTime regDate;

}

 

public interface JojoRepository extends JpaRepository<Jojo, Long> {

    List<Jojo> findAllByRegDateBetween(LocalDateTime start, LocalDateTime end);

}

 

 

public void test() {
  LocalDateTime startDatetime = LocalDateTime.of(LocalDate.now().minusDays(1), LocalTime.of(0,0,0));
  LocalDateTime endDatetime = LocalDateTime.of(LocalDate.now(), LocalTime.of(23,59,59));

  jojoRepository.findAllByRegDateBetween(startDatetime, endDatetime));
}

 

어쩌다 스프링부트로 프로젝트를 시작하게 되어 초기 설정을 하는 와중에

aws client 사용을 위해, 관련 설정을 하다가 에러가 발생하였다.

 

 

implementation 'org.springframework.cloud:spring-cloud-starter-aws'

implementation 'org.springframework.cloud:spring-cloud-starter-aws-messaging'

위 dependencies를 추가하고

 

application.properties 에 분명 설정을 다한 것 같은데 run시 에러가 계속 발생하였다.

cloud.aws.credentials.access-key=엑세스키
cloud.aws.credentials.secret-key=시크릿키
cloud.aws.region.auto=false

 

Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stackResourceRegistryFactoryBean' defined in class path resource [org/springframework/cloud/aws/autoconfigure/context/ContextStackAutoConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.aws.core.env.stack.config.StackResourceRegistryFactoryBean]: Factory method 'stackResourceRegistryFactoryBean' threw exception; nested exception is java.lang.IllegalArgumentException: No valid instance id defined

 

알아보니

로컬에서 실행할때는 아래와 같이

 

cloud.aws.stack.auto=false

해당 설정을 추가해줘야 한다고 한다.

aws ec2환경에서 실행했으면 해당 설정을 하지 않아도 상관없다고 하는데, 로컬에서 실행할 때는 해당 설정을 해줘야 한다고 합니다.

(ec2에서 spring cloud프로젝트를 실행시키면 cloudformation 구성을 시작하는데, 이를 로컬에선 안 하기 위해서입니다)

 

참고 : https://jojoldu.tistory.com/300

txt파일을 읽는데


1    홍길동    20000

2    임꺽정    21002

3    춘 향    122414

4    jamse lee    123123


이런식으로 txt가 되어있으면 띄어쓰기 단위로 읽으면

이름부분에서 잘못 읽힌다. (이름에 띄어쓰기가 들어갈 수 도 있으니까)


그래서 txt문서에 구분을 탭('\t') 으로 하고

읽을 때 한줄을 읽은다음 tab을 기준으로 스플릿해주면

각각 잘라 사용 할 수 있다.


//////////////////////////////////////////////////////////


private List<Product> saleList = new ArrayList<Product>();


public void loadMenu() {

File file = new File("test.txt");

String[] splitedStr = null;


try {

//한글 깨짐현상 때문에 인코딩

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "euc-kr"));


String line = null;

splitedStr = null;


while ((line = reader.readLine()) != null) {


splitedStr = null;

splitedStr = line.split("\t");


for (int i = 0; i < splitedStr.length; i++) {

splitedStr[i] = splitedStr[i].trim();

}

//자른 데이터를 원하는 형식에 맞게 넣기

saleList.add(new Product(splitedStr[0], splitedStr[1], Integer.valueOf(splitedStr[2])));

}


reader.close();


} catch (FileNotFoundException fnf) {

fnf.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

참고용 예제


public void saveExcel() {


     String excelFile = "helllooo" + ".xlsx";

int rowNum = 0;


for (int i = 0; i < saleList.size(); i++) {

dayList.get(i).setCount(dayList.get(i).getCount() + saleList.get(i).getCount());

}


SXSSFWorkbook wb = new SXSSFWorkbook(100);


// 셀 스타일

CellStyle ct = wb.createCellStyle();

ct.setAlignment(CellStyle.ALIGN_CENTER);


Sheet sheet = wb.createSheet("First sheet");

if (sheet == null) {

System.out.println("sheet is null!");

return;

}


sheet.setColumnWidth(1, 9000);


Row row1 = sheet.createRow(rowNum);

rowNum++;


Cell cell_1 = row1.createCell(0);

cell_1.setCellValue("제품번호");

cell_1.setCellStyle(ct);

Cell cell_2 = row1.createCell(1);

cell_2.setCellValue("이름");

cell_2.setCellStyle(ct);

Cell cell_3 = row1.createCell(2);

cell_3.setCellValue("구매 개수");

cell_3.setCellStyle(ct);

Cell cell_4 = row1.createCell(3);

cell_4.setCellValue("가격");

cell_4.setCellStyle(ct);


for (int i = 0; i < dayList.size(); i++) {

Row row = sheet.createRow(rowNum);

for (int j = 0; j < 4; j++) {

Cell cel_1 = row.createCell(0);

cel_1.setCellValue(dayList.get(i).getSerial_no());

Cell cel_2 = row.createCell(1);

cel_2.setCellValue(dayList.get(i).getName());

Cell cel_3 = row.createCell(2);

cel_3.setCellValue(dayList.get(i).getCount());

cel_3.setCellStyle(ct);

Cell cel_4 = row.createCell(3);

cel_4.setCellValue(dayList.get(i).getPrice() * dayList.get(i).getCount());

}

rowNum++;

}


try {

FileOutputStream fileOut = new FileOutputStream(excelFile);

wb.write(fileOut);

fileOut.close();

wb.dispose();


JOptionPane.showMessageDialog(null, "엑셀로 저장 완료 (파일 이름 :" + excelFile + ")");

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

public String getCurrentTime(){

Calendar cd = Calendar.getInstance();

Date date = cd.getTime();

//밑의 데이트 포멧 부분은 원하는 포멧대로 수정하면 된다

String today =  (new SimpleDateFormat("yyyy년 MM월 dd일 HH시 mm분").format(date));

return today;

}

public int getByteLength(String str) {


int strLength = 0;

char tempChar[] = new char[str.length()];


for (int i = 0; i < tempChar.length; i++) {

tempChar[i] = str.charAt(i);


if (tempChar[i] < 128) {

strLength++;

} else {

strLength += 2;

}

}


return strLength;

}

자바에서 배열을 복사할 때 


for(int i=0; i < arr1.length; i++){

arr2[i] = arr1[i];

}


이런 식으로 반복문을 이용해 복사했었는데


System.arraycopy() 함수를 사용하면 간편하게 할 수 있다.


//////////////////////////


public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

src = 복사하고자 하는 배열. 복사 당하는?. 원본


srcPos = 배열에서 어느 부분부터 읽어올지 위치 (index)


dest = 복사하려는 곳, 대상


destPos = 어느 부분부터 쓸지 위치 (index)


length = 원본에서 얼마만큼 읽어올지

///////////////////////////


ex)

     arraycopy(arr1, 0, arr2, 0, arr1.length);

오랜만에 java공부를 위해 이클립스 (루나 ver)을 설치했는데


원인을 모르겠지만 sysout을 쓴 후 컨트롤 + 스페이스 를 누르면 

System.out.println();

이렇게 변환되던 기능이 되지 않아 찾아보았다.


  1. Go to Windows->Preferences->Java->Editor->Templates
  2. Select sysout template and edit it.
  3. Change the context from Java statement to Java.
이런 검색결과가 있어 해보니 잘 되었다.

해석하자면 

Windows->Preferences->Java->Editor->Templates 에 들어가서

sysout 항목을 edit 누른 후

context 항목을 Java statement 에서 Java로 바꾸어 주면 

잘된다는 뜻이다.


왜 변환이 안되었던 것인지는 자세히 더 알아봐야 할 것 같다.


스프링 프레임워크에서 작업을 하다가


어디서 잘못된지는 잘 모르겠는데


Maven Java EE Configuration Problem


이런 에러가 생겼다.


프로젝트를 실행하는데는 문제없었는데


그래도 오류표시를 지우기 위해 검색해본결과 간단하게 해결책을 찾았다.


//////////////////////////////////


프로젝트 오른쪽마우스 클릭 -> MAVEN -> Update Project


를 누르니 바로 해결되었다.

간단하게 excel 파일 만드는 법


난 struts 프레임워크에서 사용했지만 html의 contentType 속성 변경을

이용한 방법이라 다른곳에 적용하기에도 간편함


////////////////////////////////////////////


test_excel.jsp


<%@ page language="java" contentType="application/vnd.ms-excel; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib prefix="s" uri="/struts-tags"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<%

//파일 이름 설정부분

java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy-MM-dd");

String today = formatter.format(new java.util.Date());

String filename = new String("테스트_".getBytes("KSC5601"), "8859_1") + today;

    response.setHeader("Content-Disposition","attachment;filename="+filename+".xls");

    response.setHeader("Content-Description", "JSP Generated Data");


%>

</head>

<body>

<table border='1'>  

    <tr>  

       <th>번호</th>

       <th>data1</th>

       <th>data2</th>

       <th>data3</th>

       <th>data4</th>

    </tr>

    <s:iterator value="testList">

<tr align='center' >

           <td>${ROW_NUM}</td>

           <td>${DATA_1}</td>

           <td>${DATA_2}</td>

           <td>${DATA_3}</td>

           <td>${DATA_4}</td>

</tr> 

   </s:iterator>

   </table>

</body>

</html>


////////////////////////위의 소스를 호출해주면 엑셀파일에  body안의 테이블형태로 데이터가

저장되는것을 확인 할 수 있습니다.


ex) 호출부분


testAction.java


public String testExcel() throws Exception {

try {

 //출력할 리스트 생성부분

((TestVo)vo).setTestList(((List<HashMap>)((TestDao)dao).excel(((TestVo)vo))));

} catch (Exception e) {

logger.error(" CLASS : " + this.getClass().getName()  +"===" + e);

return ERROR;

}

return SUCCESS;

}

/////////////////////////////////////////////////////////////

testDao.java


public List<HashMap> excel(Object obj) throws Exception {

// TODO Auto-generated method stub

return (List<HashMap>)getSqlMapClientTemplate.getSqlMapClient().queryForList("test.sql.test_excel",obj);

}


////////////////////////////////////////////////////////////

testVo.java


private List<HashMap> testList;


public List<HashMap> gettestList() {

return testList;

}


public void settestList(List<HashMap> testList) {

this.testList= testList;

}


//////////////////////////////////////////////////////////////////

test-struts.xml


//경로부분 생략


<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">


<struts>

<package name="test" namespace="~~~~~~~~~~" extends="struts-login-interceptors">

<action name="testExcel" method="testExcel" class="~~~~~~~~~~~">

<result name="success">/~~~~~~/test_excel.jsp</result>

</action>

</package>


</struts>


//////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////

이런식으로 호출하면 된다.


spring 프레임워크에서 간단하게 ajax(json data) 사용법


pom.xml


<!-- Json -->           
<groupId>net.sf.json-lib</groupId>       
    <artifactId>json-lib</artifactId>       
    <version>2.4</version>       
    <classifier>jdk15</classifier>   
</dependency>
        
<dependency>
    <groupId>org.codehaus.jackson</groupId>
    <artifactId>jackson-mapper-asl</artifactId>
    <version>1.9.2</version>
</dependency>

////////////////////////////////////////////////////////////

DispatcherServlet XML 설정파일

<bean id="jsonView" class="org.springframework.web.servlet.view.json.MappingJacksonJsonView">
<property name="contentType" value="application/json;charset=UTF-8"> </property>
</bean>

////////////////////////////////////////////////////////////

web.xml

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.ajax</url-pattern>
</servlet-mapping>

////////////////////////////////////////////////////////////

Controller.java

@RequestMapping(value = "/login/selectLogin.ajax")
public ModelAndView login(CommandMap commandMap) throws Exception {
Map resultMap = new HashMap();
resultMap.put("result", 1);
ModelAndView modelAndView = new ModelAndView("jsonView", resultMap);

return modelAndView;
}
////////////////////////////////////////////////////////////

javascript

function login() {
jQuery.ajax(
{async : true
,type : "post"
,url : "/login/selectLogin.ajax"
,dataType : "json"
,data: $("#loginFrm").serialize()
,success : function(jsonData) {
var _login_result = jsonData.result;
if(_login_result == 1){
alert("로그인 성공!\n환영합니다.");
$("#loginFrm").attr("action", "/login/loginSuccess.do").submit();
} else {
alert("로그인 실패하였습니다. 아이디와 비밀번호를 재확인해 주세요.");
}
}
,error: function(request,status,error){
alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
}
});
}


'공부 > JAVA' 카테고리의 다른 글

(Eclipse) sysout 자동완성 안될 때  (2) 2016.03.09
(spring)[에러] Maven Java EE Configuration Problem  (1) 2015.12.28
(struts) 엑셀 파일 만들기  (0) 2015.12.17
(spring) web.xml  (0) 2015.10.21
(함수) split (문자열 자르기)  (0) 2015.10.01

서블릿 배포 기술자


영어로는 DD (Deploment Descriptor)라고 한다. 

web.xml은 WAS (Web Application Server)(Tomcat 등)이 최초 구동될 때, 

WEB-INF 디렉토리에 존재하는 web.xml을 읽고, 

그에 해당하는 웹 애플리케이션 설정을 구성한다. 

다시 말해, 각종 설정을 위한 설정파일이라고 이야기 할 수 있다.


////////////////////////////////////////////////////////////////////

<context-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>classpath*:config/spring/context-*.xml</param-value>

</context-param>


<context-param> 에 설정된 xml에 들어 있는 설정들을 모든 서블릿과 필터가 공유

///////////////////////////////////////////////////////////////////


<servlet>

        <servlet-name>action</servlet-name>

        <servlet-class>

            org.springframework.web.servlet.DispatcherServlet

        </servlet-class>

        <init-param>

            <param-name>contextConfigLocation</param-name>

            <param-value>

                /WEB-INF/config/*-servlet.xml

            </param-value>

        </init-param>

        <load-on-startup>1</load-on-startup>

</servlet>


<servlet-mapping>

        <servlet-name>action</servlet-name>

        <url-pattern>*.do</url-pattern>

</servlet-mapping>


<servlet> : 서블릿 정의

<servlet-name> : 서블릿의 이름

<servlet-class> : 서블릿 클래스 지정 - 패키지 경로를 포함한 클래스 이름이어야 한다.

<init-param> :  - <param-name> 파라미터의 이름

                     - <param-value> 서블릿 설정 내용이 들어 있는 .xml 파일의 경로가 들어가게 된다.

<load-on-startup> : 서버가 시작 될 때 초기화 순서를 정한다.  0보다 크면서 숫자가 작을수록 우선순위가 높다.

 

<servlet-mapping> : 서블릿이 처리할 URL 패턴 정의

<servlet-name> : 정의된 서블릿 중 서블릿 이름으로 매핑되어질 서블릿 선택

<url-pattern> : URL 의 패턴 입력

   - / : 모든 URL 을 받아들이는데 이 URL 들은 다른 패턴에서 다 걸러지고 남은 URL 들만 받게된다.

   - /* : / 와 같이 모든 URL을 다 받아들이지만 /와는 반대로 무조건 모든 URL 을 받아들이게 된다.

///////////////////////////////////////////////////////////////////


<listener>

        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


모든 servlet들과 filter들에 의해 공유되는 spring container를 생성

///////////////////////////////////////////////////////////////////


<filter>

        <filter-name>encodingFilter</filter-name>

        <filter-class>

            org.springframework.web.filter.CharacterEncodingFilter

        </filter-class>

        <init-param>

            <param-name>encoding</param-name>

            <param-value>utf-8</param-value>

        </init-param>

</filter>

<filter-mapping>

        <filter-name>encodingFilter</filter-name>

        <url-pattern>*.do</url-pattern>

</filter-mapping>


필터는 요청을 처리하기 전에 특정한 일을 수행하기 위해 주로 사용

///////////////////////////////////////////////////////////////////

<welcome-file-list>

        <welcome-file>index.jsp</welcome-file>

</welcome-file-list>


[출처] [Spring] web.xml|작성자 wofmaker

[출처] [Spring] web.xml|작성자 wofmaker

클라이언트의 사용자가 웹 브라우저로 웹 서버에 접속할 때 기본적으로 보여주는 메인 페이지

원형 : public String[] split(String regex)


문자열을 특정 문자열로 구분해서 자른 다음에 문자열 배열로 반환


ex) 

String str = "ab,cd,ef,gh";


String[]  strArray = str.split(",");   // 쉼표로 구분하여 자른 후 문자열 배열에 넣음


//   strArray[0] 에는 "ab"

strArray[1] 에는 "cd"

strArray[2] 에는 "ef"

strArray[3] 에는 "gh" 가 들어감


-------------------------------------------------------------------------

필요한 부분만 골라서 가져 올 수도 있음


ex)  

String str = "ab,cd,ef,gh";

String tmp = str.split(",")[1]   //쉼표로 구분하여 자른 후 인덱스 1번에 해당하는 문자열만 반환


//tmp 에는 "cd"가 들어감


=======================================


주의 split( 이부분 )    

       이부분에 들어갈 문자열이 '*' , '$' , '^' , '[' , ']' 등 정규식에 사용하는 문자일 경우는

       앞에 \\  (백슬러쉬 두개) 를 붙여줘야 함

+ Recent posts