Servlet
是什么?
是 Server 与 Applet 的缩写,是服务端小程序的意思。使用 Java 语言编写的服务器端程序,可以像生成动态的 WEB 页,Servlet
主要运行在服务器端,并由服务器调用执行, 是一种按照 Servlet 标准来开发的类。 是 SUN 公司提供的一门用于开发动态 Web 资源的技术。(言外之意:要实现 web 开发,需要实现 Servlet
标准)
Servlet
工作流程:
- 通过请求头获知浏览器访问的是哪个主机
- 再通过请求行获取访问的是哪个一个web应用
- 再通过请求行中的请求路径获知访问的是哪个资源
- 通过获取的资源路径在配置中匹配到真实的路径,
- 服务器会创建
servlet
对象,(如果是第一次访问时,创建servlet
实例,并调用init
方法进行初始化操作) - 调用service(request, response)方法来处理请求和响应的操作
- 调用service完毕后返回服务器 由服务器讲response缓冲区的数据取出,以
http
响应的格式发送给浏览器
Servlet
的生命周期
Servlet
没有 main()方法,不能独立运行,它的运行完全由 Servlet
引擎来控制和调度。 所谓生命周期,指的是servlet
容器何时创建 servlet
实例、何时调用其方法进行请求的处理、 何时并销毁其实例的整个过程。
- 实例和初始化时机
当请求到达容器时,容器查找该servlet
对象是否存在,如果不存在,则会创建实例并进行初始化。 - 就绪/调用/服务阶段
有请求到达容器,容器调用servlet
对象的 service()方法,处理请求的方法在整个生命周期中可以被多次调用;HttpServlet
的 service()方法,会依据请求方式来调用doGet()
或者doPost()
方法。但是, 这两个 do 方法默认情
况下,会抛出异常,需要子类去 override。 - 销毁时机
当容器关闭时(应用程序停止时),会将程序中的Servlet
实例进行销毁。
上述的生命周期可以通过Servlet
中的生命周期方法来观察。在Servlet
中有三个生命周 期方法,不由用户手动调用,而是在特定的时机有容器自动调用,观察这三个生命周期方法 即可观察到Servlet
的生命周期。
init
方法,在 Servlet
实例创建之后执行(证明该 Servlet
有实例创建了)
public void init(ServletConfig config) throws ServletException {
System.out.println("实例创建了...");
}
service 方法,每次有请求到达某个 Servlet
方法时执行,用来处理请求(证明该Servlet
进行服务了)
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("服务调用了...");
}
destroy 方法,Servlet
实例销毁时执行(证明该 Servlet
的实例被销毁了)
public void destroy() {
System.out.println("实例销毁了...");
}
Servlet
的生命周期,简单的概括这就分为四步:servlet
类加载–>实例化–>服务–>销毁。
HttpServletRequest
对象
//常用方法
// 获取客户端请求的完整URL (从http开始,到?前面结束)
String url = request.getRequestURL().toString();
System.out.println("获取客户端请求的完整URL:" + url);
// 获取客户端请求的部分URL (从站点名开始,到?前面结束)
String uri = request.getRequestURI();
System.out.println("获取客户端请求的部分URL:" + uri);
// 获取请求行中的参数部分
String queryString = request.getQueryString();
System.out.println("获取请求行中的参数部分:" + queryString);
// 获取客户端的请求方式
String method = request.getMethod();
System.out.println("获取客户端的请求方式:" + method);
// 获取HTTP版本号
String protocol = request.getProtocol();
System.out.println("获取HTTP版本号:" + protocol);
// 获取webapp名字 (站点名)
String webapp = request.getContextPath();
System.out.println("获取webapp名字:" + webapp);
获取请求参数:
//常用方法
// 获取指定名称的参数,返回字符串
String uname = request.getParameter("uname");
System.out.println("uname的参数值:" + uname);
// 获取指定名称参数的所有参数值,返回数组
String[] hobbys = request.getParameterValues("hobby");
System.out.println("获取指定名称参数的所有参数值:" + Arrays.toString(hobbys));
乱码问题
//请求端和响应端编码格式不一致
request.setCharacterEncoding("UTF-8");
//借助了String 对象的方法,该种方式对任何请求有效,是通用的。
new String(request.getParameter(name).getBytes("ISO-8859-1"),"UTF-8");