day06笔记.docx
《day06笔记.docx》由会员分享,可在线阅读,更多相关《day06笔记.docx(23页珍藏版)》请在冰豆网上搜索。
day06笔记
今日任务
1、ServletContext介绍
2、Servlet开发的路径问题
3、ServletConfig和ServletContext介绍
4、response介绍
5、request介绍
课堂笔记
1、Servlet回顾
Servlet:
它是一个接口,主要是定义规则。
它是运行在web服务器中的一个小程序。
Servlet接口是规范程序的书写和运行机制。
ServletConfig:
获取Servlet在web.xml文件中的配置信息。
在任何一个项目中,可以定义多个Servlet程序,如果多个Servlet程序中都有相同的初始化参数,也就是需要在每个注册Servlet的标签中书写初始化标签参数,Servlet的初始化参数动作严重重复。
这时可以把初始化参数进行抽取到web.xml中的全局参数配置。
在web.xml中配置的全局初始化参数,不能使用ServletConfig来读取。
需要使用sun公司提供ServletContext对象读取。
2、ServletContext介绍
一个web服务器中可以发布多个web项目,web项目是在web服务器(tomcat)中存在的一类事物,sun公司就把每个web项目单独的时候ServletContext对象来表示。
2.1、读取全局数据
实验:
定一个Servlet程序,在Servlet程序获取到当前的这个项目对象ServletContext对象。
然后读取全局数据。
ServletContext是一个接口,由web服务器内部自己来实现这接口的规范,同时在web服务器加载当前的项目时,由web服务器本身来创建ServletContext对象。
2.2、共享数据
ServletContexxt对象表示的是当前这个项目对象。
这时我们可以把ServletContext对象当作一个容器来使用。
实验:
定义2个Servlet程序,在一个Servlet中给ServletContext中保存数据,再通过其他的Servlet获取其中的数据。
publicclassGetServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取ServletContext对象
ServletContextcontext=this.getServletContext();
//根据key获取value值
Objectaddr=context.getAttribute("addr");
Objectusername=context.getAttribute("username");
System.out.println("........."+addr+"username...."+username);
//获取所有key值
Enumerationen=context.getAttributeNames();
while(en.hasMoreElements()){
Stringkey=en.nextElement();
Objectval=context.getAttribute(key);
System.out.println(key+""+val);
}
//删除
context.removeAttribute("username");
Objectusername2=context.getAttribute("username");
System.out.println("username2="+username2);
}
当我们启动tomcat服务器之后,服务器会加载项目,在加载项目的时候,会给ServletContext对象中保存了和项目相关的所有属性信息。
2.3、ServletContext读取Web工程中资源文件
在一个项目中,肯定需要读取服务器中的文件,把文件发送给客户端。
在服务器要读取文件,首先就要找到文件的具体路径,才能使用IO流技术来读取。
在项目的src目录下有1.txt文件,现在需要在Servlet程序中读取这个文件中的数据。
将来开发的的项目都是在Linux系统上运行。
Linux系统上是没有盘符的概念。
在项目开发好之后,需要发布的web服务器上。
在发布(部署)项目的时候,会把我们项目中WebRoot下的所有文件和文件夹拷贝到tomcat/webapps目录下。
发布的过程会把项目中的WebRoot文件名称替换成当前的项目名字。
在src下的所有没有,包好java源文件编译后的class文件,都会保存在WEB-INF/classes目录中。
publicclassReadFileServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
Stringpath="E:
/lesson/JavaEE0119/code/day06/src/1.txt";
//获取项目中的资源文件的路径
ServletContextcontext=this.getServletContext();
//获取到项目的真实路径
path=context.getRealPath("WEB-INF/classes/1.txt");
System.out.println(path);
readTxt(path);
//也可以使用类加载器获取某个文件的目录
Stringpath2=ReadFileServlet.class.getClassLoader().getResource("1.txt").getFile();
System.out.println("path2="+path2);
}
//用于读取文件的代码使用IO流读
privatevoidreadTxt(Stringpath)throwsIOException{
BufferedReaderbufr=newBufferedReader(newFileReader(path));
Stringline=null;
while((line=bufr.readLine())!
=null){
System.out.println(line);
}
bufr.close();
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
3、response介绍
Servlet的生命周期时,讲过service方法,service方法上有2个参数:
http协议:
规范的请求和响应的规则。
请求:
分成三部分:
请求行请求头请求体
响应:
分成三部分:
响应行相应头响应体
在学习请求和相应对象时,主要围绕三部分学习。
先学习响应:
HttpServletResponse
3.1、response的状态码设置
响应行中:
协议状态码http/1.1200OK
请求和响应的对象由web服务器创建。
当用户发起请求之后,在web服务器中根据Servlet的service方法判断出具体需要调用doGet还是doPost方法时,web服务器会自动的创建请求和响应的对象,并把用户的请求参数保存在请求对象中。
3.2、response请求重定向(头信息设置)
请求重定向:
客户端先访问服务器A资源,在A资源中给客户端响应302状态码,再加载Location响应头信息,浏览器接收到302状态码之后,就会再次访问Location中资源信息。
请求重定向:
定向的位置可以是本项目中的其他资源,也可以是其他项目中的资源。
实验:
定义一个Servlet,在接收到用户的请求之后,使用response对象设置状态码和响应头信息。
3.3、登录错误重定向
实验:
实现过程:
需要一个登录的页面(form表单提交用户和密码),需要一个Servlet处理用户的登录信息。
3.4、response设置定时刷新(跳转)
案例:
在线直播网站、(网页版)聊天室、注册成功之后过几秒跳转到首页。
refresh:
它恰好是相应头中的头关键字。
上述的程序可以完成5秒后的跳转,但是不能读秒。
真实的开发,倒计时,需要在页面上使用JS代码修改页面的时间的数字。
一般开发中在Servlet中把数据处理完成,会跳转到JSP页面上,然后在JSP页面上使用JS代码完成读秒。
在html文件中也可以完成上述的类似功能。
3.5、response设置浏览器禁止缓存
控制缓存:
在有些实时性的网页,不能让浏览器在本地缓存这些页面。
就需要通过response进制浏览器缓冲数据。
IE7版本以上的浏览器控制缓冲无效。
Cache-Control:
no-cache
Pragma:
no-cache
Expires:
-1Expires需要的是一个时间值。
一般会设置成-1,表示不缓冲。
Expires是以1970年1月1日0时0分0秒开始计时。
如果设置成-1,表示1969年12月31日最后一秒。
3.6、response生成响应体内容
使用httpServletReponse对象可以给浏览器响应数据。
response可以设置响应头信息,响应的状态码信息。
同时response对象也可以设置响应体信息。
设置响应,就是通过response对象获取输出流,通过输出流给客户端写数据。
在使用response给客户端响应数据的时候,一定要告诉客户端使用什么编码表来解码发送的数据。
/**
*使用response设置响应体信息
*@author上海传智播客
*@2015年1月29日上午11:
54:
13
*
*/
publicclassResponseServlet3extendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//在获取输出流之前,一定要先设置编码表
//response.setCharacterEncoding("utf-8");
//response.setContentType("text/html");
//以上两句可以合并
response.setContentType("text/html;charset=utf-8");
//设置响应体信息
PrintWriterwriter=response.getWriter();
writer.println("你好");
writer.println("");
writer.println("
");
writer.println("
演示");
writer.println("");
writer.println("
");
writer.println("用户名:
");
writer.println("");
writer.println("");
/*
*在Servlet中,如果通过response对象已经获取到输出流,这时在当前这个Servlet中只能使用这个输出流写数据
*不能在获取另外一个输出流。
*/
//ServletOutputStreamout=response.getOutputStream();
//out.write("大家好".getBytes());
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
3.6、response生成验证码
实验:
需要一个页面,在页面上显示后条发生的验证码图片
需要一个Servlet程序,在Servlet程序中生成验证码图片,发给html页面即可。
img.html
function_changeImg(){
document.getElementById("img").src="http:
//192.168.1.252/day06/checkImg?
"+newDate().toLocaleString();
}
--
访问后台的Servlet程序
获取验证码图片数据
-->
输入验证码:
pointer;"/>
void(0)"onclick="_changeImg();">看不清换一张
/**
*用于生成验证码的Servlet程序
*验证码本身是使用Java中的图形化界面程序生成的一个图片数据。
然后把图片发送给了浏览器,浏览器显示出来。
*
*@author上海传智播客
*@2015年1月29日下午2:
43:
58
*/
publicclassImgServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
intwidth=120;
intheight=30;
//获取用于保存图片中所有数据的图片缓冲区对象创建的缓冲区的图片默认背景黑色
BufferedImagebufImg=newBufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//获取用于给图片缓冲区中写数据的对象画笔
Graphicsg=bufImg.getGraphics();
//需要把图片缓冲区的背景填充成白色
g.setColor(Color.WHITE);
//填充
g.fillRect(0,0,width,height);
//给图片设置边框
g.setColor(Color.RED);
//画边框
g.drawRect(0,0,width-1,height-1);
//需要给画笔设置颜色,然后才能给图片缓冲区中写数据
//准备给图片上写的数据
Stringdata="QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890";
//定义随机数对象,用于获取随机数
Randomr=newRandom();
intlen=10;
for(inti=0;i<4;i++){
intindex=r.nextInt(data.length());
charch=data.charAt(index);
//在每一次给图片上写数据之前,设置画笔的颜色,和字体的颜色样式
g.setColor(newColor(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
//设置字体
g.setFont(newFont("黑体",Font.ITALIC,20));
//把数据写到图片上
g.drawString(ch+"",len,25);
len=len+30;
}
//生成干扰线
for(inti=0;i<5;i++){
//在每一次给图片上写数据之前,设置画笔的颜色,和字体的颜色样式
g.setColor(newColor(r.nextInt(255),r.nextInt(255),r.nextInt(255)));
g.drawLine(r.nextInt(width),r.nextInt(height),r.nextInt(width),r.nextInt(height));
}
//获取输出流
ServletOutputStreamout=response.getOutputStream();
ImageIO.write(bufImg,"JPG",out);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
4、request对象介绍
在Servlet的service方法上接收2个参数。
ServletRequest和ServletResponse。
ServletResponse响应,已经学完,学习在Servlet程序中接收用户的请求信息。
请求:
请求行
请求头
请求体
4.1、request获得请求行信息和ip地址
如果客户端是以get方法发出的请求,请求的资源和携带的参数信息就会放在url地址中。
并且保存在请求行中。
/**
*演示通过request对象获取客户端携带的请求信息
*@author上海传智播客
*@2015年1月29日下午3:
44:
35
*/
publicclassRequestServlet1extendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取请求头和行中的信息
Stringmethod=request.getMethod();
Stringprotocol=request.getProtocol();
Stringip=request.getRemoteAddr();
Stringuser=request.getRemoteUser();
Stringhost=request.getRemoteHost();
intport=request.getRemotePort();
System.out.println(method);
System.out.println(protocol);
System.out.println(ip);
System.out.println(user);
System.out.println(host);
System.out.println(port);
}
publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
4.2、request获取头信息、referer
防盗链技术:
案例:
1、准备页面,使用超链接完成访问某个Servlet
2、在Servlet中使用request获取用户请求的携带的参数,判断是否是防盗链
/**
*演示防盗链技术
*@author上海传智播客
*@2015年1月29日下午4:
11:
05
*/
publicclassRefererServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
//获取referer头信息
Stringreferer=request.getHeader("referer");
//获取到referer头信息,说明肯定是从本网站的主页点击访问到Servlet程序
//如果没有referer头信息,说明是通过其他的手段直接访问了Servlet程序
if(referer==null||!
referer.startsWith("http:
//192.168.1.252/day06")){
//说明不是从主页访问的Servlet程序,就重定向到首页,这样的访问属于盗链
response.sendRedirect("/day06/3.html");
}else{
//是通