概念
Servlet是运行在Web服务器上的如Tomcat上的java程序,用于接受客户端的请求和并且生成动态的网页内容。
它是一个java的类,可以处理Http这样的请求,并且返回如HTML页面和JSON这样的数据给浏览器
可能这样说会有些抽象,我来搞个很具体化的例子
例子:
就好像点菜吧,我们作为顾客,去点菜,就好像浏览器对服务器发送了请求,而服务器就像Web容器(如Tomcat)把请求转发到真正处理请求的人手上,也就是我们的厨师(Servlet),厨师也就是Servlet处理完食材(数据)后把它再利用服务员(Tomcat Web容器)响应回去。
Servlet的生命周期
Servlet 生命周期可被定义为从创建直到毁灭的整个过程。以下是 Servlet 遵循的过程:
- Servlet 通过调用 init () 方法进行初始化。
- Servlet 调用 service() 方法来处理客户端的请求。
- Servlet 通过调用 destroy() 方法终止(结束)。
- 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
init()方法
init方法是servlet进行工作前的准备,它不管多少人来访问它都只有一次init操作,在有人来访问url对应的servlet时候才会初始化,当然也可以设置为服务器启动的时候就执行init操作
public void init() throws ServletException {
// 初始化代码...
}
Service()方法
service方法就是执行实际任务的主要方法,servlet容器即web服务器就是调用service方法来处理来着客户端的请求的,并返回格式化的响应,会按照请求执行doGet、doPost、doPut、doDelete等方法
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
一般来要写处理逻辑只要重载这些方法就好了
destroy()方法
当服务器关闭时(注意不是请求结束)会启动来释放资源,关闭线程,关闭数据库连接
调用这个方法后servlet对象会被标记成垃圾回收
public void destroy() {
// 终止化代码...
}
//servlet生命周期,的三个方法,1.被创建,执行且只执行一次init方法,2.提供服务,执行service方法,执行多次 3.被销毁,当Servlet服务器正常关闭时,执行destroy方法,只执行一次。
@Override
public void init() throws ServletException {
// TODO Auto-generated method stub
super.init();
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.service(req, resp);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
super.destroy();
}
Servlet的实例
servlet是一个接口,可以通过实现它来扩展功能,处理Http请求
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// 扩展 HttpServlet 类
public class HelloWorld extends HttpServlet {
private String message;
public void init() throws ServletException
{
// 执行必需的初始化
message = "Hello World";
}
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html");
// 实际的逻辑是在这里
PrintWriter out = response.getWriter();
out.println("<h1>" + message + "</h1>");
}
public void destroy()
{
// 什么也不做
}
}
Servlet处理表单数据
表单数据
表单数据是用户在网页上填写的信息,这些信息通过http请求发给服务器进行处理,如用户名,地址呀这些
通常通过POST和GET方式请求发送
俩者发送表单请求的区别
当我们用Post请求发送表单数据的时候可以指定表单数据的类型,也就是咱们开发的时候经常用到的
Content-Type
现在的开发几乎都是json发送一些小型信息
使用Servlet读取表单数据
如何使用Servlet读取表单数据呢?
Servlet获取表单数据有三个api来应对不同的场景
getParameter():当前端是单值字段(如文本框)这种只有单值的情景,就可以调用getParameter来获取这个单值,如果有多个值只获取第一个
getParameterValues():如果参数是类似复选框这种参数出现一次以上的,适合使用这个api获取多值
getParameterNames():如果想获取所有参数的完整的列表就用这个api,会遍历所有参数
从GET或者POST的URL获取表单数据
<!DOCTYPE html>
<html>
<head>
<title>GET 表单示例</title>
</head>
<body>
<h2>请输入你的信息:</h2>
<form action="hello" method="get">
用户名:<input type="text" name="username"><br><br>
年龄:<input type="text" name="age"><br><br>
<input type="submit" value="提交">
</form>
</body>
</html>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class HelloServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
// 获取请求中的参数
String username = request.getParameter("username");
String ageStr = request.getParameter("age");
int age = 0;
if (ageStr != null && !ageStr.isEmpty()) {
age = Integer.parseInt(ageStr);
}
// 输出响应内容
PrintWriter out = response.getWriter();
out.println("<h2>你好," + username + "!</h2>");
out.println("<p>你今年 " + age + " 岁。</p>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
这是一个Demo,从GET或者POST请求的URL请求中获取表单数据
那如果是复选数据呢?
将复选框的数据传递到Servlet程序
<html>
<body>
<form action="CheckBox" method="POST" target="_blank">
<input type="checkbox" name="maths" checked="checked" /> 数学
<input type="checkbox" name="physics" /> 物理
<input type="checkbox" name="chemistry" checked="checked" />
化学
<input type="submit" value="选择学科" />
</form>
</body>
</html>
// 导入必需的 java 库
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
// 扩展 HttpServlet 类
public class CheckBox extends HttpServlet {
// 处理 GET 方法请求的方法
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// 设置响应内容类型
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String title = "读取复选框数据";
String docType =
"<!doctype html public \"-//w3c//dtd html 4.0 " + "transitional//en\">\n";
out.println(docType +
"<html>\n" +
"<head><title>" + title + "</title></head>\n" +
"<body bgcolor=\"#f0f0f0\">\n" +
"<h1 align=\"center\">" + title + "</h1>\n" +
"<ul>\n" +
" <li><b>数学标识:</b>: "
+ request.getParameter("maths") + "\n" +
" <li><b>物理标识:</b>: "
+ request.getParameter("physics") + "\n" +
" <li><b>化学标识:</b>: "
+ request.getParameter("chemistry") + "\n" +
"</ul>\n" +
"</body></html>");
}
// 处理 POST 方法请求的方法
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
使用getParameterNames()读取所有表单参数
通过使用getParametersNames方法读取所有的可用的表单参数,这个方法会返回一个枚举值,可以遍历
<!DOCTYPE html>
<html>
<head>
<title>getParameterNames 示例</title>
</head>
<body>
<h2>请输入你的信息:</h2>
<form action="print" method="get">
用户名:<input type="text" name="username"><br><br>
年龄:<input type="text" name="age"><br><br>
爱好:
<input type="checkbox" name="hobby" value="读书">读书
<input type="checkbox" name="hobby" value="运动">运动
<input type="checkbox" name="hobby" value="编程">编程
<br><br>
<input type="submit" value="提交">
</form>
</body>
</html>
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class PrintParamsServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// 设置响应类型
response.setContentType("text/html;charset=UTF-8");
// 获取 PrintWriter 输出流
PrintWriter out = response.getWriter();
// 打印 HTML 页面头
out.println("<h2>你提交的参数如下:</h2>");
out.println("<ul>");
// 获取所有参数名
java.util.Enumeration<String> paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = paramNames.nextElement();
String[] paramValues = request.getParameterValues(paramName);
out.print("<li>" + paramName + " : ");
if (paramValues.length == 1) {
out.print(paramValues[0]);
} else {
out.print("<ul>");
for (String value : paramValues) {
out.print("<li>" + value + "</li>");
}
out.print("</ul>");
}
out.println("</li>");
}
out.println("</ul>");
out.println("<a href='index.html'>返回</a>");
}
}