一:Servlet概述
1.1:什么是Servlet?
Servlet是JavaWeb的三大组件之一,它属于动态资源。Servlet的作用是处理请求
(1) 接收请求数据
(2) 处理请求
(3) 完成响应
1.2:实现Servlet的方式(三种)
实现Servlet
继承GenericServlet
继承HttpServlet
1.3:Servlet的出生
Servlet默认是第一次被访问的时候被web服务器给创建,
也可以是在web.xml配置<load-on-startup>非负整数</load-on-startup>随项目启动而创建!
1.4:生命周期方法:
void init(ServletConfig config):出生之后(调用一次):可以把Servlet的初始化工作放里面!
void service(ServletRequest req, ServletResponse res):每次处理请求都会被调用!
void destroy():死亡之前(调用一次:通常是服务器关闭):释放资源等操作!
1.5:特点:
Servlet 是单例的,也就是说一个Servlet类,只能有一个对象!
线程是不安全的,所以效率高,
也正是因为是线程不安全的,所以不要在Servlet中创建成员,创建局部变量即可
可以创建无状态成员,可以创建有状态成员(但状态必须是只读!)
1.6:url-pattern (URL必须是以"/"开头)
(1)可以在<servlet-mapping>中给出多个<url-pattern>
(2)可以在<url-pattern>中使用通配符*
路径匹配:<url-pattern>/servlet/*</url-pattern> :/servlet/a,/servlet/b
扩展名匹配:<url-pattern>*.do</url-pattern>:/ab/cd/ef.do,/a.do
什么都匹配: /*
注意:请注意,通配符要么为前缀,要么为后缀,不能出现在URL中间位置,也不能只有通配符。例如:/*.do就是错误的
1.7:web.xml文件的继承(了解)
在${CATALINA_HOME}\conf\web.xml中的内容,相当于写到了每个项目的web.xml中,它是所有web.xml的父文件。
难怪什么Session默认超时时间为30分钟,什么支持的MIME类型,还有默认访问的html/htm/jsp等!这些都是有依据的!
1.7:ServletContext概述
服务器会为每一个应用创建一个ServletContext对象,创建是在服务器启动的时候,销毁是在服务器关闭的时候
一个项目只有一个ServletContext对象,我们可以在N个Servlet中获取到这个唯一的对象,使用他在多个Servlet之间
传递数据!
那怎么获取ServletContext呢?
(1)ServletConfig#getServletContext();
(2)GenericServlet#getServletContext();
(3)HttpSession#getServletContext()
(4)ServletContextEvent#getServletContext()
1.8:javaWeb中的四大域对象
1.pageContext
2.ServletRequest
3.HttpSession
4.ServletContext
所有的域对象都有存取数据的功能,因为底层是一个Map
void setAttribute(String name, Object value)
Object getAttribute(String name)
void removeAttribute(String name)
Enumeration getAttributeNames() :获取所有域属性的名称;
1.9:ServletContext获取应用初始化参数
1.10:ServletContext获取资源相关方法
获取真实路径:String realPath = servletContext.getRealPath(“/a.txt”)
获取资源流:InputStream in = servletContext.getResourceAsStream(“/a.txt”);
1.11:访问量统计的网站,即“本页面被访问过XXX次”
ServletContext application = this.getServletContext();
Integer count = (Integer)application.getAttribute("count");
if(count == null) {
count = 1;
} else {
count++;
}
response.setContentType("text/html;charset=utf-8");
response.getWriter().print("<h1>本页面一共被访问" + count + "次!</h1>");
application.setAttribute("count", count);
1.12:使用Class 或者 ClassLoader来获取类路径下的资源
对于javaWeb项目而言,类路径就是/WEB-INF/classes , 和 WEB-INF/lib 下的每个jar包!
第一种方式: ClassLoader: 只是相对classes目录,没有加不加"/" 之说
第二种方式: Class: 加 / 相对于classes目录, 不加 / 相当于当前.class文件所在目录 (掌握)
注意:为什么src下的a.txt可以直接使用getResourceAsStream("a.txt")获取,不是说ClassLoader是相对于classes目录的吗
因为最后项目部署发布后,所有src下面的东西会copy一份到WEB-INF/classes目录下(除了java文件会编译成.class,其他的
文件都一模一样)
代码演示:
public class Test {
public static void main(String[] args) {
// TestClassLoader();
TestClass();
}
private static void TestClass() {
//获取b.txt
//1. Class不加 / 是相对于当前.class文件所在目录,也就是Test当前所在目录
InputStream inputStream = Test.class.getResourceAsStream("b.txt");
System.out.println(inputStream);
//获取a.txt
//2. Class加 / 是相对于classes目录下
InputStream inputStream2 = Test.class.getResourceAsStream("/a.txt");
System.out.println(inputStream2);
}
private static void TestClassLoader() {
//ClassLoader:是相对于classes目录,没有加不加 / 之说!!!
ClassLoader loader = Test.class.getClassLoader();
InputStream inputStream = loader.getResourceAsStream("a.txt");
System.out.println(inputStream);
InputStream stream = loader.getResourceAsStream("cn/itcast/wzj/b.txt");
System.out.println(stream);
}
}
项目结构图:
关于上面的没有在WEB-INF下创建classes目录的问题:是一个默认输出的问题!!
设置"source folder"与"output folder".
source folder:存放.java源文件的根目录;
output folder:.class编译输出的根目录;
纯“java project”中,一般把"src"设置为source folder,把bin设置为output folder;
web project”中,一般把"src"设置为source folder,把WEB-INF/classes设置为output folder;
“java build path”中的“source”页签:这个就是用来设置"source folder"与"output folder"的
右键工程名->"properties"->"java build path"->"source"->"output folder",点“browser”选定一个文件夹做为根目录,
其实无论是在创建java Project,还是 web Project,创建的时候都有说!
创建java Project时,不要直接点finish, 点next会看到!
创建web Project时,不要直接点finish, 点next会看到!
所以说我上面创建的web Project项目.class文件默认输出是在build\classes (我看了一下本地也确实如此!)
怎么解决呢?右键项目Build path
这样我们就可以将.class文件输出到指定WEB-INF/classes目录下了,奇怪的是eclipse视图下的WEB-INF/classes还是没有显示
classes目录,但本地上WEB-INF/classes已经好了,说明成功了,只是eclipse显示的问题!
1.13:最后解决在eclipse web项目下无法显示classes文件夹的方法
(1)通常的eclipse视图看不到此文件夹,需要切换视图为Navigator (Window->show view->navigator)。
(2)在Eclipse中选中你的项目,右键--属性--java构建路径(Java build path)--source--add folder,选择你的src目录。在“Allow output folders for source folders”前打钩。展开上面project1/src,双击output folder,选中Specific output folder,并选择“project1/webapp/WEB-INF/classes”。
双击后出现
就成功了!
能力有限:暂时还不知道,怎么设置成让eclipse将.class文件默认输出在WEB-INF/classes下,并显示!,有知道的大佬麻烦留个言!
这里面好像有答案,暂时不深究了,没这么多精力 哈哈哈哈!!有兴趣的同学可以look 一下
https://stackoverflow.com/questions/4511406/how-to-change-dynamic-web-project-default-source-and-output-folders-in-eclipse/31581681#31581681
来自:虽然帅,但是菜的cxy