本篇文章整理自我的CSDN,是我以前学习的时候总结的,当时使用的IDE是MyEclipse,内容没什么问题,可能过于书面化,等我整理完毕我的CSDN相关内容后,会开始更新进阶内容。
Tomcat
“Tomcat服务器是一个免费开源的Web应用服务器,属于轻量级应用服务器,是开发和调试JSP的首选。-----百度百科 ”
我的理解是,JSP和Servlet的一个容器。
那么Tomcat到底是干什么的呢?大家既然接触过HTML那么就知道,我们所写的代码文件,只能在本机运行和自己访问,而通过Tomcat别人就可以远程访问你的界面。
上图看不太懂没关系,在学习了servlet,了解request和response对象后自然就明白了。Tomcat的目录结构:
具体的安装和配置步骤我就不过多阐述了。
Servlet
Servlet是什么?
“Servlet全称Java Servlet,是一种用Java编写的服务器端程序。Servlet由服务器调用,运行在服务器端。Servlet的主要功能在于交互式的浏览和修改数据,生成动态Web内容。比如网上聊天、评论这些交互功能。狭义的Servlet是指Java语言实现的一个接口,广义的Servlet是指任何实现了这个Servlet接口的类。 ”
Servlet的作用:
Servlet既然是接口,那么它就是起到规范作用。 Servlet接口定义的是一套处理网络请求的规范,所有实现Servlet的类,都需要实现它的五个方法。
其中最重要的是两个生命周期方法 init()和destory(),还有一个处理请求的service(),因此所有实现Servlet接口的类,或者说,所有想要处理网络请求的类,都需要回答这三个问题:
- 初始化时做什么?
- 销毁时做什么?
- 接受到请求时做什么?
通过Web服务器映射的URL访问资源,需要经历三个过程:
- 接受请求
- 处理请求
- 响应请求
西瓜籽:“那么Servlet能直接处理请求吗?” 大西瓜:“不能。”
“Servlet是不会直接和客户端打交道的,Tomcat才是那个和客户端直接打交道的家伙。Tomcat监听了端口,请求过来后,根据URL等信息,确定要将请求交给哪个Servlet去处理,然后调用那个Servlet的service(),service()会返回一个response对象,Tomcat再把这个response返回给客户端。 ”
Servlet带给我们的最大的作用就是能够处理浏览器带来的HTTP请求,并返回一个响应给浏览器,从而实现浏览器的服务器的交互。
Servlet的实现:
创建Myservlet类,实现Servlet接口。
代码语言:javascript复制import java.io.IOException;
import javax.servlet.Servlet;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class Myservlet implements Servlet {
/*
* Serclet配置
* (non-Javadoc)
* @see javax.servlet.Servlet#getServletConfig()
*/
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
/*
* Servlet信息
* (non-Javadoc)
* @see javax.servlet.Servlet#getServletInfo()
*/
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
/*
* 初始化
* (non-Javadoc)
* @see javax.servlet.Servlet#init(javax.servlet.ServletConfig)
*/
@Override
public void init(ServletConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
/*
* 服务
* (non-Javadoc)
* @see javax.servlet.Servlet#service(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
*/
@Override
public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
// TODO Auto-generated method stub
}
/*
* 销毁
* (non-Javadoc)
* @see javax.servlet.Servlet#destroy()
*/
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
以我们大家熟悉的Hello World为例
代码语言:javascript复制 public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=UTF-8");//防止乱码
PrintWriter out=response.getWriter();
out.println("Hello World");
}
接下来就是配置xml文件,让Tomcat知道如何调用Servlet:
代码语言:javascript复制 <!-- 声明Servlet对象 -->
<servlet>
<!-- 指定Servlet对象的名称,一般为类名 -->
<servlet-name>Myservlet</servlet-name>
<!-- 指定Servlet对象的完整位置,包含Servlet对象的包名和类名 -->
<servlet-class>Servlet.Myservlet</servlet-class>
</servlet>
<!-- 映射Servlet -->
<servlet-mapping>
<!--与Servlet对象中保持一致-->
<servlet-name>Myservlet</servlet-name>
<!--用于映射访问URL,外界访问Myservlet的路径-->
<url-pattern>/Myservlet</url-pattern>
</servlet-mapping>
接下来就是通过浏览器访问该Servlet:
!!!这里提醒一下,不要从eclipse打开servlet,可能会导致service()方法被调用两次。
Servlet的生命周期:
代码语言:javascript复制 public class Myservlet implements Servlet {
@Override
public void destroy() {
// TODO Auto-generated method stub
System.out.println("Servlet正在销毁");
}
@Override
public ServletConfig getServletConfig() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getServletInfo() {
// TODO Auto-generated method stub
return null;
}
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
System.out.println("Servlet正在初始化");
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
System.out.println("Servlet正在提供服务");
}
}
运行结果:
- 第一次访问:我们发现init()和service()方法都被调用
- 第二次访问:相比与第一次访问,这次只调用了service()
- 当关闭Tomcat时,destroy()被调用:
Servlet声明周期可分为5个步骤
“1.加载Servlet。Tomcat首次访问Servlet时,会创建Servlet的实例 ”
“2.初始化。Servlet被实例化后,Tomcat会调用init()方法初始化这个对象 ”
“3.处理服务。当浏览器访问Servlet时,Servlet会调用service()方法处理请求 ”
“4.销毁。当Tomcat关闭或者检测到Servlet要从Tomcat删除的时候会自动调用destroy()方法,释放该实例所占用的资源。一个Servlet如果长时间不被使用的话,也会被Tomcat自动销毁 ”
“5.卸载。当Servlet调用完destroy()方法后,等待垃圾回收。如果有需要再次使用这个Servlet,会重新调用init()方法进行初始化操作。 ”
简单总结: 只要访问Servlet,service()方法就会被调用。init()只有第一次访问Servlet的时候才会被调用。destroy()只有在Tomcat关闭的时候才会被调用。
继承HttpServlet类编写Servlet程序:
“HttpServlet类也是一个抽象类,实现了service()方法,并针对HTTP/1.1中定义的7种请求类型提供了相应的方法 - doGet()、doPost()、doPut()、doDelete()、doHead() 、 doTrace() 和 doOptions() 方法。HttpServlet类已经实现了Servlet接口的所有方法,我们在使用过程中只用继承HttpServlet,重写我们需要的方法就行了。而且HttpServlet类在原有Servlet接口上添加了一些HTTP协议处理方法,它的功能也更加强大。 ”
HttpServlet类继承GenericServlet类。HttpServlet类、GenericServlet类、Servlet接口的关系如图:
HttpServlet有两个特性是GenericServlet所不具备的:
“不用覆盖service方法,而是覆盖doGet或者doPost方法。在少数情况,还会覆盖其他的5个方法。 ”
使用的是:
“HttpServletRequest、HttpServletResponse对象。 ”
一般我们都是重写doGet()和doPost()方法。这里我使用的是MyEclipse2018:
创建完成后会自动配置好XML文件,我们直接使用就好了!
continue