Jdk和jre的区别是什么?它们各自有什么作用?
Jdk是Java开发工具,它不仅提供了Java程序运行所需的jre,还提供了一系列的编译,运行等工具,如javac,java,javaw等。Jre只是Java程序的运行环境,它最核心的内容就是jvm及核心类库。
如何使用jdk编译和运行应用程序?
在系统环境变量中新建环境变量,变量名为JAVA_HOME,变量值为jdk位置
在系统环境变量中的Path路径后添加%JAVA_HOME%\bin
Javac是用来把源码编译成class文件的,而java是用来运行包含主方法的class文件的
Java与c++程序在编译和运行上有什么区别?
C++源码编译之后,生成的是特定机器码可以直接运行的文件,而Java源码经过编译之后,生成的是中间的字节码文件。这些字节码文件是需要放在jvm中运行的,而jvm是有多个平台版本的,因此,Java具有跨平台性,而c++没有。
什么是jvm及其工作原理?
Jvm是一种跨平台模拟出来的计算机,它用于执行Java程序,有一套非常严格的技术规范,是Java跨平台特性的依赖基础。Java虚拟机有自己想象中的硬件,如处理器、堆栈、寄存器等。还具有相应的指令系统,它运行Java程序就好像一台计算机运行c或c++程序一样。
Jvm的垃圾回收机制及内存中存储对象的原理?
Jvm会把程序创建的对象存放在堆空间中。堆是一个运行时的数据存储区,它可以分配大小各异的空间。一般,运行时的数据存储区有堆和堆栈。栈中存放的是非static的自动变量,函数参数,表达式的临时结果和函数返回值,栈中的这些实体数据的分配和释放都是由系统自动完成的。而堆中存放的实体数据都是程序中显示分配的,需要jvm做,而不需要程序代码显示释放。可以有效的避免因为忘记释放内存而造成内存溢出的错误。
Java中跟父类java.lang.Object中的finalize()方法,它会在垃圾回收器中认为这个对象是垃圾之后,真正回收之前会被调用。所有的类都继承自Object方法,所以它们都会有finalize()方法。
另外在java.lang.System类中,有一个gc()方法,可以显示的调用它,请求开始垃圾回收器线程。
在java.lang.Runtime类中的gc()方法与System的作用一样,只不过Runtime是一个单例模式的类,需要用getRuntime()方法来获得它的实例,然后才能调用gc()方法。
System.gc();
Runtime.getRuntime().gc();
变量及其作用范围?
Java变量可以分为:静态变量、成员变量和局部变量。静态变量指的是在类中用static修饰的变量,他的生命周期由类来决定。成员变量是类中没有用static修饰的变量,它的生命周期由对象来决定。局部变量是定义在方法里的变量、方法的参数或代码块里定义的变量,它们的作用范围用大括号{}来界定。
Java的变量分哪两种大的数据类型?
基本数据类型和引用数据类型。引用数据类型存放的是数据所在的地址,而基本数据类型则是直接存放数据的值。
Java中的基本数据类型及其包装类?
基本数据类型:byte,short,long,int,float,double,Boolean,char
包装类:Byte,Short,Long,Integer,Float,Double,Boolean,Character
基本数据类型的变量转换成包装类:Integer inte=Integer.valueOf(i);/inte=new Integer(i);
包装类转换成基本数据类型时,调用包装类对象的intValue()…即可:inte.intValue();
如何理解Java中的装箱和拆箱?
指的是基本数据类型和包装类型的自动相互转换
Integer i=10; //装箱
System.out.println(i+10);//拆箱进行加法运算
Java中equal与==的区别?
==运用在基本数据类型的时候,通过比较它们实际的值来判定是否相等;而用于比较引用类型的时候,则是比较两个引用的地址是否相等,及是否指向同一个对象。equal方法是java.lang.Object的方法,也就是所有的Java类都会有的方法,它可以被重写,通过自定义的方式来判定两个对象是都相等。对于字符串java.lang.String类来说,它的equal方法用来比较字符串的字符序列是否完全相等。
Java提供了哪几种循环结构?
for,while,for…while。for适合能确定循环次数的循环结构,while语句适合单条件的循环,do…while适合执行某段代码之后再循环。
Java中的三元表达式?
表达式1?表达式2:表达式3
?之前是一个布尔表达式,只能返回true或false,吐过返回true则执行表达式2,否则执行表达式3,并产生相应的返回值
类和对象的区别?
Java的类通过class关键字进行定义,它代表了一种抽象的集合,在类中可以定义各种属性和方法,它们代表了每个类实例的特定的数据和动作。Java虚拟机对类只加载一次,对它的静态成员也只加载一次。
对象,指的是某一特定抽象的实例,对象通过类来创建的,它必须从属于某一个类,通过new关键字进行创建,可以被多次创建。类是一种抽象,而对象是类的实现。
Java中如何使用继承来重用代码?
Java采用单继承制,使用extends关键字,通过继承以后,子类就拥有了父类除私有成员以外的所有成员,从而达到代码复用的目的。在继承过程中,可以通过方法的覆盖来实现多态,让子类拥有自己独特的方法实现方式。
多态?
多种形式,多种状态。本质是发送消息给某个对象,让该对象自行决定响应何种行为。通过将子类对象引用赋值给超类对象引用变量来实现动态方法调用。
Java中静态成员的特点?
特点:在类加载的时候就进行创建和初始化或执行代码
它们对于一个类来说只有一份(例如:单例模式)
类的所有实例都可以访问到它们
Java派生类中的构造方法如何为父类传递参数?
在Java中,使用super关键字加()的形式来为父类的构造方法提供参数,通过参数的数目和类型来决定调用哪一个构造方法。如果调用的是父类的默认的无参数构造方法,则可以不必显示地使用super()
抽象类和接口?
抽象类:如果一个类中没有包含足够地信息来描绘一个具体地对象,这样的类就是抽象类,即包含抽象(abstract)方法的类就是抽象类。抽象类不能被实例化。
接口:所有的方法都是抽象方法,没有任何的实现。可以包含静态的变量,这些变量的值是不能修改的。
一个实现类只能继承一个抽象类,但可以实现多个接口。
内部类的实质?
定义在类内部的类就叫做内部类。
静态内部类:static关键字修饰的内部类,在外部类加载的时候,静态内部类也随之加载。由于静态内部类式静态的,所以它无法访问外部类的非静态成员。
成员内部类:它需要等外部类创建了对象之后才会被加载到jvm中,属于外部类的某个实例,因此可以访问外部类的静态和非静态成员。创建成员内部类的时候,首先创建一个外部类的实例,然后用这个实例调用new语句。
Class Outter{ class Inner{…}}
Main{
Outter o =new Outter(); //创建外部类实例
Outter.Inner i=o.new Inner(); //创建内部类实例}
Class Inner(Outter o){this.o=o;//成员内部类的构造方法}
局部内部类:定义在一个方法的方法体中,不能使用static关键字,只能使用final和abstract关键字,仅可以访问外部类带有final关键字的局部变量,因为他访问的是一个字面量或镜像,该局部变量已经不存在了。但是他可以任意访问外部类对象的成员变量
匿名内部类:定义在方法体中,没有一个具体的名字
Integer和int的区别?
int是基础数据类型,字节长度为4,它的创建不会在堆内存中开辟空间,一般保存在栈内存中,可以用算术运算符进行加减乘除等操作。在参数传递的时候,直接传递它的值。
Integer是int的包装类,本质上是一个类,它的创建会在堆内存中开辟一块新的空间。它的含义也是表示一个整型的数字,但是运算操作符不能操作它。在参数传递的时候,传递的是它所代表的对象的引用。
int的取值范围?
Int型数据采用4个字节进行存储,一共是32位。第一位用于表示正负号。因此它的取值范围是:-2(31)~2(31)-1
如何用八进制和十六进制表示整型数据?
Java中的八进制字面量采用0开头,十六进制采用0x开头
long的取值范围?
Long型数据采用8个字节进行存储,一共是64位。第一位用于表示正负号,因此它的取值范围是-2(63)~-2(63)-1
float和double的取值范围是多少?
Float型,内存分配4个字节,占32位,范围从3.4E+10(-38)3.4E+10(38)次方。float型定义的数据末尾必须有f或F。double型,范围从1.7E+10(-308)1.7E+10(308),Java浮点数据默认为double型。在double向float转换的过程中,可能造成精度损失。
实型与整型的相互转换
整型转为实型时,不存在精度的损失,而实型转为整型时则可能会有精度的损失。转换过程分为显示和隐式。显示是通过强制类型转换来进行,后者是在运算、传参等情况下由系统自动进行
如何用BigDecimal类进行精确运算?
用float或都变了变量构建BigDecimal对象,通过构造方法或valueOf()方法
通过调用BigDecimal的加减乘除等,相应的方法进行算术运算
把BigDecimal对象转换成float、double、int等类型,通过类似xxxValue()等方法进行转换
Char的取值范围?
Java 中采用Unicode编码格式,用两个字节来表示一个字符,一共16位,它所能表示的最大字符数量为2(16)
字符串字面量是否会自动生成一个String对象?
字符串类具有一定的特殊性,jvm在执行双引号操作的时候,会自动创建一个String对象,并返回这个对象的引用。
String s1=”abc”;
String s2=new String(“abc”);
s1==s2; ->flase
s1.equals(s2); ->true
字符串对象池的作用是什么?
当在程序中直接用双引号引起来一个字符串时,jvm就到String的对象池中去检查是否有一个值相同的对象。如果有,就取现成的对象,如果没有,就在对象池中创建,并返回其引用。
对象池的存在是为了避免频繁的创建和销毁对象而影响系统性能。
StringBuffer和StringBuilder存在的作用是什么?
因为String是final类,具有不变性,只能被创建而不能改变其中的值。在Java程序中,如果有大量拼接字符串的需要的话,应该使用StringBuffer和StringBuilder类,可以避免不必要的String对象的产生,以提高程序的性能。它们俩的作用类似,只不过StringBuffer线程是安全的。
如何理解数组在Java中作为一个类?
Java的数组本质上是一个类,该类保存了数据类型的信息。该类通过成员变量的形式来保存数据,并且通过[]符号,使用下标来访问这些数据。在处理基本类型数据时(int型数组),数组保存的是变量的值,如果程序员未提供初始值,数组会把这些变量的值初始化为0;而处理引用类型时(String型数组),数组保存的是数据的引用,如果程序员未提供初始值,数组会把这些变量的值初始化位null.
数组的用法:
声明数组,使用一个引用来操作数组 int[] arr=new int[]{1,2,3};
使用new关键字来为数组创建所需的内存空间,并且返回一个引用的值,还可以用{}符号为数组赋初始值。
使用数组的下标对数组的值进行操作
New Object[5]语句是否创建了5个对象?
不是。只是创建了一个数组实例,长度为5,每个数组元素的值均为null,并没有创建5个object对象,如果需要创建5个object对象,则需要为每个数组元素分别指定。
如何拷贝数组的数据?
不能使用赋值运算符=来复制,那样只是复制了引用,两者指向的是同一段内存空间,对新数组的操作会影响到原数组的数据。应该使用System.arraycopy()方法,或者创建一个新的数组实例,然后把数据一一装填进去。
什么是集合?
集合是用来存储其他对象的对象,代表了一种底层结构,用于扩展数组的功能,集合框架由一系列的接口和实现类组成collection(set,list)、map(sortedmap),大多具有可迭代性和可比较性。
什么是迭代器?
迭代器,提供一种访问集合对象中各个元素的途径,同时又不需要暴露该对象的内部细节。Java通过提供Iterable和Iterator两个接口来实现集合类的可迭代性。主要用法:hasNext()用于判断集合对象是否还有下一个元素,如果已经是最后一个元素则返回false;next()把迭代的下标移动一位,并得到当前位置的元素;remove()从迭代器指向的collection中移除迭代器返回的最后一个元素
什么是比较器?
比较器是把集合元素或数组的元素强行按照指定方法进行排序的对象,它是实现了comparator接口类的实例。
Comparable接口是进行比较类需要实现的接口,它仅包含有一个compareTo()方法,只有一个参数,返回值为int型数据。(-1,0,1)
Comparator包含一个compare()方法,有两个参数,返回值与Comparable的compareTo()方法一样,但Comparator接口一般不会被集合元素所实现,而是单独实现或用匿名类的方式实现。
Vector和ArrayList的区别?
Vector是线程安全的,因为它的操作元素的方法都是同步方法,而Arraylist不是,但Aarraylist的效率会高一些。
HashMap和HashTable的区别?
HashTable的方法是同步的,而HashMap不同步
HashTable不允许null值,HashMap允许null值
HashTable使用enumeration,HashMap使用Iterator
HashTable直接使用对象的hashCode,而hashMap会重新计算hash值
什么数据集合可以使用foreach循环?
数组或者实现了Iterator接口的类实例,都是可以使用foreach循环的。
什么是序列化?
序列化本质就是把对象内存中的数据按照一定的规则,变成一系列的字节数据,然后把这些字节数据写入到流中。而反序列的过程相反,先读取字节数据,然后再重新组装成Java对象。
Java.io.Serializable接口是可以进行序列化的类的标志性接口,该接口并没有任何需要实现的抽象方法。它仅仅是用来告诉jvm该类的对象的可以进行序列化的,并且它的序列化id由静态的serialVersionUID变量提供。
SerialVersionUID变量其实是一个静态的long型的常量,它的作用在序列化和反序列化的过程中,起到了辨别一个类的作用,在反序列化的时候,如果两个类的类名完全相同,就通过serialVersionUID来判断该类是否符合要求,如果不行,则抛出异常。
什么是多线程?
每个正在系统上运行的程序都是一个进程,每个进程包含一个或多个进程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序中独立执行,也可以理解为代码运行的上下文。
多线程:允许在程序中并发执行多个指令流,每个指令流都称为一个线程,彼此间相互独立,比较容易共享数据,通过并发执行的方式来提高程序的效率和性能。线程又称为轻量级进程,它和进程一样拥有独立的执行控制,由操作系统负责调度。
进程和线程的区别?
线程的划分尺度小于进程,线程隶属于某个进程
进程是程序的一种动态形式,是cpu,内存等资源占用的基本单位,而线程是不能独立占用这些资源的
进程之间相互独立,通信比较困难,而线程之间共享一块内存区域,通信比较方面
进程在执行过程中,包含在固定的入口、执行顺序和出口,而线程的这些过程会被应用程序所控制。
如何让一个类成为线程类?
1.实现java.lang.Runnable接口
2.继承java.langThread类
Runnable接口与Thread类的区别?
线程类继承Thread则不能继承自其他类,而Runnable接口可以
线程类继承Thread相对于Runnable来说,使用线程的方法更方便
实现Runnable接口的线程类的多个线程,可以更方便的访问同一变量,而Thread类则需要内部类来进行替代
如何启动一个线程?
继承自Thread类的线程类,可以通过new关键字创建一个线程对象以后,执行start()方法来开始一个线程。而实现了Runnable接口的线程类,需要用它的对象实例,作为Thread类构造方法的参数,创建一个Thread对象,然后调用start()方法开始一个线程。
如何用synchronized来让线程同步?
Synchronized关键字代表要为某一段代码加上一个同步锁,这样的锁是绑定在某一个对象上的。如果是同步代码块,需要为该synchronized关键字提供一个对象的引用,如果是同步方法,只需要加一个synchronized关键字的修饰。
Synchronized为某段代码加上锁以后,某个线程进入该段代码之前,首先需要检查该锁是否被占用,如果没有被占用,则继续执行;如果已经被占用,则需要等到该锁被释放以后才能继续执行。其中,线程执行完该段代码就是释放锁的标志。
如何使用Java的线程池?
Java提供了java.util.concurrent.ThreadPoolExecutor类来使用线程池,它在构造的时候需要提供池大小等的参数,如:
ThreadPoolExecutor(int corePoolSize,
Int maximumPoolSize,
Long keepAliveTime,
TimeUnit unit,
BlockingQuene<Runnable> workQuene,
RejectedExecutionHandler handler);
一个线程任务通过execute(Runnable)方法被添加到线程池,任务就是一个Runnable类型的对象,执行方法就是Runnable类型对象的run()方法
当一个任务通过execute(Runnable)方法添加到线程池时,有以下几点:
如果此时线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也要创建新的线程来处理被添加的任务
如果此时线程池中的数量等于corePoolSize,但缓冲队列workQuene未满,那么任务被放入缓冲队列
如果此时线程池中的数量大于corePoolSize,缓冲队列workQunene满,并且线程池中的数量小于maximumPoolSize,建新的线程来处理被添加的任务
如果此时线程池中的数量大于corePoolSize,缓冲序列workQuene满,并且线程池中的数量等于maximumPoolSize,那么通过handler所制定的策略来处理此任务
反射的原理是什么?
反射是为了能够动态地加载一个类,动态地调用一个方法,动态地访问一个属性等动态要求而设计的。它的出发点就在于jvm会为每个类创建一个java.lang.Class类的实例,通过该对象可以获取这个类的信息,然后通过使用java.lang.reflect包下的api以达到各种动态要求。
Class类的含义和作用是什么?
一个普通的Java类被加载到jvm中的情况:
需要使用该类创建对象。(Student stu=new Student();)
访问该类的静态成员(System.out.println(Student.count);)
使用class类的静态forName()方法,动态地加载一个指定类名的类。如果类未找到,则抛出ClassNotFoundException异常(Class.forName(“com.test.Student”);)
类一旦被加载到jvm后,就会为它创建一个Class类的实例对象。
得到一个类的Class对象的方法:
Class类的forName()方法的返回值
访问所有类都会拥有的 静态class属性(Class<Student> clazz=Student.class)
调用所有对象都会有的getClass()方法(Class<Student> clazz =stu.getClass();)
如何利用反射实例化一个类?
如果使用无参数的构造方法,则直接使用Class类的newInstance()方法;如需要使用特定结构的构造方法来创建对象,则需要先获取Constructor实例,再用newInstance()方法创建对象。
Jdbc的工作原理是什么?
Jdbc采用了一种驱动模式的设计,提供了两套的接口:开发者使用的api和数据库厂商使用的spi,充分的体现了面向接口编程的好处。程序员无需关心具体数据库的连接和调用,只需要使用jdk中提供的标准api编程即可,而具体的实现由特定的数据库生产商提供,也就是jdbc驱动。
Jdbc编程的步骤?
注册驱动程序(Class.forName(“数据库驱动的完整类名”);)
获取一个数据库连接(Connection conn=DriverManger.getConnection(“连接url”,“root”,”root”);)
创建一个会话(Statement stmt=conn.createStatement();)
执行sql语句,增加、删除、修改记录(stmt.executeUpdate(“”);)
或者查询记录(ResultSet rs=stmt.executeQuery(“”);)
对查询的结果进行处理(while(rs.next()){…})
关闭连接(rs.close();stmt.close();conn.close();)
如何使用jdbc事务?
关闭自动提交事务,设置连接的自动提交事务属性为false
捕获(try-catch)执行代码,如果执行过程顺利,(try中)提交事务,一旦发生异常,(catch中)回滚事务
在finally中关闭连接
Servlet?
Servlet在Java web服务器中充当了信息资源的最小表示单位,代表了一个用户可以通过浏览器获取的资源。Servlet可以进行无限的扩展,它可以使用Java的所有类库资源,为用户返回文本,图片,音频,视频等各类信息资源
从编程角度来看,servlet是一个Java类,这个类需要实现servlet接口,提供一个公开的无参数的构造方法。由web容器来控制它的创建、初始化、提供服务、销毁等。它的各种行为方式通过web.xml文件中的配置来决定
Servlet的生命周期?
- 加载创建
加载阶段指的是servlet类加载到Java虚拟机中,并且实例化,在这个过程中,web容器会调用servlet类的公开的无参数的构造方法,产生一个servlet类的实例对象,也就是由该对象来提供服务。在默认情况下,servlet是在第一次请求的时候被加载,但是可以通过<load-on-startup>标签设置servlet在web容器启动的时候加载。如果servlet类没有提供无参数的构造方法或者该构造方法不是公开的,将加载失败。 - 初始化
Web容器在初始化servlet的时候会调用init()方法,开发者可以获取配置在web.xml中的初始化参数。所以一般的初始化代码会放在这个方法中,如打开数据源等 - 提供服务
当有http请求指向servlet的时候,调用service()方法的过程,该方法体包含了该servlet的业务逻辑,如果是继承自httpservlet的话,根据http请求类型的不同,业务逻辑代码会包含在doGet()或doPost()方法体中。 - 销毁
重新部署web应用,关闭web容器等,会回调destroy(),释放资源的代码会放在销毁方法中
Servlet接口有哪些实现类?
Javax.faces.webapp.FacesServlet
Javax.servlet.GenericServlet
Javax.servlet.http.httpservlet
如何在servlet中获取请求参数的值?
在servlet中,任何负责做出相应的方法(service(),doGet(),doPost())都会包含在一个servletrequest对象参数,不管是post还是get的请求方式,servlet都可以通过servletrequest接口的getParameter()或getParameterValues()方法获取到。前者适用于只有一个值的参数,后者多用于有多值的参数,例如,复选框
Forward和redirect的区别?
Forward和redirect代表了两种请求转发方式:直接转发和间接转发。对应到代码里,分别是requestDispatcherh类的forward()方法和httpservletresponse类的sendRedirect()方法
对于间接转发方式,服务器在响应第一次请求的时候,让浏览器再向另外一个url发出请求,从而达到转发的目的。它本质上是两次http请求,对象两个request对象
对于直接转发方式,客户端浏览器只发出一次请求,servlet把请求转发给servlet、html、jsp或其他信息资源,由两个信息资源响应该请求,两个信息资源共享一个request对象
简介请求转发:重定向
一般用于避免用户的非正常访问。例如,用户在没有登录的情况下访问后台管理资源,servlet可以将该http请求重定向到登录页面,让用户登陆后再访问。在servlet中,通过调用response对象的sendRedirect()方法,告诉浏览器重定向访问指定的url
间接请求转发的过程:
浏览器向servlet发出访问请求
Servlet1调用sendRedirect()方法,将浏览器的请求重定向到servlet2
浏览器向servlet2发出访问请求
最终由servlet2做出响应
直接请求转发的过程:
浏览器向servlet1发出访问请求
Servlet1调用forward()方法,在服务器端将请求转发给servlet2
最终由servlet2做出响应,返回给浏览器
过滤器的作用和工作原理是什么?
对于web应用程序来说,过滤器是处于web容器内的一个组件,它会过滤特定请求资源请求信息和响应信息。一个请求来到的时候,web容器会判断是否有过滤器与该信息资源关联,如果有,则交给过滤器处理,然后再交给目标资源,响应的时候则以相反的顺序交给过滤器处理,最后再返回给用户浏览器
过滤器类需要实现javax.servlet,Filter接口,需要实现doFilter()方法,并在web.xml中提供配置
(过滤器是一种设计模式,它可以在不侵入原有代码的基础上为它们提供一些功能)
监听器的作用和工作原理?
监听器是处于web容器内的一个组件,它会对web容器中的3中范围对象进行监听:request、session和application。当这些范围对象在创建或销毁的时候,web容器会主动的调用它们的初始化或销毁的回调方法,从而达到事件响应的效果。
Javax.servlet.Servletrequestlistener
Javax.servlet.httpsessionlistener
Javax.servlet.Servletcontextlistener
Jsp的运行机制是什么?
Jsp是一种建立在servlet规范提供的功能之上的动态网页技术,在网页文件中嵌入脚本代码,产生动态的内容。Jsp文件会在用户第一次请求时,web容器会将该jsp文件编译成servlet,再由该servlet处理用户的请求,所以说jsp本质上是servlet。因为servlet在处理静态内容时非常笨拙,不得不把静态内容以字符串的形式进行拼接,而jsp可以很好的实现动态和静态内容的分离,开发者可以对静态内容和动态内容分别开发。
当客户端发出一次对某个jsp的请求,web容器处理该请求的过程如下:
Web容器会检验jsp的语法是否正确
将jsp文件转换成servlet的源码文件
编译该源码文件成为class文件
创建一个该servlet类的对象实例,以servlet的方式为请求提供服务
Jsp的内置对象及其用途?
Application/它代表了整个web应用程序
Session/heetp会话对象
Request/请求对象
Response/返回对象
Config/配置对象,用于获取初始化参数等数据
Out/写出流对象,用于返回数据给客户端(out.print(“”);)
Page/普通的页面对象
PageContext/页面上下文,代表页面的一个运行环境,通过它可以获取到其他对象,如会话、请求等(pageContext.getSession()…pageContext.set/get/findAttribute(“”,””);)
Exception/用于错误页面,通过该对象可以获得异常的详细信息
Page和request作用范围的区别是什么?
Page范围指的是当前jsp页面的范围,一旦该jsp页面处理完以后,该范围也就结束了,它对应了pagecontext内置对象
Request范围指的是一次请求,如果请求指向的一个单一的jsp文件,则此时的page和request的生命周期是一样的。但是,一次请求往往不是由单一的jsp发出来,一次request的周期可以是若干个jsp或其他资源的周期之和。
什么是mvc设计模式?
由servlet来充当控制器的角色,它接受请求,根据请求信息的不同将它们分发给合适的jsp页面来作为用户的响应,同时,servlet还需要实例化一个Javabean对象,jsp就可以使用JavaBean的相关标签来来得到JavaBean的数据。
MVC是一种设计模式,程序的输入,处理和输出3者分离。使用mvc应用程序被分为3个核心部件:模型,视图,控制器。
视图:是用户看到并与之交互的界面(jsp,html)
模型:表示数据和业务规则。它往往代表了一个应用程序的核心业务及其数据模型,由于应用于模型的代码只需写一次就可以被多个视图重用,所以把模型独立出来减少代码的重用性
控制器:接收用户的输入并调用模型和视图取完成用户的需求。所以当单击web页面中的超链接和发送html表单时,控制器(例如servlet)本身不输出任何内容和做任何处理。它只是接收请求并决定调用哪个模型构件去处理请求,然后确定使用哪个视图来显示模型处理返回的数据。