Servlet是JavaWeb应用开发的核心组件。Servlet运行在Servlet容器中(例如最常用的Tomcat),它可以为各种客户请求提供相应服务。Servlet可以轻松完成以下任务:

  • 动态生成HTML文档(即服务端交互,动态页面)
  • 把请求转发给同一个Web应用中的其他Servlet组件。
  • 访问服务器资源(如数据库访问)
  • 读取客户端的Cookie。

ServletAPI有4个包,如下:

  • javax.servlet :包含定义了Servlet与Servlet容器之间签约的类和接口。
  • javax.servlet.http : 包含定义了HttpServlet与与Servlet容器之间签约的类和接口。
  • javax.servlet.annotation :包含对Servlet、Filter和Listener进行标注的注解。即Servlet3.0的注解配置。
  • javax.servlet.descriptor:包含为Web应用的配置信息提供编程式访问的类型。

servlet包和servlet.tttp包之间主要接口和类的关系如下:

Servlet的重点对象

请求对象(ServletRequest和HttpServletRequest) :Servlet获取请求头信息。
响应对象(ServletResponse和HttpServletResponse) :Servlet生成响应结果。
Servlet配置对象(ServletConfig):Servlet容器创建Servlet实例时,传入一个ServletConfig对象。 Servlet通过该对象来获取初始化参数及ServletContext对象。【初始化参数仅作用该Servlet本身】
Servlet上下文对象(ServletContext):Servlet容器启动Web应用时,创建唯一的ServletContext对象,即代表Web应用。 通过ServletContext对象可以共享web应用资源,可以用于在多个Servlet中共享数据。
【注意:Servlet容器启动时,JavaWeb应用会被启动,ServletContext对象随之创建】

Servlet接口的5个方法

init()           //创建servlet实例时,初始化servlet参数。
service()      //根据请求方式,处理客户端请求,并发出响应结果。
destroy()      //Web应用销毁(停止运行)时,执行该方法。通常用于回收资源。
getServletConfig() //返回一个ServletConfig对象,该对象表示Servlet配置信息。
getServletInfo() //返回关于该Servlet的说明信息。

Servlet生命周期

init()、service()和destroy()分别对应Servlet的三个阶段:初始化阶段、运行时阶段和销毁阶段。
对应如下的Servlet执行流程:当客户端向某个Web服务器发出请求,Tomcat(Servlet容器)接收并解析HTTP请求,然后调用匹配请求的Servlet类。

1.创建Servlet实例,执行init()完成初始化,Servlet容器传入一个ServletConfig对象。
2.根据请求方式,调用相应的响应方法(doGet()、doPost()或service()),传入包含请求信息的HttpServletRequest对象和用于响应的HttpServletResponse对象,生成响应结果。
3.Servlet容器将响应结果发送给客户端,然后执行destroy()方法,销毁和该Servlet有关的对象。例如请求对象、响应对象以及ServletConfig。至此,Servlet的生命周期结束。

额外说明: 创建Servlet实例有两种时机:

1.客户端发起请求,相应的Servlet实例才开始创建。

2.Web应用一启动,就创建Servlet实例,这里方式需要配置一下:<servlet>中配置<load-on-startup>1</load-on-startup>,值越小,实例化优先级越高。注解配置Servlet,指定参数loadOnStartup = 1。

关于Servlet初始化参数和Web应用的上下文参数的配置方式,在web.xml文件中:

    <!-- Web应用参数,可以被Web应用中所有Servlet所共享 -->                 //使用注解配置初始化参数
<context-param>                               @WebServlet(urlPatterns= {"/瞎写的URL"}, name="arbitrary",                                                
<param-name>movement</param-name>         initParams= {
<param-value>10086</param-value>   @WebInitParam(name="admin", value="牛批"),
</context-param>   @WebInitParam(name="info", value="10086")
<context-param> }
<param-name>railway</param-name>      )
<param-value>12306</param-value> public class InitParamServlet extends HttpServlet{
</context-param> //省略执行代码.....
<servlet> }
<servlet-name>ServletConfig_Context_Test</servlet-name>
<servlet-class>com.test.ServletConfig_Context_Test</servlet-class>
<!-- Servlet的初始化参数 -->
<init-param>
<param-name>sevletConfig01</param-name>
<param-value>测试servlet配置信息</param-value>
</init-param>
</servlet>

Servlet四个对象的常用方法说明

HttpServletRequest

获取请求参数 getParameter(),请求参数有多个值  getParameterValues()
获取单个请求头信息 getHeader() 获取所有请求头名称:getHeaderNames(),之后选择遍历。
获取和存取request范围中的数据, getAttribute(str, object) setAttribute(str, object)
省略其他方法...

HttpServletResponse

setContentType() 设置响应内容类型
setCharacterEncoding(arg0); 设置响应正文字符集
getWriter() 获取一个字符流,向响应正文中输出字符数据。 getOutputStream() 向响应正文中输出二进制数据
addCookie() 往响应正文中添加一个Cookie.
sendRedirect(url) 重定向

ServletConfig和ServletContext获取参数都是使用getInitParameter(),只不过一个是获取Servlet初始化参数,一个是Web应用参数。

注意:在Servlet中调用getServletConfig()和getServletContext()方法,需要在响应方法中获取,不然会导致空指针。若在方法外调用,则需要建立一个ServletConfig变量,执行init()时进行赋值,然后再通过建立的ServletConfig变量调用getServletContext(),

这样才不会导致NullPointerException

Servlet中四个作用域对象的范围

ServletContext对象,通过getServletContext()。范围在整个Web应用。  对应jsp的application对象

HttpSession对象,通过request.getSession()。范围在会话中。 对应jsp的session对象,Session很常用,要熟悉。

request对象,响应方法的参数直接提供。 范围在一次请求中。 对应jsp的request对象

this对象,当前Servlet类,范围仅限于类中。 对应jsp的page对象

上述作用域从大到小,Servlet和jsp的这些对象中都有一个Map集合,由setAttribute()和getAttribute()进行管理,可以将数据放到指定范围中。

Servlet的转发、包含和重定向

HttpServletRequest.getRequestDispatcher("URL").forward(request, response);  //跳转到指定URL,本质上是将目标URL页面内容替换当前页面。

HttpServletRequest.getRequestDispatcher("URL").include(request, response);  //把目标URL内容包含到当前URL页面内容中,等同于嵌入。

HttpServletResponse.sendRedirect(“URL”); //重定向到指定URL地址,会改变URL地址,相当于打开一个新网页。

使用说明:forward和include本质上只是对原URL地址页面做修改,所以URL地址不会改变,请求参数也不会丢失,请求对象依然有效。 而重定向是打开一个新URL地址,即二次请求。原有请求参数和请求对象全部失效!

上面的Servlet知识比较散乱,纯粹是个人总结。如需了解更多Servlet的细节知识,请自行查阅Serlvet资料。

下面使用Servlet来实现一些常用的网页功能

建立一个Servlet类很简单,继承HttpServlet抽象类就行。当然,你也可以实现Servlet接口或者继承GenericServlet抽象类,但HttpServlet抽象类已经帮我们实现了以上两个类,并扩展了响应请求方法,所以继承HttpServlet类是最优选择。

1.Servlet实现一个简单的登录信息验证

<!-- login.html  提交请求到指定URL-->
<form action="/HandleFormServlet" method="get">
账号:<input type="text" name="user" value=""><br>
密码:<input type="text" name="password" value=""><br>
<input type="submit" value="提交">
<input type="reset" value="重置"><br>
</form>
//处理请求的Servlet类,这里采用注解配置Servlet
@WebServlet(urlPatterns= {"/HandleFormServlet"}, name="arbitrary")
public class HandleFormServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user = req.getParameter("user");
String psw = req.getParameter("password");
resp.setContentType("text/html;charset=UTF-8");
resp.setCharacterEncoding("UTF-8");
PrintWriter pw = resp.getWriter(); //设置好响应内容类型和字符编码再获取输出流,避免中文乱码
pw.println("<html><head></head><body>");
if(user!= null && user.equals("123456")) {
if(psw!=null && psw.equals("tomcat")) {
pw.println("输入成功!欢迎登录……<br>");
pw.println("用户名:" + user + " 密码:" + psw + "<br>");
}else {
pw.println("密码输入错误");
}
}else {
pw.println("账号错误");
}
pw.println("</body></html>");
}
}

输出结果: 为了简洁,这里没有涉及到数据库,数据是死的。如有需求,可自行加入数据库访问,读取数据库中相关用户表信息,进行匹配。

2.Servlet实现一个简单的文件下载

3.Servlet实现一个简单的文件上传

Servlet基础知识总结的更多相关文章

  1. JSP SERVLET 基础知识

    jsp(java server page)和servlet是JAVA EE规范的两个基本成员,是JAVA WEB开发的重点也是基础知识.JSP本质上也需要编译成SERVLET运行. JSP比较简单,可 ...

  2. Servlet基础知识

    基本知识一.Web结构1.两种应用程序 ①桌面应用程序:QQ.CS.MyEclipse.Office.DW.360.浏览器等必须下载.安装.桌面快捷方式.注册表信息.操作系统后台服务.占用操作系统端口 ...

  3. Java之JSP和Servlet基础知识

    JSP基础 JSP起源 JSP,JavaServer Pager的简称.由SUN倡导并联合其它公司创建. JSP是一门脚本语言 JSP可以嵌入到HTML中 JSP拥有Java语言的所有特性 面向对象. ...

  4. Servlet基础知识(四)——Servlet过滤器Filter

    一.什么是过滤器: 政府大楼的安检保安,它既能对进入政府大楼的人员进行检查,只允许检查符合要求的进入:同时他也负责对出大楼的人进行检查,看他带出的东西是否符合要求. 同样的,Servlet中的过滤器既 ...

  5. Servlet基础知识(三)—— 会话机制Session,Session和Cookie的异同

    Servlet会话机制: Http是一种无状态协议,它是无记忆的.也就是说,服务器不会保存用户的任何信息,当同一用户再次去访问时,服务器是不认识你的,它还是会建立新的连接. 但有时候我们需要服务器保留 ...

  6. Servlet基础知识(一)——Servlet的本质

    什么是Servlet: Servlet是运行在web服务器端(web容器,如tomcat)的程序,它与Applet相对,Applet是运行在客户端的程序. Servlet的主要作用是处理客户端的请求, ...

  7. Servlet 基础知识

    8.Response  8.1.getOutputStream和getWriter方法分别用于得到输出二进制数据.输出文本数据的ServletOutputStream .Printwriter对象.  ...

  8. JSP Web第七章整理复习 Servlet基础知识

    P206-208 Servlet项目的创建,web.xml的配置及标签含义,相关程序 创建:new 一个Servlet类,继承自javax.servlet.http.HttpServlet; 写doG ...

  9. jsp 和servlet基础知识

    1  在tomcat服务器当中,4**表示客户端请求错误,5**表示程序错误 2.request知识参考网址:http://wenku.baidu.com/link?url=wYwTGk8XKrLzA ...

随机推荐

  1. 域模型中的实体类分为四种类型:VO、DTO、DO、PO

    经常会接触到VO,DO,DTO的概念,本文从领域建模中的实体划分和项目中的实际应用情况两个角度,对这几个概念进行简析. 得出的主要结论是:在项目应用中,VO对应于页面上需要显示的数据(表单),DO对应 ...

  2. sublime text 3中browsersync的使用

    1.在项目所在位置右键选择Git Bash Here 2.输入 // --files 路径是相对于运行该命令的项目(目录) browser-sync start --server --files &q ...

  3. Google APAC----Africa 2010, Qualification Round(Problem C. T9 Spelling)----Perl 解法

    原题地址链接:https://code.google.com/codejam/contest/351101/dashboard#s=p2 问题描述: Problem The Latin alphabe ...

  4. 第2课 android机器人的翻页相册

    一.准备:准备像素大小相同的图片若干张.(本例中的图片,统一像素大小为310*310,请保存至本机电脑并按顺序命名为1.jpg至6.jpg) 二.启动与登陆: 启动谷歌浏览器,并在地址栏里输入loca ...

  5. Spring3实战第一章 Aop 切面 XML配置

    刚看spring3实战书籍第一章  切面以前没有关注过 现在看到了  随手试验一下 AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Objec ...

  6. 初识WCF2

    参照: http://blog.csdn.net/songyefei/article/details/7371571 在上一篇中,我们在一个控制台应用程序中编写了一个简单的WCF服务并承载了它.先回顾 ...

  7. Python学习---range/for/break/continue简单使用

    range的使用:注意,在python3中,交互模式下已经不显示了 for循环的使用 打印50-70 # 第一种方案 for i in range(100): if i <= 70 and i ...

  8. linux的pthread_self与gettid的返回值和开销的区别

    linux的pthread_self与gettid的返回值和开销的区别 linux的pthread_self与gettid的返回值和开销的区别 分类: 一些思考 2012-05-18 12:25 17 ...

  9. [EffectiveC++]item23:Prefer non-member non-friend functions to member functions

    99页 导致较大封装性的是non-member non-friend函数,因为它并不增加“能否访问class内之private成分”的函数数量.

  10. python 脚本运行时报错: AttributeError: 'module' object has no attribute ***

    最近在编写Python脚本过程中遇到一个问题比较奇怪:Python脚本完全正常没问题,但执行总报错"AttributeError: 'module' object has no attrib ...