Struts 2 의 OGNL.

11917 단어 apache.xmljspWebstruts
본인 은 EL (Expression Language, 이하 표현 식 언어 로 번역) 의 지지자 입 니 다.나 는 <% > 쓰기 에 대해 매우 반감 을 가지 기 때문에 그 책 에서 본 한 마디 를 잊 어 버 렸 다. "표지 (Tag) 를 사용 하 는 목적 중 하 나 는 JSP 페이지 에 너무 많은 <% > 문구 가 나타 나 지 않도록 페이지 와 배경 코드 를 분리 하 는 것 이다."
표현 식 언어 는 주로 다음 과 같은 몇 가지 장점 이 있 습 니 다.
(MyType) request. getAttribute () 와 my Bean. getMyProperty () 와 같은 문 구 를 피하 고 페이지 를 더욱 간결 하 게 합 니 다.
연산 자 (예 를 들 어 + - * /) 를 지원 하고 일반 표지 보다 더 높 은 자유도 와 강 한 기능 을 가 집 니 다.
코드 논 리 를 간단명료 하 게 표현 하고 코드 를 사용 하면 더욱 읽 을 수 있 고 유지 하기 편리 하 다.
Struts 2 의 표현 식 언어
Struts 2 는 다음 과 같은 몇 가지 표현 식 언어 를 지원 합 니 다.
OGNL (Object - Graph Navigation Language) 은 대상 속성의 오픈 소스 표현 식 언어 를 편리 하 게 조작 할 수 있 습 니 다.
JSTL (JSP Standard Tag Library), JSP 2.0 통합 표준 표현 식 언어;
Groovy 는 자바 플랫폼 의 동적 언어 를 바탕 으로 가끔 유행 하 는 동적 언어 (예 를 들 어 Python, Ruby 와 Smartalk 등) 의 일부 특성 을 가진다.
Velocity 는 엄 밀 히 말 하면 표현 식 언어 가 아니 라 자바 기반 템 플 릿 매 칭 엔진 으로 JSP 보다 성능 이 좋다 고 합 니 다.
Struts 2 기본 표현 식 언어 는 OGNL 입 니 다. 다른 표현 식 언어 에 비해 다음 과 같은 몇 가지 장점 이 있 기 때 문 입 니 다.
xxx. doSomespace () 와 같은 대상 방법 호출 을 지원 합 니 다.
클래스 정적 방법 호출 과 값 접근 을 지원 합 니 다. 표현 식 의 형식 은 @ [클래스 전체 이름 (패키지 경로 포함)] @ [방법 명 | 입 니 다.  값 이름], 예: @ java. lang.String@format('foo% s',' bar ') 또는 @ tutorial.MyConstant@APP_NAME;
price = 100, discount = 0.8, calculate Price () 와 같은 할당 작업 과 표현 식 직렬 연결 을 지원 합 니 다. 이 표현 식 은 80 을 되 돌려 줍 니 다.
OGNL 컨 텍스트 (OGNL context) 와 ActionContext 에 접근 하기;
조작 집합 대상.
OGNL 의 용법
OGNL 은 < s: property value = "xx" / > 등 일반적으로 Struts 2 의 로 고 를 결합 하여 사용 합 니 다.여러분 이 자주 겪 는 문 제 는 \ #,%, $라 는 세 가지 기호의 사용 입 니 다.다음 에 나 는 예 를 들 어 이 문 제 를 이야기 하고 싶다.
우선 Struts 2 라 는 이름 을 새로 만 듭 니 다.OGNL 의 웹 프로젝트, 개발 환경 설정.그동안 많은 친구 들 이 Struts 2 를 사용 하 는 과정 에서 난 장 판 문 제 를 겪 었 다.물론 난 장 판 문 제 는 유래 가 오래 되 었 고 여러 가지 지식 을 다 루 었 기 때문에 두 세 마디 로 설명 할 수 있 는 것 이 아니 라 인터넷 에 도 편리 한 글 이 많 으 니 구 글 을 해 보 세 요.하지만 개발 과정 에 있다 면 번 거 로 운 문 제 를 피 하 는 것 도 어렵 지 않 을 것 이다.인 코딩 과 디 코딩 이 사용 하 는 방식 이 다 르 기 때문에 인 코딩 방식 을 'utf - 8' 로 설정 하 는 것 을 권장 합 니 다. 예 를 들 어 <% @  page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>。또한 웹. xml 를 설정 할 때 ActionContextCleanUp 필터 (Filter) 를 사용 합 니 다. 아래 코드 와 같 습 니 다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_9" version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    <display-name>Struts 2 OGNL</display-name>
    
    <filter>
        <filter-name>struts-cleanup</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.ActionContextCleanUp
        </filter-class>
    </filter>
    
    <filter-mapping>
        <filter-name>struts-cleanup</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    
    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>
            org.apache.struts2.dispatcher.FilterDispatcher
        </filter-class>
    </filter>

    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
    </welcome-file-list>

</web-app>

목록 1 WebContent / WEB - INF / web. xml
'\ #' 는 주로 세 가지 용도 가 있다.
OGNL 컨 텍스트 와 Action 컨 텍스트 를 방문 합 니 다. \ # ActionContext. getContext () 에 해당 합 니 다.다음 표 에는 Action Context 에서 유용 한 속성 이 몇 개 있 습 니 다.  이름
parameters 는 현재 HTTP 요청 매개 변 수 를 포함 하 는 Map \ # parameters. id [0] 역할 은 request. getParameter ("id") 에 해당 합 니 다.
request 는 현재 HttpServletRequest 의 속성 (attribute) 을 포함 하 는 Map \ # request. userName 은 request. getAttribute ("userName") 에 해당 합 니 다.
session 은 현재 HttpSession 의 속성 (attribute) 을 포함 하 는 Map \ # session. userName 은 session. getAttribute ("userName") 에 해당 합 니 다.
application 은 현재 응용 프로그램의 ServletContext 속성 (attribute) 을 포함 하 는 Map \ # application. userName 은 application. getAttribute ("userName") 에 해당 합 니 다.
attr 는 request > session > application 순서대로 속성 (attribute) 에 접근 합 니 다. \ # attr. userName 은 찾 을 때 까지 순서대로 세 범위 (scope) 에서 userName 속성 을 읽 는 것 과 같 습 니 다.
books. {? \ # this. price < 100} 와 같은 필터 와 투영 (procjecting) 집합 에 사용 합 니 다.
구조 맵, 예 를 들 어 \ # {'foo 1': 'bar 1', 'foo 2': 'bar 2'}.
다음은 액 션 코드 입 니 다.

package tutorial.action;

import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;

import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;

import tutorial.model.Book;

import com.opensymphony.xwork2.ActionSupport;

public class OgnlAction extends ActionSupport implements ServletRequestAware, SessionAware, ServletContextAware  {
    private static final long serialVersionUID = 1L;
    
    private HttpServletRequest request;
    private Map<String, String> session;
    private ServletContext application;
    private List<Book> books;
            
    public void setServletRequest(HttpServletRequest request) {
        this.request = request;    
    }

    @SuppressWarnings("unchecked")
    public void setSession(Map session) {
        this.session = session;        
    }

    public void setServletContext(ServletContext application) {
        this.application = application;
    }
    
    public List<Book> getBooks() {
        return books;
    }

    @Override
    public String execute() {
        request.setAttribute("userName", "Max From request");
        session.put("userName", "Max From session");
        application.setAttribute("userName", "Max From application");
        
        books = new LinkedList<Book>();
        books.add(new Book("978-0735619678", "Code Complete, Second Edition", 32.99));
        books.add(new Book("978-0596007867", "The Art of Project Management", 35.96));
        books.add(new Book("978-0201633610", "Design Patterns: Elements of Reusable Object-Oriented Software", 43.19));
        books.add(new Book("978-0596527341", "Information Architecture for the World Wide Web: Designing Large-Scale Web Sites", 25.19));
        books.add(new Book("978-0735605350", "Software Estimation: Demystifying the Black Art", 25.19));
        
        return SUCCESS;
    }
}

목록 2 src / tutorial / action / OgnlAction. java
이 코드 는 각각 request, session, application 범위 내 에서 "userName" 속성 을 추가 한 다음 JSP 페이지 에서 OGNL 을 사용 하여 되 찾 습 니 다. "필터 와 투영 (procjecting) 집합" 기능 을 보 여 주 는 북 대상 목록 도 만 들 었 습 니 다. 북 의 코드 는 이전 글 인 "Struts 2 에서 CRUD 구현" 에서 볼 수 있 습 니 다.
다음은 Ognl. jsp 의 코드 입 니 다. 내용 은 다음 과 같 습 니 다.

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Struts OGNL Demo</title>
</head>
<body>    
    <h3>  OGNL    Action   </h3>
    <p>parameters: <s:property value="#parameters.userName" /></p>
    <p>request.userName: <s:property value="#request.userName" /></p>
    <p>session.userName: <s:property value="#session.userName" /></p>
    <p>application.userName: <s:property value="#application.userName" /></p>
    <p>attr.userName: <s:property value="#attr.userName" /></p>
    <hr />
    <h3>       (projecting)  </h3>
    <p>Books more than $35</p>
    <ul>
        <s:iterator value="books.{?#this.price > 35}">
            <li><s:property value="title" /> - $<s:property value="price" /></li>
        </s:iterator>
    </ul>
    <p>The price of "Code Complete, Second Edition" is: <s:property value="books.{?#this.title=='Code Complete, Second Edition'}.{price}[0]"/></p>
    <hr />
    <h3>  Map</h3>
    <s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
    <p>The value of key "foo1" is <s:property value="#foobar['foo1']" /></p>
</body>
</html>

목록 3 WebContent / Ognl. jsp
위 코드 에서 주의해 야 할 것 은 "< s: property value =" books. {? \ # this. title = = "Code Complete, Second Edition"}. {price} [0] "/" 입 니 다. "books. {? \ # this. title = =" Code Complete, Second Edition "}. {price}" 가 되 돌아 오 는 값 은 집합 형식 이 므 로 "[색인]" 으로 값 을 방문 해 야 합 니 다.
마지막 으로 Struts 2 의 프로필 struts. xml 입 니 다. 내용 은 다음 과 같 습 니 다.

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
    "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
    <constant name="struts.devMode" value="true" />
    <package name="Struts2_OGNL_DEMO" extends="struts-default">
        <action name="Ognl" class="tutorial.action.OgnlAction">
            <result>/Ognl.jsp</result>
        </action>        
    </package>
</struts>

목록 4 src / struts. xml
실행 프로그램 발표
"%" 기호의 용 도 는 로고 의 속성 이 문자열 형식 일 때 OGNL 표현 식 의 값 을 계산 하 는 것 입 니 다. 예 를 들 어 Ognl. jsp 에 다음 코드 를 추가 합 니 다.


   

% 의 용도 < / h3 >
   


   

< s: url value = "% {\ # foobar [foo 1]}" / > < / p > 목록 6% 용도 의 코드 세 션 을 보 여 줍 니 다.
페이지 새로 고침
"$" 는 두 가지 주요 용도 가 있 습 니 다.
국제 화 자원 파일 에서 OGNL 표현 식 을 참조 합 니 다. 예 를 들 어 을 참고 하 십시오.
Struts 2 프로필 에서 < action name = "AddPhoto" class = "addPhoto" > 와 같은 OGNL 표현 식 을 참조 합 니 다.
                       
            ListPhotos.action?albumId=${albumId}
       
$용도 코드 세 션 보 여주 기
총결산
OGNL 은 기능 이 매우 큰 표현 식 언어 로 우리 의 개발 을 더욱 빠르게 할 수 있다.

좋은 웹페이지 즐겨찾기