目录
1.1什么是Servlet?
1.2实现Servlet的三种方式
2.1Servlet创建时间
2.2url-pattern
2.3Servlet是否是线程安全
1.Servlet概述
1.1什么是Servlet?
Servlet是JavaWeb的 三大组件之一(javaWeb的三大组件: Servlet , 过滤器, 监听器 ) ,它属于动态资源。Servlet的作用是处理请求,服务器会把接收到的请求交给Servlet来处理,在Servlet中通常需要:
-
接收请求数据;
-
处理请求;
-
完成响应。
如图所示客户端发出登录请求,或者输出注册请求,这些请求都应该由Servlet来完成处理!Servlet需要我们自己来编写,每个Servlet必须实现javax.servlet.Servlet接口。
1.2实现Servlet的三种方式
-
实现javax.servlet.Servlet接口;
-
继承javax.servlet.GenericServlet类;
-
继承javax.servlet.http.HttpServlet类;
(通常我们会去继承HttpServlet类来完成我们的Servlet )
JavaEE 这些类不在jdk中, 在Servlet-api的jar中
Servlet的类对象由Web服务器创建(Tomcat), Servlet的方法大部分由Tomcat来调用init(),service(),destory()都是Tomcat调用,如果程序员调用,没有处理请求的能力getServletConfig().getServletInfo() 给程序员调用
1.3 创建helloservlet应用
完成Servlet需要分为两步:
1.编写Servlet类;
2.在web.xml文件中配置Servlet;
代码实例:
HelloServlet.java
public class HelloServlet implements Servlet {
public void init(ServletConfig config)
throws ServletException {}
public ServletConfig getServletConfig() {
return null ;
}
public void destroy() {}
public String getServletInfo() {
return null;
}
public void service(ServletRequest req, ServletResponse res)
throws ServletException, IOException {
System.out.println("hello servlet!");
}
}
service()方法是重点,因为它是用来处理请求的方法。
web.xml
<servlet>
<!--Servlet名称: 自定义, 推荐类名 -->
<servlet-name>AServlet</servlet-name>
<!--对应的Servlet类: 全限定名(包.类名)-->
<servlet-class>com.fs.web.AServlet</servlet-class>
</servlet>
<!--绑定url
Servlet类与url的映射
-->
<servlet-mapping>
<servlet-name>AServlet</servlet-name>
<!--绑定的url自定义 推荐使用/类名 后面还有通配符 * 写法-->
<url-pattern>/AServlet</url-pattern>
</servlet-mapping>
修改web.xml文件,一定要重启服务器, 热部署失效
2.Servlet细节
2.1 Servlet创建时间
Servlet默认创建的时间: 在第一次请求的时候创建 第一次惩罚
可以配置Servlet, 让他在Tomcat启动的时候,就创建
在<servlet>
中添加<load-on-startup>非负整数</load-on-startup>
非负整数 越小, 对应Servlet越先创建
<servlet>
<servlet-name>hello1</servlet-name>
<servlet-class>com.suke.servlet.Hello1Servlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello1</servlet-name>
<url-pattern>/hello1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>hello2</servlet-name>
<servlet-class>com.suke.servlet.Hello2Servlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>hello2</servlet-name>
<url-pattern>/hello2</url-pattern>
</servlet-mapping>
在<servlet>
元素中配置<load-on-startup>
元素可以让服务器在启动时就创建该Servlet, 根据<load-on-startup>
的值可以得知服务器创建Servlet的顺序为Hello1Servlet、Hello2Servlet
2.2url-pattern
<url-pattern>
给servlet绑定一个url
1.一个Servlet 可以配置多个<url-pattern>
, 一个Servlet绑定多个url
servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>com.fs.web.HelloServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/HelloServlet</url-pattern>
<url-pattern>/xxx</url-pattern>
</servlet-mapping>
2.<url-pattern>
使用通配符*
配置所有
<!--使用*通配符
/* 匹配所有的url, 优先级最低
/user/* 匹配user的路径下所有后代路径
/user/abc /user/bbb /user/ccc .. 匹配
/xxx 不匹配
*.do 后缀匹配
xxx.do aaa.do*出现在最前面,或者最后面, 只能出现一次
/*.do 错误
/user/*/add 错误
*.* 错误
-->
2.3Servlet是否是线程安全
一个Servlet类的对象在Tomcat只创建一个, 但是用户发送请求该Servlet, Tomcat为这次请求创建一个线程处理, 但是调用Servlet对象是同一个, 也就是说,多个线程共享同一个Servlet, 所以它是线程不安全的
(在实际开发中, 不要在Servlet中创建存放数据的属性 )