JSP概述
-
JSP:简化Servlet设计,在HTML标签中嵌入Java代码,用来高效开发Web应用的动态网页
-
JSP文件在容器中会转换成Servlet执行,JSP是对Servlet的一种高级封装,本质还是Servlet
-
Tomcat会将JSP文件转换成Java代码,进而编译成.class文件运行,最终将执行结果通过response响应给客户端
JSP的使用
创建JSP
在web目录下,新建hello.jsp文件
普通脚本
直接在HTML代码中嵌入Java语句
<%
out.println("北极");
%>
声明脚本
声明全局变量和方法
<%!
private String name = "MAX";
public String getName() {
return name;
}
%>
输出脚本
<%=getName()%>
JSP注释
JSP注释不会被发送到浏览器中,也不会被编译,在网页查看源代码时查看不到JSP注释
<%-- 注释 --%>
JSP指令
用来设置与整个JSP页面相关的属性
定义页面的依赖属性
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="404.jsp"%>
<%@ page import="java.util.Map" %>
包含其它文件
<%@include file="header.jsp"%>
引入标签库的定义
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSP动作标签
创建User对象
<jsp:useBean id="user" class="com.robot.pojo.User"></jsp:useBean>
查看编译之后的.java文件,找到创建对象的地方
com.robot.pojo.User user = null;
user = (com.robot.pojo.User) _jspx_page_context.getAttribute("user", javax.servlet.jsp.PageContext.PAGE_SCOPE);
if (user == null){
user = new com.robot.pojo.User();
_jspx_page_context.setAttribute("user", user, javax.servlet.jsp.PageContext.PAGE_SCOPE);
}
为User对象赋值
<jsp:setProperty name="user" property="username" value="机器人"></jsp:setProperty>
<jsp:setProperty name="user" property="password" value="123456"></jsp:setProperty>
获取User属性值
用户名:<jsp:getProperty name="user" property="username"/>
密码:<jsp:getProperty name="user" property="password"/><br>
转发以及传递参数
两种传递 方式,因为中文会有乱码,所以需要设置编码
<%
request.setCharacterEncoding("utf-8");
%>
<jsp:forward page="index.jsp?address=beijing">
<jsp:param name="phone" value="15141958888"/>
</jsp:forward>
接收
<%
String address = request.getParameter("address");
String phone = request.getParameter("phone");
%>
<%=address%>
<%=phone%>
JSP九大内置对象
- request、response、session、application、config、exception、out、pageContext、page
四大域对象
pageContext
- 当前JSP页面范围,一旦跳转则失效,通过setAttribute(“name”, value)存储数据,getAttribute(“name”)获取值
- 可以获取其它八个内置对象或者操作其它对象的作用域,例如:pageContext.get
存储、获取数据
<%
// 存储值
pageContext.setAttribute("username", "admin");
%>
<%
// 获取值
Object username = pageContext.getAttribute("username");
out.println(username);
%>
操作其它域对象
<%
// 将数据存入request域中
pageContext.setAttribute("requestName", "requestData", PageContext.REQUEST_SCOPE);
%>
<%
// 获取request域中的数据
pageContext.getAttribute("requestName", PageContext.REQUEST_SCOPE);
%>
移除数据
<%
// 移除,在四个域中全都都查找一遍,将符合条件的全部删除掉
pageContext.removeAttribute("requestName");
// 移除,在指定的域中进行删除
pageContext.removeAttribute("requestData", PageContext.REQUEST_SCOPE);
%>
查找数据
<%
// 在四个域中进行查找
String requestData = (String) pageContext.findAttribute("requestData");
%>
request
- 一次请求有效,再次请求就无效了
Session
- 一次会话有效,只要不关闭浏览器,就有效,比如用户登录信息
application
- 所有用户共享的数据
原则:能用小的作用域,就不用大的作用域
EL表达式
主要用于获取作用域中的数据,用于替换域对象中的getAttribute(“name”);方法
使用
<%
// 先将数据存储到域中
request.setAttribute("name", "zbx");
%>
<%-- 获取值--%>
${name}
获取引用类型
<%
User user = new User("Robot", "123456");
pageContext.setAttribute("user", user);
%>
${user}<br/>
${user.username}<br/>
${user.password}<br/>
获取列表
<%
List<String> list = new ArrayList<>();
list.add("北极");
list.add("宇宙");
list.add("太阳");
list.add("月亮");
pageContext.setAttribute("list", list);
%>
${list}
${list[0]}
${list[1]}
${list[2]}
${list[3]}<br>
JSP脚本在没有找到数据的时候会输出null,EL表达式在没有找到数据的时候不会输出任何内容,如果在JSP脚本中发生数组越界等,会报异常,但是在EL表达式中不会
获取Map
<%
Map<String, String> map = new HashMap<>();
map.put("beijing", "北京");
map.put("shanghai", "上海");
map.put("666", "杭州");
pageContext.setAttribute("map", map);
%>
${map}
${map.get("beijing")}
${map.get("shanghai")}
${map["666"]}
JSTL
Java Server Pages Standard Tag Library,JSP标准标签库
可以对EL表达式获取的数据进行逻辑操作,完成数据展示
使用
先导入两个jar包,jstl.jar和standard.jar
然后在JSP页面中引用标签
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
赋值
<c:set var="username" value="robot" scope="page"></c:set>
可使用EL表达式直接获取到值
${username}
输出
<c:out value="使用out输出"></c:out>
<c:out value="${username}"></c:out><br>
if判断语句
<c:if test="${3>2}">
<c:out value="输入"></c:out>
</c:if>
forEach循环语句
<%
List<String> list = new ArrayList<>();
list.add("北极");
list.add("宇宙");
list.add("太阳");
list.add("月亮");
pageContext.setAttribute("list", list);
%>
<c:forEach var="l" items="${list}">
${l}
</c:forEach>
选择语句
<c:set var="score" value="2"></c:set>
<c:choose>
<c:when test="${score==1}">
<c:out value="is 1"></c:out>
</c:when>
<c:when test="${score==2}">
<c:out value="is 2"></c:out>
</c:when>
<c:otherwise>
<c:out value="is other"></c:out>
</c:otherwise>
</c:choose>