Servlet 新手村引入-编写一个简单的servlet项目
文章目录
- Servlet 新手村引入-编写一个简单的servlet项目
- 一、编写一个 Hello world 项目
- 1.创建项目
- 2.引入依赖
- 3.手动创建一些必要的目录/文件
- 4.编写代码
- 5.打包程序
- 6.部署
- 7.验证程序
- 二、更方便的处理方案(插件引入)
- 1.引入插件
- 2.配置插件
- 3.问题分析
上篇博客讲到, Tomcat 提供了一些列的 api 接口,这些 api 背后已经把一些基础工作做好了。Tomcat 把这组 api 起了个名字,称为 Servlet。
Java 程序员,只需要调用上述 api,通过少量的代码,就可以完成基本的 http服务器的核心功能。
相比于上篇 Tomcat 中讲到的 静态页面,Servlet 主要的解决的问题,就是为了实现 动态页面。
下面我们就通过 Java 来编写一个最简单的 servlet 的 Hello World 程序。
一、编写一个 Hello world 项目
1.创建项目
创建一个 Maven 项目。Maven 是 java 中一个常用的“构建工具”,一个程序在编写过程中,往往需要涉及到一些第三方库的依赖,另外还需要针对这个写好的程序进行打包部署。
Maven 存在的意义,就是为了能够方便的进行依赖管理和打包。
观察创建好项目。
2.引入依赖
当前代码要使用 Servlet 开发,而 Servlet 并不是 Java 标准库自带的。就需要让 Maven 能够把 Servlet 的依赖给获取过来。需要先找到 maven 中央仓库。在中央仓库中找到 Java Servlt API.
Maven 中央仓库地址(点击跳转)
Java Servlet API 有很多个版本,具体要选择哪个版本是和 Tomcat 的版本,有对应关系的。Tomcat 使用 8,Servlet 就是3.1 如果不匹配,就可能出现问题。
这段代码就是 Maven 仓库中版本为 3.1.0 的坐标
把依赖引入
首次使用,是最慢的。后面就快了(首次使用需要加载不少的依赖),下载的过程是需要时间的。
3.手动创建一些必要的目录/文件
Tomcat 对于 Servlet项目,是有一些额外的要求的。Maven 是一个通用的工具,可以管理的不仅仅是Servlet项目,还可以管理其他的项目。在这个基础上,再按照Servlet项目的要求,创建出一些特定的目录和文件。
web.xml 里,还需要写一些内容,不能是空着的。这里的内容是固定的内容,不需要咱们去背下来,只需要从别的项目中复制粘贴过来即可。下列代码就可以直接放到 web.xml 中。
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name>
</web-app>(第三行代码可能是标红的,对于 idea 来说,只能保证针对java程序的提示是准确的。其他的文件,提示,仅供参考!!! 如果实在觉得难受可以 alt+enter ,把这个问题处理一下,fetch 忽略掉 ignore)
4.编写代码
在 java 目录中创建一个类 HelloServlet,代码如下:
//这个注解,就把当前这个Servlet类,和一个请求的路径关联起来了(配置路由)
@WebServlet("/hello")
//继承是为了重写这个父类中的方法。
public class HelloServlet extends HttpServlet {@Override//调用父类doGet,这个方法不需要手动调用,doGet本质上也是一个“回调函数”,方法写好后,就会交给Tomcatprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//下列代码一定要删掉,否则就会出现问题。//super.doGet(req,resp);//是在服务器日志中产生的 (tomcat)System.out.println("Hello World");//想要把hello world 返回给客户端,还需要进一步的使用下列代码。//resp是未初始化过的响应对象,doGet的目的就是把这个对象给设置好。通过getwriter得到resp里面内置的输出流对象(Writer字符流),最后使用 write方法,就可以把一个字符串写入到resp对象中。把数据写入到了 HTTP 响应的body中。resp.getWriter().write("hello world");}
}
总之,doGet 做的事,就是根据请求计算响应。
前面写 echo server 的时候,一个服务器,典型的工作流程,就是三步:
- 读取请求并解析
- 根据请求计算响应
- 把响应写回到客户端
这个过程体现了服务器的业务逻辑,1 3都是相对固定的操作。而在 Servlet 这块,1 3 都是Tomcat 帮我们完成的。咱们写代码只需要关注 2。也就是doGet要完成的工作。
5.打包程序
因为咱们的程序是放到 Tomcat 上运行,就需要对于程序进行打包。达成一个 Tomcat 能识别的包的格式,此时代码才会被 Tomcat 给加载起来。
打包也是借助 maven 来完成的。打开 maven 窗口(一般在 IDEA 右侧就可以看到 Maven 窗口,如果看不到的话,可以通过 菜单-View-Tool Window-Maven 打开),然后展开Lifecycle,双击 package 即可进行打包。
如果看到 BUILD SUCCESS 字样,说明打包成功了。
这就是通过 maven 打包生成的内容。在 maven 中,默认打包生成的是jar包。(常用的 java 的打包方式,jar 里面就是一些 .class文件)但是Tomcat需要的并非是 jar 包,而是 war 包。
war包本质上和 jar 包差不多,这里会包含一些前端的代码(html,css,js),以及一些 tomcat 的配置(web.xml)
此处需要修改 pom.xml,在这里添加一个 标签。(的子标签,层次结构不要搞错)
这个东西描述了打的包的名字是啥。(不是必须的,同样是的子标签)
此时再次进行打包,文件中就会生成如下war文件。
6.部署
启动 tomcat ,将写好的 war 包,放到 tomcat 上。具体来说,就是把这个 war 包拷贝到 tomcat 的 webapps 目录中。
发现新的war包,对war包进行部署操作。
7.验证程序
通过浏览器发起 http get 请求,触发刚才 servlet 的代码。
127.0.0.1:8080/java_hello/hello
- 通过 第一级 路径,确定一个 webapp
- 通过 第二级 路径,确定哪个 servlet
- 通过 方法,确定执行 servlet 中的哪个方法
问题1:在你检查了所有代码都是正确的,但是最后利用浏览器发起请求的时候,出现加载不出来的情况。
之所以出现这个情况,是 cmd 在搞鬼!!比如你选中了 cmd 中的某个内容,cmd 就会进入“复制”模式,此时按下 enter 就是完成复制。
进入复制模式的过程中,cmd 就会把正在运行的进程给阻塞掉。
问题2:针对上述 7 步操作,能否简化一下?
也是有办法的!后续学习的 Spring 就是做出了简化后的效果。
二、更方便的处理方案(插件引入)
1.引入插件
手动拷贝 war 包到 Tomcat 的过程比较麻烦。我们还有更方便的方法。
此处我们使用 IDEA 中的 Smart Tomcat
插件完成这个工作。
理解“插件”
插件会提升我们软件的可修改性、可维护性、可移植性。
插件就是对程序的一些特定场景,做出一些特定的功能的扩展
同学们可能会出现 插件市场 加载不出来的情况,也可以去官网下载,手动安装。下载之后,会得到一个 jar 包,把这个 jar 包拖到 idea 的界面上,就能安装插件。
2.配置插件
一个项目中,第一次使用 smart tomcat 需要简单配置一下。配置一次之后,后续就不需要配置了。
出现问题:当我们配置完插件后启动程序,会发现端口号已被占用,这是因为咱们之前启动了 Tomcat,之前的 Tomcat 已经占用了 8080。一个端口号只能被一个进程绑定,解决方法就是把之前的 tomcat 关闭,再启动此程序。
3.问题分析
-
404 浏览器要访问的资源,在服务器上不存在。
-
检查你的请求路径,和你服务器这边的配置,是否一致。
-
确认你的 webapp 是否被正确加载。
smart tomcat 由于只是加载你这一个 webapp。如果加载失败,就会直接启动失败!!我们要学会观察日志,观察是否有“部署成功”。
-
-
405
- 写的 doXX 方法,和请求发起的方法,不匹配。浏览器发 Get 请求,服务器代码写的是 doPost。
- 发的是 Get 请求,服务器写的也是Get请求,但是没有把 super.doPost 给删了。
-
505 服务器内部错误,代码中抛出异常了。出现 500 后一定要仔细观察异常调用栈
-
出现空白页
往往就是没有执行 getWriter().write 方法
-
无法访问此网站
这种情况,要么是 tomcat 服务器,没有正确运行。要么就是 ip 或者 端口号 编写的不对!!
感谢观看,下期继续分享 servlet 相关知识!!