5 web资源:

在http协议当中,规定了请求和响应双方,客户端和服务器。与web相关的资源。

静态资源:
       html、css、css
动态资源:
           Servlet/jsp

6 什么是Servlet?

一个java程序,运行在web服务器上,用于接收和响应http请求
更多的是配合动态资源来做,当然静态资源也需要使用到servlet,只不过

7 Servlet的通用写法:

Servlet(接口,通用规范)---->GenericServlet(通用实现)----->HttpServlet(用于处理http请求,覆盖doget,dopost)

8 Servlet的生命周期

生命周期:从创建到销毁的一段时间
  生命周期方法:
  init():初次访问执行此方法
  service():服务器 每收到一次请求,则执行一次service方法
  destory():Servlet销毁的时候,调用此方法(从tomcat里面移除,或者正常关闭tomcatshutdown.bat)

9 Servlet初始化提前

默认情况下,只有在初次访问Servlet的时候,才会执行init方法。
  有时可能需要在这里执行一些初始化的操作,或者耗时的逻辑。  
  此时,初次访问,可能会在init方法中逗留太久的时间。
  可以在Servlet中做如下配置,使得Tomcat启动时就初始化该Servlet.给定的数越小,越早初始化。一般不写负数,从2开始即可。
 <load-on-startup>2</load-on-startup>

10 ServletConfig  Servlet配置对象

ServletConfig config = getServletConfig()
 //拿到servletname
 String name = config.getServletName()
 //拿到初始化参数init-param
  String address = config.getInitParameter("address");
  System.out.println("address:"+address);

11 ServletContext  Servlet环境,上下文

There is one context per "web application"
per Java Virtual Machine.

*每个web工程只有一个ServletContext,指向同一个内存地址

作用:
  1 获取全局参数
  2 获取web资源(通过获取绝对路径,然后根据Properties)
  3 存储数据,Servlet间共享数据,ServletContext域对象
    
    (1)先得到路径,然后自己new InputStream
    context.getRealPath("");//此处得到项目在Tomcat里面的根目录
    context.getRealPath("/file/.priperties");//此处得到属性文件在Tomcat里面的根目录
    
    (2)getReasourceAsStream获取资源,流对象
    InputStream is = context.getResourceAsStream("/file/config.properties");
    properties.load(is);
    
    (3)用getClassLoader
    InputStream is = this.getServletContext().getClassLoader().getResourceAsStream("../../file/config.properties");
    properties.load(is);

12 HttpServletRequest和HttpServletResponse

request:包含请求的信息,封装了客户端提交过来的一切数据
        request.getHeader(hNames):可以获得请求头信息
response:响应数据给客户端

13 ServletContext对象何时销毁?

服务器启动的时候,会为托管的每一个web应用程序,创建一个ServletContext对象
从服务器移除托管,或是关闭服务器。

ServletContext的作用范围:
只要在这个项目里都可以    
A项目存,B项目取,是取不到的。

14 获取头信息

request.getHeaderNames()
request.getHeader(hNames);

15 解决Servlet中文乱码问题

(1)Request中的中文乱码:
如果是get,直接在Tomcat里面配置URIEncoding="UTF-8",以后编码都是默认UTF-8
如果是post,在取数据之前设置request的编码:request.setCharacterEncoding("UTF-8");这个对get无效
(2)Response的中文乱码:
//设置的是http协议的编码,在浏览器页面呈现的编码
response.setHeader("Content-Type", "text/html;charset=UTF-8");

16 Response下载资源

//获取需要下载的文件名
    String filename = request.getParameter("filename");
   //获取Tomcat下的绝对路径
    String path = getServletContext().getRealPath("file/"+filename);
   //让浏览器收到这份资源的时候,以下载的方式提醒用户,而不是直接以流的方式展示     
    response.setHeader("Content-Disposition", "attachment;filename="+filename);
    //流
    InputStream is = new FileInputStream(path);
    OutputStream os = response.getOutputStream();

//执行流读取输出操作

17  请求转发和重定向    (面)

//重定向早期写法
    response.setStatus(302);//设置状态码为重定向
    response.setHeader("Location", "login_success.html");
    //重定向新写法
    response.sendRedirect("login_success.html");
    //请求转发写法
    request.getRequestDispatcher("login_success.html").forward(request, response);

请求转发:    
   1 地址上显示的是请求Servlet的地址
   2 请求次数只有一次,因为是服务器内部帮客户端执行了后续的工作,状态码是200OK
   3 可以跳转到任意路径,不是自己的工程也可以跳
   4 因为只执行一次请求,所以效率高一点
   5  后续的请求可以使用上一次Request请求存储的对象

重定向:
   1 地址栏显示的是最后资源的路径
   2 请求次数最少两次,服务器在第一次请求后会返回302以及一个地址location,浏览器根据这个地址执行第二次访问
   3 只能跳转自己项目的资源路径
   4 效率相较要低,执行两次请求
   5 后续的请求无法使用上一次Request存储的对象,因为这是两次不同的请求

18 Cookie

*Cookie:服务器存储在客户端上的一份小数据,由于存储在客户端上,有安全隐患
*Cookie的创建和销毁:
 创建:有服务器创建响应给客户端

Cookie c = new Cookie("time",""+System.currentTimeMillis());
 response.addCookie(new Cookie());
 销毁:
    会话Cookie:关闭浏览器就失效
    持久Cookie:在指定的限期内有效。setMaxAge();
*应用场景:自动登录,浏览记录,购物车
*为什么有Cookie:
   http的请求是无状态。
       客户端与服务器在通讯的时候是无状态的(不同的请求之间无法传递数据)
       为了更好的收集用户习惯【大数据】。

Cookie的常用方法:
    //Cookie的有效期
    cookie1.setMaxAge(60*60*24*7);//此方法返回以秒为单位的生存时间,默认为-1,浏览器关闭就结束    
    //只有请求了指定的域名,才会带上Cookie
    cookie1.setDomain(".itheima.com");
    //只有访问该域名下的CookieDemo的这个路径地址才会带Cookie
    cookie1.setPath("/CookieDemo");
    //添加Cookie
    reponse.addCookie(cookie);
    
*Cookie的简单使用:

1 在响应的时候,添加Cookie
2 客户端收到的信息里面,响应头多了一个字段name=value   
        //设置编码
        //response.setContentType("text/html;charset=UTF-8");
        response.setHeader("Content-Type", "text/html;charset=UTF-8");
        //cookie 服务器发送给客户端,并且保存在客户端的小数据
        Cookie cookie = new Cookie("CookieName", "CookieValue");
        //服务器响应客户端,发送Cookie给客户端
        response.addCookie(cookie);
        response.getWriter().write("请求成功了");    
        //服务器获取客户端带过来的cookie
        Cookie[] cookies = request.getCookies();
        if(cookies !=null){
            for (Cookie c : cookies) {
                String cookieName = c.getName();
                String cookieValue = c.getValue();
                System.out.println("Name:"+cookieName+"\nValue:"+cookieValue);
               }
            }

19 显示上一次登录的访问时间

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置编码
        response.setContentType("text/html;charset=utf-8");
        //拿到页面表单的数据,完成登录功能
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //日期格式化
        String  pattern = "yyyy年MM月dd日   HH:mm:ss";
        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
//        String strTime = sdf.format(d);
        if("admin".equals(username) && "123".equals(password)){
            //拿到Cookie数组
            Cookie[] cookies = request.getCookies();
            //找到需要的Cookie
            Cookie  timeCookie = CookieUtils.findCookie(cookies,"time");
            //判断是否第一次登录
            if(timeCookie==null){        
                Cookie c = new Cookie("time",""+System.currentTimeMillis());
                c.setMaxAge(60*60);
                response.addCookie(c);
                response.getWriter().write("欢迎您!"+username);                
            }else{
                //不是第一次登录
                response.getWriter().write("欢迎您!</br>");
                Long visitTime = Long.parseLong(timeCookie.getValue());
                response.getWriter().write("您的上一次登录时间是:"+sdf.format(new Date(visitTime)));
                timeCookie.setValue(""+System.currentTimeMillis());
                response.addCookie(timeCookie);
            }
        }else{
            response.getWriter().write("登录失败");
        }
    }      
    
20 Session  

session:是什么?

基于cookie的一种会话技术。 数据存放在服务器端,会在Cookie里面添加一个字段JSESSIONID
        cookie 是可以把数据存放在客户端, 下一次来访的时候,带上那个数据,服务器就知道客户端是谁了。 ---》 安全隐患。
    
        Session : 数据存放在服务器端。  并且把这个session对应的sessionID ,是通过Cookie去传递的,传递给客户端。
         下一次客户端在来访的时候,带上那个sessionID ,就可以取到以前的数据了。
常用方法:
        //得到会话ID
        String id = session.getId();
        session.setAttribute(name, value);
        session.getAttribute(name);
        session.removeAttribute(name);

session的创建和销毁:        
创建:
request.getSession
如果有在Servlet里面调用代码,则创建

销毁:服务器关闭,会话超时(默认30分钟),调用invalidate方法
session是存放在服务器内存中的一份数据,可以持久化.redis.
即使关了浏览器,session也不会销毁.关闭服务器、会话时间过了有效期(默认30分钟)则销毁

十 Servlet的更多相关文章

  1. Servlet 学习总结

    Servlet资料整理[很全很强大] 分类: J2EE2009-10-23 00:51 671人阅读 评论(0) 收藏 举报 servletsessionstring服务器initialization ...

  2. Spring Boot (19) servlet、filter、listener

    servlet.filter.listener,在spring boot中配置方式有两种:一种是以servlet3开始提供的注解方式,另一种是spring的注入方式. servlet注解方式 serv ...

  3. 2_Servlet

    一. 引言 1.1 C/S架构和B/S架构 C/S 和B/S是软件发展过程中出现的两种软件架构方式 1.2 C/S架构(Client/Server 客户端/服务器) 特点: 必须在客户端安装特定软件 ...

  4. Spring Boot 2.X(十):自定义注册 Servlet、Filter、Listener

    前言 在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet.Filter.Listener 为 Spring Bean,在 Spring Boot 中有两种 ...

  5. java web学习总结(二十四) -------------------Servlet文件上传和下载的实现

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 对于文件上传,浏览器在上传的过程中是将文件以流的形式提交到服务器端的,如果直接使用 ...

  6. javaweb学习总结(二十二)——基于Servlet+JSP+JavaBean开发模式的用户登录注册

    一.Servlet+JSP+JavaBean开发模式(MVC)介绍 Servlet+JSP+JavaBean模式(MVC)适合开发复杂的web应用,在这种模式下,servlet负责处理用户请求,jsp ...

  7. JavaWeb学习记录总结(二十九)--Servlet\Session\Cookie\Filter实现自动登录和记住密码

    一.Servlet package autologin.servlet.login; import java.io.IOException;import java.security.MessageDi ...

  8. javaweb学习总结二十四(servlet经常用到的对象)

    一:ServletConfig对象 1:用来封装数据初始化参数,在服务器web.xml配置文件中可以使用<init-param>标签配置初始化参数. 2:实例演示 web.xml文件中配置 ...

  9. javaweb学习总结二十二(servlet开发中常见的问题汇总)

    一:web应用的映射问题 通常我们从别人那里拷贝来的代码,自己会修改应用的名称,但是web映射的访问路径并没有修改,还是原来的映射. 解决方法: 工程右键--properties--myeclipse ...

随机推荐

  1. 解决CentOS7用yum安装软件显示错误:cannot find a valid baseurl for repo: base/7/x86_64

    使用yun安装软件时有时会报repo文件的错误,, 主要问题出自于CentOS-Base.repo文件 解决方案:将这个文件后缀名修改使这个文件无效 [root@localhost ~]# cd /e ...

  2. shell脚本部署apache并能通过浏览器访问!

    第一步:导入httpd-2.2.17.tar包 第二步:创建一个test.sh文件(可在/root下) 第三步编写shell脚本 > 会重写文件,如果文件里面有内容会覆盖 >>这个是 ...

  3. Weka算法算法翻译(部分)

    目录 Weka算法翻译(部分) 1. 属性选择算法(select attributes) 1.1 属性评估方法 1.2 搜索方法 2. 分类算法 2.1 贝叶斯算法 2.2 Functions 2.3 ...

  4. 一文解读IBMS (转)

    IBMS系统是面向建筑设备生命周期的管理:面向楼宇的管理者和使用者:是传统BAS系统数据及功能的聚合. 更高效的分析和管理.更复杂的应用:跨平台.跨品牌的整合各子系统数据提供一套采集楼宇设备实时数据的 ...

  5. Python流程控制-2 条件判断

    条件判断 条件判断是通过一条或多条判断语句的执行结果(True或者False)来决定执行的代码块. 在Python语法中,使用if.elif和else三个关键字来进行条件判断. if语句的一般形式如下 ...

  6. 使用java实现二叉查找树的插入,修改和删除方法

    目前使用的是根据key的hashcode来进行排序,并且没有考虑hash碰撞的问题 package com.zhou.tree; import java.util.Comparator; import ...

  7. JS回弹原理-高级

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. Centos7 之 MariaDB(Mysql) root密码忘记的解决办法

    MariaDB(Mysql) root密码忘记的解决办法 1.首先先关闭mariadb数据库的服务 # 关闭mariadb服务命令(mysql的话命令就是将mariadb换成mysql) [root@ ...

  9. Spring Schedule 实现定时任务

    很多时候我们都需要为系统建立一个定时任务来帮我们做一些事情,SpringBoot 已经帮我们实现好了一个,我们只需要直接使用即可,当然你也可以不用 SpringBoot 自带的定时任务,整合 Quar ...

  10. 深度解析Java可变参数类型以及与数组的区别

    注意:可变参数类型是在jdk1.5版本的新特性,数组类型是jdk1.0就有了. 这篇文章主要介绍了Java方法的可变参数类型,通过实例对Java中的可变参数类型进行了较为深入的分析,需要的朋友可以参考 ...