복붙노트

[SPRING] 내 봄 프로젝트에서 태그를 쓰는 방법?

SPRING

내 봄 프로젝트에서 태그를 쓰는 방법?

스프링 프레임 워크에 내 태그 (extends TagSupport)를 작성하고 싶습니다. 내 태그 클래스에서는 봄에 자동 주입해야하는 서비스를 사용합니다. 하지만 난 항상 null, 스프링이 내 태그 클래스에 서비스 인스턴스를 삽입 할 수없는 것 같습니다.

코드는 다음과 같습니다.

public class FetchTagNameTag extends TagSupport {

   @Autowired
   private TaskService taskService;
   ...

taskService는 항상 null입니다.

이 문제를 어떻게 해결할 수 있습니까? 감사.

해결법

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

    1.JSP 태그 객체는 Spring에 의해 관리되지 않고 서블릿 컨테이너에 의해 관리된다. 결과적으로 태그에 내용을 자동으로 추가 할 수 없습니다.

    JSP 태그 객체는 Spring에 의해 관리되지 않고 서블릿 컨테이너에 의해 관리된다. 결과적으로 태그에 내용을 자동으로 추가 할 수 없습니다.

    봄 appcontext에서 bean을 잡아 내야 할 필요가 있다면 Spring MVC 컨트롤러는 request.setAttribute ()를 사용하여 요청 속성으로 bean을 설정해야한다. 그러면 태그 객체가이를 유지할 수있다.

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

    2.RequestContextAwareTag를 활용 해보십시오. RequestContext를 얻고 WebApplicaitonContext를 얻는 메소드를 제공합니다. 여기 좀 봐.

    RequestContextAwareTag를 활용 해보십시오. RequestContext를 얻고 WebApplicaitonContext를 얻는 메소드를 제공합니다. 여기 좀 봐.

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

    3.@Configurable으로 태그 구현에 주석을 달고 Spring- Configuration에 를 추가하십시오.

    @Configurable으로 태그 구현에 주석을 달고 Spring- Configuration에 를 추가하십시오.

  4. ==============================

    4.이 스프링 패키지를 봄 참고서와 스프링 소스에서 확인하십시오. org.springframework.web.servlet.tags org.springframework.web.servlet.tags.form

    이 스프링 패키지를 봄 참고서와 스프링 소스에서 확인하십시오. org.springframework.web.servlet.tags org.springframework.web.servlet.tags.form

    그 외에는 스프링 개발자가 스프링 태그를 어떻게 작성했는지 보여줄 것입니다.

  5. ==============================

    5.다음과 같이 정적 메소드를 작성하면됩니다.

    다음과 같이 정적 메소드를 작성하면됩니다.

    public static void autowireAllFor(Object target) {
        AutowiredAnnotationBeanPostProcessor bpp = new AutowiredAnnotationBeanPostProcessor();
        bpp.setBeanFactory(...yourBeanFactory...);
        bpp.processInjection(target);
    }
    

    그런 다음 태그에 대해 수행 할 수 있습니다.

    public class YourTag extends TagSupport {
    
       @Autowired
       private SomeBean someBean;
    
       public YourTag() {
          YourHelperClass.autowireAllFor(this);
       }
    }
    

    이 접근법의 명백한 단점은 모든 생성자에 대해이 작업을 수행해야한다는 것입니다. 그러나 TagSupport에는 하나만 있으므로 문제가되지 않습니다. 한 단계 더 나아가 항상 autowiring을 보장하는 도우미 수퍼 클래스를 만들 수 있습니다.

    public class SpringTagSupport extends TagSupport {
       public SpringTagSupport() {
          super();
          YourHelperClass.autowireAllFor(this);
       }
    }
    

    나머지는 SpringTagSupport에서 클래스를 확장하는 것만 큼 쉽습니다.

  6. ==============================

    6.먼저 나는 이것을 적는다.

    먼저 나는 이것을 적는다.

    public abstract class SpringSuportedTag  extends SimpleTagSupport{
    
    protected WebApplicationContext _applicationContext;
    
    protected WebApplicationContext getSpringContext(){
        PageContext pageContext = (PageContext) getJspContext();
        if(_applicationContext==null){
            _applicationContext = RequestContextUtils.getWebApplicationContext(
                    pageContext.getRequest(),
                    pageContext.getServletContext()
                );
            initCustomBeans();
        }
        return _applicationContext;
    }
    
    protected abstract void initCustomBeans();
    
    /**
     * Deprecated for inserting extra logic. Use {@link #doTagWithSpring()} instead.
     */
    @Override
    @Deprecated
    public void doTag() throws JspException, IOException {
        getSpringContext();
        doTagWithSpring();
    }
    
    
    abstract void doTagWithSpring() throws JspException, IOException;
    }
    

    사용법 :

    public class SlotTag extends SpringSuportedTag {
    
    //  @Resource(name="userDetailHolder")
    //  not work here
    UserDetailHolder userDetail;
    
    private String slotname;
    
    public String getSlotname() {
        return slotname;
    }
    
    public void setSlotname(String slotname) {
        this.slotname = slotname;
    }
    
    @Override
    void doTagWithSpring() throws JspException, IOException {
        PageContext pageContext = (PageContext) getJspContext();
        String userDetailCode = pageContext.getAttribute(InitWidgetUserTag.KAY_USERDETAIL,  PageContext.PAGE_SCOPE).toString();
        userDetail.init(userDetailCode);
        String pageID = pageContext.getAttribute(InitWidgetUserTag.KAY_PAGEID,  PageContext.PAGE_SCOPE).toString();
    
        getJspContext().getOut().println("<b>slot for user:"+userDetail.getUserId()+"</b>");
    }
    
    @Override
    protected void initCustomBeans() {
        userDetail = (UserDetailHolder) getSpringContext().getBean("userDetailHolder");
    
    }
    }
    

    그것은 일이다. 그러나 나는 이것을 발견했다. Spring이 지원하는 Tag Libraries. 내 프로젝트에서 진실은 여전히 ​​자신의 솔루션을 사용합니다.

  7. ==============================

    7.사용 : -

    사용 : -

    import org.springframework.web.servlet.tags.RequestContextAwareTag;
    
    public class FetchTagNameTag extends RequestContextAwareTag {
    
    //   @Autowired
    
      // private TaskService taskService;
    
       @Override
    
        protected int doStartTagInternal() throws Exception {
    
    TaskService taskService=  getRequestContext().getWebApplicationContext().getBean(TaskService.class);
    
    
        return 0;
       }
    
  8. from https://stackoverflow.com/questions/3924909/how-to-write-tag-in-my-spring-project by cc-by-sa and MIT license