JAVA及JAVAWEB相关原理知识点总结复习

什么是JDK?什么是JRE?

JDK:包括完整的JRE(Java Runtime Environment),Java运行环境,还包含了其他供开发者使用的工具包

JRE:普通用户而只需要安装JRE(Java Runtime Environment)来 来运行Java程序。而程序开发者必须安装JDK来编译、调试程序

Java基本数据类型图

Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。

 

Excption与Error区别

Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题;比如内存溢出,不可能指望程序能处理这样的状况;

Exception表示需要捕捉或者需要程序进行处理的异常,是一种设计或实现问题;也就是说,它表示如果程序运行正常,从不会发生的情况。

 

引用变量:理解成“遥控器”,保存一个实例的内存地址(引用变量保存在栈),引用变量的特殊值:null 不保存任何实例的内存地址

构造方法:新建实例对象时,立即执行的一个特殊方法;构造方法必须和类同名,并且没有返回值类型。

一个类中必须有构造方法,自己没定义,系统会添加默认构造方法,构造方法一般用来给属性赋值

 

构造方法有哪些特性?

  1. 名字与类名相同;
  2. 没有返回值,但不能用void声明构造函数;

3,生成类的对象时自动执行,无需调用。

构造方法重载

一个类中可以定义多个不同参数的构造方法,是方法重载的一种体现

 

方法重载Overload:同名不同参,与返回值类型无关,所有方法都可以重载

静态方法和实例方法有何不同?

在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式。而实例方法只有后面这种方式。也就是说,调用静态方法可以无需创建对象。

静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法;实例方法则无此限制

 

1 面向对象的特征有哪些方面

  1. 继承  2.封装 3.多态性

2 String是最基本的数据类型吗?

不是

基本数据类型包括byte、int、char、long、float、double、boolean和short。
java.lang.

String类是final类型的,因此不可以继承这个类、不能修改这个类。

String的构造方法

1)String(String original):把字符串数据封装成字符串对象

2)String(char[] value):把字符数组的数据封装成字符串对象

3)String(char[] value, int index, int count):把字符数组中的一部分数据封装成字符串对象

String类的获取功能:

1)length():获取字符串的长度,其实也就是字符个数

2)charAt(int index):获取指定索引处的字符

3)indexOf(String str):获取str在字符串对象中第一次出现的索引

4)substring(int start):从start开始截取字符串

5)String substring(int start,int end):从start开始,到end结束截取字符串。包括start,不包括end

String判断功能

1)equals(Object obj):比较字符串的内容是否相同

2)equalsIgnoreCase(String anotherString):比较字符串的内容是否相同,忽略大小写

3)startsWith(String prefix):判断字符串对象是否以指定的字符开头(区分大小写)

4)startsWith(String prefix,int toffset):判断字符串对象是否以指定的字符开头,参数toffset为指定从哪个下标开始

5)endsWith(String str):判断字符串对象是否以指定的字符结尾

6)isEmpty():判断指定字符串是否为

7)startsWith(String prefix):判断字符串是否以指定字符开头

String类中的转化方法:

1)toCharArray():把字符串转换为字符数组

2)toLowerCase():把字符串转换为小写字符串

3)toUpperCase():把字符串转换为大写字符串

3 int 和 Integer 有什么区别

1.int是基本的数据类型,直接存数值;

2.Integer是int的封装类;integer是对象,用一个引用指向这个对象;Integer是一个类,是int的扩展,定义了很多的转换方法。

3.int和Integer都可以表示某一个数值;


4 String、StringBuffer与StringBuilder之间区别

如果要操作少量的数据用 = String 字符串常量

单线程操作字符串缓冲区下操作大量数据= StringBuilder 线程非安全的 字符变量 效率高

多线程操作字符串缓冲区下操作大量数据= StringBuffer 线程安全的 字符变量 效率低


5运行时异常与一般异常有何异同?
异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。


6 说出一些常用的类,包,接口,请各举5个
  常用的类:BufferedReader BufferedWriter FileReader FileWirter

 

String Integer java.util.Date, Class, HashMap

常用的接口 List Map Document NodeList Servlet, HttpServletResponse,

Transaction(Hibernate)、 Session(Hibernate), HttpSession

常用的包:java.lang java.io java.util java.sql javax.servlet

org.apache.strtuts.action  org.hibernate

 

说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

 触发器分为事前触发和事后触发,这两种触发有和区别。语句级触发和行级触发有何区别。
事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值
语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。

servlet的配置

 1、首先,从浏览器中发送请求,是从当前工程中的路径servlet-mapping标签中的url-pattern的标签值进行匹配。

2、根据这个映射值,找到servlet-mapping标签中的servlet-name的值servlet标签中的servlet-name进行匹配

       3、匹配到以后,找到servlet标签中的servlet-class标签中对应servlet类的src文件夹下的全路径。

       4、从而调用并执行相应的servlet类。

 

servlet的生命周期

 

(1)第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
(2)Servlet 容器在调用 service() 方法之前加载 Servlet。
(3)然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。



Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:Servlet 通过调用 init () 方法进行初始化
Servlet 调用 service() 方法来处理客户端的请求
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

如何现实servlet的单线程模式

由于servlet实例的唯一性,如果在servlet中使用了静态变量(存在方法区中)或成员变量(存在堆中),那么它们就可能会成为临界资源,多线程下就会有并发问题

一种较好的解决方法是:servlet中避免使用静态变量和成员变量,只允许使用方法

局部变量

一种不好的解决方法是:让servlet实现SingleThreadModel 接口,这样做web容器

会让servlet中的方法仅能被单线程串行访问,并发性大大降低。

HashMap 的实现原理?

HashMap概述: HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 

 

HashMap的数据结构: 在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

 

当我们往Hashmap中put元素时,首先根据key的hashcode重新计算hash值,根绝hash值得到这个元素在数组中的位置(下标),如果该数组在该位置上已经存放了其他元素,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放入链尾.如果数组中该位置没有元素,就直接将该元素放到数组的该位置上。

List

Arraylist:数组(查询快,增删慢 线程不安全,效率高 )

Vector:数组(查询快,增删慢 线程安全,效率低 )

LinkedList:链表(查询慢,增删快 线程不安全,效率高 )

Set

HashSet(无序,唯一):哈希表或者叫散列集(hash table)

LinkedHashSet:链表和哈希表组成 。 由链表保证元素的排序 , 由哈希表证元素的唯一性

TreeSet(有序,唯一):红黑树(自平衡的排序二叉树。)

Map

HashMap:基于哈希表的Map接口实现(哈希表对键进行散列,Map结构即映射表存放键值对)

LinkedHashMap:HashMap 的基础上加上了链表数据结构

HashTable:哈希表

TreeMap:红黑树(自平衡的排序二叉树)

 

怎么防止死锁?

死锁的四个必要条件:

死锁 :是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去 。
产生原因:
- 因为系统资源不足。
- 进程运行推进顺序不合适。
- 资源分配不当等。
- 占用资源的程序崩溃等。

互斥条件:进程对所分配到的资源不允许其他进程进行访问,若其他进程访问该资源,只能等待,直至占有该资源的进程使用完成后释放该资源

请求和保持条件:进程获得一定的资源之后,又对其他资源发出请求,但是该资源可能被其他进程占有,此事请求阻塞,但又对自己获得的资源保持不放

不可剥夺条件:是指进程已获得的资源,在未完成使用之前,不可被剥夺,只能在使用完后自己释放

环路等待条件:是指进程发生死锁后,若干进程之间形成一种头尾相接的循环等待资源关系

这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之 一不满足,就不会发生死锁。

理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和 解除死锁。

 

简述 tcp 和 udp的区别?

TCP面向连接(如打电话要先拨号建立连接);

UDP是无连接的,即发送数据之前不需要建立连接。

TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;

UDP尽最大努力交付,即不保证可靠交付。

Tcp通过校验和,重传控制,序号标识,滑动窗口、确认应答实现可靠传输。如丢包时的重发控制,还可以对次序乱掉的分包进行顺序控制。

UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。

每一条TCP连接只能是点到点的;

UDP支持一对一,一对多,多对一和多对多的交互通信。

TCP对系统资源要求较多,UDP对系统资源要求较少。

tcp 为什么要三次握手,两次不行吗?为什么?

为了实现可靠数据传输, TCP 协议的通信双方, 都必须维护一个序列号, 以标识发送出去的数据包中, 哪些是已经被对方收到的。 三次握手的过程即是通信双方相互告知序列号起始值, 并确认对方已经收到了序列号起始值的必经步骤。

如果只是两次握手, 至多只有连接发起方的起始序列号能被确认, 另一方选择的序列号则得不到确认。

Java中访问数据库的步骤,Statement和PreparedStatement之间的区别

1.DriverManager类:用来建立与数据库的连接

Connection con = DriverManager.getConnection(url,"user","password");

2.Connection接口

主要有两个方法:

Statement createStatement();  // 创建一个Statement对象并返回具体的SQL指令

void close();  //关闭数据库连接,释放资源

3.Statement接口

ResultSet executeQuery(String sql);  //执行SQL命令,返回一个结果的集合,通常用来执行select查询命令

int executeUpdate(String sql);  //执行SQL命令,返回操作成功的记录条数。通常用来执行INSERT、UPDATE或DELETE 命令,即增、删、改命令。

4.PreparedStatement接口

它是Statement的子类,具有对SQL命令进行预编译的功能,对于需要多次执行的SQL语句而言,可以提高执行效率。一般我都是用来做输入参数的预编译SQL语句。

5.ResultSet接口

ResultSet表示数据库结果集。ResultSet对象具有指向其当前数据行的指针。next()方法将指针移动到下一行。

下面是步骤:

1、注册驱动/加载驱动

Class.forName("com.mysql.jdbc.Driver");    //不同的数据库需要加载不同的参数,这里加载的是mysql数据库的驱动

2、建立连接

Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/databasename","root","root");

3、创建Statement/PreparedStatement

Statement st = con.createStatement();

4、执行SQL语句

Result set = st.executeQuery("select * from user");  //执行查询操作,返回的是一个结果

int rst = st.executeUpdate(".......");  //执行增、删、改操作,返回的是执行的行数

5、处理结果集

这种情况都是发生在执行的SQL语句是查询语句,返回的是一个结果集,一般都会用while语句去判断时候有下一行数据,就用next()方法取出数据。

6、关闭连接,释放资源

con.close();  关闭Connection类的实例

 

描述Cookie和Session的作用,区别和各自的应用范围,Session工作原理

 

Session用于保存每个用户的专用信息. 每个客户端用户访问时,服务器都为每个用户分配一个唯一的会话ID(Session ID) . 她的生存期是用户持续请求时间再加上一段时间(一般是20分钟左右).Session中的信息保存在Web服务器内容中,保存的数据量可大可小.当 Session超时或被关闭时将自动释放保存的数据信息.由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低.对于小量的数据,使用Session对象保存还是一个不错的选择

 

Cookie 用于保存客户浏览器请求服务器页面的请求信息,程序员也可以用它存放非敏感性的用户信息,信息保存的时间可以根据需要设置.如果没有设置Cookie失效日期,它们仅保存到关闭浏览器程序为止.如果将Cookie对象的Expires属性设置为Minvalue,则表示Cookie永远不会过期.Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,因此不要用来保存数据集及其他大量数据.由于并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,因此最好不要保存敏感的,未加密的数据,否则会影响网站的安全性

 

session工作原理

(1)当有Session启动时,服务器生成一个唯一值,称为Session ID(好像是通过取进程ID的方式取得的)。

(2)然后,服务器开辟一块内存,对应于该Session ID。

(3)服务器再将该Session ID写入浏览器的cookie

(4)服务器内有一进程,监视所有Session的活动状况,如果有Session超时或是主动关闭,服务器就释放改内存块。

(5)当浏览器连入IIS时并请求的ASP内用到Session时,IIS就读浏览器Cookie中Session ID。

(6)然后,服务检查该Session ID所对应的内存是否有效。

(7)如果有效,就读出内存中的值。

(8)如果无效,就建立新的Session。

 

Session内容保存在服务器端的,通常是保存在内存中。客户端跟服务器端通过SessionID来关联。

SessionID通常以Cookie的形式存储在客户端。每次HTTP请求,SessionID都会随着Cookie被传递到服务器端,这时就可以通过SessionID取到对应的信息,来判断这个请求来自于哪个客户端/用户

 

字符型常量和字符串常量的区别

形式上:

字符常量是单引号引起的一个字符

字符串常量是双引号引起的若干个字符

含义上:

字符常量相当于一个整形值(ASCII值),可以参加表达式运算

字符串常量代表一个地址值(该字符串在内存中存放位置)

占内存大小

字符常量只占一个字节

字符串常量占若干个字节(至少一个字符结束标志)

 

final 有什么用?

用于修饰类、属性和方法;

被final修饰的类不可以被继承

被final修饰的方法不可以被重写

被final修饰的变量不可以被改变,被final修饰不可变的是变量的引用,而不是引用指向的内容,引用指向的内容是可以改变的

 

equals与==的区别:

 

==是判断两个变量或实例是不是指向同一个内存空间

 equals是判断两个变量或实例所指向的内存空间的值是不是相同

 

Object有哪些公用方法

a.方法equals测试的是两个对象是否相等

b.方法clone进行对象拷贝

c.方法getClass返回和当前对象相关的Class对象

d.方法notify,notifyall,wait都是用来对给定对象进行线程同步

 

抽象类和接口的区别

a.一个类只能继承单个类,但是可以实现多个接口

b.接口强调特定功能的实现,而抽象类强调所属关系

c.抽象类中的所有方法并不一定要是抽象的,你可以选择在抽象类中实现一些基本的方法。而接口要求所有的方法都必须是抽象

 

this关键字的用法

this是自身的一个对象,代表对象本身,可以理为:指向对象本身的一个指针。

this的用法在java中大体可以分为3种:

1.普通的直接引用,this相当于是指向当前对象本身

2.形参与成员名字重名,用this来区分:

3.引用本类的构造函数

 

重载和重写的区别

重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。

重写:发生在父子类中,方法名、参数列表必须相同,返回值小于等于父类,抛出的异常小于等于父类,访问修饰符大于等于父类;如果父类方法访问修饰符为private则子类中就不是重写。

 

成员变量与局部变量的区别有那些?

从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数

成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰;

成员变量和局部变量都能被final所修饰;

从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存

从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。

成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被final修饰但没有被static修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。

 

wait()和sleep()的区别

sleep来自Thread类,和wait来自Object类

调用sleep()方法的过程中,线程不会释放对象锁。而 调用 wait 方法线程会释放对象锁

 

sleep睡眠后不出让系统资源,wait让出系统资源其他线程可以占用CPU

sleep(milliseconds)需要指定一个睡眠时间,时间一到会自动唤醒

 

JAVA 中堆和栈的区别,说下java 的内存机制

a.基本数据类型比变量和对象的引用都是在分配的

b.堆内存用来存放由new创建的对象和数组

c.类变量(static修饰的变量),程序在一加载的时候就在堆中为类变量分配内存,堆中的内存地址存放在栈中

d.实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量,是根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”,实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存

e.局部变量: 由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放

 

JAVA多态的实现原理

a.抽象的来讲,多态的意思就是同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

b.实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追溯源码可以发现,JVM 通过参数的自动转型来找到合适的办法。

Java多态的实现(继承、重载、覆盖)

super关键字的用法

super可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类。

super也有三种用法:

1.普通的直接引用

与this类似,super相当于是指向当前对象的父类的引用,这样就可以用super.xxx来引用父类的成员。

2.子类中的成员变量或方法与父类中的成员变量或方法同名时,用super进行区分

3.引用父类构造函数

super(参数):调用父类中的某一个构造函数(应该为构造函数中的第一条语句)。

this(参数):调用本类中另一种形式的构造函数(应该为构造函数中的第一条语句)。

 

流程控制语句

break ,continue ,return 的区别及作用

break 跳出总上一层循环,不再执行循环(结束当前的循环体)

continue 跳出本次循环,继续执行下次循环(结束正在执行的循环 进入下一个循环条件)

return 程序返回,不再执行下面的代码(结束当前的方法 直接返回)

面向对象和面向过程的区别

面向过程:

  优点:性能比面向对象高,因为类调用时需要实例化,开销比较大,比较消耗资源;比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发,性能是最重要的因素。

缺点:没有面向对象易维护、易复用、易扩展

面向对象:

  优点:易维护、易复用、易扩展,由于面向对象有封装、继承、多态性的特性,可以设计出低耦合的系统,使系统更加灵活、更加易于维护

缺点:性能比面向过程低

什么是多线程?为什么程序的多线程功能是必要的?

 

多线程就是几乎同时执行多个线程。几乎同时是因为实际上多线程程序中的多个线程实际上是一个线程执行一会然后其他的线程再执行,并不是很多书籍所谓的同时执行(多个线程的核心可以同时执行)。

这样可以带来以下的好处:

1. 使用线程可以把占据长时间的程序中的任务放到后台去处理

2. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度

3. 程序的运行速度可能加快

4. 在一些等待的任务实现上如用户输入、文件读写和网络收发数据等,线程就比较有用了。在这种情况下可以释放一些珍贵的资源如内存占用等等。

 

线程有哪些基本状态?这些状态是如何定义的?

新建(new):新创建了一个线程对象。

可运行(runnable):线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。

运行(running):可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。

阻塞(block):阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。

阻塞的情况分三种:

(一). 等待阻塞:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waitting queue)中。

(二). 同步阻塞:运行(running)的线程在获取对象的同步锁时,若该同步锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。

(三). 其他阻塞: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。

死亡(dead):线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。

JAVAWEB

什么是Servlet?

可以从两个方面去看Servlet:

a、API:有一个接口servlet,它是servlet规范中定义的用来处理客户端请求的程序需要实现的顶级接口

b、组件:服务器端用来处理客户端请求的组件,需要在web.xml文件中进行配置。

在Java Web程序中,Servlet主要负责接收用户请求HttpServletRequest,在doGet(),doPost()中做相应的处理,并将回应HttpServletResponse反馈给用户。Servlet可以设置初始化参数,供Servlet内部使用。一个Servlet类只会有一个实例,在它初始化时调用init()方法,销毁时调用destroy()方法。Servlet需要在web.xml中配置(MyEclipse中创建Servlet会自动配置),一个Servlet可以设置多个URL访问。Servlet不是线程安全,

 

Servlet的优点:

1,只需要启动一个操作系统进程以及加载一个JVM,大大降低了系统的开销

2,如果多个请求需要做同样处理的时候,这时候只需要加载一个类,这也大大降低了开销

3,所有动态加载的类可以实现对网络协议以及请求解码的共享,大大降低了工作量。

4,Servlet能直接和Web服务器交互,而普通的CGI程序不能。Servlet还能在各个程序之间共享数据,使数据库连接池之类的功能很容易实现。

 

3、Servlet接口中有哪些方法?

Servlet接口定义了5个方法,其中前三个方法与Servlet生命周期相关:

void init(ServletConfig config) throws ServletException

void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException

void destory()

java.lang.String getServletInfo()

ServletConfig getServletConfig()

get和post请求的区别?

a、get是用来从服务器上获取数据,而post是用来向服务器传递数据;

b、get将表单中数据按照variable=value的形式,添加到action所指向的URL后面,并且两者用"?"连接,变量之间用"&"连接;而post是将表单中的数据放在form的数据体中,按照变量与值对应的方式,传递到action所指定的URL。

c、get是不安全的,因为在传输过程中,数据是被放在请求的URL中;而post的所有操作对用户来说都是不可见的。

d、get传输的数据量小,这主要应为受url长度限制;而post可以传输大量的数据,所有上传文件只能用post提交。

e、get限制form表单的数据集必须为ASCII字符;而post支持整个IS01 0646字符集。

f、get是form表单的默认方法。

 

 

什么情况下调用doGet()和doPost()?

默认情况是调用doGet()方法,JSP页面中的Form表单的method属性设置为post的时候,调用的为doPost()方法;为get的时候,调用deGet()方法。

 

四种会话跟踪技术

 

URL重写、隐藏表单域、CookieSession

1).隐藏表单域:<input type="hidden">,非常适合步需要大量数据存储的会话应用。

2).URL重写:URL可以在后面附加参数,和服务器的请求一起发送,这些参数为名字/值对。

3).Cookie:一个Cookie是一个小的,已命名数据元素。服务器使用SET-Cookie头标将它作为HTTP

响应的一部分传送到客户端,客户端被请求保存Cookie值,在对同一服务器的后续请求使用一个

Cookie头标将之返回到服务器。与其它技术比较,Cookie的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值。

  1. .Session:使用setAttribute(String str,Object obj)方法将对象捆绑到一个会话

JSP工作原理

JSP是一种Servlet,但是与HttpServlet的工作方式不太一样。HttpServlet是先由源代码编译为class文件后部署到服务器下,为先编译后部署。而JSP则是先部署后编译。JSP会在客户端第一次请求JSP文件时被编译为HttpJspPage类(接口Servlet的一个子类)。该类会被服务器临时存放在服务器工作目录里面。下面通过实例给大家介绍。

工程JspLoginDemo下有一个名为login.jsp的Jsp文件,把工程第一次部署到服务器上后访问这个Jsp文件,我们发现这个目录下多了下图这两个东东。

.class文件便是JSP对应的Servlet。编译完毕后再运行class文件来响应客户端请求。以后客户端访问login.jsp的时候,Tomcat将不再重新编译JSP文件,而是直接调用class文件来响应客户端请求。

jsp有哪些内置对象?作用分别是什么?
答:JSP共有以下9种基本内置组件(可与ASP的6种内部组件相对应):
request 用户端请求,此请求会包含来自GET/POST请求的参数
response 网页传回用户端的回应
pageContext 网页的属性是在这里管理
session 与请求有关的会话期
application servlet 正在执行的内容
out 用来传送回应的输出
config servlet的构架部件
page JSP网页本身
exception 针对错误网页,未捕捉的例外


jsp有哪些动作?作用分别是什么?
答:JSP共有以下6种基本动作
jsp:include:在页面被请求的时候引入一个文件。 包含
jsp:useBean:寻找或者实例化一个JavaBean。
jsp:setProperty:设置JavaBean的属性。
jsp:getProperty:输出某个JavaBean的属性。
jsp:forward:把请求转到一个新的页面。
jsp:plugin:根据浏览器类型为Java插件生成OBJECT或EMBED标记

 

JSP之三大指令

page指令

include指令

JSP可以通过include指令来包含其他文件。被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是该JSP文件的一部分,会被同时编译执行。

taglib指令

taglib指令是用来在当前jsp页面中导入第三方的标签库

 

JSP中的四种作用域

JSP中的四种作用域包括page、request、session和application,具体来说:

- page代表与一个页面相关的对象和属性。

- request代表与Web客户机发出的一个请求相关的对象和属性。一个请求可能跨越多个页面,涉及多个Web组件;需要在页面显示的临时数据可以置于此作用域。

- session代表与某个用户与服务器建立的一次会话相关的对象和属性。跟某个用户相关的数据应该放在用户自己的session中。

- application代表与整个Web应用程序相关的对象和属性,它实质上是跨越整个Web应用程序,包括多个页面、请求和会话的一个全局作用域。

JSP的内置对象及方法。

request表示HttpServletRequest对象。它包含了有关浏览器请求的信息,并且提供了几个用于获取cookie, header, 和session数据的有用的方法。
response 表示HttpServletResponse对象,并提供了几个用于设置送回浏览器的响应的方法(如cookies,头信息等)
out 对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果
pageContext表示一个javax.servlet.jsp.PageContext对象。它是用于方便存取各种范围的名字空间、servlet相关的对象的API,并且包装了通用的servlet相关功能的方法。
session表示一个请求的javax.servlet.http.HttpSession对象。Session可以存贮用户的状态信息 
application表示一个javax.servle.ServletContext对象。这有助于查找有关servlet引擎和servlet环境的信息
config 表示一个javax.servlet.ServletConfig对象。该对象用于存取servlet实例的初始化参数
page表示从该页面产生的一个servlet实例

 

简述在JSP中是如何实现分页操作的。

首先一定要确定的是分页有两种:

真分页:性能较高,是基于数据库的操作,只是从数据库中取出部分的数据进行显示,所以性能高,但是可移植性低。

假分页:性能较低,是将全部的结果查询出来,之后依靠算法分页,只显示部分数据

 

实现原理:

定义一系列的变量:currentPage, lineSize, 并通过查询求了allRecorders和计算求出pageSize pageSize=(AllRecorders  + lineSize - 1)/lineSize

之后数据库查询语句中根据lineSize和currentPage进行数据的查询

Oracle中使用ROWNUM,mysql中使用limit()

之后通过表单不断的修改currentPage, lineSize就可以实现分页显示

 

MVC的各个部分都有哪些技术来实现?如何实现?

MVC:model view controller

model:JavaBean 业务处理、数据处理

view:显示的事JSP,最好不存在任何的scriptlet,可以使用标签消除

controller:控制,接收view传递的内容和调用javaBean,并根据javaBean的处理结果进行跳转

实现原理:所有的JSP将内容提交给Servlet,servlet接收这些内容并调用相应的JavaBean进行业务及数据的处理,一般javabean有专人负责开发,完成业务的操作流程,而servlet调用的只是接口,并根据这些接口的操作结果将内容交给JSP运行显示,但是显示的时候尽可能少出现Scriptlet代码

 

介绍在Jsp中如何使用JavaBeans。

1.像使用普通Java类一样创建JavaBean实例
2.在JSP页面中通常使用JSP动作标签使用JavaBean

常用的JSP动作标签是:useBeans动作、setProperty动作、getProperty动作。

 

 Web.xml的作用

web.xml文件是用来初始化配置信息:比如Welcome页面、servlet、servlet-mapping、filter、listener、启动加载级别等。

 

JSP的常用指令

三个编译指令为:page、include、taglib。
七个动作指令为:jsp:forward、jsp:param、jsp:include、jsp:plugin、jsp:useBean、jsp:setProperty、jsp:getProperty。

 

什么情况下调用doGet()和doPost()?
调用doGet():直接地址栏输入URL,或者超链接,或者form的method为默认或get。
调用doPost():Form的method为post时。

get和post是请求方式。一般get携带的信息量有限制,而且他的内容会在显示栏里面出现,不安全。post可携带大量数据,并且信息不回出现在显示栏里比较安全。当实现查询功能时适合用get。get效率比post高些

 

servlet的init()方法和service()方法的区别
(1) init() 方法
在 Servlet 的生命期中,仅执行一次 init() 方法。它是在服务器装入 Servlet 时执行的。 可以配置服务器,以在启动服务器或客户机首次访问 Servlet 时装入 Servlet。 无论有多少客户机访问 Servlet,都不会重复执行 init() 。

(2) service() 方法
service() 方法是 Servlet 的核心。每当一个客户请求一个HttpServlet 对象,该对象的service() 方法就要被调用,而且传递给这个方法一个"请求"(ServletRequest)对象和一个"响应"(ServletResponse)对象作为参数。 在 HttpServlet 中已存在 service() 方法。缺省的服务功能是调用与 HTTP 请求的方法相应的 do 功能。例如, 如果 HTTP 请求方法为 GET,则缺省情况下就调用 doGet() 。Servlet 应该为 Servlet 支持的 HTTP 方法覆盖 do 功能。因为 HttpServlet.service() 方法会检查请求方法是否调用了适当的处理方法,不必要覆盖 service() 方法。只需覆盖相应的 do 方法就可以了

jsp和servlet的区别:

        1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识别JSP的代码,Web容器将JSP的代码编译成JVM能够识别的java类)

        2.jsp更擅长表现于页面显示,servlet更擅长于逻辑控制.

        3.Servlet中没有内置对象,Jsp中的内置对象都是必须通过HttpServletRequest对象,HttpServletResponse对象以及HttpServlet对象得到.

        4.Jsp是Servlet的一种简化,使用Jsp只需要完成程序员需要输出到客户端的内容,Jsp中的Java脚本如何镶嵌到一个类中,由Jsp容器完成。而Servlet则是个完整的Java类,这个类的Service方法用于生成对客户端的响应。

 

联系:JSP是Servlet技术的扩展,本质上就是Servlet的简易方式。JSP编译后是“类servlet”。Servlet和JSP最主要的不同点在于,Servlet的应用逻辑是在Java文件中,并且完全从表示层中的HTML里分离开来。而JSP的情况是Java和HTML可以组合成一个扩展名为.jsp的文件。JSP侧重于视图,Servlet主要用于控制逻辑

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值