很久没发博文了,五月也已经过了一大半,想写点东西记录下来,就现在吧,把我最近经历的遇到的都总结下。
关于这个Servlet3,我是从我邮箱里的垃圾邮件中看到一个在线测评网站,好奇的我点进去了所谓的链接,第一轮测评题目是采用Servlet3技术去简单实现一个在线的网页时间展示。
Servlet3? Servlet? 在大二学JavaWeb的时候了解过,Servlet不是web容器嘛,还有Servlet技术这等词汇?的确,自己见识的确短浅,框架的衍生发展离不开基础的一些东西,还是自己孤陋寡闻了。好了我们开始谈谈这个Servlet3技术吧。
1.什么是Servlet3?
Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。总结来说Servlet就是一群人来制定Java应用中使用web时的各种规范,统一接口。
//小感想~~~
谈到Web应用,自己就是偏向学习这方面的,SSM,SpringBoot ... ,管理端的技术发展虽然不如前端那样大红大紫,几天就一个新框架,新特性,新元素,新标签。但是,也是在稳步发展的,我很羡慕那些很懂原理的大牛,有些问题发生了,你不深入研究发生的原因,只是在意表象上的解决方案,看到许多前辈踩下的坑,你只是避开走了,为何不往坑里观望观望呢?有时候,解决问题固然重要,但是解决问题的背后所隐藏的,更值得我们去发现。
2.那么Servlet的工作流程是怎样的?
白话来讲就是:一个http请求来了,web容器将http请求封装成servlet中的request对象,在这个request对象中你可以得到所有的http请求信息,当然你也可以取出来进行一顿操作,最后你在把数据封装成servlet的response对象返还给web容器,web容器将接收到的response对象解析之后封装成http response响应给客户端。就像上图一样,Servlet也有生命周期吗,我们也来分了解一下:
Servlet 通过调用 init () 方法进行初始化。
Servlet 调用 service() 方法来处理客户端的请求。
Servlet 通过调用 destroy() 方法终止(结束)。
最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。
根据Servlet重要的声明周期中用到的方法进行详细介绍:
public void init() throws ServletException {
// 初始化代码...
}
init 方法被设计成只调用一次。它在第一次创建 Servlet 时被调用,在后续每次用户请求时不再调用。因此,它是用于一次性初始化。Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,也可以指定 Servlet 在服务器第一次启动时被加载。当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程,适当的时候移交给 doGet 或 doPost 方法。init() 方法简单地创建或加载一些数据,这些数据将被用于 Servlet 的整个生命周期。
public void service(ServletRequest request,
ServletResponse response)
throws ServletException, IOException{
}
service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。
doGet() 和 doPost() 方法是每次服务请求中最常用的方法。
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
GET 请求来自于一个 URL 的正常请求,或者来自于一个未指定 METHOD 的 HTML 表单,它由 doGet() 方法处理。
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
// Servlet 代码
}
POST 请求来自于一个特别指定了 METHOD 为 POST 的 HTML 表单,它由 doPost() 方法处理。
public void destroy() {
// 终止化代码...
}
destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。在调用 destroy() 方法之后,servlet 对象被标记为垃圾回收。
第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
Servlet 容器在调用 service() 方法之前加载 Servlet。
然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。
3.Servlet3新特性?
//详情见博客:https://blog.youkuaiyun.com/w410589502/article/details/58168292
(1)Servlet、Filter、Listener无需在web.xml中进行配置,可以通过Annotation进行配置;
(2)模块化编程,即将各个Servlet模块化,将配置文件也分开配置。
(3)Servlet异步处理,应对复杂业务处理;
(4)异步Listener,对于异步处理的创建、完成等进行监听;
(5)文件上传API简化;
4.我的Servlet3工程测试:采用Servlet3技术实现网页端的当前时间展示这一功能。
1.在IDEA环境下,建立基于Maven的web工程
2.建立java,resources文件夹,并mark directory as
3.引入所需要的依赖
pom.xml文件:
<!-- servlet3 依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
这里可能会遇到一个问题:
解决maven中servlet-api.jar和容器自带的servlet-api.jar的依赖冲突
https://blog.youkuaiyun.com/hi__study/article/details/51627403
在这里我们要先说一下Java中的日期和时间处理方法:
Date类(官方不再推荐使用,官方解释Date类不利于国际化,推荐使用Calendar类)
Calendar类
DateFormat类 使用此类来时间初始化
这个小例子用的是Calender类,TimeServlet如下:
有五个点需要注意:
1. 刚才提到了Servlet3新特性中支持了注解方式,省去了web.xml的拦截器,请求格式的设定。这里用到了@WebServlet注解,是不是和@Controller注解很类似,name就是这个Servlet类,urLPatterns就是请求的URL格式。详细的@WebServlet注解的参数配置见博文:https://blog.youkuaiyun.com/mytt_10566/article/details/70173007
2. 设置响应对象response:刷新页面请求,编码格式等。
3.Servlet的内置输出对象:out,可以直接输出HTML,数据等。
4.Calender时间类的使用:Calender是静态方法getInstence()方法可以初始化一个日历对象,调用其的get方法,根据参数的不同可以相应不同的日历日期信息。
这里要注意:MONTH 月 因为西方文化的原因,一年的第一个月是从“0”开始算起的,一年中12个月份分别是:“0-11”,12指的是下一年的一月份。WEEK_OF_YEAR 一年中的第几周 由于西方的一周指的是:星期日-星期六,星期日是一周的第一天,星期六是一周的最后一天,所以,使用 calendar.get(Calendar.WEEK_OF_YEAR) 时应该注意一周的开始应该是哪一天。
5.其余的部署Tomcat服务器运行就好了~~~
//感叹时光
最后,感叹时光下,匆匆三年,一晃就过了~~ 所以,人生的档口,努力变优秀吧!