博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb 基础(1)—— servlet
阅读量:2059 次
发布时间:2019-04-29

本文共 2149 字,大约阅读时间需要 7 分钟。

尊重个人劳动成果,转载请注明出处:

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标签  request.getParameterValues("test")   ----------------- [1, 2, 3]request.getParameter("test")             ------------------ 12. checkbox 看书 电影 游戏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 类型。

你可能感兴趣的文章
在Java中如何高效判断数组中是否包含某个元素
查看>>
设计模式总结
查看>>
什么时候可以使用Ehcache缓存
查看>>
Java核心知识点-JVM结构和工作方式
查看>>
Java编程中“为了性能”一些尽量做到的地方
查看>>
Java并发编程:线程池的使用
查看>>
redis单机及其集群的搭建
查看>>
Java多线程学习
查看>>
检查Linux服务器性能
查看>>
Java 8新的时间日期库
查看>>
Chrome开发者工具
查看>>
Java工程师成神之路
查看>>
如何在 Linux 上自动设置 JAVA_HOME 环境变量
查看>>
MSSQL复习笔记
查看>>
Spring基础知识汇总
查看>>
Chrome扩展插件
查看>>
log4j.xml 日志文件配置
查看>>
如何删除MySql服务
查看>>
BAT Java和Rti环境变量设置
查看>>
NodeJs npm install 国内镜像
查看>>