원본 게시자: 2008-06-17 15:26:20
lJBS
1. JAVA 언어의 장점 10가지를 나열해 보세요.
a: 무료, 오픈 소스, 크로스 플랫폼(플랫폼 독립성), 사용하기 쉬움, 완전한 기능, 객체 지향, 견고함, 다중 스레드, 구조 중립, 엔터프라이즈 애플리케이션을 위한 성숙한 플랫폼, 무선 애플리케이션
2. JAVA의 객체지향 프로그래밍 용어 10가지 나열
a: 패키지, 클래스, 인터페이스, 개체, 속성, 메서드, 생성자, 상속, 캡슐화, 다형성, 추상화, 패러다임
3. JAVA에서 일반적으로 사용되는 6가지 패키지 나열
Java.lang;java.util;java.io;java.sql;java.awt;java.net;java.applet;javax.swing
4. JAVA에서 식별자의 기능과 특징은 무엇입니까? 기능: 식별자는 변수, 클래스 및 메소드의 이름을 지정하는 데 사용됩니다. 특징: 문자로 시작하는 것 외에도 밑줄 "_" 및 "$" 문자가 뒤에 올 수 있습니다. 문자, 밑줄 "_" 및 "$" 문자 또는 숫자
Java는 대소문자를 구분하며 식별자도 예외는 아닙니다.
5.JAVA 키워드의 특징은 무엇인가요? 키워드를 20개 이상 나열해 보세요.
특정 의미를 부여하고 특별한 목적으로 사용되는 Java의 일부 단어를 키워드라고 합니다.
모든 Java 키워드는 소문자이며 TURE, FALSE, NULL 등은 Java 키워드가 아닙니다.
goto 및 const는 사용된 적이 없지만 Java 키워드로 예약되어 있습니다.
•에는 총 51개의 Java 키워드가 있습니다.
추상 주장 부울 중단 바이트 계속
케이스 캐치 char 클래스 const double
기본값은 else final float를 확장합니다.
가져오기를 구현하는 경우 오랫동안 이동하세요.
네이티브 새 null 인스턴스of int 인터페이스
패키지 개인 보호 공개 반환 짧은
static strictfp 슈퍼 스위치가 이것을 동기화했습니다.
void throw가 일시적인 시도를 발생시키는 동안
휘발성 물질
6.JAVA에서는 데이터 유형이 어떻게 분류되나요?
단순 데이터 유형과 참조 데이터 유형으로 나눌 수 있습니다.
단순 데이터 유형: 숫자 유형(byte, short, int, long, float double), 문자 유형(char), 부울 유형(boolean)
참조 데이터 유형: 클래스, 인터페이스, 배열.
7. JAVA의 연산자 분류 및 예
구분 기호:,,;,[],()
산술 연산자: +, ―, *, /, %, ++, ――
관계 연산자: >, <, >=, <=, ==, !=
부울 논리 연산자: !, &, |, ^, &&, ||
비트 연산자: &, |, ^, ~, >>, < <, >>>
• 할당 연산자: = 확장 할당 연산자: +=, ―=, *=, /=
문자열 연결 연산자: +
• 모양 연산자: ()
8.super 및 this 키워드의 기능 및 사용법
상위 클래스의 구성 요소를 참조하려면 Java 클래스에서 super를 사용하세요.
– 상위 클래스에 슈퍼 정의된 속성에 액세스하는 데 사용할 수 있습니다.
– 상위 클래스에 정의된 super 멤버 메소드를 호출하는 데 사용할 수 있습니다.
– 하위 클래스 생성자에서 슈퍼 클래스 생성자 super를 호출하는 데 사용할 수 있습니다.
– 추적성은 직접 상위 클래스 super에만 국한되지 않습니다.
변수의 명명 충돌과 불확실성 문제를 해결하기 위해 "this"라는 키워드를 도입하여 해당 변수가 위치한 메서드의 현재 개체를 나타냅니다. 자바
– 생성자는 생성자가 생성한 새 객체를 참조합니다.
– 메소드는 메소드를 호출하는 객체를 참조합니다.
• 키워드 사용법
– 클래스 자체의 메서드나 생성자에서 클래스의 인스턴스 변수와 메서드를 참조합니다.
– 현재 객체를 다른 메소드나 생성자에 매개변수로 전달합니다.
– 다른 오버로드된 생성자를 호출하는 데 사용됩니다.
9. JAVA의 표현이란 무엇입니까? 그것은 무엇을 합니까?
표현식은 연산자와 피연산자의 조합이며 모든 프로그래밍 언어의 핵심 구성 요소입니다.
표현식을 사용하면 프로그래머는 Java에서 수학적 계산, 값 비교, 논리적 연산 및 객체 조작을 수행할 수 있습니다.
표현의 몇 가지 예:
-엑스
– X+10
– Y=x+10
-도착[10]
– 학생.ge이름()
10. JAVA의 모든 수정자와 해당 적용 범위를 나열하는 테이블을 만듭니다(생성자, 속성, 자유 블록 등을 수정할 수 있음).
클래스 속성 메소드 빌더 프리 블록 내부 클래스
공개 YYY Y Y
보호됨 YY Y Y
(기본값) YYYYYY
비공개 YY Y Y
최종 YY Y Y
추상 Y Y Y
정적 Y YY
11. for 루프를 사용하여 곱셈표를 인쇄하는 방법을 작성하세요.
/**
* for 루프는 곱셈표를 인쇄합니다.
*/
공공공허 nineNineMultiTable()
{
for (int i = 1,j = 1; j <= 9; i++) {
System.out.print(i+"*"+j+"="+i*j+" ");
if(i==j)
{
나는=0;
j++;
System.out.println();
}
}
}
12. java.util.Date 객체를 "2007-3-22 20:23:22" 형식의 문자열로 변환하는 방법
/**
*날짜를 고정된 형식의 문자열로 변환
*@paramdate
*@returnstr
*/
공개 문자열 dateToStr(java.util.Date 날짜)
{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
문자열 str = sdf.format(date);
str을 반환;
}
13. 어떤 정수가 소수인지 판단할 수 있는 방법을 작성하세요.
/**
* 정수가 소수인지 확인
*@paramn
*@returnboolean
*/
publicboolean isPrimes(int n)
{
for (int i = 2; i <= Math.sqrt(n); i++) {
if(n%i==0)
{
거짓을 반환하다;
}
}
반환 참;
}
14. 정수를 입력하고 계승값을 반환하는 메서드를 작성하세요.
/**
*모든 정수의 계승값을 구합니다.
*@paramn
*@리턴 !
*/
publicint 계승(int n)
{
//재귀
만약(n==1)
{
1을 반환합니다.
}
n*factorial(n-1)을 반환합니다;
//비재귀적
// int 멀티 = 1;
// for (int i = 2; i <= n; i++) {
// 멀티*=i;
// }
// 멀티를 반환합니다;
}
15. 정수 배열에 정수가 있는지 확인하기 위해 이진 검색을 사용하는 메서드를 작성합니다. 존재하는 경우 배열의 인덱스 위치를 반환하고, 존재하지 않으면 -1을 반환합니다.
/**
*정수 배열에서 특정 정수 위치에 대한 이진 검색(재귀)
*@paramdataset
*@paramdata
*@parambeginIndex
*@paramendIndex
*@returnindex
*/
publicint BinarySearch(int[] 데이터 세트, int 데이터, int startIndex, int endIndex)
{
int midIndex = (beginIndex+endIndex)/2;
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex)return -1;
if(데이터 <데이터세트[midIndex])
{
return BinarySearch(dataset,data,beginIndex,midIndex-1);
}elseif(데이터>데이터세트[midIndex])
{
return BinarySearch(dataset,data,midIndex+1,endIndex);
}또 다른
{
midIndex를 반환합니다.
}
}
/**
*정수 배열에서 특정 정수 위치에 대한 이진 검색(비재귀)
*@paramdataset
*@paramdata
*@returnindex
*/
publicint BinarySearch(int[] 데이터세트,int 데이터)
{
int startIndex = 0;
int endIndex = 데이터세트.길이 - 1;
int midIndex = -1;
if(data <dataset[beginIndex]||data>dataset[endIndex]||beginIndex>endIndex)return -1;
while(beginIndex <= endIndex) {
midIndex = (beginIndex+endIndex)/2;
if(data <dataset[midIndex]) {
endIndex = midIndex-1;
} elseif(데이터>데이터세트[midIndex]) {
BeginIndex = midIndex+1;
}또 다른
{
midIndex를 반환합니다.
}
}
-1을 반환합니다.
}
16. 사육자가 동물에게 먹이를 주는 예는 JAVA의 객체지향적 사고와 인터페이스(추상 클래스)의 유용성을 반영합니다.
패키지 com.softeem.demo;
/**
*@authorleno
*동물 인터페이스
*/
인터페이스 동물
{
publicvoid eat(음식 음식);
}
/**
*@authorleno
*동물의 종류:고양이
*/
Cat 클래스는 동물을 구현합니다.
{
publicvoid eat(음식 음식)
{
System.out.println("고양이가 먹는다"+food.getName());
}
}
/**
*@authorleno
*동물의 종류:개
*/
클래스 Dog는 동물을 구현합니다.
{
publicvoid eat(음식 음식)
{
System.out.println("강아지 씹기"+food.getName());
}
}
/**
*@authorleno
*음식 추상 수업
*/
abstractclass음식
{
보호된 문자열 이름;
공개 문자열 getName() {
반환 이름;
}
publicvoid setName(문자열 이름) {
this.name = 이름;
}
}
/**
*@authorleno
*식품군: 생선
*/
클래스 물고기는 음식을 확장합니다
{
public Fish(문자열 이름) {
this.name = 이름;
}
}
/**
*@authorleno
*식품군:뼈
*/
클래스 뼈 확장 식품
{
public Bone(문자열 이름) {
this.name = 이름;
}
}
/**
*@authorleno
*사육자 카테고리
*
*/
클래스피더
{
/**
*사육가는 특정 종류의 동물에게 특정 종류의 먹이를 먹입니다.
*@paramanimal
*@paramfood
*/
공공무효사료(동물,식품)
{
동물.먹다(음식);
}
}
/**
*@authorleno
*동물에게 먹이를 주는 시험 사육자
*/
publicclass TestFeeder {
publicstaticvoid main(String[] args) {
피더 피더=새 피더();
동물 동물=새 개();
음식 food=new Bone("고기뼈");
Feeder.feed(animal,food); //개에게 고기뼈를 먹입니다.
동물=새 고양이();
food=new Fish("물고기");
Feeder.feed(animal,food); //고양이에게 생선 먹이기
}
}
18. 단일 모드 클래스를 만들고 속성 파일을 한 번만 로드하십시오.
패키지 com.softeem.demo;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
java.util.Properties 가져오기;
/**
*@authorleno
*단일 모드, 구성 속성 파일이 전체 애플리케이션 중에 한 번만 로드되도록 보장
*/
publicclass 싱글톤 {
privatestatic 싱글톤 인스턴스;
privatestaticfinal String CONFIG_FILE_PATH = "E:\config.properties";
개인 속성 구성;
개인 싱글턴()
{
구성 = 새로운 속성();
입력스트림은;
노력하다 {
is = new FileInputStream(CONFIG_FILE_PATH);
config.load(is);
is.close();
} 잡기(FileNotFoundException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
publicstatic 싱글톤 getInstance()
{
if(인스턴스==null)
{
인스턴스 = 새로운 싱글턴();
}
반환 인스턴스;
}
공개 속성 getConfig() {
반환 구성;
}
publicvoid setConfig(속성 구성) {
this.config = 구성;
}
}
l J2SE
19. 지정된 경로에 디렉터리(파일)를 복사합니다.
/**
*디렉토리나 파일을 지정된 경로에 복사합니다.
*@paramsource
*@paramtarget
*/
publicvoid 복사(파일 소스, 파일 대상)
{
파일 tarpath = new File(target,source.getName());
if(source.isDirectory())
{
tarpath.mkdir();
파일[] dir = source.listFiles();
for (int i = 0; i < dir.length; i++) {
copy(dir[i],tarpath);
}
}또 다른
{
노력하다 {
InputStream은 = new FileInputStream(source);
OutputStream os = new FileOutputStream(tarpath);
바이트[] buf = newbyte[1024];
int len = 0;
while((len = is.read(buf))!=-1)
{
os.write(buf,0,len);
}
is.close();
os.close();
} 잡기(FileNotFoundException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
}
20. JAVA에서 멀티스레딩을 이용한 은행 출금 문제 예시
packagecom.softeem.demo;
/**
*@authorleno
*계좌 유형
*기본적으로 잔고가 존재하며 출금이 가능합니다.
*/
수업 계정 {
privatefloatbalance = 1000;
publicfloat getBalance() {
수익률;
}
publicvoid setBalance(부동 잔액) {
this.balance = 균형;
}
/**
*출금 방법을 동기화해야 합니다.
*@parammoney
*/
공개동기화출금 무효(플로트머니)
{
if(잔고>=돈)
{
System.out.println("Taken"+money+"위안!");
노력하다 {
Thread.sleep(1000);
} 잡기(InterruptedException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
잔액-=돈;
}
또 다른
{
System.out.println("죄송합니다. 잔액이 부족합니다.");
}
}
}
/**
*@authorleno
*은행카드
*/
TestAccount1 클래스는 Thread {를 확장합니다.
개인 계정 계정;
공개 TestAccount1(계정 계정) {
this.account = 계정;
}
@보수
공공 무효 실행() {
account.withdrawals(800);
System.out.println("잔고는:"+account.getBalance()+"위안!");
}
}
/**
*@authorleno
*은행 통장
*/
TestAccount2 클래스는 Thread {를 확장합니다.
개인 계정 계정;
공개 TestAccount2(계정 계정) {
this.account = 계정;
}
@보수
공공 무효 실행() {
account.withdrawals(700);
System.out.println("잔고는:"+account.getBalance()+"위안!");
}
}
공개 클래스 테스트
{
publicstaticvoid main(String[] args) {
계정 계정 = 새 계정();
TestAccount1 testAccount1 = new TestAccount1(계정);
testAccount1.start();
TestAccount2 testAccount2 = new TestAccount2(계정);
testAccount2.start();
}
}
21. JAVA의 멀티스레딩을 사용하여 기차역 티켓 판매 문제 예시
패키지 com.softeem.demo;
/**
*@authorleno
*티켓판매
*/
SaleTicket 클래스는 Runnable을 구현합니다.
티켓 = 100;
공공 무효 실행() {
동안(티켓 > 0) {
판매();
//또는 이렇게 구현하세요.
// 동기화됨 (this) {
// if (티켓 > 0) {
// System.out.println(Thread.currentThread().getName() + "첫 번째 판매"
// + (100 - 티켓 + 1) + "티켓");
// 티켓--;
// }
// }
}
}
publicsynchronizedvoid sale() {
if (티켓 > 0) {
System.out.println(Thread.currentThread().getName() + "먼저 판매"
+ (100 - 티켓 + 1) + "티켓");
티켓--;
}
}
}
publicclass TestSaleTicket {
publicstaticvoid main(String[] args) {
SaleTicket st = new SaleTicket();
new Thread(st, "1번 창").start();
new Thread(st, "2번 창").start();
new Thread(st, "3번 창").start();
new Thread(st, "4번 창").start();
}
}
22. JAVA에서 멀티스레딩을 사용하는 생산자 및 소비자 문제의 예
패키지 com.softeem.demo;
클래스 생산자는 Runnable을 구현합니다.
{
개인 SyncStack 스택;
공개 생산자(SyncStack 스택) {
this.stack = 스택;
}
공공 무효 실행() {
for (int i = 0; i < stack.getProducts().length; i++) {
문자열 제품 = "제품"+i;
stack.push(제품);
System.out.println("생산: "+제품);
노력하다
{
Thread.sleep(200);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
클래스 소비자는 Runnable을 구현합니다.
{
개인 SyncStack 스택;
공개 소비자(SyncStack 스택) {
this.stack = 스택;
}
공공 무효 실행() {
for(int i=0;i <stack.getProducts().length;i++)
{
문자열 곱 =stack.pop();
System.out.println("소비: "+제품);
노력하다
{
Thread.sleep(1000);
}
catch(InterruptedException e)
{
e.printStackTrace();
}
}
}
}
클래스 SyncStack
{
개인 문자열[] 제품 = 새 문자열[10];
개인 인덱스;
publicsynchronizedvoid push(문자열 제품)
{
if(색인==제품.길이())
{
노력하다 {
기다리다();
} 잡기(InterruptedException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
통지();
제품[색인]=제품;
인덱스++;
}
공개동기화된 문자열 팝()
{
if(색인==0)
{
노력하다 {
기다리다();
} 잡기(InterruptedException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
통지();
색인--;
문자열 제품 = 제품[색인];
제품 반품;
}
공개 문자열[] getProducts() {
반품 제품;
}
}
publicclass TestProducerConsumer {
publicstaticvoid main(String[] args) {
SyncStack 스택=새 SyncStack();
생산자 p=새로운 생산자(스택);
소비자 c=새 소비자(스택);
새로운 Thread(p).start();
새로운 Thread(c).start();
}
}
23. 네트워크에서 직렬화된 학생(sno, sname) 객체의 전송을 실현하기 위한 프로그래밍
패키지 com.softeem.demo;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serialized;
java.net.ServerSocket 가져오기;
java.net.Socket 가져오기;
클래스 학생이 직렬화 가능 {을 구현합니다.
개인 int sno;
개인 문자열 이름;
public Student(int sno, 문자열 sname) {
this.sno = 스노;
this.sname = 스이름;
}
공개 int getSno() {
스노를 반환;
}
공공 무효 setSno(int sno) {
this.sno = 스노;
}
공개 문자열 getSname() {
sname을 반환;
}
공공 무효 setSname(문자열 sname) {
this.sname = 스이름;
}
@보수
공개 문자열 toString() {
return "학생 번호:" + sno + ";이름:" + sname;
}
}
MyClient 클래스는 Thread {를 확장합니다.
@보수
공개 무효 실행() {
노력하다 {
소켓 s = new Socket("localhost", 9999);
ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
학생 stu = (학생) ois.readObject();
System.out.println("클라이언트 프로그램은 서버 프로그램에서 전송된 학생 객체를 받습니다 >> " + stu);
ois.close();
s.닫기();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
} 잡기(ClassNotFoundException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
}
MyServer 클래스는 Thread {를 확장합니다.
@보수
공개 무효 실행() {
노력하다 {
ServerSocket ss = 새 ServerSocket(9999);
소켓 s = ss.accept();
ObjectOutputStream ops = new ObjectOutputStream(s.getOutputStream());
학생 stu = 새로운 학생(1, "Zhao Benshan");
ops.writeObject(stu);
ops.close();
s.닫기();
ss.close();
} 잡기(IOException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
}
}
공개 클래스 TestTransfer {
공개 정적 무효 메인(String[] args) {
새로운 MyServer().start();
새로운 MyClient().start();
}
}
l JDBC
24. dom4j 구성 요소를 사용하여 다음 XML 형식 파일을 구문 분석합니다.
<?xml version="1.0" 인코딩="UTF-8"?>
<제너레이터>
<테이블 이름="로그인" 작업="1">
<column name="username" handler="0">아아아</column>
<column name="password" handler="0">123</column>
</table>
<테이블 이름="로그인" 작업="2">
<column name="id" handler="1">1 </column>
<column name="username" handler="0">bbb</column>
<column name="password" handler="0">444 </column>
</table>
<테이블 이름="로그인" 작업="3">
<column name="id" handler="1">4 </column>
</table>
</generator>
규칙: <table>작업 1 테이블 삽입, 테이블 2 업데이트, 테이블 3 삭제.
<column>핸들 1 테이블은 where 조건으로 사용되고, 0 테이블은 연산 필드로 사용됩니다.
요구 사항: 규칙에 따라 세 개의 SQL 문을 생성하십시오! (즉, xml 파일을 구문 분석하여 세 개의 SQL 문이 포함된 문자열을 생성하는 메서드를 만듭니다.)
/**
*XML 파일을 구문 분석하여 실행 가능한 SQL 문이 포함된 문자열을 생성합니다.
*@paramxml파일 이름
*@returnSQL
*/
공개 문자열 구문 분석XmltoSQL(문자열 xmlFileName) {
StringBuffer sbsql = new StringBuffer();
SAXReader 리더 = 새로운 SAXReader();
노력하다 {
문서 document = reader.read(new File(xmlFileName));
요소 요소 = document.getRootElement();
반복자 it = element.elementIterator("table");
동안(it.hasNext()) {
element = (요소) it.next();
//테이블에 대한 작업 가져오기
String oper = element.attributeValue("작업");
//테이블명 알아내기
String tableName = element.attributeValue("이름");
if ("1".equals(oper)) {
sbsql.append("insert into ").append(tableName);
Iterator it2 = element.elementIterator("column");
문자열 컬럼명1 = null;
문자열 컬럼값1 = null;
문자열 컬럼명2 = null;
문자열 컬럼값2 = null;
if (it2.hasNext()) {
요소 = (요소) it2.next();
columnName1 = element.attributeValue("이름");
columnValue1 = element.getText();
}
if (it2.hasNext()) {
요소 = (요소) it2.next();
columnName2 = element.attributeValue("이름");
columnValue2 = element.getText();
}
sbsql.append("("+columnName1+","+columnName2+")"+" value('"+columnValue1+"','"+columnValue2+"')n");
} elseif ("2".equals(oper)) {
sbsql.append("업데이트 ").append(tableName);
Iterator it2 = element.elementIterator("column");
문자열 컬럼명1 = null;
문자열 컬럼값1 = null;
문자열 컬럼명2 = null;
문자열 컬럼값2 = null;
문자열 컬럼명3 = null;
문자열 컬럼값3 = null;
if (it2.hasNext()) {
요소 = (요소) it2.next();
columnName1 = element.attributeValue("이름");
컬럼값1 = element.getText();
}
if (it2.hasNext()) {
요소 = (요소) it2.next();
columnName2 = element.attributeValue("이름");
columnValue2 = element.getText();
}
if (it2.hasNext()) {
요소 = (요소) it2.next();
columnName3 = element.attributeValue("이름");
컬럼값3 = element.getText();
}
sbsql.append(" set "+columnName2+"='"+columnValue2+"',"+columnName3+"='"+columnValue3+"' where "+columnName1+"="+columnValue1+"n");
}elseif ("3".equals(oper)) {
sbsql.append("삭제 ").append(tableName);
Iterator it2 = element.elementIterator("column");
문자열 컬럼명1 = null;
문자열 컬럼값1 = null;
if (it2.hasNext()) {
요소 = (요소) it2.next();
columnName1 = element.attributeValue("이름");
columnValue1 = element.getText();
}
sbsql.append(" where "+columnName1+"="+columnValue1);
}
}
} 잡기(DocumentException e) {
// TODO 자동 생성된 캐치 블록
e.printStackTrace();
}
sbsql.toString()을 반환합니다.
}
lJSP/서블릿
25. JSP의 내장 객체를 작성하고 해당 기능을 설명합니다.
request:request는 HttpServletRequest 객체를 나타냅니다. 여기에는 브라우저 요청에 대한 정보가 포함되어 있으며 쿠키 및 헤더 데이터를 얻는 데 유용한 여러 가지 방법을 제공합니다. response:response는 HttpServletResponse 객체를 나타내며 브라우저로 다시 전송되는 응답(예: 쿠키, 헤더 정보 등)을 설정하기 위한 여러 메소드를 제공합니다. out:out 객체는 javax.jsp.JspWriter의 인스턴스이며 사용자가 수행할 수 있는 여러 메소드를 제공합니다. 출력을 브라우저로 다시 보내는 데 사용할 수 있습니다. pageContext: pageContext는 javax.servlet.jsp.PageContext 객체를 나타냅니다. 다양한 범위의 네임스페이스 및 서블릿 관련 객체에 대한 접근을 용이하게 하는 데 사용되는 API이며, 일반적인 서블릿 관련 기능의 메소드를 래핑합니다. session:session은 요청된 javax.servlet.http.HttpSession 객체를 나타냅니다. 세션은 사용자 상태 정보를 저장할 수 있습니다. application:applicaton은 javax.servle.ServletContext 객체를 나타냅니다. 이는 서블릿 엔진 및 서블릿 환경에 대한 정보를 찾는 데 도움이 됩니다. config:config는 javax.servlet.ServletConfig 객체를 나타냅니다. 이 객체는 서블릿 인스턴스의 초기화 매개변수에 액세스하는 데 사용됩니다. page:page는 이 페이지에서 생성된 서블릿 인스턴스를 나타냅니다.
예외: 예외 개체는 페이지 실행 중에 예외가 발생하면 이 개체가 생성됩니다. JSP 페이지가 이 객체를 사용하려면 isErrorPage를 true로 설정해야 합니다. 그렇지 않으면 컴파일할 수 없습니다. 실제로는 java.lang.Throwable의 대응물입니다.