Q:什么是servlet
A:Java Servlet是运行在web服务器或应用服务器上的程序,它是作为web服务器或其他HTTP客户端的请求和HTTP服务端的数据库或应用程序的中间层.
Q:作用是什么呢?
A:处理客户端请求并将结果返回给客户端,一问一答.
Q:servlet的生命周期
A:servlet的生命周期分为三个部分:初始化,运行阶段,结束销毁阶段.
初始化阶段:servlet容器读取servlet类的class文件到内存中,创建servletconfig对象,这个文件中包含一系列的配置信息,创建servlet对象,调用init()方法,这个方法只会在创建的时候调用一次,无论以后访问多少次这个servlet,都不会再次创建.
运行阶段:servlet接受到一个客户端请求时,会在容器中创建servletRequest和servletResponse对象,然后调用service方法,并将两个对象传到service方法中,程序会将客户端的请求封装到servletRequest对象中,并在服务端进行处理,将处理结果封装到servletResponse对象中返回给客户端,同时销毁创建的两个对象.
销毁阶段:当web服务器关闭,servlet调用destory方法时,销毁servlet相关对象,释放资源和内存.
Q:get,post,put,delete请求的区别
A:get请求主要是获取服务器上的数据,用于查询;post是与服务器发生交互,创建新的种类,主要是用于新增;put是向服务器提交数据,修改数据信息,不会新增种类,相当于update;delete则是删除某个资源的.
下面我们来详细说书偶这两个有post和get请求的区别:
get:通过url将数据信息传送给服务器,从服务器上获取数据,效率高,安全差,因为url会暴露数据信息,同时get请求一般都会有大小的限制(虽然http协议没有对其进行限制,但是浏览器进行了,一般是2kb左右).
post:将参数封装到表单中,传递给服务器并下载数据的操作,但是效率不如get请求,安全性较高些,post请求一般的大小和服务器配置以及内存大小有关.
Q:get,post请求编码格式设置
A:tomcat容器时:get请求一般是在server.xml中将URIEncoding设置成你需要的编码格式,例如URIEncoding="UTF-8" ;
post请求时如果是在jsp页面需要charset设置成需要的编码格式,或者在servlet请求时使用request.setCharacterEncoding设置自己需要的编码格式,但是需要设置在方法第一步.
Q:servlet的实现方式
A:servlet通常有三种实现方式:一种是通过实现servlet接口;一种是继承GenericServlet抽象类,重写service方法;一种是继承Httpservlet抽象类,重写doGet和doPost方法.其中最常用的继承HttpServlet这个抽象类的:为大家展示一个示例:
package com.hydee.servlet.test;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class ServletDemo4 extends HttpServlet{
//ServletDemo4的hashCode
private static final long serialVersionUID = 658050167L;
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//如果要想显示中文,则即必须在获取流之前,先添加如下的代码,设置好解析用的字符集
resp.setContentType("text/html;charset=utf-8");
PrintWriter out = resp.getWriter();
//这个字符串里的内容就是在浏览器上显示的内容
String str = "<html><title></title><body>你好Hello World Servlet!!!</body></html>";
//将流中的内容写出去,
out.println(str);
out.flush();
out.close();
System.out.println("doget...");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PrintWriter out = resp.getWriter();
String str = "<html><title></title><body>你好Hello World Servlet!!!</body></html>";
out.println(str);
out.flush();
out.close();
System.out.println("dopost...");
}
}
其web.xml文件配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0"
metadata-complete="true">
<!-- 配置和映射 Servlet -->
<servlet>
<servlet-name>my</servlet-name>
<servlet-class>com.hydee.servlet.test.ServletDemo4</servlet-class>
<!--
指定Servlet被创建的顺序
若为>=0,则在当前Web应用被Servlet容器加载时创建该Servlet实例(若为负数则还是在第一次访问服务器时创建)
数值越小越早被创建
-->
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 一个servlet节点可以和多个servlet-mapping节点相匹配,也就是说一个servlet可以有多个虚拟路径 -->
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/demo4</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>my</servlet-name>
<url-pattern>/2.jsp</url-pattern>
</servlet-mapping>
</web-app>
注释:外界访问servlet需要通过url映射完成,其在web.xml通过两个标签完成<servlet>和<servlet-mapping>,其中<servlet>中两个标签<servlet-name>对应注册名称,<servlet-class>对应完整的类名;<servlet-mapping>中的两个标签<servlet-name>对应注册名称,<url-pattern>对应映射的url地址.<servlet>中的标签<load-on-startup>设置servlet的创建顺序,这个标签的存在表示web容器在启动时会创建servlet容器并调用其中额init()方法.数字越小,加载的顺序越靠前.
Q:servlet和jsp的区别
A:servlet和jsp页面本质上说一样的,但是servlet更注重业务逻辑的处理,而jsp更注重效果的展示.
Q:servlet中的内置对象和作用域
A:servlet中有九大内置对象:
request(Request),response(page),out(page),session(session),page(page),pageContext(page),config(page),application(application),exception(page);
作用域解释:
application:全局共享,生命周期从应用程序启动到结束
session:一次会话,生命周期是会话创建到会话结束或者服务器强制关闭
request:一次请求
page:一个jsp页面
Q:servlet中的过滤器
A:servlet中的过滤器通过实现filter接口,重写init,doFilter和destory方法实现,其主要目的是为了设置编码集,过滤url和ip.
Q:servlet中的监听器
A:servlet中的监听器通过实现接口HttpSessionListener,其中监听器的级别有application级别,全局监听;session级别,监听会话;request级别,监听一个请求.在web.xml中的标签<listener>标签中配置.
Q:cookie和session的区别
A:session和cookie都是用来存储信息的,只不过session存储在服务端,cookie存储在客户端;当浏览器访问服务器时,会将域名下的所有cookie都发送给我们的服务器,服务器会根据cookie中的JsessionId信息查询到对应的session,从而获取到相关的有用信息,如果没有JseesionId,服务器就会调用request.getsession()这个方法创建一个session,并将其id作为返回值包含在cookie中返回给客户端.虽然两者都是用户存储信息,但是由于cookie中的信息是可以见到,安全性不高,一般都会设置过期时间和存放一些不是特别重要的信息.