2018년 3월 13일 화요일
terasoluna error
<t:messagesPanel />
<div>
<form:errors path="*" />
</div>
YearMonthUpdateUpdateBLogicOutput output = null;
try {
output = yearMonthUpdateUpdateBLogic.execute(input);
if (!result.hasErrors()) {
ResultMessages messages = ResultMessages.info().add("i.ne.fw.0002");
model.addAttribute(messages);
}
} catch (BusinessException e) {
model.addAttribute(e.getResultMessages());
} catch (Exception e) {
ResultMessages messages = ResultMessages.error().add("e.ne.fw.8002")
.add(ResultMessage.fromText(e.getMessage()));
model.addAttribute(messages);
}
BindingResult result = input.getResult();
if (result.hasErrors()) {
return null;
}
if (!mYearMonth.getSysYearMonth().equals(form.getSysYearMonth())) {
ResultMessages messages = ResultMessages.error().add("e.ne.fw.9001");
throw new BusinessException(messages);
}
@Autowired、@Inject、@Resourceの違いについての検証
@Autowired、@Inject、@Resourceの違いについての検証
Java
spring
この記事は最終更新日から1年以上が経過しています。
@Autowired、@Inject、@Resourceについて、共通的な動きとしては、何れも自動でフィールドにbeanをインジェクションすることです。今回はそれらの違いについて、検証してみます。
@Resource⇨javax.annotation
@Inject⇨javax.inject
@Autowired⇨org.springframework.bean.factory
事前準備
以下のクラスを用意する。
・インタフェースクラスPrint
・インタフェースクラスPrintの実装クラスHelloWorldPrintImp
・インタフェースクラスPrintの実装クラスHelloMoonPrintImp
public interface Print {
public void print();
}
@Component
public class HelloWorldPrintImp implements Print {
@Override
public void print() {
System.out.println("Hello World");
}
}
@Component
public class HelloMoonPrintImp implements Print {
@Override
public void print() {
System.out.println("Hello Moon");
}
}
検証1
@Autowired
private Print print;
@Inject
private Print print;
@Resource
private Print print;
上記のケースは、何れも例外NoUniqueBeanDefinitionExceptionが発生した。
インタフェースクラスPrintの実装クラスのbeanがユニックでないのが原因である。
検証2
@Autowired
private Print helloWorldPrintImp;
@Inject
private Print helloWorldPrintImp;
@Resource
private Print helloWorldPrintImp;
インジェクション対象のフィルド名を@Componentのクラス名と一致すればに、検証1の例外を回避し、上記何れも正常にインジェクションできる。
実行結果は以下の通りです。
@Autowired:Hello World
@Inject:Hello World
@Resource:Hello World
検証3
@Autowired
@Qualifier("helloWorldPrintImp")
private Print print;
@Inject
@Qualifier("helloWorldPrintImp")
private Print print;
@Resource
@Qualifier("helloWorldPrintImp")
private Print print;
@Qualifier("name")を上記のアノテーションと併用することで、インジェクション対象bean名を指定でき、検証1の例外も同様に回避する。
実行結果は以下の通りです。
@Autowired:Hello World
@Inject:Hello World
@Resource:Hello World
検証4
@Autowired
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
@Inject
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
@Resource
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
フィルド名=コンポーネントクラス名、且つ@Qualifierで別のコンポーネントを指定する場合、@Autowiredと@Injectの動きは一緒であり、@Qualifierで指定するコンポーネントがインジェクションされている。
@Resourceは@Qualifierで指定のコンポーネントを無視し、フィルド名と一致のコンポーネントがインジェクションされている。
実行結果は以下の通りです。
@Autowired:Hello Moon
@Inject:Hello Moon
@Resource:Hello World
また、@Resource(name="name")でコンポーネント名を指定できる。
@Resource(name="helloMoonPrintImp")
private Print helloWorldPrintImp;
その場合に、nameで指定されるコンポーネントがインジェクションされる。
実行結果は以下の通りです。
@Resource:Hello Moon
結論
タイプ一致の場合に、インジェクションの優先順位:
@Autowiredと@Inject
1.Qualifier指定のコンポーネント
2.フィルド名と一致のコンポーネント
@Resource
1.@Resource(name="name")で指定のコンポーネント
2.フィルド名と一致のコンポーネント
3.Qualifier指定のコンポーネント
Java
spring
この記事は最終更新日から1年以上が経過しています。
@Autowired、@Inject、@Resourceについて、共通的な動きとしては、何れも自動でフィールドにbeanをインジェクションすることです。今回はそれらの違いについて、検証してみます。
@Resource⇨javax.annotation
@Inject⇨javax.inject
@Autowired⇨org.springframework.bean.factory
事前準備
以下のクラスを用意する。
・インタフェースクラスPrint
・インタフェースクラスPrintの実装クラスHelloWorldPrintImp
・インタフェースクラスPrintの実装クラスHelloMoonPrintImp
public interface Print {
public void print();
}
@Component
public class HelloWorldPrintImp implements Print {
@Override
public void print() {
System.out.println("Hello World");
}
}
@Component
public class HelloMoonPrintImp implements Print {
@Override
public void print() {
System.out.println("Hello Moon");
}
}
検証1
@Autowired
private Print print;
@Inject
private Print print;
@Resource
private Print print;
上記のケースは、何れも例外NoUniqueBeanDefinitionExceptionが発生した。
インタフェースクラスPrintの実装クラスのbeanがユニックでないのが原因である。
検証2
@Autowired
private Print helloWorldPrintImp;
@Inject
private Print helloWorldPrintImp;
@Resource
private Print helloWorldPrintImp;
インジェクション対象のフィルド名を@Componentのクラス名と一致すればに、検証1の例外を回避し、上記何れも正常にインジェクションできる。
実行結果は以下の通りです。
@Autowired:Hello World
@Inject:Hello World
@Resource:Hello World
検証3
@Autowired
@Qualifier("helloWorldPrintImp")
private Print print;
@Inject
@Qualifier("helloWorldPrintImp")
private Print print;
@Resource
@Qualifier("helloWorldPrintImp")
private Print print;
@Qualifier("name")を上記のアノテーションと併用することで、インジェクション対象bean名を指定でき、検証1の例外も同様に回避する。
実行結果は以下の通りです。
@Autowired:Hello World
@Inject:Hello World
@Resource:Hello World
検証4
@Autowired
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
@Inject
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
@Resource
@Qualifier("helloMoonPrintImp")
private Print helloWorldPrintImp;
フィルド名=コンポーネントクラス名、且つ@Qualifierで別のコンポーネントを指定する場合、@Autowiredと@Injectの動きは一緒であり、@Qualifierで指定するコンポーネントがインジェクションされている。
@Resourceは@Qualifierで指定のコンポーネントを無視し、フィルド名と一致のコンポーネントがインジェクションされている。
実行結果は以下の通りです。
@Autowired:Hello Moon
@Inject:Hello Moon
@Resource:Hello World
また、@Resource(name="name")でコンポーネント名を指定できる。
@Resource(name="helloMoonPrintImp")
private Print helloWorldPrintImp;
その場合に、nameで指定されるコンポーネントがインジェクションされる。
実行結果は以下の通りです。
@Resource:Hello Moon
結論
タイプ一致の場合に、インジェクションの優先順位:
@Autowiredと@Inject
1.Qualifier指定のコンポーネント
2.フィルド名と一致のコンポーネント
@Resource
1.@Resource(name="name")で指定のコンポーネント
2.フィルド名と一致のコンポーネント
3.Qualifier指定のコンポーネント
@Component、@Service、@Repository、@Controllerの違いについて
@Component、@Service、@Repository、@Controllerの違いについて
Java
spring
この記事は最終更新日から1年以上が経過しています。
Springアノテーション「@Component、@Service、@Repository、@Controller」について、
動きとして基本的同じであり、何れもアノテーションが付与されたクラスをSpringのDIコンテナにbeanとして登録します。
使い分けとしては、Spring MVCにおいてコントローラー層のクラスには@Contoroller、
サービス層のクラスには@Serivice、データ層のクラスには@Repository、
どれにも当てはまらない場合は@Componentを付けます。
@Controller
Spring MVCでコントローラー層のクラスに付与する。
Controller は、主に以下の役割を担う。
・画面遷移の制御
・ドメイン層の Service の呼出 (主処理を実行する)
@Controller
@RequestMapping("findProduct")
public class FindProductController {
@Inject
FindProductService findProductService;
@RequestMapping(value="list")
public String list(Model model) {
Collection<Product> products = findProductService.findAll();
model.addAttribute("products", products);
return "product/list";
}
}
@Service
Sping MVCでサービス層のクラス(ビジネスロジック等)に付与する。
Service は業務処理を提供する。
@Service
public class FindProductServiceImp implements FindProductService {
@Inject
FindProductRepository findProductRepository;
public Todo findAll() {
Collection<Product> products = findProductRepository.findAll();
if (products == null) {
// エラー処理
...
}
return products;
}
}
@Repository
Spring MVCでデータ層のクラス(DAO等のDBアクセスを行うクラス)に付与する。
@Repository
public class FindProductRepositoryImpl implements FindProductRepository {
private Collection<Product> products;
@Override
public Collection<Product> findAll() {
return products;
}
}
@Component
Spring MVCに限らず、SpringのDIコンテナにbeanとして登録したいクラスへ付与する。
@Component
public class checkComponentImp implements checkComponent{
@Override
public boolean check(BLogicParam param) {
...
}
}
Java
spring
この記事は最終更新日から1年以上が経過しています。
Springアノテーション「@Component、@Service、@Repository、@Controller」について、
動きとして基本的同じであり、何れもアノテーションが付与されたクラスをSpringのDIコンテナにbeanとして登録します。
使い分けとしては、Spring MVCにおいてコントローラー層のクラスには@Contoroller、
サービス層のクラスには@Serivice、データ層のクラスには@Repository、
どれにも当てはまらない場合は@Componentを付けます。
@Controller
Spring MVCでコントローラー層のクラスに付与する。
Controller は、主に以下の役割を担う。
・画面遷移の制御
・ドメイン層の Service の呼出 (主処理を実行する)
@Controller
@RequestMapping("findProduct")
public class FindProductController {
@Inject
FindProductService findProductService;
@RequestMapping(value="list")
public String list(Model model) {
Collection<Product> products = findProductService.findAll();
model.addAttribute("products", products);
return "product/list";
}
}
@Service
Sping MVCでサービス層のクラス(ビジネスロジック等)に付与する。
Service は業務処理を提供する。
@Service
public class FindProductServiceImp implements FindProductService {
@Inject
FindProductRepository findProductRepository;
public Todo findAll() {
Collection<Product> products = findProductRepository.findAll();
if (products == null) {
// エラー処理
...
}
return products;
}
}
@Repository
Spring MVCでデータ層のクラス(DAO等のDBアクセスを行うクラス)に付与する。
@Repository
public class FindProductRepositoryImpl implements FindProductRepository {
private Collection<Product> products;
@Override
public Collection<Product> findAll() {
return products;
}
}
@Component
Spring MVCに限らず、SpringのDIコンテナにbeanとして登録したいクラスへ付与する。
@Component
public class checkComponentImp implements checkComponent{
@Override
public boolean check(BLogicParam param) {
...
}
}
[Spring] @Autowired, @Resource, @Inject의 차이 Spring
[Spring] @Autowired, @Resource, @Inject의 차이 Spring
2014. 7. 7. 18:01
https://blog.naver.com/platinasnow/220053030295
이번에 소개하는 세가지 어노테이션 @Autowired, @Resource,@Inject은 모두 의존관계를 자동으로 연결해주는 기능을 가진 어노테이션입니다. 다만 조금씩의 차이가 있습니다.
@Autowired
@Inject
@Resource
범용
스프링 전용
자바에서 지원
자바에서 지원
연결방식
타입에 맞춰서 연결
타입에 맞춰서 연결
이름으로 연결
자세한 설명을 하자면, @Inject와 @Resource는 JSR에 실려있는 자바 기존의 어노테이션입니다. 반면 @Autowired의 경우에는 스프링에서 등장한 어노테이션입니다. 따라서 스프링 이외에서는 사용 할 수 없습니다. 만약에 프로젝트를 스프링에서 다른 프레임워크로 바꿀 생각이 있으시다면 @Autowired보단 @Inject나 @Resource를 쓰시면 됩니다. 다만 이런 경우는 거의 없다고 봅니다.
또한 연결 방식은 @Autowired와 @Inject는 타입에 맞춰서 하는 반면, @Resource는 이름에 맞춰서 연결하게 됩니다. 예를 들어보겠습니다.
Bird 인터페이스를 상속하는 Chicken과 Penguin 이라는 클래스가 있다고 합시다.
Chicken과 Penguin 클래스를 연결할 것이므로 @Component로 빈에 등록해주었습니다.
public class Bird{}
@Component
public class Chicken implements Bird{}
@Component
public class Penguin implements Bird{}
그리고 다음과 같이 연결해봅시다.
@Autowired
private Chicken penguin; //Chicken 타입으로 연결됩니다.
@Inject
private Penguin chicken; //Penguin 타입으로 연결됩니다.
@Resource
private Chicken penguin; //penguin 타입으로 연결됩니다만, Chicken 클래스를 자료형으로 두었기에 캐스팅이 되지 않아 에러가 납니다
@Resource
private Bird penguin; //penguin 타입으로 연결되어 호출해보면 penguin 클래스의 값을 호출하는 것을 볼 수 있습니다.
@Autowired와 @Inject의 경우에도 @Qualifier 어노테이션을 사용하면, 타입 이외의 방법으로도 연결 할 수 있습니다.
@Autowired
@Qualifier("chicken")
pirvate Brid penguin;
위와 같이 쓰면 이름에 상관없이 Chicken 타입으로 연결되는 것을 알 수 있습니다. 이렇게 @Qualifer와 함께 쓰면 더욱 강력한 기능을 쓸 수 있는 장점이 있습니다.
[출처] [Spring] @Autowired, @Resource, @Inject의 차이|작성자 심해펭귄
2014. 7. 7. 18:01
https://blog.naver.com/platinasnow/220053030295
이번에 소개하는 세가지 어노테이션 @Autowired, @Resource,@Inject은 모두 의존관계를 자동으로 연결해주는 기능을 가진 어노테이션입니다. 다만 조금씩의 차이가 있습니다.
@Autowired
@Inject
@Resource
범용
스프링 전용
자바에서 지원
자바에서 지원
연결방식
타입에 맞춰서 연결
타입에 맞춰서 연결
이름으로 연결
자세한 설명을 하자면, @Inject와 @Resource는 JSR에 실려있는 자바 기존의 어노테이션입니다. 반면 @Autowired의 경우에는 스프링에서 등장한 어노테이션입니다. 따라서 스프링 이외에서는 사용 할 수 없습니다. 만약에 프로젝트를 스프링에서 다른 프레임워크로 바꿀 생각이 있으시다면 @Autowired보단 @Inject나 @Resource를 쓰시면 됩니다. 다만 이런 경우는 거의 없다고 봅니다.
또한 연결 방식은 @Autowired와 @Inject는 타입에 맞춰서 하는 반면, @Resource는 이름에 맞춰서 연결하게 됩니다. 예를 들어보겠습니다.
Bird 인터페이스를 상속하는 Chicken과 Penguin 이라는 클래스가 있다고 합시다.
Chicken과 Penguin 클래스를 연결할 것이므로 @Component로 빈에 등록해주었습니다.
public class Bird{}
@Component
public class Chicken implements Bird{}
@Component
public class Penguin implements Bird{}
그리고 다음과 같이 연결해봅시다.
@Autowired
private Chicken penguin; //Chicken 타입으로 연결됩니다.
@Inject
private Penguin chicken; //Penguin 타입으로 연결됩니다.
@Resource
private Chicken penguin; //penguin 타입으로 연결됩니다만, Chicken 클래스를 자료형으로 두었기에 캐스팅이 되지 않아 에러가 납니다
@Resource
private Bird penguin; //penguin 타입으로 연결되어 호출해보면 penguin 클래스의 값을 호출하는 것을 볼 수 있습니다.
@Autowired와 @Inject의 경우에도 @Qualifier 어노테이션을 사용하면, 타입 이외의 방법으로도 연결 할 수 있습니다.
@Autowired
@Qualifier("chicken")
pirvate Brid penguin;
위와 같이 쓰면 이름에 상관없이 Chicken 타입으로 연결되는 것을 알 수 있습니다. 이렇게 @Qualifer와 함께 쓰면 더욱 강력한 기능을 쓸 수 있는 장점이 있습니다.
[출처] [Spring] @Autowired, @Resource, @Inject의 차이|작성자 심해펭귄
[Spring] ViewResolver 설정
[Spring] ViewResolver 설정
2014.12.18 23:51
Posted in Programing/Spring by devbox
ViewResolver 설정
뷰 영역 구현
컨트롤러는 최종적으로 결과를 출력할 뷰와 뷰에 전달할 객체를 담고 있는 ModelAndView 객체를 리턴한다.
DispatherServlet은 ViewResolver를 사용하여 결과를 출력할 View 객체를 구하고, 구한 View 객체를 이용하여 내용을 생성한다.
1. 컨트롤러 구현 및 설정 추가
컨트롤러를 구현하려면 먼저 @Contoller 어노테이션을 클래스에 적용한다. 그리고, @RequestMapping 어노테이션을 이용해서 클라이언트의 요청을 처리할 메서드를 지정한다.
package madvirus.spring.chap06.controller;
import java.util.Calendar;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
// @Controller 어노테이션은 해당 클래스가 스프링 MVC의 컨트롤러를 구현한 클래스라는 것을 지정한다.
@Controller
public class HelloController {
// @RequestMapping 어노테이션은 값으로 지정한 요청 경로를 처리한 메서드를 설정한다.
// 이 경우 http://host:port[/컨텍스트 경로]/hello.do 요청을 HelloController 클래스의 hello() 메서드가 처리하게 된다.
@RequestMapping("/hello.do")
public ModelAndView hello() {
//ModelAndView는 컨트롤러의 처리 결과를 보여줄 뷰와 뷰에서 출력할 모델을 지정할 때 사용된다.
ModelAndView mav = new ModelAndView();
// 컨트롤러의 처리 결과를 보여줄 뷰의 이름을 'hello'를 지정한다.
mav.setViewName("hello");
// 모델에 'greeting'이라는 이름으로 String 타입의 값을 추가하였다.
mav.addObject("greeting", getGreeting());
return mav;
}
// 스프링은 ModelAndView 뿐만 아니라 String이나 modelMap, 또는 Map과 같은 타입을 이용해서 뷰 이름과 모델 정보를 설정할 수 있도록 하고 있다.
private String getGreeting() {
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (hour >= 6 && hour <= 10) {
return "좋은 아침입니다.";
} else if (hour >= 12 && hour <= 15) {
return "점심 식사는 하셨나요?";
} else if (hour >= 18 && hour <= 22) {
return "좋은 밤 되세요";
}
return "안녕하세요";
}
}
DispatherServlet은 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 스프링 설정 파일에 컨트롤러를 빈으로 등록해 주어야 한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
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.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="helloController" class="madvirus.spring.chap06.controller.HelloController" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
스프링 2.5 버전까지는 @Controller 어노테이션이 적용된 클래스를 컨트롤러로 사용하려면 별도의 DefaultAnnoationHandlerMapping과 AnnotationHandlerAdapter를 스프링 설정 파일에 등록해 주어야 한다. 하지만 스프링 3.0부터는 이 두 빈 객체를 기본 구현체로 사용하기 때문에 별도의 설정을 하지 않을 경우 @Controller 어노테이션이 적용된 클래스를 컨트롤러 구현체로 사용할 수 있게 된다.
2. 설정 파일에 ViewResolver 설정 추가
컨트롤러 클래스는 직접 또는 간접적으로 ModelAndView 객체를 생성하게 된다.
예를 들어 앞서 작성한 HelloController 클래스는 다음과 같이 ModelAndView 객체를 생성해서 리턴하였다.
public ModelAndView hello() {
ModelAndView mav = new ModelAndView();
// 뷰이름
mav.setViewName("hello");// setViewName() 메서드를 이용하여 뷰 이름을 지정한 모습
mav.addObject("greeting", getGreeting());
return mav;
}
컨트롤러의 처리 결과를 보여줄 뷰의 이름을 'hello'를 지정하였는데, DispatherServlet은 이 뷰 이름과 매칭되는 뷰 구현체를 찾기 위해 ViewResolver를 사용한다.
JSP를 뷰 기술로 사용할 경우 다음과 같이 InternalResourceViewResolver 구현체를 빈으로 등록해주면 된다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/view"/>
<property name="suffix" value=".jsp/>
// 이는 ViewResolver가 "WEB-INF/view/뷰이름.jsp"를 뷰 JSP로 사용한다는 것을 의미한다.
// 즉, 앞의 예에서 HelloController는 뷰 이름으로 "hello"를 리턴하므로, 실제로 사용되는 뷰 파일은 "WEB-INF/view/hello.jsp"파일이 된다.
</bean>
InternalResourceViewResolver는 컨트롤러가 지정한 뷰 이름으로부터 실제로 사용될 뷰를 선택하는데, 이 때 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 추가한 값이 실제로 사용될 자원의 경로가 된다.
※ ViewResolver 구현 클래스
스프링 컨트롤러는 뷰에 의존적이지 않다. 컨트롤러는 아래 코드와 같이 결과를 생성할 뷰의 이름만 지정할 뿐이다.
컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver가 구한다.
스프링은 몇 가지 ViewResolver 구현 클래스를 제공하고 있는데, 이중 주료 ViewResolver 구현 클래스는 다음과 같다.
3. ViewResolver 인터페이스
package org.springframework.web.servlet;
import java.util.Locale;
public interface ViewResolver{
View resolveViewName(String viewName, Locale locale) throws Exception;
}
ViewResolver는 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달받으며, 매핑되는 View 객체를 리턴한다. 만약, 매핑되는 View 객체가 존재하지 않으면 null을 리턴한다.
4. View 객체
ViewResolver는 응답 결과를 생성할 뷰 객체를 리턴한다. 모든 뷰 클래스는 View 인터페이스를 구현하고 있으며, View 인터페이스는 다음과 같이 정의되어 있다.
public interface View {
String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
String getContentType();
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
getContentType() 메서드는 "text/html"과 같은 응답 결과의 컨텐츠 타입을 리턴한다. render() 메서드는 실제로 응답 결과를 생성한다. render() 메서드의 첫 번째 파라미터인 model에는
컨트롤러가 리턴한 ModelAndView 객체의 모델 데이터가 전달된다. 각각의 View 객체는 이 모델 데이터로부터 응답 결과를 생성하는데 필요한 정보를 구한다.
출처: http://devbox.tistory.com/entry/Spring-ViewResolver-설정 [장인개발자를 꿈꾸는 :: 기록하는 공간]
2014.12.18 23:51
Posted in Programing/Spring by devbox
ViewResolver 설정
뷰 영역 구현
컨트롤러는 최종적으로 결과를 출력할 뷰와 뷰에 전달할 객체를 담고 있는 ModelAndView 객체를 리턴한다.
DispatherServlet은 ViewResolver를 사용하여 결과를 출력할 View 객체를 구하고, 구한 View 객체를 이용하여 내용을 생성한다.
1. 컨트롤러 구현 및 설정 추가
컨트롤러를 구현하려면 먼저 @Contoller 어노테이션을 클래스에 적용한다. 그리고, @RequestMapping 어노테이션을 이용해서 클라이언트의 요청을 처리할 메서드를 지정한다.
package madvirus.spring.chap06.controller;
import java.util.Calendar;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
// @Controller 어노테이션은 해당 클래스가 스프링 MVC의 컨트롤러를 구현한 클래스라는 것을 지정한다.
@Controller
public class HelloController {
// @RequestMapping 어노테이션은 값으로 지정한 요청 경로를 처리한 메서드를 설정한다.
// 이 경우 http://host:port[/컨텍스트 경로]/hello.do 요청을 HelloController 클래스의 hello() 메서드가 처리하게 된다.
@RequestMapping("/hello.do")
public ModelAndView hello() {
//ModelAndView는 컨트롤러의 처리 결과를 보여줄 뷰와 뷰에서 출력할 모델을 지정할 때 사용된다.
ModelAndView mav = new ModelAndView();
// 컨트롤러의 처리 결과를 보여줄 뷰의 이름을 'hello'를 지정한다.
mav.setViewName("hello");
// 모델에 'greeting'이라는 이름으로 String 타입의 값을 추가하였다.
mav.addObject("greeting", getGreeting());
return mav;
}
// 스프링은 ModelAndView 뿐만 아니라 String이나 modelMap, 또는 Map과 같은 타입을 이용해서 뷰 이름과 모델 정보를 설정할 수 있도록 하고 있다.
private String getGreeting() {
int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY);
if (hour >= 6 && hour <= 10) {
return "좋은 아침입니다.";
} else if (hour >= 12 && hour <= 15) {
return "점심 식사는 하셨나요?";
} else if (hour >= 18 && hour <= 22) {
return "좋은 밤 되세요";
}
return "안녕하세요";
}
}
DispatherServlet은 스프링 컨테이너에서 컨트롤러 객체를 검색하기 때문에 스프링 설정 파일에 컨트롤러를 빈으로 등록해 주어야 한다.
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
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.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<bean id="helloController" class="madvirus.spring.chap06.controller.HelloController" />
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
스프링 2.5 버전까지는 @Controller 어노테이션이 적용된 클래스를 컨트롤러로 사용하려면 별도의 DefaultAnnoationHandlerMapping과 AnnotationHandlerAdapter를 스프링 설정 파일에 등록해 주어야 한다. 하지만 스프링 3.0부터는 이 두 빈 객체를 기본 구현체로 사용하기 때문에 별도의 설정을 하지 않을 경우 @Controller 어노테이션이 적용된 클래스를 컨트롤러 구현체로 사용할 수 있게 된다.
2. 설정 파일에 ViewResolver 설정 추가
컨트롤러 클래스는 직접 또는 간접적으로 ModelAndView 객체를 생성하게 된다.
예를 들어 앞서 작성한 HelloController 클래스는 다음과 같이 ModelAndView 객체를 생성해서 리턴하였다.
public ModelAndView hello() {
ModelAndView mav = new ModelAndView();
// 뷰이름
mav.setViewName("hello");// setViewName() 메서드를 이용하여 뷰 이름을 지정한 모습
mav.addObject("greeting", getGreeting());
return mav;
}
컨트롤러의 처리 결과를 보여줄 뷰의 이름을 'hello'를 지정하였는데, DispatherServlet은 이 뷰 이름과 매칭되는 뷰 구현체를 찾기 위해 ViewResolver를 사용한다.
JSP를 뷰 기술로 사용할 경우 다음과 같이 InternalResourceViewResolver 구현체를 빈으로 등록해주면 된다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="WEB-INF/view"/>
<property name="suffix" value=".jsp/>
// 이는 ViewResolver가 "WEB-INF/view/뷰이름.jsp"를 뷰 JSP로 사용한다는 것을 의미한다.
// 즉, 앞의 예에서 HelloController는 뷰 이름으로 "hello"를 리턴하므로, 실제로 사용되는 뷰 파일은 "WEB-INF/view/hello.jsp"파일이 된다.
</bean>
InternalResourceViewResolver는 컨트롤러가 지정한 뷰 이름으로부터 실제로 사용될 뷰를 선택하는데, 이 때 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 추가한 값이 실제로 사용될 자원의 경로가 된다.
※ ViewResolver 구현 클래스
스프링 컨트롤러는 뷰에 의존적이지 않다. 컨트롤러는 아래 코드와 같이 결과를 생성할 뷰의 이름만 지정할 뿐이다.
컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver가 구한다.
스프링은 몇 가지 ViewResolver 구현 클래스를 제공하고 있는데, 이중 주료 ViewResolver 구현 클래스는 다음과 같다.
3. ViewResolver 인터페이스
package org.springframework.web.servlet;
import java.util.Locale;
public interface ViewResolver{
View resolveViewName(String viewName, Locale locale) throws Exception;
}
ViewResolver는 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달받으며, 매핑되는 View 객체를 리턴한다. 만약, 매핑되는 View 객체가 존재하지 않으면 null을 리턴한다.
4. View 객체
ViewResolver는 응답 결과를 생성할 뷰 객체를 리턴한다. 모든 뷰 클래스는 View 인터페이스를 구현하고 있으며, View 인터페이스는 다음과 같이 정의되어 있다.
public interface View {
String RESPONSE_STATUS_ATTRIBUTE = View.class.getName() + ".responseStatus";
String getContentType();
void render(Map<String, ?> model, HttpServletRequest request, HttpServletResponse response) throws Exception;
}
getContentType() 메서드는 "text/html"과 같은 응답 결과의 컨텐츠 타입을 리턴한다. render() 메서드는 실제로 응답 결과를 생성한다. render() 메서드의 첫 번째 파라미터인 model에는
컨트롤러가 리턴한 ModelAndView 객체의 모델 데이터가 전달된다. 각각의 View 객체는 이 모델 데이터로부터 응답 결과를 생성하는데 필요한 정보를 구한다.
출처: http://devbox.tistory.com/entry/Spring-ViewResolver-설정 [장인개발자를 꿈꾸는 :: 기록하는 공간]
2017년 12월 1일 금요일
Sample code1
@RequestMapping(value = "ok", method = RequestMethod.POST)
public String ok(@Validated TestForm form)
{
System.out.print("");
return "next";
}
@RequestMapping(value = "next")
public String next(Model model, String compCode, String compName)
{
System.out.print("");
model.addAttribute("compCode", compCode);
model.addAttribute("compName", compName);
return "next";
}
package com.mycompany.myapp.form;
import java.io.Serializable;
import java.util.List;
public class TestForm implements Serializable {
private static final long serialVersionUID = 1L;
private String test1;
private String test2;
private List<String> tableList;
public List<String> getTableList() {
return tableList;
}
public void setTableList(List<String> tableList) {
this.tableList = tableList;
}
public String getTest1() {
return test1;
}
public void setTest1(String test1) {
this.test1 = test1;
}
public String getTest2() {
return test2;
}
public void setTest2(String test2) {
this.test2 = test2;
}
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Home</title>
<script type="text/javascript"
src="${pageContext.request.contextPath}/resources/jquery-3.2.1.js"></script>
<link type="text/css" media="screen" href="${pageContext.request.contextPath}/resources/jquery-ui.min.css" rel="stylesheet" />
<link type="text/css" media="screen" href="${pageContext.request.contextPath}/resources/ui.jqgrid.css" rel="stylesheet" />
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/jquery.jqGrid.min.js" ></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/grid.locale-ja.js" ></script>
<script type="text/javascript">
$(document).ready(function() {
alert("dddd");
var mydata = [
{comp_code:"CD1", comp_name:"株式会社シー", comp_kana:"カブシキカイシャシー"},
{comp_code:"CD2", comp_name:"ビー株式会社", comp_kana:"ビーカブシキカイシャ"},
{comp_code:"CD3", comp_name:"有限会社エー", comp_kana:"ユウゲンガイシャエー"},
];
jQuery("#list").jqGrid({
data: mydata,
datatype: "local",
colNames:['コード', '会社名', 'カナ'],
colModel:[
{name:'comp_code',formatter: function (cellvalue, options, rowObject) {
return '<a href="next/?compCode=' + rowObject.comp_code + '&compName=' + rowObject.comp_name + '" target="_blank">' +
cellvalue + "</a>";
}},
{name:'comp_name'},
{name:'comp_kana'},
],
multiselect: false,
caption: '会社一覧'
});
$("#selectBtn").click(function() {
var target = document.getElementById("gender");
alert(target.options[target.selectedIndex].text);
//alert($('select option:selected').text());
});
$("#okbtn").click(function() {
// グリッド内の選択されているデータを配列に取り込む
var rowIds = $("#list").getRowData().length;
if (rowIds == 0) {
alert("データを選択してください。");
return false;
}
var ret = confirm("選択した内容をサーバー保存します。よろしいですか?");
if (!ret) {
return false;
}
var tableList = [];
var values = new Array();
for (var i = 0; i < rowIds; i++) {
var row = $('#list').getRowData(rowIds[i]);
//values[i] = new Array(row.model, row.model_name);
tableList.push(row);
}
var gridData = jQuery("#list").getRowData();
//var postData = JSON.stringify(gridData);
var input = $("<input>").attr("type", "hidden").attr("name", "tableList").val(JSON.stringify(gridData));
/*
var inputObj = "";
inputObj = document.createElement("input");
$(inputObj).attr("type","hidden");
$(inputObj).attr('name','tableList');
$(inputObj).attr("value",JSON.stringify(tableList));
*/
//$('#TestForm').append($(inputObj));
$('#dynamic_form').append($(input));
//document.body.appendChild($('#TestForm'));
$("#TestForm").submit();
});
});
</script>
</head>
<body>
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<table id="list">
</table>
<button id="okbtn" name="okbtn">ok button</button>
<select id="selectTest" name="selectTest" list="${name}"></select>
<input type="text" id="txtName" name="txtName" value="${name}">
<input id="selectBtn" type="button" value="selectButton">
<select id="gender" name="gender" class="style12">
<option selected="selected">ALL</option>
<option>Male Only</option>
<option>Female Only</option>
</select>
<form:form method="post" action="${pageContext.request.contextPath}/index/ok"
modelAttribute="testForm" id="TestForm" name="TestForm">
<input type="text" id="test1" name="test1" value="">
<input type="text" id="test2" name="test2" value="">
<input type="text" id="test3" name="test3" value="">
<div id="dynamic_form">
</div>
</form:form>
</body>
</html>
public String ok(@Validated TestForm form)
{
System.out.print("");
return "next";
}
@RequestMapping(value = "next")
public String next(Model model, String compCode, String compName)
{
System.out.print("");
model.addAttribute("compCode", compCode);
model.addAttribute("compName", compName);
return "next";
}
package com.mycompany.myapp.form;
import java.io.Serializable;
import java.util.List;
public class TestForm implements Serializable {
private static final long serialVersionUID = 1L;
private String test1;
private String test2;
private List<String> tableList;
public List<String> getTableList() {
return tableList;
}
public void setTableList(List<String> tableList) {
this.tableList = tableList;
}
public String getTest1() {
return test1;
}
public void setTest1(String test1) {
this.test1 = test1;
}
public String getTest2() {
return test2;
}
public void setTest2(String test2) {
this.test2 = test2;
}
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<title>Home</title>
<script type="text/javascript"
src="${pageContext.request.contextPath}/resources/jquery-3.2.1.js"></script>
<link type="text/css" media="screen" href="${pageContext.request.contextPath}/resources/jquery-ui.min.css" rel="stylesheet" />
<link type="text/css" media="screen" href="${pageContext.request.contextPath}/resources/ui.jqgrid.css" rel="stylesheet" />
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/jquery.jqGrid.min.js" ></script>
<script type="text/javascript" src="${pageContext.request.contextPath}/resources/grid.locale-ja.js" ></script>
<script type="text/javascript">
$(document).ready(function() {
alert("dddd");
var mydata = [
{comp_code:"CD1", comp_name:"株式会社シー", comp_kana:"カブシキカイシャシー"},
{comp_code:"CD2", comp_name:"ビー株式会社", comp_kana:"ビーカブシキカイシャ"},
{comp_code:"CD3", comp_name:"有限会社エー", comp_kana:"ユウゲンガイシャエー"},
];
jQuery("#list").jqGrid({
data: mydata,
datatype: "local",
colNames:['コード', '会社名', 'カナ'],
colModel:[
{name:'comp_code',formatter: function (cellvalue, options, rowObject) {
return '<a href="next/?compCode=' + rowObject.comp_code + '&compName=' + rowObject.comp_name + '" target="_blank">' +
cellvalue + "</a>";
}},
{name:'comp_name'},
{name:'comp_kana'},
],
multiselect: false,
caption: '会社一覧'
});
$("#selectBtn").click(function() {
var target = document.getElementById("gender");
alert(target.options[target.selectedIndex].text);
//alert($('select option:selected').text());
});
$("#okbtn").click(function() {
// グリッド内の選択されているデータを配列に取り込む
var rowIds = $("#list").getRowData().length;
if (rowIds == 0) {
alert("データを選択してください。");
return false;
}
var ret = confirm("選択した内容をサーバー保存します。よろしいですか?");
if (!ret) {
return false;
}
var tableList = [];
var values = new Array();
for (var i = 0; i < rowIds; i++) {
var row = $('#list').getRowData(rowIds[i]);
//values[i] = new Array(row.model, row.model_name);
tableList.push(row);
}
var gridData = jQuery("#list").getRowData();
//var postData = JSON.stringify(gridData);
var input = $("<input>").attr("type", "hidden").attr("name", "tableList").val(JSON.stringify(gridData));
/*
var inputObj = "";
inputObj = document.createElement("input");
$(inputObj).attr("type","hidden");
$(inputObj).attr('name','tableList');
$(inputObj).attr("value",JSON.stringify(tableList));
*/
//$('#TestForm').append($(inputObj));
$('#dynamic_form').append($(input));
//document.body.appendChild($('#TestForm'));
$("#TestForm").submit();
});
});
</script>
</head>
<body>
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<table id="list">
</table>
<button id="okbtn" name="okbtn">ok button</button>
<select id="selectTest" name="selectTest" list="${name}"></select>
<input type="text" id="txtName" name="txtName" value="${name}">
<input id="selectBtn" type="button" value="selectButton">
<select id="gender" name="gender" class="style12">
<option selected="selected">ALL</option>
<option>Male Only</option>
<option>Female Only</option>
</select>
<form:form method="post" action="${pageContext.request.contextPath}/index/ok"
modelAttribute="testForm" id="TestForm" name="TestForm">
<input type="text" id="test1" name="test1" value="">
<input type="text" id="test2" name="test2" value="">
<input type="text" id="test3" name="test3" value="">
<div id="dynamic_form">
</div>
</form:form>
</body>
</html>
2017년 11월 26일 일요일
spring framework2
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Transactional
public class OrgSearchBLogicImpl implements OrgSearchBLogic {
/** 組織サービス. */
@Autowired
private OrgService orgService;
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.app.blogic.OrgSearchBLogic#execute(com.isurp.neo.app.dto.
* OrgSearchBLogicInputDto)
*/
@Override
public OrgSearchBLogicOutputDto execute(OrgSearchBLogicInputDto inputDto) {
MOrgExample example = new MOrgExample();
// 検索要求元より、組織名称で検索を要求した場合。
// 組織名称がなにもない場合、
if (inputDto.getOrgName() != "") {
example.createCriteria().andDeleteFlagEqualTo(DeleteFlagEnum.OFF.getValue())
.andOrgNameLike(inputDto.getOrgName()).andCompanyCodeEqualTo(inputDto.getCompanyCode());
} else
// 組織名称が指定されている場合、
{
example.createCriteria().andDeleteFlagEqualTo(DeleteFlagEnum.OFF.getValue());
}
List<MOrg> list = orgService.selectByExample(example);
OrgSearchBLogicOutputDto outputDto = new OrgSearchBLogicOutputDto();
outputDto.setList(list);
return outputDto;
}
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class OrgSearchController {
/** 組織検索BLogic. */
@Autowired
private OrgSearchBLogic orgSearchBLogic;
/**
* AJAX用メソッド.
*
* @param criteria
* 組織検索クリテリア
* @return 組織検索結果クラス.
*/
@RequestMapping(value = "/org/search/ajax", method = { RequestMethod.GET, RequestMethod.POST })
@ResponseBody
public OrgSearchResult search(@AuthenticationPrincipal final CustomUserDetails userDetails,
@Validated OrgSearchCriteria criteria) {
OrgSearchBLogicInputDto inputDto = new OrgSearchBLogicInputDto();
// 組織名称とユーザーの会社コードを設定しておく。
inputDto.setOrgName(criteria.getOrgName());
inputDto.setCompanyCode(userDetails.getMUser().getCompanyCode());
OrgSearchBLogicOutputDto outputDto = orgSearchBLogic.execute(inputDto);
OrgSearchResult searchResult = new OrgSearchResult();
searchResult.setList(outputDto.getList());
return searchResult;
}
}
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.terasoluna.gfw.common.exception.BusinessException;
@Service
@Transactional
public class HinmokuDeleteConfirmDeleteBLogicImpl implements HinmokuDeleteConfirmDeleteBLogic {
/** 品目サービス. */
@Autowired
private HinmokuService hinmokuService;
/**
* ロジック実行.
*
* @param inputDto
* ロジックパラメータ
* @return ロジック結果
*/
@Override
public HinmokuDeleteConfirmDeleteBLogicOutputDto execute(final HinmokuDeleteConfirmDeleteBLogicInputDto inputDto) {
MHinmoku mHinmokuBefore = inputDto.getmHinmoku();
String key = mHinmokuBefore.getHinmokuCode();
MHinmoku selectedMHinmoku = hinmokuService.selectByPrimaryKey(key);
// 値チェック
validate(mHinmokuBefore, selectedMHinmoku);
// 削除フラグを有効で設定。
Date updateDate = Timestamp.valueOf(LocalDateTime.now());
selectedMHinmoku.setDeleteFlag(DeleteFlagEnum.ON.getValue());
selectedMHinmoku.setUpdateDate(updateDate);
selectedMHinmoku.setUpdateUserId(inputDto.getUpdateUserId());
// 品目
int deleteResultCount = hinmokuService.updateByPrimaryKey(selectedMHinmoku);
if (deleteResultCount <= 0) {
throw new BusinessException("e.ne.fw.9001");
}
return new HinmokuDeleteConfirmDeleteBLogicOutputDto();
}
/**
* 検証.
*
* @param mHinmokuBefore
* 更新前の品目情報
* @param selectedMHinmoku
* DBの品目情報
*/
private void validate(MHinmoku mHinmokuBefore, MHinmoku selectedMHinmoku) {
LocalDateTime temp = LocalDateTime.ofInstant(mHinmokuBefore.getUpdateDate().toInstant(),
ZoneId.systemDefault());
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime tempSelect = LocalDateTime.ofInstant(selectedMHinmoku.getUpdateDate().toInstant(),
ZoneId.systemDefault());
System.out.println("Select = " + tempSelect.format(formatter));
System.out.println("Before = " + temp.format(formatter));
//DB情報の更新日時が既に更新されている場合
if (selectedMHinmoku.getUpdateDate().after(mHinmokuBefore.getUpdateDate())) {
throw new BusinessException("e.ne.fw.9001");
}
}
}
<meta name="contextPath" content="${pageContext.request.contextPath}" />
<script type="text/javascript">
var contextPath = $("meta[name='contextPath']").attr("content");
$(document).ready(function() {
$('#confirm').click(function() {
$('#HokanbashoRegistForm').submit();
});
$('#cancel').click(function(){
document.location.href = "${pageContext.request.contextPath}/admin/master/hokanbashoRegist/cancel";
});
// 組織検索ボタンの押下時、処理
$('#selectOrgButton').click(function() {
//alert("contextPath:"+contextPath);
searchOrg();
});
// モダル画面の組織検索ボタンが押下された場合
$('#selectOrgModalButton').click(function() {
//alert("contextPath:"+contextPath);
searchOrg();
});
// モダル画面の閉じるボタンが押下された場合
$("#modalClose").click(function() {
$("#orgName").val("");
});
});
// 組織検索
function searchOrg() {
$.ajax(contextPath + "/org/search/ajax", {
data : $("#OrgSerachModelForm").serialize(),
dataType : "json",
}).done(function(json) {
//alert("json:"+json.list);
//結果を画面に表示する。
var titleStr = "<tr><th></th><th>コード</th><th>名称</th></tr>"
var str = titleStr;
var length = parseInt(Object.keys(json.list).length);
$('#org_list').empty();
$('#modal_org_list_message').empty();
//読み込んだデータが0件の場合は、エラーメッセージを表示する。
//もし、データがあれば、データをtable形式で表示する。
if (length <= 0) {
$('#modal_org_list_message').append("<p>組織データがありません。</p>");
} else if (length > 0) {
$.each(json.list, function(index) {
str = str + "<tr><td>" +
"<button type='button' class='btn btn-primary btnSelected" + index + "'" + "id='selectBtn'>Select</button>" + "</td>" +
"<td style='vertical-align:middle'><span>" + json.list[index].orgCode + "</span></td><td style='vertical-align:middle'><span>" + json.list[index].orgName + "</span></td></tr>";
});
$('#org_list').append(str);
// 各行のごとに、selectボタンにクリックイベントをバインドしておく。
$.each(json.list, function(index) {
$(".btnSelected" + index).on("click", function() {
var orgCode = $(this).closest('td').next('td').find('span').text();
var orgName = $(this).closest('td').next('td').next('td').find('span').text();
//alert(orgCode + " / " + orgName);
$('#kanriOrgId').val(orgCode);
$('#kanriOrgName').val(orgName);
//閉じる。
$("#modalClose").click();
});
});
}
}).fail(function(xhr) {
$('#modal_org_list_message').append(xhr);
});
return false;
}
</script>
<style>
.modal-header{
background-color:#00cc00;
color:#ffffff;
}
</style>
<div class="container">
<h2 class="page-header">
<spring:message code="web.admin.master.hokanbashoRegist.headerTitle" />
</h2>
<p>
<font color="red"><spring:message
code="web.admin.master.hokanbashoRegist.messageForMarkedFields" /></font>
</p>
<form:form class="form-horizontal"
modelAttribute="hokanbashoRegistForm" method="post"
action="${pageContext.request.contextPath}/admin/master/hokanbashoRegist/confirm"
id="HokanbashoRegistForm" name="HokanbashoRegistForm">
<form:errors path="*" />
<div class="form-group">
<label class="col-sm-3 control-label" for="plant"><spring:message
code="web.admin.master.hokanbashoRegist.plant" /><font color="red"> *</font></label>
<div class="col-sm-8">
<select id="plantCode" name="plantCode" class="form-control">
<c:forEach var="item" items="${mPlantMap}">
<c:if test="${item.key == mHokanbasho.plantCode}"><option value="${item.key}" selected>${item.value}</option></c:if>
<c:if test="${item.key != mHokanbasho.plantCode}"><option value="${item.key}" >${item.value}</option></c:if>
</c:forEach>
</select>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" for="hokanbashoCode"><spring:message
code="web.admin.master.hokanbashoRegist.hokanbashoCode" /><font
color="red"> *</font></label>
<div class="col-sm-8">
<form:input type="text" path="hokanbashoCode" class="form-control"
value="${mHokanbasho.hokanbashoCode}" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" for="hokanbashoName"><spring:message
code="web.admin.master.hokanbashoRegist.hokanbashoName" /><font
color="red"> *</font></label>
<div class="col-sm-8">
<form:input type="text" path="hokanbashoName" class="form-control"
value="${mHokanbasho.hokanbashoName}" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" for="kanriOrgName"><spring:message
code="web.admin.master.hokanbashoRegist.kanriOrgName" /><font
color="red"> *</font></label>
<div class="col-sm-8">
<div class="form-inline">
<form:input type="hidden" path="kanriOrgId"
value="${mHokanbasho.kanriOrgId}" />
<div class="form-group col-sm-2">
<button type="button" class="btn btn-primary" id="selectOrgButton" data-toggle="modal" data-target="#orgSearchModal">
<spring:message
code="web.admin.master.hokanbashoRegist.selectOrgButton" />
</button>
</div>
<div class="form-group col-sm-10">
<form:input type="text" path="kanriOrgName" class="form-control" style="width:100%"
value="${mHokanbasho.kanriOrgName}" />
</div>
</div>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label" for="hokanbashoKbn"><spring:message
code="web.admin.master.hokanbashoRegist.hokanbashoKbn" /><font
color="red"> *</font></label>
<div class="col-sm-8">
<c:forEach var="hokanbashoKbnItem" items="${CL_HOKANBASHO_KBN}"
varStatus="hokanbashoKbnStatus">
<label class="radio-inline">
<input type="radio" name="hokanbashoKbn"
<c:choose>
<c:when test="${!empty mHokanbasho.hokanbashoKbn}">
<c:if test="${hokanbashoKbnItem.key == mHokanbasho.hokanbashoKbn}">checked</c:if>
</c:when>
<c:otherwise>
<c:if test="${hokanbashoKbnStatus.index == 0}">checked</c:if>
</c:otherwise>
</c:choose>
value="${hokanbashoKbnItem.key}">
<spring:message code="${hokanbashoKbnItem.value}" />
</label>
</c:forEach>
</div>
</div>
<!-- danaExist Flag -->
<div class="form-group">
<label class="col-sm-3 control-label" for=danaExistFlag><spring:message
code="web.admin.master.hokanbashoRegist.danaExistFlag" /><font
color="red"> *</font></label>
<div class="col-sm-8">
<c:forEach var="danaExistFlagItem" items="${CL_DANA_EXIST_FLAG}"
varStatus="danaExistFlagStatus">
<label class="radio-inline">
<input type="radio" name="danaExistFlag"
<c:choose>
<c:when test="${!empty mHokanbasho.danaExistFlag}">
<c:if test="${danaExistFlagItem.key == mHokanbasho.danaExistFlag}">checked</c:if>
</c:when>
<c:otherwise>
<c:if test="${danaExistFlagStatus.index == 0}">checked</c:if>
</c:otherwise>
</c:choose>
value="${danaExistFlagItem.key}">
<spring:message code="${danaExistFlagItem.value}" />
</label>
</c:forEach>
</div>
</div>
<!-- yoko flag -->
<div class="form-group">
<label class="col-sm-3 control-label" for="yukoFlag"><spring:message
code="web.admin.master.hokanbashoRegist.yukoFlag" /><font
color="red"> *</font></label>
<div class="col-sm-8">
<c:forEach var="yukoFlagItem" items="${CL_YUKO_FLAG}"
varStatus="yukoFlagStatus">
<label class="radio-inline">
<input type="radio" name="yukoFlag"
<c:choose>
<c:when test="${!empty mHokanbasho.yukoFlag}">
<c:if test="${yukoFlagItem.key == mHokanbasho.yukoFlag}">checked</c:if>
</c:when>
<c:otherwise>
<c:if test="${yukoFlagStatus.index == 0}">checked</c:if>
</c:otherwise>
</c:choose>
value="${yukoFlagItem.key}">
<spring:message code="${yukoFlagItem.value}" />
</label>
</c:forEach>
</div>
</div>
<!-- confirm, cancel button -->
<div>
<button type="button" class="btn btn-primary" id="confirm">
<spring:message code="web.admin.master.hokanbashoRegist.confirm" />
</button>
<button type="button" class="btn btn-primary" id="cancel">
<spring:message code="web.admin.master.hokanbashoRegist.cancel" />
</button>
</div>
</form:form>
</div>
<!-- Modal -->
<div class="modal" id="orgSearchModal" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<label><spring:message code="web.admin.master.hokanbashoRegist.organizationSearchTitle"></spring:message></label>
</div>
<div class="modal-body">
<div style="margin: 0px 0px 20px 0px;text-align:right">
<form class="form-horizontal" id="OrgSerachModelForm" name="OrgSerachModelForm">
<form:errors path="*" />
<div style="display:inline-block">
<input type="text" class="form-control" id="orgName" name="orgName"
placeholder="<spring:message code="web.admin.master.hokanbashoRegist.organizationSearchModalOrgNamePlaceholder"></spring:message>">
</div>
<div style="display:inline-block">
<button type="button" class="btn btn-primary" id="selectOrgModalButton">
<spring:message code="web.admin.master.hokanbashoRegist.organizationSearchModalSearchBtnName"></spring:message>
</button>
</div>
</form>
</div>
<div>
<table id="org_list" class="table table-striped">
</table>
</div>
<div id="modal_org_list_message">
</div>
</div>
<div class="modal-footer">
<button type="submit" class="btn btn-primary pull-Right" data-dismiss="modal" id="modalClose">
<spring:message code="web.admin.master.hokanbashoRegist.organizationSearchModalCancelBtnName"></spring:message>
</button>
</div>
</div>
</div>
</div>
스프링 프레임워크1
if (mHokanbasho == null) {
throw new BusinessException("e.ne.fw.9001");
}
Date createDate = Timestamp.valueOf(LocalDateTime.now());
mHokanbasho.setCreateDate(createDate);
mHokanbasho.setUpdateDate(createDate);
mHokanbasho.setCreateUserId(inputDto.getUpdateUserId());
mHokanbasho.setUpdateUserId(inputDto.getUpdateUserId());
HashMap<String, String> mPlantMap = new HashMap<String, String>();
mPlantMap.put("", " ");
for (MPlant targetMPlant : mPlant) {
mPlantMap.put(targetMPlant.getPlantCode(), targetMPlant.getPlantName());
}
LocalDateTime temp = LocalDateTime.ofInstant(mHokanbashoBefore.getUpdateDate().toInstant(),
ZoneId.systemDefault());
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime tempSelect = LocalDateTime.ofInstant(selectedMHokanbasho.getUpdateDate().toInstant(),
ZoneId.systemDefault());
System.out.println("Select = " + tempSelect.format(formatter));
System.out.println("Before = " + temp.format(formatter));
if (selectedMHokanbasho.getUpdateDate().after(mHokanbashoBefore.getUpdateDate())) {
throw new BusinessException("e.ne.fw.9001");
}
@Override
public PlantRegistConfirmRegisterBLogicOutputDto execute(final PlantRegistConfirmRegisterBLogicInputDto inputDto) {
MPlant mPlant = inputDto.getmPlant();
MPlantKey key = new MPlantKey();
key.setCompanyCode(mPlant.getCompanyCode());
key.setPlantCode(mPlant.getPlantCode());
MPlant selectedMPlant = plantService.selectByPrimaryKey(key);
// 重複データがある場合、エラー
if (selectedMPlant != null) {
throw new BusinessException("e.ne.fw.9001");
}
Date createDate = Timestamp.valueOf(LocalDateTime.now());
mPlant.setCreateDate(createDate);
mPlant.setUpdateDate(createDate);
mPlant.setDeleteFlag(DeleteFlagEnum.OFF.getValue());
mPlant.setCreateUserId(inputDto.getUpdateUserId());
mPlant.setUpdateUserId(inputDto.getUpdateUserId());
// プラント
plantService.insert(mPlant);
return new PlantRegistConfirmRegisterBLogicOutputDto();
}
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry location="C:\Users\sawaki\.m2\repository\org\postgresql\postgresql\9.4.1209.jre7\postgresql-9.4.1209.jre7.jar" />
<context id="context1">
<jdbcConnection connectionURL="jdbc:postgresql://postgre1.isurp.com:5432/activiti_spring" driverClass="org.postgresql.Driver" password="isurp1234" userId="isurp" />
<javaModelGenerator targetPackage="com.isurp.neo.domain.model" targetProject="neo-domain/src/generated/java" />
<sqlMapGenerator targetPackage="com.isurp.neo.domain.repository" targetProject="neo-domain/src/generated/resources" />
<javaClientGenerator targetPackage="com.isurp.neo.domain.repository" targetProject="neo-domain/src/generated/java" type="XMLMAPPER" />
<table schema="public" tableName="m_user"></table>
<table schema="public" tableName="m_hinmoku"></table>
<table schema="public" tableName="m_plant"></table>
<table schema="public" tableName="m_hokanbasho"></table>
<table schema="public" tableName="t_user_role"></table>
</context>
</generatorConfiguration>
==================================================
import javax.inject.Inject;
import javax.validation.Valid;
import org.dozer.Mapper;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
@Controller
@RequestMapping(value = "admin/master/plantRegist")
@SessionAttributes("scopedTarget.plantRegistSession")
public class PlantRegistController {
/** プラント登録用セッション. */
@Inject
private PlantRegistSession plantRegistSession;
/** Mapper. */
@Inject
private Mapper mapper;
/**
* プラント登録フォーム設定.
*
* @return プラント登録フォーム
*/
@ModelAttribute
public PlantRegistForm setUpPlantRegistForm() {
return new PlantRegistForm();
}
/**
* プラント登録用セッション設定.
*
* @return プラント登録用セッション
*/
@ModelAttribute("plantRegistSession")
public PlantRegistSession setUpPlantRegistSession() {
return plantRegistSession;
}
/**
* 初期表示.
*
* @param model
* モデル
* @return ビュー
*/
@RequestMapping(value = "init")
public String init(Model model) {
return "admin/master/plantRegist";
}
/**
* 前画面からの戻るイベントによる初期表示.
*
* @param model
* モデル
* @return ビュー
*/
@RequestMapping(value = "initBack", method = { RequestMethod.GET, RequestMethod.POST })
public String initBack(Model model) {
// 情報追加
model.addAttribute("plantCode", plantRegistSession.getmPlant().getPlantCode());
model.addAttribute("plantName", plantRegistSession.getmPlant().getPlantName());
model.addAttribute("spart", plantRegistSession.getmPlant().getSpart());
model.addAttribute("yukoFlagValue", plantRegistSession.getmPlant().getYukoFlag());
return "admin/master/plantRegist";
}
/**
* プラント情報確認.
*
* @param userDetails
* ログインユーザー情報
* @param plantRegistForm
* プラント登録フォーム
* @param result
* バリデーション結果
* @param model
* モデル
* @return ビュー
*/
@RequestMapping(value = "confirm", method = RequestMethod.POST)
public String confirm(@AuthenticationPrincipal final CustomUserDetails userDetails,
@Valid @ModelAttribute final PlantRegistForm plantRegistForm, final BindingResult result, Model model) {
// フォームに設定された値にエラーがある場合
if (result.hasErrors()) {
// 登録画面に戻る
return "admin/master/plantRegist";
}
// プラント
MPlant mPlant = new MPlant();
mapper.map(plantRegistForm, mPlant);
mPlant.setCompanyCode(userDetails.getMUser().getCompanyCode());
plantRegistSession.setmPlant(mPlant);
model.addAttribute("mPlant", mPlant);
return "redirect:/admin/master/plantRegistConfirm";
}
/**
* 一覧画面に戻る.
*
* @param sessionStatus
* セッション情報
* @return ビュー
*/
@RequestMapping(value = "cancel", method = { RequestMethod.GET, RequestMethod.POST })
public String cancel(final SessionStatus sessionStatus) {
sessionStatus.setComplete();
plantRegistSession.clear();
return "redirect:/admin/master/plant/init";
}
}
==================================================
AbstractService.java
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
*
* @param <M>
* モデル
* @param <K>
* キー
* @param <Q>
* 条件
*/
public interface AbstractService<M, K, Q> {
/**
* 条件による件数取得.
*
* @param example
* 条件
* @return 条件による件数
*/
long countByExample(Q example);
/**
* 条件による削除.
*
* @param example
* 条件
* @return 削除件数
*/
int deleteByExample(Q example);
/**
* キーによる削除.
*
* @param key
* キー
* @return 削除件数
*/
int deleteByPrimaryKey(K key);
/**
* 登録.
*
* @param record
* モデル
* @return 登録件数
*/
int insert(M record);
/**
* モデルに値がnullでない項目を登録.
*
* @param record
* モデル
* @return 登録件数
*/
int insertSelective(M record);
/**
* 条件によるモデルのリスト取得.
*
* @param example
* 条件
* @return 条件による検索結果
*/
List<M> selectByExample(Q example);
/**
* キーによるモデルの取得.
*
* @param key
* キー
* @return キーによる検索結果
*/
M selectByPrimaryKey(K key);
/**
* 条件によるモデルに値がnullでない項目で更新.
*
* @param record
* モデル
* @param example
* 条件
* @return 更新件数
*/
int updateByExampleSelective(@Param("record") M record, @Param("example") Q example);
/**
* 条件によるモデルの項目で更新.
*
* @param record
* モデル
* @param example
* 条件
* @return 更新件数
*/
int updateByExample(@Param("record") M record, @Param("example") Q example);
/**
* モデルのキーによるモデルに値がnullでない項目で更新.
*
* @param record
* モデル
* @return 更新件数
*/
int updateByPrimaryKeySelective(M record);
/**
* モデルのキーによるモデルの項目で更新.
*
* @param record
* モデル
* @return 更新件数
*/
int updateByPrimaryKey(M record);
}
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
/**
* プラントサービス.
@Service
public interface PlantService extends AbstractService<MPlant, MPlantKey, MPlantExample> {
/**
* @param pageable
* Pageable
* @param example
* example
* @return PlantViewPageDtoページ
*/
Page<PlantViewPageDto> getPageByExample(Pageable pageable, MPlantExample example);
}
==================================================
package com.isurp.neo.domain.service;
import java.util.List;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.isurp.neo.domain.model.MPlant;
import com.isurp.neo.domain.model.MPlantExample;
import com.isurp.neo.domain.model.MPlantKey;
import com.isurp.neo.domain.model.PlantViewPageDto;
import com.isurp.neo.domain.repository.MPlantMapperExt;
@Service
@Transactional
public class PlantServiceImpl implements PlantService {
/**
*
*/
@Autowired
private MPlantMapperExt mPlantMapperExt;
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#countByExample(java.lang.
* Object)
*/
@Override
public long countByExample(MPlantExample example) {
return mPlantMapperExt.countByExample(example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#deleteByExample(java.lang.
* Object)
*/
@Override
public int deleteByExample(MPlantExample example) {
return mPlantMapperExt.deleteByExample(example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#deleteByPrimaryKey(java.lang
* .Object)
*/
@Override
public int deleteByPrimaryKey(MPlantKey key) {
return mPlantMapperExt.deleteByPrimaryKey(key);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#insert(java.lang.Object)
*/
@Override
public int insert(MPlant record) {
return mPlantMapperExt.insert(record);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#insertSelective(java.lang.
* Object)
*/
@Override
public int insertSelective(MPlant record) {
return mPlantMapperExt.insertSelective(record);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#selectByExample(java.lang.
* Object)
*/
@Override
public List<MPlant> selectByExample(MPlantExample example) {
return mPlantMapperExt.selectByExample(example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#selectByPrimaryKey(java.lang
* .Object)
*/
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#selectByPrimaryKey(java.lang
* .Object)
*/
@Override
public MPlant selectByPrimaryKey(MPlantKey key) {
return mPlantMapperExt.selectByPrimaryKey(key);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByExampleSelective(
* java.lang.Object, java.lang.Object)
*/
@Override
public int updateByExampleSelective(MPlant record, MPlantExample example) {
return mPlantMapperExt.updateByExampleSelective(record, example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByExample(java.lang.
* Object, java.lang.Object)
*/
@Override
public int updateByExample(MPlant record, MPlantExample example) {
return mPlantMapperExt.updateByExample(record, example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByPrimaryKeySelective(
* java.lang.Object)
*/
@Override
public int updateByPrimaryKeySelective(MPlant record) {
return mPlantMapperExt.updateByPrimaryKeySelective(record);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByPrimaryKey(java.lang
* .Object)
*/
@Override
public int updateByPrimaryKey(MPlant record) {
return mPlantMapperExt.updateByPrimaryKey(record);
}
// /* (non-Javadoc)
// * @see
// com.isurp.neo.domain.service.PlantService#getfindAllPages(org.springframework.data.domain.Pageable)
// */
// @Override
// public Page<PlantViewPageDto> getfindAllPages(Pageable pageable) {
// // 全件取得
// RowBounds rowBounds = new RowBounds(pageable.getOffset(),
// pageable.getPageSize());
// long count = mPlantMapperExt.countByExample(null);
// List<PlantViewPageDto> list =
// mPlantMapperExt.selectPageByExample(rowBounds);
// return new PageImpl<>(list, pageable, count);
// }
/*
* (non-Javadoc)
*
* @see com.isurp.neo.domain.service.PlantService#getPageByExample(org.
* springframework.data.domain.Pageable,
* com.isurp.neo.domain.model.MPlantExample)
*/
@Override
public Page<PlantViewPageDto> getPageByExample(Pageable pageable, MPlantExample example) {
// 全件取得
RowBounds rowBounds = new RowBounds(pageable.getOffset(), pageable.getPageSize());
long count = mPlantMapperExt.countByExample(example);
List<PlantViewPageDto> list = mPlantMapperExt.selectViewPageByExample(rowBounds, example);
return new PageImpl<>(list, pageable, count);
}
}
==================================================
src/generated/java
---> package com.isurp.neo.domain.model;
table..
package com.isurp.neo.domain.repository;
table mapper
src/generated/resources
---> domain ---> repository ---> mapper.xml..
package com.isurp.neo.app.blogic;
import org.springframework.stereotype.Service;
import com.isurp.neo.app.dto.PlantManagementInitBLogicInputDto;
import com.isurp.neo.app.dto.PlantManagementInitBLogicOutputDto;
@Service
public interface PlantManagementInitBLogic {
/**
*
* @param inputDto
* @return
*/
PlantManagementInitBLogicOutputDto excute(PlantManagementInitBLogicInputDto inputDto);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
@Service
public class PlantManagementInitBLogicImpl implements PlantManagementInitBLogic {
/**
* プラントサービス.
*/
@Autowired
private PlantService plantService;
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.app.blogic.PlantManagementInitBLogic#excute(com.isurp.neo.
* app.dto.PlantManagementInitBLogicInputDto)
*/
@Override
public PlantManagementInitBLogicOutputDto excute(PlantManagementInitBLogicInputDto inputDto) {
// 全件取得
MPlantExample example = new MPlantExample();
example.createCriteria().andCompanyCodeEqualTo(inputDto.getCompanyCode())
.andDeleteFlagNotEqualTo(DeleteFlagEnum.ON.getValue());
example.setOrderByClause("plant_code");
Page<PlantViewPageDto> page = plantService.getPageByExample(inputDto.getPageable(), example);
// 結果
PlantManagementInitBLogicOutputDto outputDto = new PlantManagementInitBLogicOutputDto();
outputDto.setPage(page);
return outputDto;
}
}
*/
@Service
public interface PlantRegistConfirmRegisterBLogic {
/**
* ロジック実行.
*
* @param inputDto ロジックパラメータ
* @return ロジック結果
*/
PlantRegistConfirmRegisterBLogicOutputDto execute(PlantRegistConfirmRegisterBLogicInputDto inputDto);
}
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.terasoluna.gfw.common.exception.BusinessException;
@Service
@Transactional
public class PlantRegistConfirmRegisterBLogicImpl implements PlantRegistConfirmRegisterBLogic {
/** プラントサービス. */
@Autowired
private PlantService plantService;
/**
* ロジック実行.
*
* @param inputDto
* ロジックパラメータ
* @return ロジック結果
*/
@Override
public PlantRegistConfirmRegisterBLogicOutputDto execute(final PlantRegistConfirmRegisterBLogicInputDto inputDto) {
MPlant mPlant = inputDto.getmPlant();
MPlantKey key = new MPlantKey();
key.setCompanyCode(mPlant.getCompanyCode());
key.setPlantCode(mPlant.getPlantCode());
MPlant selectedMPlant = plantService.selectByPrimaryKey(key);
// 重複データがある場合、エラー
if (selectedMPlant != null) {
throw new BusinessException("e.ne.fw.9001");
}
Date createDate = Timestamp.valueOf(LocalDateTime.now());
mPlant.setCreateDate(createDate);
mPlant.setUpdateDate(createDate);
mPlant.setDeleteFlag(DeleteFlagEnum.OFF.getValue());
mPlant.setCreateUserId(inputDto.getUpdateUserId());
mPlant.setUpdateUserId(inputDto.getUpdateUserId());
// プラント
plantService.insert(mPlant);
return new PlantRegistConfirmRegisterBLogicOutputDto();
}
}
throw new BusinessException("e.ne.fw.9001");
}
Date createDate = Timestamp.valueOf(LocalDateTime.now());
mHokanbasho.setCreateDate(createDate);
mHokanbasho.setUpdateDate(createDate);
mHokanbasho.setCreateUserId(inputDto.getUpdateUserId());
mHokanbasho.setUpdateUserId(inputDto.getUpdateUserId());
HashMap<String, String> mPlantMap = new HashMap<String, String>();
mPlantMap.put("", " ");
for (MPlant targetMPlant : mPlant) {
mPlantMap.put(targetMPlant.getPlantCode(), targetMPlant.getPlantName());
}
LocalDateTime temp = LocalDateTime.ofInstant(mHokanbashoBefore.getUpdateDate().toInstant(),
ZoneId.systemDefault());
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
LocalDateTime tempSelect = LocalDateTime.ofInstant(selectedMHokanbasho.getUpdateDate().toInstant(),
ZoneId.systemDefault());
System.out.println("Select = " + tempSelect.format(formatter));
System.out.println("Before = " + temp.format(formatter));
if (selectedMHokanbasho.getUpdateDate().after(mHokanbashoBefore.getUpdateDate())) {
throw new BusinessException("e.ne.fw.9001");
}
@Override
public PlantRegistConfirmRegisterBLogicOutputDto execute(final PlantRegistConfirmRegisterBLogicInputDto inputDto) {
MPlant mPlant = inputDto.getmPlant();
MPlantKey key = new MPlantKey();
key.setCompanyCode(mPlant.getCompanyCode());
key.setPlantCode(mPlant.getPlantCode());
MPlant selectedMPlant = plantService.selectByPrimaryKey(key);
// 重複データがある場合、エラー
if (selectedMPlant != null) {
throw new BusinessException("e.ne.fw.9001");
}
Date createDate = Timestamp.valueOf(LocalDateTime.now());
mPlant.setCreateDate(createDate);
mPlant.setUpdateDate(createDate);
mPlant.setDeleteFlag(DeleteFlagEnum.OFF.getValue());
mPlant.setCreateUserId(inputDto.getUpdateUserId());
mPlant.setUpdateUserId(inputDto.getUpdateUserId());
// プラント
plantService.insert(mPlant);
return new PlantRegistConfirmRegisterBLogicOutputDto();
}
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<classPathEntry location="C:\Users\sawaki\.m2\repository\org\postgresql\postgresql\9.4.1209.jre7\postgresql-9.4.1209.jre7.jar" />
<context id="context1">
<jdbcConnection connectionURL="jdbc:postgresql://postgre1.isurp.com:5432/activiti_spring" driverClass="org.postgresql.Driver" password="isurp1234" userId="isurp" />
<javaModelGenerator targetPackage="com.isurp.neo.domain.model" targetProject="neo-domain/src/generated/java" />
<sqlMapGenerator targetPackage="com.isurp.neo.domain.repository" targetProject="neo-domain/src/generated/resources" />
<javaClientGenerator targetPackage="com.isurp.neo.domain.repository" targetProject="neo-domain/src/generated/java" type="XMLMAPPER" />
<table schema="public" tableName="m_user"></table>
<table schema="public" tableName="m_hinmoku"></table>
<table schema="public" tableName="m_plant"></table>
<table schema="public" tableName="m_hokanbasho"></table>
<table schema="public" tableName="t_user_role"></table>
</context>
</generatorConfiguration>
==================================================
import javax.inject.Inject;
import javax.validation.Valid;
import org.dozer.Mapper;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;
@Controller
@RequestMapping(value = "admin/master/plantRegist")
@SessionAttributes("scopedTarget.plantRegistSession")
public class PlantRegistController {
/** プラント登録用セッション. */
@Inject
private PlantRegistSession plantRegistSession;
/** Mapper. */
@Inject
private Mapper mapper;
/**
* プラント登録フォーム設定.
*
* @return プラント登録フォーム
*/
@ModelAttribute
public PlantRegistForm setUpPlantRegistForm() {
return new PlantRegistForm();
}
/**
* プラント登録用セッション設定.
*
* @return プラント登録用セッション
*/
@ModelAttribute("plantRegistSession")
public PlantRegistSession setUpPlantRegistSession() {
return plantRegistSession;
}
/**
* 初期表示.
*
* @param model
* モデル
* @return ビュー
*/
@RequestMapping(value = "init")
public String init(Model model) {
return "admin/master/plantRegist";
}
/**
* 前画面からの戻るイベントによる初期表示.
*
* @param model
* モデル
* @return ビュー
*/
@RequestMapping(value = "initBack", method = { RequestMethod.GET, RequestMethod.POST })
public String initBack(Model model) {
// 情報追加
model.addAttribute("plantCode", plantRegistSession.getmPlant().getPlantCode());
model.addAttribute("plantName", plantRegistSession.getmPlant().getPlantName());
model.addAttribute("spart", plantRegistSession.getmPlant().getSpart());
model.addAttribute("yukoFlagValue", plantRegistSession.getmPlant().getYukoFlag());
return "admin/master/plantRegist";
}
/**
* プラント情報確認.
*
* @param userDetails
* ログインユーザー情報
* @param plantRegistForm
* プラント登録フォーム
* @param result
* バリデーション結果
* @param model
* モデル
* @return ビュー
*/
@RequestMapping(value = "confirm", method = RequestMethod.POST)
public String confirm(@AuthenticationPrincipal final CustomUserDetails userDetails,
@Valid @ModelAttribute final PlantRegistForm plantRegistForm, final BindingResult result, Model model) {
// フォームに設定された値にエラーがある場合
if (result.hasErrors()) {
// 登録画面に戻る
return "admin/master/plantRegist";
}
// プラント
MPlant mPlant = new MPlant();
mapper.map(plantRegistForm, mPlant);
mPlant.setCompanyCode(userDetails.getMUser().getCompanyCode());
plantRegistSession.setmPlant(mPlant);
model.addAttribute("mPlant", mPlant);
return "redirect:/admin/master/plantRegistConfirm";
}
/**
* 一覧画面に戻る.
*
* @param sessionStatus
* セッション情報
* @return ビュー
*/
@RequestMapping(value = "cancel", method = { RequestMethod.GET, RequestMethod.POST })
public String cancel(final SessionStatus sessionStatus) {
sessionStatus.setComplete();
plantRegistSession.clear();
return "redirect:/admin/master/plant/init";
}
}
==================================================
AbstractService.java
import java.util.List;
import org.apache.ibatis.annotations.Param;
/**
*
* @param <M>
* モデル
* @param <K>
* キー
* @param <Q>
* 条件
*/
public interface AbstractService<M, K, Q> {
/**
* 条件による件数取得.
*
* @param example
* 条件
* @return 条件による件数
*/
long countByExample(Q example);
/**
* 条件による削除.
*
* @param example
* 条件
* @return 削除件数
*/
int deleteByExample(Q example);
/**
* キーによる削除.
*
* @param key
* キー
* @return 削除件数
*/
int deleteByPrimaryKey(K key);
/**
* 登録.
*
* @param record
* モデル
* @return 登録件数
*/
int insert(M record);
/**
* モデルに値がnullでない項目を登録.
*
* @param record
* モデル
* @return 登録件数
*/
int insertSelective(M record);
/**
* 条件によるモデルのリスト取得.
*
* @param example
* 条件
* @return 条件による検索結果
*/
List<M> selectByExample(Q example);
/**
* キーによるモデルの取得.
*
* @param key
* キー
* @return キーによる検索結果
*/
M selectByPrimaryKey(K key);
/**
* 条件によるモデルに値がnullでない項目で更新.
*
* @param record
* モデル
* @param example
* 条件
* @return 更新件数
*/
int updateByExampleSelective(@Param("record") M record, @Param("example") Q example);
/**
* 条件によるモデルの項目で更新.
*
* @param record
* モデル
* @param example
* 条件
* @return 更新件数
*/
int updateByExample(@Param("record") M record, @Param("example") Q example);
/**
* モデルのキーによるモデルに値がnullでない項目で更新.
*
* @param record
* モデル
* @return 更新件数
*/
int updateByPrimaryKeySelective(M record);
/**
* モデルのキーによるモデルの項目で更新.
*
* @param record
* モデル
* @return 更新件数
*/
int updateByPrimaryKey(M record);
}
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
/**
* プラントサービス.
@Service
public interface PlantService extends AbstractService<MPlant, MPlantKey, MPlantExample> {
/**
* @param pageable
* Pageable
* @param example
* example
* @return PlantViewPageDtoページ
*/
Page<PlantViewPageDto> getPageByExample(Pageable pageable, MPlantExample example);
}
==================================================
package com.isurp.neo.domain.service;
import java.util.List;
import org.apache.ibatis.session.RowBounds;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.isurp.neo.domain.model.MPlant;
import com.isurp.neo.domain.model.MPlantExample;
import com.isurp.neo.domain.model.MPlantKey;
import com.isurp.neo.domain.model.PlantViewPageDto;
import com.isurp.neo.domain.repository.MPlantMapperExt;
@Service
@Transactional
public class PlantServiceImpl implements PlantService {
/**
*
*/
@Autowired
private MPlantMapperExt mPlantMapperExt;
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#countByExample(java.lang.
* Object)
*/
@Override
public long countByExample(MPlantExample example) {
return mPlantMapperExt.countByExample(example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#deleteByExample(java.lang.
* Object)
*/
@Override
public int deleteByExample(MPlantExample example) {
return mPlantMapperExt.deleteByExample(example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#deleteByPrimaryKey(java.lang
* .Object)
*/
@Override
public int deleteByPrimaryKey(MPlantKey key) {
return mPlantMapperExt.deleteByPrimaryKey(key);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#insert(java.lang.Object)
*/
@Override
public int insert(MPlant record) {
return mPlantMapperExt.insert(record);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#insertSelective(java.lang.
* Object)
*/
@Override
public int insertSelective(MPlant record) {
return mPlantMapperExt.insertSelective(record);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#selectByExample(java.lang.
* Object)
*/
@Override
public List<MPlant> selectByExample(MPlantExample example) {
return mPlantMapperExt.selectByExample(example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#selectByPrimaryKey(java.lang
* .Object)
*/
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#selectByPrimaryKey(java.lang
* .Object)
*/
@Override
public MPlant selectByPrimaryKey(MPlantKey key) {
return mPlantMapperExt.selectByPrimaryKey(key);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByExampleSelective(
* java.lang.Object, java.lang.Object)
*/
@Override
public int updateByExampleSelective(MPlant record, MPlantExample example) {
return mPlantMapperExt.updateByExampleSelective(record, example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByExample(java.lang.
* Object, java.lang.Object)
*/
@Override
public int updateByExample(MPlant record, MPlantExample example) {
return mPlantMapperExt.updateByExample(record, example);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByPrimaryKeySelective(
* java.lang.Object)
*/
@Override
public int updateByPrimaryKeySelective(MPlant record) {
return mPlantMapperExt.updateByPrimaryKeySelective(record);
}
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.domain.service.AbstractService#updateByPrimaryKey(java.lang
* .Object)
*/
@Override
public int updateByPrimaryKey(MPlant record) {
return mPlantMapperExt.updateByPrimaryKey(record);
}
// /* (non-Javadoc)
// * @see
// com.isurp.neo.domain.service.PlantService#getfindAllPages(org.springframework.data.domain.Pageable)
// */
// @Override
// public Page<PlantViewPageDto> getfindAllPages(Pageable pageable) {
// // 全件取得
// RowBounds rowBounds = new RowBounds(pageable.getOffset(),
// pageable.getPageSize());
// long count = mPlantMapperExt.countByExample(null);
// List<PlantViewPageDto> list =
// mPlantMapperExt.selectPageByExample(rowBounds);
// return new PageImpl<>(list, pageable, count);
// }
/*
* (non-Javadoc)
*
* @see com.isurp.neo.domain.service.PlantService#getPageByExample(org.
* springframework.data.domain.Pageable,
* com.isurp.neo.domain.model.MPlantExample)
*/
@Override
public Page<PlantViewPageDto> getPageByExample(Pageable pageable, MPlantExample example) {
// 全件取得
RowBounds rowBounds = new RowBounds(pageable.getOffset(), pageable.getPageSize());
long count = mPlantMapperExt.countByExample(example);
List<PlantViewPageDto> list = mPlantMapperExt.selectViewPageByExample(rowBounds, example);
return new PageImpl<>(list, pageable, count);
}
}
==================================================
src/generated/java
---> package com.isurp.neo.domain.model;
table..
package com.isurp.neo.domain.repository;
table mapper
src/generated/resources
---> domain ---> repository ---> mapper.xml..
package com.isurp.neo.app.blogic;
import org.springframework.stereotype.Service;
import com.isurp.neo.app.dto.PlantManagementInitBLogicInputDto;
import com.isurp.neo.app.dto.PlantManagementInitBLogicOutputDto;
@Service
public interface PlantManagementInitBLogic {
/**
*
* @param inputDto
* @return
*/
PlantManagementInitBLogicOutputDto excute(PlantManagementInitBLogicInputDto inputDto);
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Service;
@Service
public class PlantManagementInitBLogicImpl implements PlantManagementInitBLogic {
/**
* プラントサービス.
*/
@Autowired
private PlantService plantService;
/*
* (non-Javadoc)
*
* @see
* com.isurp.neo.app.blogic.PlantManagementInitBLogic#excute(com.isurp.neo.
* app.dto.PlantManagementInitBLogicInputDto)
*/
@Override
public PlantManagementInitBLogicOutputDto excute(PlantManagementInitBLogicInputDto inputDto) {
// 全件取得
MPlantExample example = new MPlantExample();
example.createCriteria().andCompanyCodeEqualTo(inputDto.getCompanyCode())
.andDeleteFlagNotEqualTo(DeleteFlagEnum.ON.getValue());
example.setOrderByClause("plant_code");
Page<PlantViewPageDto> page = plantService.getPageByExample(inputDto.getPageable(), example);
// 結果
PlantManagementInitBLogicOutputDto outputDto = new PlantManagementInitBLogicOutputDto();
outputDto.setPage(page);
return outputDto;
}
}
*/
@Service
public interface PlantRegistConfirmRegisterBLogic {
/**
* ロジック実行.
*
* @param inputDto ロジックパラメータ
* @return ロジック結果
*/
PlantRegistConfirmRegisterBLogicOutputDto execute(PlantRegistConfirmRegisterBLogicInputDto inputDto);
}
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.terasoluna.gfw.common.exception.BusinessException;
@Service
@Transactional
public class PlantRegistConfirmRegisterBLogicImpl implements PlantRegistConfirmRegisterBLogic {
/** プラントサービス. */
@Autowired
private PlantService plantService;
/**
* ロジック実行.
*
* @param inputDto
* ロジックパラメータ
* @return ロジック結果
*/
@Override
public PlantRegistConfirmRegisterBLogicOutputDto execute(final PlantRegistConfirmRegisterBLogicInputDto inputDto) {
MPlant mPlant = inputDto.getmPlant();
MPlantKey key = new MPlantKey();
key.setCompanyCode(mPlant.getCompanyCode());
key.setPlantCode(mPlant.getPlantCode());
MPlant selectedMPlant = plantService.selectByPrimaryKey(key);
// 重複データがある場合、エラー
if (selectedMPlant != null) {
throw new BusinessException("e.ne.fw.9001");
}
Date createDate = Timestamp.valueOf(LocalDateTime.now());
mPlant.setCreateDate(createDate);
mPlant.setUpdateDate(createDate);
mPlant.setDeleteFlag(DeleteFlagEnum.OFF.getValue());
mPlant.setCreateUserId(inputDto.getUpdateUserId());
mPlant.setUpdateUserId(inputDto.getUpdateUserId());
// プラント
plantService.insert(mPlant);
return new PlantRegistConfirmRegisterBLogicOutputDto();
}
}
2017년 8월 29일 화요일
DIの基本の@Autowiredと@Componentを理解する
http://javatechnology.net/spring/di-autowired-component/
springの特徴としてDIがあります。springではプログラム中でnew(インスタンス化)することなく、インターフェースを使って実クラスをコンポーネント化します。
「@Autowired」と「@Component」はspringのもっとも基本的な部分です。
springのアノテーションで使用頻度は非常に高いです。
今回はコンポーネント化で必要な「@Autowired」と「@Component」の使い方について解説していきます。このサイトではspring3.0以上を対象に解説を進めていきます。
springのアノテーションで使用頻度は非常に高いです。
今回はコンポーネント化で必要な「@Autowired」と「@Component」の使い方について解説していきます。このサイトではspring3.0以上を対象に解説を進めていきます。
Spring FrameworkとDIについて
https://mookjp.github.io/blog-ja/spring-framework%E3%81%A8di%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6/
「初心者のためのSpring Framework入門」グループ
http://libro.tuyano.com/index2?id=4466003
「初心者のためのSpring Framework入門」グループ
「初心者のためのSpring Framework入門」グループ
SpringFrameworkでアノテーション(@Component、@Autowired)を使ってみる
http://thread.main.jp/spring/annotation.html
SpringFrameworkでアノテーション(@Component、@Autowired)を使ってみる
今回は、@Component、@Autowired、@Serviceを使ってみます。
作る手順は前回と同様ですが、設定ファイルの中身やソースを変えます。
まずは動かしてみましょう
pom.xml は前回と同様です。
Spring用の設定ファイル(SpringTest.xml)を以下を追加します。
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>
<context:component-scan base-package="spring.test" />
</beans>
component-scan要素は指定場所(パッケージ)のクラスファイルよりアノテーション(@Component、@Autowiredなど)を読み込みます。
読み込みたいパッケージが複数ある場合は、パッケージ数分、component-scan要素を記述します。このページの下の方の例で2つパッケージを読み込んでいます。
設定ファイルは以上です。次はJavaファイルを作成、修正します。
実行対象となるJavaクラス(HelloWorldTest.java)は修正なしです。
package spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class HelloWorldTest {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\workspace\\springApp\\SpringTest.xml");
SpringBean bean = (SpringBean) context.getBean("helloWorld");
bean.show();
}
}
次に設定ファイルよりSpringがデータをセットするBeanクラス(SpringBean.java)ですが、@Autowiredを付けたフィールドを追加します。
package spring.test;
import org.springframework.beans.factory.annotation.Autowired;
public class SpringBean {
private String text;
@Autowired
private SpringComponent component;
public void show() {
System.out.println(text);
component.show();
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
最後に@Componentを持つクラス(SpringComponent.java)を作成します。
package spring.test;
import org.springframework.stereotype.Component;
@Component
public class SpringComponent {
public void show() {
System.out.println("Hello Component!");
}
}
準備は以上で終わりです。それでは実行してみましょう。
作成したファイルに問題がなければ、「Hello World!!」と「Hello Component!」と表示されます。
コンポーネント
前回は設定ファイルでオブジェクト作成を行いましたが、今回はアノテーションでオブジェクトの作成を行いました。
component-scanで指定した場所に @Autowired が見つかった場合、@Componentが付いているクラスのオブジェクト(Springが自動的にオブジェクトを生成してくれます)を探し、@Autowiredのインスタンス変数にセットします。
@Componentは幾つか拡張版が用意されており、同じような動きをします。用途によって使い分けて下さい。
@Component
下の3つのアノテーションのベースとなるもの。
@Repository
DBアクセス関連のクラスはこれにする。DBアクセス時の例外がDataAccessExceptionになる。
@Service
処理をひとまとめにするとき、トランザクションのコミット単位の処理などはこれにする。
@Controller
SpringでWebアプリを作るときにMVCのコントローラはこれにする。
インターフェースの活用
今回の例も活用の仕方が分かり難いですが、Componentクラスをインターフェースにすると活用の仕方がわかります。
SpringComponent.java(クラスからインターフェースに変更)
package spring.test;
public interface SpringComponent {
public void show();
}
SpringComponentの実装クラスを用意します。
SpringComponentImpl1.java
package spring.test1;
import org.springframework.stereotype.Component;
import spring.test.SpringComponent;
@Component
public class SpringComponentImpl1 implements SpringComponent {
public void show() {
System.out.println("One");
}
}
SpringComponentImpl2.java
package spring.test2;
import org.springframework.stereotype.Component;
import spring.test.SpringComponent;
@Component
public class SpringComponentImpl2 implements SpringComponent {
public void show() {
System.out.println("Two");
}
}
上記のように実装クラスが複数存在した場合、どの実装クラスを使用するかは、Spring設定ファイルで決められます。
例えば以下の様に spring.test1 を指定した場合、SpringComponentImpl1が使用されます。
設定ファイル
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>
<context:component-scan base-package="spring.test" />
<context:component-scan base-package="spring.test1" />
</beans>
実行結果
One
設定ファイルの spring.test1 を spring.test2 に変更すると SpringComponentImpl2 が実行されます。
実行結果
Two
このようにどの実装クラスを使用するにも呼び出し元である HelloWorldTestクラス を修正する必要がありせん。
SpringFrameworkでアノテーション(@Component、@Autowired)を使ってみる
今回は、@Component、@Autowired、@Serviceを使ってみます。
作る手順は前回と同様ですが、設定ファイルの中身やソースを変えます。
まずは動かしてみましょう
pom.xml は前回と同様です。
Spring用の設定ファイル(SpringTest.xml)を以下を追加します。
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>
<context:component-scan base-package="spring.test" />
</beans>
component-scan要素は指定場所(パッケージ)のクラスファイルよりアノテーション(@Component、@Autowiredなど)を読み込みます。
読み込みたいパッケージが複数ある場合は、パッケージ数分、component-scan要素を記述します。このページの下の方の例で2つパッケージを読み込んでいます。
設定ファイルは以上です。次はJavaファイルを作成、修正します。
実行対象となるJavaクラス(HelloWorldTest.java)は修正なしです。
package spring.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
public class HelloWorldTest {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("C:\\workspace\\springApp\\SpringTest.xml");
SpringBean bean = (SpringBean) context.getBean("helloWorld");
bean.show();
}
}
次に設定ファイルよりSpringがデータをセットするBeanクラス(SpringBean.java)ですが、@Autowiredを付けたフィールドを追加します。
package spring.test;
import org.springframework.beans.factory.annotation.Autowired;
public class SpringBean {
private String text;
@Autowired
private SpringComponent component;
public void show() {
System.out.println(text);
component.show();
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
最後に@Componentを持つクラス(SpringComponent.java)を作成します。
package spring.test;
import org.springframework.stereotype.Component;
@Component
public class SpringComponent {
public void show() {
System.out.println("Hello Component!");
}
}
準備は以上で終わりです。それでは実行してみましょう。
作成したファイルに問題がなければ、「Hello World!!」と「Hello Component!」と表示されます。
コンポーネント
前回は設定ファイルでオブジェクト作成を行いましたが、今回はアノテーションでオブジェクトの作成を行いました。
component-scanで指定した場所に @Autowired が見つかった場合、@Componentが付いているクラスのオブジェクト(Springが自動的にオブジェクトを生成してくれます)を探し、@Autowiredのインスタンス変数にセットします。
@Componentは幾つか拡張版が用意されており、同じような動きをします。用途によって使い分けて下さい。
@Component
下の3つのアノテーションのベースとなるもの。
@Repository
DBアクセス関連のクラスはこれにする。DBアクセス時の例外がDataAccessExceptionになる。
@Service
処理をひとまとめにするとき、トランザクションのコミット単位の処理などはこれにする。
@Controller
SpringでWebアプリを作るときにMVCのコントローラはこれにする。
インターフェースの活用
今回の例も活用の仕方が分かり難いですが、Componentクラスをインターフェースにすると活用の仕方がわかります。
SpringComponent.java(クラスからインターフェースに変更)
package spring.test;
public interface SpringComponent {
public void show();
}
SpringComponentの実装クラスを用意します。
SpringComponentImpl1.java
package spring.test1;
import org.springframework.stereotype.Component;
import spring.test.SpringComponent;
@Component
public class SpringComponentImpl1 implements SpringComponent {
public void show() {
System.out.println("One");
}
}
SpringComponentImpl2.java
package spring.test2;
import org.springframework.stereotype.Component;
import spring.test.SpringComponent;
@Component
public class SpringComponentImpl2 implements SpringComponent {
public void show() {
System.out.println("Two");
}
}
上記のように実装クラスが複数存在した場合、どの実装クラスを使用するかは、Spring設定ファイルで決められます。
例えば以下の様に spring.test1 を指定した場合、SpringComponentImpl1が使用されます。
設定ファイル
<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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.2.xsd">
<bean id="helloWorld" class="spring.test.SpringBean">
<property name="text" value="Hello World!!" />
</bean>
<context:component-scan base-package="spring.test" />
<context:component-scan base-package="spring.test1" />
</beans>
実行結果
One
設定ファイルの spring.test1 を spring.test2 に変更すると SpringComponentImpl2 が実行されます。
実行結果
Two
このようにどの実装クラスを使用するにも呼び出し元である HelloWorldTestクラス を修正する必要がありせん。
피드 구독하기:
글 (Atom)