집 >Java >Java인터뷰 질문들 >자바 고주파 기본 면접 질문——(6)
1. Struts에 대한 이해를 이야기해 보세요
(자세한 인터뷰 질문 추천: java 인터뷰 질문 및 답변)
1 Struts는 실제로 MVC 패턴에 따라 설계된 웹 레이어 프레임워크입니다. 서블릿이고 이 서블릿은 ActionServlet 또는 ActionServlet의 하위 클래스라고 합니다. 처리를 위해 web.xml 파일의 특정 특성을 충족하는 모든 요청을 이 서블릿에 넘길 수 있습니다. 그러면 이 서블릿은 구성 파일을 참조하여 처리를 위해 각 요청을 다른 작업에 할당할 수 있습니다.
(Struts는 여러 구성 파일을 가질 수 있으며 모듈에 따라 각 구성 파일을 구성할 수 있으므로 구성 파일의 과도한 확장을 방지할 수 있습니다)
2. ActionServlet은 처리를 위해 요청을 작업에 전달하기 전에 캡슐화합니다. 요청 매개변수를 formbean 객체(Java 클래스이며 이 클래스의 각 속성은 요청 매개변수에 해당함)로
3 ActionServlet이 formbean 객체를 작업의 실행 메소드에 전달하기 전에 다음을 호출할 수 있다는 점에 유의해야 합니다. 검증이 수행되고, 검증이 통과된 후에만 formbean 객체가 작업의 실행 메서드로 전달되며, 그렇지 않으면 입력 속성에 지정된 오류 페이지가 반환됩니다.
4. 작업이 실행된 후 표시된 결과 보기가 ActionForward 개체로 표시됩니다. actionForward 개체는 struts-config.xml 구성 파일의 구성을 통해 jsp 페이지에 연결됩니다. 왜냐하면 struts-config.xml 구성 파일에 있는 jsp 페이지에 대해 설정된 논리적 이름이 사용되기 때문입니다. 이는 반환된 jsp 페이지 이름에서 작업 프로그램 코드를 분리할 수 있습니다.
(위에서는 본인의 사용 경험을 바탕으로 자신의 의견을 이야기해도 됩니다.)
둘째, Hibernate에 대한 이해에 대해 이야기해 주세요.
1. 객체지향 소프트웨어의 내부 동작 과정은 다양한 새로운 객체를 지속적으로 생성하고, 객체 간의 관계를 구축하고, 객체 메소드를 호출하여 각 객체의 상태와 객체 소멸 과정을 변경하는 것으로 이해될 수 있습니다. 프로그램 실행 과정과 연산은 본질적으로 이전 순간과 다음 순간의 프로그램 실행 결과의 차이가 메모리 내 객체의 상태 변화에 반영됩니다.
2. 프로그램이 종료되고 메모리 공간이 부족할 때 프로그램의 실행 상태를 유지하려면 메모리에 있는 객체 상태를 영속 장치에 저장하고 영속 장치에서 객체 상태를 복원해야 합니다. 일반적으로 많은 양의 객체 정보를 저장하기 위해 관계형 데이터베이스에 저장됩니다. Java 프로그램의 실행 기능 관점에서 볼 때 객체 상태를 저장하는 기능은 시스템 작업의 다른 기능에 비해 매우 눈에 띄지 않는 보조 기능이어야 하며 Java는 이 기능을 구현하기 위해 jdbc를 사용하지만 이 눈에 띄지 않는 기능에는 작성이 필요합니다. 코드가 많고 그것이 수행하는 유일한 작업은 객체를 저장하고 객체를 복원하는 것뿐이며, 이러한 많은 양의 jdbc 코드에는 기술적인 내용이 없습니다. 기본적으로 일련의 일상적인 표준 코드 템플릿을 사용하여 작성됩니다. 반복적인 작업.
3. Java 프로그램이 실행될 때 생성된 개체 및 복구 개체를 데이터베이스를 통해 저장하면 실제로 JDBC를 캡슐화하여 Java 개체와 관계형 데이터베이스 레코드 간의 매핑 관계를 구현할 수 있습니다. 이 기능을 갖춘 캡슐화된 제품을 ORM 프레임워크라고 하며, Hibernate는 널리 사용되는 ORM 프레임워크 중 하나입니다. Hibernate 프레임워크를 사용하면 JDBC 코드를 작성할 필요가 없습니다. 단지 save 메소드를 호출하여 객체를 관계형 데이터베이스에 저장할 수 있습니다. get 메소드를 호출하기만 하면 데이터베이스에서 객체를 로드할 수 있습니다.
4. Hibernate를 사용하는 기본 프로세스는 구성 객체 구성, SessionFactory 생성, 세션 객체 생성, 트랜잭션 시작, CRUD 작업 완료, 트랜잭션 제출 및 세션 닫기입니다.
5. Hibernate를 사용하는 경우 먼저 데이터베이스 연결 정보 및 방언 등을 구성하는 hibernate.cfg.xml 파일을 구성해야 하며, 또한 각 엔터티에 대해 해당 hbm.xml 파일을 구성해야 합니다. xml 파일은 hbm.xml 파일별로 등록해야 합니다.
6. Hibernate를 적용할 때 Session, Cascading, Lazy Loading, HQL Query의 캐싱 원리를 이해하는 것이 중요합니다.
(위에서는 JDBC를 사용하면서 겪은 번거로운 경험을 바탕으로 hibernate 경험에 대해 이야기해 주실 수도 있습니다.)
셋째, Spring에 대한 이해에 대해 이야기해 주세요.
1. Spring은 팩토리 패턴을 구현하는 팩토리 클래스입니다(여기서 팩토리 패턴이 무엇인지 명확하게 설명할 필요가 있음). 이 클래스는 BeanFactory(실제로는 인터페이스)라고 합니다. 일반적으로 ApplicationContext. Spring은 대규모 팩토리 클래스와 동일합니다. 구성 파일에서 인스턴스 객체를 생성하는 데 사용되는 클래스 이름과 인스턴스 객체의 속성은
2. Spring은 IOC에 대한 좋은 지원을 제공합니다. IOC는 프로그래밍 아이디어이자 아키텍처 예술입니다. 이 아이디어는 DI(종속성 주입)라고도 합니다.
3. Spring은 AOP 기술의 좋은 캡슐화를 제공합니다. 이는 시스템에 관련되지 않은 클래스의 많은 메소드가 이러한 많은 메소드에 추가되어야 함을 의미합니다. 로그 추가, 권한 판단 추가, 예외 처리 추가 이 애플리케이션을 AOP라고 합니다.
Proxy 기술은 AOP 기능을 구현하는 데 사용됩니다. 클라이언트 프로그램은 더 이상 대상을 호출하지 않지만 프록시 클래스와 대상 클래스는 외부적으로 동일한 메서드 문을 갖습니다. 하나는 동일한 인터페이스를 구현하는 것이고, 두 번째는 대상의 하위 클래스입니다.
JDK에서 Proxy 클래스는 인터페이스에 대한 구현 클래스를 생성하기 위한 동적 프록시를 생성하는 데 사용됩니다. 특정 클래스에 대한 하위 클래스를 생성하려면 CGLI B를 사용할 수 있습니다. 생성된 프록시 클래스의 메소드에 시스템 함수와 해당 대상 클래스를 호출하는 메소드를 추가합니다. 시스템 함수의 프록시는 최소한 대상 클래스와 프록시 객체를 생성하기 위해 Advice 객체로 제공됩니다. 조언 수업이 필요합니다. Spring은 이 지원을 제공하며, 프록시 및 aop 기능을 구현하려면 spring 구성 파일에서 이 두 요소만 구성하면 됩니다.
(위에서는 본인의 사용 경험을 바탕으로 의견을 공유해도 됩니다.)
넷째, Struts의 장점과 단점에 대해 이야기해 보세요.
장점:
1. MVC 모델을 명확한 구조로 구현합니다. 개발자가 비즈니스 로직 구현에만 집중할 수 있습니다.
2. Struts 태그 라이브러리(Taglib)를 유연하게 사용하면 개발 효율성이 크게 향상됩니다.
3. 더 명확해졌습니다. 구성 파일을 통해 전체 시스템의 다양한 부분 간의 연결을 파악할 수 있으므로 향후 유지 관리에 큰 이점이 있습니다. 이러한 이점은 다른 개발자 그룹이 프로젝트를 맡을 때 더욱 분명해집니다.
4. 예외 처리 메커니즘 제공
6. I18N 지원
단점:
1. 표시 계층인 Struts는 10번 구성해야 하며 여기에는 구성이 수정될 때마다 전체 프로젝트를 재배포해야 하는 디렉토리 및 파일 변경이 포함되지 않습니다. tomcate와 같은 서버의 경우 서버를 다시 시작해야 합니다
2, Struts Action은 하나의 인스턴스만 모든 요청을 처리할 수 있도록 허용하는 스레드로부터 안전해야 합니다. 따라서 작업에 사용되는 모든 리소스는 균일하게 동기화되어야 하며 이로 인해 스레드 안전성 문제가 발생합니다.
3. 테스트가 불편합니다. Struts의 각 Action은 웹 레이어와 결합되므로 테스트가 웹 컨테이너에 의존하고 단위 테스트도 구현하기 어렵습니다. 그러나 단위 테스트를 구현할 수 있는 Junit 확장 도구 Struts TestCase가 있습니다.
4. 유형 변환 Struts의 FormBean은 모든 데이터를 문자열 유형으로 처리하며 유형 변환을 위해 Commons-Beanutils 도구를 사용할 수 있습니다. 그러나 해당 변환은 모두 클래스 수준에서 이루어지며 변환 유형은 구성할 수 없습니다. 유형 변환 중에 사용자에게 오류 메시지를 반환하는 것도 매우 어렵습니다.
5. Servlet에 대한 의존도가 너무 높습니다. Struts는 Action을 처리할 때 ServletRequest 및 ServletResponse에 의존해야 하므로 Servlet 컨테이너를 제거할 수 없습니다.
6. 프론트 엔드 표현 언어 측면에서 Struts는 JSTL을 통합하므로 주로 JSTL 표현 언어를 사용하여 데이터를 얻습니다. 그러나 JSTL의 표현 언어는 Collection 및 인덱스 속성을 처리하는 데 매우 약합니다.
7. Struts가 Action을 생성할 때 Action의 실행 순서를 제어하는 것은 매우 어렵습니다. 기능적 요구 사항을 실현하기 위해 서블릿을 다시 작성해야 할 수도 있습니다.
8. 액션 실행 전후 처리 Struts는 클래스 계층 구조를 기반으로 하기 때문에 액션 처리 전후의 작업이 어렵습니다.
9. Struts에서 양식은 실제로 Action 클래스(또는 DispatchAction)에 해당합니다. 즉, Struts에서 양식은 실제로 하나의 이벤트에만 해당합니다. 이벤트, 애플리케이션 이벤트는 컴포넌트 이벤트에 비해 조잡한 이벤트입니다
(동영상 튜토리얼 추천:
java 강좌) 5. iBatis와 Hibernate의 차이점은 무엇인가요?
동일 사항: JDBC API 보호 기본 액세스 세부 정보를 사용하면 jdbc API를 처리하지 않고도 데이터에 액세스할 수 있습니다.
jdbc api 프로그래밍 프로세스는 수정되었으며, sql 문과 java 코드도 혼합되어 있습니다. sql 문을 함께 연결해야 하는 경우가 많으며 세부 사항이 매우 번거롭습니다.
ibatis의 이점: jdbc api의 기본 액세스 세부 정보를 보호하고, java 코드에서 sql 문을 분리하며, queryForList는 개체 컬렉션을 반환하고 queryForObject는 단일 개체를 반환하는 결과 집합을 자동으로 캡슐화하는 기능을 제공합니다. 개체는 엔터티 개체의 속성을 SQL 문에 자동으로 전달하는 매개 변수를 제공합니다.
Hibernate는 자동으로 sql 문을 생성할 수 있는 도구입니다. Ibatis에서는 xml 구성 파일에 sql 문을 직접 작성해야 합니다. Hibernate는 ibatis보다 훨씬 더 책임감 있고 강력합니다. Hibernate는 자동으로 SQL 문장을 생성하기 때문에 우리가 문장을 제어할 수 없고, 구체적이고 효율적인 SQL을 작성할 수 없습니다. 덜 복잡한 일부 SQL 쿼리의 경우 hibernate가 이를 매우 잘 완료하는 데 도움이 될 수 있습니다. 그러나 특히 복잡한 쿼리의 경우 hibernate는 적응하기 어렵습니다. ibatis에서는 여전히 SQL을 작성해야 하기 때문입니다. 우리 자신을 진술합니다.
6. 최대 절전 모드에서 다중 테이블 쿼리를 수행하고 각 테이블에서 여러 필드를 선택합니다. 즉, 쿼리 결과 집합에 해당하는 엔터티 클래스가 없습니다. 이 문제를 해결하는 방법은 무엇입니까?
해결책 1: Object[] 데이터에 따라 데이터를 꺼내고 직접 Bean을 구성합니다.
해결책 2: 각 테이블의 Bean에 대한 생성자를 작성합니다. 예를 들어 두 필드를 찾으려는 경우입니다. 테이블 1의 field1과 field2에는 하나가 있습니다. 생성자는 Bean(type1filed1,type2 field2)이고 이 Bean은 hql에서 직접 생성될 수 있습니다.
7. Hibernate의 2단계 캐시를 소개합니다
다음 아이디어에 따라 답하세요.
(1) 먼저 캐시가 무엇인지 명확하게 설명하세요
(2) 그러면 Hibernate의 세션이 1단계입니다. 캐시, 즉 First-level 캐시가 있는데 왜 Second-level 캐시가 필요한가요? (3) 마지막으로 Hibernate의 Second-level 캐시를 구성하는 방법에 대해 이야기해 보겠습니다.
1. 캐시는 데이터베이스에서 쿼리하고 사용한 객체를 메모리(데이터 구조)에 저장하는 것입니다. 이 데이터 구조는 일반적으로 HashMap과 유사합니다. 첫 번째 쿼리입니다. 캐시에 이 개체가 있는지 여부, 있으면 캐시에 있는 개체를 사용하고, 없으면 데이터베이스에 쿼리하고 쿼리된 개체는 다음 번 사용을 위해 캐시에 저장합니다.
2. Hibernate의 Session은 일종의 캐시입니다. 우리는 일반적으로 이를 Hibernate의 1차 캐시라고 부릅니다. 세션을 사용하여 데이터베이스에서 객체를 쿼리하려는 경우에도 Session은 객체가 내부적으로 존재하는지 여부를 먼저 확인하고 직접 반환합니다. 존재하지 않는 경우에만 데이터베이스에 액세스하고 쿼리 결과를 내부적으로 저장하십시오.
Session은 세션 프로세스를 나타내고 Session은 데이터베이스 연결과 연관되어 있으므로 Session을 오랫동안 열어두지 않는 것이 가장 좋습니다. 일반적으로 하나의 트랜잭션에서만 사용되며 트랜잭션이 끝나면 닫혀야 합니다. 거래. 그리고 세션은 스레드에 안전하지 않으며 여러 스레드에서 공유할 때 문제가 발생하기 쉽습니다. 일반적으로 전역적 의미의 캐시만이 실제 캐시 애플리케이션이며 더 큰 캐시 값을 갖습니다. 따라서 Hibernate의 Session 레벨 캐시의 캐시 기능은 명확하지 않으며 애플리케이션 가치도 크지 않습니다. Hibernate의 두 번째 수준 캐시는 여러 스레드와 여러 트랜잭션이 이 캐시를 공유할 수 있도록 Hibernate를 위한 전역 캐시를 구성하는 것입니다. 우리가 바라는 것은 한 사람이 그것을 사용하면 다른 사람들도 그것을 사용할 수 있다는 것입니다.
3. 2단계 캐시는 Hibernate와 독립적인 소프트웨어 구성 요소이며 여러 제조업체 및 조직에서 EHCache 및 OSCache 등과 같은 캐시 제품을 제공합니다. Hibernate에서 2차 캐시를 사용하려면 먼저 hibernate.cfg.xml 구성 파일에서 사용할 제조업체의 캐시 제품을 구성해야 합니다. 그런 다음 캐시 제품 자체 구성 파일을 구성해야 합니다. Hibernate의 객체는 두 번째 수준 캐시 관리에 포함되어야 합니다. 2차 캐시의 원리를 이해하고 이러한 아이디어를 가지면 Hibernate의 2차 캐시를 구성하는 것은 쉽다.
확장된 지식: SessionFactory는 두 번째 수준 캐시와 연결될 수 있습니다. 즉, 두 번째 수준 캐시는 하나의 데이터베이스에서 데이터를 캐싱하는 역할만 담당할 수 있습니다. Hibernate의 두 번째 수준 캐시를 사용할 때 다른 캐시를 사용하지 않도록 주의하세요. 애플리케이션이나 SessionFactory는 데이터베이스의 현재 데이터를 변경하므로 캐시된 데이터는 데이터베이스의 실제 데이터와 일치하지 않게 됩니다.
8. JDO란 무엇인가요?
JDO는 Java Object Persistence의 새로운 사양이며, 특정 데이터 웨어하우스의 개체에 액세스하기 위한 표준화된 API이기도 합니다. JDO는 투명한 객체 저장소를 제공하므로 개발자는 데이터 객체를 저장하는 데 추가 코드(예: JDBC API 사용)가 필요하지 않습니다. 이러한 지루하고 일상적인 작업은 JDO 제품 제공업체로 이전되어 개발자가 비즈니스 로직에 시간과 에너지를 집중할 수 있게 되었습니다. 또한 JDO는 기본 데이터에서 실행될 수 있으므로 유연합니다.
비교: JDBC는 관계형 데이터베이스(RDBMS) 전용입니다. JDO는 더욱 다양하며 관계형 데이터베이스, 파일, XML 및 개체 데이터베이스(ODBMS) 등과 같은 모든 데이터에 대한 기본 저장 기능을 제공하여 애플리케이션의 이식성을 높입니다. .
9. Hibernate의 일대다 연결과 다대일 양방향 연결의 차이점은 무엇인가요? ?
일대다 연관 매핑과 다대일 연관 매핑 구현의 기본 원칙은 동일합니다. 즉, 한쪽 끝에 있는 외래 키를 가리키도록 다 끝에 외래 키를 추가하고, 가장 큰 차이점은 유지 관리 끝이 다르다는 것입니다.
그들 사이의 차이점은 유지하는 관계에 있습니다.
일대다 연관 매핑은 한쪽 끝에 데이터를 로드하는 것을 의미하고 다대일 연관 매핑은 여러 끝에 데이터를 로드하는 것을 의미합니다. 데이터의 한쪽 끝이 동시에 종료됩니다.
10. Hibernate는 어떻게 로딩을 지연합니까?
1. Hibernate2 지연 로딩 구현: a) 엔터티 객체 b) 컬렉션(Collection)
2. Hibernate는 데이터를 쿼리할 때 데이터를 수행합니다. not 메모리에 존재하지 않으며, 프로그램이 실제로 데이터를 연산할 때 객체는 메모리에만 존재하므로 지연 로딩을 실현하여 서버의 성능을 향상시킵니다.
추천 튜토리얼: Java 입문 튜토리얼
위 내용은 자바 고주파 기본 면접 질문——(6)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!