7.Servlet
1、Servlet 是JavaEE的一个规范之一
2、Servlet是JavaWeb的三大组件(Servlet、Filter、Listener)之一
3、Servlet是运行在服务器上的一个java小程序,可以接收客户端发 送过来的请求、并响应数据给客户端。
7.1 Servlet实现步骤
1、编写一个类实现Servlet接口
2、实现service方法用来处理请求,并响应数据
3、到web.xml中配置servlet程序的访问地址
新建类,之后使用快捷键 ctrl + i ,实现方法,全选
其中,service方法是专门用来处理请求和响应的
<?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标签用来配置Tomcat的servlet程序 -->
<servlet>
<!-- servlet-name标签是给servlet程序起别名,一般为类名 -->
<servlet-name></servlet-name>
<!-- servlet-class 是 servlet的全类名 -->
<servlet-class></servlet-class>
</servlet>
<!-- servlet-mapping标签给servlet程序配置一个访问地址 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<!-- urlpattern 配置访问地址
/斜杠在服务器解析的时候,表示地址为 http://ip:port/工程路径(servlet_tutorial)
可以在tomcat的configurations中的deployment中查看
/hello 表示地址为 http://ip:port/servlet_tutorial/hello
-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
程序运行后,进入 http://localhost:8085/Servlet_tutorial/
之前设置的具体路径为http://localhost:8085/Servlet_tutorial/hello
访问过后,在IDEA的控制台可以看到访问过后打印出来的字符 Hello,world!
7.2 url到servlet的过程
一台客户端(由唯一的ip地址确定)运行很多的软件,而一端口号与应用程序之间是互相对照的(一个程序可以占用多个不同端口,但端口不能复用),tomcat默认监听的是8080端口,因此,在ip地址确定的情况下,可以通过端口号进行对tomcat服务器的访问
7.3 servlet的生命周期
1、执行servlet构造器方法
2、执行init初始化方法
前两个步骤只执行一次
3、执行service方法
每次访问页面都会调用该方法
4、执行destroy方法
在web工程停止的时候执行
7.4 servlet请求的分发
测试请求
注:get,post必须大写
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
var method = httpServletRequest.getMethod();
if ("GET".equals(method)) {
System.out.println("get方法");
}
else if ("POST".equals(method)){
System.out.println("post方法");
}
}
7.5 通过继承HttpServlet实现servlet程序
一般在实际项目开发中,都是使用继承httpservlet类的方法去实现servlet程序
步骤:
1、编写一个类去继承servlet方法
2、根据业务需要重写doGet与doPost方法
3、到web.xml中的配置servlet程序的访问地址
src/com.tutorial.servlet/HelloServlet1
public class HelloServlet1 extends HttpServlet {
/*
doGet在得到get请求时调用
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet2 get请求被调用");
}
/*
doPost在得到post请求时调用
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet2 post请求被调用");
}
}
web.xml
<servlet>
<servlet-name>HelloServlet1</servlet-name>
<servlet-class>com.tutorial.servlet.HelloServlet1</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet1</servlet-name>
<url-pattern>/servlet1</url-pattern>
</servlet-mapping>
7.6 servlet类继承体系
Servlet 自身提供一个接口(Interface)
GenericServlet 对接口进行实现,同时对很多方法做的是空实现
同时持有ServletConfig类的引用,以及针对ServletConfig写了一些方法
HttpServlet 则是写了抽象的service方法,同时进行请求的分发(GET/POST),
按照请求类型不同发到doGet()或doPost()中
自定义类 继承HttpServlet类,实现对doGet和doPost方法的重写
使其实现需要的功能
7.7 ServletConfig类
servlet配置信息的作用:
1、可以获取servlet程序的别名,即servlet-name
2、获取初始化参数init-param
3、获取ServletContext对象
servlet程序和servletconfig对象都是有tomcat负责创建的,我们只负责使用
servlet程序默认是第一次访问的时候创建,servletconfig是每个servlet程序创建时
才产生servletconfig对象
注:servletConfig只能在init()中使用
@Override
public void init(ServletConfig servletConfig) throws ServletException {
// 1、通过servletconfig获取servlet别名
System.out.println("HelloServlet的别名是:" + servletConfig.getServletName());
// 2、通过servletconfig获取servlet初始参数
System.out.println("servlet 初始参数username为:" + servletConfig.getInitParameter("username"));
System.out.println("servlet 初始参数URL为:" + servletConfig.getInitParameter("url"));
// 3、通过servletconfig
System.out.println("servlet 文本为:" + servletConfig.getServletContext());
}
注:在其他地方要用 getServletConfig()
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("servlet2 get请求被调用");
System.out.println("HelloServlet的别名是:" + getServletConfig().getServletName());
System.out.println("servlet 初始参数servlet2为:" + getServletConfig().getInitParameter("servlet2"));
System.out.println("servlet 初始参数URL为:" + getServletConfig().getInitParameter("url"));
System.out.println("servlet 文本为:" + getServletConfig().getServletContext());
}
获取的文本,来自 web.xml
注:在重新配置类或web.xml之后,需要重启服务器(restart)/重新部署(redeploy)才能生效。
参考@weixin_30654583 IntelliJ IDEA + Tomcat ;On Upate Action 与 On Frame Deactivation
7.8 servletContext类
servletContext是一个接口,表示servlet上下文对象
一个web工程,只有一个servletContext对象
servletContext对象是一个域对象
servletContext是在web工程部署启动时创建,停止时销毁
因此,在配置域的时候,配置好之后可以被其他方法(类)访问,
即context配置的域可以实现跨界访问
域对象类似于map,存取数据的对象
域指的是存取数据的操作范围
存数据 | 取数据 | 删除数据 | |
---|---|---|---|
Map | put() | get() | remove() |
域 | setAttribute() | getAttribute | removeAttribute() |
作用:
1、获取web.xml中配置的上下文参数context-param
2、获取当前的工作路径,格式: /工程路径
3、获取工程部署后在服务器硬盘上的绝对路径
4、存取数据
public class servletContext extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取web.xml中配置的上下文参数context-param
ServletContext context = getServletConfig().getServletContext();
String root = context.getInitParameter("root");
System.out.println("root的值为:" + root );
// 2、获取当前的工作路径,格式: /工程路径
System.out.println("当前工程路径为:" + context.getContextPath());
// 3、获取工程部署后在服务器硬盘上的绝对路径
System.out.println("绝对路径为:" + context.getRealPath("/"));
// 4、存取数据
ServletContext context1 = getServletContext();
context1.setAttribute("name","Smile");
System.out.println("你sei啊:" + context1.getAttribute("name"));
}
}