【JavaEE】Tomcat |
您所在的位置:网站首页 › Tomcat部署第一个项目 › 【JavaEE】Tomcat |
Tomcat & Servelet第一个程序helloworld!
HTTP本质上就是一个TCP服务器(HTTP基于TCP) 这个服务器按照HTTP协议的约定,解析请求,构造响应 你自己写一个HTTP服务器,也完全没问题!不过我们Java圈子和生态中,有一个现成的,最流行的,apache社区开源的http服务器 = = =》 Tomcat 直接去官网下载就行了:Apache Tomcat® - Apache Tomcat 8 Software Downloads 新的不一定是好的,新的不一定稳定,可能会有点bug(别当小白鼠) 企业也不会经常更新,大部分公司还在用8这个版本我的代码基于这个版本,servelet也要匹配上,所以如果你的版本跟我的不一样,有一定概率在你那跑不了!选择这个: 下载成功放在熟悉的目录下: 大版本是8就行了,八点几无所谓bin 表示binary,里面包含了一下可执行的二进制脚本
logs表示运行日志 出问题来这里看webapps 放webapp,即放网站(后端+前端) 一个Tomcat上可以同时部署多个网站 部署说起来高级,其实就是将你的网站的文件放在对应目录下 1.2 启动TomcatTomcat是一个http服务器,但凡是一个服务,基本上就是个黑框框~ 服务器它好用就完了,丑了就丑了查看Tomcat的端口号是否正常绑定 Tomcat默认端口号为8080我们要避免这个端口号被其他程序占用!win R 打开命令行 netstat -ano | findstr 8080 netstat -ano:获得所有端口情况findstr 8080:找包含8080的字符串两个的话,一个是ipv4,一个是ipv6 后面是进程id:11168这样代表绑定成功 通过浏览器,访问Tomcat的欢迎页面 部署我们自己的网站~ 我们自己电脑内打开html当然简单,但是别人不行呀而这样别人也能访问才能我们的网站将之前的博客系统html部署到webapps目录下: 部署==放置打开Tomcat: 获取内网ip: 开热点看得到输入【ip:端口:路径】去访问~ 少写了字母就会出现404 这样操作,如果连的是一个热点,那么就可以访问到: 以手机为例当然,这个页面并没有考虑移动端的问题,这也不做讨论然而,没连热点或者外校或者外地的机器,是不能打开这个网站的~ 因为NAT机制~后续我们在云服务器获取外网ip,云服务器上的Tomcat部署网站,别人就能访问到了 1.3 Tomcat的优点我们现在要写网站后端 虽然我们可以从头写一个HTTP服务器,但是很麻烦 Tomcat已经完成了这一部分工作,并且Tomcat给我们提供了一系列的API,可以让我们在程序里直接调用,大大提高开发速度! 想获取请求包的query string中的某个key的value,直接调用api即可,不必手动解析想获取cookie,调用个api即可省去了一部分工作,更加注重业务逻辑! HTTP服务器: 根据HTTP协议解析请求报文根据HTTP协议构造响应报文而Tomcat提供的API,就是我们要学的第一个框架:Servelet 2. Servelet框架在java中使用Servelet,从一个“hello world”开始! 我们需要经历7个步骤,虽然复杂,但是是固定套路 2.1 创建Maven项目maven是一个构建工具,功能是帮助我们去构建,测试,打包一个项目~ 以往我们写的代码都是简单程序,所以按ctrl shift f10直接运行即可 但是在公司中的项目不行,因为这个程序及其复杂,可能涉及很多存在依赖关系的模块,还可能会依赖很多第三方库~ 因此,就诞生了一系列的构建工具,来帮你解决上述问题 Java中的构建工具: Ant(比较老)Maven(比较主流)Gradle(比较新,主要是安卓生态在用)pom.xml配置文件(标签格式的文本) 这个文件就描述了maven项目的各个方面的内容目录结构: Servelet是Tomcat提供的api(第三方库,不是第三方库) Tomcat是Tomcat,对于开发用到的api,则应该额外按照Servlet的jar包传送门:中央仓库:Maven Repository: Search/Browse/Explore (mvnrepository.com)这里可以选择下载jar包然后安装到对应目录下,当然也可以不怎么做,有更高效的方法: 复制这一段代码: 粘贴到pom.xml里(写在dependancies标签内) 这个标签内可以放很多dependancy,也就是多个依赖,也就是多个第三方库标红的话,则说明还没下载完成,点击刷新 ![]() 重写doGet方法: 而我们之前做的TCP回显服务器的基本流程就是: 读取请求并解析根据请求计算响应把响应写回客户端我们只需要关注2即可,也就是这个doGet方法 这里的req就是Tomcat收到请求,把请求按照HTTP协议的格式解析成了一个对象 Tomcat本质上就是个TCP服务器,内部就是一系列的socket操作~里面的属性,就是HTTP的各个信息 这里的resp则是响应对象,是一个“空的对象” 不是null,而是里面的属性是空的需要我们设置进去,相当于饭盒打饭一样~即,输出型参数然后Tomcat就会在第三步的时候,把这个对象写回给客户端为什么不用写main方法 这是因为Tomcat内部帮我们写了,它在合适的时机调用了我们重写的代码去计算响应~Tomcat内部代码(伪代码): main { HttpServlet servlet = new HelloServlet();//触发重写 HttpServletRequest req = ...;//获取请求的一系列操作 HttpServletResponse resp = new HttpServletResponse();//空响应 servlet.doGet(req, resp);//调用我们重写的方法,这个响应就被构造好了 }这种只需要我们参与一部分代码的编写的编写方式,就称之为“框架”(framework) 说到底,框架就是这种,按照别人规范写代码的模式 这还跟调用一些API不一样,因为API的使用还是我们主动的 使用框架就相当于进厂拧螺丝,其实并不是什么厉害的活 框架就相当于流水线~父类中的doGet方法: 如果不重写或者不去掉super.doGet方法,你访问到的页面就是405打印helloworld public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //super.doGet(req, resp); System.out.println("helloworld");//服务器的控制台上打印 resp.getWriter().write("hello world"); //给响应的对象中写入一个helloworld字符串,getWriter方法就是获取响应resp的字符输出流对象Writer,写入http响应包的body里面~ } }加上注解: 在后续的操作中,这个非常重要~注解实际上就是帮我们额外执行了一段逻辑 一般是修饰一个类或者一个方法 限制我们的编程行为,减少出错其他… @WebServlet("/hello")//没有分号~ public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // super.doGet(req, resp); System.out.println("helloworld"); resp.getWriter().write("helloworld"); } } 2.5 打包代码我们的程序不能独立运行,必须部署(放置)到Tomcat上才能运行 而部署的前提,就是打包 对于一个规模很大的项目,就会有很多很多的java文件和class文件,所以我们是需要将这些class文件打成一个压缩包,再进行拷贝,是比较科学的~java中使用的压缩包,就是jar、warjar:普通java程序,打成jar包 war:部署到Tomcat上的程序的压缩包,Tomcat是专门识别这种压缩包的内容 本质上是没区别的,war中则有Tomcat对应的特定的目录结构(专属定制版的jar包) 打包操作: 双击package打包操作的maven做了事情: 检测代码中是否存在依赖,即依赖是否下载好了把代码进行编译,生成.class文件把这些.class文件以web.xml对应格式进行打包但是看一下里面的内容,发现是jar包而不是war包 为了打出来war包,需要调整pom.xml: 描述打出来的war包的名字: 再次重新打包: 解压jar包: 解压war包: 拖动到解压软件即可启动Tomcat: 通过这个日志可以看出,war部署成功了的,乱码无所谓(只不过是字符集对应不上罢了) Tomcat是utf8,Windows的cmd是gbk后续不适用cmd,所以没关系~![]() 自动解压缩: doGet运行也有前提条件,并不是Tomcat服务器启动就触发 doGet ==> 遇到一个GET请求,就执行doGet方法 也不是随便一个GET请求都能,要求请求req的URL路径要匹配~ 同样的也有doPost,doXXX…直接在浏览器地址栏输入URL,就能构造GET请求~ 结果: 127.0.0.1:8080 ==> 到达Tomcat的webapps目录 /helloServelet ==> 到达我们的项目目录 /hello ==> 到达对应的Servlet(这就是我们前面写的注解里面的字符串) 因为webapp里可以有多个Servlet,自然就有多个doGet因为我们建立的多个java文件中的类,都能继承HttpServlet~所以需要我们确定要执行哪个doGet打错打少都是错的: helloworld的程序就讲完了,虽然复杂,但是套路固定! 用抓包工具抓一下: 我们只需要通过IDEA的插件(plugin)来完成这个工作(一键式完成5和6) 插件就是扩展,满足不同项目的不同要求的,需要就下载即可,各取所需,而不是,每个用户统一就是这个,下载即可: 使用Smart Tomcat插件 首次使用比较麻烦,需要配置: 点击右上角的add…右上角什么都没有,需要把这个栏打开: 修改后: Context path就是/项目名Servlet path就是/注解名![]() 确认后: 点击这个三角形,启动程序: 首先,在IDEA这个控制台(utf8编码)中不会出现乱码,所以就可以看懂了,我们以后也是在这里观看的~其次,这个Tomcat似乎没有启动成功:看到这个错误信息: 原因: Tomcat启动,需要绑定两个端口: 8080(业务端口)8005(管理端口)一个端口号只能被一个进程,而我们刚才的小黑框,就已经占用了这两个端口了,所以才会出现这个错误! 只需要关闭小黑框~ 重新启动: 通过浏览器发送GET请求: IDEA命令行中看到的: Smart Tomcat的运行方式和之前拷贝到webapps是存在区别的~ 清空webapps中的东西(ctrl + f2 结束进程),然后重新启动程序~ 重新生成了target,但是里面似乎并没有war包~webapps中也没有部署东西 而是通过这个特定的路径,“告诉”Tomcat,通过这个特定的参数,在这个特定路径里加载webapp就行了 所以并不涉及打包和拷贝~开发和调试阶段,这种方式就相当方便,但是要部署到生产环境,还是得打war包和拷贝部署(但是通过开发和调试,这个包就很成熟了~) 4. Servlet程序中常见的问题 4.1 404请求的路径写错 war包没被正确加载 比如web.xml中没写、写错或者漏写:如果没有正确加载,服务器日志是有提示的~这样浏览器访问后: 刚才web.xml的注释要取消掉哦~ 发的请求的方法和代码不匹配 代码写得是doPost方法,但是发的却是GET请求重新启动程序,发送请求: 忘记干掉super 重新启动程序,发送请求: 重新启动程序,发送请求: 重新启动程序,发送请求: 关闭程序,然后发送请求: 或者是: 通过这些错误去调试bug,也是一项重要的技能! 文章到此结束!谢谢观看 可以叫我 小马,我可能写的不好或者有错误,但是一起加油鸭🦆! 本文章讲解了Servlet的第一个程序:helloworld,到现在,你已经迈开重要的第一步了,加油! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |