Java基础
jsp概述
JSP是由SUN公司提供的一门动态Web资源开发技术JSP看起来像一个HTML,但和html不同的是,JSP中可以书写Java代码,可以通过Java代码获取动态的数据。所以JSP可以开发动态网页。JSP其实本质上就是一个Servlet程序,jsp是动态的网页开发技术
为什么要学习jsp:
Servlet本质上是一段Java程序,擅长处理业务逻辑,但是不适合向外输出一个网页。
HTML可以用于开发网页,但仅限于开发静态网页,无法显示动态数据,JSP中可以书写Java代码,可以开发一个动态的网页。
JSP的出现既解决了Servlet不适合输出网页的问题,同时也解决html无法显示动态数据的问题
jsp的执行的过程:
访问JSP的过程为: 访问index.jsp --翻译-> index_jsp.java(Servlet) --编译-> index_jsp.class(运行) --结果-> 输出一个网页到浏览器
如果是访问一个HTML: 访问index.html ---> 服务器根据访问的路径去寻找index.html文件 ---> 如果能找到就直接将index.html文件的内容响应给浏览器,让浏览器解析。---> 如果找不到就响应一个404页面。localhost/day11/index.html
总结:由于访问JSP需要在服务器端翻译、编译、运行,最终响应给浏览器一个html网页,而访问html会直接将html发送给浏览器解析,因此html运行效率比jsp高!
单独建立页面进行描述创建模板的内容
jsp的表达式:<%=常量/表达式/变量%>
计算表达式的内容,再将计算的结果发送给浏览器,由浏览器进行解析和显示
<body>
<h1>Hello jsp...<%=new Date() %>></h1>
<!-- 代表进行创建一条直线-->
<hr/>
hello jsp
<%="hello jsp" %>
<!-- 进行声明一个变量,并将变量的值进行输出 -->
<% int n=100; %>
<%=n %>
<!-- 声明一个表达式 -->
<%=123+321 %>
</body>
</html>
脚本的片段在翻译的过程中,会将百分号进行直接去掉,然后进行代码的运行
jsp的表达式:
格式: <%= 常量/变量/表达式 %>
作用: 在翻译后的Servlet中,计算表达式的值,将计算的结果输出到浏览器,由浏览器负责解析并显示!
在JSP中:
<%= "Hello JSP" %>
Hello JSP
<%= 123+234 %>
<!-- 声明一个变量 -->
<% String name = "韩少云"; %>
<%= name %>
在翻译后的Servlet中:
out.print( "Hello JSP" );
out.write("\r\n");
out.write("\tHello JSP\r\n");
out.write("\t");
out.print( 123+234 );
out.write("\r\n");
out.write("\t<!-- 声明一个变量 -->\r\n");
out.write("\t");
String name = "韩少云";
out.write('\r');
out.write('\n');
out.write(' ');
out.print( name );
jsp的脚本
格式:<% 若干Java语句 %>
作用:在翻译后的Servlet中,将脚本片段中的java语句复制粘贴到对应的位置执行!例如:
<!-- 循环输出5行"hello jsp..." -->
<%
for(int i=0;i<5;i++){
out.write("hello jsp...<br/>");
}
%>
在翻译后的Servlet中:
out.write("\t<!-- 循环输出5行\"hello jsp...\" -->\r\n");
out.write("\t");
for(int i=0;i<5;i++){
out.write("hello jsp...<br/>");
}
其他形式,在JSP中:
<% for(int i=0;i<5;i++){ %>
hello jsp~~~<br/>
<% } %>
在翻译后的Servlet中:
for(int i=0;i<5;i++){
out.write("\r\n");
out.write("\t\thello jsp~~~<br/>\r\n");
out.write("\t");
}
写在某一个脚本片段中的Java代码可以是不完整的,但是最终的所有脚本片段中的内容加在一起,必须是完整符合Java语法的!
jsp的注释:
格式: <%-- 注释内容 --%>
作用: (1)为代码添加解释说明
(2)将一些暂时不需要执行的代码注释掉。
关于JSP注释,在翻译时,直接将JSP注释丢弃,不参与翻译过程。
在JSP中可以书写JSP注释、java注释、html注释:
<%--
<% out.write("aaa<br/>"); %>
--%>
上面的JSP注释包括其中的注释内容,在翻译时直接被抛弃,不参与翻译。
所以其中的aaa不会发送给浏览器,也不会显示在页面上。
<% //out.write("bbb<br/>"); %>
上面的java注释内容放在脚本片段中,会参与翻译,但是由于被java注释注释了,所以也不会执行,bbb也不会发送给浏览器,不会显示在页面上。
<!--
<% out.write("ccc<br/>"); %>
-->
上面的html注释会被当做模板元素被out.write发送到浏览器, 其中包裹的脚本片段中的内容也会执行。ccc也会发送到浏览器。但由于前后被html注释包裹了。浏览器不会解析html注释中的内容,因此也不会显示。
jsp指令:
指令的格式: <%@ 指令名称 若干属性声明... %>
指令的作用: 用于指挥JSP解析引擎如何将一个JSP翻译成一个Servlet程序。
page指令:
page指令的作用是,用于声明JSP文件的基本属性信息(比如,jsp使用的开发语言,jsp使用的编码,jsp中需要引入哪些包等.)
<%@ page language="java"%>
language属性用于指定jsp使用的开发语言, 指定为java。默认也是java.
<%@ page import="java.util.Date"%>
import是用于导入包用的, 类似于java程序中的import关键字
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
<%@ page pageEncoding="UTF-8"%>
pageEncoding属性是用于指定JSP使用的编码。
只要保证pageEncoding属性指定的编码和JSP文件另存时的编码一致。
JSP中就不会有乱码问题。(在JSP中获取请求参数乱码另说)
可以将上面的属性都声明在一个page指令上。
<%@ page language="java" pageEncoding="UTF-8" import="java.util.Date"%>
taglib标签指令:
tablib指令是用于引入jspJSTL标签或者其他标签库使用的,后面在讲解JSTL标签库的时候,会进行讲解他的用法
EL表达式:
格式:${表达式/常量/变量(必须要进行存放到域中)}
(1).获取表达式,常量或者是变量(变量必须要存放在域中)
<h3>(1).获取表达式,常量或者是变量(变量必须要存放在域中)</h3>
常量:${" Hello jsp"}<br/>
表达式:${1+6} <br/>
变量:
<!--在存储变量的时候,需要将变量添加到域中进行获取-->
<%String name="张三丰" ;
request.setAttribute("name2", name);
%>
<!--在此处写的是加载到域中的变量的名称,而不是变量的名称 -->
<!-- 所以此处调用的时候不是name的变量,而是调用的name2域中的名称 -->
${name2}
如果 在EL中书写的变量,EL底层会根据变量的名称(比如上面的name2)到四个域中寻找指定的名称(name)属性值,并且寻找的顺序是按照作用域的大小范围是依次从小到大的进行寻找如果找到直接返回并进行输出这个属性值,如果找不到就什么也不输出
四个域的大小的顺序:pageContext < request < session < application
(2).获取域中数组或者是集合中的元素
<h3>(2).获取域中数组或者是集合中的元素</h3>
<!-- 就是将数据放到域中,并进行附上名称,第一个变量就是数组在域中的名称 -->
<!-- request.setAttribute("ns", o)第一个变量是数组的名称,第二各变量就是要放在域中的变量的名称 -->
<%
String[] names={"刘德华","郭富城","张学友","黎明","天下"};
request.setAttribute("ns", names);
%>
<!-- 获取数组的内容的方法,不可以进行利用自己单独的方法进行遍历 -->
${ns[0]}
${ns[1]}
${ns[2]}
${ns[3]}
(3).获取map集合中的元素
<h3>(3).获取map集合中的元素</h3>
<% //声明一个map集合并存放到域中
Map map=new HashMap();
map.put("name","阿凡提");
map.put("age",25);
map.put("nickname","小提提");
request.setAttribute("map1",map);
%>
<!-- 从map中进行取出数据 -->
${}<br/>
${map1} <br/>
${map1.nickname}<br/>
JSTL标签库:
JSTL标签库是为JavaWeb开发人员提供的一套标准通用的标签库;JSTL标签库和EL配合使用可以取代JSP中大部分的Java代码;
在使用JSTL标签库之前需要完成:
(1)导入JSTL的开发包
(2)在使用JSTL的jsp的页面中通过taglib指令引入标签库
其中常用的标签如下:
<c:set></c:set>
往四大作用域中添加域属性,或者修改四大作用域中已有的属性
(1) 往四大作用域中添加一个域属性
<c:set var="name" value="张三" scope="request"/>
${ name }
(2) 修改四大作用域中已有的属性,如果重复添加相同的属性,值会发生覆盖,相当于修改.
<c:set var="name" value="张三丰" scope="request"/>
${ name }
c_set标签属性总结:
(1)var -- 指定存入作用域中的属性名称
(2)value -- 指定存入作用域中属性的值
(3)scope -- 指定将属性存入哪一个作用域中
可取值: a)page表示pageContext域 b)request表示request域 ¬¬
c)session表示session域 d)application表示ServletContext域
<c:if></c:if> -- 构造if…else…语句
<h3>往域中存入一个成绩, 根据成绩判断成绩所属的等级</h3>
<c:set var="score" value="-58"/>
<c:if test="${ score<=100 && score > 80 }">
优秀!
</c:if>
<c:if test="${ score<=80 && score >= 60 }">
中等!
</c:if>
<c:if test="${ score < 60 && score >= 0 }">
不及格!
</c:if>
<c:if test="${ score < 0 || score > 100 }">
您输入的成绩不合法!
</c:if>
test属性用于指定判断的条件,注意:JSTL中没有提供else对应的标签
3、<c:forEach></c:forEach>
-- 对集合或数组等中元素进行循环遍历或者是执行指定次数的循环.
(1) 遍历域中数组或集合中的元素
<%
//声明一个数组, 并将数组存入域中
String[] names = {"王海涛","齐雷","陈子枢"};
request.setAttribute("names", names);
%>
<c:forEach items="${names}" var="name">
${ name }
</c:forEach>
(2) 遍历域中map集合中的元素
<%
//声明一个Map, 并将Map存入域中
Map map = new HashMap();
map.put("name", "关羽");
map.put("age", "38");
map.put("addr", "中鼎大厦B座");
request.setAttribute("map", map);
%>
<c:forEach items="${ map }" var="entry">
${ entry.key } : ${ entry.value } <br/>
</c:forEach>
(3) 遍历0~100之间的整数,将是3的倍数的数值输出到浏览器中
<c:forEach begin="0" end="100" var="i" >
${ i%3==0? i : "" }
</c:forEach>
c_forEach标签属性总结:
(1)items: 指定需要遍历的集合或数组
(2)var: 指定用于接收遍历过程中的元素
(3)begin: 指定循环从哪儿开始
(4)end: 指定循环到哪儿结束
(5)step: 指定循环时的步长, 默认值是1
(6)varStatus: 用于表示循环遍历状态信息的对象, 常用属性有:
first属性: 表示当前遍历是否是第一次, 若是, 则返回true;
last属性: 表示当前遍历是否是最后一次, 若是, 则返回true;
count属性: 记录当前遍历是第几次
整体的代码实现:
<%@page import="java.util.HashMap"%>
<%@page import="java.util.Map"%>
<%@page import="org.apache.jasper.tagplugins.jstl.core.ForEach"%>
<%@ page pageEncoding="UTF-8"%>
<!-- 在这里面c是一个标签的声明 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html >
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<h3>1.c:set标签</h3>
<!-- 1.往指定的域中添加属性 -->
<%request.setAttribute("name", "张三"); %>
<!-- 首先指定往那一个域中进行存储属性,在这里面是往request域里面进行添加属性-->
<c:set scope="request" var="name1" value="李四"/>
<!-- 将存储的数据进行取出来 -->
${name}
<br/>
${name1}
<br/>
<!-- 2.修改域中的属性值 -->
<c:set scope="request" var="name1" value="张三丰"/>
${name1 }
<br/>
<h3>2.c:if标签</h3>
<!-- 实现简单的if...else语句 -->
<!-- -->
<c:set scope="request" var="score" value="78"/>
<c:if test="${score>=80}">优秀</c:if>
<c:if test="${score<80 and score>60}">学生的成绩为良好</c:if>
<c:if test="${score<60}">不及格</c:if>
<h3>3.c:foreach标签</h3>
<h5>1.遍历域中的数组或者是集合中的元素</h5>
<%
String [] names={"tom","john","andy","tony","joey"};
//该行代码就是将声明的数组放到request域中,然后进行遍历
request.setAttribute("names", names);
//for(String name : names){}
%>
<!-- 下面代码的含义是将数据从request域中进行取出 -->
<c:forEach items="${ names}" var="name1" >
${name1}<br/>
</c:forEach>
<h5>2.遍历域中map集合中的元素</h5>
<%//声明map集合,并将map集合存放到域中
Map map=new HashMap();
map.put("name", "张元芳");
map.put("age", 18);
map.put("job", "学生");
request.setAttribute("maps", map);
%>
<!-- 下面有遍历的两种不同的书写的方式 -->
<c:forEach items="${maps}" var="entry" >
${entry.getKey() }:${entry.getValue()} <br/>
${entry.key }:${entry.value} <br/>
</c:forEach>
<h5>3.遍历0-100之间的整数,将三的倍数进行数组输出到浏览器中</h5>
<!-- 表示的是开始,结束的值 var的含义是遍历的变量step默认值同样也是1含义就是每次加1-->
<!-- 相同含义进行替换 -->
<%for(int j=1;j<100;j++){}%>
<!-- varStatus="status"就是设置显示的格式 -->
<c:forEach begin="0" end="100" var="i" step="1" varStatus="status">
<c:if test="${i%3==0 }">
<c:if test="${!status.first}">
,
</c:if>
${i }
</c:if>
</c:forEach>
</body>
</html>
显示的结果: