1.初始化
当一个 Servlet 被第一请求的时候,Servlet 引擎就初始化这个 Servlet,在这里是调用 init()方法完成必需的初始化工作。而且这个对象一致在内存中活动,Servlet 为后续的客户请求新建线程,直接调用Servlet 中的 service()方法提供服务,不再初始化 Servlet。
2.提供服务
当 Servlet 对象被创建以后,就可以调用具体的 service()方法为用户提供服务。
3.销毁
Servlet 被初始化以后一直再内存中保存,后续的访问可以不再进行初始化工作,当服务器遇到问题需要重新启动的时候,这些对象就需要被销毁,这时候 Servlet 引擎就会调用 Servlet 的 destroy()方法把内存中的 Servlet 对象销毁。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/helloServlet") // 请求路径,这里是注解开发,这样写就不需要写web.xml中的servlet-mapping了
public class HelloServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("HelloServlet 初始化");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet doGet 处理get请求");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("HelloServlet doPost 处理post请求");
}
@Override
public void destroy() {
System.out.println("HelloServlet 销毁");
}
}
常见方式
数据传送方式
服务器获取数据方式
传送的数据量
安全性
在用户刷新时
使用servlet最常见的操作就是页面传值给后台,后台接收处理后台,返回执行结果给前端。接收前端请求的值的方法为:req.getParameter("输入框的name的名字");
例子:下面我们从前端传递用户名和密码到后台,后台验证是否正确,然后将结果输出到控制台。前端输入对应的值,就可以测试结果了。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获得用户名
String userName = req.getParameter("userName");
// 获得密码
String userPassword = req.getParameter("userPassword");
if (userName.equals("admin") && userPassword.equals("123456")) {
System.out.println("验证通过");
} else {
System.out.println("验证失败");
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index</title>
</head>
<body>
<form action="/login" method="post">
用户名:<input type="text" name="userName" /><br>
密码:<input type="password" name="userPassword" /><br>
<input type="submit" value="提交" />
</form>
</body>
</html>
我们对上一个例子进行修改,将响应的结果告诉前端的用户,通常是通过req.setAttribute("消息名称", "消息内容");
,然后页面使用 ${消息名称} 就能取到值。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获得用户名
String userName = req.getParameter("userName");
// 获得密码
String userPassword = req.getParameter("userPassword");
if (userName.equals("admin") && userPassword.equals("123456")) {
// 把结果保存到请求中
req.setAttribute("message", "验证通过");
} else {
// 把结果保存到请求中
req.setAttribute("message", "验证失败");
}
// 转向
req.getRequestDispatcher("index.jsp").forward(req, resp);
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>index</title>
</head>
<body>
${message}
<form action="/login" method="post">
用户名:<input type="text" name="userName" /><br>
密码:<input type="password" name="userPassword" /><br>
<input type="submit" value="提交" />
</form>
</body>
</html>
我输入的是用户名是admin,密码是123456,测试结果如下:
servlet中,页面跳转有两种方式,重定向与转发。
区别一
重定向时浏览器上的网址改变 转发是浏览器上的网址不变
区别二
重定向实际上产生了两次请求 转发只有一次请求
区别三
重定向时的网址可以是任何网址 转发的网址必须是本站点的网址
重定向
发送请求 -->服务器运行–>响应请求,返回给浏览器一个新的地址与响应码–>浏览器根据响应码,判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址–>服务器运行–>响应请求给浏览器
转发:
发送请求 -->服务器运行–>进行请求的重新设置,例如通过request.setAttribute(name,value)–>根据转发的地址,获取该地址的网页–>响应请求给浏览器
详解
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。 转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。
书写区别
req.getRequestDispatcher("index.jsp").forward(req, resp); // 转发
resp.sendRedirect("index.jsp"); // 重定向
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.xdr630.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
在直接在servlet类名上面写以下注解,能达到同样的效果:
@WebServlet("/login")
package com.sponge.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@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");
}
}