A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-6-7 10:24 编辑

就业班_JavaEE_day13_14_15_Servlet

一 软件架构、Tomcat、Http协议
    1 软件架构  bs cs
    2 静态资源(html css js image)和动态资源(jsp servlet)  动态资源先转换为静态资源再发给客户端。
       web项目的目录结构:
           2.5规范
                WEBROOT
                        |-----WEB-INF
                                |---web.xml    必须
                                |---classes      不是必须
                                |---lib             不是必须
            3.0规范  web.xml 也不是必须的 改用注解
    3 tomcat服务器    需要配置java_home环境变量,不配置,可以通过在startup.bat中添加pause查看报错原因。
        A 目录结构
          bin  conf   webapps   work   log  
        B server.xml 配置文件
             1个server
             1个service
                 多个connnector
                      一个Engine
                              多个host
                                   多个conext
        C tomcat配置外部应用的二种方式
        1  在server.xml中配置context  
        <context path="" docBase=""/> path配置的是项目的访问名称,docBase配置的外部项目的文件目录。
        2  在conf/catalina/localhost 下配置app.xml  一般用这种。
        <context  docBase=""/> path 不用再配置,xml的文件名即是项目名称
        D tomcat配置内部应用
           将项目文件夹放在webapps目录内,或者 将一个项目的WAR包放在webapps目录内,tomcat启动会自动解压。
   
    4 http协议  基于请求和响应模式
        http1.0  和 http1.1 最主要区别 长连接  一次连接中可以请求和响应多次。
           请求格式                     响应格式:
            请求行                          响应行
            请求头                            响应头
            空格                                空格
            请求体                            响应体
   
           常见请求头
           use-agent  浏览器和操作系统相关信息   
           referer  防止盗链  从什么页面请求过来  
           If-Modified-Since  客户端本地该文件的记录的时间。
           Content-Type: application/x-www-form-urlencoded   表示form表单中的中文参数值会自动使用url来编码!
           常见响应头
           location 重定向的跳转地址  302
           last_modified 文件的最近修改时间 与If-Modified-Since请求头结合使用
           Refresh: 3;url=http://www.itcast.cn  定时跳转
           Content-dispositon  文件下载时使用,弹框提示。response.setHeader("Content-Disposition", "attachment;filename="+filename);
           常见状态码  200 成功  302 重定向 304服务器端没变,从本地缓存查找   404 找不到页面  500 服务器内部错误

二  Servlet
        1概述  sun 规范  服务器端 动态网页  主要用来处理http请求和响应
                  注意:servlet 是单例和线程不安全的。
        2 创建servlet
             创建的三种方式:
             A 实现Servlet接口
                3个生命周期方法  init service  destory
                servletconfig 接口
                对应servlet的配置文件  <init-param>  
                getServletName();  getInitparameter()  getInitParameterNames()  getServletContext();
                ServletContext   对应一个web应用。
                1 可以作为一个域对象,生命周期最长 ,  
                2  对应web.xml中的整个应用的初始化参数  <context-param>
                3 可以通过getrealpath获取文件的磁盘绝对路径     相对于web项目的根目录
                    getResourceAsStream 以IO流的方式获取          相对于web项目的根目录
                4 获取文件的MIME类型  getMimeType(String 文件名) 根据文件后缀可以获取到对应的MIME类型。
        路径扩展:
                    在web项目中,相对路径和绝对路径都可以,但推荐全部使用绝对路径。同时要区分服务器端路径和客户端路径。
                    客户端路径需要加上项目名称,服务器端不需要加上项目名称。
                    ServletContext的getrealpath和getResourceAsStream方法中的路径 / 表示的web项目的根路径。
                    Classloader获取资源getResourceAsStream中 / 表示的是web-inf下的classes目录
                    通过class获取资源getResourceAsStream中 / 表示的也是web-inf下的classes目录
                    客户端页面中的form中的Action 和a 中href的 /  表示web项目的根路径。
                    在普通java项目中,File的路径分二种,一种是指定盘符下的比如c:\readme.txt 这种文件就直接创建使用new File("c:\readme.txt"),
                    另外一种是要读取项目中的某个文件,则用相对路径,相对于java项目的根路径。
        
            B GenericServlet抽象类  implment ServerConfig 和 servlet 二个接口
                注意有二个init方法  不带参数的init是一个空实现,子类可以重写。
            C 继承HttpServlet类   该类继承genericservlet  
                有二个service方法 , 对request和response进行强转后 调用自己的service方法,在自己的service方法中根据请求方式不同 调用doget和dopost方法。
                我们只需要重写doget和dopost即可。
               
        3    web.xml配置文件
            <web-app>
                <context-param>
                    <param-name></param-name>
                    <param-value></param-value>
                </context-param>
                <servlet>
                    <servlet-name>xxx</servlet-name>
                    <servlet-class>类的全名</servlet-class>
                    <init-param>
                        <param-name>aaa</param-name>
                        <param-value>bbb</param-value>
                    </init-param>
                    <load-on-startup>非负整数</load-on-startup> 表示服务器启动的时候就创建servlet 默认servlet是浏览器请求才会创建。建议从2开始。
                </servlet>
                <servlet-mapping>
                      <servlet-name>xxx</servlet-name>
                      <url-pattern>路径1</url-pattern>
                      <url-pattern>路径2</url-pattern>
                </servlet-mapping>
            </web-app>
                其中servlet的urlpattern有三种方式配置
                    精确配置(/AServlet) -- 最长目录配置(/aaa/bbb/*) -- 后缀名配置(*.action)  优先级依次降低
                    * 通配符不要写在中间。
   
三 response和request
     request和reponse都是服务器帮我们封装好了。我们直接使用即可。
      
     response能干什么:
     1 设置响应码
        setStatus() 可以用来设置302 200 正确状态码
        sendError()  用来设置错误状态码 比如404 500
    2 可以设置响应头  一个头名可能对应多个头值 , 相当于MAP
        setHeader(key,value)  setIntHeader  setDateHeader    设置单值
        addhearder  用来设置多值
    3 可以设置响应体
        response.getWriter()  
        reponse.getOutputStream  获取输出字节字符流   用来实现文件的下载,文件下载中的文件名称需要针对不同浏览器做不同的处理
                                                response.setHeader("Content-Disposition", "attachment;filename="+filename);
    4 重定向
        response.sendRedirect()
        
    request能干什么
    1.获取客户端ip  request.getRemoteAddr();
    2 获取请求头   
        getHeader(k) 获取单值  
        getHeaders 获取多值
    3 获取URL  例如 http://localhost:8080/helloworld/Aservlet?username='zhangshan'
      getRequestURL  : http://localhost:8080/helloworld/Aservlet
      getRequestURI (又叫做请求URI)  :/helloworld/Aservlet
      getQueryString  :username='zhangshan'
      getSchame        : http
      getHost     : localhost
      getPort             : 8080
      getContextPath  : /helloworld
      getServletPath   : /Aservlet
    4 获取请求参数 即3中的QueryString
       String getParameter( String name ) 获取单值
       String[] getParameterValues(String name)  获取多值
       Map<string,String[]> getParameterMap()  
       Enumeration getParamterNames()   
     5 作为域对象,在多个servlet之间传递数据
       setAtrribute(string,object)  
       getAtrribute(string)
       removeAttribute(string)
     5 请求转发和包含
      request.getRequestDispatcher().forword()     request.getRequestDispatcher().include();
       转发和包含的区别:
       1  转发, 前者servlet  留头不留体 不能再使用response.getWriter()和response.getOutputStream()向客户端输出,这一工作应该由后面的Servlet来完成。
                     但还是可以设置响应头的,例如:response.setContentType(”text/html;charset=utf-8”);
       2  包含 , 前者servlet 留头也可以留体。
      
       重定向与请求转发的区别:
       1. 地址栏是否改变
       2 重定向二次请求和响应    转发一次请求和响应
       3 重定向可以转到外部应用     转发只能在内部应用之间跳转
      
四 乱码
     响应编码:
          字符流响应中文
              1.设置字符流缓冲区编码为UTF8 ,默认是ISO-8859-1。
              2 设置响应头contenttype  告诉浏览器用什么编码解析。response.setHeader("Content-Type","text/html;charset=utf-8");
              这二个步骤可以通过response.setContentType("text/html;charset=utf-8") 这一句解决。
           字节流响应中文, 一般用来做文件下载。
             1.“中文“.getBytes("utf-8")。将中文以指定编码转化为字节数组。
             2 设置响应头contenttype  告诉浏览器用什么编码解析。response.setHeader("Content-Type","text/html;charset=utf-8");
      
     请求编码:
         1 通过表单提交(post)或者超链接(get)   请求的编码与上一次响应的编码一致(即页面自身的编码),大部分应该是utf8
         2   
              针对post方式,在获取请求参数之前  通过request.setCharacterEncoding("utf-8") 可以解决。不让tomcat用默认解码方式。
              针对get方式, 通过获取到参数值之后,对参数值进行反编码操作到utf8格式。new String(request.getParameter(key).getBytes('ISO-8859-1'),'UTF-8')
         
    URI编码
            URI编码不是字符编码,是一种用于客户端和服务器端传递参数的一种方式,URI编码是在字符编码的基础上进行了一种转换。
            post请求体中的参数默认浏览器会进行URI编码。而get请求中的中文参数需要我们人为去进行URI编码。例如超链接中的<a href="/zxx/xx?username='张三'">  
            服务器端会自动对传递过来的编码进行URI解码。

        

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马