Servlet一笔记
一、web相关概念
1. 软件架构
目标
- 理解B/S 和 C/S的优缺点
讲解
C/S架构
- C:Client,客户端;S:Server,服务器
- 比如:QQ,微信,网游
- 优点:
- 显示效果好
- 安全性高
- 服务器压力小
- 缺点:
- 安装客户端软件
- 更新维护不方便
- 开发成本高
B/S架构
- B:Broswer,浏览器;S:Server,服务器
- 比如:网页版微信,12306,微博,京东,淘宝,网银,页游
- 优点:
- 不需要再额外安装软件
- 更新维护方便
- 开发成本低
- 缺点:
- 显示效果略差-HTML5和CSS3
- 服务器压力大-集群
- 安全性低-U盾、安全插件
小结
- C/S架构:客户端/服务器架构
- 好处:安全性高,显示效果好,服务器压力小
- 缺点:需要安装软件,更新维护不方便
- B/S架构:浏览器/服务器架构
- 好处:不需要安装软件,更新维护方便
- 缺点:安全性低,显示效果差,服务器压力大
2. web资源
目标
- 理解web资源的概念
- 能区分静态资源和动态资源
讲解
web资源
- 通过web网络能够访问的资源,是web资源
web资源分类
- 静态资源:资源/数据是不变的。比如:HTML、CSS、JS、图片、音频、视频等等
- 动态资源:资源/数据是不同的。比如:Servlet、JSP、PHP、ASP
小结
- 静态资源:不同人、不同时间、不同地方访问一个资源,效果是相同的
- 动态资源:不同人、不同时间、不同地方访问同一资源,效果可能是不同的
3. 服务器软件
目标
- 了解服务器软件的作用
- 了解常见的服务器软件
讲解
服务器软件
把资源部署在服务器软件上,就可以让其它人通过网络访问到,从而成为web资源
常见的服务器软件
- Tomcat:Apache提供的,免费开源的小型服务器软件。支持JSP和Servlet规范。
- WebLogic:Oracle提供的,收费大型服务器软件。支持JavaEE所有规范。功能更强
- WebSphere:IBM提供的,收费的大型服务器软件。支持JavaEE所有规范。功能强,稳定,贵 DB2
小结
- 服务器软件:把资源部署到服务器软件里,这些资源就成为了web资源
- 掌握一个:Tomcat
二、Tomcat
1. 下载与安装
目标
- 下载Tomcat
- 了解Tomcat的目录结构
讲解
1) 下载与安装
-
免安装,直接解压即可
2) 目录结构
tomcat
|- bin:可执行命令的文件夹。比如:启动和关闭
|- conf:配置文件夹
| |- server.xml:是Tomcat本身的配置,比如端口号
| |- web.xml:主要是部署的web项目的默认配置
|- lib:Tomcat的核心程序jar包
|- logs:日志文件夹
|- temp:临时文件夹
|- webapps:用于部署web项目的文件夹
|- work:工作目录,主要给JSP使用的
小结
- 启动和关闭:找bin文件夹
- 修改Tomcat配置:找conf文件夹
- 要部署web应用:找webapps文件夹
2. 启动和关闭
目标
- 能够启动和关闭Tomcat
- 能够解决启动时常见的问题
讲解
1) 启动和关闭Tomcat
- 启动:双击
tomcat/bin/startup.bat
- 关闭:
- 双击
tomcat/bin/shutdown.bat
- 直接关闭Tomcat的黑窗口
- 双击
2) 启动时常见的问题
1. Java环境变量没有正确配置,导致Tomcat无法启动
- 现象:启动Tomcat时,黑窗口一闪而过
- 验证:打开cmd,执行java的命令:
java
命令,输出的有提示信息,说明是正确的javac
命令,输出的有提示信息,说明是正确的
- 正确配置JDK环境变量
2. 端口冲突导致Tomcat无法启动
- Tomcat默认要占用3个端口:8005(关闭命令使用的),8080(HTTP协议使用的),8009(AJP协议使用的)
-
现象:通过查看日志,确定是否是端口冲突。日志文件:
tomcat/logs/catalina*
Caused by: java.net.BindException: Address already in use: bind
-
解决方案:
-
方案一:杀掉占用端口的进程,然后再启动Tomcat
- 找到占用端口的进程:在cmd里执行命令
netstat -ano | findstr ":8080"
,找最后一列值,是进程的pid
- 找到占用端口的进程:在cmd里执行命令
-
- 杀掉进程:在任务管理器里找到pid对应的进程,结束进程
-
方案二:更改Tomcat配置文件,使用其它端口
- 找到
tomcat/conf/server.xml
搜索port=
,修改值 - 把端口修改成其它值:建议是1024~65535之间,或者是:80
- 找到
小结
- 启动Tomcat:双击
startup.bat
- 关闭Tomcat:双击
shutdown.bat
或者直接关闭Tomcat的黑窗口 - 启动时可能遇到的问题:
- Java环境变量配置不正确:重新配置环境变量
- 端口冲突问题:
- 验证:看
logs
文件夹里catalina
开头的文件,如果其中出现了Address already in use
,是端口冲突 - 解决方案一:杀掉占用端口的进程,再启动Tomcat
- 查询占用端口的进程:
netstat -ano | findstr ":端口号"
,最后一列的值就是进程的pid - 打开任务管理器,找到pid对应的进程,结束掉
- 再启动Tomcat
- 查询占用端口的进程:
- 解决方案二:修改Tomcat的配置文件,使用其它端口启动
- 打开
conf\server.xml
,修改其中port=
的值 - 端口的值:1024~65535,或者使用80
- 打开
- 验证:看
3. 部署web项目
目标
- 能够使用Tomcat部署web项目
- 能够使用浏览器访问部署好的web项目★
讲解
1) Tomcat部署项目
-
方案一:把web项目文件夹直接放到
tomcat\webapps
里- 注意:仅限于静态web项目(Static web),可以直接拷贝放到
webapps
文件夹里 - 如果:是动态web项目,即项目里有页面、Java程序,不能直接拷贝放到webapps里。
- 需要使用idea编译web项目,把编译好的结果,拷贝放到webapps里
- 注意:仅限于静态web项目(Static web),可以直接拷贝放到
-
方案二:修改server.xml(不建议)
- 在
server.xml
的Host
标签中增加:
<Context docBase="项目文件所在位置" path="项目访问路径"></Context> <Context docBase="E:\heima\travel" path="travel"></Context>
- 访问时
http://ip:port/项目访问路径/资源路径
- 在
-
方案三:虚拟路径方式(idea使用的,了解)
-
在Tomcat的
conf\Catalina\localhost
中创建xml文件项目访问路径.xml
(如果文件夹不存在,就创建) -
例如:
travel.xml
,内容如下
<Context docBase="E:\heima\travel"></Context>
http://ip:port/xml文件名称/资源路径
-
2) 部署后,访问web项目:
- 在浏览器里输入地址:
http://ip:port/项目访问路径/资源路径
- ip:tomcat所在的电脑的ip
- port:Tomcat的http协议的端口。80是默认端口,如果地址里不写端口,默认就找80端口
- 项目访问路径:默认是webspps里的文件夹名称(每个文件夹就是一个web项目)
小结
-
把静态web项目部署到Tomcat里:
- 把静态web项目文件夹,直接拷贝放到Tomcat的
webapps
里 - 启动Tomcat,浏览器就可以访问了
- 把静态web项目文件夹,直接拷贝放到Tomcat的
-
浏览器访问web资源,地址:
http://服务端的ip:服务器软件的端口/项目路径/资源路径
http://192.168.20.73/docs/api/index.html
4. 集成到idea里-实操
目标
- 把tomcat配置到idea里
- 在idea里创建web项目
- 在idea里把web项目部署到tomcat中,并启动访问
讲解
把tomcat配置到idea里
-
File-->Settings-->打开设置窗口
-
在设置窗口里找到
Application Servers
在idea里创建web项目(动态web项目)
idea里,创建的web项目的目录结构
- 注意:
- web项目里,只有src和web是有效目录。其它内容是无效的,idea会忽略
- WEB-INF文件夹,是受保护的,浏览器访问不到。比如:下载的资源文件,可以放在WEB-INF里
在idea里把web项目部署到tomcat中,并启动访问
- 打开服务器配置窗口
- 部署web项目,并设置项目路径
- 启动Tomcat
- 使用浏览器访问:
http://192.168.20.73/day08/index.html
小结
三、Servlet
1. Servlet简介
目标
- 了解什么是Servlet
- 理解Servlet的作用
讲解
1) 什么是Servlet
- Servlet:Server Applet,是服务端运行Java程序。是Sun公司提供的一套规范(接口),可以让客户端以url的形式远程调用服务器的Servlet(Java程序)。
- 如果一个Java程序,想让客户端通过网络访问到,Java程序必须满足以下两个条件:
- Java程序必须实现Servlet接口
- 必须把Servlet部署到Tomcat上才能运行
2) Servlet的作用
和客户端交互的:
- 接收客户端提交的参数
- 完成客户端要求的功能
- 给客户端返回处理的结果
小结
- Servlet:是Sun公司提供的一套规范(接口)。Java类实现这个接口,就可以让客户端通过url网址的形式,远程调用服务端的Java代码。
- Servlet和普通Java程序的区别:
- Servlet类,必须要实现Servlet接口
- Servlet类,必须要部署到服务器软件(Tomcat)里,才可以让客户端访问到
- Servlet的作用:和客户端交互的
- 接收客户端提交的参数
- 完成客户端要求的功能
- 给客户端返回结果
2. Servlet快速入门
目标
- 编写一个Servlet,部署到Tomcat中;使用浏览器访问Servlet
分析
实现的步骤:
- 创建一个Java类,实现
javax.servlet.Servlet
接口 - 重写接口里的方法(共有5个,了解3个,重点关注1个:
service
) - 使用
@WebServlet
注解配置Servlet类(配置Servlet的虚拟访问路径)
实现
@WebServlet(urlPatterns = "/demo01")
public class Demo01Servlet implements Servlet {
@Override
public void init(ServletConfig config) throws ServletException {
}
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("Demo01Servlet.service 运行了");
}
@Override
public void destroy() {
}
@Override
public ServletConfig getServletConfig() {
return null;
}
@Override
public String getServletInfo() {
return null;
}
}
小结
-
创建Java类,实现
Servlet
接口 -
重写接口的方法(重点关注service方法)
-
使用
@WebServlet
配置虚拟访问路径。比如:@WebServlet("/demo01")
-
部署项目,启动/重启/重新部署Tomcat,之后使用浏览器访问
http://192.168.20.73:80/day08/demo01
3. Servlet的生命周期和API
目标
- 能说出Servlet的生命周期过程
- 了解Servlet生命周期相关的API
讲解
1) 生命周期(面试题)
- 何时创建:
- 默认第一次访问时,Tomcat创建Servlet对象
- 创建Servlet对象时,会执行init方法
- init方法只执行一次,一个Servlet类只有一个对象
- 何时销毁:
- 当服务器关闭时,Servlet对象会被销毁
- Servlet对象销毁时,会执行destroy方法
- destroy方法只执行一次
- 每次访问Servlet时,必定执行的方法:service方法
2) API介绍【了解】
方法 | 参数 | 说明 |
---|---|---|
init(ServletConfig) |
Servlet配置信息对象 | 初始化方法 |
service(ServletRequest, ServletResponse) |
请求对象,响应对象 | 业务方法 |
destroy() |
销毁方法 |
-
ServletConfig
:是Servlet的配置信息对象。作用是了解的:config.getServletName()
: 获取Servlet的名称config.getInitParameter("参数名称")
:获取初始化参数值config.getServletContext()
:获取ServletContext对象
-
ServletRequest
:用于接收客户端提交的数据request.getParameter("表单项的name")
:接收客户端提交的表单数据
-
ServletResponse
:用于给客户端返回数据的response.getWriter().print("会显示到浏览器页面上的内容")
小结
- 生命周期【面试题】:
- 何时创建:默认是第一次访问时,Tomcat创建的,会执行一次init方法
- 何时销毁:服务器关闭时,Servlet对象会销毁,会执行一次destroy方法
- 每次访问Servlet,必定会执行的方法是:service方法
4. 配置的了解
-
在web3.0以前,用web.xml配置
-
在web3.0以后,用注解配置 或者 用web.xml配置
-
如果一个Servlet要想被客户端访问,就必须使用注解
@WebServlet
,提供一个虚拟访问路径@WebServlet( urlPatterns/value=虚拟路径, name="Servlet名称", loadOnStartup=整数,表示Servlet创建的时机 )
- urlPatterns或者value:配置Servlet的虚拟访问路径,必须的。
- 值:以
/
开头的路径,比如:/demo01
,/login
,/admin/manager
- 注意:不同Servlet的虚拟访问路径不能相同
- 值:以
- loadOnStartup:Servlet对象的创建时机
- Servlet默认是第一次访问时创建的
- 如果设置值为正整数,就表示服务器一启动,Tomcat就会创建Servlet对象
- 数值越小,创建的越早
- name:非必须
- urlPatterns或者value:配置Servlet的虚拟访问路径,必须的。
5. Servlet的简化开发方式
目标
- 了解Servlet的多种开发方式
- 掌握继承HttpServlet的开发方式
讲解
1) 创建Java类,实现Servlet
接口
- 多个Servlet中,有大量的冗余代码
- 只用到Servlet的service方法,其它方法基本用不上,但是又必须写
2) 创建Java类,继承GenericServlet
父类
- 由
GenericServlet
实现Servlet
接口,实现接口的方法 - 我们再创建类,继承
GenericServlet
,重写业务方法service
@WebServlet(urlPatterns = "/demo02")
public class Demo02GenericServlet extends GenericServlet {
@Override
public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
System.out.println("Demo02GenericServlet.service 运行了");
}
}
3) 创建Java类,继承HttpServlet
父类
- 由
HttpServlet
继承GenericServlet
父类,重写service
方法:- 如果是
get
方式的请求,就调用doGet
- 如果是
post
方式的请求,就调用doPost
- 如果是
- 我们再创建类,继承
HttpServlet
,重写doGet
和doPost
方法
@WebServlet(urlPatterns = "/demo03")
public class Demo03HttpServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("get和post请求,共同的功能代码");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
配置servlet的模板
小结
四、练习:登录功能的简单实现
-
登录功能的简单实现:
- 页面有一个登录表单,表单里有用户名和密码、提交按钮
- 如果登录成功:页面上要显示“login successed”
- 如果登录失败:页面上要显示“login failed"
-
需要做的事情:
-
创建一张用户表,表里有username和password。插入一条用户数据
-
编写页面,表单
-
编写Servlet代码,完成登录校验的功能
- 如果登录成功:“login successed”
- 如果登录失败:“login failed"
-