zoukankan      html  css  js  c++  java
  • 2Servlet笔记

    1、静态页面(html)

    2、动态

        用户可以输入数据,和页面交互。

    3 BS和CS的区别

       BS :Browser Server(WEB 服务器)   CS : Client(qq tcp/ip协议) Server

       写一个WEB服务器.

     1 package 细说Servlet;
     2 import java.io.IOException;
     3 import java.net.*;
     4 import java.io.*;
     5 public class MyWebServer {
     6     public static void main(String[] args) {
     7         ServerSocket ss;
     8         Socket s = null;
     9         OutputStream os = null;
    10         BufferedReader br = null;
    11         try {
    12             ss = new ServerSocket(1234);
    13             System.out.println("在9999端口等待...");
    14             s = ss.accept();
    15             //提示一句话
    16             System.out.println("连接成功");
    17             os = s.getOutputStream();
    18             br = new BufferedReader(new FileReader("E:/hello.html"));
    19             
    20             String buf = "";
    21             while ( (buf = br.readLine()) != null) {
    22                 //系统使用默认的字符集转换
    23                 os.write(buf.getBytes());
    24             }
    25         } catch (Exception e) {
    26             // TODO Auto-generated catch block
    27             e.printStackTrace();
    28         } finally {
    29             try {
    30                 br.close();
    31                 os.close();
    32                 s.close();
    33                 
    34             } catch (IOException e) {
    35                 // TODO Auto-generated catch block
    36                 e.printStackTrace();
    37             }
    38         }
    39     }
    40 
    41 }
    View Code

     Tomcat本身也是java程序,必须配置jdk

    netstat -an 查看

    netstat -anb

    可以在setup.bat 中添加JAVA_HOME= jdk的目录 ,来配置电脑的jdk

    conf配置文件:

    server.xml 

    web.xml:该文件配置与web应用相关的信息,web应用相当于一个web站点

    tomcat-users.xml:配置用户密码

    lib:存放存放tomcat所需要的jar包

    log:存放日志,

    webapps该目录放置web站点

    work:存放jsp被访问后生成对应的servlet文件

    ----------------------------------------------------------

    Tomcat怎么管理虚拟目录:我们希望tomcat管理其他目录的站点

    在conf文件中配置server.xml中</host>上一行添加该语句

    context有几个属性:

    path:

    docBase:

    reloadable:若设置true,表示tomcat会自动更新web应用,这个开销大,建议在开发过程中设为true,发布后设为false

    如何配置自己主机名,我们在访问一个网站时,不可能使用 http://localhost:8080/应用/资源名 的方式去访问网站,实际上使用 www.taobao.com 的方式,如何实现呢?

    实现的步骤如下:

     (1)修改 C:WindowsSystem32driversetc 下hosts文件,添加这么一条语句:   127.0.0.1   www.taobao.com 

    (2)在tomcat 的server.xml文件添加主机名 

         <Host name="www.taobao.com" appBase="d:web3”>   <Context path="/" docBase="d:web3" /> </Host>

    (3)在d:/web3添加一个/WEB-INF/web.xml 把 hello2.html设为首页面 如果连端口都不希望带,则可以吧tomcat的启动端口设为80即可

     

    当使用http://127.0.0.1:8080时会自动跳转到localhost,如何修改主机名不跳转到localhost

    如何配置默认主机: 
    在tomcat/conf/server.xml 文件 
    <Engine name="Catalina" defaultHost="主机名"> 
    如:<Engine name="Catalina" defaultHost="www.show.com">

    继承HttpServlet 需要实现doPost和doGet

    安全性看,get弱于post;提交的内容来看,post理论上不限制,在实际开发中不要太大;

    Servlet的一些细节:

    (1)对一个注册的servlet可以多次映射

    (2)通配符:

            Servlet通过对外路径访问可以通过通配符替换,一是 匹配 *. 匹配.do结尾的(这种级别最低) 二是 /abc/* 表示当前路径下的所有

     (3)Servlet的单例问题,当servlet被第一次访问后就会被加载到内存,以后该实例对各个请求服务,即在使用中是单例(多个服务共享一个变量)

            因为Servlet是单例模式,因此会出现线程安全问题,比如售票系统(成员变量),如果不加同步机制会出现问题。

            这里有一个原则: 1. 如果一个变量需要多个用户共享,则应该在访问该用户变量时,加同步机制 synchronized(对象)  {}

                                    2. 如果一个变量不需要共享,只需在doGet和doPost中定义(局部变量)即可,这样不会存在线程不安全问题

    (4) <load-on-setup>num</load-on-setup>  其中num表示servlet被init的顺序

     (5) servletConfig

    -------------------------------------------------------------

    HTTP协议

    http是建立在tcp/ip协议之上的,全称是超文本传输协议

    http1.0短连接,http1.1长连接(就像打电话一样,短连接是指打完就挂掉了,长连接会保存一段时间),所谓的长和短是指持续的时间,长连接大概是30秒

    http的请求:

    结构:

    请求行;消息头,并不是消息头都一样;内容

    referer:用来记录是从哪个页面进来的,当直接在浏览器中输入url时,返回值为null。所以可用来做防盗链

    String referer = request.getHeader("referer");
    if (referer == null || !referer.startsWith("http://localhost:8888/ServletPro/")) {
    response.sendRedirect("/ServletPro/Error");
    }

    http的响应状态行举例说明

    2200 就是整个请求和响应没有错误,这个最常见

     302 当你请求一个资源时,服务器返回302表示,让浏览器转向另一个资源。比如request.sendRedirect("/web应用名/资源名");

           response.sendRedirect("/ServletPro/Error"); // 和下面两句等价
             response.setStatus(302);
             response.setHeader("Location", "/ServletPro/Error");

    404 not found

    500 服务器出错

    举例说明refresh的作用:

    response.setHeader("Refresh", "5;url=http://www.baidu.com"); //5秒之后跳转到百度

    下载文件  原理:先由服务器读取,然后再从服务器写入浏览器

    //1、设置参数
    response.setHeader("Content-Disposition", "attachment; filename=abc.png");
    //2、获得全路径
    String path = this.getServletContext().getRealPath("/images/abc.png");
    //System.out.println(path);
    FileInputStream fis = new FileInputStream(path); //读取到服务器
    byte buff[] = new byte[1024];
    int len = 0;
    OutputStream os = response.getOutputStream();
    while ( (len = fis.read(buff)) > 0) {
    	os.write(buff, 0, len);   //读取到服务器,并由服务器写入浏览器
    }
    		os.close();
    		fis.close();
    

     缓存页面举例:

    我们的浏览器在默认情况下,会缓存我们的页面,这样会出现一个小问题:当我们把光标停在地址栏,然后回车去取页面就会默认从cache中获得

    (1)有些网址对及时性要求很高,因此不需要缓存

    三种禁止浏览器缓冲

    response.setDateHeader("Expires", -1);
    response.setHeader("Cache-Control", "no-cache");
    response.setHeader("Pragma", "no-cache");

    httpServletResponse的在说明

    getWriter()和getOutputStream()区别:

    1、getWriter()用于向客户端返回字符数据

    2、getOutputStream()可以回送字符数据,也可以回送字节数据(二进制数据)

         OutputStream os = response.getOutputStream();

          os.write("hello world".getBytes());  //字符串变成二进制数据

    如何选择

    我们回送的是字符数据,用getWriter()效率高

    我们回送的是字节(binary data) 只能用OutputStream,

    ---这两个流不能同时使用

    sendRedirect()的使用方法:

    问题:登录成功时,将用户名显示在登录成功页面

    解决方法: 1; 设置静态变量

    2;sendRedirect("welcom?uname="+username+"&参数名="+参数值);   参数名为字母组合,参数值为String  

    在接收方时,String 参数 = request.getParaMeter

    3;使用session, session可以传递对象

    中文乱码处理

    (1).表单

       post:   浏览器(utf-8编码方式)提交给web服务器(以iso-8859-1接受)   ; request.setCharacterEncoding("utf-8")  // 这个还是不好

       get:将信息放入请求行中,new String(request.getParameter("userName").getByte("iso-8859-1"), "utf-8")

    (2) 超链接 默认是get方式,所以解决同表单中get的处理方式

    HttpServletRequest对象的详解

    request.getQueryString() 可以获得请求的数据;

    url:是全部的网址   uri 是包含 web层和资源层

    request.getRemoteAddr()  //获得请求方的ip

    request.getRemoteHost() //获得请求仿的主机名

    补充一个知识点:当我们下载一个文件时,可能提示框是中文乱码

    String temp = java.net.URLEncoder.encode("传奇.mp3", "utf-8");

     HttpServletRequest常用方法:

    1、获得客户机请求头: getHeader(), getHeaderNames()

    2、获取到客户机请求参数

    sendRedirect()和forward()区别:

    叫法不同,sendRedirect()是重定向,转发, forward是转向

    2、实际发生的位置不一样,sendRedirect发生在浏览器,forward发生在web服务器

    3、用法不一样

        request.getRequestDispatche("资源/uri").forward(request, response)

        response.sendRedirect("/web应用")

    4、能够跳转的地方不同

         sendRedirect可以进入任何(包括外边)url, forward只能访问该web应用下的资源

    什么叫一次http请求

    只要没有停止,也没有回到浏览器重定向,就是一次请求。

    如果转发多次,我们浏览器地址栏保留的是第一次转向的那个Servlet URL

  • 相关阅读:
    上传图片,正在加载,loading
    bootstrap-table(2)问题集
    Bootstarp-table入门(1)
    bootstrap-table给每一行数据添加按钮,并绑定事件
    获得 bootstrapTable行号index
    Http请求中Content-Type讲解以及在Spring MVC注解中produce和consumes配置详解
    enums应用详解
    bootstrap-table.min.js不同版本返回分页参数不同的问题
    Linux学习笔记之Linux目录结构、磁盘命名、启动过程
    Linux学习笔记之Linux相关知识
  • 原文地址:https://www.cnblogs.com/zhaopAC/p/6638687.html
Copyright © 2011-2022 走看看