servlet的基础复习

Servlet简述

  1. servlet是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。servlet 通常通过 HTTP(超文本传输协议)接收和响应来自 Web 客户端的请求。
  2. 编写过程:
    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-->
  1. 部署应用到tomcat服务器
  2. 测试

servlet生命周期

  1. 构造servlet,然后使用init方法将其初始化
  2. 处理来自客户端的对service方法的所有调用
  3. 从服务中取出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的三种创建方式

  1. 实现 javax.servlet.Servlet接口(第一种就是上面演示的方法)
  2. 继承 javax.servlet.GenericServlet类(适配器模式)
  3. 继承 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映射:

  1. 可以配置多个映射路径:
<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>
  1. 通配符* 可以代表任意字符串
<!--/* 任意字符串都可以访问-->
<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>

  1. 匹配规则:优先级:绝对匹配 > /开头匹配 > 扩展名方式匹配

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

  1. 方法一:
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);
	}
}
  1. 方式二:
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);
	}
}
  1. 方式三:
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(*)

  1. 概述:ServletContext: 代表的是整个应用。一个应用只有一个ServletContext对象,单实例。
  2. 作用:
    1. 域对象:在一定范围内(在当前应用),可以使多个Servlet共享数据
    * 1.1
    * 1.2 常用方法:在这里插入图片描述
    * 1.2.1 void setArribute(String name,object value);//向ServletContext对象的map属性中添加数据
    * 1.2.2 Object getAttribute(String name);//从ServletContext对象的map中取数据
    * 1.2.3 void 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);

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值