HTTP协议
请求头:
格式 name :值
1、请求行
请求方式、协议版本。。。。
2、请求头
请求数据的编码方式、请求数据类型、请求时间、连接
cookie、请求URL、端口号等
3、空行
将请求头跟请求数据分离开
4、请求数据
get :url地址上:url?name=值&name1=值
post:param中
响应头:
格式 name :值
1、状态行
200 ok
2、响应头
响应数据编码,响应数据类型,响应时间....
3、空行
将响应头跟请求数据分离开
4、消息体
具体的响应数据
json\xml\html\具体文本
特征:
1、支持浏览器、服务器模式
2、简单快速
3、传输数据灵活
4、无连接
5、无状态
servlet:
javaAPI
1\读取客户端发送的显式和隐式数据
2\生成结果
3\向客户端发送显式数据(即文档)和隐式数据(HTTP响应数据)
web容器:
1、通信支持
2、生命周期管理
3、多线程支持
4、JSP支持
5、处理安全性
web容器+servlet工作原理:
1)客户端向Web服务器发起一个HTTP请求。
2)HTTP请求被Web服务器接受,如果请求的是静态页面,则由Web服务器负责处理。如果请求的是Java Web组件(Servlet或者JSP),则移交给Web容器。Web容器可以在主机的同一个进程、不同的进程或其他的Web服务主机的进程中启动。
3)Web容器根据Servlet的配置文件确定调用的具体Servlet类,并把request对象、response对象传给它。
4)Servlet通过request对象知道客户端的使用者是谁,客户的请求信息是什么和其他的一些信息。Servlet处理完请求后把要返回的信息放入response对象返回到客户端。
5)一旦Servlet完成了请求的处理,Web容器就会刷新response,把控制权返回给web服务器。
servlet特征:
1、web容器只会创建一个唯一的servlet对象,第一次调用servlet时创建
生命周期:
1、实例化serlvet对象
2、调用初始化方法
3、调用服务方法service()
4、项目终止调用销毁方法
URL映射:
精确模式匹配。这种类型的模式用于将请求一对一映射到指定的Servlet。
扩展名匹配“*.扩展名”。在这种情况下,所有以指定扩展名结尾的URL都转向指定的Servlet。
路径映射。路径映射必须以'/'开始,以'/*'结尾,在这之间可以出现任意字符。路径匹配通常
用于将对某个目录的所有请求转向一个指定的Servlet。
默认的Servlet,'/'。默认的Servlet映射用于定义一个在没有给出路径信息时请求转向的Servlet。
servlet初识话参数:
每一个servlet都有一个与之对应ServletConfig对象,获取serlvet初始化信息
<servlet>
<servlet-name>test</servlet-name>
<servlet-class>servlet.TestServlet</servlet-class>
<!--初始化参数-->
<init-param>
<param-name>name</param-name>
<param-value>张三</param-value>
</init-param>
</servlet>
ServletConfig sc = getServletConfig();
String str = sc.getInitParameter("name");
System.out.println("初始化参数:"+str);
ServletContext对象(上下文对象,所有servlet共享):
1、属于整个Web应用程序
2、可以访问到Web应用程序资源的本地输入流
3、把资源的虚拟路径转换为物理路径
4、记录事件日志
5、绑定一个对象在整个Web应用程序中共享
上下文作用域,共享内存资源,可以存取数据
请求对象HttpServletRequest:
获取请求头的数据
System.out.println("请求方式:"+req.getMethod());
System.out.println("url"+req.getRequestURL());
System.out.println("版本号:"+req.getProtocol());
req.setCharacterEncoding("utf-8");//设置请求的编码格式
String account = req.getParameter("account");
String pwd = req.getParameter("password");
System.out.println(account+","+pwd);
String[] like = req.getParameterValues("like");
for (String str:
like) {
System.out.println(str);
}
请求派发:
RequestDispatcher
每个客户的请求可以传递给很多Servlet、jsp、html以及Web应用程序中的其它资源
整个过程完全是在服务器端完成
不需要任何客户端浏览器的行为
不需要在客户端浏览器和服务器端之间传递特殊信息
请求派发有两个方法:
将请求响应对象交给具体资源处理,处理完需要返回
req.getRequestDispatcher().include();
将请求响应对象交给具体资源处理,处理完直接响应,不需要返回
req.getRequestDispatcher().forward();
Response响应对象:
1、设置响应头
响应状态码设置
//resp.sendError(500,"代码有误");
响应类型及编码格式设置
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8");
2、响应动态页面的方式
PrintWriter pw = resp.getWriter();
//响应动态页面
pw.print("<html>" +
"<head>" +
"<meta charset='UTF-8'/>" +
" <title>Title</title></head>" +
"<body>" +
"<h1>数据库中取出的数据</h1></body></html>
3、关闭连接
//关闭连接
pw.close();
4、重定向
第一次请求到服务器,服务器会响应一个请求地址,
根据地址浏览器重新发送请求
5、页面刷新
resp.setHeader("Refresh", "2; URL=login.html" );
重定向与请求派发的区别?
状态管理
http协议是无状态无连接的协议
每次请求响应结束,连接断开,服务器不能记住用户登录、浏览的状态
cookie
session会话
服务器可以为客户端创建并维护一个Session对象,用于存放数据。
在创建Session对象的同时,服务器将会为该 Session对象产生一个唯一编号,这个编号称之为SessionID
服务器以Cookie的方式将SessionID存放在客户端。
当浏览器再次访问该服务器时,会将SessionID作为Cookie信息带到服务器,服务器可以通过该SessionID检索到以前的Session对象,并对其进行访问
注意:第一次访问服务器,会话就开始
会话结束:
1\session.setMaxInactiveInterval(10);
2\invalidate();
3\ <session-config>
<session-timeout>1</session-timeout>
</session-config>
4\浏览器清除缓存,会话没有结束,只是sessionID被删除,会话对象还存放在服务器
5\重启服务器
监听器
监听谁?
监听什么事儿?
监听对象:web的四大作用域
作用域:web运行过程中可以存取的内存空间
request请求作用域\session作用域\Context上下文作用域\page当前页面
request请求作用域:
生命周期:一过去请求的过程有效
用法:
setAttribute(String, Object)
getAttribute(Sting)
removeAttribute(String)
session作用域:
生命周期:在一个会话过程中有效
用法:
setAttribute(String, Object)
getAttribute(Sting)
removeAttribute(String)
Context上下文作用域:
整个作用域所有servelt共享
生命周期:程序启动到停止
用法:
setAttribute(String, Object)
getAttribute(Sting)
removeAttribute(String)
监听器:监听作用域数据的存取和作用域的生命周期,可以对其进行处理,例如:日志记录
配置:
1、创建对应的监听器类
2、web.xml配置监听器
<!--配置监听器-->
<listener>
<listener-class>listener.MySessionListener</listener-class>
</listener>
过滤器:
过滤请求响应数据,将满足的放行,不满足的退回
1、字符编码过滤
1)创建过滤器类,实现Filter接口
2)从写filter的doFilter方法
3)对请求对象编码处理
4)放行,将请求交于servlet
5)web.xml中配置
<!--配置字符编码过滤器-->
<filter>
<filter-name>charset</filter-name>
<filter-class>filter.CharSetFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>charset</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
JSP
实质就是一个servlet
简化servlet生成动态页面的开发过程
生命周期:
1、将jsp文件翻译成java源文件 xx_jsp.java
2、将Java源文件编译成字节码文件
servlet生命周期:
1、实例化serlvet对象
2、调用初始化方法
3、调用服务方法service()
4、项目终止调用销毁方法
jsp组成:
元素(Element)和模板数据(Template Data)
元素:输入输出、写java代码、表达式
模板数据:静态资源,html\css、js
三大元素:
声明:<%! 声明 %> ,创建全局变量
脚本:<% 代码 %> ,写java代码
脚本表达式:<%= 脚本表达式 %> 输出
JSP页面中可以插入三种不同类型的注释
JSP注释,其语法结构为: <%--注释内容--%>
HTML注释 :<!--注释内容-->
Java代码注释
JSP的三大指令、两个动作:
指令:
<%@ 指令名称 attribute1="value1" attribute2="value2" %>
page指令为当前页面提供处理指令
include指令用于把另一个文件包含在JSP中
taglib指令指定如何包含和访问自定义标签库
动作:
<jsp:include>、<jsp:forward>
req.getRequestDispatcher("xxx").include(req,resp);
req.getRequestDispatcher("xxx").forward(req,resp);
使用:
<jsp:include page="ok.jsp">
<jsp:param name="var" value="test"/>
</jsp:include>
JSP九大隐式对象:
request、response、pageContext、session、application、out、config、page、exception
EL表达式:
尽量使jsp页面干净,只有静态资源没有java代码
格式:
${变量名}
JSTL表达式:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
使用方式:
<c:if test="${1<0}">
<c:out value="ok"/>
</c:if>
<c:otherwise>
<c:when test="${1<0}">
</c:when>
<c:when test="${1<0}">
</c:when>
<c:when test="${1<0}">
</c:when>
</c:otherwise>
AJAX:
局部刷新,只刷新修改的地方,页面不进行刷新
减少客户端、服务器压力,提高用户体验度
A Asynchronous [eI`sinkrenes] 异步
J JavaScript JavaScript脚本语言
A And
X XML 可扩展标记语言
JSON字符串:
响应Text:“1,zs,123;2,zs,123;3,zs,123”
响应xml:<user><id>1</id><account>zs</account></user>
json:'[{"id":1,"account":zs,"password":123},{"id":2,"account":"李四","password":123}]'
js对象:
{
id:值,
name:值
}
js提供了一个方法,可以直接将字符串转换成js代码直接运行
对象.id
对象.account
json:
服务器封装json格式:
单组:'{"键":值,"键":值.........}'
多组:'[{单组},{单组},{单组}....]'
浏览器:
接收json字符串,直接将字符串转换成js对象:
单个对象:{
键:值,
键:值,
键:值
}
多个对象:
前端数组(有后端数组+集合的功能):[]
[
{键:值,
键:值,
键:值},
{},
{}
]
12/5 2.4