调用流程
service()
如果浏览器是用get方式提供数据,那么我们的servlet就得提供一个doGet方法,
下面这些就是get方式:
form默认的提交方式
如果通过一个超链访问某个地址
如果在地址栏直接输入某个地址
ajax指定使用get方式的时候
如果是用的post方式,就得提供doPost方法
post的方式有:
form的method指定的post的时候
ajax指定的post方式的时候
除此之外,无论是get还是post方式,在执行对应方法之前,都会先执行service()方法,来判断浏览器到底是弄的post还是get,
而且service(),doGet(),doPost()的方法参数都是一样的,所以我们可以通过重写service()方法来提供服务,这样就不用去区分到底是post还是get啦,
Servlet生命周期
一个Servlet的生命周期由 实例化,初始化,提供服务,销毁,被回收 几个步骤组成
实列化:当用户在浏览器输入一个地址的时候,这个地址对应的的servlet就会被实列化(只会一次),可以写个无参的构造方法看一下,只会执行一次。
初始化:因为servlet继承了HttpServlet,所以继承了个init(ServletConfig)的方法,可以通过重写一个方法看到,初始化也只会初始一次。
提供服务:就是执行咱的业务代码啦。
销毁:destory(),在重启web或者关闭tomcat 的时候会调用一次。
被回收:被销毁的碰到GC来临就会被回收啦。
跳转
分为服务端跳转和客户端跳转:
if("admin".equals(name) && "123".equals(password))
{
request.getRequestDispatcher("success.html").forward(request,response);//这叫服务端跳转,地址不会变化
}
else
{
response.sendRedirect("fail.html");//这是客户端跳转,地址会发生变化
}
自启动
因为如果没有用户访问,servlet就不会开始生命周期,但有时候会需要在tomcat的启动的时候,就产生一定业务工作,这就会用到自启动。
在servlet的init()方法中写好业务代码,然后在web.xml中配置对应servlet的地方加上一句<load-on-startup>10</load-on-startup>(这里面的数字越小启动的优先级越高),就能实现在tomcat启动的同时,执行初始化init()方法中的内容,
request方法
常见方法;
request.getRequestURL(): 浏览器发出请求时的完整URL,包括协议 主机名 端口(如果有)"
request.getRequestURI(): 浏览器发出请求的资源名部分,去掉了协议和主机名"
request.getQueryString(): 请求行中的参数部分,只能显示以get方式发出的参数,post方式的看不到
request.getRemoteAddr(): 浏览器所处于的客户机的IP地址
request.getRemoteHost(): 浏览器所处于的客户机的主机名
request.getRemotePort(): 浏览器所处于的客户机使用的网络端口
request.getLocalAddr(): 服务器的IP地址
request.getLocalName(): 服务器的主机名
request.getMethod(): 得到客户机请求方式一般是GET或者POST
获取参数:
request.getParameter(): 是常见的方法,用于获取单值的参数
request.getParameterValues(): 用于获取具有多值的参数,比如注册时候提交的 "hobits",可以是多选的。
request.getParameterMap(): 用于遍历所有的参数,并返回Map类型。
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import java.util.Set;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class RegisterServlet extends HttpServlet{
protected void service(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException{
System.out.println("获取单值参数name:"+request.getParameter("name"));
String[] hobits=request.getParameterValues("hobits");
System.out.println("获取具有多值的战术hobits:" + Arrays.asList(hobits));
System.out.println("通过getParameterMAP 遍历所有参数:");
Map<String,String[]> parameters=request.getParameterMap();
Set<String> paramNames=parameters.keySet();
for(String param : paramNames)
{
String[] value = parameters.get(param);
System.out.println(param+ ":" + Arrays.asList(value));
}
}
}
获取头信息:
request.getHeader() 获取浏览器传递过来的头信息。
比如getHeader("user-agent") 可以获取浏览器的基本资料,这样就能判断是firefox、IE、chrome、或者是safari浏览器
request.getHeaderNames() 获取浏览器所有的头信息名称,根据头信息名称就能遍历出所有的头信息
在本例,修改HelloServlet,使其获取头信息
访问HelloServlet获取如下头信息:
host: 主机地址
user-agent: 浏览器基本资料
accept: 表示浏览器接受的数据类型
accept-language: 表示浏览器接受的语言
accept-encoding: 表示浏览器接受的压缩方式,是压缩方式,并非编码
connection: 是否保持连接
cache-control: 缓存时限
response方法
PrintWriter pw= response.getWriter();
通过response.getWriter(); 获取一个PrintWriter 对象
可以使用println(),append(),write(),format()等等方法设置返回给浏览器的html内容。
response.setContentType("text/html");
"text/html" 是即格式 ,在request获取头信息 中对应的request.getHeader("accept").
"text/html" 是存在的,表示浏览器可以识别这种格式,如果换一个其他的格式, 比如 "text/lol" ,浏览器不能识别,那么打开此servlet就会弹出一个下载的对话框。
这样的手段也就常常用于实现下载功能
设置编码的两种方式:
1. response.setContentType("text/html; charset=UTF-8");
不仅发送到浏览器的内容会使用UTF-8编码,而且还通知浏览器使用UTF-8编码方式进行显示。所以总能正常显示中文
2. response.setCharacterEncoding("UTF-8");
仅仅是发送的浏览器的内容是UTF-8编码的,至于浏览器是用哪种编码方式显示不管。 所以当浏览器的显示编码方式不是UTF-8的时候,就会看到乱码,需要手动再进行一次设置。
设置不适用缓存:
使用缓存可以加快页面的加载,降低服务端的负担。但是也可能看到过时的信息,可以通过如下手段通知浏览器不要使用缓存
response.setDateHeader("Expires",0 );
response.setHeader("Cache-Control","no-cache");
response.setHeader("pragma","no-cache");