J2EE学习笔记 Servlet基础

调用流程

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");

学习网站:https://how2j.cn/p/4558

发布了82 篇原创文章 · 获赞 21 · 访问量 7947

猜你喜欢

转载自blog.csdn.net/qq_41658124/article/details/104374051