<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>/*</url-pattern> </filter-mapping>
Category Archives: SpringFramwork
스프링 프레임워크 위키 – http://ko-wikipedia-orgwiki스프링_프레임워크
Spring Controller 에서 ServletContext 구하기
Spring Controller 에서 ServletContext 는 아래와 같이 Annotation 을 사용해서 간단하게 사용할 수 있습니다.
@Autowired private ServletContext servletContext;
[Spring] 스프링 3.0 에서 파일 다운로드 처리 (File Download)
스프링에서 지원하는 다운로드를 쓰려면 아래와 같이 하시오.!
일단 기본적으로 파일 다운로드 처리하기에 앞서서 알아야 할 사항을 배워보도록 하자.
1. 파일링크를 클릭할때 컨트롤러 클래스에게 파일패스와 파일이름을 던져주고
2. 받은 컨트롤러 클래스에서 그 파일 패스와 파일이름으로 file 을 만들어서 (DownloadController)
3. 뷰로 전달을 할 것이다.
4. 그럼 뷰에서 받은 file 정보를 이용해서 실제 파일을 읽어들인 다음 원하는 위치에 쓰는 작업을 한다. (DownloadView)
일반적인 컨트롤러 클래스에서 작업을 한 후, 뷰 페이지로 결과값을 뿌려주는 것인데
일반적인 뷰페이지는 JSP 페이지였다.
하지만 다운로드에 사용될 뷰는 JSP 가 아니라 클래스 파일이다.
그렇기 때문에 아래처럼 일반적으로 사용하던 viewResolver 가 처리하는 것이 아니라
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/"/> <property name="suffix" value=".jsp"/> <property name="order" value="1"/> </bean>
download 만을 처리하는 viewResolver 가 따로 존재해야 한다. 여기에는 id값이 없다…주의할것!!!!!!!!!
<bean class="org.springframework.web.servlet.view.BeanNameViewResolver"> <property name="order" value="0"/> </bean>
주의할 점은 위 두 코드에 포함된 프로퍼티를 보면 order 라는 프로퍼티가 있는데
이 프로퍼티는 두개이상 존재하는 viewResolver 를 위해서
우선순위를 매기는 것이다. 만약 우선순위를 명시 하지 않으면 “가장 낮은 우선순위를 갖게 된다.”
우선순위는 “0”이 가장 먼저 실행되고, 이후로 매겨지는 순서에 따라 실행된다.
다음 viewResolver가 실행되는 기준은 “null” 이 반환되느냐 가 기준이다.
그렇기 때문에 널값이 있을수 없는 InternalResourceViewResolver 가 우선순위가 높게 되면,
다른 viewResolver 는 사용되지 않게되는
문제가 있다. (항상 뷰 이름에 매핑이 되는 뷰 객체를 리턴하기 때문)
그래서 InternalResourceViewResolver 은 우선순위가 가장 낮아야 한다.
그러면 이제 BeanNameViewResolver 를 사용하는 법을 알아 보자
BeanNameViewResolver (파일 다운로드 viewResolver)
“null” 이 반환되지 않는다면, (즉 컨트롤러 클래스에서 리턴되온 뷰페이지 값과 일치하는 빈이 있는 경우)
컨트롤러 클래스에서 리턴되온 뷰페이지 값과 일치하는 빈이 등록되있는 경우는 그 빈에 해당하는 컨트롤러 클래스가
파일 다운로드를 처리하게 된다.
그렇기 때문에 컨트롤러 클래스에서 viewResolver 로 던져줄 뷰페이지 이름과, 처리할 View 클래스 빈이름이 같아야 한다.
(이말을 반대로 하자면, 실제 jsp 가 보여져야될 때는 리턴값과, view 빈 이름이 같아서는 절대 안된다.)
<bean id=”download”/>
– 이 코드가 다운로드를 처리할 뷰 클래스를 등록하는 것이다.
저기 id=”download” 라고 되있는 부분과, 클래스에서 리턴된 값이 같아야 한다.
그리고 url 을 처리할 컨트롤러 클래스도 등록되야되겠지.
<bean id="down" class="Spring.DownloadController"/>
여기 까지가 좀 복잡하지만 servlet.xml 파일을 설정하는 부분이다.
하나하나 천천히 다시 읽어보면 이해가 될 것이다.
파일 이름에 링크를 걸어서 컨트롤러 클래스로 넘기는 부분부터 시작
<a href="/Spring_margo/download.do?path=${path }&fileName=${itemBean.fileName }" > ${itemBean.fileName } </a> download.do 로 파일네임과 패스를 넘기게 되어있다.
그럼 저 url 을 처리하는 컨트롤 클래스는 아래와 같다.
<bean id="down" class="Spring.DownloadController"/> }
@Controller public class DownloadController implements ApplicationContextAware{ private WebApplicationContext context = null; @RequestMapping("download.do") public ModelAndView download(@RequestParam("path")String path, @RequestParam("fileName")String fileName){ String fullPath = path + "\\" + fileName; File file = new File(fullPath); return new ModelAndView("download", "downloadFile", file); } @Override public void setApplicationContext(ApplicationContext arg0) throws BeansException { // TODO Auto-generated method stub this.context = (WebApplicationContext)arg0; } }
@RequestMapping(“download.do”) 어노테이션으로 지정해준것처럼
download.do 가 들어오면 저 메소드가 동작한다.
링크에서 준것처럼 패스와 파일네임을 받아서
파일에 조합해서 쓰고 “download” 뷰페이지로 파일을 “downloadFile”이름으로 삽입하고 리턴시킨다.
그러면 <bean#e31600″>BeanNameViewResolver“>
저 viewResolver 가 먼저 리턴을 처리하려 할 것이다.
“download”로 등록된 빈이 있는지 찾아 보는데 우리는 아까 “download”로 뷰클래스를 등록시켜 놓았다.
<bean id="down" class="Spring.DownloadController"/> }
이제 DownloadView.java 클래스가 뷰페이지로 동작할 것이다.
뷰페이지에서는 map 에 등록된 파일을 이용해서 encoding 설정과 헤더설정을 해준 후 파일을 지정위치에 쓴다.
import java.io.File; import java.io.FileInputStream; 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 DownloadView extends AbstractView { public void Download(){ setContentType("application/download; utf-8"); } @Override protected void renderMergedOutputModel(Map<string, object=""> model, HttpServletRequest request, HttpServletResponse response) throws Exception { // TODO Auto-generated method stub File file = (File)model.get("downloadFile"); System.out.println("DownloadView --> file.getPath() : " + file.getPath()); System.out.println("DownloadView --> file.getName() : " + file.getName()); 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")); }// end if; 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); } catch(Exception e){ e.printStackTrace(); }finally{ if(fis != null){ try{ fis.close(); }catch(Exception e){} } }// try end; out.flush(); }// render() end; } </string,>
스프링(Spring)에서 프로퍼티 파일(.properties)을 사용해 보기
스프링 설정 파일(applicationContext.xml)에 다음 내용을 추가하면 돼요.
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="/WEB-INF/config/jdbc.properties" /> </bean>
스프링(Spring)에서 여러 properties 파일을 읽어오는 방법
스프링 설정 파일(applicationContext.xml)에 다음 내용을 추가하면 돼요.
<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="locations"> <list> <value>/WEB-INF/config/jdbc.properties</value> <value>/WEB-INF/config/settings.properties</value> </list> </property> </bean>
스프링 와 Spring EL 로 값 가져오기
1. XML <util:properties/> 설정을 해준다.<?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:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.2.xsd"> <util:properties id="prop" location="classpath:config/properties/sample.properties"/> </beans>2. 프로퍼티 파일 내용을 적어준다.
<pre><code>sample.prop1 = </code><code>test</code></pre> <div></div> <div><code># 우쭈쭈~</code></div> <div><code>sample.prop2 = \uc6b0\ucb48\ucb48~</code></div>3. EL 태그를 이용하여 값을 가져온다.
package com.tistory.stove99; import java.util.Properties; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class SampleBean { // Spring EL 로 값 가져오기 // Spring EL 이기 때문에 자유롭게 메소드 호출도 가능함. String 의 concat 메소드 호출 @Value("#{prop['sample.prop1'].concat(' abc')}") private String value1; @Value("#{prop['sample.prop2']}") private String value2; // util:properties 로 생성된 빈은 java.util.Properties 의 인스턴스이기 때문에 // 요렇게 Autowired 해서 쓸 수 있다. @Autowired Properties prop; public String val(String key){ return prop.getProperty(key); } public String toString(){ return String.format("value1 : %s, value2 : %s", value1, value2); } }4.다른방식으로 프로퍼티 값을 가져와본다.import org.springframework.context.support.ClassPathXmlApplicationContext; import com.tistory.stove99.SampleBean; public class SampleTest { public static void main(String[] args) { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("config/spring/*-context.xml"); SampleBean sample = context.getBean(SampleBean.class); // test System.out.println(sample.val("sample.prop1")); // value1 : test abc, value2 : 우쭈쭈~ System.out.println(sample); } }
Spring EL에 대해서 더 알아보고 싶으면 요 사이트를 참고하면 친절하게 알려줌.
http://static.springsource.org/spring/docs/3.0.x/reference/expressions.html
스프링 내가 해본 프로젝트…
스프링은 정말 잘 만든 프레임 워크다..
명실 공히.. 자바 웹개발에 있어 이제 빼놓을수없는 자리(?)까지 온것 같다..ㅎㅎ
스트러츠. 웹로직. 등등 추춘전국을 지나.. 스프링 천하로 통일 되는 기분..
그냥 심심해서 내가 지금까지 해본 스프링 프레임워크 관련 경험 내용을 기록해본다..
더 까먹기 전에 ^^;;
1. Spring FrameWork
2. Spring BATCH
3. Spring Security
4. Spring Quartz
적거 보니 … 얼마 안되네… ㅋ
추후 다른 경험을 하게 되면… 내용을 업데이트해야겠다..
개인적으로 Spring BATCH 와 Spring DATA를 조금더 심도 있게 공부해보고시프당 ^ㅡ^…
틈틈히 메모 하는 습관을 갖고.. 여기서 이만..
스프링은 내용이 어마어마하게 방대하다.. 어디가서 스프링좀 해봤냐? 하면..
이제 디테일하게 말해줘야한다… 스프링 전체를 말하기엔.. 이제 넘사벽 ^^ 이니깐.. ㅋ
할게 태산이구료.. ㅋ
스프링 리다이렉트
포스트는 스프링 2.5.6 으로 작업할때 작성한 내용이며,
스프링 3.1 이상버전에선 FlashAttribute 등을 활용하면 된다.
스프링mvc에서post요청 응답을 리다이렉트로 처리할때ModelAndView반환형식으로 처리하면request의 모든 attribute가 쿼리스트링에 다다다닥 달라붙어서 주소창에 출력된다.
필요없는 파라메터값들이 get값으로 줄줄이 붙어나오길래어디서 붙이는지 찾아봤더니 form컨트롤 post요청시 리다이렉트로 처리하면그렇게 된다는걸 구글뒤져서 겨우 발견…보통
return new ModelAndView("redirect:/test.do");
식으로 작성하는데 요걸
RedirectView rv = new RedirectView("/test.do"); rv.setExposeModelAttributes(false); return new ModelAndView(rv);
형식으로 처리해주면 쿼리스트링에 붙어나오는 attribute들을 지울 수 있다.
Spring Batch – Reference Documentation
3.0.1.RELEASE
Copyright © 2009, 2010, 2011, 2012, 2013, 2014
GoPivotal, Inc. All Rights Reserved.
Table of Contents
- 1. Spring Batch Introduction
- 2. What’s New in Spring Batch 3.0
- 3. The Domain Language of Batch
- 4. Configuring and Running a Job
- 5. Configuring a Step
-
- 5.1. Chunk-Oriented Processing
-
- 5.1.1. Configuring a Step
- 5.1.2. Inheriting from a Parent Step
- 5.1.3. The Commit Interval
- 5.1.4. Configuring a Step for Restart
- 5.1.5. Configuring Skip Logic
- 5.1.6. Configuring Retry Logic
- 5.1.7. Controlling Rollback
- 5.1.8. Transaction Attributes
- 5.1.9. Registering ItemStreams with the Step
- 5.1.10. Intercepting Step Execution
- 5.2. TaskletStep
- 5.3. Controlling Step Flow
- 5.4. Late Binding of Job and Step Attributes
- 6. ItemReaders and ItemWriters
-
- 6.1. ItemReader
- 6.2. ItemWriter
- 6.3. ItemProcessor
- 6.4. ItemStream
- 6.5. The Delegate Pattern and Registering with the Step
- 6.6. Flat Files
- 6.7. XML Item Readers and Writers
- 6.8. Multi-File Input
- 6.9. Database
- 6.10. Reusing Existing Services
- 6.11. Validating Input
- 6.12. Preventing State Persistence
- 6.13. Creating Custom ItemReaders and
ItemWriters
- 7. Scaling and Parallel Processing
- 8. Repeat
- 9. Retry
- 10. Unit Testing
- 11. Common Batch Patterns
-
- 11.1. Logging Item Processing and Failures
- 11.2. Stopping a Job Manually for Business Reasons
- 11.3. Adding a Footer Record
- 11.4. Driving Query Based ItemReaders
- 11.5. Multi-Line Records
- 11.6. Executing System Commands
- 11.7. Handling Step Completion When No Input is Found
- 11.8. Passing Data to Future Steps
- 12. JSR-352 Support
- 13. Spring Batch Integration
- A. List of ItemReaders and ItemWriters
- B. Meta-Data Schema
- C. Batch Processing and Transactions
-
- C.1. Simple Batching with No Retry
- C.2. Simple Stateless Retry
- C.3. Typical Repeat-Retry Pattern
- C.4. Asynchronous Chunk Processing
- C.5. Asynchronous Item Processing
- C.6. Interactions Between Batching and Transaction Propagation
- C.7. Special Case: Transactions with Orthogonal Resources
- C.8. Stateless Retry Cannot Recover
- Glossary
마이바티스 커넥션 설정
mybatis 커넥션 설정
package meeton.web.util.mybatis; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class MyBatis { private static final MyBatis self = new MyBatis(); public static MyBatis getInstance() { return self; } private SqlSessionFactory factory; private MyBatis() { reload(); } public SqlSessionFactory getFactory() { return factory; } public void reload() { try { factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis.xml")); } catch (Exception ex) { ex.printStackTrace(); } } }
[mybatis.xml]
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "<a href="http://mybatis.org/dtd/mybatis-3-config.dtd">http://mybatis.org/dtd/mybatis-3-config.dtd</a>"> <configuration> <properties resource="config.properties"/> <environments default="default"> <environment id="default"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driverClassName}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> <property name="poolMaximumActiveConnections" value="20"/> <property name="poolMaximumIdleConnections" value="20"/> <property name="poolMaximumCheckoutTime" value="20000"/> <property name="poolPingEnabled" value="true"/> <property name="poolPingQuery" value="select 1"/> <property name="poolPingConnectionsNotUsedFor" value="43200"/> <property name="poolTimeToWait" value="30000"/> <property name="driver.encoding" value="UTF-8"/> </dataSource> </environment> </environments> <mappers> <mapper resource="root/sub1/sub2/sample.xml"/> </mappers> </configuration>
[sample.xml]
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "<a href="http://mybatis.org/dtd/mybatis-3-mapper.dtd">http://mybatis.org/dtd/mybatis-3-mapper.dtd</a>"> <mapper namespace="test.mysql"> <select id="selectAllUsers" resultType="Map"> select * from user </select> <select id="selectUser" parameterType="String" resultType="Map"> select * from user where user = #{user} </select> </mapper></div> <div itemprop="articleBody">
==================================================================================
여기서 눈여겨 볼 사항이 <property name=”poolPingQuery” value=”select 1″/> 이다.
기존에 validationQuery 대신 poolPingQuery로 사용 하고 있다.
다음은 각 pool 과 관련된 속성 값 설명이다.
<property name="poolMaximumActiveConnections" value="20"/> : 동시 활성화 할 커넥션 수 <property name="poolMaximumIdleConnections" value="20"/> : 유휴상태의 커넥션 수 <property name="poolMaximumCheckoutTime" value="20000"/> : 커넥션 요청 후 획득까지 기다리는 시간 <property name="poolPingEnabled" value="true"/> : 커넥션 ping 테스트 <property name="poolPingQuery" value="select 1"/> : 커넥션이 살아 있는지 확인할 쿼리 <property name="poolPingConnectionsNotUsedFor" value="43200"/> : 커넥션이 얼마 동안 유휴상태면 닫히는지 판단하는 시간 <property name="poolTimeToWait" value="30000"/> : 사용 불가능한 커넥션 기다리는 시간 <property name="poolPingConnectionsOlderThan" value="43200"/> : 어떤 커넥션이 닫힐 상태인지 판단하는 기준시간
스프링 프레임워크 – 시큐리티 기초
스프링에서 제공하는 강력하고 유연한 스프링 시큐리티
조금 예전 자료이긴 해도, 기초 잡는데 도움이 될것 같다.
스프링 시큐리티를 적용해서 보안을 철저하게 !
오픈커뮤니티_20차_Spring+Security+따라하기(배포본)