JSP总结

现有问题

在之前学习Servlet时,服务端通过Servlet响应客户端页面,有什么不足之处?

  • 开发方式麻烦:继承父类、覆盖方法、配置Web.xml或注解
  • 代码修改麻烦:重新编译、部署、重启服务
  • 显示方式麻烦:获取流、使用println(“”);逐行打印
  • 协同开发麻烦:UI负责美化页面,程序员负责编写代码。UI不懂Java,程序员又不能将所有前端 页面的内容通过流输出

JSP

概念

(Java Server Pages)

简化的Servlet设计,在HTML标签中嵌套Java代码,用以高效开发Web应用的动态网页

作用

替换显示页面部分的Servlet(使用*.jsp文件替换Servlet中的编写的页面)


JSP开发

创建JSP

在tomcat的webapps下的zz文件夹下创建*.jsp文件

JSP编写Java代码
<h1>this is jsp</h1>
<%
out.println("hello,jsp");//在页面显示输出
System.out.println("hello,jsp");//在控制台显示输出
%>

访问JSP

在浏览器输入http://ip:port/项目路径/资源名称

JSP与Servlet

  • 关系
    • JSP文件在容器中会转换成Servlet执行。
    • JSP是对Servlet的一种高级封装。本质还是Servlet。
  • 区别
    • 与 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。

JSP实现原理

Tomcat会将xxx.jsp转换成Java代码,进而编译成.class文件运行,最终将运行结果通过response响应给客户端。
在这里插入图片描述


JSP与HTML集成开发

脚本

脚本可以编写Java语句、变量、方法或表达式。

普通脚本

语法:<% Java代码 %>

<%-- 1、普通脚本 可以编写任意的java代码 --%>
<%
int a = 10;
int b = 20;
System.out.println(a+b);
%>
<%
out.println("hello,jsp");
%>

经验:普通脚本可以使用所有Java语法 注意:脚本与脚本之间不可嵌套,脚本与HTML标签不可嵌套

声明脚本

语法:<%! 定义变量、函数、类 %>

<%--2、定义脚本(类、方法) --%>
<%!
public class User{
private String name;
private int age;
public User(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public void show(){
System.out.println("show方法");
}
%>
输出脚本

语法:<%=Java表达式 %>

<%-- 3、输出脚本(页面上输出) 不要在后面加分号; --%>
<%= a+b %>
//注意:输出脚本中不能加 ;

JSP注释

JSP注释主要有两个作用:为脚本代码作注释以及HTML内容注释。

语法规则
语法描述
<%-- 注释 --%>JSP注释,注释内容不会被发送至浏览器甚至不会被编译
< !–注释-- >HTML注释,通过浏览器查看网页源代码时可以看见注释内容

JSP指令

JSP指令用来设置与整个JSP页面相关的属性。

指令描述
<%@ page … %>定义页面的依赖属性,比如脚本语言、error页面、缓存需求等等
<%@ include … %>包含其他文件
<%@ taglib … %>引入标签库的定义,可以是自定义标签
page指令
  • 语法:<%@ page attribute1=“value1” attribute2=“value2” %>
  • Page指令为容器提供当前页面的使用说明。一个JSP页面可以包含多个page指令。
属性描述
contentType指定当前JSP页面的MIME类型和字符编码格式
errorPage指定当JSP页面发生异常时需要转向的错误处理页面
isErrorPage指定当前页面是否可以作为另一个JSP页面的错误处理页面
import导入要使用的Java类
language定义JSP页面所用的脚本语言,默认是Java
session指定JSP页面是否使用session。默认为true立即创建,false为使用时创建
pageEncoding指定JSP页面的解码格式
include指令
  • 语法:<%@ include file = “被包含的JSP路径”%>
  • 通过include指令来包含其他文件。
  • 被包含的文件可以是JSP文件、HTML文件或文本文件。包含的文件就好像是当前JSP文件的一部 分,会被同时编译执行(静态包含)。
<%@ include file="header.jsp"%>
...
...
<%@ include file="footer.jsp" %>
taglib指令

语法:<%@ taglib uri=“外部标签库路径” prefix=“前缀” %> 引入JSP的标准标签库

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>

动作标签

  • 语法:<jsp:action_name attribute=“value” />
  • 动作标签指的是JSP页面在运行期间的命令

include

  • 语法:<jsp:include page=“相对 URL 地址” />
  • <jsp:include >动作元素会将外部文件输出结果包含在JSP中(动态包含)。
属性描述
page包含在页面中的相对URL地址。
<%--页面包含标签(动态包含)--%>
<jsp:include page="head.jsp"></jsp:include>
<h1>这是当前页面的内容</h1>
<jsp:include page="foot.jsp"></jsp:include>

注意:前面已经介绍过include指令,它是将外部文件的输出代码复制到了当前JSP文件中。而这里的 jsp:include动作不同,是将外部文件的输出结果引入到了当前JSP文件中。

useBean

  • 语法:<jsp:useBean id=“name” class=“package.className” />
  • jsp:useBean 动作用来加载一个将在JSP页面中使用的JavaBean。
<jsp:useBean id="user" class="com.qf.pojo.User"></jsp:useBean>

在类载入后,我们可以通过 jsp:setProperty 和 jsp:getProperty 动作来修改和获取bean的属性。

setProperty

可以在jsp:useBean元素之后使用jsp:setProperty进行属性的赋值

属性描述
namename属性是必需的。它表示要设置属性的是哪个Bean。
propertyproperty属性是必需的。它表示要设置哪个属性。
valuevalue 属性是可选的。该属性用来指定Bean属性的值。
<jsp:setProperty name="user" property="name" value="张三"></jsp:setProperty>

getProperty

jsp:getProperty动作提取指定Bean属性的值,转换成字符串,然后输出。

属性描述
name要检索的Bean属性名称。Bean必须已定义。
property表示要提取Bean属性的值
<jsp:useBean id="user" class="com.qf.pojo.User"></jsp:useBean>
<jsp:setProperty name="user" property="name" value="张三"></jsp:setProperty>
<jsp:getProperty name="user" property="name"/>

forward

语法:<jsp:forward page=“相对 URL 地址” />

jsp:forward动作把请求转到另外的页面。

属性描述
pagepage属性包含的是一个相对URL。
<jsp:forward page="forward.jsp"></jsp:forward>

param

  • 语法:<jsp:param name=“” value=“”/>
  • 在转发动作内部使用,做参数传递
<jsp:forward page="forward.jsp">
<jsp:param name="name" value="cxk"/>
</jsp:forward>

内置对象【重点】

由JSP自动创建的对象,可以直接使用

对象名类型
requestjavax.servlet.http.HttpServletRequest
responsejavax.servlet.http.HttpServletResponse
sessionjavax.servlet.http.HttpSession
applicationjavax.servlet.ServletContext
configjavax.servlet.ServletConfig
exceptionjava.lang.Throwable
outjavax.servlet.jsp.JspWriter
pageContextjavax.servlet.jsp.PageContext
pagejava.lang.Object当前对象this

四大域对象

JSP有四大作用域对象,存储数据和获取数据的方式一样,不同的是取值的范围有差别

  • pageContext (javax.servlet.jsp.PageContext) 当前JSP页面范围
  • request (javax.servlet.http.HttpServletRequest) 一次请求有效
  • session (javax.servlet.http.HttpSession) 一次会话有效(关闭浏览器失效)
  • application (javax.servlet.ServletContext) 整个Web应用有效(服务器重启或关闭失效)

pageContext 对象

  • pageContext对象是javax.servlet.jsp.PageContext 类的实例,拥有作用域,用来代表整个JSP 页面。
  • 通过setAttribute(“name”,value);存储值
  • 通过getAttribute(“name”);获取值
  • 用于获取其他8个内置对象或者操作其他对象的作用域

pageContext获取其他内置对象

<!--
九大内置对象
request HttpServletRequest
response HttpServletResponse
session HttpSession
application ServletContext
pageContext PageContext
out JspWriter
config ServletConfig
page 当前jsp(类)对象
exception Exception
四大域对象(传递信息,存储数据)
setAttribute
getAttribute
removeAttribute
pageContext 在当前页面有效
request 一次请求内有效
session 一次会话(浏览器关闭之前)有效
application tomcat容器关闭之前有效
pageContext对象可以获取其他的八个内置对象
--%>

<!--
pageContext.getRequest();//返回request内置对象
pageContext.getResponse();//返回response内置对象
pageContext.getServletConfig();//返回config内置对象
pageContext.getException();//返回exception内置对象
pageContext.getPage();//返回page内置对象
pageContext.getOut();//返回out内置对象
pageContext.getServletContext();//返回application内置对象
pageContext.getSession();//返回session内置对象
-->

EL表达式

(Expression Language)【重点】

概念

EL使JSP写起来更简单、简洁。主要用于获取作用域中的数据

作用

用于替换作用域对象.getAttribute(“name”);

EL的应用

(获取基本类型、字符串)
  • ${scope.name} 获取具体某个作用域中的数据
  • ${name} 获取作用域中的数据,逐级查找(pageContext、request、session、application)
<%-- JSP语法获取域对象中的值 --%>
<%= request.getAttribute("name")%>
<%-- EL语法获取域对象中的值 --%>
${name}
<hr>
<%--
当多个域对象中的key相同时,EL表达式默认会从 application < session < request <
pageContext 顺序进行获取,如果都没有,就没有结果
当多个域对象中的key相同时,如果想要获取对应域对象中的内容,需要在前面添加对应的作用域范围
pageScope、requestScope、sessionScope、applicationScope
--%>
${name}
<hr>
${pageScope.name} ${requestScope.name} ${sessionScope.name}
${applicationScope.name}
EL和JSP脚本的区别
  • <%=request.getAttribute() %> 没有找到返回null
  • ${requestScope.name} 没找到返回""
(获取引用类型)

使用EL获取作用域中的对象调用属性时,只能访问对象的get方法,必须遵守命名规范定义

<%
User user = new User("cxk",30);
request.setAttribute("user",user);
%>
<%-- EL表达式获取对象中的内容 key.属性名 --%>
${user} ---> ${user.name} ---> ${user.age}
(获取数组、集合的元素)

EL可以获取数组、List、Map中的元素

<%
List<User> userList = new ArrayList<>();
userList.add(new User("zhangsan",30));
userList.add(new User("lisi",40));
request.setAttribute("userList",userList);
%>
<%-- EL表达式获取对象集合中的内容 key[下标].属性名--%>
${userList[0].name}---> ${userList[1].name}
<%
Map<String,String> map = new HashMap<>();
map.put("name","zhangsna");
map.put("age","30");
request.setAttribute("map",map);
%>
<%-- EL表达式获取Map集合中的内容 key[下标].属性名--%>
${map.name} ---> ${map.age}

EL的运算符

操作符描述
.访问一个Bean属性或者一个映射条目
[]访问一个数组或者链表的元素
+
-减或负
*
/ or div
% or mod取模
== or eq测试是否相等
!= or ne测试是否不等
< or lt测试是否小于
> or gt测试是否大于
<= or le测试是否小于等于
>= or ge测试是否大于等于
&& or and测试逻辑与
||or or测试逻辑或
! or not测试取反
empty测试是否空值

隐式对象

EL 表达式语言定义了11个隐式对象

隐含对象描述
pageScopepage 作用域
requestScoperequest 作用域
sessionScopesession 作用域
applicationScopeapplication 作用域
paramRequest 对象的参数,字符串
paramValuesRequest对象的参数,字符串集合
headerHTTP 信息头,字符串
headerValuesHTTP 信息头,字符串集合
initParam上下文初始化参数
cookieCookie值
pageContext当前页面的pageContext

JSTL标准标签库【重点】

现有问题

  • EL主要是用于作用域获取数据,虽然可以做运算判断,但是得到的都是一个结果,做展示。
  • EL不存在流程控制。比如判断。
  • EL对于集合只能做单点访问,不能实现遍历操作。比如循环。

什么是 JSTL

  • JSTL:全称Java Server Pages Standard Tag Library
  • JSP标准标签库(JSTL)是一个JSP标签集合。

JSTL的作用

  • 可对EL获取到的数据进行逻辑操作。
  • 与EL合作完成数据的展示。

JSTL使用步骤

  • 导入两个 jar 文件:standard.jar 和 jstl.jar 文件拷贝到 /WEB-INF/lib/ 下
  • 在JSP页面引入标签库
    • 核心标签库:<%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>
    • 格式化标签库:<%@ taglib uri=“http://java.sun.com/jsp/jstl/fmt” prefix=“fmt” %>

核心标签库

条件标签if判断
<!--语法:<c:if test ="条件"> < /c:if>-->
<c:if test="${age>18}">成年人</c:if>
<c:if test="${age<=18}">未成年人</c:if>
多条件choose判断
<!--语法:
<c:choose >
	<c:when test="条件1">结果1< /c:when>
	<c:when test="条件2">结果2< /c:when>
	<c:when test="条件3">结果3< /c:when>
	<c:otherwise >结果4< /c:otherwise>
 < /c:choose>
-->
<c:choose>
<c:when test="${price<1000}">贵</c:when>
<c:when test="${price<2000}">很贵</c:when>
<c:when test="${price<3000}">非常贵</c:when>
<c:otherwise>超级贵</c:otherwise>
</c:choose>
迭代foreach标签
<!--语法:遍历集合数组等-->
<!--
items:要遍历的集合
var: 遍历项
begin: 遍历开始下标
end: 遍历结束下标
step: 遍历的步长
varStatus:遍历的状态 index表示下标
--%>
<c:forEach items="${userList}" var="user" begin="0" end="${userList.size()}"
step="1" varStatus="status">
<tr>
<td>${user.name} ${status.index}</td>
<td>${user.age}</td>
</tr>
</c:forEach>

格式化标签库

<%
request.setAttribute("date",new Date());
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss"></fmt:formatDate>
  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我是二次元穿越来的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值