spring XML 선언부

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd">
   
   
    <!--
     datasource 설정(propertyConfigurer 활용)
     com.synervelly.common.web.dataaccess 여기서 다른 객체를 받는다.
    -->
    <alias name="dataSource-${First.DbType}"  alias="dataSource1" />
    <alias name="dataSource-${Second.DbType}" alias="dataSource2" /><!-- 다른 데이터 소스를 받을수 있음. -->
       
   
    <!-- Oracle -->
    <bean id="dataSource-oracle" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${First.DriverClassName}"/>
        <property name="url" value="${First.Url}" />
        <property name="username" value="${First.UserName}"/>
        <property name="password" value="${First.Password}"/>
        <property name="initialSize" value="10"/>
        <property name="maxActive" value="10"/>
        <property name="maxIdle" value="5"/>
        <property name="maxWait" value="10000"/>       
    </bean>
   
     <!-- MS-SQL2008 -->
    <bean id="dataSource-mssql" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${Second.DriverClassName}"/>
        <property name="url" value="${Second.Url}" />
        <property name="username" value="${Second.UserName}"/>
        <property name="password" value="${Second.Password}"/>
        <property name="initialSize" value="10"/>
        <property name="maxActive" value="10"/>
        <property name="maxIdle" value="5"/>
        <property name="maxWait" value="10000"/>       
    </bean>   
</beans> 

위 파란색 부분은 프로퍼티 값에서 가져와 입력되는 점을 참고 하시면 됩니다.

ibatis  XML

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd          
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd">

    <!-- lob Handler -->
    <bean id="lobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />

    <!-- SqlMap setup for iBATIS Database Layer -->
    <bean id="sqlMapClient1" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocations">
            <list>
                <value>classpath:config/sqlmap/${First.DbType}/*.xml</value>
            </list>
        </property>
        <property name="dataSource" ref="dataSource-${First.DbType}"/>
        <property name="lobHandler" ref="lobHandler"/>
    </bean>
   
   
     <!-- SqlMap setup for iBATIS Database Layer -->
    <bean id="sqlMapClient2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocations">
            <list>
                <value>classpath:config/sqlmap/${Second.DbType}/*.xml</value>
            </list>
        </property>
        <property name="dataSource" ref="dataSource-${Second.DbType}"/>
        <property name="lobHandler" ref="lobHandler"/>
    </bean>
   
   
   
  
     
</beans>   
 

 

위와같이 선언 하면 각 각 2개의 데이터 소스를 사용할 수 있다.

DAO 부분

 

public class WebAbstractSecondDAO  extends SqlMapClientDaoSupport {
  
    protected WebAbstractSecondDAO() {
           }

    /**
     * Annotation 형식으로 sqlMapClient 를 받아와 이를
     * super(SqlMapClientDaoSupport) 의 setSqlMapClient
     * 메서드를 호출하여 설정해 준다.
     * @param sqlMapClient  
     */
    @Resource(name = "sqlMapClient1")
    public void setSuperSqlMapClient(SqlMapClient sqlMapClient) {
        super.setSqlMapClient(sqlMapClient);
    }

     } 

 

이노테이션을 이용하여

리소스를 주입힌다 .

 @Resource(name = "sqlMapClient1") 이부분

 

 

 

Spring Bean 정보는 싱글톤 객체로 생성되기 때문에

메모리에 존재한다고 보면 된다 .. 

 

ApplicationContext appContext = ContextLoaderListener.getCurrentWebApplicationContext();

(SqlMapClient) appContext.getBean("sqlMapClient"); 

위 방식으로 빈이름 sqlMapClient 과 케스팅 클레스 SqlMapClient 형태로 변환하면 내가 등록한 BEAN 정보를 가지고 올수 있다.

스프링 + quzrtz로 스케줄 관리

 

Spring 기반으로 반복적인 일을 하고 싶을떄 사용한다.

 

적용 범위

1. 특정 요일 특정 시간때 해당 프로세스를 실행 하고 싶을떄

2. 특정 초 (5초단위)마다 프로세스를 생항할떄.

 

적용

 maven

 <!-- Quartz framework -->
  <dependency>
   <groupId>org.quartz-scheduler</groupId>
   <artifactId>quartz</artifactId>
   <version>1.8.6</version>
  </dependency>

개발  -  QuartzJobBean  상속받아 executeInternal 메소드를 제정의 해준다.

public class JobSchedulerOpenAPI extends QuartzJobBean {
 private Logger logger = Logger.getLogger(this.getClass());
 protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
  
  logger.info("###################### 시작  ########################");
  //개발 할 내용
  logger.info("###################### 종료   ########################");
  
 }
}
 

 

스프링 XML 등록  ( 주기적으로 10초마다 실행 예 )

 

 <!-- 빈을 등록한다 -->

<bean name="jobSchedulerOpenAPI"  class="org.springframework.scheduling.quartz.JobDetailBean">

   <!-- 개발한 클레스 -->
  <property name="jobClass"   value="com.wf.weather.quartz. job.JobSchedulerOpenAPI" />
 </bean> 

 

 

<!-- 방법 1 -->
 <bean id="cronTriggerOpenApi" class="org.springframework.scheduling.quartz.SimpleTriggerBean"> <!-- 시작시 실생 되고 주기적으로 될떄 SimpleTriggerBean 을 사용한다 -->
  <property name="jobDetail" ref="jobSchedulerOpenAPI" />
  <property name="startDelay" value="1000"/>
  <property name="repeatInterval" value="900000"/>
 </bean>

 

 

<!-- 방법2 -->

<bean name="jobSchedulerFeedback"  class="org.springframework.scheduling.quartz.JobDetailBean">
  <property name="jobClass"   value="com.wf.weather.quartz.job.obSchedulerFeedback" />
 </bean> 
 <bean id="cronTriggerOpenApi" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="jobSchedulerOpenAPI" />
  <property name="cronExpression" value="0 10 2 * * ?" />
 </bean>

 

 

<!-- Scheduler -->
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="jobDetails">
   <list>
       <ref bean="jobSchedulerOpenAPI" />
       </list>
  </property>  
  <property name="triggers">
   <list>
        <ref bean="cronTriggerOpenApi" />
       </list>
  </property>  
 </bean>

 

 

 

 

설명

방법 1은 org.springframework.scheduling.quartz.SimpleTriggerBean 을 이용하여 프로세스를 실행한다 .

startDelay 시작후 몇초후 부터 실행 될 것인지 확인

 

방법 2은 org.springframework.scheduling.quartz.JobDetailBean을 이용하여 특정 시간 날짜 등을 지정하여 처리하는 방법

cronExpression 설정 방법은 아래 참고

--> http://dev.anyframejava.org/docs/anyframe/plugin/scheduling/4.5.3/reference/html/ch03.html

 

 

 

스케줄 처리 부는 org.springframework.scheduling.quartz.SchedulerFactoryBean  에서 처리한다.

 

 

 

 

 

 

Jquery 

 엔터키

 $('#searchKeyword').keydown(function(e){
   if(e.keyCode == 13){
     if($("#boardId").val()=='b001')
       $('#searchImg').click();
     else
       $('#searchImg2').click();
   }
});

   
    

 

 

 

<!-- fileViewResolver(download) -->
 <bean id="fileDownloadView" class="egovframework.synervelly.file.web.FileDownloadView" />
 <bean id="fileViewResolver"
  class="org.springframework.web.servlet.view.BeanNameViewResolver">
  <property name="order" value="0" />
 </bean> 

 

 

 

 

@RequestMapping(value="/admin/templet/insertTempletRegit.do") 
 public ModelAndView  insertTempletAdmin(@ModelAttribute("templetVO") TempletVO templetVO,
   @ModelAttribute("SessionVO") SessionVO sessionVO,
      HttpServletRequest request, ModelMap model)
            throws Exception { 
  File file = new File("C:/Users/SeungGyun/Downloads","SDFormatterv3.1.zip");
 
  
  return  new ModelAndView("fileDownloadView", "downloadFile", file);
 } 

 

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.FileCopyUtils;
import org.springframework.web.servlet.view.AbstractView;

public class FileDownloadView extends AbstractView {
 public FileDownloadView() {
  setContentType("application/download; charset=utf-8");
 }

 @Override
 protected void renderMergedOutputModel(Map<String, Object> model,
   HttpServletRequest request, HttpServletResponse response)
   throws Exception {
  File file = (File) model.get("downloadFile");
  response.setContentType(getContentType());
  response.setContentLength((int) file.length());
  String userAgent = request.getHeader("User-Agent");
  boolean ie = userAgent.indexOf("MSIE") > -1;
  String fileName = null;
  if (ie) {
   fileName = URLEncoder.encode(file.getName(), "utf-8");
  } else {
   fileName = new String(file.getName().getBytes("utf-8"),
     "iso-8859-1");
  }
  response.setHeader("Content-Disposition", "attachment; filename=\""
    + fileName + "\";");
  response.setHeader("Content-Transfer-Encoding", "binary");
  OutputStream out = response.getOutputStream();
  FileInputStream fis = null;
  try {
   fis = new FileInputStream(file);
   FileCopyUtils.copy(fis, out);
  } finally {
   if (fis != null)
    try {
     fis.close();
    } catch (IOException ex) {
    }
  }
  out.flush();
 }

작동 방식 리턴값이을 파일 다운로드 클레스로 넘기면 리턴 리졸버에서

파일 다운로드 방식으로 사용자에게 전송함 .

 

 

 

☆ 태그 적용 안되게..텍스트로...

htmlspecialchars(변수);

htmlspecialchars 함수는 HTML의 특수문자변환 함수로

< 는 &lt; 로 변환하고

> 는 &gt; 로 변환합니다.

★ addslashes() 함수
게시판에 글쓰기할때 사용자들이 특정문자를 입력하면 데이타베이스에 저장할때 오류가 발생할 수 있는데 이 함수는 따옴표나 \(역슬래쉬) 같은 문자들을 포함하고 있는 것에 문자열에서 해당문자의 앞에 역슬래쉬 문자를 집어넣어서 반환해주는 함수임.

예를 들어, $a 라는 php 변수에 방명록에 입력된 내용이 기억되었다고 가정할때
프로그램에서 다음과 같은 명령을 썼다고 가정해보면..
query문으로 insert into dbtable (bang) values ('$a');
그런데 $a에 입력한 사람이 '설악산'이 좋아요.
라고 입력하면 php에서 파싱한 후에는 다음과 같은 query문이 되겠죠.
insert into dbtable (bang) values (''설악산'이 좋아요.');
이와 같이 되면 정확한 내용이 디비테이블에 저장될 수가 없습니다.
에러가 납니다. 문법이 안 맞다고..

따라서 $a = addslashes($a) 해준 다음에 query를 준다면 다음과 같은
의미로 변하고 정상적으로 저장되겠죠.
insert into dbtable (bang) values ('\'설악산\'이 좋아요.');
이와같이 특수문자로 부터 발생될 수 있는 에러를 피하기위해
특수문자 앞에 역스래쉬를 붙여주는 일을 하는 함수입니다.

나중에 DB에서 읽어와서 웹브라우저에 뿌려줄때는 원래대로 되돌려서
출력해야하니까 백슬래쉬를 제거해주는
함수를 사용해야하는데 이것이 stripslashes() 함수라지요..

★ 텍스트박스..

<TEXTAREA name="" STYLE="ime-mode:active; overflow:auto">

한/영 키를 누르지 않고도 한글로 나오게 하려면 ime-mode:active;

그냥 영어 나오게 하려면 ime-mode:inactive;

텍스트박스에 스크롤 필요시에만 생기게 하려면 overflow:auto

아예 없애려면 overflow:hidden

참고) textarea에서는 태그가 텍스트로 나온다;;

그래서 사용하는 방법은 textarea를 hidden으로 하고 레이어나 아이프레임을 써서 한다고 하는데

아직 해보진 않았다;;

사실..이모티콘을 선택하면 텍스트박스안에 이모티콘이 나오게 하려고 했으나;;

하다가 포기하고 원시적인 방법으로 대충 해결..-_-;;

☆ 글쓰면 밑줄 나오게 하는 방법..

방법이야 여러가지가 있겠지;;

리스트를 보여줄때는 하나 뿌려줄때마다 밑줄 이미지도 뿌려주게 하면 될테고..

근데 글 내용을 보여줄때 밑줄나오게 하는거라;;

배경으로 넣으면 된다네요..

<div style='background-image: url(밑줄이미지경로); font-size:9pt; line-height:30px'>

밑줄이미지 예) http://myhome.naver.com/plandas/bgLine.jpg

->퍼온거라누가만들었는지는 잘 모름

 

 

 

 pom.xml

 

<opensymphony.sitemesh-version>2.4.2</opensymphony.sitemesh-version>

<dependency>
<groupId>opensymphony</groupId>
<artifactId>sitemesh</artifactId>
<version>${opensymphony.sitemesh-version}</version>
</dependency>

 

 

/osstem.synervelly/src/main/webapp/WEB-INF/sitemesh.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
    <property name="decorators-file" value="/WEB-INF/config/decorators.xml"/>
    <excludes file="${decorators-file}"/>

    <page-parsers>
        <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser"/>
    </page-parsers>

    <decorator-mappers>

        <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
            <param name="property.1" value="meta.decorator"/>
            <param name="property.2" value="decorator"/>
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper">
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.AgentDecoratorMapper">
            <param name="match.MSIE" value="ie"/>
            <param name="match.Mozilla [" value="ns"/>
            <param name="match.Opera" value="opera"/>
            <param name="match.Lynx" value="lynx"/>
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
            <param name="decorator" value="printable"/>
            <param name="parameter.name" value="printable"/>
            <param name="parameter.value" value="true"/>
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.RobotDecoratorMapper">
            <param name="decorator" value="robot"/>
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
            <param name="decorator.parameter" value="decorator"/>
            <param name="parameter.name" value="confirm"/>
            <param name="parameter.value" value="true"/>
        </mapper>

        <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper">
        </mapper>

  

        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}"/>
        </mapper>

    </decorator-mappers>

</sitemesh>  

 

 /osstem.synervelly/src/main/webapp/WEB-INF/config/decorators.xml

 <?xml version="1.0" encoding="euc-kr"?>


<decorators defaultdir="/WEB-INF/jsp/layout">
 <excludes><!-- 예외 URL -->
  
  
    </excludes>

    <decorator name="cadmin-main" page="main-layout.jsp">
        <pattern>/main/*</pattern>
    </decorator>

   
   
</decorators>

 /osstem.synervelly/src/main/webapp/WEB-INF/jsp/layout/main-layout.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="decorator" uri="http://www.opensymphony.com/sitemesh/decorator" %>
<!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">
<title><decorator:title default="제목없음" /></title>
<c:import url="/admin/include/style.do" />
<decorator:head />
</head>

<body onload="<decorator:getProperty property="body.onload" />">

<decorator:body />
</body>


</html> 

 

 

 

 

 

정부 프레임워크에 타일즈 적용

pom.xml

 

 

<org.apache.tiles-version>2.2.2</org.apache.tiles-version> 

 

<!-- tiles -->
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-core</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-servlet</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>
  <dependency>
   <groupId>org.apache.tiles</groupId>
   <artifactId>tiles-jsp</artifactId>
   <version>${org.apache.tiles-version}</version>
  </dependency>

 

 

 /WEB-INF/config/egovframework/springmvc/egov-com-servlet.xml

설명 tilesViewResolver 설정 을 1순위

viewResolver 2 순위로 설정하여 화면에 뿌림

타일즈가 아닐경우는 일반적인  jsp 호출

 

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
<property name="order" value="1" />
</bean>
<!-- Tiles 2 definition lists. 20110916. -->
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="definitions">
<list>
<value>classpath:/egovframework/tiles/layouts.xml</value>
</list>
</property>
</bean>
<!-- UrlBasedViewResolver InternalResourceViewResolver -->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
<property name="order" value="2" />
</bean>

 

 

 

 

layouts.xml 

설정 맘대로 만지자.. 설정에 맞게만 ..

 <?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
 
<tiles-definitions>
 
 <definition name="layouts-tiles" template="/WEB-INF/jsp/layouts-tiles.jsp">
  <put-attribute name="header"    value="/WEB-INF/jsp/header.jsp" />
  <put-attribute name="content"   value="" />
  <put-attribute name="footer"    value="/WEB-INF/jsp/footer.jsp" />
 </definition>
 
 <definition name="*.tiles" extends="layouts-tiles">
  <put-attribute name="content"   value="/WEB-INF/jsp/{1}.jsp" />
 </definition>
 <definition name="*/*.tiles" extends="layouts-tiles">
  <put-attribute name="content"   value="/WEB-INF/jsp/{1}/{2}.jsp" />
 </definition>
 <definition name="*/*/*.tiles" extends="layouts-tiles">
  <put-attribute name="content"   value="/WEB-INF/jsp/{1}/{2}/{3}.jsp" />
 </definition>
 
</tiles-definitions>

 

 jsp 파일 모음

jsp.zip

 

 

jazzlib.jar

 

juno64.zip

 

 

자바 한글 깨짐 문제 해결 자바 파일

팝업 POST 전송

 

var width = 400;
        var height = 500;
        var left = (screen.width/2)-(width/2);
        var top = (screen.height/2)-(height/2);       
        var win = window.open ("", "popupWindow", 'toolbar=no, location=no, directories=no, status=no, menubar=no, scrollbars=yes, resizable=no, copyhistory=no, width='+width+', height='+height+', top='+top+', left='+left);
        document.searchForm.target = "popupWindow";     
     document.searchForm.action = "<c:url value='/talk/store/massageRegit.do'/>";
     document.searchForm.submit();