javaweb 基础(1)—— servlet

来源:互联网 发布:帝国竞争算法程序 编辑:程序博客网 时间:2024/06/08 17:18

尊重个人劳动成果,转载请注明出处:
http://blog.csdn.net/czd3355/article/details/70306352

1. 定义

servlet 是运行在服务器端的,按照一定规范编写的 java 应用程序。

用下表解释定义:

Java类 服务器端运行 必须调用Java Servlet API Servlet是用Java语言编写的,遵守所有Java语言的语法规则的Java类 Servlet是在服务器端运行的。它编译后的“.class”文件被服务器端调用和执行 Servlet必须调用Java Servlet API,必须是对特定类或接

2. 作用

用来接收,处理客户端请求,并把处理结果返回到客户端显示。
(更详细点说明是:把处理结果返回给服务器,由服务器将响应结果传给客户端)

3. 生命周期

Servlet 的生命周期指的是 Servlet 从被 Web 服务器加载到它被销毁的整个生命过程。

  1. Servlet 容器通过调用 init () 方法进行初始化。
  2. Servlet 容器调用 service() 方法来处理客户端的请求。
  3. Servlet 容器通过调用 destroy() 方法终止(结束)。
  4. 最后,Servlet 是由 JVM 的垃圾回收器进行垃圾回收的。

细致说明:

  • 无论请求多少次 servlet,最多只有一个 servlet 实例。说明 servlet 是单例的
  • 当有多个客户端并发请求 servlet 时,服务器会启动多个线程去分别执行该 servlet 的 service() 方法
  • init() 和 destroy() 方法都只会执行一次,service() 方法可以执行多次。

4. 常用方法

request.getParameter(String name) :获取表单中任意一个name的值。

request.getParameterValues(String name):取得所有名为该name的参数值,常用于复选框

request.getParameterNames():得到当前请求中的所有参数名称

看定义解释有点抽象的话,那就来看例子吧

1. 三个名字相同的text标签<input type="text" name="test" value="1" /> <input type="text" name="test" value="2" /> <input type="text" name="test" value="3" />request.getParameterValues("test")   ----------------- [1, 2, 3]request.getParameter("test")             ------------------ 12. checkbox <input type="checkbox" name="habit" value="read">看书 <input type="checkbox" name="habit" value="movie">电影 <input type="checkbox" name="habit" value="game">游戏String[] str = request.getParameterValues("habit")for(String s:str){    resp.getWriter().println(s);}

5. 跳转

5.1 请求转发(forward)

作用:可以跳转到本应用的任何 jsp,servlet 文件,包括 WEB-INF 下的文件。代码如下:

req.getRequestDispatcher("/com/czd/servlet/servlet02")    .forward(req,resp);

注意:getRequestDispatcher() 方法的参数必须为以 “/” 开始,“/” 表示本 web 应用程序的根目录

框架中常常使用一个 servlet 来集中处理请求,然后跳转到响应的 servlet。或者在 servlet 中处理业务逻辑,然后跳转到 jsp 页面中处理结果。

5.2 重定向(redirect)

它不能跳转到 WEB-INF 下的文件,但能够跳转到其他应用的页面,比如百度首页等

resp.sendRedirect("com/czd/servlet/servlet02");

5.3 自动刷新/自动跳转(Refresh)

自动刷新本页面

// 每隔一秒钟就自动刷新本页面resp.setIntHeader("Refresh",1);

自动跳转

// 第二个参数的 1 是秒数resp.setHeader("Refresh","1;URL=http://localhost:8080/index2.html");

说明:参数 “Refresh”,“URL” 大小写不敏感。

6. servlet是线程不安全的

因为 servlet 是单例的,当多个用户同时请求同一个 servlet 时, tomcat 就会产生多条线程去执行 servlet 的代码,所以 servlet 有线程不安全的隐患。

举个线程不安全的例子:

一个 servlet 类有一个成员变量 name,此时有两个用户同时要修改该 servlet 的name属性。

如图所示:线程 A 的输出结果是不正确的。这就是线程不安全造成的结果

这里写图片描述

那么我们解决线程不安全的方法是:

尽量不要将 name 属性定义为成员变量,而要把 name 变量分别定义到 doGet() 和 doPost() 方法内。虽然使用 synchronized (name){} 语句块也可以解决问题,但是会造成线程的等待,导致用户等待时间变长,用户体验变差。所以不提倡。

注意:如果只是并发地读取属性而不写入,则不存在数据不同步问题。因此 servlet 里的只读属性最好定义成 final 类型。

1 0