(1)什么是servlet:运行在web服务器端的java程序(java类)
作用:接收浏览器发送的请求,把相关数据响应给浏览器。
(2)servlet实现方式:
* 实现Servlet接口
* 继承GenericServlet
* 继承HttpServlet(在开发中用的比较多)
创建servlet类,步骤:
1.创建一个普通类:HelloServlet, 让它继承HttpServlet
public class HelloServlet extends HttpServlet{
}
(3)servlet的入门案例:
步骤:
1.创建一个普通类,继承HttpServlet,重写里面的方法,service服务方法
服务方法的作用:用来接收请求,并且响应的。
2.配置用户访问的路径,在web.xml文件里配置路径
<!--1.配置servlet -->
<servlet>
<servlet-name>HelloServlet</servlet-name>
<servlet-class>cn.itheima.demo1.HelloServlet</servlet-class>
</servlet>
<!--2.配置servlet的映射路径 -->
<servlet-mapping>
<servlet-name>HelloServlet</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>
访问HelloServlet的路径:/hello
在浏览器地址完整访问路径:http://localhost:8080/day11_1/hello
(4)servlet的执行流程;
*1.在浏览器地址栏:http://localhost:8080/day11_1/hello
*2.通过/hello访问servlet路径,找web.xml文件上<url-pattern>标签里面对应的路径
*3.根据/hello访问路径,找到了<url-pattern>标签对应的值,找<servlet-name>标签对应的servlet名称
*4.根<servlet-mapping>下的子标签<servlet-name>的名称,找<servlet>标签下的子标签<servlet-name>,
去<servlet-class>标签对应的值:类的全路径。
利用反射去执行服务方法:
String className = "cn.itheima.demo1.HelloServlet";
//根据全路径,得到HelloServlet对应的class对象
Class clazz = Class.forName(className);
//根据clazz对象,得到HelloServlet对象
Object obj = clazz.newInstance();
去执行它的service方法
(5)servlet的生命周期:
生命周期方法
* init方法: 第一次访问servlet,servlet对象被创建了,执行初始化方法,执行一次
* service方法:每次访问servlet时,都执行,执行多次
* destory方法:关闭tomcat服务器时,servlet对象销毁了,执行一次
(6)servlet的路径配置(了解):
在web.xml文件的<servlet-mapping>下的<url-pattern>标签这里配置路径。
配置路径有三种方式:
*1.完全路径匹配 :以/ 开始
例如: /ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
*2.目录匹配:以/ 开始 需要以 * 结束.
例如: /* (所有) ,/aaa/* (aaa目录下的所有) ,/aaa/bbb/*
*3.扩展名匹配:不能以 / 开始 以 * 开始的. 例如: *.do , *.action 、*.jsp 、*.jpg
注意:扩展名匹配,/*.do错误的写法
异常信息:Invalid <url-pattern> /*.action in servlet mapping
优先级:完全路径匹配>目录匹配>扩展名匹配
(7)servlet细节问题
* 1.在service方法里面的参数
ServletRequest和HttpServletRequest
ServletResponse和HttpServletResponse
* 2.servlet对象的创建
第一种:在第一次访问servlet时,被创建。
第二种:在服务器启动时创建servlet.<load-on-startup>2</load-on-startup>
*3.执行service服务方法时,其实底层代码执行的doGet,doPost方法等(掌握)
在创建servlet时,不用重写service方法,因为service方法底层调用doGet和doPost
浏览器发送get请求--->doGet方法
浏览器发送post请求---->doPost方法
*4.方法的相互调用(掌握)
需求:在doGet方法完成1加到100之间的和
在doPost方法完成1加到100之间的和
代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接受浏览器发送的get请求");
int sum=0;
for(int i=0;i<101;i++){
sum+=i;
}
System.out.println(sum);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("接受浏览器发送的post请求");
doGet(request, response);
}
(8)开发中的路径问题(掌握)
*1.java项目的路径:
==绝对路径:E:/javaweb2/day10_1/src/db.properties
==相对路径:src/db.properties
*2.web项目的路径
* 相对路径:
= 在同一级目录:直接写文件名称
= 在上一级目录:../文件名称
= 在下一级目录: 目录名称/文件名称
* 绝对路径:
第一种方式:http://192.168.75.82:8080/day11_1/img/c.jpg
第二种方式:/day11_1/img/c.jpg
ServletConfig:
配置servlet的初始化参数:
<servlet>
<servlet-name>DemoServlet</servlet-name>
<servlet-class>cn.itheima.demo1.DemoServlet</servlet-class>
<init-param>
<param-name>encode1</param-name>
<param-value>gbk</param-value>
</init-param>
</servlet>
(2)servletConfig的api
* 得到ServletConfig对象:ServletConfig config = servlet.getServletConfig()
* 获取配置参数:
=String getInitParameter(String name)
=Enumeration er = getInitParameterNames()
= String getServletName() ;获取servlet的名称
代码:
//1.获取servlet的初始化参数
ServletConfig config = this.getServletConfig();
//2.根据初始化参数的名称获取值
String value = config.getInitParameter("encode1");
System.out.println(value);
String servletName = config.getServletName();
System.out.println("servlet的名称"+servletName);
ServletContext:
<!-- 配置全局的初始化参数 -->
<context-param>
<param-name>username</param-name>
<param-value>zs</param-value>
</context-param>
* 得到servletContext对象
方式1:servletConfig.getServletContext();
方式2:servlet.getServletContext();
作用1:
* 获取全局的初始化参数
=String getInitParameter(String name)
=Enumeration getInitParameterNames()
作用2:
* 获取web项目路径
String path = getContextPath();
作用3:
理解:获取文件的扩展名
String type =getMimeType(String file)
作用4:
获取的是真实路径,其实就是绝对路径
String getRealPath(String path)
*什么域对象:在一定的范围内,可以存值和取值,servletContext它的作用范围是整个web项目
==存值:void setAttribute(String ,Object);
==取值:Object obj = getAttribute(String);
测试: 在servlet1里面存值, 在servlet2获取servlet1里面的存值
结论:1.整个web项目对应一个servletContext对象,对象在服务器启动就创建了servletContext对象
2.servletContext它的作用范围是整个web项目
(0)工作空间的项目目录结构和把项目部署到tomcat服务器的目录结构:
工作空间的项目目录: 都存在
tomcat服务器的目录: src目录没有,src目录下面的java和配置文件,都部署到/WEB-INF/classes目录
(1) 传统方式获取文件的字节输入流
(2) ServletContext的getResourceAsStream(),获取文件的字节输入流
* 文件的相对位置:相对tomcat的bin目录(jdk虚拟机)
web项目里面获取文件的字节输入流:InputStream getResourceAsStream(String path)
* 文件放在src下面:文件部署到服务器,部署到/WEB-INF/classes目录
文件路径: /WEB-INF/classes/文件的名称
* 文件放在WebContent下面,部署到服务器,部署项目名称下面
文件路径: /文件名称
* 文件放在WEB-INF下面,部署到服务器,部署到/WEB-INF下面
文件路径:/WEB-INF/文件名称
* 文件存放的位置和WebContent同级,因为就部署不到服务器上面,所以无法获取文件的字节输入流
(3)ServletContext的getRealPath ()获取文件的真实路径,获取字节输入流
:getRealPath(),路径参照上面getResourceAsStream()方法的路径写法。
(5)ClassLoader
* 类加载器:加载类的一个类,称之为类加载器。
类加载的默认路径:class目录下面。
* 获取文件的字节输入流,如果文件在src下面,部署到服务器,在服务器classes下面
文件路径: 文件名称
代码
Class clazz = this.getClass();
ClassLoader loader = clazz.getClassLoader();
//2.获取src下面db.properties文件的字节输入流,文件路径?
InputStream in = loader.getResourceAsStream("db.properties");