Day45

从3.12开始到5.4,中间有9天可能没学习,有点懒了,还是要加油啊,留给你的时间不多啦。加油OVO

 

Day45 JSP

人生感悟,路是一步步走的,弹射起步很容易跌倒,加油,一定可以的。

JSP中的常用脚本

1.声明脚本(极少使用)

声明的脚本的格式是:<%! 声明java代码 %>

作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类等。

 

2.表达式脚本

表达式脚本的格式是:<%= 表达式 %>

表达式脚本的作用是:的 jsp 页面上输出数据。

表达式脚本的特点:

1、所有的表达式脚本都会被翻译到 _jspService() 方法中

2、表达式脚本都会被翻译成为 out.print()输出到页面上

3、由于表达式脚本翻译的内容都在_jspService() 方法中,所以 _jspService()方法中的对象都可以直接使用。

4、表达式脚本中的表达式不能以分号结束

<%= 12 %> <br>
<%= 12.12 %> <br>
<%= "我是字符串" %> <br>
<%= map%> <br>

<%= request.getParameter("username")%> #特点3:可以使用_jspService方法中的对象



### 3.代码脚本

代码脚本的格式是: <%
java 语句
          %>

代码脚本的作用是:可以在 jsp 页面中,编写我们自己需要的功能(写的是 java 语句)。



代码脚本的特点是:

1、代码脚本翻译之后都在 _jspService 方法中

2、代码脚本由于翻译到   _jspService()方法中,所以在 _jspService() 方法中的现有对象都可以直接使用。

3、还可以由多个代码脚本块组合完成一个完整的 java 语句。

4、代码脚本还可以和表达式脚本一起组合使用,在 jsp页面上输出数据

```jsp
%--练习:--%>
<%--1.代码脚本----if 语句--%>
<%
int i = 13 ;
if (i == 12) {
%>
<h1>国哥好帅</h1>
<%
} else {
%>
<h1>国哥又骗人了!</h1>
<%
}
%>
<br>
<%--2.代码脚本----for 循环语句--%>
<table border="1" cellspacing="0">
<%
for (int j = 0; j < 10; j++) {
%>
<tr>
<td>第 <%=j + 1%>行</td>
</tr>
<%
}
%>
</table>
<%--3.翻译后 java 文件中_jspService 方法内的代码都可以写--%>
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数值是:" + username);
%>

 

4.JSP三种注释

  1. html 注释

    <!-- html注释 -->

    html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。

  2. java 注释

    <%

    // 单行 java 注释

    /* 多行 java 注释 */

    %>

    java 注释会被翻译到 java 源代码中。

  3. jsp 注释

    <%-- 这是 jsp 注释 --%>

    jsp 注释可以注掉jsp 页面中所有代码。

     

5.JSP九大内置对象

  1. request请求对象

  2. response 响应对象

  3. pageContext jsp的上下文对象

  4. session 会话对象

  5. application ServletContext对象

  6. config ServletConfig对象

  7. out jsp输出流对象

  8. page 指向当前jsp的对象

  9. exception 异常对象

 

6.jsp四个域对象

pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效
request (HttpServletRequest 类)一次请求内有效
session (HttpSession 类)一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在)

域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。
四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
pageContext ====>>> request ====>>> session ====>>> application

7.jsp 中的 out 输出和 response.getWriter 输出的区别

image-20210504140548455

当jsp页面中所有代码执行完成后会做以下两个操作:

1,执行out.flush() 操作,会把out缓冲区中的数据追加写入到response缓冲区末尾

2,会执行response刷新操作,把全部数据写给客户端。

 

由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。

我们在 jsp 页面中统一使用 out 来进行输出。避免打乱页面输出内容的顺序。

 

out.write() 输出字符串没有问题

out.print() 输出任意数据都没有问题(先将任何类型都转换成为字符串 ,后调用 write 输出)

深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print()来进行输出

 

8.jsp 的常用标签

1.jsp静态包含:

应用场景:

网页里面每个页面都存在的固定信息(相同内容),改一处,可以改全部内容。

示例说明:
<%--
   <%@ include file=""%> 就是静态包含
  file 属性指定你要包含的 jsp 页面的路径
  地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的 web 目录
  静态包含的特点:
  1、静态包含不会翻译被包含的 jsp 页面。
  2、静态包含其实是把被包含的 jsp 页面的代码拷贝到包含的位置执行输出。
--%>
<%@ include file="/include/footer.jsp"%>
   

2.jsp动态包含

示例说明:
<%--
<jsp:include page=""></jsp:include> 这是动态包含
page 属性是指定你要包含的 jsp 页面的路径
动态包含也可以像静态包含一样。把被包含的内容执行输出到包含位置

动态包含的特点:
1、动态包含会把包含的 jsp 页面也翻译成为 java 代码
2、动态包含底层代码使用如下代码去调用被包含的 jsp 页面执行输出。
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
3、动态包含,还可以传递参数
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="bbj"/>
<jsp:param name="password" value="root"/>
</jsp:include>

3.jsp 标签-转发

示例说明:
<%--
<jsp:forward page=""></jsp:forward> 是请求转发标签,它的功能就是请求转发
page 属性设置请求转发的路径
--%>

9. Listener 监听器

1、Listener 监听器它是 JavaWeb 的三大组件之一。

JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。2、Listener 它是 JavaEE 的规范,就是接口3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

 

ServletContextListener 监听器

ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。

ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。

监听到创建和销毁之后都会分别调用 ServletContextListener 监听器

public interface ServletContextListener extends EventListener {
   /**
   * 在 ServletContext 对象创建之后马上调用,做初始化
   */
   public void contextInitialized(ServletContextEvent sce);
   /**
   * 在 ServletContext 对象销毁之后调用
   */
   public void contextDestroyed(ServletContextEvent sce);
}

 

如何使用 ServletContextListener 监听器监听 ServletContext 对象。

使用步骤如下:1、编写一个类去实现 ServletContextListener2、实现其两个回调方法3、到 web.xml 中去配置监听器

监听器实现类:

public class MyServletContextListenerImpl implements ServletContextListener {
   @Override
   public void contextInitialized(ServletContextEvent sce) {
       System.out.println("ServletContext 对象被创建了");
 
  }
   
   @Override
   public void contextDestroyed(ServletContextEvent sce) {
       System.out.println("ServletContext 对象被销毁了");

  }
}

web.xml 中的配置:

<!--配置监听器-->
<listener>
   <listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>

 

每日刷刷算法题

1.给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,JS中的所有字符都是字母。字母区分大小写,因此"a""A"是不同类型的石头。

第一次自己写出来的题,感动天地,好爽,这种感觉。

public int numJewelsInStones(String jewels, String stones) {
   int count=0;
   HashSet<Character> set = new HashSet<>();
   for (int i = 0; i < jewels.length(); i++) {
       char c = jewels.charAt(i);
       set.add(c);
  }
   for (int i = 0; i < stones.length(); i++) {
       char c = stones.charAt(i);
       if(set.contains(c)) {
           count++;
      }
  }
   return count;
}

2.给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量

客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。

 

public int maximumWealth(int[][] accounts) {
   int max = 0;
   for (int i = 0; i < accounts.length; i++) {
       int sum = 0;
       //只要知道第一组的长度,accounts里的长度都一样,所以是account[0].length
       for (int j = 0; j < accounts[0].length; j++) {
           //加每组里面的每个数
           sum += accounts[i][j];
      }
       //取最大的。
       max = Math.max(max, sum);
  }
   return max;
}

 

3.!!!没啥头绪,太难了

给你一个整数数组 nums

如果一组数字 (i,j) 满足 nums[i] == nums[j]i < j ,就可以认为这是一组 好数对

返回好数对的数目。

public int numIdenticalPairs(int[] nums) {

       int[] cnt = new int[101];
       int ans = 0;
       for (int num : nums) {
           ans += cnt[num];
           cnt[num]++;
      }
       return ans;
  }

4.请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位。

请你实现 ParkingSystem 类:

  • ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 类,三个参数分别对应每种停车位的数目。

  • bool addCar(int carType) 检查是否有 carType 对应的停车位。 carType 有三种类型:大,中,小,分别用数字 123 表示。一辆车只能停在carType 对应尺寸的停车位中。如果没有空车位,请返回 false ,否则将该车停入车位并返回 true

 

    class ParkingSystem {
       int big, medium, small;

       public ParkingSystem(int big, int medium, int small) {
           this.big = big;
           this.medium = medium;
           this.small = small;
      }

       public boolean addCar(int carType) {
           switch (carType) {
               case 1:
                   big--;
                   return big >= 0;
               case 2:
                   medium--;
                   return medium >= 0;
               case 3:
                   small--;
                   return small >= 0;
          }
           return false;
      }
  }

 

Day45 JSP

人生感悟,路是一步步走的,弹射起步很容易跌倒,加油,一定可以的。

JSP中的常用脚本

1.声明脚本(极少使用)

声明的脚本的格式是:<%! 声明java代码 %>

作用:可以给jsp翻译出来的java类定义属性和方法甚至是静态代码块,内部类等。

 

2.表达式脚本

表达式脚本的格式是:<%= 表达式 %>

表达式脚本的作用是:的 jsp 页面上输出数据。

表达式脚本的特点:

1、所有的表达式脚本都会被翻译到 _jspService() 方法中

2、表达式脚本都会被翻译成为 out.print()输出到页面上

3、由于表达式脚本翻译的内容都在_jspService() 方法中,所以 _jspService()方法中的对象都可以直接使用。

4、表达式脚本中的表达式不能以分号结束

<%= 12 %> <br>
<%= 12.12 %> <br>
<%= "我是字符串" %> <br>
<%= map%> <br>

<%= request.getParameter("username")%> #特点3:可以使用_jspService方法中的对象



### 3.代码脚本

代码脚本的格式是: <%
java 语句
          %>

代码脚本的作用是:可以在 jsp 页面中,编写我们自己需要的功能(写的是 java 语句)。



代码脚本的特点是:

1、代码脚本翻译之后都在 _jspService 方法中

2、代码脚本由于翻译到   _jspService()方法中,所以在 _jspService() 方法中的现有对象都可以直接使用。

3、还可以由多个代码脚本块组合完成一个完整的 java 语句。

4、代码脚本还可以和表达式脚本一起组合使用,在 jsp页面上输出数据

```jsp
%--练习:--%>
<%--1.代码脚本----if 语句--%>
<%
int i = 13 ;
if (i == 12) {
%>
<h1>国哥好帅</h1>
<%
} else {
%>
<h1>国哥又骗人了!</h1>
<%
}
%>
<br>
<%--2.代码脚本----for 循环语句--%>
<table border="1" cellspacing="0">
<%
for (int j = 0; j < 10; j++) {
%>
<tr>
<td>第 <%=j + 1%>行</td>
</tr>
<%
}
%>
</table>
<%--3.翻译后 java 文件中_jspService 方法内的代码都可以写--%>
<%
String username = request.getParameter("username");
System.out.println("用户名的请求参数值是:" + username);
%>

 

4.JSP三种注释

  1. html 注释

    <!-- html注释 -->

    html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。

  2. java 注释

    <%

    // 单行 java 注释

    /* 多行 java 注释 */

    %>

    java 注释会被翻译到 java 源代码中。

  3. jsp 注释

    <%-- 这是 jsp 注释 --%>

    jsp 注释可以注掉jsp 页面中所有代码。

     

5.JSP九大内置对象

  1. request请求对象

  2. response 响应对象

  3. pageContext jsp的上下文对象

  4. session 会话对象

  5. application ServletContext对象

  6. config ServletConfig对象

  7. out jsp输出流对象

  8. page 指向当前jsp的对象

  9. exception 异常对象

 

6.jsp四个域对象

pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效
request (HttpServletRequest 类)一次请求内有效
session (HttpSession 类)一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在)

域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。
四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
pageContext ====>>> request ====>>> session ====>>> application

7.jsp 中的 out 输出和 response.getWriter 输出的区别

image-20210504140548455

当jsp页面中所有代码执行完成后会做以下两个操作:

1,执行out.flush() 操作,会把out缓冲区中的数据追加写入到response缓冲区末尾

2,会执行response刷新操作,把全部数据写给客户端。

 

由于 jsp 翻译之后,底层源代码都是使用 out 来进行输出,所以一般情况下。

我们在 jsp 页面中统一使用 out 来进行输出。避免打乱页面输出内容的顺序。

 

out.write() 输出字符串没有问题

out.print() 输出任意数据都没有问题(先将任何类型都转换成为字符串 ,后调用 write 输出)

深入源码,浅出结论:在 jsp 页面中,可以统一使用 out.print()来进行输出

 

8.jsp 的常用标签

1.jsp静态包含:

应用场景:

网页里面每个页面都存在的固定信息(相同内容),改一处,可以改全部内容。

示例说明:
<%--
   <%@ include file=""%> 就是静态包含
  file 属性指定你要包含的 jsp 页面的路径
  地址中第一个斜杠 / 表示为 http://ip:port/工程路径/ 映射到代码的 web 目录
  静态包含的特点:
  1、静态包含不会翻译被包含的 jsp 页面。
  2、静态包含其实是把被包含的 jsp 页面的代码拷贝到包含的位置执行输出。
--%>
<%@ include file="/include/footer.jsp"%>
   

2.jsp动态包含

示例说明:
<%--
<jsp:include page=""></jsp:include> 这是动态包含
page 属性是指定你要包含的 jsp 页面的路径
动态包含也可以像静态包含一样。把被包含的内容执行输出到包含位置

动态包含的特点:
1、动态包含会把包含的 jsp 页面也翻译成为 java 代码
2、动态包含底层代码使用如下代码去调用被包含的 jsp 页面执行输出。
JspRuntimeLibrary.include(request, response, "/include/footer.jsp", out, false);
3、动态包含,还可以传递参数
--%>
<jsp:include page="/include/footer.jsp">
<jsp:param name="username" value="bbj"/>
<jsp:param name="password" value="root"/>
</jsp:include>

3.jsp 标签-转发

示例说明:
<%--
<jsp:forward page=""></jsp:forward> 是请求转发标签,它的功能就是请求转发
page 属性设置请求转发的路径
--%>

9. Listener 监听器

1、Listener 监听器它是 JavaWeb 的三大组件之一。

JavaWeb 的三大组件分别是:Servlet 程序、Filter 过滤器、Listener 监听器。2、Listener 它是 JavaEE 的规范,就是接口3、监听器的作用是,监听某种事物的变化。然后通过回调函数,反馈给客户(程序)去做一些相应的处理。

 

ServletContextListener 监听器

ServletContextListener 它可以监听 ServletContext 对象的创建和销毁。

ServletContext 对象在 web 工程启动的时候创建,在 web 工程停止的时候销毁。

监听到创建和销毁之后都会分别调用 ServletContextListener 监听器

public interface ServletContextListener extends EventListener {
   /**
   * 在 ServletContext 对象创建之后马上调用,做初始化
   */
   public void contextInitialized(ServletContextEvent sce);
   /**
   * 在 ServletContext 对象销毁之后调用
   */
   public void contextDestroyed(ServletContextEvent sce);
}

 

如何使用 ServletContextListener 监听器监听 ServletContext 对象。

使用步骤如下:1、编写一个类去实现 ServletContextListener2、实现其两个回调方法3、到 web.xml 中去配置监听器

监听器实现类:

public class MyServletContextListenerImpl implements ServletContextListener {
   @Override
   public void contextInitialized(ServletContextEvent sce) {
       System.out.println("ServletContext 对象被创建了");
 
  }
   
   @Override
   public void contextDestroyed(ServletContextEvent sce) {
       System.out.println("ServletContext 对象被销毁了");

  }
}

web.xml 中的配置:

<!--配置监听器-->
<listener>
   <listener-class>com.atguigu.listener.MyServletContextListenerImpl</listener-class>
</listener>

 

每日刷刷算法题

1.给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。J 中的字母不重复,JS中的所有字符都是字母。字母区分大小写,因此"a""A"是不同类型的石头。

第一次自己写出来的题,感动天地,好爽,这种感觉。

public int numJewelsInStones(String jewels, String stones) {
   int count=0;
   HashSet<Character> set = new HashSet<>();
   for (int i = 0; i < jewels.length(); i++) {
       char c = jewels.charAt(i);
       set.add(c);
  }
   for (int i = 0; i < stones.length(); i++) {
       char c = stones.charAt(i);
       if(set.contains(c)) {
           count++;
      }
  }
   return count;
}

2.给你一个 m x n 的整数网格 accounts ,其中 accounts[i][j] 是第 i 位客户在第 j 家银行托管的资产数量。返回最富有客户所拥有的 资产总量

客户的 资产总量 就是他们在各家银行托管的资产数量之和。最富有客户就是 资产总量 最大的客户。

 

public int maximumWealth(int[][] accounts) {
   int max = 0;
   for (int i = 0; i < accounts.length; i++) {
       int sum = 0;
       //只要知道第一组的长度,accounts里的长度都一样,所以是account[0].length
       for (int j = 0; j < accounts[0].length; j++) {
           //加每组里面的每个数
           sum += accounts[i][j];
      }
       //取最大的。
       max = Math.max(max, sum);
  }
   return max;
}

 

3.!!!没啥头绪,太难了

给你一个整数数组 nums

如果一组数字 (i,j) 满足 nums[i] == nums[j]i < j ,就可以认为这是一组 好数对

返回好数对的数目。

public int numIdenticalPairs(int[] nums) {

       int[] cnt = new int[101];
       int ans = 0;
       for (int num : nums) {
           ans += cnt[num];
           cnt[num]++;
      }
       return ans;
  }

4.请你给一个停车场设计一个停车系统。停车场总共有三种不同大小的车位:大,中和小,每种尺寸分别有固定数目的车位。

请你实现 ParkingSystem 类:

  • ParkingSystem(int big, int medium, int small) 初始化 ParkingSystem 类,三个参数分别对应每种停车位的数目。

  • bool addCar(int carType) 检查是否有 carType 对应的停车位。 carType 有三种类型:大,中,小,分别用数字 123 表示。一辆车只能停在carType 对应尺寸的停车位中。如果没有空车位,请返回 false ,否则将该车停入车位并返回 true

 

    class ParkingSystem {
       int big, medium, small;

       public ParkingSystem(int big, int medium, int small) {
           this.big = big;
           this.medium = medium;
           this.small = small;
      }

       public boolean addCar(int carType) {
           switch (carType) {
               case 1:
                   big--;
                   return big >= 0;
               case 2:
                   medium--;
                   return medium >= 0;
               case 3:
                   small--;
                   return small >= 0;
          }
           return false;
      }
  }

 

posted @ 2021-05-04 21:33  独眼龙  阅读(68)  评论(0)    收藏  举报