1. 국제화
리소스 파일을 준비합니다. 리소스 파일의 이름 지정 형식은 다음과 같습니다.
baseName_언어_국가.속성
baseName_언어.속성
baseName.속성
그 중 baseName은 리소스 파일의 기본 이름으로 커스터마이징이 가능하지만, 언어와 국가는 java에서 지원하는 언어와 국가여야 합니다. 좋다:
중국 본토: baseName_zh_CN.properties
미국: baseName_en_US.properties
이제 애플리케이션에 두 개의 리소스 파일을 추가합니다.
첫 번째 항목은 중국어를 저장합니다: csdn_zh_CN.properties
내용은 다음과 같습니다: Welcome=Chuanzhi Podcast에 오신 것을 환영합니다. 두 번째 보관소는 영어(미국): csdn_en_US.properties입니다.
내용은 다음과 같습니다: Welcome=csdn에 오신 것을 환영합니다.
중국어 속성 파일의 경우 작성한 후 jdk에서 제공하는 Native2ascii 명령을 사용하여 해당 파일을 유니코드 인코딩 파일로 변환해야 합니다. 명령은 다음과 같이 사용됩니다.
Native2ascii 소스 파일.속성 대상 파일.속성
2. 글로벌 자원 구성 및 국제 정보 출력
리소스 파일을 준비한 후 다음과 같이 struts.xml의 struts.custom.i18n.resources 상수를 통해 리소스 파일을 전역 리소스 파일로 정의할 수 있습니다.
<상수 이름="struts.custom.i18n.resources" value="csdn" />
csdn은 리소스 파일의 기본 이름입니다.
나중에 페이지나 작업에서 국제화 정보에 액세스할 수 있습니다.
국제화 정보를 출력하려면 JSP 페이지에서 <s:text name=""/> 태그를 사용하십시오.
<s:text name="user"/>, name은 리소스 파일의 키입니다.
Action 클래스에서는 ActionSupport를 상속하고 getText() 메서드를 사용하여 국제화 정보를 얻을 수 있습니다. 이 메서드의 첫 번째 매개 변수는 리소스 파일의 키를 지정하는 데 사용됩니다.
양식 태그에서 다음과 같은 키 속성을 통해 리소스 파일의 키를 지정합니다.
<s:textfield name="realname" key="user"/>
3. 국제화 - 자리 표시자를 사용하여 국제화 정보 출력
리소스 파일의 내용은 다음과 같습니다.
환영합니다= {0}, Chuanzhi 팟캐스트 {1}에 오신 것을 환영합니다
JSP 페이지에서 자리 표시자를 사용하여 국제화 정보 출력
<s:텍스트 이름="환영합니다">
<s:param><s:property value="realname"/></s:param>
<s:param>학습</s:param>
</s:텍스트>
Action 클래스의 자리 표시자를 사용하여 국제화 정보를 얻으려면 getText(String key, String[] args) 또는 getText(String aTextName, List args) 메서드를 사용할 수 있습니다.
4. 국제화 - 범위 리소스 파일
대규모 응용 프로그램에서는 전체 응용 프로그램에 국제화해야 할 콘텐츠가 많이 있습니다. 국제화된 모든 콘텐츠를 전역 리소스 속성 파일에 배치하면 리소스 파일이 너무 커지고 비대해지고 불편해집니다. 때로는 패키지 범위를 사용하여 다양한 모듈에 대한 국제화 파일을 구성할 수 있습니다.
방법은 다음과 같습니다.
package_lang_country.properties 리소스 파일을 java 패키지 아래에 배치합니다. 패키지는 이 패키지 아래의 작업이 고정된 작성 방법이며 하위 패키지에서 이 리소스에 액세스할 수 있습니다. 지정된 키를 사용하여 메시지를 검색할 때 시스템은 먼저 패키지 리소스 파일에서 검색합니다. 해당 키를 찾을 수 없으면 상수 struts.custom.i18n.resources에 지정된 리소스 파일에서 검색합니다.
5. 국제화-작업 범위 리소스 파일
다음과 같이 작업에 대해 별도로 리소스 파일을 지정할 수도 있습니다.
Action 클래스가 있는 경로에 ActionClassName_언어_country.properties 리소스 파일을 배치합니다. ActionClassName은 액션 클래스의 간단한 이름입니다.
지정된 키가 있는 메시지를 찾을 때 시스템은 먼저 ActionClassName_언어_country.properties 리소스 파일에서 검색합니다. 해당 키를 찾을 수 없으면 찾을 때까지 현재 패키지를 따라 기본 이름 패키지가 있는 리소스 파일을 검색합니다. 최상위 패키지. 해당 키를 찾지 못한 경우 최종적으로 struts.custom.i18n.resources 상수에 의해 지정된 리소스 파일에서 검색됩니다.
6. 국제화 - JSP의 리소스 파일에 직접 액세스
Struts2는 <s:i18n> 태그를 제공합니다. <s:i18n> 태그를 사용하면 아무런 구성 없이 클래스 경로의 리소스 파일에서 직접 국제화된 데이터를 얻을 수 있습니다.
<s:i18n 이름="csdn">
<s:text name="환영합니다"/>
</s:i18n>
csdn은 클래스 경로에 있는 리소스 파일의 기본 이름입니다.
액세스하려는 리소스 파일이 클래스 경로의 특정 패키지에 있는 경우 다음과 같이 액세스할 수 있습니다.
<s:i18n 이름="cn/csdn/action/package">
<s:텍스트 이름="환영합니다">
<s:param>장샤오</s:param>
</s:텍스트>
</s:i18n>
위의 내용은 cn.csdn.action 패키지 아래 기본적으로 package라는 리소스 파일에 액세스합니다.
7. OGNL 표현 언어
OGNL은 Object Graphic Navigation Language의 약자로 오픈소스 프로젝트입니다. Struts 2 프레임워크는 OGNL을 기본 표현 언어로 사용합니다.
EL 표현식과 비교하여 다음과 같이 일반적으로 필요한 일부 기능을 제공합니다.
xxx.sayHello()와 같은 객체 메서드 호출을 지원합니다.
클래스 정적 메서드 호출 및 값 액세스를 지원합니다. 표현식 형식은 @[전체 클래스 이름(패키지 경로 포함)]@[메서드 이름 | 값 이름]입니다. 예: @java.lang.String@format('foo %s' , '바') 또는 @cn.csdn.Constant@APP_NAME;
컬렉션 개체를 조작합니다.
Ognl은 context라는 개념을 가지고 있습니다. 간단히 말해서 context는 java.utils.Map 인터페이스를 구현한 MAP 구조입니다. Struts2에서 context의 구현은 ActionContext입니다.
컨텍스트의 개체에 액세스하려면 # 기호를 사용하여 #application, #session과 같은 네임스페이스를 표시해야 합니다.
또한 OGNL은 루트 개체(루트 개체)를 설정합니다. Struts2에서는 루트 개체가 ValueStack(값 스택)입니다. 루트 개체(예: ValueStack)에 있는 개체의 속성에 액세스하려면 # 네임스페이스를 생략하고 개체의 속성에 직접 액세스하면 됩니다.
struts2에서 루트 객체 ValueStack의 구현 클래스는 OgnlValueStack입니다. 이 객체는 우리가 상상했던 것처럼 단일 값을 저장할 뿐만 아니라 객체 그룹을 저장합니다. OgnlValueStack 클래스에는 객체 그룹을 저장하는 데 사용되는 List 유형의 루트 변수가 있습니다.
|--요청
|--응용 프로그램
context ------|--OgnlValueStack 루트 변수 [action, OgnlUtil, ... ]
|--세션
|--attr
|--매개변수
루트 변수의 첫 번째 개체를 스택의 최상위 개체라고 합니다. 일반적으로 OGNL 표현식에 속성 이름을 직접 작성하여 루트 변수에 있는 개체의 속성에 액세스할 수 있습니다. 스택의 맨 위에 있는 경우 두 번째 개체부터 검색하고, 찾을 수 없으면 세 번째 개체부터 검색하여 찾을 때까지 순차적으로 액세스합니다.
주의: Struts2에서는 OGNL 표현식을 Struts 태그와 함께 사용해야 합니다. 예: <s:property value="name"/>
ValueStack은 Struts 2에서 OGNL의 루트 객체이기 때문에 사용자가 값 스택의 객체에 액세스해야 하는 경우 JSP 페이지는 다음 EL 표현식을 통해 ValueStack에 있는 객체의 속성에 직접 액세스할 수 있습니다.
${foo} //값 스택에 있는 객체의 foo 속성을 가져옵니다.
다른 Context의 객체에 접근하는 경우 루트 객체가 아니므로 접근 시 # 접두사를 추가해야 합니다.
애플리케이션 객체: #application.userName 또는 #application['userName']과 같은 ServletContext에 액세스하는 데 사용됩니다. 이는 ServletContext의 getAttribute("username")를 호출하는 것과 동일합니다.
세션 객체: #session.userName 또는 #session['userName']과 같은 HttpSession에 액세스하는 데 사용됩니다. 이는 session.getAttribute("userName")를 호출하는 것과 동일합니다.
요청 객체: #request.userName 또는 #request['userName']와 같은 HttpServletRequest 속성에 액세스하는 데 사용되는 맵입니다. 이는 request.getAttribute("userName") 호출과 동일합니다.
매개변수 객체: #parameters.userName 또는 #parameters['userName']와 같은 HTTP 요청 매개변수에 액세스하는 데 사용됩니다. 이는 request.getParameter("username") 호출과 동일합니다.
attr 객체: 페이지->요청->세션->응용 프로그램 순으로 해당 속성에 액세스하는 데 사용됩니다.
8. EL 표현식을 사용하여 valueStack의 객체 속성에 액세스할 수 있는 이유는 무엇입니까?
그 이유는 Struts2가 HttpServletRequest를 추가로 캡슐화하기 때문입니다. 단순화된 코드는 다음과 같습니다.
공개 클래스 StrutsRequestWrapper는 HttpServletRequestWrapper를 확장합니다.
공개 StrutsRequestWrapper(HttpServletRequest req) {
슈퍼(요구);
}
공개 객체 getAttribute(String s) {
...
ActionContext ctx = ActionContext.getContext();
객체 속성 = super.getAttribute(s);//먼저 요청 범위에서 속성 값을 가져옵니다.
if (ctx != null) {
if (attribute == null) {//요청 범위에서 속성 값을 찾을 수 없는 경우 ValueStack에서 객체의 속성 값을 찾습니다.
...
ValueStack 스택 = ctx.getValueStack();
속성 = stack.findValue(s);
...
}
}
반환 속성;
}
}
9. OGNL 표현식을 사용하여 목록/지도 컬렉션 개체 만들기
컬렉션 요소(예: List 개체 또는 Map 개체)가 필요한 경우 OGNL의 컬렉션 관련 표현식을 사용할 수 있습니다.
List 객체를 직접 생성하려면 다음 코드를 사용하세요.
<s:set name="list" value="{'zhangming','xiaoi','liming'}" />
<s:반복자 값="#list" id="n">
<s:속성 값="n"/><br>
</s:반복자>
지도 객체를 생성합니다.
<s:set name="foobar" value="#{'foo1':'bar1', 'foo2':'bar2'}" />
<s:iterator value="#foobar" >
<s:속성 값="키"/>=<s:속성 값="값"/><br>
</s:반복자>
Set 태그는 지정된 범위에 값을 배치하는 데 사용됩니다.
범위: 변수가 배치되는 범위를 지정합니다. 이 속성은 애플리케이션, 세션, 요청, 페이지 또는 작업을 허용할 수 있습니다. 이 속성이 설정되지 않으면 기본적으로 OGNL 컨텍스트에 배치됩니다.
값: 변수에 할당된 값입니다. 이 속성이 설정되지 않은 경우 ValueStack 스택 상단의 값이 변수에 할당됩니다.