Servlet

来源:互联网 发布:李鸿章 袁世凯 知乎 编辑:程序博客网 时间:2024/05/17 03:25
web应用程序的目录结构
app
*.html *.css *.js 图片
WEB_INF 
文件夹(必须大写,不是必须的,当有动态资源的时候,此文件加必须写上)
下面的资源不允许浏览器直接访问,里面的资源是提供给服务器来访问的,我们可以间接的去访问 web.xml :必须的(WEB-INF文件夹存在的前提下)
classes:放置的是Java字节码文件
lib:放置的是本应用所用的jar包

应用程序的部署方式
i.将应用程序直接拷贝到webapps目录下
ii.将应用程序达成war包,直接拷贝到webapps下
   在dos命令窗下键入:jar-cvf 名字.war

软件开发的两种架构c/s b/s
c/s速度快,升级麻烦

Http协议
简介
WEB浏览器与WEB服务器之间的一问一答的交互过程必须遵循一定的规则,这个规则就是http协议
http是HyperText Transfer Protocol的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程及数据本身的格式
http协议的版本
HTTP/1.0              HTTP/1.1
无状态                
只能一次连接          可以多次访问,发送多次请求(连接没有断)    

请求信息(3部分组成)
1.请求行(a.请求的方式b.请求的资源地址c.请求协议)
2.请求头信息(a.头名称b.头值)
3.请求正文(只有请求类型为post才有)
响应信息(3部分组成)
1.响应行(a.响应协议b.状态码c.状态信息)
2.响应头信息(a.响应头b.头值)
3.响应正文


浏览器访问多图网页
*在一个HTML页面中如果包含<img>标记的话,当浏览器解析到这些标记时,还会向服务器请求访问标记中指定的文件,即再次建立连接,并发出HTTP请求
*如果HTML页面中有一个超链接;
<a >itcast</a>,当点击这个链接时,也会触发浏览器与WEB服务器开始一次新的HTTP通信 

HTTP响应-状态行
状态行
格式:http版本号 状态码 原因叙述<CRLF> 
举例:HTTP/1.1 200 OK
状态码                                             含义
100-199                                  表示成功接收请求,要求客户端继续提交下一次                                         请求才能完成整个处理过程
200-299                                  表示成功接收请求并以完成整个处理过程
300-399                                  为完成请求,客户需进一步细化请求。
400-499                                  客户端的请求有错误
500-599                                   服务器出现错误

200 正常
302、307    临时重定向
304         未修改
404         找不到
500         服务器内部错误

地址栏回车  重新发送请求(缓存)
刷新         提交到服务器
Ctrl+F5       一定去服务器(非缓存中)

请求信息
Accept:浏览器可接受的MIME类型
Accept-CharSet:浏览器支持的字符集
Accept-Encoding:浏览器能够解码的数据编码格式 比如gzip
Accept-Language:浏览器支持的语言种类
Host:浏览器所在的主机
Refer:浏览器告诉服务端,当前页面从哪来
作用:1、防盗链  2、统计广告信息
Content-Type:浏览器告诉服务端,内容类型
Content-Length:浏览器告诉服务端,请求正文的长度
Connection:连接状态
Cookie:浏览器告诉服务端,浏览器携带的cookie

响应头信息
Location:服务端用来告诉浏览器,请求需要重定向


(接口)Servlet生命周期:处理页面的请求
构造函数-->初始化-->处理请求(多次)--->destroy(应用程序停止服务时)

在Servlet映射到的URL中也可以使用*通配符,但是只能有两种固定的格式:
一种格式是“*.扩展名”,另一种是以正斜杠(/)开头并以“/*”结尾

url-pattern 1.以/开头:/代表的是工程路径(/工程名称) 必须要加/
2.以*开头:必须要加后缀名(后 缀名任意),后缀名不能用*
3.如果只是胚子一个/,那么此Servlet就是一个默认的Servelet,它用来处理所有找不到匹配的URL请求
注意:/*.后缀名 此种情况不允许

一个Servlet可以映射到多个路径

精确匹配>以斜杠开始的匹配>以*开始的匹配

创建Servlet的时机
<load-on-startup>启动顺序</load-on-startup>

HttpResponse
1.代表了一个响应
2.应用:
2.1 输出中文
方法一
      字节流输出中文
      ServletOutputStream sos=response.getOutputStream();
      //输出中文
      byte[] b="中国,你好".getBytes();
      sos.write(b);
方法二
      byte[] b="中国,你好".getBytes("UTF-8");
              //通知浏览器用UTF-8码表来解码
      response.serHeader("Content-Type","text/thml:charset=UTF-8");
方法三
      response.setCharacterEncoding("utf-8");//告诉服务端输出中文所用的编码
      response.setHeader("Content-Type","text/html:charset="utf-8")//通知浏览器用utf-8码表来解码
方法四
      //有两个作用:1.告诉服务器所用的编码
                    2.通知浏览器要查询的码表
      response.setContentType("text/html:charset="utf-8");

<interface>ServletConfig
ServletConfig sc=this.getServletConfig();
<interface>ServletContext
获取对象
1.采用ServletConfig对象获取
2.采用Servlet实例对象获取
3.采用request对象获取

ServletContext对象作为域对象使用,1.获取全局对象中存储的数据
2.获取全局的配置参数
3.请求转发
response常见应用
输出随机图片
相关主要类
BufferedImage:内存图像
Graphics:画笔
ImageIO:输出图像
注意:浏览器默认会缓存图片
控制客户端不要缓存:
response.addHeader("Progma","no-cache");
response.setHeader("Cache-Control","no-cache");
response.setHeader("Expires","0");
4.获取资源文件(三种方式)
a.采用ServletContext对象来获取
任意文件,任意路径,必须有web环境
b.采用ResourcesBundle类来获取
只能拿取非web环境下的文件,只能拿取properties文件
c.采用类加载器获取
任意文件,任意路径
InputStream is=this.getClass().getClassLoader().getResourceAsSream("文件路径");
Properties pro=new Properties();
pro.load(in);
System.out.println(pro.getProperties());

response.sendRedirect("");//请求重定向

response细节
getOutputStream和getWriter方法分别用于得到输出二进制数据、输出文本数据的ServletOutputStream,PrintWriter对象
不能在一个Servlet中同时使用字符流和字节流
Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将被Servlet引擎从response里面获取,Servlet引擎将这些数据当做响应信息的正文,然后再与响应状态行和个响应头组合后输出到客户端。
Servlet的Service方法结束后,Servlet引擎将检查getWriter或getOutputStream方法返回的输出对象是否已经调用共close方法,如果没有,Servlet引擎将调用close方法关闭该输出流对象。

HttpServletRequest
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP字而已访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法获得客户的这些信息。
常用方法:
request.getRequestURL();//协议+服务器地址+端口号+工程名称+资源地址+参数
request.getRequestURI();//工程名称+资源地址
request.getContextPath();//工程名称
request.getCharacterEncoding();//请求信息的编码方式
request.getLocalAddr();//服务器的IP地址
request.getRemoteAddr();//客户端的IP地址
request.getLocalPort();//服务器的端口号
request.getRemotePort();//客户端的端口号(随机)
request.getQueryString();//请求参数
request.getMethod();//请求方式

request中处理中文的问题
1.当提交方式是post的时候
request.setCharacterEncoding("UTF-8");
String name=request.getParameter("username");
2.如果是get方式提交:解决办法就是重建字符串
a).name=new String(name.getBytes("ISO-8859-1"));//中文控件较少的情况
b).采取更改服务器编码的方法
可以使用BeanUtils第三方提供的Jar包进行封装
BeanUtils.populate(user,request.getParameterMap());


request也是一个域对象(底层是一个Map)
void setAttribute(key,value);
Object getAttribute(key);
void removeAttribute(key);

//请求转发器
                RequestDispatcher rd=request.getRequestDispatcher("/RequestField1");
                //转发到RequestField1
                rd.forward(request, response);
                /**
                 * request对象的请求转发和ServletContext的请求转发
                 * request对象的请求转发支持相对路径
                 * ServletContext对象的请求转发不支持相对路径
                 */

请求重定向:两个请求,地址栏的地址发生了变化,数据丢失了
请求转发:一个请求,地址栏的地址不会发生变化,而数据没有丢失

URL的写法
a)客户端跳转(由浏览器发出请求):路径前加工程名称(request.getContextPath());
    1)表单
    2)script,link标签
    3)超链
b)服务端跳转(由服务器发出的请求):路径前不加工程名称
    请求转发

会话技术:
什么是会话?
会话可以简单理解为:用户开一个浏览器,点击多个超链接,访问服务器的多个资源,然会关闭浏览器,整个过程称之为一个会话。

Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
HttpSession
Session是服务器的技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建其独享的HttpSession对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其他web资源时,其他web资源再从用户各自的session中取出数据为用户服务。

Cookie API
javax.servlet.http.Cookie类用于创建一个Cookie,response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie投资端。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类的方法:
public Cookie(String name,String value)
setValue与getValue()方法
setMaxAge与getMaxAge方法(秒)
setDomain与getDomain()方法
getName()方法

服务端如何发送Cookie给浏览器
HttpServletResponse.addCookie(javax.servlet.http.Cookie);
每个网站最多支持20个Cookie,总共支持最多300个,每个Cookie最大4kb。
//不管浏览器有没有lastAccessTime 我们都要创建一个新的
Cookie c=new Cookie("lastAccessTime",System.currentTimeMills()+"");
设置存活时间
c.setMaxAge(1*24*3600);//设置了存活时间,那么Cookie就不存储在浏览器的缓存区中
response.addCookie(c);

服务端如何获得浏览器所携带的Cookie
HttpServletRequest.getCookies();

服务端如何删除Cookie
由于服务端没有提供删除的方法,因此采用创建相同的Cookie,设置存活时间为0的办法,覆盖已经存在的Cookie

设置浏览器携带Cookie的路径
c.setPath(request.getContextPath());
默认情况下,客户端存储的cookie的路径就是发送的Cookie的Servlet的路径
c.setPath("/")//设置路径是服务器的根路径: 协议+主机名+端口号

唯一的确定一个Cookie
域名+访问路径+Cookie的名字
浏览器是否带Cookie是由浏览器决定的
浏览器通过判断,你在地址栏中敲入的资源地址.startWith(在硬盘存储的Cookie里面的路径)为true,那就带,否则,那就不带

Session
在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(Session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其他程序是,其他程序可以从用户的session中取出该用户的数据,为用户服务。
Session与Cookie的主要区别在于:
Cookie值把用户的数据写给用户的浏览器
Session技术把用户的数据写到用户独占的session中
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象

getSession()方法做了两件事:
1.看客户端是否携带了JSESSIONIDCookie
2.如果没有携带,创建一个新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中,如果携带了,将根据cookie的值(id)到服务端的内存中寻找session,如果找到了则返回此session为客户端服务,如果找不到,则创建新的session对象,并分配一个唯一的id,发送到客户端,存储在客户端的缓存中。

//URL 重写技术
                url=response.encodeURL(url);
0 0
原创粉丝点击