JavaWeb基础知识笔记
1.基本概念
前言
- web开发
- web,网页如:www.baidu.com
- 静态web:html,css
- 提供给所有人看的,数据始终不会变化
- 动态web:
- 千人千面,淘宝
- 技术栈:Servlet/JSP,ASP,PHP
- 在java中,动态web资源开发的技术统称为javaweb
- 网络通信三要素
- IP:电子设备在计算机网络中唯一的标识符
- 端口:应用程序在计算机中唯一的标识 0~65536
- 传输协议:规定了数据的传输规则
- tcp udp
web应用程序
- web应用程序:可以提供浏览器访问的程序;
- a.html,b.html... ...多个web资源可以被外界访问,对外界通过服务
- 任何一个资源或者页面都存在于某一台计算机上
- URL-统一资源定位符
- 统一的web资源会被放在同一个文件夹下,web应用程序--->通过Tomcat:服务器,启动
- 一个web应用又多个部分组成:(静态web,动态web)
- html,css,js
- jsp,servlet
- java程序
- jar包
- 配置文件(properties)
- web应用程序编写完毕后,提供给外界访问需要一个服务器来统一管理;
静态web
-
*.htm
,*.html
为网页后缀,通过网络进行读取客户端---->服务器---->.html
-
静态web的缺点
- web页面无法动态更新
- 无法和数据库交互(数据无法持久化,用户无法交互)
动态web
-
页面动态展示:千人千面
客户端---->webserver plugin---->webserver---->file system
| |
动态web资源jsp/servlet----->数据库
-
缺点
- 动态web资源出现错误,需要重新编写后台程序,重新发布
-
优点
- 动态更新,与数据库交互,数据持久化
2.web服务器
-
web服务器
-
服务器:安装了服务器软件的计算机
-
服务器软件:接受用户请求,处理请求,作出响应
-
web服务器:可以部署web项目,处理请求,做出响应
-
服务器是一种被动操作,用来处理用户的一些请求和给用户一些响应;
-
-
技术流派:
- ASP 微软:
- 最早流行的,在html中嵌入yeweudaima入了vb脚本,ASP+COM
- 在ASP中,业务代码繁多,维护困难
- 使用C#语言
- iis服务器
- PHP
- 开发速度快,功能强大,跨平台,代码简单
- 无法承载大访问情况(局限性)
- JSP/Servlet
- sun公司主推的B/S架构
- 基于java语言
- 可以承载三高问题带来的影响
- ASP 微软:
TOMcat
-
配置
-
部署项目的方式
-
直接将项目放到webapps目录下即可
- /name:项目的访问路径---->虚拟目录name
- 简化部署:将项目打包成一个war包,将war包放置到webapps目录下
- war包会自动解压缩
-
配置conf/server.xml文件
-
在
<Host>
标签体中配置<Context docBase="项目路径" path="虚拟目录">
-
-
在conf\Catalina\localhost创建任意名称的xml文件,在文件中编写
<Context docBase="项目路径">
- 创建的xml文件名称就是虚拟目录
-
-
静态项目和动态项目
-
目录结构
-
java动态项目的目录结构
-
项目根目录
-
WEB-INF目录
- web.xml:web项目的或许配置文件
- classes目录:放置字节码文件
- lib目录:放置项目依赖的jar包
-
-
-
-
-
Servlet:server applet
- 概念:运行在服务器端的小程序
- servlet就是一个接口,定义了java类被浏览器访问到(tomcat识别的规则)
-
定义一个类型实现Servlet方法
-
快速入门:
-
定义一个类实现Servlet接口
-
实现接口中的方法
-
配置Servlet
-
web.xml文件添加映射
<servlet> <servlet-name>demo01</servlet-name> <servlet-class>com.km.Servletstudy01.ServletDemo01</servlet-class> </servlet> <servlet-mapping> <servlet-name>demo01</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping>
-
-
执行原理:
-
当服务器接收到客户端浏览器的请求之后,会解析请求URL路径,获取访问的Servlet的资源路径
-
查找web.xml文件,是否有对应的
<url-pattern>
标签体内容 -
如果有,则找对应的
<servlet-class>
全类名 -
tomcat会将字节码文件加载进内存,并创建其对象
-
调用其方法
-
-
-
Servlet中的方法
-
被创建:执行init方法,只会执行一次
-
默认情况时,第一次被访问时,Servlet被创建
-
指定Servlet的创建时机
-
Servlet的init的方法只执行一次,说明其在内存中只有一个对象,是单例的,存在线程安全问题,对于定义在Servlet中的成员变量避免修改其值
<load-on-startup>num</load-on-startup> <!--第一次被访问的时候创建num为负整数-->
-
-
提供服务:执行service
-
被销毁:只有正常关闭才会执行destory方法
/** * 初始化方法 * 在Servlet创建时执行,只会执行一次,第一次访问的时候执行 * @param servletConfig * @throws ServletException */ @Override public void init(ServletConfig servletConfig) throws ServletException { } /** * 获取ServletConfig对象 * ServletConfig:Servlet的配置对象 * @return */ @Override public ServletConfig getServletConfig() { return null; } /** * 提供服务 * 每次servlet被访问时,执行,执行多次 * @param servletRequest * @param servletResponse * @throws ServletException * @throws IOException */ @Override public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException { System.out.println("hello"); } /** * 获取Servlet的一些信息,版本,作者 * @return */ @Override public String getServletInfo() { return null; } /** * 服务器被正常关闭的时候执行,只会执行一次 */ @Override public void destroy() { }
-
在Servlet3.0以上版本中,可以免去配置web.xml文件通过
@WebServlet()
进行配置String name() default ""; String[] value() default {}; String[] urlPatterns() default {};//虚拟目录 @WebServlet({"/test","/test2"})//一个注解配置的实例
-
在idea中为每一个项目配置了一份单独的tomcat的配置文件,在启动记录可以查看,工作空间中的web项目使用第二种部署模式
<Context docBase="项目路径">
-
在工作空间项目和tomcat部署的web项目中,tomcat真正访问的是tomcat部署的web项目
-
WEB-INF目录下的资源不能被浏览器直接访问
-
-
Servlet的体系结构
-
Servlet----接口
|
-
GenericServlet----抽象类:将Servlet接口中除service()的其他方法做了默认空实现,定义Servlet时通过继承GenericServlet | 秩序实现Servlet()方法即可
-
HttpServlet----抽象类:对http协议进行了封装、简化,通过继承HttpServlet复写doGET/doPOST方法
-
-
Servlet相关配置
- urlPartten:Servlet访问路径
- 一个Servlet可以定义多个访问路径:@webServlet({"/url1","/url2","/url3"})
- 路径的定义规则
- /XXX
- /XXX/XXX:多层路径,目录结构
- *.do
- urlPartten:Servlet访问路径
HTTP
-
概念:Hyper Text Transfer Protocal、超文本传输协议
- 定义了客户端和服务器端通信时,发送数据的格式
-
特点:
- 基于TCP/IP的高级协议
- 默认端口号:80
- 基于请求/响应模型:一次请求对应于一次响应
- 无状态的:每次请求之间相互独立的,不能交互数据
-
历史版本:
- 1.0版本:每一请求都会创建一个新的连接
- 1.1版本:复用连接
-
请求消息的数据格式:
-
请求行
-
请求方式 请求url 请求协议/版本
GET /java_02_Servlet_war_exploded/ HTTP/1.1
-
请求方式:
- HTTP协议有七种,常见的有两种
- GET:
- 请求参数在请求行中
- 请求的url长度有限制
- POST:
- 请求参数在请求体中
- 请求的url长度长度没有限制
- 相对安全
- GET:
- HTTP协议有七种,常见的有两种
-
-
请求头:客户端告诉浏览器的一些信息
Host: localhost:8080 Connection: keep-alive Cache-Control: max-age=0 DNT: 1 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.51 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9 Referer: http://localhost:8080/java_02_Servlet_war_exploded/ Accept-Encoding: gzip, deflate, br Accept-Language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6 Cookie: JSESSIONID=C07083980CC487F745690FAD6B70DA9F; Idea-501a323b=997da08b-cdc4-4b00-b142-bfaff8717b82
- 格式:请求头名称:请求头值
- 常见的请求头:
- User-Agent:告知服务器使用的浏览器版本,服务器可以获取该头消息,解决浏览器兼容性问题
- Accept-Encoding:可接受的压缩包格式
- Accept-Language:可接受的语言
- Connection: keep-alive:可以复用连接
- Referer:告知服务器链接的来源
- 防止盗链
- 统计工作
-
请求空行
- 空行,用于分隔POST请求的请求行于请求体
-
请求体(正文)
- 封装POST请求消息的请求参数
-
Request
-
Request和Response对象的原理
- Request和Response对象由服务器来创建
- Request对象用于获取请求消息
- Respond对象用于设置响应消息
-
Request:获取请求消息
-
Request对象的继承体系结构
Servlet----接口
|
HttpServletRequest----接口
|
RequestFacade----由Tomct实现的类
-
-
Request功能
-
获取请求消息数据
-
获取请求行数据
http://localhost:8080/java_study/user/demo1?name=Carl+Jones
- String getMethod():获取请求数据---->GET/POST
- (*)String getContextPath:获取虚拟目录---->/java_study
- String getServletPath():获取Servlet路径---->/user/demo1
- String QueryString():获取get方式的请求参数---->name=Carl+Jones
- (*)String getRequestURI():获取请求URI---->/java_study/user/demo1
- String getRequestURI():获取请求URL---->http://localhost:8080/java_study/user/demo1
- URL:统一资源定位符---->中华人民共和国
- URI:统一资源标识符---->共和国(Uniform Resource Identifier)
- String getProtocal():获取协议及版本
- String getRemoteAddr():获取客户端IP
-
获取请求头数据
- (*)String getHeader(String name):通过请求头的名称获取请求头的值
- Enumeration
getHeaderNames():获取所有的请求头名称
-
获取请求体数据
- 请求体只有POST请求方式才会有请求头,请求体中封装了POST请求的请求参数
- 步骤:
- 获取流对象
- BufferedReader getReader():获取字符输入流,只能操作字符数据
- ServletInputStream getInputStream():获取字节输入流,可以操作所有类型的数据
- 再从流中获取数据
- 获取流对象
-
其他功能:
-
获取请求参数通用方式:POST,GET都可以使用
-
String getParameter(String name):根据参数获取请求参数值
-
String[] getParameterValues(String name):根据参数获取请求参数值的数组---->用于复选框
-
Enumeration
getParameterNames():获取所有请求参数的名称 -
Map<String,String> getParameterMap():获取所有参数的map集合
-
中文乱码问题:
-
get方式:tomcat 8将get方式的乱码问题解决了
-
post方式:会乱码、解决方式设置request的编码
request.setCharacterEncoding("utf-8")
-
-
-
请求转发:一种在服务器内部的资源跳转方式
- 步骤
- 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
- 使用RequestDispatcher对象来进行转发:forward(ServletRequest request,ServletRespons respons)
- 特点
- 浏览器路径栏路径不会发生改变
- 只能转发到服务器内部的资源
- 多个资源间使用同一个请求
- 步骤
-
共享数据
- 域对象:一个有作用范围的对象,可以在范围内共享数据
- request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
- 方法:
- void setAttribute(String name,Object obj):存储数据
- Object getAttribute(String name):通过键获取值
- void removeAttribute(String name):移除数据
- 方法:
-
获取ServletContext
- ServletContext getServletContext()
-
BeanUtils工具类,简化数据封装
-
JavaBean:标准的Java类
- 类必须被public修饰
- 必须提供空参的构造器
- 成员变量必须使用private修饰
- 提供公共的getter和setter方法
- 功能:封装数据
-
概念:
- 属性:getter和setter方法截取之后的产物
- 例如:getUsername()---->Username---->username
- 属性:getter和setter方法截取之后的产物
-
方法:
- setProperty():操作属性
- getProperty():操作属性
- populate(Object obj,Map map):将map集合中的键值对信息,封装到对应的JavaBean对象中,键当作属性的名称,值当作属性对应的值
-
-
-
-
Response
-
响应消息的数据格式
-
响应行
- 组成:协议/版本 响应状态码 状态码描述
- 响应状态码:服务器告知的客户端浏览器本次请求和响应的一次状态
- 状态码为三位数字
- 分类:
- 1xx,服务器接收客户端消息但没有接收完全,等待一段时间后发送1xx状态码确认客户端
- 2xx,成功
- 3xx,重定向 302重定向 304访问缓存
- 4xx,客户端错误,404客户端请求的资源错误没有对应的资源,405请求方式没有对应的方法... ...
- 5xx,服务器端错误 500服务器内部出现异常
-
响应头
- 格式:头名称:值
- Content-Type:告知客户端本次响应体的格式
- content-disposition:告知客户端打开响应体数据的格式
- inline,默认值,在当前页面打开
- attachment,filename=xxx,以附件形式打开响应体,文件下载
-
响应空行
-
响应体
HTTP/1.1 200 Content-Type: text/html;charset=utf-8 Content-Length: 15 Date: Wed, 28 Oct 2020 02:25:31 GMT Keep-Alive: timeout=20 Connection: keep-alive <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>登陆界面</title> <style> div{ margin: auto; } </style> </head> <body> <div> <form action="/java_study/login" method="post"> <label for="username">用户名</label><input type="text" name="username" id="username" placeholder="请输入用户名"><br> <label for="password">密码:</label><input type="password" name="password" placeholder="请输入密码" id="password"><br> <input type="submit" value="登录"> </form> </div> </body> </html>
-
-
功能:设置响应消息
- 设置响应行
- 格式:HTTP/1.1 200 OK
- 设置状态码:setStatus(int sc)
- 设置响应头:
- setHeader(String name,String value)
- 设置响应体
- 1.获取输出流
- 字符流:PrintWriter getWriter()
- 字节输出流:ServletOutputStream getOutputStream()
- 2.使用输出流,将数据输出到客户端
- 1.获取输出流
- 设置响应行
-
重定向:资源转发的一种方式
方法一:
resp.setStatus(302); //设置响应状态 resp.setHeader("location","/java_study/response01"); //设置响应头,重定向访问路径
方法二:
resp.sendRedirect("/java_study/response01"); //简单的重定向方法
-
与转发的比较:
- 转发:
- 转发地址栏路径不变
- 转发只能访问当前服务器下的资源
- 转发是一次请求
- 可以使用request域共享数据
- 重定向:
- 转发地址栏路径变化
- 可以访问其他服务器资源
- 转发是两次请求
- 不能共享数据
- 转发:
-
路径的写法:
- 路径的分类:
- 相对路径:通过相对路径不可以确定唯一资源
- 如./index.html,以.开头./父目录 ../爷目录
- 绝对路径:通过绝对路径可以确定唯一的资源
- 如/java_study/response01,以/开头
- 客户端发出:需要加虚拟目录,重定向也是客户端路径
- 服务器端发出:不需要加虚拟目录(如:转发)
- 相对路径:通过相对路径不可以确定唯一资源
- 路径的分类:
-
设置响应体
-
获取流对象之前,设置流的默认编码:IOS-8859-1(无法显示中文),设置为其他编码如"utf-8"
-
通知客户端,服务器发送的响应体数据的编码
resp.setContentType("text/html;charset=utf-8");
-