# 1. 什么是Servlet?
sun公司制订的一种用来扩展web服务器功能的组件规范。
## (1) 扩展web服务器功能(servlet的产生背景)
web服务器只能处理静态资源的请求(即需要事先将html文件及相关的图片等资源准备好),不能够处理动态资源的请求(即需要计算,生成相应的html),所以,需要扩展web服务器的功能。
Servlet可以扩展web服务器功能,当web服务器收到请求之后,可以调用Servlet来处理动态资源的请求。
## (2) 组件规范
组件是什么?
符合规范,实现部分功能,并且需要部署到相应的容器里面才能运行的软件模块。
Servlet是一个组件,需要部署到Servlet容器里面才能运行。
容器是什么?
符合规范,提供组件的运行环境的程序。
apache tomcat就是一个Servlet容器,提供Servlet运行环境(即网络相关的服务)。
# 2. 如何写一个Servlet?
step1. 写一个java类,实现Servlet接口或者继承HttpServlet抽象类。
step2. 编译。
step3. 打包。
即创建一个具有如下结构的文件夹:
appname (可自定义)
WEB-INF
classes (放.class文件)
lib (放.jar文件 可选)
web.xml (部署描述文件)
step4. 部署。
将step3创建好的整个文件夹拷贝到相应的Serlvet容器里面。
注:
将step3创建好的整个文件夹使用jar命令压缩成".war"结尾的文件,然后再拷贝。
step5. 启动Servlet容器,访问Servlet。
http://ip:port/appname/url-pattern
# 3. Servlet是如何运行的?
比如,在浏览器地址栏输入
http://localhost:8080/day01/hello
step1.浏览器依据ip和port建立连接。
step2.浏览器将请求相关的数据打包(即创建请求数据包)然后发送给servlet容器。
step3.servlet容器解析请求数据包,并且将解析到的数据存放到request对象里面,同时,还会创建一个response对象。
step4.servlet容器依据请求路径找到对应的servlet的配置,然后容器将servlet实例化。
step5.servlet容器调用servlet的service方法。
注:
会将request和response作为参数传递进来,开发人员可以调用request对象的方法来获得请求数据包里的数据(比如获取请求参数值),也可以将处理结果写到response对象里面。
step6.容器从response对象中取出处理结果,然后创建响应数据包并发送给浏览器。
step7.浏览器解析响应数据包,生成相应的页面。
# 4. 常见问题
## (1)404
含义:
404是一个状态码,表示依据请求路径找不到对应的资源。
原因:
a.请求路径写错。
应该按照 http://ip:port/appname/url-pattern来写。
http://localhost:8080/day01/hello
b.没有部署或者部署失败。
## (2)500
含义:
服务器运行出错。
原因:
a.没有严格按照规范来写Servlet,比如
没有继承HttpServlet,又比如,部署描述文件中的类名写错等等。
b.代码不严谨,比如对请求参数没有做检查就做类型转换的处理。
## (3)405
含义:
找不到处理方法。
原因:
容器找不到service方法来处理请求。
# 5. Servlet输出中文要注意什么?
## (1)为什么会有乱码?
out在输出时,默认会使用iso-8859-1来编码。所以,
对于中文,会产生乱码。
## (2)如何处理?
response.setContentType(
"text/html;charset=utf-8");
# 练习:写一个DateServlet,输出当前的系统日期。
比如,http://localhost:8080/day01-lab/date
## step1.建maven工程。
注意:war包。
## step2.生成部署描述文件。
## step3.指定服务器。
## step4.添加一个java类。(DateServlet)
继承HttpServlet,并且override service方法。
public class DateServlet extends HttpServlet{ @Override protected void service( HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); out.println(sdf.format(date)); out.close(); } }
## step5.在web.xml文件里面,配置Servlet。
<servlet> <servlet-name>dateServlet</servlet-name> <servlet-class>web.DateServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>dateServlet</servlet-name> <url-pattern>/date</url-pattern> </servlet-mapping>
## step6.部署并运行。