레이블이 스프링실무교육학원인 게시물을 표시합니다. 모든 게시물 표시
레이블이 스프링실무교육학원인 게시물을 표시합니다. 모든 게시물 표시

2016년 7월 26일 화요일

Spring4 RESTFul 웹서비스예제(JSON응답으로오라클테이블데이터를,jackson json 라이브러리사용,@RestController, @ResponseBody) - 스프링실무교육학원



Spring4 RESTFul 웹서비스예제(JSON응답으로오라클테이블데이터를,jackson json 라이브러리사용,@RestController, @ResponseBody) - 스프링실무교육학원

 아래 예제는 오라클의 ONJ 라는 테이블에서 전체데이터를 읽어 JSON 응답으로 만드는 기능과, NAME으로 검색하여 한건의 레코드를 Onj 객체로 만들어 JSON 응답으로 보내는 기능의 예제인데, 응답을 기존에 많이 사용하는 JSP가 아닌 JSON으로 보내기 위해 jackson library 및 Spring4의 @RestController를 사용했다.

 또한 RestFul WebService를 구현하기 위해 파라미터가 아닌 URL경로로 NAME을 넘겨주면 @RequestMapping을 이용하여, 파라미터로 받아서 DB 쿼리에서 인자로 이용해 해당 NAME의 데이터를 검색 후 JSON 응답으로 만들어 클라이언트로 보냈다.

@RestController 어노테이션은@Controller를 상속받아 @Controller + @ResponseBody와 같은 의미로써 Restful웹서비스를 구현할 때  응답은 항상 응답바디(response body)에 보내져야 하는데 이를위해 스프링4.0에서 특별히 @ResrController를 제공한다. 

 도메인객체를 Web Service로 노출 가능하며 각각의 @RequestMapping method에 @ResponseBody할 필요가 없어진다. 그러므로 Spring MVC에서 @ReponseBody를 이용하여  JSON or XML 포맷으로 데이터를 넘길 수 있다.

0. 전체 이클립스 구성화면


1. 오라클 scott/tiger 계정에 실습을 위한 테이블 생성

SQL>  create table onj (
  2  name varchar2(50),
  3  url varchar2(50));

테이블이 생성되었습니다.

SQL>  insert into onj values ('community','ojc.asia');
1 개의 행이 만들어졌습니다.

SQL>  insert into onj values ('edu','ojcedu.com');
1 개의 행이 만들어졌습니다.

SQL> commit;
커밋이 완료되었습니다.



2. spring4rest2 라는 spring mvc 프로젝트 생성(Context이름도 같이 주기위해 top level package 마지막도 spring4rest2로 주자)

3. pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>onj.spring</groupId>
<artifactId>rest</artifactId>
<name>spring4rest2</name>
<packaging>war</packaging>
<version>1.0.0-BUILD-SNAPSHOT</version>
<properties>
<java-version>1.6</java-version>
<org.springframework-version>4.1.0.RELEASE</org.springframework-version>
<org.aspectj-version>1.6.10</org.aspectj-version>
<org.slf4j-version>1.6.6</org.slf4j-version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${org.springframework-version}</version>
<exclusions>
<!-- Exclude Commons Logging in favor of SLF4j -->
<exclusion>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.0.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-__EXPRESSION__</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${org.springframework-version}</version>
</dependency>
<!-- ORACLE -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.1.0.7.0</version>
</dependency>


<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.4.2</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.4.2</version>
</dependency>

<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.4.2</version>
</dependency>

<!-- AspectJ -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
<version>${org.aspectj-version}</version>
</dependency>

<!-- Logging -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${org.slf4j-version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>${org.slf4j-version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
</exclusion>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
<scope>runtime</scope>
</dependency>

<!-- @Inject -->
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>

<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>

<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>

<!-- DBCP -->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>


<!-- Test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.7</version>
<scope>test</scope>
</dependency>
</dependencies>
<repositories>
<repository>
<id>oracle</id>
<name>ORACLE JDBCRepository</name>
<url>http://maven.jahia.org/maven2</url>
</repository>
</repositories>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<version>2.9</version>
<configuration>
<additionalProjectnatures>
<projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
</additionalProjectnatures>
<additionalBuildcommands>
<buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
</additionalBuildcommands>
<downloadSources>true</downloadSources>
<downloadJavadocs>true</downloadJavadocs>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
<compilerArgument>-Xlint:all</compilerArgument>
<showWarnings>true</showWarnings>
<showDeprecation>true</showDeprecation>
</configuration>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>org.test.int1.Main</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>




4. /WEB-INF/web.xml


<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

<display-name>Spring MVC Rest(OracleJava Community)</display-name>

<!-- Processes application requests -->
<servlet>
<servlet-name>rest</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>rest</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

</web-app>



5.  /WEB-INF/rest-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-4.0.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<context:component-scan base-package="controller" />
<context:component-scan base-package="service" />
<context:component-scan base-package="dao" />
<mvc:annotation-driven />
</beans>


6. src/main/resources/db.properties

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.0.7:1521:onj
user=scott
password=tiger



7. OnjRestController.java


package controller;
import java.util.List;

import model.Onj;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import service.OnjService;

@RestController
@RequestMapping("/service/onj/")
public class OnjRestController {
@Autowired
private OnjService onjService;
@RequestMapping(method=RequestMethod.GET, headers="Accept=application/json")
public List<Onj> getAllOnj() {
List<Onj> onjs = onjService.getAllOnj();
return onjs;
}
@RequestMapping(value="/{name}", method=RequestMethod.GET, headers="Accept=application/json")
public Onj getOnj(@PathVariable String name) {
Onj onj = onjService.getOnjByName(name);
return onj;
}
}





8. DBUtil.java


package dao;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class DBUtil {
private static Connection connection = null;

public static Connection getConnection() {
if (connection != null)
return connection;
else {
try {
Properties prop = new Properties();
InputStream inputStream = DBUtil.class.getClassLoader()
.getResourceAsStream("db.properties");
prop.load(inputStream);
String driver = prop.getProperty("driver");
String url = prop.getProperty("url");
String user = prop.getProperty("user");
String password = prop.getProperty("password");
Class.forName(driver);
connection = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();

} catch (IOException e) {
e.printStackTrace();
}
return connection;
}
}

}



9. OnjDAO.java

package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import model.Onj;

import org.springframework.stereotype.Repository;

@Repository("onjDao")
public class OnjDAO {
private Connection connection;

public OnjDAO() {
connection = DBUtil.getConnection();
}

//onj 테이블의 모든 데이터를 LIST 구조에 담아 리턴
public List<Onj> getAllOnjs() {
List<Onj> users = new ArrayList<Onj>();
try {
Statement statement = connection.createStatement();
ResultSet rs = statement
.executeQuery("select name, url from onj");
while (rs.next()) {
Onj onj = new Onj();
onj.setName(rs.getString("name"));
onj.setUrl(rs.getString("url"));
users.add(onj);
}
} catch (SQLException e) {
e.printStackTrace();
}
return users;
}

//이름을 통래 데이터 한건 SELECT 후 Onj 객체에 담아 리턴
public Onj getOnjByName(String name) {
Onj onj = new Onj();
try {
PreparedStatement preparedStatement = connection
.prepareStatement("select name, url from onj where name=?");
preparedStatement.setString(1, name);

ResultSet rs = preparedStatement.executeQuery();

if (rs.next()) {
onj.setName(rs.getString("name"));
onj.setUrl(rs.getString("url"));
}
} catch (SQLException e) {
e.printStackTrace();
}
return onj;
}
}





10. model쪽의 Onj.java


package model;

import org.springframework.stereotype.Component;

public class Onj {
String name;
String url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
@Override
public String toString() {
return "NAME:" + name + ",URL:" + url;
}
}




11. service쪽의 OnjService.java


package service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import model.Onj;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import dao.OnjDAO;

@Service("onjService")
public class OnjService {
Map<String, Onj> onjs;
@Autowired
private OnjDAO onjDao;
public List<Onj> getAllOnj() {
return onjDao.getAllOnjs();
}
public Onj getOnjByName(String name) {
Onj onj = onjDao.getOnjByName(name);
return onj;
}
}



12. 실행화면

<br><br><br>






Spring JDBC로 작성된것(EMP예제)을 MyBatis(마이바티스) 변환하는 방법 -스프링실무교육학원


- Spring JDBC로 된 오라클 EMP 테이블 예제를 Spring, MyBatis(마이바티스) 변환하는 방법 -스프링실무교육학원


위 Spring JDBC 예제를 MyBatis를 이용한 예제로 수정하려면 아래 예제 작성 후 다음과 같은 순서로 변경 해 보자.

1. pom.xml에 mybatis 관련 부분 추가 후 maven update

                <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>

<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.2.2</version>
</dependency>


2. empServlet-servlet.xml 하단에 
    mybatis용 설정 추가(SqlSessionFactoryBean, SqlSessionTemplate)


  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
     <property name="dataSource" ref="dataSource" />
     <property name="configLocation" value="classpath:mybatis/sqlmap-config.xml" />
     <property name="mapperLocations" value="classpath:mybatis/mappers/*.xml" />
</bean>

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

3. 위 설정 파일의 경로에 맞도록 MyBatis 설정 파일 , 매퍼 XML 파일 생성

[classpath:mybatis/sqlmap-config.xml]

?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
  <configuration>
  <typeAliases>
  <typeAlias type="model.Emp" alias="emp" />
  </typeAliases>
  </configuration>

[classpath:mybatis/mappers/emp.xml]

   <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  <mapper namespace="dao.EmpDao">
  <resultMap type="emp" id="emp">
  <result property="empno" column="empno" />
  <result property="ename" column="ename" />
  <result property="sal" column="sal" />
  </resultMap>
  <select id="getEmpAll" resultMap="emp">select empno,ename,sal from emp</select>
  </mapper>


4. DAO 패키지에 EmpDao, EmpDaoImpl 두개의 클래스 작성

[EmpDao.java]

package dao;

import java.util.List;
import org.springframework.dao.DataAccessException;
import edu.biz.web.model.Emp;

public interface EmpDao {
public List<Emp> getEmpAll() throws DataAccessException;
}

[EmpDaoImpl.java]

package dao;

import java.util.List;

import javax.annotation.Resource;

import org.apache.ibatis.session.SqlSession;
import org.springframework.dao.DataAccessException;
import org.springframework.stereotype.Repository;

import model.Emp;

@Repository("empDao")
public class EmpDaoImpl implements EmpDao {
@Resource(name="sqlSession")
private SqlSession sqlSessionTemplate;
public List<Emp> getEmpAll() throws DataAccessException {
EmpDao dao = sqlSessionTemplate.getMapper(EmpDao.class);
List<Emp> empList = null;
empList = dao.getEmpAll();
return empList;
}

Spring WEB MVC/JDBC(오라클EMP테이블리스트보기)-Spring,MyBatis연동 - 스프링실무교육학원

[스프링자바교육]Spring WEB MVC/JDBC(오라클EMP테이블리스트),MyBatis,Spring JDBC,Spring WEB MVC예제 - 스프링실무교육학원

[스프링자바교육]Spring WEB MVC/JDBC(오라클EMP테이블리스트),MyBatis,Spring JDBC,Spring WEB MVC예제 - 스프링실무교육학원

Spring MVC 템플릿을 간단히 수정하여 오라클의 scott 계정의 EMP 테이블의 내용을 Spring MVC, Spring JDBC, MyBatis를 이용하여 간단히 출력해보자.

첨부 파일 참고하세요~

감사합니다.

스프링 자바빈로딩방법2가지(Lazy-Loading, Pre-Loading, BeanFactory,ApplicationContext) - 스프링실무교육학원

스프링 자바빈로딩방법2가지(Lazy-Loading, Pre-Loading, BeanFactory,ApplicationContext) - 스프링실무교육학원

스프링프레임워크에서는 자바빈을 인스턴스로 만든 후 로딩하는 하는 방법이 두가지 이다. BeanFactory를 사용하느냐 ApplicationContext containers를 사용하느냐에 따라서...

1. Lazy-Loading

메소드나 클래스가 요청을 받는 시점에 자바빈의 인스턴스를 만들고 로딩하는 방법이다.

BeanFactory factory = new XmlBeanFactory(
                        new InputStreamResource(
                        new FileInputStream("oraclejavacommunity.xml"))); // 1
OracleJavaComm ojc = (OracleJavaComm) factory.getBean("oracleJavaBean"); // 2

1번에서 BeanFactory 컨테이너에 의해 oraclejavacommunity.xml 파일이 로드되더라도 어떠한 빈도 인스턴스화 되지 않고 2번에서 oracleJavaBean이 요청을 받는시점에 인스턴스화 되고 로드된다. 즉 getBean메소드 호출시 빈이 로드되는 것이다.

2. Pre-loading

모든 빈들이 스프링 설정파일이 ApplicationContext 컨테이너에 의해 로드될 때 인스턴스로 만들어지고 로드된다.

ApplicationContext context =
            new ClassPathXmlApplicationContext("oraclejavacommunity.xml"); // 1 
OracleJavaComm ojc = (OracleJavaComm) factory.getBean("oracleJavaBean"); // 2

1번에서 모든 싱글톤 빈들이 인스턴스화 된다. 그러므로 빈이 여러개라면 시간이 소요될 것이다. 2번에서는 미리 컨테이너에서 만들어진 빈들이 클라이언트로 리턴된다.

[결론]

스프링 설정파일에 여러개의 자바빈이 정의되었다고 모두 자주 사용되는 것은 아닐 수 있다. 모두 자주 사용되지 않을수도 있으니 이러한 경우라면 요청이 있을 때 자바빈을 인스턴스로 만드는 것이 좋을 것이다. 물론 모두 자주 사용되는 빈이라면 한번에 로드하는 것도 좋은 방법이다.

스프링컨트롤러예외처리,@ExceptionHandler,@ControllerAdvice(Spring Framework @MVC) - 스프링실무교육학원

스프링컨트롤러예외처리,@ExceptionHandler,@ControllerAdvice(Spring Framework @MVC) - 스프링실무교육학원

@ExceptionHandler : 

스프링 MVC에서는 에러나 예외를 처리하기 위한 특별한 방법을 제공하는데 @ExceptionHandler 어노테이션을 이용하면 된다.
스프링 컨트롤러에서 정의한 메소드(@RequestMapping)에서 기술한 예외가 발생되면 자동으로 받아낼 수 있다. 이를이용하여 컨트롤러에서 발생하는 예외를 View단 JSP등으로 보내서 처리할 수 있다.

@ControllerAdvice :

@ControllerAdvice는 스프링3.2 이상에서 사용가능하며  @Controller 나 스프링 4.0이상에서 지원하는 @RestController 에서 발생하는 예외 등을 catch하는 기능을 가지고 있다. 
클래스 위에 @ControllerAdvice를 붙이고 어떤 예외를 잡아낼 것인지 내부 메소드를  선언하여 메소드 상단에 @ExceptionHandler(예외클래스명.class) 와 같이 기술한다.

스프링4.0이상에서는 특정한 컨트롤러만 지정해서 캐치할 수 있다.


첨부파일의 예제를 통해 이해해 보자.

감사합니다.


실무프로그래머 전문교육 (오라클,SQL,자바,스프링프레임워크,닷넷,안드로이드,웹퍼블리싱)
오라클자바커뮤니티교육센터(100%환급, 개인부담 0~20%) http://ojcedu.com

@CookieValue, @MVC(스프링컨트롤러에서쿠키사용예,카운터,Spring MVC)-자바스프링교육 - 스프링실무교육학원


@CookieValue, @MVC(스프링컨트롤러에서쿠키사용예,카운터,Spring MVC)-자바스프링교육 - 스프링실무교육학원

@CookieValue :

HTTP쿠키 값을 HttpServletRequest등을 통해 읽을 필요없이 스프링 컨트롤러에서 파라미터로 전달 받을 수 있게해주며, 쿠키가 존재하지 않으면 오류가 발생하고 required 속성 값을 이용해 필수여부 설정도 가능하고, defaultValue 속성 값을 이용해서 기본값을 지정하는 것도 가능하다.

해당하는 쿠키가 없다면 다음과 같은 오류가 발생한다.

java.lang.IllegalStateException: Missing cookie value '쿠키이름' of type java.lang.String

이를 해결하기 위해서 defaultValue를 사용하면 된다.

@RequestMapping("/hello.html")
public String hello(@CookieValue(value = "쿠키이름", defaultValue = "oraclejavacommunity")  String var) {
......
}

첨부파일 참고하세요.

2016년 7월 25일 월요일

스프링MVC Flash Attribute(RedirectAttributes, FlashMap) - 스프링실무교육학원

스프링MVC Flash Attribute(RedirectAttributes, FlashMap) - 스프링실무교육학원

MVC기반의 일반 웹어플리케이션에서 서버측으로 POST형태로 데이터를 전송하게되면 스프링 컨트롤로에서는 사용자 요청에서 데이터를 꺼내 데이터베이스에 저장하는 등의 일을 한다.
그런다음 사용자에게 성공한 상태정보를 보여주기위해 JSP 페이지등을 포워딩하게 된다. 이 경우 사용자가 F5키 등을 눌러 POST 방식의 요청을 여러번 보내게 되면 문제가 발생할 수도 있다.

이러한 문제점을 보완하기 위해 Spring MVC3.1 이상에서 RedirectAttributes, FlashMap을 이용하여 POST/Redirect/GET 패턴을 보완하기 위한 방법이 나왔는데 이 패턴을 이용하게되면 F5 키등을 눌러 리로드(multiple form submit)하는 경우 POST로 서버측으로 서브밋을 하는 것이 아니라 GET방식 형태로 뜬 JSP만 다시 리로드되게 할 수 있다. 

물론 이때 RedirectAttributes를 사용하여 데이터등을 저장한다면 Redirect된 후 즉시 사라지게 되고 사용자가 F5등을 눌러 리로드 하더라도 다시 서버로 다시 submit되어 저장되지 않게할 수 있다.

FlashMap, RedirectAttributes등을 이용하면 리다이렉트시 값의 전달을  쿼리스트링을 이용한 파라미터등으로 하지않고 임시 플래시메모리를 이용하여 보이지 않게 저장하고, 사용 후 삭제되도록 하는 것이다. 즉 리다이렉트시 데이터 숨겨 넘기는 방법을 제공하는 것이다.

FlashMap은 flash attribute등을 저장 할 수 있고, FlashMapManager를 이용하여  FlashMap  인스턴스등을 저장, 삭제등을 할 수 있다.

Spring MVC에서 FlashAttribute를 사용하기 위해서는 스프링3.1 이상에서만 가능하고
<mvc:annotation-driven /> 태그를 설정파일에 기술해야 한다.


첨부파일 참고하세요.

감사합니다.

스프링응답을 XML로(@XmlRootElement, @XmlElement,Spring @MVC)-자바스프링학원 - 스프링실무교육학원



스프링응답을 XML로(@XmlRootElement, @XmlElement,Spring @MVC)-자바스프링학원, 스프링 공부 열심히 하세요~

Spring3의 <mvc:annotation-driven/>는  JAXB 라이브러리를 사용할 수 있다면, 객체 -->  XML변환을 지원한다. JAXB는 JDK에 포함되어 있으므로 별도로 라이브러리에 추가할 필요는 없다.

모델쪽에 있는 객체중 XML로 변환할 객체에 대해서는 JAXB annotation을 사용하면 되고 컨트롤러의 메소드에는 @Response 어노테이션이 추가되어 있어야 한다.
(@XmlRootElement, @XmlElement)

첨부 파일예제 참고하세요~

감사합니다.

[@ApectJ,spring AOP]커스텀어노테이션, @annotation스프링충고,포인트컷에 @annotation 사용하기 - 스프링실무교육학원

[@ApectJ,spring AOP]커스텀어노테이션, @annotation스프링충고,포인트컷에 @annotation 사용하기 - 스프링실무교육학원

1. 사용자정의 어노테이션을 아래처럼 간단히 만들고

package spring.edu.oraclejavacommunity;

public @interface Loggable { 
}


2. Aspect를 작성하자.

package spring.edu.oraclejavacommunity;

import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;

@Aspect
public class OjcAspect {

    // 사전충고
    // @Loggable 어노테이션이 붙은 메소드에 아래 충고가 적용

    @Before("@annotation(spring.edu.oraclejavacommunity.Loggable)")
    public void OjcAdvice(){
        System.out.println("충고 받으시오...");
    }
}


3. 충고를 적용할 메소드에 아래처럼 @Loggable을 써주면 된다.

public class OjcService {     
    @Loggable
    public void order() {
......
    }     
}

실무프로그래머 전문교육 (오라클,SQL,자바,스프링프레임워크,닷넷,안드로이드,웹퍼블리싱)
오라클자바커뮤니티교육센터(100%환급, 개인부담 0~20%) http://ojcedu.com