java提供的动态Web资源开发技术
如图所示:实际上是写java类
用文档搜索API
快速入门
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
</dependencies>
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* 1 定义类,继承接口
* 2 找到service方法 输出语句
* 3 定义路径
*/
@WebServlet("/demo1")
public class ServicetDemo1 implements Servlet {
@Override
public void init(ServletConfig servletConfig) throws ServletException {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
// 输出一句话
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
Servlet执行流程
Servlet生命周期
package com.itheima.web;
import javax.servlet.*;
import javax.servlet.annotation.WebServlet;
import java.io.IOException;
/**
* 1 定义类,继承接口
* 2 找到service方法 输出语句
* 3 定义路径
*/
/**
* @WebServlet(value = "/demo2",loadOnStartup = 1)
* 负整数:第一次 被访问时 创建Servlet对象
* 0或正整数: 服务器 启动时 创建Servlet对象,数字越小优先级越高
*
* eg:一月 09, 2022 11:30:20 上午 org.apache.catalina.core.StandardEngine startInternal
* 信息: Starting Servlet Engine: Apache Tomcat/7.0.47
* init...
* 一月 09, 2022 11:30:21 上午 org.apache.coyote.AbstractProtocol start
* 信息: Starting ProtocolHandler ["http-bio-8080"]
*
*
*/
@WebServlet(value = "/demo2",loadOnStartup = 1)
public class ServicetDemo2 implements Servlet {
/**
* 初始化方法
* 调用时机:默认情况下,Servlet被第一次访问时,调用
* 调用次数: 1 次
* @param servletConfig
* @throws ServletException
*/
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("init...");
}
/**
* 销毁方法
* 1 调用时机:内存释放或者服务器关闭的时候,Servlet对象会被销毁,调用
* 2 调用次数: 1 次
*/
@Override
public void destroy() {
System.out.println("destory...");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
/**
* 提供服务
* 1 调用时机:每一次 Servlet 被访问时,调用
* 2 调用次数:多次
*
* @param servletRequest
* @param servletResponse
* @throws ServletException
* @throws IOException
*/
@Override
// 输出一句话
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
System.out.println("servlet hello world");
}
@Override
public String getServletInfo() {
return null;
}
}
Servlet方法介绍
Servlet体系结构
package com.itheima.web;
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("/demo4")
public class ServicetDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get..");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("post..");
}
}
问:1. Httpservlet中为什么要根据请求方式的不同,调用不同方法?
最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET产生的URL地址可以被Bookmark,而POST不可以。
GET请求会被浏览器主动cache,而POST不会,除非手动设置。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST没有。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
2.如何调用?
post和get都可以向服务器发送和请求数据,而我们一般都习惯用get请求数据,post发送数据!get方法是把数据拼接到请求行里面,我们可以直接看到里面的数据,相比较post不安全,但是简单,快捷(大小限制不超过2K)!post则是把要发送的数据转换成流的方式,大小不限制,上传给服务器,相比较get安全些!
Servlet urlpattern配置
//一个Servlet,可以配置多个urlPattern
@WebServlet(urlPatterns = {"/demo7","/demo8"})
public class ServicetDemo4 extends HttpServlet {}
1 比如精确匹配和目录匹配同时出现,有限访问精确度更高的,所以访问精确匹配的
2 任意匹配不推荐
3 优先级:精确路径>目录路径>扩展名路径> /* > /