2022年Servlect第十九课——案例实战

简介: 2022年Servlect第十九课——案例实战

Servlect的注册.


 

<!-- 注册oneServlet -->
  <!--  第一部分 注册OneServlet-->
  <servlet>
  <!--  srvlet 增加名字  -->
  <servlet-name>OneServlet</servlet-name>
  <!--注册servlet地址  -->
  <servlet-class>com.servlet.OneServlet</servlet-class>
  <load-on-startup>4</load-on-startup>
  </servlet>
  <!--第二部分 :设置一个浏览器可以访问的servlet的地址 -->
  <servlet-mapping>
  <servlet-name>OneServlet</servlet-name>
  <!--设置浏览器地址  -->
  <url-pattern>/a</url-pattern>
  <!-- 设置地址访问一定加/asd -->
  </servlet-mapping>

Servlect三种方式.

public class OneServlet implements Servlet {}

public class TwoServlet  extends GenericServlet {}

public class ThreeServlet  extends HttpServlet{}

Servlect对象@1ServletConfig静态数据

第一种方式:在web.xml中获得静态数据。

<welcome-file>B.jsp</welcome-file>
 <servlet>
 <servlet-name>Servlet1</servlet-name>
 <servlet-class>com.Servlet.Servlet1</servlet-class>
 <!-- 注意<init-param>写在里面 -->
 <init-param>
 <param-name>home</param-name>
 <param-value>二家酒店</param-value>
 </init-param>
 <init-param>
 <param-name>money</param-name>
 <param-value>200万</param-value>
 </init-param>
 <init-param>
 <param-name>h</param-name>
 <param-value>173cm</param-value>
 </init-param>
 </servlet>
 <servlet-mapping>
  <servlet-name>Servlet1</servlet-name>
  <!--设置浏览器地址  -->
  <url-pattern>/S</url-pattern>
  <!-- 设置地址访问一定加/asd -->
  </servlet-mapping>

获取方式

     String a=config.getInitParameter("home");
        String b=config.getInitParameter("money");
        String c=config.getInitParameter("h");
        System.out.println(a+"==========="+b+"899"+c);
        //如果有多个静态数据,为避免执行重复的代码
        //获得
//迭代
    Enumeration<String> e=config.getInitParameterNames();
    while (e.hasMoreElements()) {
        String key = (String) e.nextElement(); //home money
        String value =config.getInitParameter(key); //值一
        System.out.println(key+"@@@@"+value);

第二种方式:在Servlect中获得静态数据。

@WebServlet(urlPatterns = "/Servlet2",initParams = {
        @WebInitParam(name="aaaa",value="张三"),
        @WebInitParam(name="age",value="23"),
        @WebInitParam(name="height",value="179cm"),
        @WebInitParam(name="weight",value="60kg")
})

获取方式

   ServletConfig config=getServletConfig();
        String a=config.getInitParameter("aaaa");
        String b=config.getInitParameter("age");
        String c=config.getInitParameter("height");
        String e=config.getInitParameter("weight");
        System.out.println(a+"===="+b+"#######"+c+"-----"+e);

Servlect对象二@ServletContext.共享动态数据,文件数据,静态数据。

第一个作用 静态数据在web.xml文件中

<!-- 每一个servlet自己静态数据<init-param>-->
  <context-param>
  <param-name>lq</param-name>
  <param-value>篮球</param-value>
  </context-param>
  <context-param>
  <param-name>zq</param-name>
  <param-value>足球</param-value>
  </context-param>

获取方式

  //1获取ServletContext对象
                ServletContext  sc=getServletContext();
                //获取web.xml文件中的镜头数据
                String a=sc.getInitParameter("zq");
                //给浏览器发送数据
                response.getWriter().append("Servlet2获得静态数据用来访问zq:"+a);

第二个作用 动态数据在Servlect.

//response.setContentType("text/html");
        response.setContentType("text/html");
        //设置发送给浏览器文本utf-8
        //response.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        //因为浏览器是使用get请求
        //所以Servlet do-get
        //servlet1相打篮球
        //1获取ServletContext对象
        ServletContext  sc=getServletContext();
        //获取web.xml文件中的镜头数据
        String a=sc.getInitParameter("lq");
        //给浏览器发送数据
        response.getWriter().append("Servlet3获得静态数据用来访问lq:"+a);

第三个作用文件数据

response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");
    // 获得text.txt完整路径
        ServletContext sc=getServletContext();
        //指定文件名称获取完整路径
        String path=sc.getRealPath("text.txt");
        //控制台打印输出文件完整路径
        System.out.println(path);
        //将text.txt读取出来
        //IO inputStream /outputStream输出流。
        //网上下载的图片以自己为主场输入
        //总结:始终以自己为主场,观察数据流向。
        /* InputStream is=sc.getResourceAsStream("/text.txt"); */
        InputStream is=sc.getResourceAsStream("/text.txt");
        //分析:1.假设text.txt是一部一百万的小说
        //当读取大量数据的时候,采取分段读取,部分读取
        //一般情况下,一次读取1024字节byte=1kb 512个字
        byte[] bytes=new byte[1024];
        //分析:2.数据非常少的时候
        //定义一个变量,用于记录每一次读取的字节数
        //判断记录的字节数是否小于1024,表示快读取结束
        int count=-1;//-1标记为读取结束
        //定义一个字符串用于汇总每次读取的部分字符串内容
        String sum="";
        //循环读取
        while ((count=is.read(bytes))!=-1) {
          //需要将每一次读取的字节数组转换成字符串
          String s=new String(bytes, 0, count);
          sum+=s;
        }
        System.out.println(sum);
        //response.getWriter().append("Served at: ").append(request.getContextPath());
    response.getWriter().append("Servlet1获得静态数据用来访问lq:");
    response.getWriter().append("response.getWriter().append方法打印内容");
    response.getWriter().append("Servlet1获得静态数据用来访问pq:");

Servlect对象三Response对象

//设置servlet发送的数据支撑HTML格式
    response.setContentType("text/html");
    //设置发送servlet 浏览html格式 utf-8
    response.setCharacterEncoding("UTF-8");
    String info="abc";
    PrintWriter pw=response.getWriter();
    pw.print(info);

图片的下载

  // 使用对象完成图片的下载
    //设置servlet发送的数据支撑HTML格式
    response.setContentType("text/html");
        //设置发送servlet 浏览html格式 utf-8
    response.setCharacterEncoding("UTF-8");
    //设置响应头
    response.setHeader("content-disposition", "attachment;filenname=flower.jpg");
    ServletContext sa=getServletContext();
    String path=sa.getRealPath("/imges/yu.png");
    InputStream is =new FileInputStream(path);
    byte [] bytes =new byte[1024];
    int count=-1;
    OutputStream os=response.getOutputStream();
    while((count=is.read(bytes))!=-1) {
      os.write(bytes,0,count);
    }

随机数的抽取

// 生成数字,随机数
    //100000 -1000000
    //[0,1]*900000=[0,900000]+100000
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html");
    response.setHeader("refresh", "5");
    //设置要求浏览器
    /* response.sendRedirect("Servlet1"); */
    int i=(int)(Math.random()*900000+100000);
    int a=(int)(Math.random()*9000+1000);
    int c=(int)(Math.random()*900+100);
    System.out.println("@@@@"+(new Random().nextInt(900000)+100000));
    /*
     * 设置随机
     */
    System.out.println(new Random().nextInt(100));
    System.out.println(Math.random());
    PrintWriter  pw =response.getWriter();
    pw.print("你的支付宝到账1000万元,需要的码号为:<h1 style='color:red ;background-color:green'>"+i+"</h1>,打死也不说  \"<hr>\";");
    pw.print("你的QQ到账1000万元,需要的码号为:<h2 style='color:red ;background-color:green'>"+c+"</h2>,打死也不说   \"<hr>\";");
    pw.print("你的微信到账1000万元,需要的码号为:<span style='color:green'>"+a+"</span>,打死也不说"); 
    pw.print("你的手机支付宝到账1000万<span style='color :red'>"+i+"</span>");
    response.sendRedirect("Servlet2");
    try { Thread.sleep(5000);
    Connection conn = Time.time();
    } catch (Exception e)
    { e.printStackTrace();
    }
  }
//重定向 response.sendRedirect("Servlet2");

重定向 response.sendRedirect("Servlet2");

Servlect对象四Request对象服务器获得浏览器的数据

//获得浏览器的请求,得到请求信息
    //得到请求的URL地址
    String a=request.getRequestURL().toString();
    System.out.println(a);
    //得到请求的数据
    String b=request.getRequestURI();
    System.out.println(b);
    //得到请求的URL地址中附带的参数
    String c=request.getQueryString();
    System.out.println(c);
    //得到来访者的IP地址
    String d=request.getRemoteAddr();
    System.out.println(d);
    //来访者的主机名
    String e=request.getRemoteHost();
    System.out.println(e);
    //来访者的端口号
    int f=request.getRemotePort();
    System.out.println(f);
    //得到请求URL地址时使用的方法(重要)
    String h=request.getMethod();
    System.out.println(h);
    //获取WEB服务器的IP地址
    String l=request.getLocalAddr();
    System.out.println(l);
    //获取WEB服务器的主机名
    String n=request.getLocalName();
    System.out.println(n);
    //获取WEB服务器的端口号
    int m=request.getLocalPort();
    System.out.println(m);
  }

获得浏览器的数据

        //获得浏览器发送过来的姓名和年龄的数据
        String a=request.getParameter("name");
        String b=request.getParameter("age");
        String c=request.getParameter("phone");
        String d=request.getParameter("QQ");
        String e=request.getParameter("wexing");
        System.out.println("获得浏览器发送给Servlet的数据为:"+a+"--"+b+"--"+c);
        //当浏览器发送的数据是同一个名称多个不同的数据
        //servlet需要使用以下这个方法去接收这种数据
        String[] ss=request.getParameterValues("hobby");
        System.out.println(Arrays.toString(ss));
        //tomcat服务器的编码格式是:ISO-8859-1
        //注意:servlet获得浏览器表单发送的数据时,
        //获得的名称一定要和表单上文本框定义的name属性中的名称保持一致
        //当浏览器发送大量数据给servlet的时候
        //如果使用getParameter一个个获得,效率太慢
        //使用以下方法可以节省代码,加快开发速度
        Enumeration<String> e1= request.getParameterNames();
        while (e1.hasMoreElements()) {
          //循环获得的是浏览器发给servlet的数据的名称
          String name=e1.nextElement();
          if (name.equals("hobby")) {
            String[] str=request.getParameterValues(name);
            System.out.println(name+":"+Arrays.toString(str));
          }else {
            String value=request.getParameter(name);
            System.out.println(name+":"+value);
          }
        }
        //使用Map集合获得浏览器发送的所有数据
        Map<String,String[]> map=request.getParameterMap();
        for (Entry<String, String[]> entry : map.entrySet()) {
          String name=entry.getKey();
          String[] values=entry.getValue();
          System.out.println(name+"%"+Arrays.toString(values));
        }
        System.out.println("运行完成");
        System.out.println("http://localhost:8080/Day06-2/Servlet2?name=hubinjkf&age=23&phone=16745637856&qq=2675648967&wexing=16745679076&hobby=%E7%9C%8B%E4%B9%A6&hobby=%E7%9C%8B%E5%B0%8F%E5%AD%A6%E5%A6%B9&hobby=%E5%AD%A6%E4%B9%A0mysql");
      }

服务器的跳转

//当浏览器访问Servlet3的时候,Servlet3自己跳转到Servlet4,
        //由Servlet4回复消息给浏览器
        request.setAttribute("apple", "苹果");
        request.setAttribute("banner", "香蕉");
        request.setAttribute("ma", "五十个一百万");
        request.getRequestDispatcher("Servlet4")
              .forward(request, response);
  response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");
    PrintWriter pw=response.getWriter();
    String a=(String) request.getAttribute("apple");
    String b=(String) request.getAttribute("banner");
    String c =(String) request.getAttribute("ma");
    pw.print("<h1 style=\"color: pink;\">收到Servlet3的请求,回复消息给浏览器,任务已完成,获得Servlet3携带的数据为:"+a+"</h1>");
    pw.print("<h1 style=\"color: red;\">收到Servlet3的请求,回复消息给浏览器,任务已完成,获得Servlet3携带的数据为:"+b+"</h1>");
    pw.print("<h1 style=\"color: yellow;\">收到Servlet3的请求,回复消息给浏览器,任务已完成,获得Servlet3携带的数据为:"+c+"</h1>");
  }

Servlect对象五Cookie和Session对象。

response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");
    PrintWriter pw=response.getWriter();
    //浏览器通过地址访问服务器的servelt
    //servlet要获得该浏览器所携带的所有cookie对象
    Cookie[] cookies=request.getCookies();
    if (cookies!=null) {
      //循环遍历每一个cookie,直到找到servlet能识别的cookie值为止
      //tag,china
      for (int i = 0; i < cookies.length; i++) {
        //通过cookie中存储的数据的名称
        String name=cookies[i].getName();
        if ("AAA".equals(name)) {
          //这个cookie是服务器要找的东西,从cookie中获得中文数据需要进行解码
          String value=URLDecoder.decode(cookies[i].getValue(), "UTF-8");
          System.out.println(value);
          pw.print(value);
          break;  
        }
      }
    }else {
      //没有cookie,说明当前浏览器以前没有访问过服务器
      //创建cookie对象,存储中文数据的时候,需要对数据进行转码
      Cookie cookie=new Cookie("AAA", URLEncoder.encode("bbbbbbbb", "UTF-8"));
      //设置浏览器退出后,cookie还能继续存在内存中的时间
      cookie.setMaxAge(30);
      response.addCookie(cookie);
      pw.print("服务器给浏览器创建了一个cookie对象");
    }
  }
/因为有密码,为了安全保障用do-post方法
    response.setContentType("text/html");
    response.setCharacterEncoding("UTF-8");
    //首先获取文本框
     String username = request.getParameter("username");
       String password = request.getParameter("password");
       /*
        * 创建对象HttpSession
        */
       HttpSession session=request.getSession();
       /**
        * 建立二个动态数据
        */
       session.setAttribute("username", "hug");
     session.setAttribute("password", "123");
     /**
      * 获得动态数据
      */
      String a=(String) session.getAttribute("username");
      String b=(String) session.getAttribute("password");
     String aa=request.getParameter("username");
     String bb=request.getParameter("password");
     System.out.println(aa+"获得浏览器index.jsp文件中数据");
     System.out.println(bb+"获得浏览器index.jsp文件中数据");
     PrintWriter pw =response.getWriter();
     if (session.isNew()) {
        pw.print("浏览器是第一次访问服务器");
      }else if (a.equals(aa)&&b.equals(bb)) {
        /**
         * 判断浏览器与我创建的服务器中的数据是否相等
         */
        pw.print("浏览器是第一次访问服务器");
                  response.sendRedirect("ServlectA");
              }else{
                  //登录失败,跳转到失败页面
                System.out.println("登录失败,跳转到失败页面");
                  response.sendRedirect("ServlectB");
                }   
              }

过滤器对象六

<!-- 第一部分·注册过滤器 -->
 <filter>
 <filter-name>MyFilter</filter-name>
 <filter-class>com.MyFilter</filter-class>
 <init-param>
 <param-name>username</param-name>
 <param-value>student</param-value>
 </init-param>
 <init-param>
 <param-name>password</param-name>
 <param-value>666666</param-value>
 </init-param>
 </filter>
 <filter-mapping>
    <filter-name>MyFilter</filter-name>
    <!-- 这表示可以拦截任何请求 -->
    <url-pattern>/Servlect1</url-pattern>
  </filter-mapping>
 <servlet>
 <servlet-name>ServlectA</servlet-name>
 <servlet-class>co.ServlectA</servlet-class>
 </servlet>
 <servlet-mapping>
 <servlet-name>ServlectA</servlet-name>
 <url-pattern>/ServlectA</url-pattern>
 </servlet-mapping>
  <filter>
 <filter-name>MyFilter4</filter-name>
 <filter-class>com.MyFilter4</filter-class>
 </filter>
 <filter-mapping>
    <filter-name>MyFilter4</filter-name>
    <!-- 这表示可以拦截任何请求 *-->
    <url-pattern>/Servlect4</url-pattern>
  </filter-mapping>

listener对象七

package com.Listener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public class MyServlectListener implements ServletContextListener  {
  public MyServlectListener() {
    // TODO Auto-generated constructor stub
    System.out.println("MyServlectListener的构造方法");
  }
  @Override
  public void contextInitialized(ServletContextEvent sce) {
    System.out.println("Listener程序初始化程序开启");
    System.out.println("WEB ServletContextListener程序初始化程序开启ServletContext"
        + "Listener开始@@程序开始运行@@");
  }
  @Override
  public void contextDestroyed(ServletContextEvent sce) {
    System.out.println("Listener程序初始化程序结束");
    System.out.println("WEB contextDestroyed==程序初始化程序in the endontextDestroyed程序结束"
        + "程序在结束中");
  }
}
package com.Listener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
public class MySessionListener implements  HttpSessionListener {
  private static int count=0;
  public MySessionListener() {
    // TODO Auto-generated constructor stub
    System.out.println("MySessionListener()   构造方法");
  }
  @Override
  public void sessionCreated(HttpSessionEvent se) {
    // TODO Auto-generated method stub
    System.out.println("当sesssion创建时执行程序 sessionCreated()构造方法");
    se.getSession().getServletContext().setAttribute("count", ++count);
  }
  @Override
  public void sessionDestroyed(HttpSessionEvent se) {
    System.out.println("当sesssion销毁时执行程序  sessionDestroyed()构造方法");
  }
}

九大内置对象

image.png

**四大作用域(有四个对象)有四个对象共享数据

seesion 浏览器不切

application 服务器不关闭

request:请求转发跳转页面的情况,只能两个页面共享数据

pageContext:该对象中只能页面自己用

才能用setAttribute的方法

将四作用域排序**

pageContext<request<seesion<application

**<%! %>:用于在jsp文件中定义全局变量和方法

<%= %>:用于在jsp文件中将java中的数据结果显示在html文本中

<% %>:用于在jsp文件中执行多行代码,包括if,while,for,创建对象等等

<%-- --%>:用于在jsp文件中的注释

<%@ %>:用于在jsp文件中操作指令代码**

Jsp常用的三大指令:page,include,taglib

page指令的常用属性: import:导入所需要的包 language:当前jsp页面里面可以嵌套的语言 contenType:设置响应流的编码,及通知浏览器用什么编码打开 pageEncoding:设置页面的编码 extends:声明当前jsp的页面继承于哪个类 session:设置jsp页面是否可以使用session内置对象 buffer:设置jsp页面的流的缓冲区大小 autoFlush:是否自动刷新 isELIgnored:是否忽略el表达式 errorPage:当前jsp页面出现异常的时候要跳转到的jsp页面 isErrorPage:当前jsp页面是否是一个错误页面


@1jsp:useBean

jsp:useBean:创建某一个JavaBean类的对象,需要把该对象存储至指定的四大作用域之一 id:填要创建的类的对象名称 class:填要创建的类的完整包的路径 scope:填四大作用域的标识 page:代表的是pageContext对象 request:代表的是request对象 session:代表的是session对象 application:代表的是application对象


@3jsp:getProperty

jsp:getProperty:用于获得jsp:useBean动作所创建的对象中所有全局变量的值 name:填对象名称 property:填属性名称或者变量名称


@2jsp:setProperty

jsp:setProperty:用于给jsp:useBean动作所创建的对象的全局变量进行赋值 name:填对象名称 property:填属性名称或者变量名称 value:填要赋予给全局变量的值


@4jsp:forwad

jsp:forwad:用于类似于请求转发的页面跳转方式 page:填写要跳转的页面


@5jsp:param

jsp:param:用于携带参数(如果传输的中文,需要进行编码格式转换) name:填参数名称 value:填参数的值


@6jsp:include

jsp:include:用于动态的将其他多个jsp页面引入或者包含某一个页面中 引入的过程中也可以使用jsp:param动作给这个子页面传输数据

相关文章
|
JavaScript
Dom对象总结案例实操(第二十课)(二)
Dom对象总结案例实操(第二十课)(二)
78 0
|
JavaScript
Dom对象总结案例实操(第二十课)(一)
Dom对象总结案例实操(第二十课)(一)
75 0
|
开发框架 监控 NoSQL
阿里内部SpringBoot进阶宝典横空出世,实战源码齐飞
想必大家都知道使用SpringBoot的最大好处就是简化配置,它实现了自动化配置。它简化了Spring应用开发,不需要配置就能运行Spring应用,无论是简单的Web系统,还是构建复杂系统,都只需要少量配置和代码就能完成。这有点像每个公司基于Spring框架做的内部开发框架,不同的是,Spring Boot更完善、更强大。
|
存储 前端开发 Java
【SpringMVC】看完这篇简单理解并入门SpringMVC:通过入门案例举例子的方式快速理解
【SpringMVC】看完这篇简单理解并入门SpringMVC:通过入门案例举例子的方式快速理解
2022年Servlect课时十八——综合案例一
2022年Servlect课时十八——综合案例一
90 0
2022年Servlect课时十八——综合案例一
|
SQL 监控 druid
小白救星-SpringBoot最简教程06:web开发实战
先找到这个类:WebMvcAutoConfiguration,在这个jar包里面,还是自动配置
104 0
|
算法 Java Android开发
|
前端开发 Java
JSP网络编程第二十课。回顾Servlect 六个常用的对象本课程以回顾为主。
JSP网络编程第二十课。回顾Servlect 六个常用的对象本课程以回顾为主。
86 0
JSP网络编程第二十课。回顾Servlect 六个常用的对象本课程以回顾为主。
|
Java 数据库 数据安全/隐私保护
项目技术点-MybatisPlus 入门案例(2)| 学习笔记
快速学习 项目技术点-MybatisPlus 入门案例(2)
项目技术点-MybatisPlus 入门案例(2)| 学习笔记
带你吃透Servlet核心编程上篇(完整图文教程)(下)
文章目录 1 走进Servlet 1.1 Servlet简介 1.2 第一个Servlet程序 1.3 Servlet程序如何定位到url地址 1.4 Servlet的生命周期方法 1.5 Servlet请求的分发处理 1.6 通过继承HttpServlet类实现Servlet程序 2 Servlet体系 2.1 Servlet继承体系 2.2 ServletConfig类的使用
带你吃透Servlet核心编程上篇(完整图文教程)(下)