Servlet笔记 - day1
一、引言
- 目前程序存在的问题
- tomcat+html展示信息不变
-
原因:
- html网页中的信息是静态的(数据不变)
- tomcat直接读取html源文件中的内容,响应给浏览器
-
解决思路:
- 将 Java程序交给 tomcat管理
- 服务器调用Java程序,获得结果响应给浏览器
二、Servlet
-
概念:
(1) 在 服务器上运行的,用Java语言编写的一段程序。
(2) 用于接收 client的请求(rquest),处理完成后把对应的结果响应(response)给client- 通常以网页的形式:是一种制作动态网页的技术
- Servlet标准:Servlet接口,JavaEE规范
(1) 接口:javax.servlet.Servlet
(2) 接口的位置:tomcat/lib/servlet-api.jar包中
-
自定义Servlet程序的三种方式:
(1) class 类名 implements Servlet{}- 必须实现接口中的5个方法
- 与协议无关
(2) class 类名 extends GenericServlet{}
- GenericServlet位于javax.servlet包中的抽象类
- 必须实现service方法;
- 与协议无关
(3) class 类名 extends HttpServlet{}
-
HttpServlet位于java.servlet.http包中,需要覆盖service方法;
-
与协议有关
三、第一个Servlet程序
第一个Servlet程序:动态显示当前系统时间。
-
准备工作:
- 在Java Project项目中,必须导入Servlet的jar包
- tomcat/lib/servlet-api.jar包中
-
编写Servlet程序 :
-
将servlet程序部署到tomcat(发布):
- 注意:将带包结构的.class文件放到tomcat/webapps/web应用/WEB-INF/classes文件夹中
-
配置Servlet的 web.xml 文件:
- 配置的目的:把不能直接运行的Servlet类转化为用户可以直接访问运行的类
- 注意:每一个 web应用,有且只能有一个 web.xml文件
-
启动 tomcat:
- tomcat的根目录/bin/startup.bat
- 注意:只要更改web.xml 中的内容,必须重启tomcat服务器
-
访问/请求:
- http://ip:port/web应用名/url-pattern
- 例如:http://localhost:8989/myweb/first
- 注意:访问地址中间不能带有任何空格
四、Servlet中乱码解决
- 设置响应的内容类型:
response.setContentType(“text/html”); - 设置响应的字符集:
response.setCharacterEncoding(“gbk”); - 以上两句代码合成一句:
response.setContentTyp("text/html;charset=“gbk”);
五、常见异常及解决方案
- 404 :请求资源无效
解决方案:- url 地址栏的地址写错,特别是web应用名和url-pattern
- 检查控制台是否有异常信息
- 确认带包结构的 class 文件,已经拷贝到 server 的正确路径
- 检查 web应用的 目录结构
- 405:
解决方案:- 检查servlet中的service方法的声明是否正确
- service方法中 不能调用父类的方法:super.service(参数);删除
- 500:服务器端错误
解决方案:- java源代码运行过程中出现异常
- 检查异常堆栈信息确定到错误行
- 确认 web.xml 中的< servlet> 包名.类名< /servlet > 是否正确
- 运行正常,在浏览器提示下载或是另存为…
解决方案:- 检查是否设置响应类型的参数:
- response.setContentType(“text/html”);
- servlet修改后,没有变化
解决方案:- servlet代码修改,tomcat需要重启,才能生效
六、MyEclipse集成开发Servlet和部署
-
MyEclipse 管理 tomcat
(1) 配置tomcat
- window --> preferences --> 搜 tomcat —> tomcat 7.x -->
点击 --> 选择Enable+tomcat目录 --> apply
(2) 管理 tomcat窗口:
- window --> showview --> other --> servers
(3) 启动tomcat
- servers --> tomcat7.x --> 右键 run server
(4) 关闭 tomcat
- servers --> tomcat 7.x --> 右键 stop server
- window --> preferences --> 搜 tomcat —> tomcat 7.x -->
-
MyEclipse 开发部署 Servlet
(1) 新建 web project
web项目自动创建对应的web应用目录结构:
- WEB-INF
- classes
- web.xml
(2) 编写 Servlet程序
(3) 编写 配置文件 web.xml
(4) 部署 web项目- servers --> tomcat8.x --> 右键 --> add deployment --> 选择部署项目
- 注意:项目部署后,默认 server 上的web应用名 是 web project 项目名。
- 查看web应用名:
项目右键 --> properties -->MyEclipse --> Project Facets -->Web 点击右侧展示
七、请求Servlet的三种方式
-
浏览器通过地址栏直接请求:
http://ip:port/web应用名/url-pattern -
通过超链接请求:
(1) 在server上创建 html网页,并且定义 a 标签
(2) 指定a标签的href属性:
< a href="/web应用名/url-pattern" > … < /a> -
通过表单请求
在server上创建 html页面,并定义form 表单
指定 form标签中的 action 属性:< form action="/web应用名/url-pattern">
注意: 1. 地址栏请求方式和超链接请求方式都是get发送方式 2. 表单请求即可以get请求方式也可以post请求方式
八、Servlet接收请求参数
-
引入 :
-
获取表单数据(get和post方式):
String value = request.getParameter(“表单元素的name”); -
解决post请求数据中的中文乱码:
request.setCharacterEncoding(“utf-8”);
注意:设置编码,需要在接收请求参数之前设置 -
Client带参请求:
(1) Server获取Client请求参数:
String value = request.getParameter(“表单元素的name”);(2) 解决Client请求参数乱码:
-
post提交方式乱码:
-
get提交方式乱码:修改 tomcat的 conf/server.xml中 < connector>
-
九、Servlet生命周期
-
servlet的生命周期 由 server tomcat 进行管理。
-
请求处理的完整过程:
(1) client 向 server 发出请求
(2) server 接到请求,解析URL地址,根据 /web应用名,确定唯一的 web.xml
(3) 根据 /url-pattern,在 web.xml 找到中对应的
注意: 找不到 报 404
(4) 根据中的,找到中的
(5) 根据中的 ,找到 中的
(6) 根据 中的 ,找到 中的- server 在内存中获取该类的对象:
- 第一次请求(对象不存在),使用反射创建该类的对象:
obj = Class.forName(“包名.类名”).newInstance(); - 以后再请求(对象存在),直接使用该对象
- 第一次请求(对象不存在),使用反射创建该类的对象:
(7) 调用 service 方法,处理请求,把结果响应给 client
- server 在内存中获取该类的对象:
-
Servlet生命周期阶段【面试 题目】
(1) servlet的生命周期 由 server tomcat 进行管理
(2) 扩充:同一个Servlet在tomcat整个启动过程中,只启动一次,默认是在client第一次请求时,也有特殊情况
-
思考:如何统计当前显示系统时间的Servlet被访问的次数。
-
线程问题:
(1) servlet在运行时,tomcat只为该类创建1个对象(servlet为单例设计),并由这个对象负责对所有请求它的client进行处理。 当多个client同时请求该servlet时,这个对象就成为多线程环境下的临界资源对象,此时必须保证该临界资源对 象的准备性和正确性(线程安全):- 方法一: 对临界资源对象操作不安全的代码 使用synchronized(效率低);
- 方法二: 尽量避免在servlet中定义(有修改可能的)成员变量。
(2) Servlet单例设计的优缺点:
- 缺点:多线程环境下,数据不安全
- 优点:提高效率,减小频繁创建对象带来的消耗;同时提高jvm内存空间的利用率
这个对象负责对所有请求它的client进行处理。 当多个client同时请求该servlet时,这个对象就成为多线程环境下的临界资源对象,此时必须保证该临界资源对 象的准备性和正确性(线程安全):
- 方法一: 对临界资源对象操作不安全的代码 使用synchronized(效率低);
- 方法二: 尽量避免在servlet中定义(有修改可能的)成员变量。
(2) Servlet单例设计的优缺点:
- 缺点:多线程环境下,数据不安全
- 优点:提高效率,减小频繁创建对象带来的消耗;同时提高jvm内存空间的利用率