记录一个咸鱼大学生三个月的奋进生活031
Servlet相关知识
在正式开始之前我们先来回顾一下上一个帖子的内容:
JavaWeb应用是由一组Servlet、JSP、HTML页、web.xml、实用类等以及其它可以被绑定的资源所构成的,
它可以在各种供应商提供的实现Servlet规范的 Servlet容器 中运行
Servlet的定义
而其中的Servlet正是JavaWeb中最常用于处理页面请求的Java类
Servlet的宏观定义: sun公司制定的用java编写web应用程序的规范、技术
Servlet的微观定义: 一个继承自HttpServlet,部署在webServer中可以处理客户端请求的Java类
所以Servlet是一个用Java编写的程序,此程序在服务器上运行以处理客户端请求,它运行在Servlet容器中,Servlet和客户端的通信采用“请求/响应”的模式
Servlet容器
Servlet容器负责Servlet和客户的通信以及调用Servlet的方法
Servlet容器为JavaWeb应用提供运行时环境,它负责管理Servlet和JSP的生命周期,以及管理它们的共享数据
常用的Servlet容器有:
Tomcat
Resin
J2EE服务器(如Weblogic)中也提供了内置的Servlet容器
jboss
Servlet容器响应客户请求的过程如下图:
Servlet可完成的功能
① 创建并返回基于客户请求的动态HTML页面
② 创建可嵌入到现有HTML 页面中的部分HTML 页面(HTML 片段)
③ 与其它服务器资源(如数据库或基于Java的应用程序)进行通信
Servlet与Java类的区别
刚才也提到过,其实Servlet就是JavaWeb中用于处理页面请求的Java类,虽然本质是Java类但是使用方法与Java类是有很多区别的:
① Servlet要继承HttpServlet,但Java类一般需要继承Object类
② Servlet必须在WebServer中才能运行,但Java类不需要WebServer支持也能运行
③ Servlet可以处理客户端请求,但Java类不能处理客户端请求
④ Servlet启动不需要main函数,但Java类启动需要main函数
⑤ Servlet是由容器创建(new)实例,但Java类一般由我们自己创建实例
⑥ Servlet由容器调用doGet或doPost方法,但Java类是程序员自己调用
Servlet的生命周期
实例化 > 初始化 > 服务 > 销毁 > 不可用
启动服务器时,Servlet容器就创建一个Servlet实例 (实例化)
Servlet调用init()方法 (初始化)
之后的每次操作都会调用service()方法然后根据method值判断执行doGet还是doPost方法 (服务)
最后关闭容器时会执行destroy()方法进行销毁 (销毁)
Servlet的doGet()和 doPost()方法
doGet()方法:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
doPost()方法:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
}
前面在Servlet的生命周期中提到过,Servlet之后的每次操作都会调用service()方法然后根据method值判断执行doGet还是doPost方法 (这是Servlet生命周期中的服务过程)
然后需要进行请求响应时就需要重写doGet()和 doPost()方法
这里就会有个问题:为什么经常重写doGet() 或 goPost() 方法而不是重写 service() 方法?
答:因为doGet() 和 goPost() 方法都是被 service() 方法调用,service() 方法判断后最终还是通过doGet() 和 goPost() 方法来处理客户端请求,所以重写doGet() 和 goPost() 方法才能完成具体业务逻辑
doGet()和 doPost()方法的区别
GET请求:
① 用于获取数据
② 将发送的请求参数附着在URL地址后面
③ 传送数据大小有限制,而且能传输的数据容量很小
④ 如果没有特殊处理,会将数据显示在浏览器地址栏
⑤ 通过超链接、表单的method=get形式、直接在浏览器地址栏输入地址产生访问get
POST请求:
① 用于获取数据
② 将发送的请求参数放在请求体中
③ 传送数据大小没有限制
④ 不会将数据显示在浏览器地址栏
⑤ 通过表单的method=post形式、在Ajax应用中指定请求方式为POST产生访问post
所以在平常使用中除了表单提交常用post,其他都是get请求
get请求 的所有参数都放在浏览器地址栏提交,所以不安全,经常是查询等功能使用
post请求 的所有参数都是隐藏的,所以表单提交等功能经常使用
Servlet的注册与运行(web.xml)
Servlet程序必须通过Servlet容器来启动运行,并且储存目录有特殊要求,都需要存储在<WEB应用程序根目录>\WEB-INF\classes\目录中
所以Servlet程序必须在WEB应用程序的web.xml文件中进行注册和映射其访问路径,才可以被Servlet引擎加载和被外界访问(用eclipse直接新建Servlet时会将web.xml中的该Servlet元素一同配置注册好)
web.xml常用的元素有:
Servlet中设置中文编码
因为Servlet中响应形式默认为text普通文本形式,需要其他输出形式就需要设置响应格式
设置成中文编码格式(常用):response.setContentType(“text/html;charset=UTF-8”)—— 显示html页面,并且编码设置为可以显示中文
WEB-INF的概念
WEB-INF 是一个特殊的目录(该目录名称所有字母都要大写),他并不能直接进行访问,因为WEB-INF是安全目录,这个目录并不属于Web应用程序可以访问的上下文路径的一部分,但是该目录下的内容可以通过Servlet请求转发进行访问,但是进行重定向不能访问到