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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 学习让我快乐啊 于 2018-5-21 18:00 编辑

Tomcat

软件架构
  • C/S架构: Client/Server
  • 客户端和服务器端的软件,都是需要在PC端的软件,如    QQ,迅雷。
  • 优点:一部分代码写到客户端,服务器压力相对比较小,速度快
  • 缺点:服务器端更新,客户端都需要更新
  • B/S架构: Browser/Server
  • 浏览器端和服务端的软件,不需要安装PC端,只要有一个浏览器即可。
  • 缺点:所有代码都在服务器运行,服务器压力比较大
  • 优点:服务器端更新,客户端浏览器不需要进行更新

Web的资源
  • 静态资源

    • HTML,CSS,JS,图片

  • 动态资源

    • Servlet/JSP
    • PHP
    • ASP


常见Web服务器(中间件)
  • Apache:发布PHP的.LAMP:Linux Apache MySQL PHP.
  • IIS:发布ASP的.
  • WebSphere(was):IBM公司研发,收费的大型服务器软件,支持EE的所有的开发规范.
  • WebLogic:BEA公司研发,收发的大型服务器软件,支持EE的所有的开发规范.
  • Tomcat:Apache组织研发,免费的小型的服务器软件,支持Servlet/JSP的开发规范.
  • JBoss

Web动态资源目录结构  website
      |-----静态资源
      |-----WEB-INF
                  |-----web.xml :必须的
                  |-----classes :可选的
                  |-----lib     :可选的Tomcat目录结构
  • bin: tomcat的执行的文件.
  • conf: tomcat的配置文件.
  • lib: tomcat运行的需要的jar包.
  • logs: tomcat的运行的日志文件.
  • temp: tomcat产生临时文件存放的路径.
  • webapps: tomcat发布的web项目的路径.
  • work: tomcat运行JSP的时候,JSP翻译成Servlet的代码存放的路径.

部署
  • 直接将项目copy到webapps下
  • 配置tomcat的虚拟路径-不推荐

    * 在tomcat/conf/server.xml文件中进行配置:
    * 在<Host>标签下配置:
        * <Context path="/itheima" docBase="C:/website"/>
  • 配置tomcat的虚拟路径-推荐

    * 在tomcat/conf/Catalina/localhost/xxx.xml
    * 配置<Context docBase="C:/website"/>
    * xxx作为虚拟路径的名称.
  • 利用eclipse把项目打包成.war包,然后放到webapps中

HTTP协议
  • 什么是协议:规定双方需要遵守的规则。    HTTP协议:用来规定浏览器与服务器之间需要遵守的规则。    HTTP协议作用:规范浏览器和服务器之间的数据传递。
  • HTTP协议的特点:

    • 基于请求和响应的模型.
    • 必须先有请求后有响应.
    • 请求和响应必须成对出现.
    • 默认的端口号是80.

  • HTTP协议的版本:

    • 1.0:每次响应后即刻关闭了连接.1.1        :现在使用.不是每次响应后挂断,等待长时间以后没有请求会挂断.


HTTP协议的详解
  • 请求部分

    • 请求行

      • 提交方式:
      • 提交方式有很多,常用的GET和POST:
      • GET和POST的区别:
      • GET的提交的参数会显示到地址栏上,而POST不显示.
      • GET往往是有大小限制的,而POST没有大小的限制.
      • GET没有请求体,而POST有请求体.

    • 提交路径
    • 协议版本
    • 请求头

      • 都是键值对的形式显示的.一般一个key对应一个value,也有个别的是一个key对应多个value.
      • User-Agent:代表浏览器的类型. --- 文件下载:下载中文文件:IE使用-URLEncodor进行编码,而Firefox使用Base64编码.
      • Referer:代表的是网页的来源. --- 防盗链.
      • If-Modified-Since:通常与响应中的头Last-Modified一起使用查找本地缓存.

    • 请求体

      • 就是POST提交方式提交的参数.


  • 响应部分

    • 响应行

      • 协议版本
      • 状态码:

        • 200        :成功302        :重定向 304        :查找本地缓存 404        :资源不存在 500        :服务器内部错误
        • 状态码描述


    • 响应头:键值对,一般一个key对应一个value,也有一个key对应多个value.

      • Last-Modified:与请求中的If-Modified-Since一起使用查找本地缓存.
      • Content-Dispostion:文件下载的使用使用的一个头信息.Location        :重定向的跳转的路径. Refresh        :定时刷新/定时跳转.

    • 响应体:显示浏览器的页面的内容.


Servlet


Servlet的实现和继承的关系
Servlet         :接口
   |
GenericServlet  :通用的Servlet
   |
HttpServlet     :HttpServlet
  • servlet的生命周期

    • 生命周期:就是一个对象从创建到销毁的过程.
    • Servlet生命周期:Servlet从创建到销毁的过程.

      • 何时创建:用户第一次访问Servlet创建Servlet的实例
      • 何时销毁:当项目从服务器中移除的时候,或者关闭服务器的时候.

    • 用户第一次访问Servlet的时候,服务器会创建一个Servlet的实例,那么Servlet中init方法就会执行.任何一次请求服务器都会创建一个新的线程访问Servlet中的service的方法.在service方法内部根据请求的方式的不同调用doXXX的方法.(get请求调用doGet,post请求调用doPost).当Servlet中服务器中移除掉,或者关闭服务器,Servlet的实例就会被销毁,那么destroy方法就会执行.Servlet是单例的


思想:把耗时的操作放到服务器启动时执行
设置启动时创建Servlet
Servlet默认是在第一次访问的时候创建的.现在让Servlet在服务器启动的时候创建好.进行对Servlet的配置:
在web.xml中在<servlet></servlet>标签中配置:
<load-on-startup>2</load-on-startup> --- 传入正整数,整数越小,被创建的优先级就越高.(不能设置为1)
url-pattern的三种配置方式
  • 完全路径匹配:以/开始例如:/ServletDemo4 , /aaa/ServletDemo5 , /aaa/bbb/ServletDemo6
  • 目录匹配:以 /开始 需要以*结束.例如:/* ,/aaa/* ,/aaa/bbb/*
  • 扩展名匹配:不能以/ 开始 以* 开始的.例如: *.do , *.action

  • 错误写法:/*.do
  • 路径优先级:完全路径匹配 > 目录匹配 > 扩展名匹配
  • 绝对路径中分为客户端路径和服务器端路径:

    • 客户端路径一定要加工程名./day09/ServletDemo6
    • 服务器端路径不需要加工程名./ServletDemo6


页面跳转的3种实现方式
  • 使用Servlet设置Refresh
    response.setHeader("Refresh","时间(秒);url=路径");
    等同于:
    response.sendRedirect("路径");
  • 使用JavaScript

    <script type="text/javascript">
        var second = 3;
        window.onload = function() {
            setInterval("changeSecond()", 1000);
        }
        function changeSecond() {
            second--;
            document.getElementById("secondSpan").innerHTML = second;
            if (second == 0) {
                location.href = "/zixi/download/download.jsp";
            }
        }
    </script>
3.设置html中的<meta>标签

<meta http-equiv="refresh" content="0; url='http://www.qq.com/'">ServletContext对象作用
  • 用来获得全局初始化参数.
  • 用来获得文件的MIME的类型.
  • 作为域对象存取数据.

    • setAttribute(String name,String value);
    • getAttribute(String name);
    • removeAttribute(String name);

  • 用来读取web项目下的文件

    • getResourceAsStream(String path);
    • getRealPath(String path);


域对象
  • 作用范围:整个web工程.
  • 创建:服务器启动的时候,tomcat服务器为每个web项目创建一个单独ServletContext对象.
  • 销毁:服务器关闭的时候,或者项目从服务器中移除的时候.

读取web项目下的文件
  • 有servlet的环境下:
    InpuptStream getResourceAsStream(String path);

    `String getRealPath(String path);`
  • 如果没有servlet的环境:
    用类加载器去读取文件:

    `InpuptStream  is = 当前类的类名.class.getClassLoader().getResourceAsStream(String name);`
Response


处理中文乱码
  • 字节流


设置浏览器默认打开编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");
中文转成字节数组编码
response.getOutputStream().write("王守义".getBytes("UTF-8"));
  • 字符流


设置response的缓冲区的编码
response.setCharacterEncoding("UTF-8");
设置浏览器默认打开的编码.
response.setHeader("Content-Type", "text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");相当于上面两句
文件下载
public static void downloadFile(HttpServletRequest request,HttpServletResponse response) throws ClassNotFoundException, IOException{
        String filename = new String(request.getParameter("filename").getBytes("ISO-8859-1"),"UTF-8");
        String type = request.getServletContext().getMimeType(filename);
        InputStream is =request.getServletContext().getResourceAsStream("/downloadfiles/"+filename);
        response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Content-Type", type);
        if(request.getHeader("User-Agent").contains("Firefox")){
            filename = base64EncodeFileName(filename);
        }else{
            filename= URLEncoder.encode(filename);
        }
        response.setHeader("Content-Disposition", "attachment;filename="+filename);
        OutputStream os = response.getOutputStream();
        int len;
        byte[] bys = new byte[1024];
        while((len=is.read(bys))!=-1){
            os.write(bys, 0, len);
        }
        is.close();
    }
    public static String base64EncodeFileName(String fileName) {
        BASE64Encoder base64Encoder = new BASE64Encoder();
        try {
            return "=?UTF-8?B?"
                    + new String(base64Encoder.encode(fileName
                            .getBytes("UTF-8"))) + "?=";
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }


Request

获取客户端信息
  • 请求方式:request.getMethod();
  • 请求ip:request.getRemoteAddr();
  • 获取工程名:request.getContextPath();

获取表单参数
String request.getParameter(String name);
String [] request.getParameterValues(String name);
Map<String,String[]> request.getParameterMap();
参数接收中的乱码处理
  • POST乱码处理:

    • <form method=”post”>的时候,这种提交才是POST提交.其他的都是get.
    • POST方式提交的参数在请求体中.request对象在后台接收参数.request对象有缓存区.默认缓冲区的编码ISO-8859-1.
    • 处理方式:设置request的缓冲区的编码.
      request.setCharacterEncoding(“UTF-8”);

  • GET方式乱码处理:

    • GET方式提交的参数会在地址栏上显示 在请求行的路径后面.浏览器就会对路径进行一次编码.将编码后内容取出来.再进行一次编码.
    • 处理方式:

      • 修改服务器提交的编码.
      • 采用URLEncoder 和 URLDecoder类对中文进行编码和解码.
      • 使用String类的构造方法:
        username = new String(username.getBytes("ISO-8859-1"),"UTF-8");



作为域对象存取数据
范围:一次请求和响应的范围

void setAttribute(String name,Object value);
Object getAttribute(String name);
void removeAttribute(String name)转发和重定向
  • 转发:request.getRequestDispatcher("不带工程名的路径").forward(request,response)
  • 重定向:response.sendRedirect("带工程名称的路径")
  • 区别:

    • 地址栏:转发地址栏不变,重定向会变
    • 请求响应的次数:转发一次请求一次响应,重定向是两次请求和响应
      如果给request域中存放了数据:转发能够获得到数据,重定向不能获得到数据
    • 路径的编写:转发不带工程名,重定向带工程名
    • 跳转的范围:转发只能在当前工程下跳转,重定向可以跳转至任意网页




1 个回复

倒序浏览
我来占层楼啊   
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马