1. 유형 변환의 의미
스마트 MVC 프레임워크의 경우 B/S(브라우저/서버) 구조 응용 프로그램의 요청 매개변수가 브라우저를 통해 서버로 전송되기 때문에 이러한 매개변수는 풍부한 데이터 유형을 가질 수 없습니다. 변환은 서버 측에서 완료되어야 합니다
MVC 프레임워크는 프리젠테이션 계층 솔루션이며 유형 변환 지원을 제공해야 합니다. Struts2는 매우 강력한 유형 변환 지원을 제공합니다.
2. 프리젠테이션 레이어 데이터 처리
1. 웹 애플리케이션의 경우 프리젠테이션 계층은 사용자 입력 데이터를 수집하고 사용자에게 서버 상태를 표시하는 등 사용자와 상호 작용하는 데 주로 사용됩니다. 따라서 프리젠테이션 계층의 데이터 흐름은 주로 입력 데이터와 출력 데이터라는 두 가지 방향을 갖습니다.
2. 입력 데이터의 경우: 문자열 데이터에서 여러 유형의 데이터로의 변환을 완료해야 합니다. 프로그램은 일반적으로 자동으로 완료될 수 없으며 코드에서 수동으로 변환해야 합니다.
3. 출력 데이터의 경우: java와 jsp 모두 여러 데이터 유형의 직접 출력을 지원합니다.
4. 프리젠테이션 계층의 또 다른 데이터 처리는 데이터 검증입니다. 이는 클라이언트 검증과 서버 측 검증으로 구분됩니다. 이에 대해서는 나중에 자세히 설명합니다.
3. 유형 변환
1. HTTP 매개변수는 모두 문자열 유형입니다. 저장된 데이터는 문자열, 숫자, 부울, 날짜 및 시간 등이거나 JavaBean 유형일 수 있습니다. 문자열을 날짜로 변환하는 것과 같은 수동 유형 변환: request.getParameter 메소드를 통해 문자열을 얻습니다. DateFormat.parse 메소드를 통해 문자열이 Date 객체로 변환됩니다.
2. Struts2 유형 변환
Struts2 내장 유형 변환
문자열과 부울은 문자열과 부울 값 간의 변환을 완료합니다.
일반 문자열과 문자 간의 문자열 및 문자 변환
String, int 및 Integer는 문자열과 정수 간의 변환을 완료합니다.
String 및 Long은 문자열과 긴 정수 값 사이의 변환을 완료합니다.
String, double 및 Double은 문자열과 배정밀도 부동 소수점 값의 변환을 완료합니다.
문자열과 부동 소수점은 문자열과 단정밀도 부동 소수점 간의 변환을 완료합니다.
문자열과 날짜는 문자열과 날짜 유형 간의 변환을 완료합니다. 날짜 형식은 사용자가 형식을 요청하는 로케일의 SHORT 형식을 사용합니다.
문자열 및 배열 기본 경우, 배열 요소는 사용자가 유형 변환기를 정의하는 경우 다른 복합 데이터 유형일 수도 있습니다.
문자열과 맵과 리스트
Struts2 내장 유형 변환
문자열과 부울은 문자열과 부울 값 간의 변환을 완료합니다.
일반 문자열과 문자 간의 문자열 및 문자 변환
String, int 및 Integer는 문자열과 정수 간의 변환을 완료합니다.
String 및 Long은 문자열과 긴 정수 값 사이의 변환을 완료합니다.
String, double 및 Double은 문자열과 배정밀도 부동 소수점 값의 변환을 완료합니다.
문자열과 부동 소수점은 문자열과 단정밀도 부동 소수점 간의 변환을 완료합니다.
문자열과 날짜는 문자열과 날짜 유형 간의 변환을 완료합니다. 날짜 형식은 사용자가 형식을 요청하는 로케일의 SHORT 형식을 사용합니다.
문자열 및 배열 기본 경우, 배열 요소는 사용자가 유형 변환기를 정의하는 경우 다른 복합 데이터 유형일 수도 있습니다.
문자열과 맵과 리스트
3. 내장형 변환 기능
4. Struts 유형 변환 API
Struts2의 유형 변환기는 실제로 OGNL을 기반으로 구현되어 있습니다. OGNL 프로젝트에는 ognl.TypeConverter 인터페이스가 있습니다. 이 인터페이스는 유형 변환기를 구현하기 위해 반드시 구현해야 하는 인터페이스입니다. 인터페이스는 다음과 같이 정의됩니다.
공용 인터페이스 TypeConverter {
공용 개체 변환 값(지도 arg0, 개체 arg1, 멤버 arg2, 문자열 arg3,
개체 arg4, 클래스 arg5) {
null을 반환;
}
유형 변환기를 구현하려면 위의 TypeConverter를 구현해야 합니다. 그러나 위 인터페이스의 메소드는 너무 복잡하므로 OGNL 프로젝트에서는 이 인터페이스의 구현 클래스인 ognl.DefaultTypeConverter도 제공합니다. 이 클래스를 상속하면 다음과 같이 정의됩니다.
공용 클래스 DefaultTypeConverter는 객체를 확장하여 TypeConverter를 구현합니다.
공용 개체 변환 값(Map<String,Object>context, Objectvalue, ClasstoType) {
}
……//다른 방법
}
ConvertValue 메서드의 역할은 형식 변환을 완료하는 것이지만 이 형식 변환은 문자열을 개체 인스턴스로 변환해야 하는 경우에도 이 메서드를 사용합니다. 사용된. 이 변환은 변환해야 하는 대상 유형인 toType 매개변수 유형을 통해 수행됩니다. 따라서 toType 매개변수에 따라 변환 방향을 결정할 수 있습니다.
ConvertValue 메소드 매개변수 및 반환 의미 첫 번째 매개변수: context는 유형 변환 환경의 컨텍스트입니다. 두 번째 매개변수: value는 변환해야 하는 매개변수입니다. value 매개변수의 값도 변환 방향에 따라 다릅니다.
세 번째 매개변수: toType은 변환된 대상 유형입니다. 이 메소드의 반환 값은 유형 변환 후의 값입니다. 변환 방향에 따라 값 유형도 변경됩니다. 변환된 ConvertValue 메소드는 변환이 필요한 값을 받아들이고, 변환이 필요한 대상 타입이 매개변수이며, 이후 변환된 대상 값을 반환하는 것을 볼 수 있다.
Value가 문자열 배열인 이유는 무엇입니까?
DefaultTypeConverter 변환기의 경우 가장 일반적인 상황을 고려해야 하므로 모든 요청 매개변수를 문자열이 아닌 문자열 배열로 처리합니다. getParameterValues()로 얻은 매개변수 값과 동일
4. 유형 변환기 구현
1. 첫 번째 단계 등록 페이지
2. 두 번째 단계: 사용자 캡슐화 클래스 구현
3. 세 번째 단계: Action 클래스 구현
5. 5단계: 유형 변환기 등록 세 가지 등록 방법이 있습니다.
1. 로컬 유형 변환기 등록: 로컬 유형 변환기는 특정 작업의 속성에서만 작동합니다.
2. 전역 유형 변환기 등록: 전역 유형 변환기는 Action의 모든 특정 속성에 적용됩니다.
3. JDK1.5 주석을 사용하여 유형 변환기를 등록합니다. 등록을 통해 유형 변환기를 생성합니다.
6. 부분형 변환기 등록 등록 파일명 형식: ActionName-conversion.properties: ActionName은 변환기가 적용되기 위해 필요한 Action의 클래스 이름이며, 다음 -conversion.properties 문자열은 부분 또는 변환 수정 시 일반적인 속성 파일입니다. 파일의 내용은 다음과 같습니다. propertyName = 유형 변환기 클래스. 다음은 UserAction-conversion.properties 파일의 내용입니다.
# 유형 변환을 완료하려면 UserAction의 사용자 속성이 redarmy.user.UserConverter 클래스를 사용해야 함을 지정합니다.
사용자=redarmy.user.UserConverter
참고: 위 속성 파일은 UserAction과 동일한 패키지에 있어야 합니다. 즉, 위의 경우 위 방법을 사용하여 로컬 유형 변환을 수행할 수 있습니다.
7. 전역형변환기 등록명의 파일형식 : xwork-conversion.properties 파일 이 파일 역시 속성파일이며, 그 내용 역시 "복합형형 = 해당형변환기 클래스" 항목으로 구성되어 있다.
다음은 xwork-conversion.properties 파일의 내용입니다.
# 모든 redarmy.user.User 클래스의 유형 변환기를 redarmy.user.UserConverter로 지정합니다.
redarmy.user.User=redarmy.user.UserConverter
참고: xwork-conversion.properties 파일은 class 폴더, 즉 src 아래에 생성되어야 합니다.
5. Struts2 사용자 정의 유형 변환
StrutsTypeConverter 클래스는 사용자 정의 유형 변환의 설계를 단순화하기 위해 Struts2에서 제공됩니다. 이 클래스에는 구현해야 하는 두 가지 추상 메소드가 있습니다.
(1) 공용 개체 ConvertFromString(Map 컨텍스트, String[] 값, 클래스 toClass);
문자열 유형 데이터를 사용자 정의 유형으로 변환하는 데 사용되는 처리 방법 매개변수:
context --- Action과 관련된 상황별 정보
값 --- 요청에서 얻은 매개변수 값
toClass --- 변환할 대상 유형
(2) 공개 문자열 ConvertToString(Map context, Object obj);
사용자 정의 유형을 문자열로 변환하는 데 사용됩니다.
매개변수:
context --- Action과 관련된 상황별 정보
obj --- 사용자 정의 유형 객체
분석 예시: 날짜 유형 변환 설계 및 구성
(1) MyDateTypeConverter를 설계하고 StrutsTypeConverter를 상속하며 해당 메소드 중 두 가지를 다룹니다. 참조 코드는 다음과 같습니다.
공용 개체 변환FromString(맵 컨텍스트, 문자열[] 값, 클래스 toClass) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
노력하다{
날짜 v = sdf.parse(values[0]);
v를 반환;
}catch(예외 e){
e.printStackTrace();
새로운 날짜()를 반환합니다;
}
}
계속되는
public String ConvertToString(Map context, Object obj) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일");
날짜 v = (날짜)obj;
sdf.format(v)을 반환합니다.
}
Struts2는 기본적으로 문자열 및 날짜 변환을 지원하지만 짧은 형식과 현지화된 날짜 형식 변환만 지원하므로 자체 유형 변환을 구현해야 합니다.
(2) 유형이 java.util.Date인 UserInfo 클래스에 생일 속성을 추가합니다.
공개 클래스 UserInfo {
개인 정수 ID;
개인 문자열 이름;
개인 문자열 비밀번호;
개인 날짜 생일;
...
}
(3) UserInfo 컴포넌트의 유형 변환기를 구성합니다. 먼저 UserInfo 컴포넌트의 클래스 이름을 기반으로 속성 파일을 생성합니다. 파일 이름 지정 형식은 클래스 이름-conversion.properties입니다.
예를 들어 UserInfo-conversion.properties
이 파일은 UserInfo 구성 요소와 동일한 패키지에 있어야 합니다.
이 기능 파일의 콘텐츠 형식은 다음과 같습니다.
생일=demo.converter.MyDateTypeConverter
설명하다:
birthday는 UserInfo 구성 요소에 있는 java.util.Date 유형의 속성 이름입니다.
deco.converter.MyDateTypeConverter는 사용자 정의 변환 구현 클래스입니다.
Strus2 프레임워크는 이를 고려하여 이를 처리하는 간단한 방법을 제공합니다.
전역 수준에서 유형 변환기를 구성하려면 다음 내용을 포함하여 /WEB-INF/classes 디렉터리에 있어야 하는 xwork-conversion.properties라는 속성 파일을 작성하면 됩니다.
java.util.Date=demo.converter.MyDateTypeConverter
6. 사용자 정의 유형 변환기
java.util.Date 유형의 속성은 2009-07-20 형식의 요청 매개변수 값을 수신할 수 있습니다. 그러나 20091221 형식의 요청 매개변수를 받아야 하는 경우 유형 변환기를 정의해야 합니다. 그렇지 않으면 struts2가 자동으로 유형 변환을 완료할 수 없습니다.
java.util.Date 가져오기;
공개 클래스 HelloWorldAction {
개인 날짜 생성 시간;
공개 날짜 getCreatetime() {
생성 시간을 반환합니다.
}
공공 무효 setCreatetime(날짜 생성 시간) {
this.createtime = 생성시간;
}
}
공개 클래스 DateConverter는 DefaultTypeConverter를 확장합니다.
@Override public Object ConvertValue(맵 컨텍스트, 객체 값, 클래스 toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
노력하다 {
if(toType == Date.class){//문자열을 Date 유형으로 변환하는 경우
String[] params = (String[]) 값;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//Date가 문자열로 변환되는 경우
날짜 날짜 = (날짜) 값;
return dateFormat.format(date);
}
} 잡기(ParseException e) {}
null을 반환;
}
}
위의 유형 변환기를 로컬 유형 변환기로 등록하십시오.
ActionClassName-conversion.properties 파일을 Action 클래스가 위치한 패키지 아래에 위치시킵니다. ActionClassName은 Action의 클래스 이름이며, 다음 -conversion.properties는 고정된 작성 방법입니다. 이 예에서는 파일 이름이 다음과 같아야 합니다. HelloWorldAction-conversion.properties. 속성 파일의 내용은 다음과 같습니다.
속성 이름 = 유형 변환기의 전체 클래스 이름 이 예에서 HelloWorldAction-conversion.properties 파일의 내용은 다음과 같습니다.
생성 시간= cn.csdn.conversion.DateConverter
위의 유형 변환기를 전역 유형 변환기로 등록하십시오.
WEB-INF/classes 아래에 xwork-conversion.properties 파일을 배치합니다. 속성 파일의 내용은 다음과 같습니다.
변환할 유형 = 유형 변환기의 완전한 클래스 이름 이 예에서 xwork-conversion.properties 파일의 내용은 다음과 같습니다.
java.util.Date= cn.csdn.conversion.DateConverter
java.util.Date 유형의 속성은 2009-07-20 형식의 요청 매개변수 값을 수신할 수 있습니다. 그러나 20091221 형식의 요청 매개변수를 받아야 하는 경우 유형 변환기를 정의해야 합니다. 그렇지 않으면 struts2가 자동으로 유형 변환을 완료할 수 없습니다.
java.util.Date 가져오기;
공개 클래스 HelloWorldAction {
개인 날짜 생성 시간;
공개 날짜 getCreatetime() {
생성 시간을 반환합니다.
}
공공 무효 setCreatetime(날짜 생성 시간) {
this.createtime = 생성시간;
}
}
공개 클래스 DateConverter는 DefaultTypeConverter를 확장합니다.
@Override public Object ConvertValue(맵 컨텍스트, 객체 값, 클래스 toType) {
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
노력하다 {
if(toType == Date.class){//문자열을 Date 유형으로 변환하는 경우
String[] params = (String[]) 값;// Request.getParameterValues()
return dateFormat.parse(params[0]);
}else if(toType == String.class){//Date가 문자열로 변환되는 경우
날짜 날짜 = (날짜) 값;
return dateFormat.format(date);
}
} 잡기(ParseException e) {}
null을 반환;
}
}
위의 유형 변환기를 로컬 유형 변환기로 등록하십시오.
ActionClassName-conversion.properties 파일을 Action 클래스가 위치한 패키지 아래에 위치시킵니다. ActionClassName은 Action의 클래스 이름이며, 다음 -conversion.properties는 고정된 작성 방법입니다. 이 예에서는 파일 이름이 다음과 같아야 합니다. HelloWorldAction-conversion.properties. 속성 파일의 내용은 다음과 같습니다.
속성 이름 = 유형 변환기의 전체 클래스 이름 이 예에서 HelloWorldAction-conversion.properties 파일의 내용은 다음과 같습니다.
생성 시간= cn.csdn.conversion.DateConverter
위의 유형 변환기를 전역 유형 변환기로 등록하십시오.
WEB-INF/classes 아래에 xwork-conversion.properties 파일을 배치합니다. 속성 파일의 내용은 다음과 같습니다.
변환할 유형 = 유형 변환기의 완전한 클래스 이름 이 예에서 xwork-conversion.properties 파일의 내용은 다음과 같습니다.
java.util.Date= cn.csdnconversion.DateConverter