1. JSP 基础语法
JSP:Java Server Page 动态网页编程技术,是Java Web服务器端的动态资源,允许在其嵌套java代码。
(servlet 很难对数据进行排版JSP还可以对html进行排版,所一一般把servlet当作后台,专门写Java代码,JSP专门当作页面显示)
(html 静态页面:页面数据是静态的,不能动态的从服务器中的数据库中获取数据)
JSTL JSP相关的标签库,比如做一些条件判断循环等
-
JSP中可以写java代码,java代码写在scriplet脚本小程序中
-
JSP的指令标签:include 静态包含 跟 include动态包含
-
JSP中四大域对象:
page :当前页面有效
request:一次请求就有效
session:一次会话中有效
application:整个应用程序中有效
-
EL表达式:通过EL表达式操作域对象,获取域对象中的值
-
JSp本质是servlet文件
2. JSP注释
-
显示注释:能够在客户端查看的注释
<! – 显示注释 --> html风格的注释
(如果注释为字符串的一部分 将<换成 & lt; 将 >换成**& gt;**即写成 & lt;!-- --& gt;)
-
隐式注释:不能在客户端查看的注释
<%-- 隐式注释 --%>
即写成 & lt;%-- --%& gt;
-
< p r e > </p r e> 自动排版
-
<%
中间嵌套java代码
%>
3. scriplet脚本小程序
- java脚本段<% %> 可写Java代码,定义局部变量,编写语句等,生成的代码在servelet中的service方法中
- 声明<%! %> 声明全局变量,方法,类等,生成的代码在servelet中的类体中
- 输出表达式<% =数据或数值 %> 可输出变量,或字面量,生成的代码在servelet中的service方法中
4. jsp指令标签
4.1 静态包含
使用include静态指令
-
格式: <%@ include file =" 要包含的页面地址 "%>
-
特点:
- 把内容进行了直接的替换
- 静态包含只会生成一个源码文件,最终内容存放在jspService方法体中(源码文件中)
- 不能出现同名变量
- 运行效率高一点,耦合度高,不够灵活
4.2 动态包含
使用include动态标签:包含和被包含部分是相互独立的,只有在运行的时候才会动态的包含进来,相当于方法的调用,会生成多个源码文件,可以传参数
-
格式:
<jsp:include page=“要包含的页面地址”>< /jsp:include >
-
特点:
-
相当于方法的调用
-
会生成多个源码文件
-
可以出现同名变量
-
效率高,耦合度低
注:如果动态包含中不需要传递参数时,inlcude双标签之间间不能有任何内容,包括空格和换行。
使用动态包含传递参数,
格式:
<jsp:include page=“01-footer.jsp”>
<jsp:param name=“参数值” value=“参数值”/>
< /jsp:include >
- name属性不支持,value属性支持表达式,如value="<%=str%>"
- 获取参数:request.getParameter(name)通过指定参数名获取参数值
-
<%
int a=1;
String url="01-footer.jsp";
//在动态包含中,页面地址可以替换成表达式 如: page="<%=url%>" 但是不能为空
//<jsp:include page="<%=url%>"></jsp:include>
%>
4.3 jsp四大域对象
page作用域:仅在当前页面有效,跳转页面后无效
request作用域:仅在一次请求中有效,即服务端跳转有效,客户端跳转无效
session作用域:在一次会话中有效,服务端和客户端跳转有效
application作用域:在整个应用中有效
设置page范围的域对象:
pageContext.setAttribute(“name01”,“zhangsan”);
设置request范围的域对象:
request.setAttribute(“name02”,“lisi”);
设置session范围的域对象:
session.setAttribute(“name03”,“zhaoliu”);
设置application范围的域对象
application.setAttribute(“name04”,“wangwu”);
jsp中的页面跳转:
-
服务端跳转
<jsp:forward page="03-jsp四大域对象-02.jsp"></jsp:forward>
2.客户端跳转:
超链接
<%--客户端跳转:超链接--%> <a href="03-jsp四大域对象-02.jsp">跳转</a>
5. EL 表达式
-
作用:简化jsp代码的
-
格式:${ 域对象名称 }
-
操作对象:
EL表达式一般操作的是域对象,不能操作局部变量
注:
- 如果EL表达式获取域对象的值为空,则默认显示空字符串
- EL表达式默认从小到大范围去找,找到即可,如果四个范围都没有找到,则显示空字符串
- 使用四个域对象对应的空间对象:pageScope,requestScope.sessionScope,applicationScope查找指定范围的域对象
获取List
1、获取list的size的值:
l
i
s
t
.
s
i
z
e
(
)
∗
∗
2
、
获
取
l
i
s
t
的
指
定
下
标
的
值
:
∗
∗
{ list.size()}** 2、获取list的指定下标的值: **
list.size()∗∗2、获取list的指定下标的值:∗∗{list[指定下标]}
注:list代表的是限域变量名 即存在于当前域中的变量的名字
获取Map
获取Map指定key的value: m a p . k e y ∗ ∗ 或 者 ∗ ∗ {map.key}** 或者 ** map.key∗∗或者∗∗{map[“key”]}
map代表的也是限域变量名
获取 JavaBean对象
获取JAvaBean中的属性:
1、${JavaBean对象.属性}
2、${JavaBean对象.get属性名()}
注: JavaBean中的属性字段必须提供get方法,否则会报错
empty属性的使用
**作用:**判断域对象是否为空,即判断子符串是否存在
当域对象中字符串为空时,返回true,不为空返回false
如果是要判断是否不为空,其格式为:${!empty 域对象名称}
格式: ${empty 域对象名}
1、域对象为字符串时:
-
如果域对象不存在,返回 true
-
域对象为空字符串,返回true
-
域对象值为null, 返回true
只有当域对象中存在字符串时,才返回false
2、域对象为List时:
-
list为null: true
-
没有长度: true
所以empty不仅判断集合是否为空,而且会判断集合长度是否大于0;
3、域对象为Map时
-
null: true
-
没有长度: true
4、域对象为JavaBean时:
-
null: true
-
空对象: false 虽然只是创建了对象,但是存在地址
EL运算
1、用 a = = b ∗ ∗ 或 者 ∗ ∗ { a==b }** 或者 ** a==b∗∗或者∗∗{a eq b} 判断两者是否相等
2、加减乘除 运算 :
加:${a+b }
除:${a / b} 或者 ${a div b}
3、比较大小等逻辑运算 ${ a>b}
6. jstl标签的使用
1、下载JSTL所需要的jar包,(standard.jar)和(jstl.jar)
2、在项目的web目录下的web-inf中新建lib,将jar拷贝进去
3、选择“file”中的“proejct structure”
4、选择“modules”,在右侧的“dependencies”,选择“+”号,将对应lib目录加载进去
5、在需要使用标签库的JSP页面通过taglib标签引入指定库
条件动作标签(if)
格式:
<c:if test="<boolean>" var="<string>" scope="<string>">
</c:if>
常用属性:
-
test:条件判断,操作对象是域对象,接受返回结果是boolean类型的值(必要属性)
-
var:限域变量名(存放在作用域中的变量名),用来接收判断结果的值(可选属性)
-
scope:限域变量名的范围(page、request。session、application)(可选属性)
注:
-
标签操作一般是域对象
-
if标签没有else,如果需要else效果,就需要设置两个完全相反的结果
choose-when-otherwise标签
格式
c:choose>
<c:when test="">
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
choose相当于switch;when相当于case;otherwose相当于 default
属性
- choose标签和otherwise标签没有属性
- when标签只有一个test属性,且必须有一个test属性
注意
- choose标签中必须包含至少一个when标签,可以没有otherwise标签
- otherwise标签必须设置在最后一个when标签之后
- choose标签中只能设置when标签和otherwise标签
- when标签和otherwise标签中可以嵌套其他标签如< c:if>或< h4>< h4>等
迭代标签
格式
c:forEach
items="<object>" //被循环的集合
begin="<int>" //开始数
end="<int>" //结束数
step="<int>" //迭代数相当于i++
var="<string>" // 相当于i 限域变量名
varStatus="<string> "> //当前成员对象的相关信息
</c:forEach>
属性
-
begin:开始数
-
end:结束数
-
step:间隔数
-
var:限域变量名,用来接收当前遍历的成员
-
varStatus:
类型
迭代主体内容多次
格式:
<c:forEach var="限域变量名" begin="开始数" end="结束数" step="间隔数">
相当于Java中的for循环 for…int
for(int i=0; i<10 ; i++){
}
循环
格式:
<c:forEach items="被循环的数据可以是数组、List、Map等" var="限域变量名">
${取值:限域变量名}
</c:forEach>
相当于Java中的foreach循环
for(String str : list){
}
循环对象集合
创建JavaBean对象:
public class User {
private Integer userID;
private String uname;
private String pwd;
public User() {
}
public User(Integer userID, String uname, String pwd) {
this.userID = userID;
this.uname = uname;
this.pwd = pwd;
}
public Integer getUserID() {
return userID;
}
public void setUserID(Integer userID) {
this.userID = userID;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
public String getUpwd() {
return pwd;
}
public void setUpwd(String upwd) {
this.pwd = upwd;
}
}
循环对象集合:
<%-- 循环对象集合--%>
<%
List userlist=new ArrayList();
User user1=new User(1,"zhangsan","123");
User user2=new User(2,"lisi","456");
User user3=new User(3,"wangwu","789");
userlist.add(user1);
userlist.add(user2);
userlist.add(user3);
//把数据存放到作用域中
request.setAttribute("userlist", userlist);
%>
<%-- 判断集合是否为空--%>
<c:if test="${!empty userlist}">
<%-- 当集合不为空时,遍历集合--%>
<table align="center" width="800" border="1" style="border-collapse:collapse">
<tr align="center">
<th>用户编号</th>
<th>用户名称</th>
<th>用户密码/th>
<th>用户操作</th>
</tr>
<c:forEach items="${userlist}" var="user">
<tr>
<td>${user.userID}</td>
<td>${user.uname}</td>
<td>${user.pwd}</td>
<td><button>修改</button></td>
</tr>
</c:forEach>
</table>
循环Map
<%-- Map循环--%>
<%
Map map=new HashMap();
map.put("map1","aaa");
map.put("map2","bbb");
map.put("map3","ccc");
request.setAttribute("map", map);
%>
<c:forEach items="${map}" var="mapp">
key:${mapp.key} value:${mapp.value}
</c:forEach>
格式化动作标签
formatNumber标签
**定义:**用于格式化数字,百分比,货币。即将数值型数据转换成指定格式的字符串类型
格式:
<fmt:formatNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
常用属性:
value:要格式化的数值
type:要格式化的类型
- number 数值型(默认值)
- percent 百分比类型
- currency 货币类型
var:限域变量名,用来接收格式化的结果(存储格式化数字的变量)
scope:var属性的范围,即作用域,默认为page(有page、request、session、applicatin四个范围)
注:
- 如果设置了var属性,则格式化后结果不会输出,需要通过EL表达式获取var对应的限域变量名
- 默认的类型(type)的取值为number。可取值:number类型、percent百分比类型、currency货币型
formatDate
**定义:**用于使用不同格式的方式格式化日期。将Date型数据转换成指定格式的字符串类型
格式:
<fmt:formatDate
value="<string>"/>
type="<string>"/>
dateStyle="<string>"/>
timeStyle="<string>"/>
pattern="<string>"/>
timeZone="<string>"/>
var="<string>"/>
scope="<string>" />
常用属性:
value:要格式化的日期
type: 日期类型 (默认为date)
- date:日期型 年月日
- time: 时间型 时分秒
- both:日期时间型
datetype:日期格式(full、long、medium、short、default(默认))
timetype:时间格式(full、long、medium、short、default(默认))
pattern:自定义格式 (y、M、d、H、m、s)
代码 | 描述 | 实例 |
---|---|---|
y | 年份。不包含纪元的年份,如其小于10,则显示不具有前导零的年份 | 2002 |
M | 月份数字 | 04&April |
d | 月份中的天数 | 20 |
h | 12小时制的小时 | 12 |
H | 24小时制的小时 | 0 |
m | 分钟 | 45 |
s | 秒 | 52 |
timeZone:显示日期的时区
var:限域变量名,存储格式化日期的变量名
scope:格式化变量名的作业域
parseNumber
定义:将指定格式的数值字符串转换成数值型
格式:
<fmt:formatNumber
value="<string>"
type="<string>"
var="<string>"
scope="<string>"/>
属性:
value:要解析的数字
type:number、percent、currency
var:要解析的数字的变量
scope:var属性的作用域
parseDate
定义:将日期型的字符串转换成Date型
格式:
<fmt:parseDate
value="<string>"/>
type ="<string>"/>
dateStyle="<string>"/>
timeStyle="<string>"/>
pattern="<string>"/>
timeZone="<string>"/>
var="<string>"/>
scope="<string>" />
提示
-
添加注释快捷键 Ctrl+/
-
创建jsp页面是在web下,不是在WEB-INF下
-
< br > 换行+"< br >"
-
< pre > 保留格式
-
 ; 空格显示
-
< h1> 这时一个标题,随数字变小,标题字体变小
-
< hr> 分割线
-
< div>是什么
-
< tr>在说明制作表格 之后
-
< th>列,嵌套在< tr>中使用,中间可注明该列的名称,相当于字段名
-
< td>嵌套在< tr>表中,相当于行,中间是填写对应的数据,
<table align="center" width="800" border="1" style="border-collapse: collapse;">
<tr>
<th>名称</th>
<th>当前成员下标</th>
<th>当前成员循环数</th>
<th>是否第一次被循环</th>
<th>是否最后一次被循环</th>
</tr>
<c:forEach items="${li}" var="item" varStatus="itemp">
<tr>
<td>${item}</td>
<td>${item.index}</td>
<td>${item.count}</td>
<td>${item.first}</td>
<td>${item.last}</td>
</tr>
</c:forEach>
===
-
不建议使用中文名来命名jsp文件,一旦出现问题会涉及很多配置问题,很难排查
像下面这样出现问题无法正常访问jsp页面
-
新建jsp页面地址附加在默认访问的页面地址后面,访问新建页面
-
在方法爆红时。可能是没有倒入tomcat包
像这样:
导包步骤如下: