JSP 学习
JSP 概述
- jsp(Java Server Page) = java + html
- JSP 实际就是 Servlet
- HTML:静态内容
- Servlet:服务端的小应用程序。适合编写java逻辑代码
- JSP:适合编写输出动态内容,但不适合写Java逻辑
- 测试代码
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
Date date = new Date();
SimpleDateFormat dataFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
out.print(dataFormat.format(date));
%>
</body>
</html>
JSP 的原理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B4K6t3d2-1569499159941)(https://i.loli.net/2019/05/08/5cd2fb376b3a1.png)]
- 服务器不执行HTML代码,全部返回给浏览器执行,服务器只执行JAVA代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UVd8MbqT-1569499159954)(https://i.loli.net/2019/05/09/5cd3731df00cc.png)]
JSP 的最佳实践
- Servlet: 控制器。重点写JAVA逻辑代码(获取表单数据,处理业务逻辑、分发转向)
- JSP: 代码显示模板。重点在于显示数据
- 使用JSP编写服务器逻辑代码的鸡肋 ----- 登陆注销
- 目录结构
- login.jsp
<%--
Created by IntelliJ IDEA.
User: JJR
Date: 2019/5/9 0009
Time: 8:34
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
try{
out.write((String) request.getSession().getAttribute("msg"));
} catch (Exception e){
out.write("请登录");
}
%>
<form action="dologin.jsp" method="post">
用户:<input type="text" name="username"/><br />
密码:<input type="password" name="password" /><br />
<input type="submit" value="登陆" />
</form>
</body>
</html>
- logout.jsp
<%--
Created by IntelliJ IDEA.
User: JJR
Date: 2019/5/9 0009
Time: 9:08
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
request.getSession().invalidate();
request.getRequestDispatcher("/index.jsp").forward(request,response);
%>
- dologin.jsp
<%--
Created by IntelliJ IDEA.
User: JJR
Date: 2019/5/9 0009
Time: 8:38
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//获取表单数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//处理业务逻辑
if("12138".equals(username) && "12138".equals(password)){
//登陆成功
request.getSession().setAttribute("user", username);
request.getRequestDispatcher("/success.jsp").forward(request, response);
}else {
request.getSession().setAttribute("msg", "用户名或密码错误");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
//分发转向
%>
- success.jsp
<%--
Created by IntelliJ IDEA.
User: JJR
Date: 2019/5/9 0009
Time: 8:43
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
欢迎您:<%
out.write((String) request.getSession().getAttribute("user"));
%>
<a href="index.jsp">首页</a>
</body>
</html>
- index.jsp
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<%
try{
out.write((String) request.getSession().getAttribute("user"));
%>
<a href="logout.jsp">注销</a>
<%
} catch (Exception e){
%>
<a href="login.jsp">登陆</a>
<%
}
%>
</body>
</html>
JSP 的基本语法
-
JSP 模板元素
- 网页静态内容 — HTML标签和文本
-
JSP 的脚本
- 小脚本 — <% JAVA 代码 %>
- 表达式 — <%=2+3 %> 等价于 out.print(2+3);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sPmeQhmk-1569499159957)(https://i.loli.net/2019/05/09/5cd381ff6ebe4.png)]
- 声明 — <%! %> 表示在类中定义全局变量和静态块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xhwPqGHt-1569499159962)(https://i.loli.net/2019/05/09/5cd384dc15d61.png)]
JSP 3个指令
page 指令
- 属性:
- session:是否会找到创建session对象;默认值为true.
- buffer:设置输出数据的缓存大小,默认为8KB,取值nono|8KB|size KB
- errorPage:如果页面出现错误,则跳转到指定的资源
errorPage="error.jsp"
- isErrorPage:是否创建throwable对象exception。默认是false
<%=exception.getMessage() %>
- contextType:等同于 response.setContextType(“text/html;charset=utf-8”);告诉浏览器按什么编码编译
- pageEncoding:告诉JSP引擎按什么编码编译
- isELIgnored:是否支持EL表达式。默认是false(支持)
- isThreadSafe:是否开启线程安全
include 指令(一般使用静态包含)
- 静态包含:把其他资源包含到当前界面中 — 转译前生成
<%@include file=“path” %>
- 动态包含:转译之后进行包含
<jsp:include page=“path”></isp:include>
<%--
Created by IntelliJ IDEA.
User: JJR
Date: 2019/5/9 0009
Time: 15:30
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<font size="50px" color="blue">
Hello, World
</font>
<br />
<%--静态包含--%>
<%@include file="index2.jsp" %>
<br />
<%--动态包含--%>
<jsp:include page="index2.jsp"></jsp:include>
</body>
</html>
taglib 指令
- 作用:在JSP页面中导入JSTL标签库。替换JSP内的Java代码片段
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
同时导入:jslt.jar和standard.jar
语法:
- <%@指令名称 属性1=“属性值1” 属性2=“属性值2” 属性3=“属性值3” %>
- 或者
- <%@指令名称 属性1=“属性值1” %>
- <%@指令名称 属性2=“属性值2” %>
JSP 6个动作
-
- 动态包含
<jsp:include>
- 动态包含
不带参数:
<jsp:include page="index2.jsp"/>
携带参数:
<jsp:include page="index2.jsp">
<jsp:param name="name" value="12138"/>
</jsp:include>
-
- 请求转发
<jsp:forward>
- 请求转发
-
- 设置请求参数
<jsp:param>
- 设置请求参数
- 示例代码
不带请求参数:
<jsp:forward page="index2.jsp"></jsp:forward>
带请求参数:
<jsp:forward page="index2.jsp">
<jsp:param name="name" value="admin"/>
<jsp:param name="pass" value="12138"/>
</jsp:forward>
-
- 创建对象
<jsp:useBean>
- 创建对象
-
- 给指定对象赋值
<jsp:setProperty>
- 给指定对象赋值
-
- 取出指定对象值
<jsp:getProperty>
- 取出指定对象值
- 示例代码
<!-- 创建UserBean 的对象 ub -->
<jsp:useBean id="ub" class="com.test.UserBean" scope="page"/>
<!-- 为ub的name属性赋值 -->
<jsp:setProperty name="ub" property="name" value="欧阳铁柱"/>
<!-- 读取ub的name属性值 -->
<jsp:getProperty name="ub" property="name"/>
JSP 9个内置对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9tTi98Rp-1569499159970)(https://i.loli.net/2019/05/09/5cd43e954db53.png)]
- 注1:pegeContext对象包含了Session、Servlet、request、response等多个对象
- 注2:标红(request、session、application、pageContext)为四大域对象(pageContext对象使用较少)
四大域对象:实际开发
- request
存放的数据在一次请求(转发)内有效.使用非常多
- session
存放的数据在一次会话内有效.使用较多,如:存放用户的登陆状态,购物车功能等.
- application
存放的数据在整个应用范围内有效,但是因为范围较大,尽量少使用.
- pageContext
存放数据在当前页面,使用的较少.
pageContext本身为域对象,同时它还可以操作其他三个域对象的数据
- 操作自己的方法:
- void setAttribute(String name, Object obj);
- Object getAttribute(String name);
- void removeAttribute(String name);
- 操作其他域对象的方法
- void setAttribute(String name, Object obj, int Scope);
- Object getAttribute(String name, int Scope);
- void removeAttribute(String name, int Scope);
- 注:Scope的取值:
- PageContext. PAGE_SCOPE
- PageContext.REQUEST_SCOPE
- PageContext.SESSION_SCOPE
- PageContext.APPLICATION_SCOPE
- findAttribute(String name);自动从page、request、application依次查找,找到就取值,结束查找。
- 注:pageContext只在当前页面有效
EL表达式
-
EL表达式:Expression Language 表达式语言,简化jsp内的代码开发,是jsp获取数据的一种规范
-
示例代码
<%--JSP 脚本--%>
<%=request.getAttribute("ub") %><br />
<%-- EL 表达式 --%>
${ub}
EL表达式的具体功能
- 获取数据
EL表达式只能获取存放在4个域对象的数据,对于 null 在页面显示为空白字符串
- '.'运算符相当于get方法 —
${user.name }
<=>user.getName()
- '[]'运算符,相对于 ‘.’ 运算符来说,更加强大(取集合,数组等)
${ub['name'] }
- 运算
- 判断是否为null : empty(空串、空集合) —
${empty isNull }
- 三元运算符 :
${empty isNull ? "该值为null" : "该值不为null" }
- 基本数学运算
- 隐式对象
- 操作域对象示例代码
${pageScope.text }
${pageContext.getAttribute("text") }
${requestScope.text }
${sessionScope.text }
${applicationScope.text }
- 获取表单数据的示例代码
- 取form表单内该属性名第一次的值
${param.表单属性名 }
- 取form表单所以出现该属性名的值 — 数组
${paramValues.username[0]}
- 操作Cookie
// 获取JSESSIONID 的值
${cookie.JSESSIONID.value}
// 获取JSESSIONID 的名称---JSESSION
${cookie.JSESSIONID.name}
JSTL (JSP标准标签库)
作用:使用JSTL实现JSP页面的逻辑处理
使用JSTL
- 在JSP 页面使用标签库
- 导入 jstl.jsr 和 standard.jar
- 在JSP 添加taglib指令
<%@taglib uri='http://java.sun.com/jsp/jstl/core' prefix='c' %>
- 通用标签:set、out、remove
<%-- 设置属性i的值--%>
<c:set var="i" value="欧阳铁柱" ></c:set>
<%-- 输出i的值,默认为"上官翠花"--%>
<c:out value="${i }" default="上官翠花"/>
<c:out value = "${i }">
default value
</c:out>
<%-- 删除属性i--%>
<c:remove var="i"/>
<%-- 输出i的值,默认为"上官翠花"--%>
<c:out value="${i }" default="上官翠花"/>
- 条件标签:if choose
- if
<c:if test="${5 > 3}">
aaaaa
</c:if>
- choose
<c:choose>
<c:when test="${i == 1}">1</c:when>
<c:when test="${i == 2}">2</c:when>
<c:when test="${i == 3}">3</c:when>
<c:otherwise>
没有
</c:otherwise>
</c:choose>
- 迭代标签: froEach
- 类似于fori循环 — for(int i = 0; i<10; i++){}
<c:forEach var="i" begin="1" end="10" step="2" >
${i}<br />
</c:forEach>
- 类似于forEach循环
<%
List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
list.add("6");
request.setAttribute("list", list);
%>
<c:forEach items="${list }" var="l">
${l}
</c:forEach>