JavaWeb从头再来系列之Servlet基本知识介绍

一: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 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值