Servlet的存在就是要为客户服务。servlet的任务是得到一个客户的请求,再发回一个响应。
1 servlet的生命周期
加载类 |
容器加载servlet类。 |
初始化servlet |
Servlet类的无参构造函数运行。 |
init() |
在service()方法被调用之前执行,且Servlet在整个生命周期中,值执行一次。 |
service() |
处理客户请求,有这个方法决定调用哪个方法(doGet或doPost 或者其他)。 |
destory() |
容器调用这个方法,在servlet被回收前有机会清理资源。 |
表 servlet的生命周期
1.1 init() 方法
构造函数只是使Servlet类成为一个对象,而执行完init()是成为一个Servlet。
在执行init()方法期间,将会访问到ServletConfig及ServletContext对象。
ServletConfig |
|
ServletContext |
|
表 ServletConfig和ServletContext对象
2 HTTP方法
GET |
从服务器获取资源。 |
POST |
用于向服务器提交数据、创建新的资源。通常用于提交表单数据、发送数据到服务器上的数据库或进行身份验证。 |
HEAD |
只要求得到GET返回结果的首部部分。 |
TRACE |
要求请求信息回送,以便客户可以看到中间服务器进行了哪些进度或增量,一般用于测试。 |
PUT |
更新资源。主要用来传输文件,就像FTP协议的文件上传一样。但是因为HTTP/1.1 的PUT方法不带验证机制,存在安全性问题,所以一般都不用这个方法进行文件传输。 |
DELETE |
用于删除服务器上的资源。 |
OPTIONS |
用于向服务器请求关于支持的方法、认证信息和可接受的内容类型等信息。 |
CONNECT |
要求连接以便建立隧道。 |
表 http常见方法
2.1 幂等操作
幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
GET、HEAD和PUT方法是幂等的。
3 请求 HttpServletRequest
getParameteValue() 是用来从请求中得到一个参数。返回值总是一个String。
如果对应一个给定的参数名有多个参数值,要使用getParameteValues()方法来返回一个String数组。
getReader()和getInputStream()方法:只包含请求体和不包含请求头。
getHeader()和getIntHeader()方法:获取请求头信息。
getRemotePort() |
获取客户的端口。 |
getServerPort() |
获取服务器所监听的端口。 |
getLocalPort() |
服务器会为每个请求线程找一个不同的本地端口,该方法获取的就是这个本地端口。 |
表 getServletPort()、getLocalPort()和getRemotePort()方法对比
4 实战
编写一个Servlet,要求打印出其生命周期中各个节点,同时编写Servlet对应的多个HTTP方法,获取相关请求参数及做出响应。文章来源:https://www.toymoban.com/news/detail-694416.html
public class LifeServlet extends HttpServlet {
public LifeServlet() {
System.out.println("LifeServlet 无参数构造函数");
}
@Override
public void init() throws ServletException {
super.init();
System.out.println("LifeServlet init()");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.service(req, resp);
System.out.println("LifeServlet service()");
}
@Override
public void destroy() {
super.destroy();
System.out.println("LifeServlet destroy");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost");
}
// 运行结果:
// LifeServlet 无参数构造函数 // 在第一次发起该servlet请求时触发
// LifeServlet init()
// doGet
// LifeServlet service()
// ... // 停止tomcat
// LifeServlet destroy
}
public class HttpMethodsServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("param1:" + req.getParameter("params1"));
String[] param2s = req.getParameterValues("param2");
System.out.println("param2:" + Arrays.asList(param2s));
System.out.println("headNames:" + req.getHeaderNames());
BufferedReader reader = req.getReader();
System.out.println("reader:" + reader.readLine());
PrintWriter writer = resp.getWriter();
writer.println("hello response");
reader.close();
writer.close();
}
@Override
protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doOptions(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doHead(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
@Override
protected void doTrace(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<servlet>
<servlet-name>lifeServlet</servlet-name>
<servlet-class>controller.LifeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>lifeServlet</servlet-name>
<url-pattern>/lifeServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>httpMethodsServlet</servlet-name>
<servlet-class>controller.HttpMethodsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>httpMethodsServlet</servlet-name>
<url-pattern>/httpMethods</url-pattern>
</servlet-mapping>
</web-app>
web.xml文章来源地址https://www.toymoban.com/news/detail-694416.html
到了这里,关于Servlet 请求和响应的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!