提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
今天在研究JavaWeb目录时被一个小问题拖了很久的时间,所以要写一篇博文给自己长长记性。
提示:以下是本篇文章正文内容,下面案例可供参考
一、先来了解一下什么是Servlet
Servlet 是 Server Applet 的缩写,译为“服务器端小程序”。按我的理解,servlet就是连接服务端和你的浏览器的连接件。要获取服务器上的数据,首先你要在浏览器上输入URL,也就是一个请求,这个请求首先要传输给servlet,servlet对数据进行处理后才会发送到服务端,服务端收到请求,返回的数据也是通过servlet对数据进行处理之后才会显示在你的浏览器上。
1、servlet示例
我们直接使用上一篇文档中使用编译器自动化生成的默认代码
package com.example.demo;
import java.io.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
@WebServlet(name = "helloServlet", value = "/hello-servlet")
public class HelloServlet extends HttpServlet {
private String message;
public void init() {
message = "Hello World!";
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
public void destroy() {
}
2、代码分析
我们不难看出其中有一个servlet容器继承自HttpServlet,有三个方法init、doGet和destroy,这部分代码比较简单,相信读者都能自行体会。
我认为其中最为关键的部分是
@WebServlet(name = "helloServlet", value = "/hello-servlet")
这一行代码极其关键,据我了解,短短一行代码几乎替代了一个文件,减少了很多的工作量,那么替代了哪个文件呢??
就是web.xml这个文件,对应关系如下
webservlet注释 | web.xml文件 |
---|---|
name | servlet-name |
value | url-parttern |
省略了很多连接步骤,极大的提高了开发效率!!!
在这个代码中name就表示这个servlet的名称叫做helloServlet,value表示的是其文件地址,注意!!!不是路径!!!
例如:我们访问的地址为:
http://localhost:8080/hello1/hello-servlet
其中 http://localhost:8080/hello1 这一部分我们在上一篇文章中讲过:这是由我们编译时设置的tomcat的属性决定的即application context中的内容决定的
但是这里最后一部分中的 **“/hello-servlet”**就是由我们设置的@webservlet注释中的value属性决定的
二、出现的错误
1.首先我先说一下我使用的版本
项目 | 版本号 |
---|---|
intellij-idea | 2021.2.1版本 |
jdk | 1.8 |
tomcat | 10.0.271 |
xml | 4.0 |
2.卡住我的地方
从创建项目->选择tomcat->运行程序
一直没有问题,最后在浏览器上也能看到运行结果,但是有一小点的缺陷,我一开始以为是我存放tomcat的路径问题,但是后来做到尝试控制台输出信息时一直找不到文件,这个适合我就意识到了问题的严重性。
在我正常运行程序时首先我们能看到成功运行的界面即:
但是当我点击下面的Hello Servlet后即出现404错误
我百思不得其解,走了一边流程后发现浏览器首先显示的文件是index.jsp
即:
然后我们点击了其中的链接,即跳往a标签中的href属性所指代的地址,这里的地址为hello-servlet
我们可以按住ctrl按键再鼠标左键点击该地址找到所指的文件,最后发现其指向的地址为HelloServlet这一servlet容器
找到servlet容器后再执行其中的doget方法(因为我们访问地址是发出请求返回数据)其中doGet方法中的代码为:
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
// Hello
PrintWriter out = response.getWriter();
out.println("<html><body>");
out.println("<h1>" + message + "</h1>");
out.println("</body></html>");
}
解释一下:1、首先设置显示的类型为text/html超文本类型,即以网页格式显示结果
2、然后开始打印输出
3、其中有一个String类型的变量,从前文找可以发现 message = “Hello World!”;
4、故最后的结果应该是输出大标题格式的Hello World!
!!!!但是他没有
三、着手解决
1、第一步当然是踩在巨人的肩膀上当一名CV战士
但是很可惜,没有一个方法适合我
网上的大多数方法为:(1)可能是xml版本不支持注释,故要将xml版本修改为3.0以上,但是我看了又看,反复查看我的是4.0>3.0没有一点问题
(2)还有可能是metadata-complete属性设置为true即执行过程忽略注释,只有其值为false时才会读取注释,还有一种情况为不写默认为false,我一看我的!!!没有!!!为了确保不是这里出错,我给他加上了
经过我死马当活马医的操作,结局还是没有改变
2、思考可能出现错误的地方
经过我一通思考,突然:会不会是版本的问题??
由于我当前使用的tomcat版本为tomcat10,是属于比较新的tomcat版本了
于是我来到官网下载了tomcat8
然后就是来到intellij-idea换tomcat版本
然后部署一下项目
点击apply->ok
运行程序
又是熟悉的画面
然后点击链接
喔哦!!!
!!!!!!!!!!成功啦!!!!!!!!
总结
提示:这里对文章进行总结:
- 我先回顾一下运行流程:浏览器->servlet->服务端->servlet->浏览器
- 版本很重要
- 版本很重要
- 关注各种软件的版本!!!!!!