本文共 2149 字,大约阅读时间需要 7 分钟。
尊重个人劳动成果,转载请注明出处:
servlet 是运行在服务器端的,按照一定规范编写的 java 应用程序。
用下表解释定义:
Java类 | 服务器端运行 | 必须调用Java Servlet API |
---|---|---|
Servlet是用Java语言编写的,遵守所有Java语言的语法规则的Java类 | Servlet是在服务器端运行的。它编译后的“.class”文件被服务器端调用和执行 | Servlet必须调用Java Servlet API,必须是对特定类或接 |
用来接收,处理客户端请求,并把处理结果返回到客户端显示。
(更详细点说明是:把处理结果返回给服务器,由服务器将响应结果传给客户端)Servlet 的生命周期指的是 Servlet 从被 Web 服务器加载到它被销毁的整个生命过程。
细致说明:
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);}
作用:可以跳转到本应用的任何 jsp,servlet 文件,包括 WEB-INF 下的文件。代码如下:
req.getRequestDispatcher("/com/czd/servlet/servlet02") .forward(req,resp);
注意:getRequestDispatcher() 方法的参数必须为以 “/” 开始,“/” 表示本 web 应用程序的根目录
框架中常常使用一个 servlet 来集中处理请求,然后跳转到响应的 servlet。或者在 servlet 中处理业务逻辑,然后跳转到 jsp 页面中处理结果。
它不能跳转到 WEB-INF 下的文件,但能够跳转到其他应用的页面,比如百度首页等
resp.sendRedirect("com/czd/servlet/servlet02");
自动刷新本页面
// 每隔一秒钟就自动刷新本页面resp.setIntHeader("Refresh",1);
自动跳转
// 第二个参数的 1 是秒数resp.setHeader("Refresh","1;URL=http://localhost:8080/index2.html");
说明:参数 “Refresh”,“URL” 大小写不敏感。
因为 servlet 是单例的,当多个用户同时请求同一个 servlet 时, tomcat 就会产生多条线程去执行 servlet 的代码,所以 servlet 有线程不安全的隐患。
举个线程不安全的例子:
一个 servlet 类有一个成员变量 name,此时有两个用户同时要修改该 servlet 的name属性。
如图所示:线程 A 的输出结果是不正确的。这就是线程不安全造成的结果
那么我们解决线程不安全的方法是:
尽量不要将 name 属性定义为成员变量,而要把 name 变量分别定义到 doGet() 和 doPost() 方法内。虽然使用 synchronized (name){} 语句块也可以解决问题,但是会造成线程的等待,导致用户等待时间变长,用户体验变差。所以不提倡。
注意:如果只是并发地读取属性而不写入,则不存在数据不同步问题。因此 servlet 里的只读属性最好定义成 final 类型。