JSP介绍
JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术。JSP实际上就是Servlet。
jsp = html + java
html:静态内容
servlet:适合编写java逻辑代码
jsp:适合编写输出动态内容,但不适合编写java逻辑。
Jsp 原理(编译执行过程)
试写一个获取当前系统时间的 jsp
JSP基础语法
1.html 标签
2.
小脚本 <% java代码 %>
表达式 <%= 2+3 %>
声明 <%! %> 表示在类中定义全局成员,和静态块。
JSP注释
JSP注释:<%-- 被注释的内容 --%> 特点:安全,省流量
网页注释: 特点:不安全,费流量
JSP的三个指令
page
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.*;
session 默认值是true
errorPage: 如果页面中有错误,则跳转到指定的资源。
isErrorPage: 是否创建throwable对象。默认是false;
contextType: 等同于response.setContextType("text/html;charset=utf-8");
Include
静态包含:把其它资源包含到当前页面中。
<%@ include file="/include/1.jsp" %>
动态包含:
include page="/include/1.jsp">include>
两者的区别:翻译的时间段不同
前者:在翻译时就把两个文件合并
后者:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
原则:能用静的就不用动的。
taglib
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
需要导入 jar 包
jstl.jar standard.jar
https://mvnrepository.com/
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSP的6个动作
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值
JSP的9个内置对象
request
response
session
application
exception
page 当前servlet实例 this
config
out
pageContext 指当前页面 域对象 然并卵
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
pageContext
pageContext 该对象只在本页面有效 出了页面获取不到
pageContext可以向各个域中添加值
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表达式获取域中的值:
${p}
${} 就代表<%= pageContext.findAttribute() %>
JSP动作标签
转发:
<jsp:forward page="要转发的页面路径">
<jsp:param value="参数值" name="参数名" />
jsp:forward>
因为不是存入域中的值 所以使用获取参数的方法就可以得到
<%=request.getParameter("参数名") %>
el表达式
el表达式 容错性强 并且域中没有该值
就什么都不显示 不会显示null 也不会崩溃
el表达式中的 pageContext就真的代表对象 可以使用方法
el表达式获取对象中的值
域中保存对象 使用el表达式获取
创建一个用户类 一个地址类 地址添加到 对象类中 作为对象
<%
User user = new User()
user.setUsername("小明")
user.setPassword("123")
// 添加地址对象
Address address = new Address()
address.setCity("CHINA")
user.setAddress(address)
out.print(user)
request.setAttribute("u", user)
%>
// 相当于调用的是 get方法 前提是 对象类中 有get方法
// 相当于user.getUserName()
${u.username}
user对象中的address也是个对象
JavaBean导航 通过调用get方法 获的 直接使用 点
${u.address.city }
el表达式获取集合中的值
如果想要获取的是一个集合
例如:
<%
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
request.setAttribute("l", list);
HashMap<String,String> map = new HashMap<>();
map.put("a", "aa");
map.put("b", "bb");
map.put("c", "cc");
map.put("d", "dd");
map.put("e", "ee");
request.setAttribute("m", map);
%>
${l[1] }
// 如果是map 那么两种都可以
// 这里单引号和双引号都可以
${m.d }
${m['d'] }
el表达式判断空值
<%
String str1 = null;
request.setAttribute("str1", str1);
String str2 = "";
request.setAttribute("str2", str2);
ArrayList<String> list1 = new ArrayList<>();
list1.add("aaa");
request.setAttribute("list1", list1);
ArrayList<String> list2 = new ArrayList<>();
request.setAttribute("list2", list2);
ArrayList<String> list3 = null;
request.setAttribute("list3", list3);
%>
// 判断是否是空的 只要没有值 返回的就是true
${empty str1}
${empty str2}
// 判断集合中指向空 和 不添加值 返回的也是true
${empty list1}
${empty list2}
${empty list3}
只要判断的表达式没有内容 那么 返回的就都是true
el表达式支持三目运算符
ArrayList<String> list3 = null;
request.setAttribute("list3", list3);
${empty list3 ? "我是前面的" : "我是后面的" }
隐式对象可以直接在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}
JSTL表达式
JSTL表达式需要导包 tablib
还需要在JSP页面添加导包语句
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
JSTL表达式 实际上就是处理JSP页面上的逻辑处理
通用标签 set out remove 声明的便利默认是放在page域中
<c:set var="num" value="10" scope="session">c:set>
<c:out value="${num }">c:out>
// 和上面的 是一样的
${num }
<c:remove var="num" scope="session" />
${num }
逻辑表达式 if choose
<c:set var="n" value="10">c:set>
<c:if test="${n < 5 }">
aaa
c:if>
<c:if test="${n > 5 }">
bbb
c:if>
<c:choose>
<c:when test="${n == 5 }">5c:when>
<c:when test="${n == 10 }">10c:when>
<c:otherwise>
xx
c:otherwise>
c:choose>
循环
//step 循环增量
<c:forEach var="i" begin="0" end="10" step="1">
${i }
c:forEach>
<%
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("f");
request.setAttribute("list", list);
%>
// items 表示你要便器的容器 var表示容器中的对象
<c:forEach var="i" items="${list }" step="2">
${i }
c:forEach>
<table border="1">
<tr>
<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>
tr>
c:forEach>
table>
设计模式
1.Model1模式
JSP + JavaBean <jsp:useBean/> 模式
2.Model2模式 (模拟MVC模式) MCV: M:Model(数据模型) V:View(视图页面) C:Controller(控制器)
JSP(页面和展示数据) + servlet(逻辑处理) + JavaBean(实体类) 模式
Model2模式大概图