什么是Servlet
- servlet是JavaEE规范之一。即接口
- servlet是JavaWeb三大组件之一。Servlet程序、Filter过滤器、Listener监听器
- servlet是运行在服务器上的一个java小程序,** 可以接受客户端发送过来的请求,并响应数据给客户端 **
配置servlet
package com.atguigu.servlet;
import javax.servlet.*;
import java.io.IOException;
public class HelloServlet 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 {
// 专门处理请求和响应,,在web.xml中配置地址
System.out.println("我是处理请求和响应,在web/web-inf/web.xml配置的/hello就会触发");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
}
}
配置路径web.xml
<?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>HelloServlet</servlet-name>
<!-- servlet-class是servlet程序的全类名(包加类名)-->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
</servlet>
<!-- 配置访问地址-->
<servlet-mapping>
<!-- 告诉服务器,配置的地址给哪个servlet程序使用-->
<servlet-name>HelloServlet</servlet-name>
<!-- 配置访问地址-->
<!-- / 表示 http://ip:port/工程路径 在tomcat配置的路径可以修改-->
<!-- /hello 表示进一步指定地址-->
<url-pattern>/hello</url-pattern>
</servlet-mapping>
</web-app>
注意常见错误:
1。 url-pattern 的路径不要漏写 /
2 。servlet-name的别名(类名)写错
3 。 servlet-class 全类名写错
servlet的生命周期
请求的分发
package com.atguigu.servlet;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
public class HelloServlet implements Servlet {
public HelloServlet() {
System.out.println("Servlet 生命周期");
System.out.println("1 构造器");
}
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化");
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
// 专门处理请求和响应,,在web.xml中配置地址
System.out.println(" 3 我是处理请求和响应,在web/web-inf/web.xml配置的/hello就会触发");
// 类型转换,获取getMethod()方法
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
// 获取请求方式
String method = httpServletRequest.getMethod();
// if("GET".equals(method)){ // 封装成一个方法
// doGet();
// System.out.println("get请求");
// }else if("POST".equals(method)){
// System.out.println("post请求");
// }
}
// 封装doGet方法。doPost方法同理
public void doGet(){
// System.out.println("get请求");
}
@Override
public String getServletInfo() {
return null;
}
@Override
public void destroy() {
System.out.println("4 销毁");
}
}
一般使用HttpServlet 继承的方法来分发请求
package com.atguigu.servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
// 一般不直接实现Servlert接口,而是通过继承 HttpServlet 来实现,
// 并且重写doGet 和 doPost
public class HelloServlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("记得在web.xml中配置");
System.out.println("因为HttpServlet已经帮我们封装好get请求的方法,doGet");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("因为HttpServlet已经帮我们封装好post请求的方法,doPost");
}
}
idea自动生成HttpServlet的类
继承和实现servlet、HttpServlet
ServletConfig可以获取一些配置信息
// HelloServlet文件
@Override
public void init(ServletConfig servletConfig) throws ServletException {
System.out.println("2 init初始化");
System.out.println("servlet的别名"+ servletConfig.getServletName());
System.out.println("初始化参数usernmae"+ servletConfig.getInitParameter("username"));
System.out.println("初始化参数url"+ servletConfig.getInitParameter("url"));
}
// web.xml文件
servlet指tomcat配置servlet程序-->
<servlet>
<!-- servlet-name是servlet程序的别名(一般是类名)-->
<servlet-name>HelloServlet</servlet-name>
<!-- servlet-class是servlet程序的全类名(包加类名)-->
<servlet-class>com.atguigu.servlet.HelloServlet</servlet-class>
<!-- init初始化参数-->
<init-param>
<param-name>username</param-name>
<param-value>root</param-value>
</init-param>
<init-param>
<param-name>url</param-name>
<param-value>jdbc:mysql://localhost:3306/test</param-value>
</init-param>
</servlet>
除了在init方法中可以使用servletConfig可以使用
在 doGet(){ // 等方法中也可以
// 也可通过getServletConfig()
ServletConfig servletConfig = getServletConfig();
}
注意:重写init(),要调用super
ServletContext类
4、ServletContext是在web工程部署启动时创建,web停止时销毁
ServletContext作用
1)获取web.xml上下文参数
2)获取当前路径,格式:/工程路径
3)获取部署后在磁盘上的绝对路径
4)像Map一样存取数据
// 在自定义类 ContextServlet中,获取
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletConfig().getServletContext();
context.getInitParameter("1 上下文参数"+"username");
context.getInitParameter("密码"+"password");
System.out.println("2 当前路径"+ context.getContextPath());
// 路径 / 表示:解析地址为:http://ip:port/工程名/ ====>也就是指当前项目的06_servlet/web/
System.out.println("3 工程部署的路径"+context.getRealPath("/"));
// 获取/web/css如下写法
System.out.println("工程部署的路径"+context.getRealPath("/css"));
// 存储--------
ServletContext context1 = getServletContext();
System.out.println(" 4 保存前的context1获取key1"+context1.getAttribute("key1"));//结果为null
context1.setAttribute("key1","root"); //结果为root
context1.setAttribute("key1","root"); //结果为root
}
// ==============================================
// 在web.xml配置上下文
<!-- 上下文参数-->
<context-param>
<param-name>username</param-name>
<param-value>root</param-value>
</context-param>
<context-param>
<param-name>password</param-name>
<param-value>123456</param-value>
</context-param>
请求格式