文章摘要
- 前言
- 第一部分:Web 与 Servlet基础
- 第二部分:Servlet进阶
- 第三部分、Servlet 开发 - 常见问题
- 总结
前言
了解B/S模式 能更好的理解Web应用程序流程。
PC端💻 浏览器 ,移动端📱 平板 浏览更为合适~
🚲单机时代-桌面应用
- ➧软件所有数据都保存在电脑本地硬盘中
- 优点:易于使用,结构简单
- 缺点:数据难以共享、安全性差、更新不及时
- 例:office、idea开发工具、等等
🚗联机时代(Client - Server模式)
- ➧客户端和服务器结构
- 优点:数据方便共享,安全性高
- 缺点:必须安装客户端,升级与维护不便
- 例:聊天软件、LOL、等等
✈️互联网时代(Browser - Server模式)
- ➧浏览器和服务器模式(web应用程序),对开发模式进行了标准化,基于HTML跨平台
- 优点:开发简单,无需安装客户端,数据易于共享
- 缺点:相较C/S模式,浏览器是否拉跨?
- 例:使用CSND、7K7K、等等
第一部分:Web 与 Servlet基础
一、B/S 模式执行流程
例:
- 用户 在 浏览器输入 百度 的 网址
- 网址 被DNS服务解析成对应的IP地址
- 由浏览器 向IP地址发起一个HTTP的 数据包
- 服务器主机 里的 Web服务器程序 接收 浏览器发来的数据
- 服务器主机 里的 Web服务器程序 执行相关代码 生成HTML代码
- Web服务器程序 反回HTML代码
- 浏览器 解析 送回的数据 并显示 给用户
请求与响应:
◆从浏览器 发送 给服务器的 数据包 称为:请求(Request)
◆从服务器 返回 给浏览器的 结果称为:响应(Response)
二、认识工具
1、Servlet 简介
Servlet 是 J2EE- java 2企业版 里 其中的一个模块。
Servlet 称为 小服务程序
或 服务连接器
,主要用于生成动态Web内容。
Servlet是在服务器端运行 以 处理客户端请求而做出响应的程序。
使用 Servlet 需用到 => Tomcat。
2、Apache Tomact 简介
一款免费开放源代码的 Web应用服务器程序。
Tomcat 是运行 Servlet 的容器,是servlet运行时的载体。
浅析:Tomact 就是 上面B/S模式里的 Web服务器程序。
在 Tomcat 里面由 Servlet 生成HTML 响应内容。
三、使用Tomcat 、Servlet
1、安装运行Tomcat
①如何下载?
Tomcat官网,下载并解压文件
目录内部结构:
②如何运行?
◆需要配置环境:配置好 适应的JDK
◆运行检查:1、打开bin目录下的 startup.bat 命令 2、浏览器输入本地ip地址+Tomcat端口号
注:要微调Tomcat 可以在conf目录下server.xml配置文件中更改
2、创建Java Web工程 并运行 Tomcat
2.1 第一步 - 构建 Web工程
①创建 Maven 工程
②在main目录下创建 webapp目录 用于保存web应用 的 相关资源
③设置 webapp
在模块中添加 Web模块
设置Web模块 里的 web配置文件 把配置文件路径 定位 到创建的webapp目录
设置 与 Web应用相关的资源 放在 路径为 webapp目录下
设置最终运行的 Web应用目录 一般进入之后 直接点OK
注:可以在webapp目录下创建html文件,等待后面的运行测试
2.2 第二步 - 绑定Tomcat
①先配置好Tomcat 模板
此处留 /
比较好(默认忽略)
应用程序上下文:为了区分在同一个Tomcat下,通过上下文 区分不同的工程 。
②再添加Tomcat
······
③检测Tomcat
控制台 选中Tomcat Debug模式。浏览器:本地ip地址+/+上面所创建的THML文件
四、Servlet 嵌入Tomcat
1、添加Severlet 的依赖
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
2、创建Servlet 类
注:类名一般设置为 前半部分用意 | 后半部分Servlet结尾
◆ 一 、使该Servlet类 继承
HttpServlet
(该类来自上面的依赖里)
◆ 二 、重写父类HttpServlet里面的 方法
第一个参数:浏览器发来的请求
第二个参数:向浏览返回的响应
◆ 三 、配置web.xml , 绑定访问地址
2.1 Servlet类 使用案例
①创建Servlet类、继承、并重写父类 方法
public class sampleServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ... {
String name = req.getParameter("name"); //请求对象.getParameter(); 获取(用户)指定的参数
String html = "<h1 style='color:red'>hi," + name + "!</h1><hr/>";
PrintWriter out = resp.getWriter();//响应对象.getWriter(); 获取返回的 响应流。 返回类型 PintWriter
out.println(html); //PintWriter对象.println() 向客户端返回响应
}
}
注:Tomcat 是不知道 当前的Servlet类是否存在的。需要在 web.xml 文件中对 该Servlet类 配置
②在web.xml中 对上面 Servlet类 添加配置
<servlet>
<servlet-name>nn</servlet-name>//配置的 servlet类 的别名 或者是 小名
<servlet-class>...</servlet-class>//书写要配置的 Servlet类 的完整路径
</servlet>
上面的Servlet 要怎么对外暴露出来呢?需要下面的代码 就是Servlet映射
<servlet-mapping>
<servlet-name>nn</servlet-name>//绑定哪个Servlet
<url-pattern>/...</url-pattern> //绑定某个网址
</servlet-mapping>
③运行程序
注:Tomcat 加载运行 下面的目录(测内容涉及java Web的标准结构)
④ 检测程序
浏览器输入 本地ip:端口/上面设置的 绑定某个网址?name=a(设置上面name的值)
五、Java Web标准结构
组织结构 | 描述 |
---|---|
/ | java Web应用根目录 |
/index.html | 默认首页 |
/WEB-INF | WEB应用的安全目录,用于存放配置文件 、编译后的字节码、以及底层的依赖 |
/WEB-INF/web.xml | web.xml 是"部署描述符文件" ,是该Web 项目核心配置文件 |
/WEB-INF/classes | 存放编译后的classes文件 |
/WEB-INF/lib | 用于存放web应用依赖的jar文件 |
META -INF/MANIFEST.MF | 包含Web应用的版本信息 等 |
注: /WEB-INF、META -INF这是两个特殊的目录,其下面的文件或者其他资源是无法从外侧(客户端) 直接访问的。
只有在根路径下或者自定义的子目录中的 文件或者其他资源 才可以被访问。
六、Servlet复习、细节专题
1、Servlet开发步骤
前提:是加入Severlet的 依赖
◆ 一 、创建Java类,继承HttpServlet => 也就是创建 Servlet类
◆ 二 、重写父类HttpServlet 里面的 servlet方法,处理请求、生成响应
①处理请求中的(用户)数居
所有 与请求对应 的操作都可以用: 请求对象.什么什么方法();
来进行操作
其中 请求对象.getParameter();
就是用于获取指定什么参数的
②通过响应返回结果
响应对象.getWriter();
获取返回的 字符输出流。 返回类型 PintWriter(字符输出流)
Tomcat 向 浏览器 返回具体的 响应文本 => 字符输出流对象.println("组织好的HTML");
◆ 三 、配置web.xml , 为Servlet类
绑定访问地址
2、请求参数的 发送 与 接收
◆ 一 、请求参数
浏览器 通过请求 向Tomcat 提交的数据
请求参数 => 通常指 用户输入的数据, 待Servlet进行处理
格式固定: 参数名1 = 值1&
参数名2 = 值2&
参数名n=…
◆ 二 、Servlet接收 请求参数
①请求对象.getParameter();
-接收单个参数
②请求对象.getParameterValues();
-接收多个同名参数
◆ 二 、Get方式的请求 与 Post方式的请求
Get方式:请求参数 附加在 访问地址 ?
(分隔符)的后面 并显性
向服务器发送
Post方式:将数据存放在请求体
中 并隐性
向服务器发送
注:作为请求参数,无论是Get方式还是Post方式 发送请求。发送的数据格式是完全相同的。
当然,要使用 Post方式 需要在相关HTML文件中 设置method="post"
模式。get是默认模式
🔧 应用场景:Get => 传播性好。 例:百度搜索好的结果 发送给别人
Post => 用于安全性较高的功能,或者服务器的“写”操作。例:用户登录、更新公司账目
◆ 三 、Servlet类 处理 Get方式的请求 或 Post方式的请求
① 所有请求 - 重写 service()方法
如果Servlet 区分get方式的请求 或 post方式的请求 进行处理 则需要下面的一些方法:
②Get请求 - 重写 doGet()方法
③Post请求 - 重写 doPost()方法
3、Servlet 生命周期
◆ 一 、装载 - web.xml
◆ 二 、创建 - 构造方法
注:单例多线程
◆ 三 、初始化 - init()
如果需要在 提供服务之前 初始化什么 可以重写此方法 在方法内构建代码
◆ 四 、提供服务 - 执行service()、doGet/Post()
◆ 五 、销毁 - destory()
4、使用注解 配置Servlet
Servlet 3.x 以后版本 引入了 注解 特性
注解 简化了 Web应用程序的 配置 过程(😾经典白学)
Servlet核心注解:@WebServlet("映射的地址")
第二部分:Servlet进阶
一、请求和响应的结构
URL:表示Web应用 对外暴露的 访问地址
。是完整的访问路径,也就是完整的网站地址。=> 给最终用户使用
URI:表示Web应用资源 的 访问路径
。是给 应用程序 使用的。
请求:浏览器 发向 => 服务器 的数据包
1、HTTP请求的结构
◆ 一 、请求行
① 请求方法
通过Get方式的请求 或者 Post方式的请求 发送数据
② 请求URI
③ HTTP协议和版本
◆ 二 、请求头
发送请求过程中 附加的信息。也是通过键值对的形式来表达
◆ 三 、请求体
用于承载请求参数
1.1 请求头 使用案例
例:PC浏览器端和手机端 访问同一页面 显示效果是不同的 => 利用了 请求头的判断
判断请求头里的:User-Agent:…
① 请求对象.getHeader();
用于获取指定请求头的数据,返回字符串
@WebServlet("/Test")
public class Test extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws...{
String oo = "";
String o = 请求对象.getHeader();
先字符串转换(例如大小写)、判断获取的字符串中的信息
if(o.toLowerCase().indexOF("windows nt") != -1){
oo = "PC端";
}else if(o.toLowerCase().indexOF("iphone") != -1){
oo = "移动端";
}
响应对象.getWritrt().println(oo);
}
}
② 响应出现 乱码问题
响应 对外输出时,需指定字符集
响应对象.setContenType();
代表 内容类型 的意思
响应对象.setContenType("text/html;charset=utf-8");
响应对象.getWritrt().println(oo);
2、ContentType 详讲
ContentType 决定浏览器采用 何种方式 对 响应体 进行处理
ContentType类型 | 描述 |
---|---|
text/plain | 纯文本 |
text/html | HTML文档 |
text/xml | XML文档 |
application/x-msdownload | 需要下载的资源 |
imag/jpeg | 图片资源 |
imag/gif | 图片资源 |
3、HTTP响应的结构
◆ 一 、响应行
① HTTP协议版本
② 响应状态码
状态码 | 错误描述 | 例: |
---|---|---|
✅ 200 | 服务器处理成功 | ✌️ |
❌ 404 | 无法找到资源 | URI输入错误、没有对应资源 |
❌ 500 | 内部服务器错误 | Tomcat内部执行产生的问题、出现了没有捕捉到的异常 |
❌ 403 | 服务器拒绝访问 | / |
❌ 400 | 无效的请求 | / |
❌ 401 | 未经过授权 | / |
❌ 503 | 服务器超负载或停机维护,无法处理请求 | / |
◆ 二 、响应头
作为本次响应中 产生的 额外的信息 和请求头相似 都是些辅助性信息
◆ 三 、响应体
真正的数据部分,生成的THML片段 都是放在其中 持续发送给浏览器
4、请求转发 与 响应重定向
◆ 一 、多个Servlet 之间跳转 两种方式
① 请求对象.getRequestDispatcher("要跳转的Servlet地址")
- 请求转发
getRequestDispatcher() 转发器
forward(请求对象,响应对象) - 完成转发的动作
➡️ 请求对象.getRequestDispatcher("要跳转的Servlet地址").forward(请求对象,响应对象) ;
② 响应对象.sendRedirect("要跳转的Servlet地址")
- 响应重定向
◆ 二 、Servlet之间跳转 的 原理
①请求转发
是服务器跳转,只会产生一次请求
一个Tomcat里面 两个Servlet交互
访问地址 不会 发生变化
处理的方式也要保持相同
②响应重定向
浏览器端跳转,会产生两次请求
处理的方式也要保持相同
访问地址 会 发生变化
产生的新请求 默认 是 get请求方式
处理的方式也要保持相同
注:两者的应用场景不同。
请求转发 例:两个业务关系紧密
相应重定向 例:两个业务关系 不是很 紧密
◆ 三 、设置请求自定义属性
请求 允许创建自定义属性。不适用 响应重定向。 因为产生新请求 就会失效
设置请求属性:请求对象.setAttribute("String 属性名",Object 属性值)
获取请求属性:Object a = 请求对象.getAAttribute("属性名")
二、Session 与 ServletContext
1、Cookie
Cookie 🍪:是 将程序中的 一些数据 保存在浏览器的 一些文本内容中
有效期内 不会丢失数据 。伴随请求头发送给浏览器
默认域名绑定,只有相对应的域名程序 才能读取数据
样子 =>
◆ 一 、Cookie 的两种 时效性
①默认有效期
与当前浏览器进程绑定
②设置有效期
Cookie对象.setMaxAge(单位是秒);
过期后才会失效
◆二 、Cookie 的 使用
①在Servlet类 中 创建 Cookie对象
Cookie cookie = new Cookie("cookie的名字","cookie的值");
② 把 Cookie对象 放入 响应 中
响应对象.addCookie(Cookie对象);
◆三 、Cookie 的 获取
① 请求对象.getCookies();
用于获取请求头中的Cookie ,返回值是一个Cookie 数组
2、Session - 用户会话
用于保存 “浏览器窗口” 对应的数据。将用户的关键数据,存储在服务器的内存中,具有时效性(默认30min)。
Tomcat 会为需要Session的 浏览器窗口 服务器的内存中(这里用的服务器是Tomcat) 开辟一条内存空间
Session 通过 浏览器Cookie的Seesionld 值提取用户数据(Tomcat中的内存空间 对应窗口需要此项来确认)
◆ 一 、Session 常用方法
①请求对象.getSession()
- 获取Session对象
利用 Session对象 get|set|removeAttribute(“属性名”,“属性值”) - 获取|设置|删除Session属性
setMaxlnactiveinterval() - 设置Session 超时 时间
◆二 、Session 的 使用
①HttpSession session = 请求对象.getSession()
◆三 、Session 的 原理
浅析:可以完成跨请求的数据交换。
例:登入SCN 以后 站内无论点击哪个新的页面,网页上都会有已经登录的账号信息。
3、ServletContext
ServletContext(Servlet上下文对象),是web应用全局对象。只要服务器不管,都存在。
一个Web应用 只会创建一个ServletContext对象
例:网站底部 的 备案信息
◆ 用法
ServletContext SC= 请求对象.ServletContext();
利用 ServletContext对象 get|set|removeAttribute(“属性名”,“属性值”) - 获取|设置|删除Session属性
4、作用域对象比较
①HttpServletRequest - 请求对象 | 请求进来 响应返回以后被销毁了
②HttpSession - 用户会话对象 | 通常与浏览器窗口绑定
③SrvletContext - Web 应用全局对象 | 只要Web应用程序(这里用的Tomcat)启动后 , ServletContext对象就存在
第三部分、Servlet 开发 - 常见问题
1、Web应用中文乱码
产生原因:数据的 发送方 与接收方 对数据使用了不同的字符集解析
解决办法:保证浏览器与服务器 使用 统一的编码 例如:UTF-8
注:doGet请求 Tomcat 8 以后默认 用 UTF-8 。8之前的版本需要在Servlrt.xml配置文件中 设置。
doPost请求 手动配置:请求对象.setCharacterEncoding("UTF-8")
关于 响应 之前写过了。 响应对象.setContenType("text/类型;charset=utf-8");
2、web.xml常用配置
◆ 一 、设置Web应用的 默认首页
①在直接存储Web应用资源的根目录下 创建 相应资源
②配置web.xml 文件
默认首页名称
<welcom-file>资源名.后缀</welcom-file>
可以加载多个、 按顺序判断的
<welcom-file>资源名2.后缀2</welcom-file>
◆ 二 、Servlet 通配符映射和初始化参数
常见URL
◆ http://www.CSND.com/md?cid=888
◆ http://www.CSND.com/nav/789
◆ http://www.CSND.com/789.nav
解决 动态URI 绑定的情况 例:
<servlet>
<servlet-name>nn</servlet-name>
<servlet-class>...</servlet-class>
</servlet>
常用方式
<servlet-mapping>
<servlet-name>nn</servlet-name>
<url-pattern>/nn/*</url-pattern> * 就是不限长度 不限内容
</servlet-mapping>
//另一种:
<servlet-mapping>
<servlet-name>nn</servlet-name>
<url-pattern>*.nn</url-pattern> * 就是不限长度 不限内容
</servlet-mapping>
//还有另一种:
<servlet-mapping>
<servlet-name>nn</servlet-name>
只有一个斜杠。 对所有请求进行映射,Spring MVC 框架中会使用到这个
<url-pattern>/</url-pattern>
</servlet-mapping>
◆ 三 、Web应用程序的 启动时处理
也就是启动时加载Servlet,常用于系统的预处理。用到Servlet生命周期中的init()方法
◆ web.xml中 使用 < load-on-startup > 标签设置好后,启动会自行加载
◆ < load-on-startup >0~9999< /load-on-startup > 数字越小执行优先级越高
◆ 四 、对出现404、500等状态码 -设置默认页面
错误页
<errot-page>
<error-code>错误状态码(例:404)</error-code>
<location>书写准备好发生404错误的页面 的 路径</location>
</errot-page>
3、Java Web应用 - 打包发布
java Web应用采用war包进行发布
利用Maven实现war包导出
◆ 包的导出顺序:
1、找到pom.xml 文件 添加 < packaging >war< packaging > 如果不使用 Meven 导出的是jar包
2、使用Meven 命令 打包 会输出到 => target 目录下
注:可以在pom.xml 文件中 相关依赖可以去重 < scope >依赖组件的作用范围 < /scope >
最终产出物的名字更改 用标签:< build >< finalName >更改的名字< /finalName >< /build >
依赖组件的作用范围 | 说明 |
---|---|
compile | 默认值,依赖组件作用于所有阶段 |
provided | 依赖组件仅作用在编译与测试阶段 |
runtime | 依赖组件仅作用在测试与运行阶段 |
test | 依赖组件仅作用在测试阶段 |
system | 本地jar文件仅作用在编译与测试阶段 |
◆ 导出的项目 如何运行?:
1、找到Tomcat下的 webapp目录 然后放入 打包好的 项目工程
2、找到Tomcat的启动命令,启动Tomcat 。放入的项目工程会自动生效
注:启动后 在webapp目录下会自动解压缩 项目工程 会产生一个项目工程的目录 该目录名就是 应用上下文❗️
因为开发中取消了 应用上下文 所以项目正常运行会出错
3、取消应用上下文
找到conf目录下的server.xml配置文件 。打开找到最下方的 host 标签
在里面添加 < Context docBase=“该目录名” path=“/” > 标签
总结
由于篇幅有些长。一些按部就班的环境搭建细节并 没 配有图片,只是罗列出来了抽象的大概步骤,详情站内应有相关教程。侧重点在于Tomcat、Servlet、以及Web 应用程序的开发流程。陆陆续续写了四天,初衷是自我学习和站内的朋友学习交流。码字不易🐌,如果对您有所帮助不妨点个赞赞吧💖💖💖~
我爱你 ~ 遇见你的那天,下了一场代码雨。放佛要把整个夏天的暴雨都下完。从此以后,和你在一起的每一天就都是晴天了。☀️☀️☀️
🙏愿: 宇宙的尽头没有 应用程序服务器。