文章目录:
写在前面:再谈Servlet的生命周期
- 一个网站中所有的Servlet接口实现类的实例对象应该由Http服务器负责创建。
- 在正常情况下,只有在Tomcat接收到第一个针对当前Servlet接口实现类的请求时,才会创建其实例对象。通过命令干预,可以要求Tomcat在启动时自动创建Servlet接口实现类。具体命令如下:(web.xml)
<servlet> <servlet-name>...</servlet-name> <servlet-class>...</servlet-class> <load-on-startup>1</load-on-startup> <!--大于0的整数即可--> </servlet> <!-- 通过调用Servlet接口实现类的无参构造方法创建其实例对象 -->
3.一个Servlet接口实现类最多只能被创建一个实例对象。
4.在Tomcat关闭时负责销毁网站中所有的Servlet接口实现类的实例对象。
1.response对象
这里我通过 HttpServletResponse 接口来讲述一下我对 Servlet 中的 response 对象的理解。
介绍如下:
- HttpServletResponse 接口来自于Servlet规范。
- HttpServletResponse 接口实现类由Http服务器厂商提供。
- HttpServletResponse 接口可以将Servlet中的运行结果写入到响应包。
- 一般习惯将 HttpServletResponse 接口修饰的对象称为 响应对象。
主要功能:
- HttpServletResponse 接口负责将Servlet运行结果以二进制形式写入到响应包中的响应体。
- HttpServletResponse 接口负责设置响应包中响应头的content-type属性,控制浏览器采用对应的解析器和编译器对响应体中的二进制数据进行处理。
- HttpServletResponse 接口负责将一个请求地址写入到响应头中的location属性中,来控制浏览器下一次请求的方式。
下面给出我在IDEA中配置的Tomcat的相关信息。
1.1 第一个例子
实现功能:HttpServletResponse 接口负责将Servlet运行结果以二进制形式写入到响应包中的响应体。
resp.getWriter().write("this is response"); 将数据打印到浏览器中
resp.getWriter().write("<b>this is response</b>"); 将数据打印到浏览器中,设置文本为html可执行html代码
package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
*
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String str="Hello Servlet!!!";//作为处理结果
//通过响应对象将结果以二进制形式写入到响应体
//通过响应对象向tomcat借一个输出流使用
PrintWriter out=resp.getWriter();
//通过输出流将结果以二进制形式写入到响应体
out.print(str);
}
//tomcat负责将响应包推送给发起请求的浏览器,浏览器接收到响应包之后解析响应体的内容并显示
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.songzihao.controller.OneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
</web-app>
1.2 第二个例子
实现功能:HttpServletResponse 接口负责设置响应包中响应头的content-type属性,控制浏览器采用对应的解析器和编译器对响应体中的二进制数据进行处理。
package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
/**
*
*/
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String str="Java<br/>MySQL<br/>HTML<br/>";
String str2="张三<br/>李四<br/>王五<br/>";
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
out.print(str);
out.print(str2);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>com.songzihao.controller.TwoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
</web-app>
1.3 第三个例子
实现功能:HttpServletResponse 接口负责将一个请求地址写入到响应头中的location属性中,来控制浏览器下一次请求的方式。
package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
*
*/
public class ThreeServlet extends HttpServlet {
/**
* 1.tomcat发现响应头中的location属性被赋值,此时将产生一个302状态码并写入到响应包中的状态行
* 2.tomcat负责推送响应包返回给发起请求的浏览器
* 3.浏览器接收到响应包之后,读取到状态行中的302状态码,此时浏览器直接读取响应头中的location属性中的地址,并更新到浏览器的地址栏
* 4.由于在浏览器启动时,自动生成一个线程对象用于扫描浏览器地址栏,当这个线程发现浏览器地址栏发生了变化,就会要求浏览器立刻根据新地址发起请求
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String url="http://www.baidu.com";
//通过响应对象将地址写入到响应头中的location
resp.sendRedirect(url);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>ThreeServlet</servlet-name>
<servlet-class>com.songzihao.controller.ThreeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ThreeServlet</servlet-name>
<url-pattern>/three</url-pattern>
</servlet-mapping>
</web-app>
2.request对象
这里我通过 HttpServletRequest 接口来讲述一下我对 Servlet 中的 request 对象的理解。
介绍如下:
- HttpServletRequest 接口来自于Servlet规范。
- HttpServletRequest 接口实现类由Http服务器厂商提供。
- HttpServletRequest 接口读取请求协议包中的内容。
- 一般习惯将 HttpServletRequest 接口修饰的对象称为 请求对象。
主要功能:
- HttpServletRequest 接口读取请求包中的请求行中的信息(url、method、uri、scheme)。
- HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。
- HttpServletRequest 接口代替浏览器向Tomcat索要资源文件。
2.1 第一个例子
实现功能:HttpServletRequest 接口读取请求包中的请求行中的信息(url、method、uri、scheme)。
package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
*
*/
public class OneServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//读取请求行中的url属性信息
String url=req.getRequestURL().toString();
//读取请求行中method的属性信息
String method=req.getMethod();
//读取请求行中的uri属性信息
//uri是从url中截取的一段字符串,格式:"/网站名/资源文件名",可以帮助tomcat进行资源定位
String uri=req.getRequestURI().toString();
//获取请求行中的协议信息
String scheme=req.getScheme();
System.out.println("url===" + url);
System.out.println("uri===" + uri);
System.out.println("method===" + method);
System.out.println("scheme===" + scheme);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>OneServlet</servlet-name>
<servlet-class>com.songzihao.controller.OneServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>OneServlet</servlet-name>
<url-pattern>/one</url-pattern>
</servlet-mapping>
</web-app>
2.2 第二个例子
实现功能:HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。
String name=req.getParameter("userName"); 这里的键值需要你的请求数据中的键值相对应,如果不存在,返回null。
package com.songzihao.controller;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
/**
*
*/
public class TwoServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
req.setCharacterEncoding("utf-8");
//1.读取指定的请求参数内容
String name=req.getParameter("userName");
String password=req.getParameter("password");
System.out.println("name===" + name);
System.out.println("password===" + password);
//读取本次请求中所有的请求参数名称,并将这些请求参数名封装到一个枚举对象返回
Enumeration paramNames=req.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName= (String) paramNames.nextElement();
String value=req.getParameter(paramName);
System.out.println("请求参数名===" + paramName + ",请求参数值===" + value);
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// doGet(req,resp);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>TwoServlet</servlet-name>
<servlet-class>com.songzihao.controller.TwoServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TwoServlet</servlet-name>
<url-pattern>/two</url-pattern>
</servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/myWeb/two" method="get">
用户名:<input type="text" name="userName"><br/>
密码:<input type="password" name="password"><br/>
<input type="submit" value="提交">
</form>
</body>
</html>
2.3 第三个例子
实现功能:HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。
String[] strings=request.getParameterValues("web"); 这里是对同键不同值的信息获取,同样的,如果fav不存在,返回null
package com.songzihao.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class ThreeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
String[] strings=request.getParameterValues("web");
for (String str : strings) {
System.out.println("技术===" + str);
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>ThreeServlet</servlet-name>
<servlet-class>com.songzihao.controller.ThreeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ThreeServlet</servlet-name>
<url-pattern>/three</url-pattern>
</servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/myWeb/three" method="get">
擅长的技术:<input type="checkbox" name="web" value="Java"/>Java
<input type="checkbox" name="web" value="MySQL"/>MySQL
<input type="checkbox" name="web" value="HTML">HTML<br/>
<input type="submit" value="提交">
</form>
</body>
</html>
2.4 第四个例子
实现功能:HttpServletRequest 接口读取请求包中请求头或者请求体中参数的信息。
package com.songzihao.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class FourServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String value=request.getParameter("info");
System.out.println("来自于请求头中的参数信息===" + value);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String value=request.getParameter("info");
System.out.println("来自于请求体中的参数信息===" + value);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>FourServlet</servlet-name>
<servlet-class>com.songzihao.controller.FourServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FourServlet</servlet-name>
<url-pattern>/four</url-pattern>
</servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/myWeb/four" method="get">
信息:<input type="text" name="info"/><br/>
<input type="submit" value="以get方式发送请求"/>
</form>
<form action="/myWeb/four" method="post">
信息:<input type="text" name="info"/><br/>
<input type="submit" value="以post方式发送请求"/>
</form>
</body>
</html>
2.5 第五个例子
实现功能:HttpServletRequest 接口代替浏览器向Tomcat索要资源文件。
package com.songzihao.controller;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.IOException;
public class FiveServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("FiveServlet处理了用户的第一个请求");
RequestDispatcher requestDispatcher=request.getRequestDispatcher("/five.html");
requestDispatcher.forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<servlet>
<servlet-name>FiveServlet</servlet-name>
<servlet-class>com.songzihao.controller.FiveServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>FiveServlet</servlet-name>
<url-pattern>/five</url-pattern>
</servlet-mapping>
</web-app>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
我是five.html
</body>
</html>