TomCat服务器搭建及初识servlet

Tomcat服务器搭建
第一章 web开发概述
1-1 C/S架构和B/S架构
(1)C/S架构:Client/Server 客户端/服务器。要求客户端电脑安装 一个客户端程序。
常见应用:QQ,迅雷,阿里旺旺等
 优点:
用户体验好,效果炫
应用服务器运行数据负荷较轻,部分计算功能在客户端完成。
 缺点:
占用硬盘空间
维护麻烦
安装使用依赖其他条件
(2)B/S架构:Browser/Server 浏览器/服务器。通过浏览器与服务 器交互,不需要安装其他程序
 常见应用:淘宝,京东 12306 等
 优点:
访问只需要浏览器即可
维护非常方便
 缺点:
动画效果受浏览器限制
应用服务器运行数据负荷较重。大部分计算都在服务器端,增 加服务器压力。使用Ajax可以改善部分用户体验。

甲方是一家正常运营的企业
企业中有200人

甲方委托我们乙方做一个OA项目
该项目公司200人都要用

我们作为乙方,假设我们是项目经理,我们考虑应该使用CS架构还是BS架构来完成这个OA项目???

CS

BS

1-2 web简介
(1)什么是web通信(简称web)
WEB采用B/S通信模式,通过超文本传送协议(HTTP, Hypertext transport protocol)进行通信。通过浏览器地址栏编写URL,向服务器发送一个请求,服务器端根据请求进行相应的处理,处理完成之后,会向浏览器作出一个响应,及将服务器端资源发送给浏览器。
(2)什么是web资源
存储在服务器上的资源,提供给浏览器访问用的资源都叫做web资源.

在这里插入图片描述

a、静态资源:HTML 内容不可变的资源

今日头条:世界杯冠军即将诞生

b、动态资源:JSP/SERVLET 内容可变的资源
String news = 从数据库取得的今天的新闻数据

今日头条:news

第二章 Tomcat服务器概述
2-1 服务器硬件和服务器软件概述
服务器的操作系统:linux

2-2 市场上常见的web服务器介绍
Tomcat:Apache组织提供一个免费的小型的服务器软件。
支持Servlet和JSP规范。
WebLogic:BEA公司的一个收费的大型的服务器软件,后被 Oracle收购。支持EE的所有的规范
WebSphere:IBM公司的一个收费的大型的服务器软件,支持EE的所有的规范。
JBoss:Redhat公司提供,是一个基于J2EE的开放源代码的应用服务器。使用JBoss的最大的好处是可以方便的管理EJB。

EJB

spring

2-3 Tomcat简介
Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。
支持Servlet和JSP 规范,且最新的Servlet 和JSP 规范总是能在Tomcat 中得到体现。

2-4 Tomcat版本介绍
版本 完美对应jdk版本 支持servlet版本
6.0.x jdk5 (1.5) 2.5
7.0.x jdk6 (1.6) 2.5、3.0
8.0.x jdk7 (1.7) 2.5、3.0、3.1
9.0.x jdk8 (1.8) 2.5、3.0、3.1、4.0

servlet:2.5 最基础的版本,所有的servlet开发的组件都会在此版本中体现出来.
servlet3.0以上的版本,支持注解式开发(Annotation),这种开发形式是为了给我们提供便利的.好多servlet应用的核心组件都被隐藏包装起来了,我们是看不到的.

2-5 Tomcat文件夹结构

在这里插入图片描述
解析:
bin:可执行程序脚本目录
启动脚本:startup.bat
停止脚本:shutdown.bat

conf:配置文件目录
	核心配置文件:server.xml
	所有web项目默认配置文件:web.xml
lib:依赖库,tomcat和web项目中需要使用的jar包
logs:日志文件
temp:临时文件目录,文件夹内内容可以任意删除。
webapps:默认情况下发布WEB项目所存放的目录。
work:tomcat处理JSP的工作目录。

第三章 Tomcat服务器应用
3-1 在webapps文件夹中模拟创建项目_发布并访问项目
实战演示
(1) 在webapps文件夹下模拟创建一个项目,里面有一个index.html资源(一会我们打开浏览器要访问的资源)
在这里插入图片描述
(2)启动服务器
在这里插入图片描述

对于服务器的启动,双击以上startup.bat
双击之后,可能会出现两种结果
结果1:弹出了一个黑色背景的控制台,控制台始终存在,显示我们服务器启动时的相关信息.服务器启动成功
结果2: 弹出了一个黑色背景的控制台,但是控制台一闪而过,马上消失掉.服务器启动失败.
如果出现结果2:
查询环境变量有没有配置JAVA_HOME
JAVA_HOME要求配置的为jdk安装的根路径

在这里插入图片描述
在这里插入图片描述

如果配置完以上环境变量,启动服务器控制台还是一闪而过.
查看你的tomcat的路径中有没有出现中文或是空格
如果经过以上配置,控制台还是一闪而过.
试着以管理员的身份来启动tomcat
如果以管理员身份运行还是一闪而过,说明你的系统里曾经安装过与tomcat不兼容的软件或者是你的window操作系统的子版本号根本就不兼容tomcat.等待下节课我么将tomcat集成到eclipse中一定是好用的.

服务器启动之后,我们来打开浏览器访问相关项目下的资源

访问方式:
协议://ip地址:端口号/项目名/具体的资源路径

http://localhost:8080/project1/abc/index.html

3-2 Eclipse集成Tomcat的详细步骤
实战演示
window-》属性在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

调出server视图,该视图用来操作tomcat服务器
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
以上步骤操作之后,我们会看到如下两项信息
操作tomcat组件的视图信息
在这里插入图片描述
在这里插入图片描述

还有一项信息是,我们在项目的菜单栏多了一项

该项目是为我们提供服务的相关项目,千万不要去碰这个项目,也不要删除,不要关闭
在这里插入图片描述

为以上视图组件做右键操作
我们会看到如下选项
start:开启服务器
stop:关闭服务器
debug:以debug调试的形式来启动服务器
add and remove:部署项目/移除项目
restart:重新启动服务器
restart in debug:以debug调试的形式来重新启动服务器

对于服务器的关闭
有两种关闭方式
方式1:
按照上述点击stop的形式来正常关闭服务器
方式2:
强制关闭服务器
我们以后的实际项目开发应用的是方式2在这里插入图片描述

3-3 创建web项目的步骤
实战演示
3-4 Eclipse发布项目并访问项目
实战演示
3-5 WEB-INF文件夹的作用

3-6 404和500错误的说明

3-7 Servlet初识演示

第四章 JAVA EE 简介
4-1 什么是JAVA EE

4-2 JAVA EE API及13个技术规范
API是应用程序编程接口,在Java中呈现为一套类库
任何一个API都包括三要素:API源码、API字节码、API帮助文档
JavaSE API:Java标准类库
JavaEE API:支撑完成企业级项目开发的另一套类库
JavaEE下的13个技术规范(表示能够应用在JAVA EE中的核心开发技术)。
在这里插入图片描述

4-3 JAVA EE 和 JAVA WEB的关系
JAVA EE包含一系列的技术规定,比如jdbc,ejb,jndi,jsf一系列的技术,这些技术主要是为了解决90年代开发企业应用的一些难题的,其中主推的是ejb。但是,由于这些技术很多是由专家委员会拍脑袋做出来的,再加上时代的原因,很多技术根本不好用,甚至不能用,比如所谓的分布式ejb,多客户端支持,在02年以后用的人越来越少,最后差不多也就没人用了。
JAVA WEB就是用java来开发web程序,然后里面使用了一些j2ee的技术,比如jsp,servlet等。

第五章 Tomcat对于线程并发问题的处理
5-1 Tomcat线程池概述

5-2 Tomcat对于线程并发数的设置
<Connector port=“8080” protocol=“HTTP/1.1” connectionTimeout=“20000” redirectPort="8443"maxThreads=“200” acceptCount=“100”/>
maxThreads:tomcat起动的最大线程数,即同时处理的任务个数,默认值为200
acceptCount:当tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100

5-3 Tomcat的线程并发处理_场景解析
情况1:接受一个请求,此时tomcat起动的线程数没有到达maxThreads,tomcat会起动一个线程来处理此请求。
情况2:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,tomcat会把此请求放入等待队列,等待空闲线程。
情况3:接受一个请求,此时tomcat起动的线程数已经到达maxThreads,等待队列中的请求个数也达到了acceptCount,此时tomcat会直接拒绝此次请求。


1.Servlet在web开发中的作用*
接收web端浏览器发出的请求,并做出响应

2.Java开发中如何写一个Servlet*

servlet的创建步骤
  • 1.创建一个普通的java类,继承javax.servlet.http.HttpServlet;
  • 2.重写父类中的两个方法,分别是doGet方法和doPost方法
  •  这两个方法就是servlet用来接收并处理浏览器的请求的核心方法
    
  • 3.将方法体中的所有的内容去掉
  • 4.将方法中的参数的变量名修改为 request response
  • 5.完成方法体

3.Servlet对象生命周期*
☆☆☆☆☆
servlet的生命周期,表示的是servlet从创建到销毁的全过程
第1步:启动服务器,servlet没有创建
第2部:当我们的浏览器发生请求,用到指定servlet时候,servlet对象才开始创建。serlet创建后
当第二~第n次访问的时候就不重新创建对象了,而是使用第一次创建的那个对象(单例)
第3步:当servlet对象创建完成之后,马上调用init方法进行初始化操作。
4.我们以后的请求真正是由doGet/doPost方法来进行处理。
5.关闭服务器,servlet对象销毁
6.如果只是正常的关闭服务器servlet在销毁前,要调用distory的方法进行最后的处理工作
7.加入load-on-startup可以更改servlet的创建时机,由以前的用到时创建更改为启动服务器的时候就创建
(从单例来考量,是由懒汉式转为饿汉式)
8.servlet是单例,但是一种假单例。
真单例是new不出来第二个对象,假单例,我们用的是以单例的形式存在的对象,但是可以手动new出来其他对象
servlet在外部类new出来其他类对象没有任何意义。

4.web.xml文件在服务器启动阶段被解析*

   <load-on-startup>1</load-on-startup>就保存在XML中的,在启动服务器的时候如果不加上前面内容就不会创建servlet对象

5.什么是Gof*

《Design Patterns: Elements of Reusable Object-Oriented Software》
(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides
合著(Addison-Wesley,1995)。
这几位作者常被称为"四人组(Gang of Four)"。

6.会写单例模式吗*
单例是一种软件设计模式,一个类只有一个实例,也就是说只有一个对象。
单例模式之饿汉式
public class FootBall{
private FootBall(){}//构造方法必须私有化,防止其他类调用。
private static FootBall fb = new FootBall();//静态/私有的对象
public static FootBall getFootBall(){//静态的方法
return fb;
}
}
单例设计模式之懒汉式
public class FootBall2{
private FootBall2(){}
private static FootBall2 fb;
public static FootBall2 getFootBall(){
if(fb==null){
system.out.print(“创建了fb”)
fb ==new FootBall2();
return fb;
}
}

7.单例包括真单例和假单例,Servlet属于假单例*

  真单例是new不出来第二个对象,假单例,我们用的是以单例的形式存在的对象,但是可以手动new出来其他对象
  servlet在外部类new出来其他类对象没有任何意义。

8.tomcat服务器默认最多支持200个线程同时并发访问,这个可以配置吗,在哪里配置?*

<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000"
 redirectPort="8443"maxThreads="200" acceptCount="100"/>   

在tomcat服务器 的配置文件中 D:\tomcat\tomcat9\apache-tomcat-9.0.0.M10\conf\server.xml 下面的63行
修改成如上:
就是在后面加上 maxThreads=“200” acceptCount=“100”,默认是200但是经过开发试验最好不要超过300,因为跟
服务器的硬件等配置有关并不是越高越好,物极必反也是这个道理。

9.如何在服务器启动阶段实例化(创建)Servlet*

在XML文件中添加 在class标记下面1

10.HTTP协议包括请求协议和响应协议,浏览器发送给服务器的是请求协议,服务器发送给浏览器的是响应协议*

理解

11.get和post请求有什么区别?怎么选择使用?*

get提交
参数传递
显示的将参数挂在url路径的后面
安全性 低
大量参数的传递可能传递的不全
参数的中文的支持性
对于我们的示例,get请求提交的中文参数servlet接收到之后,显示的仍然是中文,没有出现乱码.
但是以上结果,完全在于是我们的tomcat9的环境完美支持get请求中文参数的传递.
如果企业里面使用的是较低版本的tomcat,那么中文参数有可能会出现乱码.
我们要为get请求方式设置utf-8的字符编码
在tomcat conf/server.xml 6x行
URIEncoding=”UTF-8”就可以解决tomcat版本低get中文参数出现乱码的问题
执行效率
get请求执行效率较高

post提交
参数传递
参数没有显示的挂在url路径的后面
(参数是以http协议请求体打包的形式进行传递)
安全性 高
不用担心大量参数传递的问题(地址栏不显示,不用担心超出浏览器地址栏的字符数)
参数的中文的支持性
经过示例,post提交,中文参数出现了乱码问题,servlet接收参数前,需要对接收的参数进行字符编码处理.
以上代码仅针对post请求参数处理.
(3)执行效率
与get请求方式比较起来,执行效率相对较低.

在我们的实际项目开发中,对于get提交和post提交如何选择:

如果不涉及到安全性问题,如果不涉及到大量的参数的传递问题,一律使用get方式提交效率较高,否则一律创建表单使用post方式提交.

在我们实际项目开发中,servlet模板习惯于这样来改造:
this.doGet代替执行this.doPost

12.响应状态码404,500都是代表什么*
执行流程
从浏览器发出的请求的路径为:
http://localhost:8080/servlet1/myServlet1.do

	该路径在web.xml中会进行检索(检索web.xml中的url-pattern)
	
	以上访问路径会自动的被我们的系统拆分成为两部分
	第一部分 从开始到项目名  http://localhost:8080/servlet1 注意路径后面没有/
	第二部分 第一部分剩下的部分/myServlet1.do 注意前面有/
	
	系统会拿着第二部分路径与web.xml中的url-pattern做匹配
	如果匹配不上,说明访问的路径不正确,会出现404现象。


	如果能够匹配上,会根据servlet-name的配置找到相应的servlet类来处理浏览器的请求
	在servlet类中由doGet或者doPost方法来处理我们的请求 ,这时候如果出现500异常,那就是xml配置文件有问题。

13.浏览器向web服务器提交数据的格式是怎样的(传参数的格式)*

url?key1=value&key2=value2&key3=value3

14.能够使用response向浏览器响应HTML,并且可以处理响应时的中文乱码。*

request.setCharacterEncoding(“UTF-8”);
request.getParameter(“userName”);

15.能够使用request接口获取表单提交的数据*
request.getParameter(“userName”);

16.web服务器启动时报错,如何进行排查*

如果服务器中没有项目存在,启动服务器报错,说明服务器本身出现了问题.
有可能是某些配置文件被我们破坏掉.在某些情况下文件被破坏掉了没有办法排查,
所以最简单的方式是从新解压一份tomcat服务器,重新集成到eclipse.

如果服务器中有项目存在,启动服务器报错,说明是项目的问题,
就去查看项目中的web.xml文件配置有没有错误.
url-pattern前面没加/
servlet-name没有匹配项
servlet-class配置错误,服务器启动不报错,但是访问返回500响应码

17.修改web应用当中的哪些文件需要重启服务器*
修改前端文件,不用重新启动服务器
修改后端servlet文件,不用重新启动服务器,
但是需要等待java文件重新编译成class文件重新加载的过程.
在本阶段,老师在修改完servelt文件之后,为了保证程序测试的正确性,每一次都会重新启动服务器.
修改web.xml文件,必须重新启动服务器.
注意:我们在对项目进行移入移除的过程中,必须首先关闭服务器.

18.在eclipse当中如何修改一个web应用的名称,以及在eclipse当中copy一个项目的时候需要注意什么*

右键工程详见2.5

19.url-pattern的编写方式都有哪些*
/abc/servlet1.do:精确路径匹配
/abc/:部分路径匹配
/
:通配符匹配
*.do:后缀名匹配

20.ctrl+shift+delete删除浏览器内存的

21.domain在JAVA中被称作领域模型,就是数据库里的表,比如员工表对应JAVA中一个类,就是数据库与java的一一对应模式


1.转发和重定向在原理上有什么区别,代码分别怎么实现?*

最简单理解:转发—请求没有中断;而重定向—请求产生中断了。获取新路径了

转发  :一次请求一次响应;请求的路径停留在第一次请求的路径,服务器内部资源指向了web-INf,直接访问接收不到。

request.getRequestDispatcher("/myServlet1.do").forward(request,response);
服务器直接内部指向资源。

重定向: 将重定向资源的路径作为新资源的路径,全程两次请求两次响应。请求的路径停留在新资源的路径

		response.sendRedirect("/project2/index.html");//必须是传统的绝对路径。

浏览器指向资源(重定向只传给我们路径,我们自己找资源)

2.ServletContext是什么,代表什么,该对象什么时候被创建,创建几次,什么时候被销毁。*
ServletContex是项目中的全局管理者。 可以应用在每个servlet中,也服务于每个servlet。当服务器启动时,
服务器会自动的为我们创建一个上下文对象以单例的形式存在于服务器上,关闭服务器的时候销毁。
取得方式一。 ServletContext application= this.getServletContext(); 创建1次

3.在web.xml文件中使用context-param配置给Servlet传值,通过这种方式所有的Servlet对象都是可以共享这个数据的。*

		    这种方式是配置全局参数   <context-param>
		       <param-name>encoding</param-name>
		       <param-value>utf-8</param-value>
			</context-param>

4.能够向application范围中绑定数据,从application范围中读取数据*
ServletContext application = this.getServletContext();
application.setAttribute(String key,Object value);
application.getAttribute(String key)Object;

5.ServletConfig是什么,代表什么,它和Servlet什么关系*

ServletConfig对象是Servlet对象的配置对象.Servlet对象在创建完毕后,系统会马上为我们创建出来一个相应的ServletConfig对象作为Servlet对象的配置对象.
ervletConfig对象是可以有多个的(每有一个servlet对象,就有一个ServletConfig对象)

在我们实际项目开发中,如果是对于企业级的项目开发,那么ServletConfig对象肯定用不到.
ServletConfig对象主要是针对于将来的表现层框架的开发而使用的.

6.在web.xml文件中通过init-param配置可以给Servlet传值,这种方式传递的数据只有当前的Servlet对象可以使用,其它Servlet不能用。*

        这种方式是配置全局参数在xml配置文件中添加   <context-param>
		       <param-name>encoding</param-name>
		       <param-value>utf-8</param-value>
			</context-param> 
			ServletContext application = this.getServletContext();
			String str1 = application.getInitParameter("encoding");
			System.out.println(str1);
			获得的结果就是utf-8.

7.什么是字符编码方式,常见的字符编码方式有哪些?*

unicode/utf-8/JBK

8.乱码是怎么产生的,编码和解码分别是什么*
不同编码/解码环境下进行数据交流就会产生乱码。
编码:web开发时出现的中文乱码问题。

  1. get请求参数字符编码的处理:conf/servr.xml 63行端口号的后面加入
    URIEncoding=“UTF-8”
  2. 在html中meta charSet=“UTF-8”;
    3.post请求参数字符编码的处理:request.setCharacterEncoding(“UTF-8”);
    4.响应流字符编码的处理。response.setContentType(“text/html;charSet=utf-8”);
    5.?characterEncoding=UTF-8"

总结在html中会用charSet=utf-8
在其他中比如xml中用encoding=“utf-8”;

编码:将程序代码转化为二进制保存在计算机的过程称为编码反之解码。

9.数据保存之后的乱码怎么解决*(数据保存之后就到数据库里面了)

private static final String url = "jdbc:mysql:192.168.148.8:3306/test     这里加入这句话?CharacterEncoding=UTF-8";

10.数据库中的乱码怎么解决*
通过jdbc往数据库里面存值的字符编码的处理
要求数据
后台 utf-8
数据库安装的过程中,配置的是UTF-8环境
创建的数据库为UTF-8的格式

在 private static final String url = "jdbc:mysql:192.168.148.8:3306/test     这里加入这句话?CharacterEncoding=UTF-8";

11.数据传递过程中的乱码包括三种方式:第一种方式为万能方式。
第二种方式request.setCharacterEncoding(“encoding”),但这种方式只对请求体编码,所以只能解决POST请求乱码。
第三种方式修改server.xml文件,但这种方式只能对请求行编码,所以只能解决GET请求乱码。*

  String str11=new String(str1.getBytes("ISO8859-1"),"utf-8");

12.怎么设置web站点欢迎页面*

把url路径仅仅只是显示到了项目,没有指定具体的资源路径,那么我们配置的欢迎页面会响应出来。

//以下方法结合了javaScript知识把默认的欢迎页跳转到下个页面。//开发中常用。

13.web站点的欢迎页面默认为index.html/index.htm/index.jsp,为什么*

不论我们配置的欢迎页是一种什么类型的页面,我们习惯于将欢迎页命名为index,
因为index是我们web开发中一种约定俗成的初始页名字的叫法.

14.web站点的欢迎页面可以是一个Servlet*

  <welcome-file-list>
<welcome-file>index.html</welcome-file>
    <welcome-file>myLoginServlet.do</welcome-file>

url-pattern去掉“/”

15.Servlet存在线程安全问题吗,为什么不建议在Servlet中使用成员变量*
使用成员变量,在Servlet中存在线程安全问题
//以后不用servlet中的成员变量了,使用局部变量,每根线程来了以后,局部变量为每一个线程独立的分配一份空间,
绝对不会出现线程安全问题。
public class MyServlet5 extends HttpServlet {

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	System.out.println("进入servlet5");
	
	String username = request.getParameter("username");
	
	System.out.println(username);
	
}

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	
	this.doGet(request, response);

}

}

16.能够独立的封装DBUtil吗?*

package com.wkcto.util;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DBUtil {

private DBUtil(){}

static{
	
	try {
		Class.forName("com.mysql.jdbc.Driver");
	} catch (ClassNotFoundException e) {
		e.printStackTrace();
	}
	
}

private static final String url = "jdbc:mysql://localhost:3306/test";
private static final String user = "root";
private static final String password = "root";

//创建连接 返回连接
public static Connection getConn() throws SQLException{
	
	Connection conn = DriverManager.getConnection(url, user, password);
	
	return conn;
	
}


//关闭相关资源
public static void myClose(Connection conn,PreparedStatement ps,ResultSet rs) throws SQLException{
	
	//关闭资源的顺序为  按照创建的顺序 逆序关闭
	if(rs!=null){
		rs.close();
	}
	
	if(ps!=null){
		ps.close();
	}
	
	if(conn!=null){
		conn.close();
	}
	
}

}

null和没有值是两个不同的概念

比如 栈中有s1 当为空时表示不指向堆, 没有值得情况是新建了一个对象,但是里面没有值指向了堆

点击 超链接后面可以挂参数

猜你喜欢

转载自blog.csdn.net/qq_30347133/article/details/83893513