request 对象学习:
作用:request 对象中封存了当前请求的所有请求信息
使用:
获取请求头数据
req.getMethod();//获取请求方式
req.getRequestURL();//获取请求URL信息
req.getRequestURI();//获取请求URI信息
req.getScheme();//获取协议
获取请求行数据
req.getHeader("键名");//返回指定请求头信息
req.getHeaderNames();//返回请求头的键名的枚举集合
获取用户数据
req.getParameter("键名");//返回指定的用户数据
req.getParameterValues("键名");//返回同键不同值的请求数据(多选),返回的数组
req.getParameterNames()//返回用户所有请求数据的枚举集合
注意:
如果获取的请求数据不存在,不会报错,返回 null
注意:
request 对象由 tomcat 服务器创建,并作为实参传递给处理请求的 servlet 的 service 方法
respone 对象学习:
作用:
用来响应数据到浏览器的一个对象
使用:
设置响应头
setHeader(String name, String value);//在响应头中添加响应信息,但是同键会覆盖
addHeader(String name, String value);//在响应头中添加响应信息,同键不会被覆盖
设置响应状态
sendError(int num, String msg);//自定义响应状态码
设置响应实体
resp.getWriter().write(String str);//响应具体的数据给浏览器
总结:
service 请求处理代码流程:
设置请求编码格式
设置响应编码格式
获取请求数据
处理请求数据
数据库操作(MVC思想)
响应处理结果
直接响应
请求转发
重定向
设置编码格式:
1、浏览器发送到服务器的数据乱码
① get 请求有乱码
在 tomcat/conf/server.xml 中 Connector 标签添加一个属性:URIEncoding = "utf-8"
② post 请求有乱码
在获取请求参数之前,设置:request.setChatacterEncoding("utf-8"); 可以保证获取请求实体中的数据没有乱码
2、服务器返回给浏览器的数据有乱码
在打开流之前,设置:response.setContentType("text/html; charset=utf-8");可以保证返回给浏览器的数据没有乱码
Servlet 的生命周期:
1、从第一次调用到服务器关闭
2、如果 Servlet 在 web.xml 中配置了 load-on-startup,生命周期为从服务器启动到服务器关闭
注意:
init 方法是对 Servlet 进行初始化的一个方法,会在 Servlet 第一次加载进行存储时执行
destory 方法是在 Servlet 被销毁时执行,也就是服务器关闭时
service 方法和 doGet 方法和 doPost 方法的区别
service 方法:
可以处理 get/post 方式的请求,如果 servlet 中有 service 方法,会优先调用 service 方法对请求进行处理
doGet 方法:
处理 get 方式请求
doPost 方法:
处理 post 方式请求
注意:
如果在覆写的 service 方法中调用了父类的 service 方法(super.service(arg0, arg1)),则 service 方法处理完后,会再次根据请求方式响应的 doGet 和 doPost 方法执行。所以,一般情况下我们是不再覆写的 service 中调用父类的 service 方法的,避免出现405错误。
Servlet 的常见错误:
404错误:资源未找到
原因一:在请求地址中的 servlet 的别名书写错误
原因二:虚拟项目名称拼写错误
500错误:内部服务器错误
原因一:java.lang.ClassNotFoundException: com.bjsxt.servlet.ServletMothod
解决:在 web.xml 中校验 servlet 类的权限定路径是否拼写错误
原因二:因为 service 方法体的代码执行错误导致
解决:根据错误提示对 service 方法体中的代码进行错误更改
405错误:请求方式不支持
原因:请求方式和 servlet 中的方法不匹配所造成
解决:尽量使用 service 方法进行请求处理,并且不要在 service 方法中调用父类的 service
Cookie 学习:
作用:解决了发送的不同请求的数据共享问题
使用:Cookie 的创建和存储
//创建 Cookie 对象
Cookie c = new Cookie(String name, String value);
//设置 Cookie(可选)
//设置有效期
c.setMaxAge(int seconds);
//设置有效路径
c.setPath(String uri);
//响应 Cookie 信息给客户端
resp.addCookie(c);
Cookie 的获取
//获取 Cookit 信息数组
Cookie[] cks = req.getCookie();
//遍历数组获取 Cookie 信息
使用 for 循环遍历即可,实例:
if(cks != null) {
for(Cookie c : cks) {
String name = c.getName();
String value = c.getValue();
System.out.println(name+":"+value);
}
}
注意:
一个 Cookie 对象存储一条数据。多条数据,可以多创建几个 Cookie 对象进行存储
特点:
浏览器端的数据存储技术
存储的数据声明在服务器端
临时存储:存储在浏览器的运行内存中,浏览器关闭即失效
定时存储:设置 Cookie 的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息
默认 Cookie 信息存储好之后,每次都会附带,除非设置有效路径
session 技术学习:
问题:
一个用户的不同请求处理的数据共享怎么办?
解决:
使用 session 技术
原理:
用户第一次访问服务器,服务器会创建一个 session 对象给此用户,并将该 session 对象的 JSESSIONID 使用 Cookie 技术存储到浏览器中,保证用户的其它请求能够获取到同一个 session 对象,也保证了不同请求能够获取到共享数据。
特点:
存储在服务器端
服务器进行创建
依赖 Cookie 技术
一次会话
默认存储时间30分钟
作用:
解决了一个用户不同请求处理的数据共享问题
使用:
创建 session 对象/获取 session 对象
HttpSession hs = req.getSession();
如果请求中拥有 session 的标识符也就是 JSESSIONID,则返回其对应的 session 对象
如果请求中没有 session 的标识符也就是 JSESSIONID,则创建新的 session 对象,并将其 JSESSIONID 作为从 cookie 数据存储到浏览器内存中
如果 session 是失效了,也会重新创建一个 session 对象,并将其 JSESSIONID 存储在浏览器内存中
设置 session 存储时间
hs.setMaxInactiveInterval(int seconds);
注意:
在指定的时间内 session 对象没有被使用则销毁,如果使用了则重新计时
设置 session 强制失效
hs.invalidate();
存储和获取数据:
存储:hs.setAttribute(String name, Object value);
获取:hs.getAttribute(String name);//返回的数据类型为 Object
注意:
存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行
使用时机:
一般用户在登录 web 项目时会将用户的个人信息存储在 Session 中,供该用户的其它请求使用
总结:
session 解决了一个用户的不同请求的数据共享问题,只要在 JSESSIONID 不失效和 session 对象不失效的情况下。用户的任意请求在处理时都能获取到同一个 session 对象
作用域:
一次会话
在 JSESSIONID 和 session 对象不失效的情况下为整个项目内
session 失效处理:
将用户请求中的 JSESSIONID 和后台获取到的 session 对象的 JSESSIONID 进行比对,如果一致则 session 没有失效,如果不一致则证明 session 失效了。重定向到登录页面,让用户重新登陆
注意:
JSESSIONID 存储在 Cookie 的临时存储空间中,浏览器关闭即失效
ServletContext 对象学习:
问题:
不同用户使用相同的数据
解决:
ServletContext 对象
特点:
服务器创建
用户共享
作用域:
整个项目内
生命周期:
服务器启动到服务器关闭
使用:
获取 ServletContext 对象
//第一种方式
ServletContext sc = this.getServletContext();
//第二种方式
ServletContext sc2 = this.getServletConfig().getServletContext();
//第三种方式
ServletContext sc3 = req.getSession().getServletContext();
使用 ServletContext 对象完成数据共享
//数据存数
sc.setAttribute(String name, Object value);
//获取数据
sc.getAttribute("str") 返回的是 Object 类型
注意:
不同的用户可以给 ServletContext 对象进行数据的存取
获取的数据不存在返回null
获取项目中 web.xml 文件中的全局配置数据
sc.getInitParameter(String name); 根据键的名字返回 web.xml 中配置的全局数据的值,返回 String 类型。如果不存在返回null
sc.getInitParameterNames(); 返回键名的枚举
配置方式:注意一组 <context-param> 标签只能存储一组键值对数据,多组可以声明多个 <context-param> 进行存储
<context-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</context-param>
作用:将静态数据和代码进行解耦
获取项目 webroot 下的资源的绝对路径
String path = sc.getRealPath(String path);
获取的路径为项目根目录,path 参数为项目根目录中的路径
获取 webroot 下的资源的流对象
InputStream is = sc.getResourceAsStream(String path);
注意:
此种方式只能获取项目根目录下的资源流对象,class 文件的流对象需要使用类加载器获取
path 参数为项目根目录中的路径
ServletConfig 对象学习:
问题:
如何获取在 web.xml 中给每个 servlet 单独配置的数据呢?
解决:
使用 ServletConfig 对象
使用:
获取 ServletConfig 对象
ServletConfig sc = this.getServletConfig();
获取 web.xml 中的配置数据
示例:
String code = sc.getInitParameter("config");
Jsp 的学习:
Jsp 的三种注释
前端语言注释:
会被转译,也会被发送,但是不会被浏览器执行 <!-- --> (html) // /** */ (javascript)
java 语言注释:
会被转译,但是不会被 servlet 执行 // /** */
Jsp 注释:
不会被转译 <%-- --%>
Jsp 的 page 指令的学习
<%@page 属性名 = "属性值" 属性名 = "属性值" ... %>
language:声明 jsp 要被转译的语言
import:声明转译的 java 文件要导入的包,不同的包使用逗号隔开
pageEncoding:设置 jsp 文件的数据编码格式
contentType = "text/html; charset = utf-8":设置 jsp 数据响应给浏览器时,浏览器的解析和编码格式
session:设置转译的 servlet 中是否开启 session 支持,默认开启,true 表示开启,false 表示关闭
errorPage:设置 jsp 运行错误跳转的页面
extends:设置 jsp 转译的 java 文件要继承的父类(包名+类名)
作用:
配置 jsp 文件的转译相关的参数
Jsp 的局部代码块:
特点:
局部代码块中声明的 java 代码会原样转译到 jsp 对应的 servlet 文件的 _JspService 方法中
代码块中声明的变量都是局部变量
使用:
<% java 代码 %>
缺点:
使用局部代码块在 jsp 中进行逻辑判断,书写麻烦,阅读困难
开发:
servlet 进行请求逻辑处理,使用 jsp 进行页面展现
Jsp 的全局代码块:
特点:
声明的 java 代码作为全局代码转译到对应的 servlet 类中
使用:
<%! 全局代码 %>
注意:
全局代码块声明的代码,需要使用局部代码块调用
Jsp 的脚本段语句:
特点:
帮助我们快速的获取变量或者方法的返回值作为数据响应给浏览器
使用:
<%= 变量名或者方法 %>
注意:
不要在变量名或者方法后使用分号
位置:
除 jsp 语法要求以外的任意位置
Jsp 的静态引入和动态引入:
静态引入:
<%@include file = "要引入的 jsp 文件的相对路径" %>
特点:
静态引入的 jsp 文件和当前 jsp 文件转译成一个 java(Servlet) 文件使用。在网页中也就显示了合并后的显示效果
注意:
静态引入的 jsp 文件不会单独转译成 java(Servlet) 文件
当前文件和静态引入的 jsp 文件中不能够使用 java 代码块声明同名变量
动态引入:
<jsp:include page = "要引入的 jsp 文件的相对路径"></jsp:include>
特点:
会将引入的 jsp 文件单独转译,在当前文件转译好的 java 文件中调用引入的 jsp 文件的转译文件。在网页中显示合并后的显示效果
注意:
动态引入允许文件中声明同名变量
优点:
降低 jsp 代码的冗余,便于维护升级
Jsp 的转发标签 forward:
使用:
<jsp:forward page = "要转发的 jsp 文件的相对路径"></jsp:forward>
特点:
一次请求
地址栏信息不改变
注意:
在转发标签的两个标签中间除了写 <jsp:param name = "str" value = "aaa" /> 子标签不会报错,其他任意字符都会报错
<jsp:param name = "str" value = "aaa" />
name 属性为附带的数据的键名
value 属性为附带的数据内容
注意:会将数据以 ?的形式拼接在转发路径的后面
Jsp 的九大内置对象:
内置对象:
Jsp 文件在转译成其对应的 Servlet 文件的时候自动生成的并声明的对象。我们在 jsp 页面中直接使用即可
注意:
内置对象在 jsp 页面中使用,使用局部代码块或者脚本段语句来使用。不能够在全局代码块中使用
内容:九个对象
pageContext:页面上下文对象,封存了其他内置对象。封存了当前 jsp 的运行信息
注意:每个 Jsp 文件单独拥有一个 pageContext 对象
作用域:当前页面
request:封存当前请求数据的对象。由 tomcat 服务器创建。一次请求
session:此对象用来存储用户的不同请求的共享数据的。一次会话
application:也就是 ServletContext 对象,一个项目只用一个。存储用户共享数据的对象,以及完成其他操作。项目内
response:响应对象,用来响应请求处理结果给浏览器的对象。设置响应头,重定向
out:响应对象,Jsp 内部使用。带有缓冲区的响应对象,效率高于 response 对象
page:代表当前 Jsp 的对象。相当于 java 中的 this
exception:异常对象。存储了当前运行的异常信息
注意:使用此对象需要在 page 指定中使用属性 isErrorPage = "true" 开启
config:也就是 ServletConfig,主要是用来获取 web.xml 中配置数据,完成一些初始化数据的读取
四个作用域对象:
pageContext:当前页面,解决了当前页面内的数据共享问题。获取其他内置内置对象
request:一次请求。一次请求的 servlet 的数据共享。通过请求转发,将数据流转给下一个 servlet
session:一次会话。一个用户的不同请求的数据共享。将数据从一次请求流转给其他请求
application:项目内。不同用户的数据共享问题。将数据从一个用户流转给其他用户
作用:
流转数据
Jsp 的路径:
在 jsp 中资源路径可以使用相对路径完成跳转,但是:
问题一:资源的位置不可随意更改
问题二:需要使用 ../ 进行文件夹的跳出。使用比较麻烦
使用绝对路径:(必须会)
/虚拟项目名/项目资源路径
例如:
<a href = "/jsp/jspPro.jsp">jspPro.jsp</a>
<a href = "/jsp/a/a.jsp">a.jsp</a>
注意:在 jsp 中资源的第一个 / 表示的是服务器根目录,相当于:localhost:8080
使用 jsp 中自带的全局路径声明:
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"//"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<base href = "<%=basePath%>">
作用:
给资源前面添加项目路径:http://127.0.0.1:8080/虚拟项目名/上
Ajax 学习:
1、ajax 的概念
局部刷新技术。不是一门新技术,是多种技术的组合。是浏览器端的技术
2、ajax 的作用
实现在当前结果页中显示其他请求的响应内容
3、ajax 的使用
ajax 的基本流程
// 创建 ajax 引擎对象
// 复写 onreadystatechange 函数
// 判断 ajax 状态码
// 判断响应状态码
// 获取响应内容(响应内容的格式)
// 普通字符串:responeText
// json(重点):responseText
其实就是讲述数据按照 json 的格式拼接好的字符串,方便使用 eval 方法
将接受的字符串数据直接转换为 js 的对象
json 格式:
var 对象名 = {
属性名:属性值,
属性名:属性值,
.....
}
// XML 数据:responseXML.返回document 对象
通过 document 对象将数据从 xml 中获取出来
// 处理响应内容(js 操作文档结构)
// 发送请求
// get 请求
get 的请求实体拼接在 URL 后面,? 隔开,键值对
ajax.open("get", "url");
ajax.send(null);
// post 请求
有单独的请求实体
ajax.open("post", "url");
ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
ajax.send("name=张三&psw=123");
ajax 的状态码
ajax 状态码:
readyState: 0,1,2,3,4
4:表示响应内容被成功接收
响应状态码:
status
200:表示一切OK
404:资源未找到
500:内部服务器错误
ajax 的异步和同步
ajax.open(method, url, async)
async:设置同步代码执行还是异步代码执行
true 代表异步,默认是异步
false 代表同步