첫 번째 기사 "자카르타 Struts 소개"에서는 Struts 프레임워크를 대략적으로 분석하고, 이것이 완성할 수 있는 기능에 대해 논의했으며, Struts를 구성하는 다양한 구성 요소에 대해서도 살펴보았습니다. 두 번째 기사 "Learning Jakarta Struts"에서는 Struts를 사용하여 간단한 애플리케이션을 구축하는 방법의 프로세스 단계를 자세히 설명하기 시작했습니다. 이 기사에서는 Struts 태그를 통해 jsp 페이지의 applicationResource 파일에 텍스트 정보를 표시하는 방법을 설명합니다.
Action 클래스는 Struts 아키텍처와 애플리케이션의 비즈니스 로직 코드를 연결하는 다리입니다. 따라서 실제 애플리케이션에서의 로직 처리는 별도의 로직 레이어에 의해 완료되어야 하기 때문에 Action 클래스를 최대한 작고 단순하게 만들어야 합니다. n 계층 애플리케이션을 개발하는 경우 계층 간의 인터페이스가 최대한 단순해지기를 원할 것입니다. 실제로 Action 클래스(1.1의 excute())의 기본 메소드인 "perform()"은 이 메소드에서 어떤 작업이 수행되어야 함을 암시합니다. 우리는 각 Action 클래스가 org.apache.struts.action.Action에서 계속되어야 한다는 것을 알고 있습니다. 소규모 애플리케이션에서는 우리의 Action 클래스가 org.apache.struts.action.Action을 계속하기에 충분할 것입니다. 일부 특정 복잡한 애플리케이션에서는 우리가 구현한 몇 가지 공통 기능을 요약했습니다. 그러므로 내 생각에는 이러한 공통 기능의 코드를 구현하기 위한 기본 클래스를 구성하여 애플리케이션에 사용되는 모든 Action 클래스가 org.apache.struts.action.Action을 직접 이어가지 않고 일부 공통 기능을 완성하기 위해 이를 계속하도록 하는 것이 좋습니다. 코드 재사용을 위한 기본 클래스는 꽤 좋은 디자인입니다. 이 메소드를 StrutsSample에 적용하고 이러한 기본 클래스를 구성했습니다. 이 기본 클래스의 메소드는 복잡한 논리를 완성하고 단순히 요청을 전달하는 Action 클래스에서 사용할 수 있습니다.
package com.oreilly.actions;
import java.io.IOException;
import java.util.PRoperties;
import java.util.ResourceBundle;
import java.util.MissingResourceException;
import java.util.Enumeration;
import java.util.Properties;
import java.rmi.RemoteException;
import javax.ejb.EJBHome;
import javax.ejb.CreateException;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionServlet;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
이 클래스가 사용됩니다. Struts를 개발할 때 모든 Action 클래스는 기본 클래스를 상속해야 합니다. 실제 응용 분야에서 가장 많이 사용될 수 있는 몇 가지 사항을 고려합니다. 이 기사에 관한 한, Struts와 밀접하게 관련되지 않은 클래스의 일부 메소드는 주석만 달고 완전히 구현되지 않을 것입니다. 개발 작업에 참여하고 있다면 관심이 있다면 이 메소드를 완료하고 이 클래스를 적용하십시오. . 실제 프로젝트에서 개발 속도가 빨라집니다. 모든 Action 클래스는 org.apache.struts.action.Action에서 상속되기 때문에 우리 클래스는 동일합니다.
공용 추상 클래스 AbstStrutsActionBase는 Action {
을 확장합니다. / * struts-config.xml에 기록된 일부
정의 * 전역 애플리케이션에서 사용할 수 있는 전달 플래그 */
protected static final String SUCCESS = "success ";
protected static final String FAILURE = "실패";
protected static final String ERROR = "error";
protected static final String LOGIN = "login";
protected static final String CONFIRM = "confirm";
protected Context jndiContext = null;
/**
* 기본 구축 방식
*/
🎜> /**
EJB 인스턴스를 찾는 다음 방법은 완전히 구현되지 않습니다.
일반적으로 Action 클래스는 애플리케이션의 비즈니스 로직을 구현하는 EJB 세션 Bean(또는 일반 JavaBean)을 호출해야 합니다. 대규모 프로젝트에서 개발자는 레이어 사이에 명확한 경계를 그려야 합니다. Action 클래스에서는 JNDI 정보가 포함된 환경의 인스턴스를 가져온 다음 EJB의 JNDI 이름을 통해 해당 홈 인터페이스를 쿼리하고 가져와야 합니다. 프로세스가 간단하지 않으므로 아래 코드 조각은 필요한 구현을 제공하는 작은 예일 뿐입니다.
litz 매개변수 유형 String, JNDI 쿼리에 전달되는 이름
litz 반환 유형 Object, 즉 발견된 홈 인터페이스
ze 검색에 실패하면 NamingException 예외가 발생합니다.
litz 리소스 정보 획득 실패, MissingResourceException 발생
*/
공용 개체 조회( 문자열 jndiName)
은 NamingException, MissingResourceException {
을 발생시킵니다. // 为调사용EJB对象,통상JNDI信息적 속성对象
// 来获得初始环境信息
if (jndiContext = = null) {
ResourceBundle 리소스 =
ResourceBundle.getBundle(" strutssample.properties");
속성 속성 = new Properties();
properties.setProperty(
Context.INITIAL_CONTEXT_FACTORY,
resource.getString(Context.INITIAL_CONTEXT_FACTORY));
properties.setProperty (
context.provider_url, resource.getString (context.provider_url)); properties.setProperty (
context.security_principal, resource.getString (context.security_principal)); > properties.setProperty(
Context.SECURITY_CREDENTIALS,
resource.getString(Context.SECURITY_CREDENTIALS));
jn diContext = new InitialContext(properties);
}
注중:현재진행的产product中,我们应该는 此处考虑代码的健壮性,将代码加入到try/catch块内,并记录所有错误或重要信息到系统例中。中,我们仅仅把异常往外抛,并假定一会找到EJB对象的home接口并返回。
return (jndiContext.lookup(jndiName));
}
由于Action은 Struts에서 사용됩니다.它的主要方法应该是一个抽象方法, 而由每个继续的子类来具体实现, 或者 는 其中做一些所有Action려 会做 的 聚 机 , 例如记录log信息。在本例中,我们一切从简,将其抽象の。
lc 参数mapping:其类型为ActionMapping,将在本Action做跳转选择用
ℓ 参数actionForm:由Struts根据本次HTTP请求数据填充完成的ActionForm对象(可选,假如存在请求数据的话)
lc 参数request:此Action所有处理的本次HTTP请求(对象)
ℓ 参数response:此Action输流数据所要用到的HTTP响应(对象)
tz 假如有I/O错误 출력, 则本方법抛takeIOException异常
ℓ 假如处理时发生servlet异常,则本方법抛takeServletException异常
ℓ 本方法处理完请求后按光处理逻辑返回按应的页face导向(对象)
공개 추상 ActionForward 수행(
ActionMapping 매핑,
ActionForm 양식,
HttpServletRequest 요청,
HttpServletResponse 응답)
throws IOException, ServletException;
}
或者让这个抽象方法更有用一点,那就吧,比如image下面这样在其中记录log。
{
ActionForward 앞으로 = null;
// 只是简单的记录一些提示信息到서블릿 로그
getServlet().log(
"AbstStrutsActionBase.perform() [Action Class : "
+ this.getClass().getName( )
+ " ]");
getServlet().log(
"AbstStrutsActionBase.perform() [양식 클래스 : "
+ (양식 == null ? "null" : form.getClass().getName())
+ " ]");
}
然后,我们再编写的每个Action类tour应该从AbstStrutsActionBase继续,并依处理逻辑编写各자체 수행 방법입니다.
import java.io.IOException;
import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet. http.HttpServletResponse;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import com.oreilly.forms.LoginForm;
/*
LoginAction 将演示一个Action将如何被Struts架构所调사용
在这个例子中 ,我们只是简单的演示perform method是如何调用、执行并返回的
*/
공개 클래스 LoginAction은 AbstStrutsActionBase를 확장합니다 {
다음은 사용자를 확인하는 방법입니다. 이 예에는 특별한 구현이 없습니다. 그러나 일반적인 애플리케이션 솔루션은 JavaBean 또는 EJB를 호출하여 완료하는 것입니다. EJB(기본 클래스에서 완성됨)를 찾는 데 사용되는 조회 메소드는 백엔드 데이터베이스에 대해 사용자를 인증하기 위한 인터페이스를 반환하는 이 메소드에서 호출되어야 합니다.
oz 매개변수 유형 문자열, 검증할 사용자 이름
위 내용은 Jakarta Struts 1.1(3) 학습 내용이며, 더 많은 관련 글은 PHP 중국어 홈페이지( www.php.cn) !

javaispopularforcross-platformdesktopapplicationsduetoits "writeonce, runanywhere"철학

Java에서 플랫폼 별 코드를 작성하는 이유에는 특정 운영 체제 기능에 대한 액세스, 특정 하드웨어와 상호 작용하고 성능 최적화가 포함됩니다. 1) JNA 또는 JNI를 사용하여 Windows 레지스트리에 액세스하십시오. 2) JNI를 통한 Linux 특이 적 하드웨어 드라이버와 상호 작용; 3) 금속을 사용하여 JNI를 통해 MacOS의 게임 성능을 최적화하십시오. 그럼에도 불구하고 플랫폼 별 코드를 작성하면 코드의 이식성에 영향을 미치고 복잡성을 높이며 잠재적으로 성능 오버 헤드 및 보안 위험을 초래할 수 있습니다.

Java는 Cloud-Native Applications, Multi-Platform 배포 및 교차 운용성을 통해 플랫폼 독립성을 더욱 향상시킬 것입니다. 1) Cloud Native Applications는 Graalvm 및 Quarkus를 사용하여 시작 속도를 높입니다. 2) Java는 임베디드 장치, 모바일 장치 및 양자 컴퓨터로 확장됩니다. 3) Graalvm을 통해 Java는 Python 및 JavaScript와 같은 언어와 완벽하게 통합되어 언어 교차 수용 가능성을 향상시킵니다.

Java의 강력한 유형 시스템은 유형 안전, 통합 유형 변환 및 다형성을 통해 플랫폼 독립성을 보장합니다. 1) 유형 안전성 런타임 오류를 피하기 위해 컴파일 시간에 유형 검사를 수행합니다. 2) 통합 유형 변환 규칙은 모든 플랫폼에서 일관성이 있습니다. 3) 다형성 및 인터페이스 메커니즘은 코드가 다른 플랫폼에서 일관되게 행동하게 만듭니다.

JNI는 Java의 플랫폼 독립성을 파괴 할 것입니다. 1) JNI는 특정 플랫폼에 대한 로컬 라이브러리를 요구합니다. 2) 대상 플랫폼에서 로컬 코드를 컴파일하고 연결해야합니다. 3) 운영 체제 또는 JVM의 다른 버전은 다른 로컬 라이브러리 버전을 필요로 할 수 있습니다.

신흥 기술은 위협을 일으키고 Java의 플랫폼 독립성을 향상시킵니다. 1) Docker와 같은 클라우드 컴퓨팅 및 컨테이너화 기술은 Java의 플랫폼 독립성을 향상 시키지만 다양한 클라우드 환경에 적응하도록 최적화되어야합니다. 2) WebAssembly는 Graalvm을 통해 Java 코드를 컴파일하여 플랫폼 독립성을 확장하지만 성능을 위해 다른 언어와 경쟁해야합니다.

다른 JVM 구현은 플랫폼 독립성을 제공 할 수 있지만 성능은 약간 다릅니다. 1. OracleHotspot 및 OpenJDKJVM 플랫폼 독립성에서 유사하게 수행되지만 OpenJDK에는 추가 구성이 필요할 수 있습니다. 2. IBMJ9JVM은 특정 운영 체제에서 최적화를 수행합니다. 3. Graalvm은 여러 언어를 지원하며 추가 구성이 필요합니다. 4. AzulzingJVM에는 특정 플랫폼 조정이 필요합니다.

플랫폼 독립성은 여러 운영 체제에서 동일한 코드 세트를 실행하여 개발 비용을 줄이고 개발 시간을 단축시킵니다. 구체적으로, 그것은 다음과 같이 나타납니다. 1. 개발 시간을 줄이면 하나의 코드 세트 만 필요합니다. 2. 유지 보수 비용을 줄이고 테스트 프로세스를 통합합니다. 3. 배포 프로세스를 단순화하기위한 빠른 반복 및 팀 협업.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.
