struts 2 에서 JSTL 을 사용 하여 action 의 변 수 를 읽 습 니 다.

9679 단어 jspservletWebwork
Struts 2 에서 어떻게 JSTL 을 사용 하여 Action 의 변 수 를 읽 습 니까?
이것 은 역사가 유구 한 문제 다.사실 많은 친구 들(나 포함)이 Struts 2 자체 의 태그 라 이브 러 리 를 사용 하지 않 고 JSTL 을 사용 하기 때 문 입 니 다.JSTL 태그 라 이브 러 리 가 적 고 간단 하고 사용 하기 쉬 운 이유 때 문 일 것 입 니 다.
JSTL 기본 값 은 page,request,session,application 등 네 개의 Scope 에서 해당 하 는 EL 표현 식 에 대응 하 는 대상 의 값 을 한 번 씩 찾 는 것 을 알 고 있 습 니 다.그러면 JSTL 을 사용 하여 Action 의 변 수 를 읽 으 려 면 Action 의 변 수 를 request 필드 에 넣 어야 합 니 다.그래서 웹 워 크 2.1.X 시대 에 우 리 는 차단 기 를 만들어 서 이 일 을 할 것 이다.대체적인 원 리 는 Action 이 실행 되 고 돌아 오기 전에 Action 의 모든 변 수 를 차례대로 읽 고 request.setAttribute()를 순서대로 호출 하여 설정 하 는 것 이다.구체 적 인 통합 방식 은 다음 과 같은 문 서 를 참고 하 시기 바 랍 니 다.
그러나 시대 가 발전 함 에 따라 위의 이런 방식 은 더 이상 추천 되 지 않 고 사용 되 었 다.그럼 에 도 불구 하고 우 리 는 그것 의 문 제 를 해결 하 는 방향 을 배 울 수 있다)현재 로 서 는 웹 워 크 2.2 이후 Struts 2 를 포함 하여 모두 다른 통합 방식 을 사용 하여 Http ServletRequest 를 장식 할 수 있다.소스 코드 를 살 펴 보 겠 습 니 다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 public class StrutsRequestWrapper extends HttpServletRequestWrapper {
 
     /**
      * The constructor
      * @param req The request
      */
     public StrutsRequestWrapper(HttpServletRequest req) {
         super(req);
     }
 
     /**
      * Gets the object, looking in the value stack if not found
      *
      * @param s The attribute key
      */
     public Object getAttribute(String s) {
         if (s != null && s.startsWith("javax.servlet")) {
             // don't bother with the standard javax.servlet attributes, we can short-circuit this
             // see WW-953 and the forums post linked in that issue for more info
             return super.getAttribute(s);
         }
 
         ActionContext ctx = ActionContext.getContext();
         Object attribute = super.getAttribute(s);
 
         boolean alreadyIn = false;
         Boolean b = (Boolean) ctx.get("__requestWrapper.getAttribute");
         if (b != null) {
             alreadyIn = b.booleanValue();
         }
 
         // note: we don't let # come through or else a request for
         // #attr.foo or #request.foo could cause an endless loop
         if (!alreadyIn && attribute == null && s.indexOf("#") == -1) {
             try {
                 // If not found, then try the ValueStack
                 ctx.put("__requestWrapper.getAttribute", Boolean.TRUE);
                 ValueStack stack = ctx.getValueStack();
                 if (stack != null) {
                     attribute = stack.findValue(s);
                 }
             } finally {
                 ctx.put("__requestWrapper.getAttribute", Boolean.FALSE);
             }
         }
         return attribute;
    }
}

봤 어 요?이 종 류 는 Struts 2 가 초기 화 될 때 HttpServletRequest 를 교체 하여 전체 Struts 2 가 실행 되 는 과정 에서 request.getAttribute()를 호출 하려 고 할 때 이 방법 을 실행 합 니 다.(이것 은 전형 적 인 장식 기 모드 입 니 다)위의 방법 을 실행 할 때 HttpServletRequest 의 원래 request.getAttribute()를 먼저 호출 합 니 다.찾 지 못 하면 ValueStack 에서 계속 찾 습 니 다.action 은 ValueStack 에 있 기 때문에 action 의 변 화 량 은 OGNL 표현 식 을 통 해 해당 하 는 값 을 찾 을 수 있 습 니 다.
여기 서 엘 표현 식 이 광범 위 하 게 사용 되 는 오늘날,JSTL 1.1 이후 에 도 엘 표현 식 을 직접 사용 할 수 있 습 니 다.struts 2 를 직접 사용 하 는 tag 와 의 차이 점 을 주의 하 십시오.여기 서 el 의 표시 기 호 를 사용 해 야 합 니 다:${}
예 를 들 어${user.name},

좋은 웹페이지 즐겨찾기