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方法;
-
与协议有关
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UWA3msT5-1609819136940)(1609733790601.png)]](https://i-blog.csdnimg.cn/blog_migrate/2163b1fdf9a5b88c889474a221f33035.png)
三、第一个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文件
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6xb5Q68C-1609819136949)(1609741928871.png)]](https://i-blog.csdnimg.cn/blog_migrate/af05d5b6e5b378f7f4711234bd3af8fc.png)
-
启动 tomcat:
- tomcat的根目录/bin/startup.bat
- 注意:只要更改web.xml 中的内容,必须重启tomcat服务器
-
访问/请求:
- http://ip:port/web应用名/url-pattern
- 例如:http://localhost:8989/myweb/first
- 注意:访问地址中间不能带有任何空格
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lYHbFl5J-1609819136951)(1609742049077.png)]](https://i-blog.csdnimg.cn/blog_migrate/f5948bf2e78df597c5913e8d2bbf2df3.png)
四、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
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wv9b0eve-1609819136952)(1609742673858.png)]](https://i-blog.csdnimg.cn/blog_migrate/6d4602cadd35622adb0a04211b30d7c2.png)
(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>![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lurb9nSZ-1609819136953)(1609744315670.png)]](https://i-blog.csdnimg.cn/blog_migrate/ab30f053bb3bad7dbf81144415968121.png)
-
通过表单请求
在server上创建 html页面,并定义form 表单
指定 form标签中的 action 属性:< form action="/web应用名/url-pattern">
注意: 1. 地址栏请求方式和超链接请求方式都是get发送方式 2. 表单请求即可以get请求方式也可以post请求方式
八、Servlet接收请求参数
-
引入 :
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FJuzZhlQ-1609819136954)(1609745086389.png)]](https://i-blog.csdnimg.cn/blog_migrate/9a7a3872995e3338976b0bb641d6d823.png)
-
获取表单数据(get和post方式):
String value = request.getParameter(“表单元素的name”); -
解决post请求数据中的中文乱码:
request.setCharacterEncoding(“utf-8”);
注意:设置编码,需要在接收请求参数之前设置 -
Client带参请求:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TGFiUu2g-1609819136955)(1609745351378.png)]](https://i-blog.csdnimg.cn/blog_migrate/f634092822b563307ff88299f2b8e244.png)
(1) Server获取Client请求参数:
String value = request.getParameter(“表单元素的name”);(2) 解决Client请求参数乱码:
-
post提交方式乱码:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4ET12kGR-1609819136956)(1609745440859.png)]](https://i-blog.csdnimg.cn/blog_migrate/27c034a3442745986f6498f996f70d64.png)
-
get提交方式乱码:修改 tomcat的 conf/server.xml中 < connector>
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hZFw1JeF-1609819136957)(1609745461415.png)]](https://i-blog.csdnimg.cn/blog_migrate/4b4a44444705a4c56d2016b47f6ea650.png)
-
九、Servlet生命周期
-
servlet的生命周期 由 server tomcat 进行管理。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dQrj3MF0-1609819136958)(1609745555860.png)]](https://i-blog.csdnimg.cn/blog_migrate/7f68c8a2d8eaab3e49ff79c3a42c9901.png)
-
请求处理的完整过程:
(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 进行管理
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f50ewE2Q-1609819136960)(1609745996539.png)]](https://i-blog.csdnimg.cn/blog_migrate/fc20e323b4d1725930b3762ea7041299.png)
(2) 扩充:同一个Servlet在tomcat整个启动过程中,只启动一次,默认是在client第一次请求时,也有特殊情况
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oloDnz0K-1609819136961)(1609746042953.png)]](https://i-blog.csdnimg.cn/blog_migrate/536759509ffba7f93d803ebad5834698.png)
-
思考:如何统计当前显示系统时间的Servlet被访问的次数。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Cya7hX6-1609819136962)(1609746104294.png)]](https://i-blog.csdnimg.cn/blog_migrate/6bbec91f007f3794b7387e1e00d29daf.png)
-
线程问题:
(1) servlet在运行时,tomcat只为该类创建1个对象(servlet为单例设计),并由这个对象负责对所有请求它的client进行处理。 当多个client同时请求该servlet时,这个对象就成为多线程环境下的临界资源对象,此时必须保证该临界资源对 象的准备性和正确性(线程安全):- 方法一: 对临界资源对象操作不安全的代码 使用synchronized(效率低);
- 方法二: 尽量避免在servlet中定义(有修改可能的)成员变量。
(2) Servlet单例设计的优缺点:
- 缺点:多线程环境下,数据不安全
- 优点:提高效率,减小频繁创建对象带来的消耗;同时提高jvm内存空间的利用率
这个对象负责对所有请求它的client进行处理。 当多个client同时请求该servlet时,这个对象就成为多线程环境下的临界资源对象,此时必须保证该临界资源对 象的准备性和正确性(线程安全):
- 方法一: 对临界资源对象操作不安全的代码 使用synchronized(效率低);
- 方法二: 尽量避免在servlet中定义(有修改可能的)成员变量。
(2) Servlet单例设计的优缺点:
- 缺点:多线程环境下,数据不安全
- 优点:提高效率,减小频繁创建对象带来的消耗;同时提高jvm内存空间的利用率
347

被折叠的 条评论
为什么被折叠?



