servlet(一)
1. 什么是Servlet?
sun(oracle)公司制订的一种用来扩展web服务器功能的组件规范。
(1)用来扩展web服务器功能
web服务器(比如apache web server,iis,nginx等)只能够处理静态资源的请求, (即需要事先将html文档准备好,并存放到web服务器上),不能够处理动态资源 的请求(即需要通过一些计算,生成相应的html文档)。所以,需要扩展。 可以使用Servlet来扩展。
(2)组件和容器
1)什么是组件?
符合规范,具有部分功能,并且需要部署到相应的容器里面才能运行的软件模块。 Servlet就是一个组件。
2)什么是容器?
符合规范,为组件提供运行环境的程序。 Servlet需要部署到Servlet容器里面才能运行,Servlet容器为 Servlet提供相应的运行环境(即网络相关的服务)。
注:
Tomcat是一个符合Servlet规范的容器。
2.如何写一个Servlet?
step1.写一个java类,实现Servlet接口或者继承HttpServlet。
step2.编译。
step3.打包。
注:按照Servlet规范,创建一个具有如下结构的文件夹 appname (文件夹的名称可以自定义,一般称之为应用名) WEB-INF classes (放.class文件) lib (放.jar文件 该文件夹可选) web.xml (部署描述文件)
step4.部署。
将step3创建好的文件夹拷贝到容器相应的位置。
注:
也可以将step3创建好的文件夹使用jar命令压缩成".war"为后缀的文件,然后再拷贝。
step5.运行。
启动容器,访问Servlet。 打开浏览器,在地址栏输入 http://ip:port/appname/url-pattern。 注: url-pattern是一个字符串,在web.xml中设置。
3.使用eclipse开发Servlet
step1.集成tomcat
注:
即使得eclipse可以管理tomcat(包括启动、关闭tomcat,自动部署等)
step2.创建maven工程
step3.添加一个java类
注:
继承HttpServlet
override service方法。
参考代码:
public class HelloServlet extends HttpServlet{ public HelloServlet() { System.out.println("HelloServlet的构造器"); } @Override /** * Servlet容器(比如Tomcat)在收到请求之后, * 会解析请求数据包,将解析到的数据存放到request * 对象里面,同时,还会创建一个response对象。 * 接下来,容器会创建Servlet对象,然后调用该 * 对象的service方法来处理请求。 * 注: * 作为开发人员,不用再处理网络相关的问题。 * 比如,要读取请求参数,只需要调用request对象 * 提供的方法即可;如果要向浏览器发送响应,只需要 * 调用response对象提供的方法。 */ protected void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { System.out.println( "HelloServlet的service方法"); /* * 设置content-type消息头的值,告诉浏览器, * 服务器返回的数据类型。 * 注: * 浏览器会按照指定的数据类型来解析。 */ response.setContentType("text/html"); /* * 通过response对象获得一个输出流。 */ PrintWriter out = response.getWriter(); /* * 将数据写到response对象上。 * 注: * 容器会从response对象上提取数据,生成 * 响应数据包并发送给浏览器。 */ out.println("Hello Kitty"); out.close(); } }
step4.在web.xml文件中,添加Servlet配置信息。
参考配置:
<servlet> <servlet-name>helloServlet</servlet-name> <!-- 类名一定要写完整(注意大小写) 注: 容器会使用java反射完成类的加载, 如果类名写错,则容器会找不到该类的字节码文件。 --> <servlet-class>web.HelloServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>helloServlet</servlet-name> <!-- url-pattern用来定义访问路径,即 如何调用该servlet (http://ip:port/appname/url-pattern)。 比如: http://localhost:8080/day01-lab/hello --> <url-pattern>/hello</url-pattern> </servlet-mapping>
4.Servlet是如何运行的?
比如,在浏览器地址栏输入http://ip:port/appname/hello
step1.浏览器依据ip、port建立与Servlet容器之间的连接。
step2.浏览器创建请求数据包并发送给容器。
step3.容器解析请求数据包中的数据,然后将解析到的数据添加到 request对象里面,同时,容器还会创建一个response对象。
step4.容器依据请求路径,创建对应的Servlet对象,然后调用该对象的 service方法。
注:
容器会将request对象和response对象作为参数传递过来。
开发人员可以通过调用request对象提供的方法来获得请求数据包中
的数据(比如请求参数),然后将处理结果写到response对象即可。
step5.容器通过response对象获得处理结果,然后创建响应数据包并发送给浏览器。
step6.浏览器解析响应数据包中的数据,生成相应的页面。
5.常见问题
(1)404
含义:404是一个状态码,表示服务器依据请求路径找不到对应的资源。
原因:
a.请求路径写错。没有严格按照http://ip:port/appname/url-pattern 来写。 b.没有部署或者部署失败。
(2)500
含义:500也是一个状态码,表示服务器端程序运行出错。
原因:
a.没有严格按照Servlet规范来写代码和配置。 比如,没有继承HttpServlet。 又比如,<server-class>类名写错。 b.代码不严谨。 比如,对请求参数值没有做检查就做类型转换。
(3)405
含义:405也是一个状态码,表示服务器找不到处理方法。 原因:
service方法没有正确override。