目录
1、手动打包
1.1、创建项目
1.2、引入依赖
1.3、创建目录
1.4、编写代码
1.5、打包程序
1.6、部署
1.7、验证
2、非手动打包
3、解决部分问题
3.1、端口问题
3.2、运行问题
3.3、smart tomcat工作原理
3.4、出现404
3.5、出现405
3.6、出现空白页
3.7、出现无法访问页面
Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app
网页被分为两类:
<1>静太页面:页面内容始终是固定不变的(静态页面就只是单纯HTML)
<2>动态页面:页面内容随着输入参数的不同而改变(动态则是HTML+数据)
如何使用Servlet连用Tomcat,写一个hello world
基本思想:写一个Servlet 程序,部署到tomcat上
操作以下7个步骤 ,告诉你如何是用Servlet
创建首次使用Maven,项目创建好了后,下面会有一个读条,从中央仓库架加载一些Maven的依赖
<1>需要网络 (有网才能下载)
<2>Maven仓库不在国内,网络不一定稳定,,这里的进度条可能会比较慢(时间短的话很快,如果慢的话就可能有一个小时)
注:创建好以后它会自动下载;只有第一次使用才会下载东西,后面就不会了,也会很快;如果报错失败了,过两天再尝试一下
对Maven重新理解:Maven是个单独的程序,但是IDEA中已经自带了(不需要任何插件)
创建好以后,首先我们先了解以上创建好的目录里都有什么
接下来看怎么添加,如何添加,在哪添加
Servlet对应有jar包,放在pom.xml文件中
跟着以下操作来就行(以下是给出的中央仓库:用来找Servlet的jar包)
Maven 存储库:搜索/浏览/探索 (mvnrepository.com)
虽然Maven已经自动帮我们创建好一些目录了,但是还不够,这就是为啥还是廷难的“hello world”
<1>在main目录下 (和java ,resources并列),创建一个webapp目录(tomcat的规范格式)
<2>在webapp下创建 WEB-INF目录
<3>再在WEB-INF目录下创建一个web.xml文件
<4>写web.xml文件内容
Archetype Created Web Application 复制该内容就行
注:这个代码是固定的,当前阶段不需要调整,自己保存下来即可,针对为啥会标红,不一定是错误,Idea对其他代码解析出现了问题,但是不是真错了
那说说为什么写web.xml文件??
其实也不是很明了为啥要写这个文件,我们不是引入了servlet依赖嘛,那他又在程序里起到了什么作用,有什么特殊的,如果没有涉过相关服务器的代码,所以程序都是要依赖main方法才能运行的(main方法就是这些程序的老大,我跑了,大家才能跑也就是其他在main方法内的小弟们),这里引入servlet依赖就是小弟,Tomcat就是老大,我们把写好的servlet程序扔到webapp目录下就相当于是tomcat门下的小弟了,那怎么辨认你是我门的小弟呢,那就是依靠目录WEB-INF/web.xml,这样就让tomcat知道了,tomcat运行(老大干活)就会把servlet(作为小弟的我们带上)代码加载并运行启动
解释代码是干什么的:
我们这里写了一个doGet方法,不需要咱们手动调用,会交给Tomcat来调用,Tomcat收到get请求,就会触发doGet方法,Tomcat会构造好两个参数(此处代码里的参数)req 和 resp
req : TCP socket中读出来的字符串,按照HTTP协议解析得到的对象,对象的属性就是HTTP请求报文格式相对应的;Tomcat针对请求,已经解析构造好的
resp :空的对象(不是纯空的,都new有对象,相当于占了空间,但是里面的各种属性还没有设置)
注:doGet此处就是为根据请求 req 结合咱们自己的业务逻辑构造出一个resp对象
@WebServlet("/hello")
public class Hello_Servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//super访问父类是要直接pass掉的,因为什么也没有,请求啥
// super.doGet(req, resp);
// 这个是在服务器的 控制台 里打印.
System.out.println("hello world");
// 要想把 hello world 返回到客户端, 需要使用下面的代码.
// getWriter 会得到一个 Writer 对象. 针对字符流写的操作
resp.getWriter().write("hello world");
}
}
代码解释:
此处的writer对象是从属于resp对象的,此时进行的write操作其实是往resp的body部分进行写入(也可能是直接写入网卡中),等resp对象整个构造好了,tomcat会统一的转成HTTP响应的格式,再写socket
在文件中提到了流对象,一般流对象我们看做针对硬盘写入,但是不是一定就得写到硬盘中,也可以写到内存缓冲区里
一个Servlet程序中,可以有很的Servlet类,每个Servlet类会关联不同的路径,会对应到不同的请求和响应,可以通过Servlet实现不同的功能(路径和Servlet类之间是一对一的关系)
打包过程怎么解释???
把程序编译好(得到一些.class文件),在把这些.class打成压缩包,jar就是一种.class构成的压缩包,jar包比较常见,但是此处要打的是war包,jar只是一个普通的java程序,war包则是tomcat专属的用来描述webapp的程序,一个war就是一个webapp。
这里打包借助Maven内,直接点击既可
pom.xml文件内要添加的代码
war
hello_servlet2
为啥要这么麻烦的打包,其实是可以不打包,但是为什么要这样,其实临时检测一个服务器是否能用就需要手动打包
idea很强大,但是不能依赖
注:开发环境(自己写的代码的电脑)和运行环境(另一个服务器)很可能不在一个环境,直接使用三角号,运行是本地运行,而不是另一个服务器上运行
把刚才打包好的war拷贝到tomcat的webapps目录中即可
注:tomcat是在同一个电脑上还是不同电脑上,拷贝都有用
然后启动tomcat即可
打开浏览器,输入url,访问写好的这个代码
总结:刚才在浏览器地址栏中输入url之后,浏览器就构造了一个对应的HTTP,GET请求,发给了Tomcat就根据第一级路径,确定了具体的webapp,根据第二级路径,确定了是调用哪个类
下载安装tomcat
相比手动打包更加简单
idea中提供了一些API,开发插件,IDEA现有功能进行扩展,很多程序都有插件功能
运行刚刚idea操作的插件
Tomcat运行以后 可以查看谁占据了8080端口(在cmd打开的命令行中输入)
netstat -ano | findstr 8080
这个25472就是表示PId可以去任务管理器中结束该端口
注:在没有启动服务器的情况下,是不会出现当前情况,自然这个命令也不会有什么用
运行后下面有一行蓝色显示行
重要提醒:不要点,不要点,不要点!!!不包含servlet path直接点击肯定404
非手动打包,不是说自动把war包拷贝了(webapps里是不变的)是通过了另一种方式启动tomcat的,tomcat支持启动的时候显示指定一个特定的webapp目录,相当于是让tomcat加载单个webapp运行,idea直接调用tomcat,让tomcat加载当前项目中的目录
注:该过程,没有war包,也没有拷贝,也没有解压缩过程
<1>路径写错了
第一个就是 :url写错了
第二个就是:第一级路径写错了(一定要跟下面这个context path路径相同)
第三个就是:servlet path路径(也就是第二路径写错了)注解
<2>webapp没有正确被部署
web.xml内容错误、文件名错误、文件路径错误、文件位置错误
<1>比如浏览器发送GET请求,但是代码没有重写doGet就会出现网页页面405
<2>super.doGet没有删除 (为啥会这样呢)
代码中没有写resp.getWriter.write();
tomcat没有启动