树懒_移动开学笔记_day07_request_response

来源:互联网 发布:python基础教程 微盘 编辑:程序博客网 时间:2024/05/01 23:41

树懒笔记
day_07_request_response

1 Request入门    1.1   户端向服务器发送请求时,服务器会将所有的请求封装在HttpServletRequest        对象中,我们可以通过这个对象可以获取客户端一些有用的数据。    1.2   项目中我们通常用HttpServletRequest,不会用其父接口        ServetRequest,因为Web中常用的协议是HTTP2 Request对象常用API    对于POST请求,表单项不填内容,那么request.getParameter()返回""空白字符中    HTTP Status 405 -HTTP method GET is not supported bu this URL    上述错误表示:客户端以GET方式提交,但是服务器并没有对应的doGET()方式来处理    对于GET方式,请求参数是位于请求行中    对于POST方式,请求参数是位于请求体中    如果表单不写method的话,默认GET方式    如果doPost和doGet业务逻辑是一样的,就可以相互调用
            getRequestURL方法返回客户端发出请求时的完整URL            getRequestURI方法返回请求行中的资源名部分            getQueryString 方法返回请求行中的参数部分            getRemoteAddr方法返回发出请求的客户机的IP地址            getLocalAddr方法返回WEB服务器的IP地址            getMethod方法返回客户机请求方式            getServletPath()方法返回Servlet映射路径            request.getContextPath()方法返回当前web应用根目录
3 Request对象的应用    获取客户端请求头    getHeader(name)方法 --- String     getHeaderNames方法 --- Enumeration<String>    用户注册
        getParameter(name) --- String 通过name获得值        getParameterValues  --- String[ ] 通过name获得多值        getParameterNames  --- Enumeration<String> 获得所有name
4 表单乱码的原因和解决方案    哈-->%AB%CD%EF-->??-->doPost()    解决方案如下:        1.修改Web服务器的解码方式为UTF-8             <Connector port="8080" protocol="HTTP/1.1"              connectionTimeout="20000"              redirectPort="8443" URIEncoding="UTF-8"/>            缺点:在中大型企业中,服务器工作人员和程序员是不同的职位,有着明确的分工            通常不建议修改服务器的配置,对于程序员来将,还是通过代码来解决        2.            request.setCharacterEndoding("UFT-8")只能针对POST请求,            因为POST请求的数据是位于请求体中的,而GET方式的请求数据是位于请求行中的,这时只能用传统方式,代码如下:            byte[] buf = username.getBytes("ISO8859-1");            username = new String(buf,"UTF-8");            传统方式对于POST和GET都可行            BeanUtils工具类作用是封装到JavaBean对象的属性中            需要导入二个jar包:commons-beanutils-1.8.0.jar和commons-logging.jar            将String类型自己转成基本类型和对应的包装类型,即String->int或Integer没有问题5 Request域对象    Request有两层含义:    5.1 它是一个请求对象    5.2 域对象,理解为容器对象,即域对象中可以放在OBject类型的数据        域对象常用的API:        setAttribute(String,Object);        getAtttibute():Object        removeAttribute(String):void    位于WEB-INF这个私有目录下的资源,如何访问呢?    我们只能用转发6 转发的细节    6.1.要转发必须得用RequestDispatecher.forward()方法        1.forward方法用于将请求转发到RequestDispatcher对象封装的资源。        2.如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,        forward方法将抛出IllegalStateException异常        3.如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,         只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到          HttpServletResponse对象中的响应头字段信息保持有效。     6.2.如果向response对象中输出内容,但该内容没有真正的输出到浏览器,即还在缓存中,这时你又要    转发,这时原缓存区的内容会被清空,不会输出到浏览器,最终结果是转发到的目标资源    6.3.当真正将内容输出到浏览器后,response对象的生命已经结束,        这是你又要转发,那么response是不会恢复的,所以控制台会有错误提示    转发是服务器内部的事,与浏览器无关,所以浏览器的地址栏不变化    项目中,如果你为了节约HTTP请求数,可以考虑用转发7 Response入门    Response对象用于服务器将数据发送到客户端,    HttpServletResponse对象8 Response对象常用的API    response.setContentType("text/html;charset=UFT-8");    有两层含义:        1.服务器按照UTF-8的方式编码        2.浏览器按照UTF-8的方式解码    以上只针对非英文和数字    当你想输出中文字符串时,可以采用字符或字节方式:        1.字符
response.setContextType("text/html;charset=UTF-8");//这句话有两层作用
            response.getWriter().write("haha");        2.字节            response.getOutputStream().write("哈哈".getBytes());//服务器按GB2312编码,浏览器按GB2312解码            response.getOutputStream().write("哈哈".getBytes("UTF-8"));//服务器按UTF-8编码,浏览器按GB2312解码            response.setContextType("text/html;charset=UTF-8"); //浏览器按UTF-8解码            response.getOutputStream().write("哈哈".getBytes("UTF-8"))//服务器安UTF-8编码        项目中,如果输出多媒体数据用字节,例如:图片              如果输出文字的话,用字符        如果输出字符串的话,原样输出;        如果输出数字的话,要转换成字符串,才能输出。        如果你就想输出数字的话,将数字转成字符串就可以了        attachemnt表示以下载框的方式打开文件        inline表示在浏览器中直接显示文件 9 Response对象的应用    阻止一些非法用户通过非法手段进入后台的方式之一    现在被广泛使用    在重定向情况下,第二次的request是找不到第一次request域对象中的内容    在重定向情况下,request域对象不能用了,我们servletContext域对象替代。    ServletContext域对象有如下几个特点:        1.ServletContext域对象是部署web应用时,启动服务器就创建了,即第一次访问前ServletContext就创建完了        2.tomcat中的每一个web应用,都有自己独立的ServletContext域对象        3.一个web应用的所有web资源,都共享自己所在web应用的ServletContext域对象,即Demo09A和Demo09B能共享ServletContext域对象        4.由Servlet引擎负责创建ServletContext域对象        5.当Web服务器停止或部署发布Web应用时,原ServletContext域就销毁了,注意浏览器关闭ServletContext不会销毁10 Response向浏览器输出中文乱码的原因和解决方案11 重定向的细节    一个web资源收到客户端请求后,通知客户端去访问另外一个web资源,这称之为请求重定向。    response.sendRedirect(“/javaweb-day03/ok.html”)    11.1 getOutputStream和getWriter方法分别用于得到输出    二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。    11.2 getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,    就不能再调用另一方法。      11.3 Servlet程序向ServletOutputStream或PrintWriter对象中写入的数据将    被Servlet引擎从response里面获取,Servlet引擎将这些数据当作响应体的正文,然后再与响应行和各种响应头组合后输出到客户端。     11.4 Serlvet的service/doXxx方法结束后,Servlet引擎将检查getWriter或    getOutputStream方法返回的输出流对象是否已经调用过close方法。如果没有,Servlet引擎将调用close方法关闭该输出流对象。 12 RequestDispatcher对象常用的API    RequestDispatcher对象表示需要转发的路径,    但要真正转发,得用forward(),常用API:
        request.getRequestDispatcher("/表示当前web应用根目录名字").forward(request,response);        <form action="/表示webapps目录">        <a href="/表示webapps目录">
0 0
原创粉丝点击