Day45
人生感悟,路是一步步走的,弹射起步很容易跌倒,加油,一定可以的。
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三种注释
-
html 注释
<!-- html注释 -->
html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。
-
java 注释
<%
// 单行 java 注释
/* 多行 java 注释 */
%>
java 注释会被翻译到 java 源代码中。
-
jsp 注释
<%-- 这是 jsp 注释 --%>
jsp 注释可以注掉jsp 页面中所有代码。
5.JSP九大内置对象
-
request请求对象
-
response 响应对象
-
pageContext jsp的上下文对象
-
session 会话对象
-
application ServletContext对象
-
config ServletConfig对象
-
out jsp输出流对象
-
page 指向当前jsp的对象
-
exception 异常对象
6.jsp四个域对象
pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效
request (HttpServletRequest 类)一次请求内有效
session (HttpSession 类)一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在)
域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。
四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
pageContext ====>>> request ====>>> session ====>>> application
7.jsp 中的 out 输出和 response.getWriter 输出的区别
当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 {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建了");
}
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 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"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有三种类型:大,中,小,分别用数字1,2和3表示。一辆车只能停在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;
}
}
人生感悟,路是一步步走的,弹射起步很容易跌倒,加油,一定可以的。
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三种注释
-
html 注释
<!-- html注释 -->
html 注释会被翻译到 java 源代码中。在_jspService 方法里,以 out.writer 输出到客户端。
-
java 注释
<%
// 单行 java 注释
/* 多行 java 注释 */
%>
java 注释会被翻译到 java 源代码中。
-
jsp 注释
<%-- 这是 jsp 注释 --%>
jsp 注释可以注掉jsp 页面中所有代码。
5.JSP九大内置对象
-
request请求对象
-
response 响应对象
-
pageContext jsp的上下文对象
-
session 会话对象
-
application ServletContext对象
-
config ServletConfig对象
-
out jsp输出流对象
-
page 指向当前jsp的对象
-
exception 异常对象
6.jsp四个域对象
pageContext (PageContextImpl 类) 当前 jsp 页面范围内有效
request (HttpServletRequest 类)一次请求内有效
session (HttpSession 类)一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)
application (ServletContext 类) 整个 web 工程范围内都有效(只要 web 工程不停止,数据都在)
域对象是可以像 Map 一样存取数据的对象。四个域对象功能一样。不同的是它们对数据的存取范围。
虽然四个域对象都可以存取数据。在使用上它们是有优先顺序的。
四个域在使用的时候,优先顺序分别是,他们从小到大的范围的顺序。
pageContext ====>>> request ====>>> session ====>>> application
7.jsp 中的 out 输出和 response.getWriter 输出的区别
当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 {
public void contextInitialized(ServletContextEvent sce) {
System.out.println("ServletContext 对象被创建了");
}
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 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"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有三种类型:大,中,小,分别用数字1,2和3表示。一辆车只能停在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;
}
}

浙公网安备 33010602011771号