JSP
JSP(Java Server Pages) 和Servlet技术一样,用于开发动态web资源的技术
JSP实际上就是Servlet。
JSP = HTML + Java
HTML:静态内容
Servlet:适合编写Java逻辑代码 不适合写界面显示的部分
JSP:适合编写输出动态内容,但不适合编写Java逻辑
JSP原理(编译执行过程):
访问JSP页面时,JSP页面会被翻译成.java文件
然后.java文件会被编译成.class文件(字节码文件)
JSP的最佳写法:
JSP:界面、一些简单逻辑以及获取显示数据
Servlet:Java处理逻辑
JSP的基础语法
小脚本<% %>:里面可以正常书写Java代码
例如:获取当前系统的时间
<%
Date date = new Date();
out.write(date.toLocaleString());
%>
表达式<%= %>
<%
int num1 = 10;
out.print(num1);
%>
<!-- 相当于 out.print(num1) 并且可以运算 -->
<%=num1 %>
声明
<%!
// 加上叹号会被翻译到类的下面 也就是全局变量
// 还可以声明方法 静态块
int num2 = 10;
%>
<%
int num1 = 10;
num1++;
num2++;
%>
<%=num1 %>
<%=num2 %>
JSP注释: <%– 被注释的内容 –%> 特点:安全(不会再源码中显示)
网页注释:< ! - - html注释 - - > 特点:不安全
JSP指令
page
page(import)
import和Java代码中的import是一样的
例如:
导入多个包:
<%@ page import="java.util.Date,java.util.List"%>
或者 分开写:
<%@ page import="java.util.Date"%>
<%@ page import="java.util.List"%>
JSP会自动导入以下的包:
import java.lang.*;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
page(session) 默认值是true 相当于session开关
<%@ page session="true" %>
page(errorPage) 如果页面中有错误,则跳转到指定的资源
page(isErrorPage): 是否创建throwable对象。默认是false;
<%@ page errorPage="/error.jsp" %>
<%
int num = 10/0;
%>
error.jsp:
<!-- 默认是关闭状态的 打开捕获异常信息的对象的创建 Throwable -->
<%@ page isErrorPage="true" %>
服务器正在紧张的建设当中..请稍后访问
<br>
<%
String msg = exception.getMessage();
out.print("错误信息:" + msg);
%>
page(contextType)等同于response.setContextType(“text/html;charset=utf-8”);
include
include指令: file指包含哪个页面
静态包含
<%@ include file="/4.jsp" %>
静态包含:在翻译成.java文件前就已经合成了页面
动态包含
<jsp:include page="/4.jsp"></jsp:include>
动态包含:代码逐行执行,当执行到动态包含的时候 才会去编译被包含的页面
动态包含会生成两套文件
原则:能用静就不用动的
taglib
taglib作用:在JSP页面中导入JSTL标签库 替换jsp中的java代码片段。
// prefix="c" 代表给jstl标签库中的标签 起个别名
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:if test=""></c:if>
需要导入的jar包:
jstl.jar
standard.jar
JSP动作
6个动作:
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值
useBean、setProperty、getProperty 配合使用
<%
// 创建一个User对象
User user = new User();
user.setName("sc");
user.setPwd("123");
out.print(user.getName());
%>
<br>
/*
* class:JavaBean的全限定类名
* id: 合法的Java变量名称,指明JavaBean对象的名称。
* JSP中可以使用该名称引用该JavaBean对象区分大小写
*/
<jsp:useBean id="user1" class="com.lanou3g.User"/>
// name 对象 property 属性
<jsp:setProperty property="name" name="user1" value="dp"/>
<jsp:setProperty property="pwd" name="user1" value="456"/>
<%=user.getName() %>
<br>
<jsp:getProperty property="name" name="user1"/>
<jsp:getProperty property="pwd" name="user1"/>
结果: sc
sc
dp 456
forward和param配合使用
<jsp:forward> 转发
<jsp:param> 携带参数相当于在网址后面拼接/2.jsp?username=sc&password=123
<!--携带请求的参数 不要在中间加注释-->
<jsp:forward page="/2.jsp">
<jsp:param value="sc" name="username"/>
<jsp:param value="123" name="password"/>
</jsp:forward>
<!--获取转发中的参数-->
<%= request.getAttribute("username") %>
<!--获取参数(是保存在参数中不是域中)-->
<%= request.getParameter("username") %>
<%= request.getParameter("password") %>
JSP内置对象
九个内置对象
request对象: 封装了来自客户端、浏览器的各种信息。
response对象:封装了服务器的响应信息。
session对象: 用来保存会话信息。也就是说,可以实现在同一用户的不同请求之间共享数
application对象:代表了当前应用程序的上下文。可以在不同的用户之间共享信息。
exception对象:封装了jsp程序执行过程中发生的异常和错误信息。
page对象:当前servlet实例 指向了当前jsp程序本身(this)
config对象:封装了应用程序的配置信息。
out对象:用于向客户端、浏览器输出数据。
pageContext对象:提供了对jsp页面所有对象以及命名空间的访问。 (指当前页面 域对象)
pageContext内置对象
查看pageContext中的方法
public void fun(PageContext pageContext) {
// 强大的pageContext可以获取任何域对象(从小到大)
pageContext.getRequest();
pageContext.getSession();
pageContext.getServletContext();
}
el表达式就依赖这个方法
测试pageContext域:
该域对象只在本页面有效,出了页面获取不到
例如:
<%
pageContext.setAttribute("page", "pageContext");
%>
<%=pageContext.getAttribute("page") %>
在2.jsp中就获取不到
<!-- 获取pageContext中的内容 -->
<%= pageContext.getAttribute("page") %>
域中的查找顺序
操作其它域对象的方法:
void setAttribute(String name,Object o,int Scope);
Object getAttribute(String name,int Scope);
void removeAttribute(String name,int Scope);
注意:一般系统方法中,需要一个int参数一般会是常量
只要有pageContext,就能向各个域中添加值(参数三表示对应域的常量)
scpoe的值:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
使用findAttribute(String name)方法
自动从page request session application依次查找,找到了就取值,结束查找。
例如:
pageContext.setAttribute("p", "pageContext", PageContext.PAGE_SCOPE);
pageContext.setAttribute("p", "request", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("p", "session", PageContext.SESSION_SCOPE);
pageContext.setAttribute("p", "application", PageContext.APPLICATION_SCOPE);
// 从小到大找
<%=pageContext.findAttribute("p") %>
EL表达式
el表达式是为了简化jsp中java代码开发
它不是一种开发语言,是jsp中获取数据的一种规范
容错性强,域中没有该值什么都不显示,不会显示null
使用el表达式获取域中的数据
实际上就是使用pageContext.findAttribute这个方法在域中查找的
${p }
使用el表达式获取域中保存的对象
<%
User user = new User();
user.setUsername("sc");
user.setPassword("123");
// 添加地址对象
Address address = new Address();
address.setCity("zh");
user.setAddress(address);
out.print(user);
request.setAttribute("u", user);
%>
<!--相当于调用get方法(前提必须有个体方法)-->
${u.username }
<!--JavaBean导航:通过get方法获取的,直接使用点-->
${u.address.city }
<!--使用[]获取值,注意:使用[]要加引号-->
${u["username"] }
${u['username'] }
注意:[]运算符 点能做的,它也能做;它能做的,点不一定能做
${student.name} == ${student['name']} == ${student["name"]}
使用el表达式获取域中保存的集合
<%
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
HashMap<String,String> map = new HashMap<>();
map.put("username", "sc");
map.put("password", "123");
request.setAttribute("l", list);
request.setAttribute("m", map);
%>
<!-- 如果是集合的话 只能使用[] -->
${l[0] }
${m.username }
${m['username'] }
empty判断空值
测试empty判断空值
空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
<%
String str1 = null;
String str2 = "";
String str3 = "jsadjas";
request.setAttribute("s1", str1);
request.setAttribute("s2", str2);
request.setAttribute("s3", str3);
ArrayList<String> list1 = new ArrayList<>();
list1.add("aaaa");
ArrayList<String> list2 = new ArrayList<>();
ArrayList<String> list3 = null;
request.setAttribute("list1", list1);
request.setAttribute("list2", list2);
request.setAttribute("list3", list3);
%>
<!-- 判断是否是空的,只要没有值就返回true -->
${empty s1 }
${empty s2 }
${empty s3 }
${empty list1 }
${empty list2 }
${empty list3 }
结果:true true false false true true
三目运算符
${empty list3 ? "我是前面的" : "我是后面的" }
html中测试三目运算符
<%
String sex = "女";
request.setAttribute("s", sex);
%>
<!--根据域中的值默认选择男女-->
<input type="radio" name="sex" value="男" ${s == "男" ? "checked ='checked'" : "" }>男
<input type="radio" name="sex" value="女" ${s == "女" ? "checked ='checked'" : "" }>女
EL表达式的隐式对象
pageContext(对象)
pageScope
requestScope
sessionScope
applicationScope
param ${param.userName } = request.getParamemter("userName");
paramValues
header ${header["User-agent"]}
headerValues
cookie ${cookie.JSESSIONID.value } 测试不加value
测试隐式对象(可以直接在el表达式中使用)
<%
pageContext.setAttribute("p", "pageContext", PageContext.PAGE_SCOPE);
pageContext.setAttribute("p", "request", PageContext.REQUEST_SCOPE);
pageContext.setAttribute("p", "session", PageContext.SESSION_SCOPE);
pageContext.setAttribute("p", "application", PageContext.APPLICATION_SCOPE);
%>
${pageScope.p }
${requestScope.p }
${sessionScope.p }
${applicationScope.p }
pageContext代表对象可以使用方法
<!--${pageContext.request.contextPath }代表工程路径-->
<form action="${pageContext.request.contextPath }/9.jsp" method="post">
账号<input type="text" name="username"><br>
密码<input type="password" name="passowrd"><br>
爱好<input type="checkbox" name="hobby" value="篮球">篮球
<input type="checkbox" name="hobby" value="唱歌">唱歌<br>
<input type="submit" value="提交">
</form>
9.jsp:
<%
<!--处理乱码-->
response.setContentType("text/html;charset=UTF-8");
request.setCharacterEncoding("UTF-8");
%>
<!--获取参数(相当于调用了getParameter()方法)-->
${param.username }
<!--获取多个参数-->
${paramValues.hobby[0] }
<!--获取请求头-->
${header["User-Agent"] }
<!--获取cookie中的值-->
${cookie.JSESSIONID }
<!--获取SessionID-->
${cookie.JSESSIONID.value }
JSTL
什么是JSTL?
JSTL是JSP的标准标签库
JSTL的作用
使用JSTL实现JSP页面中逻辑处理。如判断、循环等
使用JSTL需要JSP页面添加taglib指令,添加核心库
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
导入jar包:
jstl-1.2.jar
standard-1.1.2.jar
通用标签
set out remove
<!-- 声明一个变量 默认是放在page域中 -->
<c:set var="num" value="10" scope="session"></c:set>
<!-- 相当于直接输出到网页上 out对象一样 -->
<c:out value="${num }" default="aaa"></c:out><br>
${num }<br>
<!-- 删除 -->
<c:remove var="num" scope="session"/>
${num }
条件标签
if choose
<!-- 声明变量 -->
<c:set var="n" value="10"></c:set>
<!-- 逻辑表达式 if choose -->
<c:if test="${n<5 }">aaa</c:if>
<c:if test="${n>5 }">bbb</c:if>
<c:choose>
<c:when test="${n==5 }">5</c:when>
<c:when test="${n==10 }">10</c:when>
<c:otherwise>yyy</c:otherwise>
</c:choose>
迭代标签
foreach
<!-- 循环 step循环增量 -->
<c:forEach var="i" begin="0" end="10" step="2">
${i }<br>
</c:forEach>
<%
ArrayList<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
list.add("ddd");
list.add("eee");
request.setAttribute("list", list);
%>
<!-- items 要遍历的容器 var表示容器中的对象 -->
<c:forEach items="${list }" var="l" step="2">
${l }<br>
</c:forEach>
foreach动态生成表格
<table border="1">
<tr>
<th>值</th>
<th>索引</th>
<th>计数</th>
<th>第一个元素</th>
<th>最后一个元素</th>
</tr>
<c:forEach items="${list }" var="l" varStatus="vs" >
<tr>
<td>${l }</td>
<td>${vs.index }</td>
<td>${vs.count }</td>
<td>${vs.first }</td>
<td>${vs.last }</td>
</tr>
</c:forEach>
</table>