一、Servlet是什么?
Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app.
大家需要注意,网页可以分为两类:
1.静态页面:网页内容始终固定的页面
2.动态页面:用户不同/时间不同/输入参数不同时页面的内容会发生变化
Servlet主要进行的工作:
1.允许我们程序员创建一个类,tomcat收到某个特定路径的HTTP请求时,执行该类中的某个方法
2.对HTTP请求进行解析,并将HTTP请求从一个字符串解析成一个HttpRequest对象
3.我们程序员只需要给指定的HttpResponse对象的一些属性字段填写,Servlet就会自动的按照HTTP协议的方式构造出一个HTTP响应的字符串,然后通过Socket写回客户端
Servlet是tomcat提供的一组API,让我们用户不必关注Socket,HTTP协议格式等细节,降低了web开发的门槛,提高开发效率
二、第一个Servlet程序
我们现在就来编写我们第一个Servlet程序吧,写一个helloworld程序,部署到tomcat上,然后通过浏览器去访问,在网页上得到hello world字符串,一共需要一下7个步骤:
1.创建项目
此处我们需要创建一个maven项目
如果是首次使用maven,项目创建好之后会在下面读条,去中央仓库加载一些maven的依赖,因为中央仓库在国外,所以这里读条的过程可能比较久,前面我们已经介绍过maven的使用了,这里我们就不再一一解释了。
我们的将settings中的maven设置为我们下载的maven,而不是IDEA自带的maven
2.引入依赖
我们需要在pom.xml引入servlet的依赖,我们在中央仓库搜索一下maven
这里我们使用servelt 3.1.0,和tomcat 8是匹配的
下面即是我们servlet的坐标依赖
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
我们需要先在pom.xml中创建该标签,该标签中可以放多个依赖,我们将servlet依赖粘贴进去即可
如果是首次使用,这里可能会爆红,我们需要手动刷新导入一下
这两个刷新按钮都可以
3.创建目录
虽然maven已经帮我们自动创建了一些目录,但是还不够,因为此处我们使用maven开发的是一个web程序,还需要一个额外的目录
1.在main目录下,创建一个webapp目录,该目录和java,resources并列
2.在webapp目录下创建WEB-INF目录
3.在WEB-INF目录下创建一个web.xml文件
4.给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>
大家需要注意一点,有些同学这里的代码是红色的,但并不代表是错的
4.编写代码
我们在java目录下创建一个HelloServlet类然后继承HttpServlet类
Servlet api提供了现成的HttpServlet类,我们只需要继承该类,然后重写部分方法即可
我们这里重写doGet方法
我们输入doG直接快捷键完成即可
我们来看一下HttpServlet是如何处理doGet的
我们发现,父类是直接写回一个错误,所以我们这里需要将父类的super.doGet()删除,然后自己实现逻辑。
大家需要注意,我们这里重写的doGet方法不需要我们手动调用,而是tomcat收到get请求,就会触发doGet方法,tomcat会构造好两个参数,req和resp,req是TCP socket中读出来的字符串,按照HTTP协议解析得到的对象,resp是一个空的对象(不是null,只是里面的各个属性没有设置)。
我们需要在类上面加一个注解,注解是java中特殊的类,java中定义一种特殊的’语法糖"来实现注解,注解的作用,是针对一个类/方法,进行额外的解释说明,赋予该类/方法额外的功能/含义
此处这里的 @WebServlet 注解的作用是把当前类和一个HTTP请求路径关联起来,tomcat收到GET请求后,根据GET请求的路径去触发不同的类
resp.getWriter()会得到一个Writer对象,此处的writer对象是属于resp对象的,此处的write操作其实是往resp的body部分进行写入,等resp对象整个构造好了,tomcat会统一转成HTTP相应的格式,写入socket
5.打包程序
这里我们需要将程序打成war包,jar只是一个普通的java程序,war则是tomcat专属用来描述webapp的程序,一个war就是一个webapp,但是我们maven默认是打成jar包,我们需要在pom.xml配置一下
点击package进行打包
如果大家打包后没有出现target,大家需要刷新(reload)一下项目。
6.部署
将刚才打包好的war拷贝到tomcat的webappas目录下,无论tomcat是在同一个电脑还是在不同电脑上,都是这样拷贝,需要注意如果tomcat正在运行时,直接拷贝,tomcat虽然能识别,但是在windows上可能会出现Bug
7.验证
启动Tomcat,在浏览器地址栏输入对应url
我们刚刚在浏览器地址输入url之后,浏览器就构造了一个GET HTTP 请求,发给了tomcat,tomcat然后根据一级目录,确定了具体的webapp,根据第二级路径,确定了是调用哪个类,再通过GET/POST方法确定调用HelloServlet的那个方法。
上述是我们servelt最朴素的步骤,我们也可以通过一些操作来简化上述操作
三、IDEA部署Servlet程序
smart tomcat
我们在tomcat那篇文章,详细介绍了Tomcat的使用,以及smart插件的使用,这里我们只是演示一下,不再详细介绍了。
点击+新增配置,选中smart tomcat
配置tomcat
运行tomcat
不要去点击这里的地址,我们需要在地址栏手动输入url
smart tomcat的工作原理,不是说把war包拷贝(webapps里不变),而是tomcat启动的时候显式指定了一个webapp目录,相当于加载单个webapp运行,ided直接调用tomcat,让tomcat加载当前项目中的目录,这个过程没有打war包,没有拷贝,也没用解压缩的过程
大家需要注意:如果我们直接拷贝war包的方式部分,context path就是war包名,如果是smart tomcat方式部署,这里是可以配置的,默认是项目名
Tomcat Server
需要注意的是使用Tomcat Server部署的时候,需要将项目打成war包
将我们打好的包,添加进来
然后网页访问即可
常见错误
1.404
路径写错了,如果大家出现了404将自己地址栏输入的url与Context path
和servlet path对应看是否一致
webapp没有正确被部署: web.xml 写错了
2.405
405 表示对应的 HTTP 请求方法没有实现,比如我们在浏览器发了个GET请求,但是代码里没写doGet,此时就会出现405,因为我们父类的doGET里的代码就是返回405
3.500
本质上就是我们的代码抛异常了,500的时候日知会明确告诉我们异常调用栈,告诉我们是哪一行代码出的异常
4.出现空白页面
我们的方法中没有写resp.getWriter().write()方法文章来源:https://www.toymoban.com/news/detail-415855.html
5.出现"无法访问此网站"
原因可能是tomcat没有启动好,我们需要检查我们的tomcat是否启动好了文章来源地址https://www.toymoban.com/news/detail-415855.html
到了这里,关于第一个Servlet程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!