回顾
Servlet生命周期
生命周期一共分为三个阶段,第一个阶段为初始化阶段,共初始化1次,默认是第一次请求的时候初始化,如果配置了load-on-startup 值 大于0的时候会在服务器启动的时候初始化, 第二个阶段是运行阶段,可以执行无数次。用户发起请求的时候执行。 第三个阶段为销毁阶段,只销毁一次,服务器关闭的时候或者类资源重新编译IDE会销毁当前已存在的Servlet。
Get与Post区别
Get提交数据数据会以URL拼接的形式显示到地址栏中,传输长度有限制,浏览器会缓存到请求的数据, 不安全但是速度快。
post提交数据是通过请求体传输数据浏览器也缓存不到数据内容,数据不会直接暴露,所以安全,长度也不受限制。但是比get慢。
XML 可扩展的标记语言
<?xml version=”1.0” encoding=”utf-8” ?>
dom4J解析流程
- 先定义一个解析器
SAXReader reader = new SAXReader();
- 获取一个输入流
InputStream is = 类名.class.getClassLoader().getResourceAsStream();
- 获取一个文档对象
Document doc = reader.read(is );
4.读取根节点信息
Element e = doc.getRootElement();
获取属性
Attribute t = e.attribute(1);
e.attributeValue(”属性名称”);
//读取文本信息
t.getText();
//读取子节点
List<Element> list = e.elements();
XPath : 导包
各种表达式
doc.selectNodes();
doc.selectSingleNode();
Http协议
http://localhost:8080/项目名/资源名称
https://www.baidu.com
http: 声明使用的是http://协议
localhost 请求地址 外网 、 本地
请求tomcat 8080上的应用
协议组
TCP连接的三次握手
Http版本
1.0版本不支持常连接也就意味着课程一个网页要对服务器发起N次连接请求,会有N次握手的机会,耽误时间。
例如:网站有100张图片,会连接服务器100次,握手100次。
1.1版本支持了常连接
例如:网站有100张图片,会连接服务器100次,握手1次。
现在互联网使用的版本都为1.1版本
Http协议的特点:无状态性,保证传输绝对安全,不会做任何信息保留。
HttpServletResponse 接口
服务器响应对象 父接口是ServletResponse。
响应一共分为三部分
响应行
响应头
响应主体
请求对象和响应对象的创建
响应行
响应行包含内容有: 协议及版本 | 状态码
sendError和setStatus的区别
response.sendError(404);
浏览器会出现404的页面,响应码也是404
response.setStatus(404);
不会出现404页面,页面无反应,只会响应码是404
状态码含义
100~199:请求已经到达服务器,但是没有完成,需要再次请求才能完成。
200~299:请求已经到达服务,并且处理完成。(200)
300~399:资源重新定向。 服务器中发生了资源定向问题(302)
400~499:资源找不到 (404)
500~599:服务器内部异常(Java类报错 90%都是空指针)(500)
响应头
程序人员是可以自己设定响应信息的。
设定的方式是: service() response对象。
案例:压缩后的字节数
需要的header属性 Content-Length
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class myServlet extends HttpServlet{
private static final long serialVersionUID = 1L;
// @Override
// protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// response.sendError(404,"测试异常~~~");//出现404页面并且会提示自己输入的内容
// response.setStatus(404);//不会出现404页面,页面无反应,只是页面上的响应码是404
// response.setHeader("age", "12");//设置响应头信息
// response.setHeader("age", "20");//设置响应头信息,出现多次只会生效一次,且后面的覆盖前面的
// response.addHeader("age", "12");//如果响应头已经存在则重复设置该信息,不会覆盖,两者都会存在
// response.setHeader("Content-Length", "200");//设置内容长度
// response.setHeader("Content-Type", "jpg");//设置内容为图片格式,直接写后缀名即可,如pdf,jpg等
// response.setContentType("text/html;charset=utf-8");//设置内容格式为文本类型,和上面的方法是一样的效果
// response.setHeader("Content-Language", "en,zh,au");//设置语言
// response.setStatus(302);//配合location实现页面的跳转,在前在后都可以
// response.setHeader("Location", "https://www.baidu.com");//设置跳转页面,需要配合上面的setStatus使用,因为要先设置页面属性为跳转的才可以,下面那个是延时自动跳转
// response.setHeader("refresh", "15,https://www.baidu.com");//设置定时刷新,自动跳转页面,后面引号第一个参数为事件,第二个参数为跳转的页面
// }
//
public static void main(String[] args) throws Exception {
String str="公司创始人团队于1999年开始创业,2000年进入公务员考试培训行业,每年培训学员超过140万人。 [3] 公司总部位于北京,是目前国内直营分校覆盖城市广、专职教师数量多、公职类职业培训规模大的现代化职业教育机构。\r\n" +
"中公教育LOGO\r\n" +
"中公教育LOGO(2张)\r\n" +
"经过十余年潜心发展,中公教育在国内31个省份、300余个地市,拥有300余家直营分校和旗舰学习中心、3000余名专职授课教师、2000余种教辅图书出版物、7000余名员工,成为集合面授教学培训、网校远程教育、图书教材及音像制品的出版发行于一体的大型知识产业实体。\r\n" +
"截至2017年12月31日,公司在全国319个地市建立了582家直营分部和学习中心; [3] 截至2018年4月30日,公司共有员工22620人,其中专职研发人员达1344人。 [2] \r\n" +
"中公教育秉承着“实用、有效、专业、深度”的办学宗旨,依靠顶级的师资阵容和完整的自主研发实力,培训业务涵盖公务员考试、事业单位考试、军转干考试、招警考试、选调生/三支一扶/大学生村官考试、政法干警考试、公开选拔领导干部考试、教师招聘考试等,拥有国内首家公职考试研究院,面向全国培训学员超过1000余万人次,为众多考生实现公职梦想提供了强大的智力支持与服务保障。\r\n" +
"作为职业教育服务业的综合性企业,中公教育针对公众“终身学习”和“素质教育”的需求,在国家专业硕士(MBA/MPA等)招生考试、建筑工程行业执业资格考试、执业医师资格考试、银行/农信社等金融系统入职资格考试、会计从业资格考试等领域,提供全方位的考前培训,并在职业规划、求职就业培训等领域为广大青年人提供深度辅导实现了培训产品的规模化、多元化和差异化,在中国职业教育领域独树一帜。";
System.out.println("原始字符串字节长度为:"+str.getBytes().length);//1349
//创建一个字节内存输出流,只能用数组输出流,因为字节流需要传入一个文件,字节内存输出流不用传入参数也可以
//注意压缩专用的方法等也会占用一定空间,如果字节数特表小不建议压缩,会比原来更大
ByteArrayOutputStream os = new ByteArrayOutputStream();
//定义java的压缩方式
GZIPOutputStream gzip=new GZIPOutputStream(os);
gzip.write(str.getBytes());
gzip.close();
os.close();
System.out.println("压缩后字符串字节长度为:"+os.toByteArray().length);//971
}
}
案例:通过Header显示服务器的图片
注意:直接写图片名,图片的路径必须放到src目录下,不然会报错500!!!
IO流 (客户端浏览器以流的形式去显示图片或者文件)
要求:告诉浏览器如何打开展示打印到客户端的流信息。
Content-Type : 最多的时候使用 text/html;charset=utf-8;
也可以传 JPEG/JPG/pdf/gif/png/ppt 告诉浏览器以这种格式打开文件。
1.先获取输入流
2.定义输出流
3.通过输出流一点点将流传递给浏览器
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class showpic extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-Type", "jpg");
//1.亚显示图片首先要获取他,我们用输入流来获取他
InputStream is = showpic.class.getClassLoader().getResourceAsStream("1.jpg");//注意图片要放到src目录下,不然会报500!!!
//2.设置页面内容显示方式为图片,可以不写,但写的时候一定要写对不然会报错,浏览器默认能解析的已知 图片格式、pdf格式
//3.定义输出流,response方法自带的有一个输出流
ServletOutputStream os = response.getOutputStream();
//4.定义一个数组读取图片,然后写入
byte[] by=new byte[1024];
int len=0;
while((len=is.read(by)) != -1) {
os.write(by,0,len);
}
os.close();
is.close();
}
}
案例:通过Header下载服务器的文件
如果想告诉浏览器直接以下载的形式打开文件,必须指定一个Header属性。
Content-Disposition "attachment;filename=自定义名称.后缀"
import java.io.IOException;
import java.io.InputStream;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class downLoad extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//告诉浏览器以下载方式打开数据,attachment为附件,filename为文件名
response.setHeader("Content-Disposition", "attachment;filename=download.jpg");
//通过类加载器的形式获取输入流
InputStream is = downLoad.class.getClassLoader().getResourceAsStream("2.jpg");
// //因为这里用到了字节所以只能用字节流outputstream不能用printwriter,因为他是字符流
ServletOutputStream bos = response.getOutputStream();
// 不能用ByteArrayOutputStream因为这个流是我们自己创建的,而要向要浏览器响应并下载文件只能通过response获取的流才能实现
// ByteArrayOutputStream bos = new ByteArrayOutputStream();
// 要通过浏览器下载就必须通过response响应,自己new的输出流是直接下载到本地的
// FileOutputStream bos= new FileOutputStream("C:\\Users\\Administrator\\Desktop\\1.jpg");
byte[] by=new byte[1024];
int len=0;
while((len=is.read(by)) != -1) {
bos.write(by, 0, len);
}
is.close();
bos.close();
}
}
响应主体
响应主体的应用最多的一共两个
第一:通过PrintWriter对象打印信息
第二:通过Response对象获取输出流
注意:1.当1,2方式同时存在时,在上面的会生效,下面的不会输出并且还会报错。因为不能他们俩都是输出流,不能同时存在两个输出流。OutputStream是以字节的方式输出,PrintWriter是以字符的方式输出。 类似字节流与字符流的差别
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class xy extends HttpServlet{
//继承的类实现了serializable接口,所以要指定UID
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setHeader("Content-Type", "text/html;charset=utf-8");//注意多个参数时两个参数见用;隔开
//1.通过PrintWriter对象打印信息
PrintWriter pw = response.getWriter();
pw.print("<span style=\"color:red ; font:20px '楷体';background-color:pink\">你是我的阿兔兔</span>");//注意引号内的引号要么用\转义,要么改用单引号
pw.close();
//2.通过outputStream方式打印信息,注意这个方法和PrintWriter方法想排斥,因为不能同时存在两个输出流,同时使用时只会显示上面的那个,并且地下的会报错
// ServletOutputStream os = response.getOutputStream();
// OutputStream os = response.getOutputStream();//这样也可以
// os.write("<span style=\"color:red ; font:20px 'Courier New';background-color:lightblue\">you always occur in my mind</span>".getBytes());
// os.close();
}
}
HttpServletRequest
继承的父接口是ServletRequest
请求行
请求头
请求主体
请求行
URL:(Uniform/Universal Resource Locator 的缩写,统一资源定位符)。
URI:(Uniform Resource Identifier 的缩写,统一资源标识符)(代表一种标准)。
就是说,URI 属于父类,而 URL 属于 URI 的子类。URL 是 URI 的一个子集。
二者的区别在于,URI 表示请求服务器的路径,定义这么一个资源。而 URL 同时说明要如何访问这个资源(http://)。
大家把浏览器地址栏里访问网站的地址认为是URL就好了,也就是以HTTP/HTTPS开头的URI子集。
请求头
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class requestHead extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//为了让浏览器中的中文显示出来,我们需要页面样式为文本形式并且指定字符集
response.setHeader("Content-Type", "text/html;charset=utf-8");
//1.根据名称读取头信息
String header = request.getHeader("Connection");
PrintWriter pw = response.getWriter();
pw.write(header);
//全部读取,返回的是一个Enumeration,不能用foreach遍历,只能用hasMoreElements
Enumeration<String> names = request.getHeaderNames();
for(Enumeration<String> e=names;e.hasMoreElements();) {
String name = e.nextElement();
String value = request.getHeader(name);
pw.write(name+"==="+value+"<br>");
}
}
}
请求主体
从这里可以看到表单提交的数据
import java.io.IOException;
import java.util.Arrays;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class requestParam extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.首先设置请求的编码格式,否则打印出来的是乱码
request.setCharacterEncoding("utf-8");
//2.下面就是根据表格中标签的name属性分别获取属性值
String name = request.getParameter("name");
String password = request.getParameter("password");
String mark = request.getParameter("mark");
String change = request.getParameter("change");
String sex = request.getParameter("sex");
//表中hobbies这个属性中有多个值,要全部获得就要返回数组,所以要用getParameterValues()方法
String[] hobbies = request.getParameterValues("hobbies");//我们待会用Arrays工具类遍历
String yc = request.getParameter("yc");
//输出
System.out.println("name:"+name);
System.out.println("password:"+password);
System.out.println("mark:"+mark);
System.out.println("change:"+change);
System.out.println("sex:"+sex);
System.out.println("hobbies"+Arrays.toString(hobbies));
System.out.println("yc:"+yc);
}
}
总结
请求和响应
Http协议请求到Tomcat服务器之后,服务器会将请求和响应信息封装成两个对象(response,request)在传递给Servlet的service()中。
http 超文本传输协议
特点:无状态。
两个版本1.0 、 1.1 区别是 1.1 支持常连接。
响应对象
响应行
response.setStatus(302);
response.setHeader("Location","地址");
response.sendError(状态码,”提示文字”);
响应头
Content-Type :返回数据格式及编码 text/html | 返回图片信息 jpg
Content-Disposition : 图片下载
refresh : 刷新页面效果
响应主体
PrintWriter pw = response.getWriter();
pw.print();
OutputStream os = response.getOutputStream();
请求
请求行
获取请求方式 | URL | URI | 参数 | 协议
请求头
获取 各种头
请求主体
获取各种表单数据。