@一贤不穿小鞋
1.项目架构:
1.1:B/S(broswer/server)
- 通过浏览器访问服务器端的项目.
- eg:淘宝,京东
- 优点:访问方便(不用安装客户端,有浏览器就可用);升级方便(服务器升级,客户端刷新就可);数据安全.
- 缺点:界面比较粗糙;服务器压力大.
1.2:C/S(client/server)
- 通过客户端访问服务器的项目.
- eg:大型网游,office
- 优点:界面比较精细;减轻服务器压力;
- 缺点:使用不方便(必须安装客户端才能使用);升级不方便(服务器每升级一次,客户端要对应升级);数据较不安全.
2.Web(World Wide Web)称为万维网,简单理解就是网站,它用来表示Internet主机上供外界访问的资源。
- web静态资源:指的是不变页面数据.用到技术:html+css+javaScript
- web动态资源:指的是页面上数据是从数据库中动态获取,不同时间看到的数据不同.用到技术:jsp+servlet
3.服务器容器
- 本质是一种软件,它可以将web项目通过软件(服务器容器)发布网上去.
- 开源免费:
Tomcat(主流Web服务器之一,适合初学者)
jetty(淘宝,运行效率比Tomcat高)
resin(新浪,所有开源服务器软件中,运行效率最高的)
注意:三者的用法从代码角度完全相同,只有在开启、关闭服务器软件时对应的命令稍有区别。掌握一个即掌握所有。
- 收费:
WebLogic(Oracle)
WebSphere(IBM)
提供相应的服务与支持,软件大,耗资源。
4.Tomcat:是apache公司和sun联合开发的开源的
- 免费的,体积小的子项目.
- 最近的Java技术总可以在tomcat得到完美支持.
4.1:bin:存放tomcat启动和停止的文件.
- 在window系统上,启动的文件:startup.bat 或 tomcat8.exe
关闭的文件:shutdown.bat 或 tomcat8w.exe
4.2:conf:存放tomcat的配置文件.
- context.xml里面可以配置tomcat的系统信息.
4.3:lib:存放tomcat所依赖的Jar包.
4.4:logs:存放tomcat的日志文件.
4.5:temp:存放临时文件.
4.6:webapps:存放要发布的web项目.
4.7:work:存放要发布的项目编译之后的文件.
5.Web项目的结构:
- java
- javaEE
src:存放java包和java源文件.
WebContent:存放前端页面(html,css,js,图片等),jsp页面.
WEB-INF:是整个web项目最安全的地方,外界不可访问.
lib:存放web项目所需要依赖第三方Jar包.
web.xml:是整个web项目最安全的地方.
6.配置Web项目默认起始页面:在web.xml中配置
index.html
7.eclipse与tomcat关联(第一次):
- 更改eclipse的发布目录:一般发布tomcat->webapps
8.布署和发布web项目:一个服务器容器可以发布一个到多个项目,为了快速测试每次只发布一个项目.
8.1:手动在tomcat中发布项目
- 先在tomcat的webapps下面创建一个与要发布的项目同名文件夹,再将要发布的项目WebContent下面所有文件夹及文件复制到tomcat的webapps下面刚创建的文件夹中,就完成将项目布署服务器容器tomcat中,再启动tomcat下bin下startup.bat,完成发布项目的操作.
8.2:用eclipse自动发布项目:
8.2.1:第一种
- 选中Servers窗体中tomcat->鼠标右键Add and Remove->选中要发布的项目->add->finish(项目就布署到tomcat中)->选中Servers窗体中tomcat->点击绿色/虫子按纽(项目发布)->打开浏览器输入网址(访问).
8.2.2:第二种:选中项目名->鼠标右键->run as->run on server->选中tomcat->next->选中要发布的项目->add->finish->自动打开默认浏览器访问当前发布 的项目.
- 注意:配置eclipse默认浏览器
9.用浏览器访问web项目
- http://ip地址:端口号/项目名/[页面地址]
1.Servlet
2.Servlet家族系谱图:
2.1 servlet接口
- 在其整个生命周期中,Init是初始化Servlet时调用的方法,Service是处理用户请求、响应用户结果的方法,destroy是Servlet正常销毁时执行的方法。
- 该方式较为麻烦,需要实现接口中所有方法,推荐不使用实现此接口
- 内部方法:
2.2 servletConfig接口
- 内部方法
2.3 GenericServlet抽象类
- 实现了Servlet接口,并在此基础上,增强实现了ServletConfig接口,具备了ServletConfig内的方法,主要是getServletContext()方法,由此直接方法可拥有直接获得ServletContext的能力。
- 且该抽象类内还单独提供了无参的init()方法,可将初始化功能和数据的代码在此处处理(不要借用有参的init()方法)。
- 提供init和destroy方法的简单实现,只需重写抽象service方法即可。
2.4 HttpServlet抽象类
- 继承了GenericServlet抽象类,其处理用户请求的方法与原本的Servlet一样在Service()方法中。在HttpServlet中提供了两个Service方法:
- 一个是
- 本方法目的是增强ServletRequest和ServletResponse为HttpServletRequest和HttpServletResponse,将其通过this传入本类中的另一个专门接收Http类型对象的方法,即下面的Service方法:
- 本次增强的目的,是因为为了调用HttpServletRequedoPostst和HttpServletResponse对应的doGet方法和doPost方法,两个方法对外提供,并最终被我们重写。
- HttpServlet类专注于HTTP请求,对应HTTP请求方法
- 推荐采用继承HttpServlet类,重写doget方法和doPost方法
2.5 当一个类继承了HttpServlet后,其执行流程为:
-
1、通过浏览器的地址栏输入的url地址的末尾,如本例的/aim,定位到web.xml配置文件(如下图)或者注解。
-
2、在web.xml配置文件中,url地址末尾定位到url-pattern,获得servlet的自定义名称“demo”,通过该名称在servlet中找到其对应类“com.test.servlet.Demo”,去执行Demo。
-
3、该类继承了HttpServlet,因此会先执行其父类的Service方法。(想象如果Demo不重写任何方法,其就是HttpServlet,则在完成其父类GenericServlet内的init()方法后,接着就是完成Service方法)。
-
该service方法如下:
-
4、上面的Service方法强转ServletRequest和ServletResponse,接着调用本类下的Http的Service方法,如下
-
本方法判断请求方式是get还是post,并最终回到我们创建的Demo中,调用我们重写的doGet和doPost方法。
3.在eclipse的web项目中导入依赖包的步骤
4.手动创建Servlet:
4.1:创建一个Java类,继承或实现Servlet家族中任一代.
4.2:重写init(),service()或 doGet()和doPost(),destory()
4.3:在web.xml中注册Servlet并给Servlet配置映射路径
FirstServlet
com.qf.day34.servlet.FirstServlet
FirstServlet
/aa
5.Web项目执行原理:
6.Servlet的生命周期
- 只调用一次的方法:构造方法,init(),destory()
- 6.1:客户端发送请求给服务器容器(tomcat).
- 6.2:服务器容器接收请求
- 6.3:服务器容器调用Servlet构造方法创建Servlet实例.
- 6.4:服务器容器根据Servlet实例调用init()方法完成Servlet初始化操作.
- 6.5:服务器容器根据Servlet实例调用service()接收请求并交给doGet()或doPost()来处理.
- 6.6:由Servlet将处理的结果返回给服务器容器.
- 6.7:服务器容器将结果响应给客户端.
- 6.8:服务器容器根据Servlet实例调用destory()销毁Servlet实例释放资源.
7.Servlet的生命阶段:
- 实例化阶段:服务器容器调用Servlet构造方法创建Servlet实例.
- 初始化阶段:服务器容器根据Servlet实例调用init()方法完成Servlet初始化操作.
- 请求处理阶段:服务器容器根据Servlet实例调用service()接收请求并交给doGet()或doPost()来处理.
- 销毁阶段:服务器容器根据Servlet实例调用destory()销毁Servlet实例释放资源.
8.Servlet是单例的,可以供多个线程来访问.(面试)
- 多线程同时访问同一个Servlet的成员变量会出现安全问题:
- 用线程同步解决.
- 让Servlet实现SingleThreadModel,这样如果有多个线程访问这个Servlet时,会给每个线程分配一个Servlet实例.因为这样的Servlet处理请求效率太底,所以被淘汰.
- 推荐在Servlet中多用局部变量.
8.url-pattern定义匹配规则,取值说明:
精确匹配 /具体的名称 只有url路径是具体的名称的时候才会触发Servlet
后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet
通配符匹配 /* 匹配所有请求,包含服务器的所有资源
通配符匹配 / 匹配所有请求,包含服务器的所有资源,不包括.jsp
9.load-on-startup:可以配置Servlet加载顺序,数字越小越先加载,只能配置正数,如果配置0和负数相当于没有配置.
eg:
FirstServlet
com.qf.day34.servlet.FirstServlet
1
FirstServlet
/aa
10.Web项目上下文对象ServletContext的使用
- 一个web项目只有一个上下文对象,它与Web项目存亡,上下文对象中存的数据,整个Web项目共享.
10.1获得上下文对象:在任何一个Servlet中直接调用方法得到
ServletContext sc=this.getServletContext();
10.2:常用方法:
- getInitParameter(String name) 通过全局参数名得到value值.
- setAttribute(String name, Object object);将数据按key-value对方式存在上下文对象中
- getAttribute(String name) 通过Key名得到value值
- removeAttribute(String name) 根据Key名删除value值
- getContextPath() 得到web项目路径
- getRealPath(String path) 得到文件夹相对web项目的路径
10.3:配置Web项目全局参数:
sname
小白菜
- 第二步:在web项目的任一个Servlet中可获取全局参数
//获得上下文对象(全局对象)
ServletContext sc=this.getServletContext();
//获得全局参数值
String sname=sc.getInitParameter("sname");
System.out.println("在FirstServlet得到全局参数为:"+sname);
10.4:上下文对象存值,取值,移除值
//将数据存在上下文对象中
sc.setAttribute("sage", 11);
//取出上下文对象中数据输出
System.out.println("取出上下文对象中数据为:"+sc.getAttribute("sage"));
//移除上下文对象中数据
sc.removeAttribute("sage");
//取出上下文对象中数据输出
System.out.println("移除后,取出上下文对象中数据为:"+sc.getAttribute("sage"));
System.out.println("全局路径:"+sc.getContextPath());
11.注解版Servlet
- 在Servlet3.0之前不支持注解,所以那时只能用配置Servlet;
- 在Servlet3.0之后全面支持注解,同时兼容配置版Servlet.
- 作用:用于将一个类声明为 Servlet
- 描述:该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为 Servlet。
- 属性详解:该注解具有下表给出的一些常用属性(以下所有属性均为可选属性,但是 vlaue 或者 urlPatterns 通常是必需的,且二者不能共存,如果同时指定,通常是忽略 value 的取值)
package com.item.filter;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;
//注解配置
@WebServlet(
displayName = "UserServlet" , //描述
name = "UserServlet", //servlet名称
urlPatterns = { "/user" }, //url
loadOnStartup = 1, //启动项
initParams = { @WebInitParam(name = "username", value = "张三") }
)//初始化参数
public class UserServlet extends HttpServlet {
private String username;
@Override
public void init(ServletConfig config) throws ServletException {
//获取初始化信息:张三
username = config.getInitParameter("username");
}
@Override protected
void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//主要内容操作
}
}
@WebServlet(urlPatterns = {"/simple"}, asyncSupported = true,
loadOnStartup = -1, name = "SimpleServlet", displayName = "ss",
initParams = {@WebInitParam(name = "username", value = "tom")})
public class SimpleServlet extends HttpServlet{... }
@WebServlet("/FourServlet")//默认用类名作为注册名,只需配置映射路径
//@WebServlet(name="FourServlet",value="/FourServlet")//配置注册名和映射路径名
public class FourServlet extends HttpServlet {
}
总结:
1.项目架构
2.web资源
3.服务器容器
4.tomcat介绍及7个目录
5.用tomcat手动发布项目
6.eclipse与tomcat关联
7.eclipse自动布置发布项目2种
8.访问web项目
9.Servlet定义及家族
10.手动创建Servlet,了解原理
11.Servlet生命周期及阶段
12.Servlet工作原理
13.自动创建Servlet
14.加载顺序配置及上下文对象的常用方法及使用