Java入门第五阶段——servlet

请求:客户端根据用户地址信息将数据发送给服务器的过程
响应:服务器将请求的处理结果发送给浏览器的过程
HTTP(超文本传输协议)协议解决了浏览器与服务器数据交互的格式问题
特点:
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD
、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序
规模小,因而通信速度很快
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记
无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后
,即断开连接。采用这种方式可以节省传输时间
无状态:HTTP协议是无状态协议,无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续
处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不
需要先前信息时它的应答就较快。支持B/S以及C/S模式
HTTP1.1版本后支持可持续连接

HTTP交互的流程
1)客户端和服务器端建立连接
2)客户端发送请求数据到服务器端(HTTP协议)
3)服务器端接收请求后,进行处理,然后将处理结果响应客户端(HTTP协议)
4)关闭客户端和服务器端的连接(HTTP1.1后不会立即关闭)

HTTP协议之请求格式
请求格式的结构
请求行:请求方法、请求的地址、和HTTP协议版本
请求头:消息报头,一般用来说明客户端要使用的一些附加信息
空行:位于请求行和请求数据之间,空行是必须的
请求数据:非必须

HTTP协议之请求方式
根据HTTP标准,HTTP请求可以使用多种请求方法
HTTP1.0定义了三种请求方法:GET、POST和HEAD方法
HTTP1.1新增了五种请求方法:OPTIONS,PUT,DELETE,TRACE和CONNECT方法
GET  请求指定的页面信息,并返回实体主体
HEAD  类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头
POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)数据被包含在请求体中。POST
请求可能会导致新的资源的建立或已有资源的修改
PUT 从客户端向服务器传送的数据取代指定的文档的内容
DELETE 请求服务器删除指定的页面
CONNECT  HTTP1.1协议中预留给能够将连接改为管道方式的代理服务器
OPTIONS 允许客户端查看服务器的性能
TRACE  回显服务器收到的请求,主要用于测试或判断

request对象学习之获取请求数据
请求数据:
    请求行:请求方式    请求URL   协议
        getMethod()返回请求方式;getRequestUrl();返回URL;getRequestUri();返回URI
        getQueryString()(get中url中用户数据);getSchema();返回协议
    请求头:
        getHeader(String name) 根据键名获取请求头信息
        注意:如果获取的请求头信息不存在返回null,不会报错
        getHeaderNames()返回存储了请求头键名的枚举集合
    请求实体:
        getParameter(String name)根据键名获取数据
        注意:键名其实就是前端页面中的form表单标签的name属性的值或者其他前端
        页面其他方式提交数据的键的名字,如果请求中没有对应的请求数据,则返回null
        getParameterValues(String name) 根据键名获取同名不同的值,返回数组
        注意:如果没有对应的键名,则返回null
        getParameterNames()  返回实体数据中键名的枚举
    请求相关网络数据:
        getRemoteAddr()  获取客户端的IP

response对象之处理响应学习
    设置响应行:协议    状态码   状态消息
        resp.sendError(int status);
        作用:可以自主的响应状态给浏览器
    设置响应头:
        addHeader(String name,String value)添加响应头信息,同名数据不会覆盖
        setHeader(String name,String value)设置响应头信息,会覆盖所有信息,如果
            没有此响应头则添加该信息
    设置响应实体:(处理结果)
        resp.getWriter().write("实体内容");
        注意:实体内容可以分开进行响应
        一旦使用resp对象做出了请求响应,则意味着此次请求处理完毕,服务器在响应后
        会将此次请求相关的req对象和resp对象销毁
乱码问题:
请求乱码问题:服务器获取的请求数据乱码
post请求方式乱码解决:req.setCharacterEncoding("utf-8")
get请求方式乱码解决:
方式一:每个数据都要单独的进行转换
String uname = req.getParameter("uname");
String uname2 = new String(uname.getBytes("iso-8859-1"),"utf-8");
方式二:
req.setCharacterEncoding("utf-8")
在tomcat的server.xml文件中的Connector标签中增加属性:useBodyEncodingForURI="true"
响应乱码问题:浏览器中显示的服务器响应的数据乱码
resp.setContentType("text/html;charset=utf-8");

service代码编写流程:
设置请求编码格式
设置响应编码格式
获取请求信息
处理请求信息
响应处理结果

问题:一次请求的处理需要多个Servlet的联动操作,第一个Servlet需要用到其他Servlet已经声明的逻辑
处理代码,这个时候怎么办
解决:
使用请求转发
解释:
其实就是在一个Servlet中调用其他的Servlet
使用:req.getRequestDispatcher("下一个页面的名字").forward(req, resp);
特点:1.降低Servlet之间的代码冗余  2.一次请求转发内的Servlet共享此次请求的request和response对象
3.浏览器地址栏信息不改变,一次请求,浏览器不知道服务器转发多少次
request的作用域:一次请求转发内的Servlet
作用:request对象可以作为数据流转的载体
实现:setAttribute(String name,Object  obj)   getAttribute(String name)
问题:请求转发数据会被重复提交,因为地址栏信息不变,每刷新一次就会重新进行一次请求,加入银行
转账,刷新一次少1000,刷新一次少1000;
解决办法:重定向
作用:保护第一次的请求,避免因为用户的刷新动作频繁的触发A的执行
特点:两次请求,地址栏信息改变

问题:不同的请求使用相同的请求数据,但是请求只要结束,数据就被销毁了,其他请求需要将公共数据
重新书写发送
解决:使用Cookie技术
特点:浏览器端的数据存储技术,哪些数据需要被存储是在服务器端进行声明,以响应的方式告诉浏览器
进行存储,不适合大量数据的存储
作用:解决了不同请求之间,请求数据共享的问题
cookie使用特点: 如果不设置有效期则默认存储在浏览器的运行内存里,浏览器关闭即失效,如果设置了
有效期,则存储到客户端的硬盘里,到期后自动销毁,如果不设置有效路径则任意项目路径的请求都会
附带存储的cookie信息,如果设置了有效路径,则只有在该路径下的请求才会附带设置的cookie信息

session技术,就是在cookie的基础上,实现不同servlet之间数据获取的问题,即,浏览器发送一个请求
到服务器,该请求需要servletA和servletB合作处理完成,servletB需要用到servletA的处理结果,但由于
重定向是两次请求,第二次请求创建的servletB获取不到servletA的处理结果,此时在第一次请求的时候,
创建一个session对象,用于存储servletA的处理结果,并给该session对象一个id,将id以cookie的形式
设置好有效路径,以便于第二次请求时,servletB根据id寻找seesion对象,并从中取出servletA的处理
结果,从而达到不同servlet之间的数据获取。

session的学习:
问题:用户不同的请求在处理的时候需要使用其他请求中的数据该怎么办
解决:session技术
使用:
创建session对象     HttpSession session  = req.getSession(); 
存储数据到session中        session.setAttribute(String name,Object value);
获取session对象     HttpSession session  = req.getSession(); 
获取session中的数据   String uname = (String)session.getAttribute(String uname);
注意返回是Object类型,需要强转
删除session中的数据  session.removeAttribute(String name);注意,如果有数据则删除,
如果没有则什么都不做

流程:
1.浏览器发起请求到servletA,在servletA中使用req.getSession()获取Session对象,如果此次请求中
没有SessionID则创建一个新的Session对象,如果有SessionID则将其对应的Session对象返回(前提是
该session对象没有到期)对象到期销毁了,就算有sessionID也会重新创建一个Session
2.校验session是否失效,存储数据到session对象中或者获取session中的数据或者删除session中的数据

特点:session解决了同一个用户不同请求的数据共享
session的作用域:浏览器不关闭,session不失效,同一用户的任意请求获取的都是同一个session
        一次会话(打开浏览器——>关闭浏览器)

session的设置:
    session默认有效时间为30分钟,可以在tomcat下web.xml中进行配置
        注意:此种配置方式是所有的tomcat下的项目默认为30分钟
    也可以在代码中使用
    session.setMaxInactiveInterval(int seconds)//设置session的有效时间,参数为整数类型的秒
    session.invalidate(); //强制销毁

ServletContext对象
问题:Request解决了一次请求内的数据共享问题,session解决了用户不同请求的数据共享问题,那么
不同的用户的数据共享该怎么办呢?
解决:使用ServletContext对象
作用:解决了不同用户的数据共享问题
原理:
ServletContext对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到
的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有
特点:服务器创建           用户共享                一个项目只有一个对象
生命周期:服务器启动到服务器关闭
作用域:项目内
使用:
1.获取ServletContext对象
2.使用作用域进行共享数据流转
3.获取web.xml中的全局配置
作用:将部分动作和源文件进行解耦,我们只需要在xml配置文件中进行相关配置就会改变代码的执行效果
4.获取webroot下项目资源流对象(动态)
获取服务器中部署好的项目中的资源的流对象 
path为相对路径,写从webRoot开始查找资源的路径即可
5.获取webroot下资源绝对路径
动态获取资源的绝对路径
案例:浏览器计数器

ServletConfig对象:
问题:使用ServletContext对象可以获取web.xml中的全局配置文件,在web.xml中,每个servlet也可以
进行单独的配置,那么该怎么获取配置信息呢?
解决:使用ServletConfig对象
作用:ServletConfig对象是Servlet的专属配置对象,每个Servlet都单独拥有一个ServletConfig对象,
用来获取web.xml中的配置信息
使用:    获取ServletConfig对象
    获取web.xml中servlet的配置信息
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值