1、servlet入门
* servlet就是一个javaee程序,可以接受和响应来自客户端的请求。
如何实现servlet?
* 实现Servlet接口
* 继承GenericServlet类
* 继承HttpServlet类
复习:继承interface需要重写接口里的所有方法,但是继承class不需要
使用记事本开发servlet的步骤:
1.继承GenericServlet类实现servlet
2.向页面输出内容:使用service()方法里面参数response向页面输出
3.部署到tomcat里面,通过配置让服务器知道不是一个普通的java程序,而是一个servlet
1)创建hello.java文件
package com.fenqing.servlet;
import javax.servlet.*;
public class hello extends GenericServlet{
public void service(ServletRequest req,ServletResponse res)
throws ServletException,java.io.IOException{
res.getWriter().write("hello servlet");
}
}
2)在文件 web.xml 中加入如下代码
<servlet>
<servlet-name>hello</servlet-name>
<servlet-class>com.fenqing.servlet.hello</servlet-class> <!--servlet的包类路径,包+类名-->
</servlet>
<servlet-mapping>
<servlet-name>hello</servlet-name>
<url-pattern>/hello</url-pattern><!--表示通过/hello来访问-->
</servlet-mapping>
2、servlet的执行过程
1)根据访问的路径到web.xml中找url-pattern
2)找mapping中的servlet-name名称
3)找另一个servlet-name标签里面和上一个name相同的servlet
4)找到包类路径
5)利用反射,,使用servlet里面的方法执行
3、servlet的生命周期
* 什么是生命周期?
从出生到死亡的全过程
* servlet的生命周期?
servlet从创建到销毁的全过程
* servlet接口里面有5个方法,其中3个与生命周期相关
- init() 创建servlet时执行
在第一次访问地址的时候创建,只创建一次
- service() 处理客户端请求
每次请求都会执行一次,可以执行多次
- destroy() 销毁servlet时执行
关闭服务器的时候销毁servlet
4、服务器启动时创建servlet-init()
* 在web.xml中找到要启动的servlet
* 语法:
<load-on-startup>任意正整数(不包括1)</load-on-startup>
* <servlet>
<servlet-name>d01servlet</servlet-name>
<servlet-class>com.fenqing.servlet.d01servlet</servlet-class>
<load-on-startup>6</load-on-startup>
</servlet>
5、修改servlet的模板
1)找到plugins/com.genuitec.eclipse.wizards.xxx.jar
2)打开jar包中的Templates文件夹可以看到Servlet.java源代码,直接修改
3)重启Myeclipse
6、url-pattern的配置
有三种方式:
1)完全路径匹配
** 使用 / 开头 /hello /aa/hello
2)目录匹配
** 使用 / 开头 /aa/* /* 所有路径
3)扩展名匹配
** 不使用/开头
** *.ation *.do
优先级:完全 > 目录 > 扩展名
# 如果在配置文件里面配置了多个url-pattern,最终只能执行一个
7、开发中的路径问题
* 相对路径
- 同级目录:直接写
- 上级目录:../
- 下级目录:/a/xxx.x
缺点:如果图片变化了位置,每次写的路径都不一样
* 绝对路径(开发)
- ip 端口号 项目名称
http://127.0.0.1:8080/a.html
- 直接写项目名称
/a.html
路径分两类
1.客户端路径
* http://127.0.0.1:8080/a.html
* 一般用在 重定向
2.服务器端路径
* 在服务器内部进行的访问的操作,经常使用在转发操作
* 不需要加项目名称 /a.jpg
8、ServletConfig对象的使用
1)获取初始化参数
- 在web.xml中找到要配置的Servlet
- 加入代码
<init-param>
<param-name>url</param-name>
<param-value>127.0.0.1</param-value>
</init-param>
- getInitParameter(String name):获取初始化参数的值
ServletConfig config = getServletConfig();
String urlvalue=config.getInitParameter("url");
syso(urlvalue);
- getInitParameterNames():获取所有初始化参数的名称
ServletConfig config = getServletConfig();
Enumeration<String> enumeration=config.getInitParameterNames();
while(enumeration.hasMoreElements()){
String name=enumeration.nextElement();
syso(name);
}
2)得到当前运行的Servlet的名称 <servlet-name>servlet1</servlet-name>
ServletConfig config = getServletConfig();
String servletname=config.getServletName();
syso(servletname);
3)得到ServletContext对象
- getServletContext()
9、servletContext对象
* 启动tomcat服务器,在tomcat里面可能有很多的项目,这时服务器会为每一个项目创建一个对象,也就是servletContext对象
* 在这个项目中,如果通过servlet向servletContext里面存一个值,这时在项目里面其他所有servlet里面都可以取到这个值
* servletContext域:在一定的范围内,做存取值的操作
*servletContext域范围:整个的web项目
* 存值和取值
- 存值:setAttribute(String name,OBject object)参数1:设置值的名称 参数2:值
- 取值:getAttribute(String name)参数:设置值的名称
ServletContext context= getServletContext();
10、通过servletContext对象读取全局的初始化参数
* 全局初始化参数:所有的servlet里面都可以使用
* 配置全局初始化参数
- 配置在web.xml中,但是不能配置在任何一个servlet
<context-param>
<param-name>url</param-name>
<param-value>127.0.0.1</param-value>
</context-param>
* getInitParameter(String name):得到全局初始化参数的值
*
ServletContext context= getServletContext();
String usernamevalue=context.getInitParameter("username");
syso(uesrnamevalue);
* getInitParameterNames():得到所有的全局初始化参数的名称
*
ServletConfig context = getServletConfig();
Enumeration<String> enumeration=context.getInitParameterNames();
while(enumeration.hasMoreElements()){
String name=enumeration.nextElement();
syso(name);
}
11、使用传统方式读取web项目中的文件
* properties文件格式
* 读取数据 url username
* 里面的数据格式 类似 key value形式
* url=localhost
username=tom
password=123456
ip=1.0.0.1
* 读取properties文件
- 使用Properties类,在java.util包里
- load(InputStream inStream) 加载文件流
- 字节流和字符流:字符流只能操作文本文件,如果是图片不能操作,一般都是字节流
InputStream in = new FileInputStream("classes/db.properties");
Properties p=new Properties();//得到对象
p.load(in); //加载文件流
syso(p.getProperty("url")); //得到每一个值
syso(p.getProperty("username"));
syso(p.getProperty("password"));
syso(p.getProperty("ip"));
12、使用servletContext对象读取web项目中的文件
* 方法一:InputStream getRecourseAsStream(String path)
* 读取src下面文件的方法
ServletContext context = getServletContext();
//使用getResourceAsStream(String path)获取文件输入流
//首先第一个位置固定是/,后面的部分是文件在tomcat里的路径
InputStream in=context.getResourceAsStream("/WEB-INF/classes/db.properties");
//使用properties类 读取文件
Properties p=new Properties();
//加载文件输入流
p.load(in);
System.out.println(p.getProperty("url"));
System.out.println(p.getProperty("username"));
System.out.println(p.getProperty("password"));
System.out.println(p.getProperty("ip"));
* 读取包下面的文件
ServletContext context = getServletContext();
//路径的第一个位置固定是 / 后面的是文件在tomcat里的具体路径
InputStream in=context.getResourceAsStream("/WEB-INF/classes/com/fenqing/read/db1.properties");
Properties p=new Properties();
//加载文件输入流
p.load(in);
System.out.println(p.getProperty("url"));
System.out.println(p.getProperty("username"));
System.out.println(p.getProperty("password"));
System.out.println(p.getProperty("ip"));
* 读取webroot下的文件
ServletContext context = getServletContext();
//路径的第一个位置固定是 / 后面的是文件在tomcat里的具体路径
InputStream in=context.getResourceAsStream("/db2.properties");
Properties p=new Properties();
//加载文件输入流
p.load(in);
System.out.println(p.getProperty("url"));
System.out.println(p.getProperty("username"));
System.out.println(p.getProperty("password"));
System.out.println(p.getProperty("ip"));
* 方法二:String getRealPath(String path)
* InputStream in=new FileInputStream("完全路径");
* 需要使用servletContext里面的另一个方法 getRealPath()方法
ServletContext context=getServletContext();
//使用getRealPath(String path)得到具体路径,带盘符
String path=context.getRealPath("/db2.properties");
//使用传统方式读取文件
InputStream in=new FileInputStream(path);
//使用properties类读取文件
Properties p=new Properties();
p.load(in);
System.out.println(p.getProperty("url"));
System.out.println(p.getProperty("username"));
System.out.println(p.getProperty("password"));
System.out.println(p.getProperty("ip"));
14、反射的原理
* 反射是一些通用性比较高的代码,一般使用在框架里
* 通过反射得到类里面的所有的内容
** 所有内容包含:构造方法(有参和无参),属性,方法
* 创建一个java文件
1)保存到本地硬盘
2)编译成.class文件
3)使用类加载器加载到内存中(依赖于jvm)
** class文件在内存中可以使用Class类进行表示
** 首先得到Class类
** 有三种方式
- 类名.class
- 对象.getClass
- Class.forName("包类路径");
** 构造方法使用Constructor类表示
** 属性使用Filed类表示
** 方法使用Method类表示
15、url和uri的区别
* url:专门指的是网络地址
* uri:所有的网络地址
16、类加载器来读文件
* 适用范围:读取web项目中classes里面的文件
Class class1=this.getClass();
//使用getClassLoader()得到类加载器
ClassLoader classloder=class1.getClassLoader();
//直接写classes里面的文件的名称,不需要加 /
InputStream in=classloder.getResourceAsStream("db.properties");
Properties p=new Properties();
p.load(in);
System.out.println(p.getProperty("url"));
System.out.println(p.getProperty("username"));
System.out.println(p.getProperty("password"));
System.out.println(p.getProperty("ip"));
17、默认servlet
* 如果页面出现404问题,由默认servlet操作
* 在tomcat的web.xml中找默认servlet
* 配置启动时候创建servlet,使用这里面的值不能写成1
* <url-pattern>/</url-pattern>
* 如果把项目里面的一个servlet里面的url-pattern写成/,就会成为一个默认的servlet
* 在默认的servlet里面配置
<init-param>
<param-name>listings</param-name>
<param-value>false</param-value>
</init-param>
* 需要把listings的值设置成true,直接访问项目里面一个文件夹,可以把文件夹里面的所有的内容显示出来
Servlet的详解笔记
最新推荐文章于 2023-10-31 16:15:40 发布