2016-07-02 3 views
1

JSP 페이지에 CDI SessionScoped 빈을 주입하고 싶습니다.<jsp:useBean>을 통해 액세스되는 세션 범위의 CDI 빈은 서블릿과 다른 것으로 보입니다.

import javax.enterprise.context.SessionScoped; 
import java.io.Serializable; 

@SessionScoped 
public class UserSessionBean implements Serializable { 

    private String email = "email"; 

    public UserSessionBean(){} 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 
} 

빈을이 방법으로 사용할 때 제대로 작동하고 JSP 페이지에 초기 값이 표시됩니다.

<jsp:useBean id="userSessionBean" class="package.UserSessionBean"/> 
<jsp:getProperty name="userSessionBean" property="email"/> 

문제점은 내 API 내의 다른 서블릿에서 호출하는 서비스에 동일한 bean을 삽입 할 때 발생합니다. 이 경우 JSP 페이지에서 업데이트 된 값을 얻지 못합니다. JSP 페이지와 서비스 내에서 다른 bean을 얻는 것처럼 보입니다.

Servlet에서 액세스되는 JSP와 서비스 레이어 내에서 동일한 SessionScoped bean을 사용하는 방법을 조언 할 수 있습니까?

+1

AFAIK, 클래스에'@Named ("foo")'주석을 달고 있다면 빈은 "foo"라는 세션 속성에 저장됩니다. jsp : useBean과 jsp : getProperty는 1999 년에 훌륭했습니다. 이제 그들은 완전히 쓸모 없습니다. 대답에 대한 –

답변

4

<jsp:useBean><jsp:getProperty> 태그를 제거하십시오. 그들은 servlets, ELCDI보다 먼저 나타납니다. 이러한 태그는 사용자 정의 서블릿이나 MVC 프레임 워크에서 제공하는 서블릿을 사용하지 않는 JSP 페이지에 사용됩니다. a.o를 참조하십시오. jsp:useBean scope.

CDI 접근법은 단순히 @Named 주석을 Bean 클래스에 붙여서 EL에 이름을 지정하는 것입니다.

@Named 
@SessionScoped 
public class UserSessionBean implements Serializable {} 

이름의 기본값은 소문자로 강조 표시된 클래스 이름입니다. 위의 CDI 관리 빈은 EL에서 ${userSessionBean}으로 사용할 수 있습니다. 이는 일반 JSP 페이지에서도 작동합니다.

<p>Email: <c:out value="${userSessionBean.email}" /></p> 

그게 전부입니다. 귀하의 서비스 또는 심지어 서블릿에서 @Inject을 계속 사용하여 동일한 인스턴스를 얻을 수 있습니다. 위의 JSP 코드에서 JSTL<c:out>이 값 인쇄에 꼭 필요한 것은 아니라는 점에 유의하십시오. JSP 2.0이 없으면 그렇게 할 수 있습니다. Facelets는이 같은 상당히 쥬 뷰 기술로

<p>Email: ${userSessionBean.email}</p> 

그러나 JSP

는 XSS 방지를 내장하지 않습니다. 잠재적 인 XSS 공격 홀을 방지하기 위해 사용자 제어 입력을 피하려면 <c:out>을 사용해야합니다. a.o를 참조하십시오. XSS prevention in JSP/Servlet web application.

마지막으로 중요한 것은 학습 리소스가 현재 사용 가능한 버전으로되어 있는지 확인하십시오. 그 <jsp:useBean> 태그는 이전 세기의 태그입니다.

+0

주셔서 감사합니다. 불행히도 이것은 작동하지 않습니다. (@Named ("userSessionBean") @SessionScoped public class UserSessionBean은 Serializable {.... <% @ page contentType = "text/html; charset = UTF-8"language = "java "%> <% @ taglib uri ="http://java.sun.com/jsp/jstl/core "prefix ="c "%>

이메일 :

VadOs

+0

출력이 완전히 비어있는 경우 (이 값이 작동하지만 초기 값만 표시되는 동안 (

VadOs

+0

배포 할 컨테이너는 무엇입니까?이것은 CDI 가능 컨테이너에서 작동해야합니다. 적어도, 제대로 구성된 경우 [Tomcat + Weld] (http://stackoverflow.com/questions/18995951/how-to-install-and-use-cdi-on-tomcat)에서 저에게 적합합니다. – BalusC