欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

servlet和response

程序员文章站 2022-03-25 21:58:08
servlet基础知识 一个项目有多少功能,将来就有多少Servlet。 servlet是自启动的,就是可以在服务器启动时,创建Servlet对象 servlet的生命周期 servlet的相关配置 ServletContext对象 整个项目的初始化参数(全局初始化参数), 通过ServletCon ......

servlet基础知识

servlet在内存中是单例----单实例对象一个servlet类 在内存中最多有一个对象

 一个项目有多少功能,将来就有多少servlet。

 servlet是自启动的,就是可以在服务器启动时,创建servlet对象

servlet的生命周期

servlet对象的生命周期是由服务器管理的。在第一次访问时,服务器创建servlet对象并调用init方法一次。每一个访问,服务器会开启一个新的线程
调用service()方法,根据请求方式调用doget()和dopost()方法。在服务器关闭时(正常关闭)销毁servlet对象,在销毁之前调用destroy方法一次

servlet的相关配置

url-pattern配置
完全路径匹配 例如: /demo1 , /aaa/demo2 , /aaa/bbb/demo3 目录匹配 例如: /* (所有) ,/aaa/* (aaa目录下的所有) 扩展名匹配 例如: *.do , *.action 、*.jsp 、*.jpg 缺省路径/缺省匹配 / 优先级顺序:完全匹配 > 目录匹配 > 扩展名匹配 > 缺省匹配 servletconfig配置

servletcontext对象

servletcontext context = this.getservletconfig();//获servletcontext对象,域对象
context.setattribute(string name,object object);
context.getattribute(string name)
只要是在同一个项目中,任意servlet获取到的都是同一个servletcontext对象。

 整个项目的初始化参数(全局初始化参数), 通过servletcontext对象获得

 

response对象操作响应行

    setstatus(int status);设置状态码
    senderror(int sc,string errormsg);发送表示错误信息状态码

 

response对象操作响应头

void addheader(string name, string value)    这两个方法都是用来设置http协议的响应头字段,其中,参数name用于指定响应头字段的名称,参数value用于指定响应头字段的值。不同的是,addheader()方法可以增加同名的响应头字段,而setheader()方法则会覆盖同名的头字段
void setheader(string name, string value)    
void setcharacterencoding(string charset)    该方法用于设置输出内容使用的字符编码,对http 协议来说,就是设置content-type头字段中的字符集编码部分。
void setcontenttype(string type)    该方法用于设置servlet输出内容的mime类型,对于http协议来说,就是设置content-type响应头字段的值。例如,如果发送到客户端的内容是jpeg格式的图像数据,就需要将响应头字段的类型设置为“image/jpeg”。需要注意的是,如果响应的内容为文本,setcontenttype()方法的还可以设置字符编码,如:text/html;charset=utf-8void addintheader(string name,int value)    这两个方法专门用于设置包含整数值的响应头。避免了使用addheader()与setheader()方法时,需要将int类型的设置值转换为string类型的麻烦
void setintheader(string name,int value)    
void setcontentlength(int len)    该方法用于设置响应消息的实体内容的大小,单位为字节。对于http协议来说,这个方法就是设置content-length响应头字段的值无需手动设置,由服务器自行设置

 

response对象操作响应体

getoutputstream()   向响应体输出二进制字节流信息。【文件下载】
getwriter()   向响应体输出字符流信息。【字符串及前端代码输出】

 乱码解决

  setcontenttype("text/html;charset=utf-8");

 一个响应体不可以同时被两种流操作 

 

资源重定向和请求转发

response.sendredirect("客户端绝对路径");
response.setheader("refresh","x秒;url=客户端绝对路径")

 

案例: servlet文件下载

 

 1 @webservlet(name = "downloadservlet",urlpatterns = "/downloadservlet")
 2 public class downloadservlet extends httpservlet {
 3     
 4     protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
 5         this.dopost(request, response);
 6     }
 7 
 8     protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
 9 
10         string filename =request.getparameter("filename");
12         string folderpath = this.getservletcontext().getrealpath("/download");
14         inputstream is = new fileinputstream(folderpath+"/"+filename);
16         filename = new string(filename.getbytes("utf-8"),"iso-8859-1");
18         response.addheader("content-disposition","attachment;filename="+filename);
20         outputstream os = response.getoutputstream();
22         int len=0;
23         byte[] b = new byte[1024];
25         while((len=is.read(b))!=-1){
26             os.write(b,0, len);
27         } 
29         is.close();
30         os.close();
31     }
32 
33 }

 

案例: servlet生成验证码

 1 @webservlet(name = "checkcodeservlet",urlpatterns = "/checkcodeservlet")
 2 public class checkcodeservlet extends httpservlet {
 3     
 4     protected void doget(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
 5         this.dopost(request, response);
 6     }
 7 
 8     protected void dopost(httpservletrequest request, httpservletresponse response) throws servletexception, ioexception {
 9                 // 1 生成图片的高度和宽度    
10                 int height = 30;
11                 int width = 60;
12                 //从这个字符串中选几个字符组成图片的内容
13                 string data = "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz";
14                 random random = new random();
15                 //2 创建一个图片
16                 bufferedimage image = new bufferedimage(width,height,bufferedimage.type_int_rgb);
17                 
18                 //3 获得画板
19                 graphics g = image.getgraphics();
20                 
21                 
22                 //4 填充一个矩形
23                 // * 设置颜色
24                 g.setcolor(color.black);
25                 g.fillrect(0, 0, width, height);
26                         
27                 g.setcolor(color.white);
28                 g.fillrect(1, 1, width-2, height-2);
29                 // * 设置字体
30                 g.setfont(new font("宋体", font.bold|font.italic, 25));
31                 
32                 for(int i = 0 ; i < 4 ; i ++){
33                     
34                     // 设置颜色--随机数
35                     g.setcolor(new color(random.nextint(255), random.nextint(255), random.nextint(255)));
36                     
37                     // 获得随机字
38                     int index = random.nextint(data.length());
39                     string str = data.substring(index, index + 1);
40                     // 写入
41                     g.drawstring(str, width/6 * (i + 1), 20);
42                 }
43                 
44                 //6 干扰线
45                 for(int i = 0 ; i < 3 ; i ++){
46                     // 设置颜色--随机数
47                     g.setcolor(new color(random.nextint(255), random.nextint(255), random.nextint(255)));
48                     // 随机绘制线
49                     g.drawline(random.nextint(width), random.nextint(height), random.nextint(width),random.nextint(height));
50                     // 随机点
51                     g.drawoval(random.nextint(width), random.nextint(height), 2, 2);
52                 }
53                 
54                 //end 将图片响应给浏览器
55                 imageio.write(image, "jpg", response.getoutputstream());
56     }
57 
58 }