복붙노트

[SPRING] JSP에서 스프링 빈을 자동으로 정리하는 가장 깨끗한 방법은 무엇입니까?

SPRING

JSP에서 스프링 빈을 자동으로 정리하는 가장 깨끗한 방법은 무엇입니까?

우리는 현재 프론트 용 프레임 워크없이 JSP 만 사용하는 이전 웹 애플리케이션에 몇 가지 새로운 기능을 추가하고 있습니다. 최근에 Spring을 추가했으며 수정 된 JSP에서 bean을 autowire하고 SpringMVC, Struts2 또는 Tapestry5를 사용하기 위해 모든 것을 다시 작성하지는 않습니다.

우리는 타입에 의한 autowiring을 사용하고 있기 때문에 이전에 웹 애플리케이션 컨텍스트 ( "wap")를 얻는 동안 JSP에서 다음과 같은 코드를 얻습니다.

MyDao myDao = (MyDao) wap.getBeansOfType(MyDao.class).values().toArray()[0];

그러한 코드를 사용하지 않고 대신 @Autowired 주석을 사용하여 비즈니스 bean 에서처럼 자동으로 JSP에 bean을 자동 삽입합니다.

실제로 JSP에서 빈을 주입하는 가장 깨끗한 방법을 찾고 있습니다. 너는 무엇을 사용하니?

해결법

  1. ==============================

    1.Spring 컨텍스트 Exposing HttpServletRequest를 사용할 수있다.

    Spring 컨텍스트 Exposing HttpServletRequest를 사용할 수있다.

    이렇게하려면 컨트롤러 코드가 ContextExposingHttpServletRequest에서 원래 HttpServletRequest를 래핑 한 다음이를 JSP로 전달해야합니다. 특정 명명 된 Bean 또는 컨텍스트의 모든 Bean을 노출 할 수 있습니다.

    물론 이것은 JSP에서 컨트롤러 코드로 문제를 옮기는 것일뿐입니다.하지만 이는 관리하기 쉬운 문제 일 것입니다.

  2. ==============================

    2.jsp와 서블릿 모두 서블릿 conainer에 의해 인스턴스화되기 때문에 @Autowired를 직접 사용할 수 없습니다. 따라서 스프링 컨텍스트의 일부가 아니므로 종속성이 주입되지 않습니다.

    jsp와 서블릿 모두 서블릿 conainer에 의해 인스턴스화되기 때문에 @Autowired를 직접 사용할 수 없습니다. 따라서 스프링 컨텍스트의 일부가 아니므로 종속성이 주입되지 않습니다.

    할 수있는 일 :

    또 다른 방법은 서블릿을 현재 컨텍스트의 일부로 수동으로 만드는 것입니다. JSP 및 서블릿 모두에서 가능합니다.

    public void init() {
        WebApplicationContext ctx = WebApplicationContextUtils
             .getRequiredWebApplicationContext(getServletContext());
    
        AutowireCapableBeanFactory bf = ctx.getAutowireCapableBeanFactory();
    
        bf.autowireBean(this);
    }
    

    그러면 @Autowired 주석이 달린 종속성이 해결됩니다.

    이제 서블릿 컨테이너가 하나의 서블릿 클래스 인스턴스 만 사용해야하는지 여부는 확실하지 않습니다. 그렇지 않다면 위의 코드를 종속성 (getDao ())에 대한 getter-method에 넣고 @Autowired 속성이 null 인 경우 (즉, 컨테이너에서 다른 서블릿 클래스 인스턴스를 사용하는 경우) - 위의 작업.

    즉, 웹 프레임 워크 (목록에있는 웹 프레임 워크)를 사용하는 것이 좋습니다. JSP로 논리를 갖는 것은 완전히 잘못되어, 지원하기가 어렵고, 읽기가 어렵습니다.

  3. ==============================

    3.jspInit () 메서드를 재정의하고 Autowiring 지원을 추가하는 방법은 무엇입니까?

    jspInit () 메서드를 재정의하고 Autowiring 지원을 추가하는 방법은 무엇입니까?

    <%@ page import="com.example.ExampleService"%>
    <%@ page import="org.springframework.beans.factory.annotation.Value"%>
    <%@ page import="org.springframework.beans.factory.annotation.Autowired"%>
    <%@ page import="org.springframework.web.context.support.SpringBeanAutowiringSupport"%>
    <%!
        public void jspInit() 
        {
            SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
            getServletContext());
        }
    
        @Value("${example.property}")
        private String someField;
    
        @Autowired
        private ExampleService exampleService;
    %>
    
    <% final Object data = exampleService.getSomething(someField); %>
    
  4. ==============================

    4.JSP에 종속성을 주입 할 수있는 확실한 방법이 있는지 의심 스럽습니다.

    JSP에 종속성을 주입 할 수있는 확실한 방법이 있는지 의심 스럽습니다.

    제 생각에는 SpringMVC 나 인용 한 대안 중 하나를 사용하여 JSP에서 비즈니스 로직을 가져 오기 위해 코드를 리팩토링하는 것입니다.

    주입 된 bean을 속성으로 사용하여 JSP에 요청을 전달하는 최소한의 컨트롤러로 시작하십시오. @ skaffman의 대답은이를 수행하는 한 가지 방법을 제공하거나 더 선택적으로 할 수 있습니다. 그런 다음 코드를 점진적으로 JSP에서 컨트롤러로 마이그레이션하십시오.

  5. from https://stackoverflow.com/questions/2139121/what-is-the-cleanest-way-to-autowire-spring-beans-in-a-jsp by cc-by-sa and MIT license