servlet笔记
1.Servlet的定义:
01. 狭隘上说 javax.servlet.Servlet的接口!
02. 通常认为 一个类实现了Servlet接口,那么这个类就是servlet!
2.Servlet的作用:
01.获取用户的请求 ===》我们就知道用户想做什么
02.调用相应的service层方法 ===》完成用户想要的操作
03.根据结果,返回给用户响应
注意点: servlet本身不做业务逻辑处理!
3.Servlet的实现:
01.实现Servlet接口
02.继承GenericServlet
03.继承HttpServlet 常用的!
HttpServlet==》GenericServlet==》Servlet接口
4.Servlet的生命周期 单例多线程
01.客户端发送请求到Servlet
02.首先判断这个Servlet的实例是否存在!如果没有创建把Servlet加载到内存中
03.Servlet实例化==》init()初始化Servlet
04.再根据用户的请求方式,由service()来派发到不同的方法处理请求(doGet(),doPost())
05.服务器关闭,执行destroy()销毁servlet
5.注意点: (初始化的时机)
01. 我们通常认为用户不请求servlet,它就不会初始化!
02. 程序启动时加载servlet!
6.<!-- 配置我们创建的servlet -->
<servlet>
<servlet-name>s</servlet-name>
<servlet-class>cn.bdqn.servlet.MyServlet1</servlet-class>
</servlet>
<!-- 用户访问的名称 -->
<servlet-mapping>
<servlet-name>s</servlet-name>
<url-pattern>/MyServlet1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>s</servlet-name>
<url-pattern>/MyServlet2</url-pattern>
</servlet-mapping>
注意点:
01.servlet节点下面的servlet-name不允许重复!
02.一个servlet节点可以被多个servlet-mapping所对应!
7.load-on-startup 设置服务器启动的时候加载我们的servlet
值必须是一个正整数! 值越小优先级越高!
如果值相等,优先级是按照servlet-mapping的顺序执行!
serlvet3.0 给我们提供了注解!来解决我们web.xml文件中配置servlet的问题!
就是把我们web.xml中的配置放到了 各自的servlet中!
8.参数
<!-- 设置全局变量 -->
<context-param>
<param-name>username</param-name>
<param-value>我是全局的参数!</param-value>
</context-param>
<!-- 取全局变量 -->
public void init(ServletConfig config) throws ServletException {
System.out.println("======================执行了 init() 方法");
System.out.println(config.getServletContext().getInitParameter(
"username"));
}
<!-- 设置局部变量 -->
<servlet>
<servlet-name>s</servlet-name>
<servlet-class>cn.bdqn.servlet.Servlet2</servlet-class>
<!-- 注意放的位置 -->
<init-param>
<param-name>name</param-name>
<param-value>我是局部的参数</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- 取局部变量 -->
public void init(ServletConfig config) throws ServletException {
System.out.println("======================执行了 init() 方法");
System.out.println(config.getInitParameter("name"));
}
8.代码
配置web.xml中的servlet
<?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <!--配置servlet --> <servlet> <!-- 定义servlet --> <servlet-name>myServlet</servlet-name> <servlet-class>cn.bdqn.servlet.MyServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>myServlet</servlet-name> <url-pattern>/jsp/</url-pattern> <!-- 控制用户的请求路径 --> </servlet-mapping> <!-- url-pattern的四种匹配模式 / 代表项目的根目录 01.精确匹配 /myServlet ==> localhost:8080/项目名/myServlet 02.全局匹配 /* 匹配到项目下的 所有请求 localhost:8080/项目名/sasasa 能匹配 localhost:8080/项目名/1234 能匹配 03.后缀匹配 *.do 前面不管输入的是什么,但是必须有.do 04.目录匹配 /jsp/* ===》localhost:8080/项目名/jsp/随便输入 --> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
/**
* shift +alt +s 重写 父类的方法
*/
public class MyServlet extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("MyServlet进行了 init初始化**********************");
/**
* userName 这个参数仅限于我们当前的servlet使用
* 问题?
* 我想所有的servlet都能拿到这个userName???
* 怎么办?
* 设置全局的初始化参数,让所有servlet共享!
System.out.println("初始化的参数值是:" + config.getInitParameter("userName"));
*/
System.out.println(config.getServletContext().getInitParameter(
"userName"));
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("MyServlet进行了 service派发器**********************");
super.service(req, resp); // 必须是调用父类的service
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("MyServlet进行了 doGet**********************");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("MyServlet进行了 doPost**********************");
}
@Override
public void destroy() {
System.out.println("MyServlet进行了 destroy 销毁**********************");
}
}
/**
* 测试
* 全局初始化参数
*/
public class MyServlet2 extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
System.out.println("MyServlet2进行了 init初始化**********************");
System.out.println(config.getServletContext().getInitParameter(
"userName"));
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("MyServlet2进行了 service派发器**********************");
super.service(req, resp); // 必须是调用父类的service
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("MyServlet2进行了 doGet**********************");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("MyServlet2进行了 doPost**********************");
}
@Override
public void destroy() {
System.out.println("MyServlet2进行了 destroy 销毁**********************");
}
}