前言
学一学Java Web 三大组件之一Servlet。
简介
Servlet 是运行在Web服务器或者应用服务器上的Java程序,用来接收并响应来自Web客户端的请求。
创建servlet实例
IDEA创建HelloServlet类
,并实现servlet接口
package com.guigu.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @author cseroad
*/
public class HelloServlet implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//处理请求并响应数据
System.out.println("serlvet 被访问");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
并修改web.xml文件,给servlet配置上可访问的URI映射地址
HelloServlet
com.guigu.servlet.HelloServlet
HelloServlet
/hello
当访问 http://localhost:8080/Servlet/hello 时,就会映射到HelloServlet这个serlvet,进而查找到com.guigu.servlet.HelloServlet
这个类。
过程如下:
Web客户端访问地址和端口,找到tomcat服务,进而访问Servlet工程,然后找到eclipse的Servlet工程下的hello,通过web.xml的url-pattern配置信息,找到映射的HelloServlet 程序,进而找到com.guigu.servlet.HelloServlet
类名执行到service方法。
Servlet 生命周期
Servlet的生命周期定义了一个Servlet如何被加载、初始化、处理响应数据、销毁。
创建HelloServlet
来观察Servlet 的生命周期。
package com.guigu.servlet;
import javax.servlet.*;
import java.io.IOException;
/**
* @author cseroad
*/
public class HelloServlet implements Servlet {
public void HelloServlet(){
System.out.println("1. 构造器方法");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2. init初始化方法");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
//处理请求并响应数据
System.out.println("serlvet 被访问");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4. destroy 销毁方法");
}
}
生命周期主要阶段如下:
1、执行Servlet构造器方法
2、执行init()
初始化方法
3、执行service()
方法
4、执行destroy()
销毁方法
过程如下:
当创建Servlet时,会调用构造器方法(只会调用一次),创建 Servlet 的实例对象。并调用 init()
方法,完成Servlet实例对象的初始化(只会调用一次);
然后web客户端每次访问该serlvelt时,都会执行service()
方法;
当Web工程停止或重启时,再执行destory()
方法;
Servlet的三种创建方式
Servlet-api.jar包提供了三个基本接口或类用于创建Servlet:
- 实现javax.servlet.Servlet接口
- 继承javax.servet.GenericServlet类
- 继承javax.servlet.http.HttpServlet类
而他们的关系是HttpServlet
类继承GenericServlet
类, GenericServlet
类是实现的 Servlet
接口。
如创建一个HelloServlet2
类,继承HttpServlet
类,并重写doGet()
和doPost()
方法来体现请求的分发处理(即GET请求和POST请求)。
package com.guigu.servlet;
import java.io.IOException;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet2 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("helloservlet的doget方法");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("helloservlet的dopost方法");
}
}
并配置web.xml
Servlet2
com.guigu.servlet.Servlet2
Servlet2
/hello2
再编写index.html,使用不同的HTTP请求访问地址
HelloServlet2就会根据客户端不同的HTTP请求方式自动调用doget()
、dopost()
方法。
过程如下:
1、编写类继承HttpServlet
类;
2、重写doGet()
和doPost()
方法;
3、再配置web.xml
ServletConfig 对象
ServletConfig对象是由每个Servlet的Web容器创建的。这个对象可用于从web.xml文件中获取配置信息。
在web.xml添加一些键值对,用来后续操作ServletConfig对象的方法。
Servlet2
com.guigu.servlet.Servlet2
Servlet2
/hello2
HelloServlet
com.guigu.servlet.HelloServlet
username
root
HelloServlet
/hello
在初始化方法里添加操作ServletConfig对象的方法。
如:
getServletName()
表示获取当前Servlet在web.xml中配置的名字;
getInitParameter(String name)
表示获取当前Servlet指定名称的初始化参数值;
getInitParameterNames()
表示获取当前Servlet所有初始化参数的名字组成的枚举;
getServletContext()
表示获取当前web应用的ServletContext对象;
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2. init初始化方法");
String servletName = servletConfig.getServletName();
System.out.println("HelloServlet程序的别名是:"+servletName);
System.out.println("HelloServlet程序的别名是:"+servletConfig.getServletName());
System.out.println("初始化参数username的值是:"+servletConfig.getInitParameter("username"));
System.out.println("当前ServletContext对象值是:"+servletConfig.getServletContext());
}
ServletContext 对象
当WEB容器在启动时,它会为每个Web应用程序都创建一个对应的ServletContext,它代表当前Web应用。并且它会被所有客户端共享。
在继承HttpServlet
类的doGet()
方法里操作ServletContext对象。
如:
getInitParameter()
表示获取web.xml配置上下文参数context-para;
getContextPath()
表示获取当前工程路径;
getRealPath()
表示获取应用部署绝对地址;
setAttribute(String name, Object obj);
表示设置指定元素上的某个属性值;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("servlet2的doget方法");
ServletContext context = getServletConfig().getServletContext();
String username = context.getInitParameter("username");
//获取web.xml配置上下文参数context-param
System.out.println("context-param 参数username的值是"+username);
System.out.println("当前工程路径是"+context.getContextPath());
System.out.println("当前应用部署路径是"+context.getRealPath("/"));
context.setAttribute("name", "小明");
Object name = context.getAttribute("name");
System.out.println(name);
}
HttpServletRequest 对象
通过HttpServletRequest 对象获取客户端所有的请求信息。
如:
getRequestURL()方法
,表示返回客户端发出请求时的完整URL;
getHeaderNames()方法
,表示获取客户端请求头信息;
getParameter() 方法
,表示获取客户端单选框请求参数;
getParameterValues(String name)方法
,表示获取客户端复选框请求参数;
setCharacterEncoding()方法
,表示设置字符集编码格式;
简单制作表单并映射到Servlet2上。
demo.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
Servlet2类的doGet()
方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("URI地址:"+request.getRequestURI());
// 设置UTF-8编码格式
request.setCharacterEncoding("UTF-8");
// 获取所有Header请求头并依次打印
Enumeration enums = request.getHeaderNames();
while (enums.hasMoreElements()) {
String headerName = (String) enums.nextElement();
String headerValue = request.getHeader(headerName);
System.out.print("" + headerName + ": ");
System.out.println(headerValue + "
");
}
//获取复选框值并存进array
System.out.println("选择的爱好"+ Arrays.asList(request.getParameterValues("hobby")));
}
HttpServletResponse 对象
通过HttpServletResponse 对象获取服务器的响应信息。
setContentType()方法
表示设置响应编码格式;
getOutputStream()方法
,表示获取字节流向客户端浏览器输出;
getWriter()方法
,表示获取字符流向客户端浏览器输出;
比如在响应浏览器输出中文字符。
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String data = "中国";
OutputStream outputStream = response.getOutputStream();//获取OutputStream输出流
response.setHeader("content-type", "text/html;charset=UTF-8");
byte[] dataByteArr = data.getBytes("UTF-8");//将字符转换成字节数组,指定以UTF-8编码进行转换
outputStream.write(dataByteArr);//使用OutputStream流向客户端输出字节数组
}
Servlet 脑图
参考资料
https://blog.csdn.net/hu360983/article/details/114490231
https://www.bilibili.com/video/BV1Y7411K7zz?p=189
https://codeantenna.com/image/https://img-blog.csdn.net/20150111215251000