一、概述
全称:server applet
java服务器的小程序,是javaweb非常重要的环境。主要作用是完成html和java后台代码的交互(请求《====》响应)
servlet是需要运行在java服务器(Tomcat)中的,符合http协议的
servlet的核心类核心接口:
javax.servlet和javax.servlet.http
javax.servlet.ServerException
javax.servlet.http.HttpServlet
javax.servlet.http.HttpServletRequest
javax.servlet.http.HttpServletResponse
javax.servlet.http.Session
javax.servlet.http.Cookie
二、创建servlet的三种方式
实现Servlet接口进行创建servlet
示例:
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
//注解,告诉服务器这个是我的servlet
@WebServlet("/Demo2")
public class Demo2 implements Servlet {
//此方法为使用ServletConfig这个对象初始化的servlet
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init方法");
}
//此方法为获取配置信息对象
@Override
public ServletConfig getServletConfig() {
System.out.println("取配置信息对象");
return null;
}
//核心方法,包含了doGet() 和doPost()方法
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("service方法");
//处理页面的乱码
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("哈哈哈");
}
//此方法为获取servlet详细信息的
@Override
public String getServletInfo() {
System.out.println("获取servlet详细信息");
return null;
}
//在tomcat关闭的时候进行销毁
@Override
public void destroy() {
System.out.println("销毁servlet");
}
}
继承GnericServlet创建servlet
示例:
import javax.servlet.GenericServlet;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* @author xue_yun_xiang
* @create 2021-04-08-17:55
*/
@WebServlet("/Demo3")
public class Demo3 extends GenericServlet {
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
servletResponse.setContentType("text/html;charset=utf-8");
servletResponse.getWriter().append("哈哈哈");
}
}
继承HttpServlet创建servlet
优点:
1.可以减少对其他方法的要求 init destroy
2.可以根据前端的要求进行分门别类 doGet doPost
示例:
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("/demo1")
public class Demo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
//控制台打印
System.out.println("哈哈哈");
//页面显示
resp.getWriter().append("这是页面显示的内容");
}
}
三、servlet注解和配置文件的写法
1、注解写法,对servlet的版本有要求,servlet3.0及以上的版本才可以使用注解
2、还有一种写法配置文件写法。对版本没有要求
注解的写法
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;
//name 是servlet的名字 对应配置文件中的<servlet-name>
//value 是servlet程序对应的url 只能写一个
//urlPatterns和配置文件中的url-pattern 可以写多个
//loadOnStartup servlet启动的时候是否会自动加载 1 自动加载 -1不加载
@WebServlet(name="AnnotionDemo4",
urlPatterns = {"/anno", "/as.do", "/as.action"},
loadOnStartup = 1)
public class Demo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().append("哈哈哈");
}
}
配置文件的写法
<?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_3_1.xsd"
version="3.1">
<servlet>
<!-- servlet-name要和sevlet-mapping对应 -->
<servlet-name>Demo5</servlet-name>
<!-- servlet-class 是servlet程序所对应的类 -->
<servlet-class>Demo5</servlet-class>
<!-- 只要tomacat服务器一启动就会加载这个类-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Demo5</servlet-name>
<!-- url地址 -->
<url-pattern>/webxml.do</url-pattern>
</servlet-mapping>
</web-app>
四、selvelt的声明周期
整个servlet在执行的过程:
1.constructor
2.init
3.service
4.destroy
阶段1:
servlet整个类对象进行实例化(在tomcat服务器中),提供给tomcat使用
阶段2:
servlet类对象的初始化。
阶段3:
servlet对外提供服务,相当于咱们的doGet和doPost
阶段4:
servlet进行销毁,可以主动申请关闭servlet,但是一般tomcat一关闭,就自动销毁
示例
@WebServlet(value = "/life.do" , loadOnStartup = 1)
public class LifeCycleServlet extends HttpServlet {
public LifeCycleServlet() {
System.out.println("我是LifeCycleServlet无参数的构造方法");
}
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
System.out.println("init初始化");
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().append("hello service");
System.out.println("service method called");
}
@Override
public void destroy() {
System.out.println("destroy method called");
}
}
五、获取请求的参数
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("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/*
* html页面中,input标签发送的数据,都会存到HttpServletRequest 对象里面
* 通过这个对象获取input输入框中值username和password
* */
String username = req.getParameter("username");
String password = req.getParameter("password");
System.out.println("用户名:" + username);
System.out.println("密码:" + password);
}
}