33.tomcat+servlet

@一贤不穿小鞋

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的配置文件.

  • server.xml里面可以配置端口.
				<Connector port="8888" protocol="HTTP/1.1"
               			connectionTimeout="20000"
               			redirectPort="8443" />
  • 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中配置

<!--配置web项目的默认起始页面,相对WebContent下面的文件路径-->
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>

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

  • 前后台交互的技术.
  • 本质是一种特殊Java类.

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项目中导入依赖包的步骤

  • 将需要的Jar复制到当前项目lib目录.

4.手动创建Servlet:

4.1:创建一个Java类,继承或实现Servlet家族中任一代.

4.2:重写init(),service()或 doGet()和doPost(),destory()

4.3:在web.xml中注册Servlet并给Servlet配置映射路径

	<!-- 注册FirstServlet -->
  <servlet>
  	<!-- Servlet注册名,自定义 -->
  	<servlet-name>FirstServlet</servlet-name>
  	<!-- Servlet在src下路径 -->
  	<servlet-class>com.qf.day34.servlet.FirstServlet</servlet-class>
  </servlet>
  <!-- 配置Servlet的映射路径,供前端访问 -->
  <servlet-mapping>
  	<!-- Servlet的注册名称, 与注册时Sevlet名称一致-->
  	<servlet-name>FirstServlet</servlet-name>
  	<!-- 当前FirstServlet的映射路径,自定义,专供前端访问的路径 -->
  	<url-pattern>/aa</url-pattern>
  </servlet-mapping>

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:<servlet>
    <servlet-name>FirstServlet</servlet-name>
    <servlet-class>com.qf.day34.servlet.FirstServlet</servlet-class>
    <!-- 配置servlet加载顺序 -->
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>FirstServlet</servlet-name>
    <url-pattern>/aa</url-pattern>
  </servlet-mapping>

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项目全局参数:

  • 第一步:在web.xml中配置全局参数
<!-- 配置全局参数 -->
  <context-param>
  	<param-name>sname</param-name>
  	<param-value>小白菜</param-value>
  </context-param>
  • 第二步:在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.加载顺序配置及上下文对象的常用方法及使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值