Servlet简述
- servlet是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
- 编写过程:
1. 写一个java类,实现servlet接口
2. 修改web.xml文件,给servlet提供一个可访问的URI地址
<!--创建一个servlet实例-->
<servlet>
<servlet-name>servletdemo1</servlet-name>
<servlet-class>day08_00_servlet.servletdemo</servlet-class>
</servlet>
<!--给servlet提供一个url地址-->
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
<!--其中/demo1就等于http://localhost:8080/.../demo1,如果不加’/’,就会变成http://localhost:8080/demo1-->
- 部署应用到tomcat服务器
- 测试
servlet生命周期
- 构造servlet,然后使用init方法将其初始化
- 处理来自客户端的对service方法的所有调用
- 从服务中取出servlet,然后使用destroy方法销毁,利用垃圾回收并终止
- 实例化—》初始化—》服务—》销毁
- ps:如何让servlet在服务器启动时就创建:
<servlet>
<servlet-name>servletdemo1</servlet-name>
<servlet-class>day08_00_servlet.servletdemo</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
Servlet的三种创建方式
- 实现 javax.servlet.Servlet接口(第一种就是上面演示的方法)
- 继承 javax.servlet.GenericServlet类(适配器模式)
- 继承 javax.servlet.http.HttpServlet类(模板设计模式)(开发中常用)(不要重写父类的service方法)
public class ServletDemo3 extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("*******doGet *******");
System.out.println(req.getRemoteAddr());
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
System.out.println("**********doPost**********");
}
}
Servlet映射:
- 可以配置多个映射路径:
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>/demo1</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
- 通配符* 可以代表任意字符串
<!--/* 任意字符串都可以访问-->
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern> /* </url-pattern>
</servlet-mapping>
<!--以*.字符串的请求都可以访问,但是不要加/-->
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
<!--以 /action 开头的请求都可以访问-->
<servlet-mapping>
<servlet-name>servletdemo1</servlet-name>
<url-pattern>/action/*</url-pattern>
</servlet-mapping>
- 匹配规则:优先级:绝对匹配 > /开头匹配 > 扩展名方式匹配
Servlet的线程安全
单实例:每次访问多线程
问题:下面代码这样子的例子,因为是多线程的,所以会出现数字相同,导致数据不准确
public class ServletDemo3 extends HttpServlet {
int num = 1;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
num++;
System.out.println(num);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
解决方法:不要写全局变量,而写局部变量
public class ServletDemo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
int num = 1;
num++;
System.out.println(num);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
Servlet获取配置信息
使用ServletConfig
- 方法一:
public class ServletDemo3 extends HttpServlet {
//1.定义局部变量
private ServletConfig config;
public void init(ServletConfig config) throws ServletException {
//2.获取父类的config
this.config = config;
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3.利用getInitParameter方法获取
String name = config.getInitParameter("");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 方式二:
public class ServletDemo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//通过使用继承父类的方法获取
String name = this.getServletConfig().getInitParameter("");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
- 方式三:
public class ServletDemo3 extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = this.getInitParameter("");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
ServletContext(*)
- 概述:ServletContext: 代表的是整个应用。一个应用只有一个ServletContext对象,单实例。
- 作用:
1. 域对象:在一定范围内(在当前应用),可以使多个Servlet共享数据
* 1.1
* 1.2 常用方法:
* 1.2.1void setArribute(String name,object value);//向ServletContext对象的map属性中添加数据
* 1.2.2Object getAttribute(String name);//从ServletContext对象的map中取数据
* 1.2.3void rmoveAttribute(String name);//根据name去移除数据
2. 可以获取全局的配置信息
* 1.String getInitParameter(String name) //根据配置文件中的key得到value
3. 获取资源路径
*String getRealPath(String path);//根据资源名称得到资源的绝对路径.
4. 可以实现Servlet的转发
//实现请求转发
ServletContext sc = this.getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher(String path);//path表示要跳转到那里去
rd.forward(request,response);