javaweb 之 servlet学习总结

一.servletContext

1.什么是ServletContext?

 ServletContext代表是一个web应用的环境(上下文)对象,ServletContext对象内部封装是该web应用的信息

 ServletContext对象一个web应用只有一个,一个web应用可以有多个servlet对象,

 但却只有一个servletConetext的对象

2.ServletContext生命周期

  创建:该web应用被加载服务器启动或发布web应用,前提是服务器启动状态

  销毁:web应用被卸载(服务器关闭,移除该web应用)

3.获取ServletContext对象

    方式一ServletContext servletContext = getServletContext();

    方式二ServletContext servletContext = this.getServletContext();

    方式二可以省略this,在httpServlet的doget和dopost下

    其实方式二的内部隐藏操作就是方式一

4. ServletContext的作用

    1.获得web应用全局的初始化参数(web.xml中配置初始化参数)

    2.获得web应用中任何资源的绝对路径

5. ServletContext是一个域对象

    它可以存储数据,所以可以说它是域对象

    ServletContext域对象的作用范围:整个web应用

    所有的web资源都可以随意向 servletcontext域中存取数据,数据可以共享,它可以作为所有web资源的桥梁,

    通过他互相传递数据

    域对象的通用的方法:所有域对象都有这三个方法

    setAtrribute(String name,Object obj);

    getAttribute(String name);

    removeAttribute(String name);

    因为它可以存储数据共享数据所以应用很多地方

6.案例 记录用户登陆次数

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("utf-8");

        //获取servletContext对象
        ServletContext ctx=request.getServletContext();

        //获取context属性,即counter的值
        Integer counter=(Integer)ctx.getAttribute("counter");

        if(counter==null){
            counter=1;
        }else{
            counter=counter+1;
        }

        //设置context属性
        ctx.setAttribute("counter",counter);

        response.getWriter().println("你是第"+counter+"位访问本网站的用户");
        response.getWriter().println("您的ip地址是:"+request.getRemoteAddr());


        //获取初始化参数
        String hello=ctx.getInitParameter("hello");
        response.getWriter().print(hello);


         //获取绝对路径,该项目的路径,及web路径+a.txt
        ctx.getRealPath("a.txt");
    }
}

二.Response响应

1.response响应过程:

在去发送一个请求时,会去找到Tomcat引擎,引擎会找到对应的web应用,

找到应用后,会执行应用的web.xml,再去根据url-pattern的内容创建servlet对象,

并且调用servlet的service方法,并且把创建的request对象和response对象传过来

拿到response对象后,自己可以写一些要给客户端的内容

写的内容是存到response缓冲区中

当方法执行结束后,Tomcat会从response缓冲区中取出数据给客户端

2.设置响应行,响应头,响应体

(1)设置响应行

 //设置响应行  :设置状态码
        response.setStatus(200);

(2)设置响应头

//设置响应头
        response.addHeader("name","lisa");
        response.addIntHeader("id",1);
        response.addDateHeader("birthday",new Date().getTime());
        //修改响应头
        response.setHeader("name","sunny");

设置重定向

(3)设置响应体

 response.getWriter().print("hello");

三.Request请求

  //取出请求头里的所有信息
     Enumeration<String> headerNames= request.getHeaderNames();
     while(headerNames.hasMoreElements()){
         String name=headerNames.nextElement();
         String value=request.getHeader(name);
         response.getWriter().print(name+"="+value);
     }

     //获取客户端提交上来的数据
        String name=request.getParameter("name");

四.cookie和session

1.cookie

(1)cookie的简单使用

package com.westos.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "cookieServlet")
public class cookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            doGet(request, response);
    }
    //cookie添加和获取
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        //cookie的简单使用
        //发送给客户端.并保存在客户端的一份小数据

        Cookie cookie=new Cookie("a","bb");

        //1.设置cookie有效期
        //cookie的有效期  默认情况,关闭浏览器后就没有了

        cookie.setMaxAge(10);//正值表示在这个秒数后cookie失效,负值表示关闭浏览器后消失

        //2.发送cookie给客户端
        //给响应添加一个cookie
        response.addCookie(cookie);
        response.getWriter().print("请求成功了..");//可以添加多个cookie


        //3.获取客户端的cookie
       Cookie[]cookies= request.getCookies();
       if(cookies!=null){
           for(Cookie c:cookies){
               String cookieName=c.getName();
               String cookieValue=c.getValue();
               response.getWriter().println(cookieName+"="+cookieValue);
           }
       }


    }
}

(2)cookie应用案例  显示上次访问时间

package com.westos.servlet;

import com.westos.utils.cookiesUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Date;


public class cookie2Servlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
//显示上次访问时间
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");

        String username=request.getParameter("username");
        String password=request.getParameter("password");

        if("admin".equals(username)&&"123".equals(password)){
            //获取cookie
            Cookie[]cookies=request.getCookies();
            //调用工具类中的方法
            Cookie cookie=cookiesUtil.findCookie(cookies,"last");

            //第一次登陆,没有cookie
            if(cookie==null){
                Cookie c=new Cookie("last",System.currentTimeMillis()+"");
                response.addCookie(c);
                response.getWriter().print("登陆成功");
            }else {
                //不是第一次登陆,有cookie
                long lastVistTime = Long.parseLong(cookie.getValue());
                //输出到界面
                response.getWriter().print("欢迎登陆,上次登陆时间是" + new Date(lastVistTime));
                //重置登陆时间
                cookie.setValue(System.currentTimeMillis()+"");
                response.addCookie(cookie);
            }

        }else {
            response.getWriter().print("用户名或密码错误");
        }
    }
}

2.session

一、Session简单介绍
    在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个
        session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的
        session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户
        服务。

    二、Session和Cookie的主要区别
        Cookie是把用户的数据写给用户的浏览器。
        Session技术把用户的数据写到用户独占的session中。
        Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象

    三.服务器如何实现一个session为一个用户浏览器服务的?
        服务器创建session后会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关
        再去访问服务器时,都会带着session的id号去,服务器发现客户机带着浏览器session的id来了,就会使用
        浏览器中对应的session为之服务

     四.session的生命周期
         1、session对象的创建时机
         在程序中第一次调用request.getSession()方法时就会创建一个新的Session,
             可以用isNew()方法来判断Session是不是新创建的
         2.session对象的销毁时机
          session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配
            session的失效时间

            Session 对象最常见的一个用法就是存储用户的首选项

   

 //获取session
        HttpSession session=request.getSession();
        //将数据存储到session中
        session.setAttribute("apple",5);
        //获取session的id
        String id=session.getId();

        //判断session是否已经存在
        if(session.isNew()){
            response.getWriter().print("session创建成功,id号是"+id);
        }else{
            response.getWriter().print("session已经存在,id号是:"+id);
        }
 HttpSession session=request.getSession();
        //获取会话id
       session.getId();
        //存值
        session.setAttribute("name","value");
        //取值
        session.getAttribute("name");
        //移除
        session.removeAttribute("name");

(5)应用案例  验证码

package com.westos.servlet2;

import org.apache.commons.lang3.RandomUtils;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;

public class yanzhengmaServlet extends HttpServlet {
    private static final int WIDTH = 100;
    private static final int HEIGHT = 40;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取session
        HttpSession session = request.getSession();
        //产生一张图片
        BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
        Graphics g = image.getGraphics();
        //设置背景色
        g.setColor(Color.WHITE);
        //填充背景色
        g.fillRect(0,0,WIDTH,HEIGHT);
        //设置前景色
        g.setColor(Color.RED);
        Font font=new Font("微软雅黑",Font.BOLD,20);
        g.setFont(font);

        //获取随机字符串
        String str=genRandomString(4);
        session.setAttribute("str",str);

        g.drawString(str,20,30);
        for(int i=0;i<20;i++){
            int x1=RandomUtils.nextInt(0,WIDTH);
            int x2=RandomUtils.nextInt(0,WIDTH);
            int y1=RandomUtils.nextInt(0,HEIGHT);
            int y2=RandomUtils.nextInt(0,HEIGHT);
            Color color=new Color(RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255),RandomUtils.nextInt(0,255));
            g.setColor(color);
            g.drawLine(x1,y1,x2,y2);
        }


        //输出图片
        ImageIO.write(image,"jpg",response.getOutputStream());


    }

    private String genRandomString(int len){
        String result="";
        //获取len个随机字母
        for(int i=0;i<len;i++){
            char c = (char)RandomUtils.nextInt(65, 91);
            result=result+c;
        }
        return result;
    }
}

猜你喜欢

转载自blog.csdn.net/fnwibwj/article/details/81464056