JSP全称是Java Server Pages
它和servle技术一样 都是SUN公司定义的一种
用于开发动态web资源的技术。JSP实际上就是Servlet。
jsp = html + java
html:静态内容
servlet:适合编写java逻辑代码 不适合写界面显示的部分
jsp:适合编写输出动态内容,但不适合编写java逻辑。
<!--jsp原理 -->
<!--访问jsp页面时,jsp页面会被翻译成.java文件;然后.java会被编译.class文件(字节码文件) -->
<body>
<%
//正常写java代码
//获取当前系统时间
Date date = new Date();
out.print(date.toLocaleString());
%>
JSP注释
JSP注释:<%– 被注释的内容 –%> 特点:安全
网页注释: 特点:不安全
jsp的基础语法
1.html 标签
2.
小脚本 <% java代码 %>
表达式 <%= 2+3 %>
声明 <%! %> 表示在类中定义全局成员,和静态块。
<%!
//加上!会被翻译到类的下边,也就是全局变量
//还可以声明方法,静态块
int num2 = 10;
%>
<%
//测试session开关
session.getAttribute("sdfsf");
int num1 = 10;
num1++;
num2++;
//out.print(num1);
%>
<!-- 相当于out.print(num1) 并且可以运算 -->
<!-- 表达式 -->
<%=num1 %>
<%=num2 %>
jsp的3个指令
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
<!--默认是true,相当于一个开关 -->
<%@page session="true" %>
errorPage: 如果页面中有错误,则跳转到指定的资源。
<%@ page errorPage="/error.jsp" %>
isErrorPage: 是否创建throwable对象。默认是false;
contextType: 等同于response.setContextType(“text/html;charset=utf-8”);
Include
<!-- include指令 file指包含哪个页面
静态包含:在翻译成.java文件前,就已经合成了页面
动态包含:先翻译成.java文件
两者的区别:翻译的时间段不同
静态:在翻译时就把两个文件合并
动态:不会合并文件,当代码执行到include时,才包含另一个文件的内容。
代码逐行执行,当执行到动态包含时,才会去编译被包含的页面,这样会生成两套页面
-->
<%--@include file="/4.jsp" --%>
<!-- 动态包含 -->
<%-- <jsp:include page="/4.jsp"></jsp:include> --%>
<!-- 原则:能用静的就不用动的 -->
taglib
<!-- taglib标签
作用:在JSP页面中导入JSTL标签库。替换jsp中的java代码片段。
需要导入 jar 包
jstl.jar standard.jar
https://mvnrepository.com/
prefix="c" 表示给jstl标签库中的标签起一个别名-->
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<body>
<c:if test=""></c:if>
</body>
jsp的6个动作
<jsp:include > 动态包含
<jsp:forward> 请求转发
<jsp:param> 设置请求参数
<jsp:useBean> 创建一个对象
<jsp:setProperty> 给指定的对象属性赋值
<jsp:getProperty> 取出指定对象的属性值
<body>
<%
//创建一个User对象
User user = new User();
user.setName("zs");
user.setPwd("123");
out.print(user.getName());
%>
<br/>
<jsp:useBean id="user1" class="com.lanou3g.User"/>
<jsp:setProperty property="name" name="user1" value="dp"/>
<jsp:setProperty property="pwd" name="user1" value="456"/>
<%=user1 %>
<br/>
<jsp:getProperty property="name" name="user1"/>
</body>
jsp的9个内置对象
request
该对象封装了用户提交的信息,通过调用该对象相应的方法可以获取封装的信息,
即使用该对象可以获取用户提交信息。 客户端的请求参数都被封装到这个对象里面
response
对客户的请求做出动态的响应,向客户端发送数据
session
application
exception 异常处理
page 当前servlet实例 this
config
out
out 对象是一个输出流,用来向客户端输出数据。out对象用于各种数据的输出
pageContext 指当前页面 域对象
<!-- 测试pageContext域 -->
<%
/*该域对象,只在本页面有效,出了页面获取不到*/
pageContext.setAttribute("page", "pageContext");
%>
<%=pageContext.getAttribute("page") %>
<!-- jsp动作标签---转发
携带参数相当于在网址后进行拼接
/2.jsp?username=zs&password=123
-->
<!-- 携带请求的参数
不要在中间加注释
-->
<jsp:forward page="/2.jsp">
<jsp:param value="zs" name="username"/>
<jsp:param value="123" name="password"/>
</jsp:forward>
<!-- 获取pageContext中的内容 -->
<%=pageContext.getAttribute("page") %>
<!-- 获取转发中的参数 -->
<%-- 是保存在参数中而不是域中 --%>
<%=request.getParameter("username") %>
<%=request.getParameter("password") %>
scpoe的值
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
<!-- 测试域中的查找顺序 -->
<%
/*一般系统方法中,需要一个int参数,一般会是常量*/
/*向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表达式获取域中的数据 报错就重新粘贴一下 -->
<!-- 实际上就是使用pageContext.findAttribute这个方法在域中查找的 -->
${p}
findAttribute(String name);
自动从page request session application依次查找,找到了就取值,结束查找。
//查看pageCountext中的方法
public void fun(PageContext pageContext) {
//强大的PageContext可以获取任何域对象
//从小到大
pageContext.getRequest();
pageContext.getSession();
pageContext.getServletContext();
//强大的方法(el表达式就依赖这个方法)
//该方法会搜索所有域对象,用key去取值
//按域的大小,从小到大进行搜索,找到就输出对应value
//request < session < context 这个顺序搜索
pageContext.findAttribute("key");
}
实际开发使用的域对象
PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息
ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用。
EL表达式
expression language 表达式语言
要简化jsp中java代码开发。
它不是一种开发语言,是jsp中获取数据的一种规范
<!-- 域中保存对象使用el表达式获取 -->
<%
User user = new User();
user.setUsername("zs");
user.setPassword("123");
//添加地址对象
Address address = new Address();
address.setCity("zh");
user.setAddress(address);
//out.print(user);
request.setAttribute("u", user);
%>
<!-- 相当于调用了get方法,前提必须有get方法 -->
${u.username }
<!-- javaBean导航 通过调用get方法获取-->
${u.address.city }
<!-- 使用[]获取值 -->
<!-- 注意 使用[] 要加引号 -->
<!-- 如果域中保存的是个集合 怎么获取 -->
${u["username"] }
${u[username] }
<!-- 创建一个list集合和Map集合 添加几个值 -->
<%
ArrayList<String> list = new ArrayList<>();
list.add("123");
list.add("abc");
request.setAttribute("list", list);
HashMap<String,String> map = new HashMap();
map.put("a", "aaa");
map.put("b", "bbb");
map.put("c", "ccc");
request.setAttribute("map", map);
%>
<!-- 如果是集合的话,只能使用[] -->
${list[0] }
${map.a }
${map['a'] }
empty
判断null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true
<!-- 使用el表达式判断empty空值 -->
<%
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);
/*测试三目运算符*/
String sex = "nv";
request.setAttribute("s", sex);
%>
<!-- 判断是否为空 只要没有值就返回true-->
${empty str1 }
${empty str2 }
${empty list1 }
${empty list2 }
${empty list3 }
<!-- 支持三目运算符 -->
${empty list3 ? "我是前面的":"我是后面的" }
<br/>
<!-- 根据域中的值来默认选中的男女 -->
<input type="radio" value="nan" name="sex" ${s == "nan" ? "checked='checked'":"" }>男<br>
<input type="radio" value="nv" name="sex" ${s == "nv" ? "checked='checked'":"" }>女<br>
EL表达式 的隐式对象
<!-- 测试隐式对象 可以直接在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 }
<!-- 容错性强,并且域没有该值,什么都不显示,不会显示null -->
<!-- el表达式中的 pageContext 就真的代表对象,可以使用方法 -->
<!-- 隐式对象 -->
<form action="${pageContext.request.contextPath }/9.jsp" method="post">
用户名:<input type="text" name="username"><br><br>
密码: <input type="text" name="password"><br><br>
爱好: <input type="checkbox" name="hobby" value="唱歌">唱歌
<input type="checkbox" name="hobby" value="篮球">篮球<br><br>
<input type="submit" value="提交">
</form>
<%
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
%>
<!-- 用el表达式获取请求中的参数 -->
<!-- 相当于调用了getParameter() -->
${param.username }
${paramValues.hobby[0] }
<!-- 取请求头 -->
${header["User-Agent"] }<br>
<!-- 取cookie中的值 -->
${cookie.JSESSIONID }
JSTL
JSTL(JavaServerPages Standard Tag Library)JSP标准标签库
JSTL的作用
使用JSTL实现JSP页面中逻辑处理。如判断、循环等。
使用JSTL
需要在JSP页面添加taglib指令 添加核心库
<!-- JSTL表达式需要导包 -->
<%@ 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>
<!-- 相当于直接输出到网页上 out对象一样 -->
<c:out value="${num}" default="xxx"></c:out>
${num}<br>
<!-- 删除 -->
<c:remove var="num" scope="session"/>
${num}
条件标签:if choose(没有 else)
<!-- 声明变量 -->
<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>
no
</c:otherwise>
</c:choose>
迭带标签: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 var="l" items="${list }" step="2">
${l }<br>
</c:forEach>
<!--循环 step循环增量-->
<c:forEach var="i" begin="0" end="10" step="1">
${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);
%>
<!-- 值 索引 计数 第一个元素 最后一个元素 -->
<table border="1">
<tr>
<th>值</th>
<th>索引</th>
<th>计数</th>
<th>第一个元素</th>
<th>最后一个元素</th>
</tr>
<c:forEach items="${list }" varStatus="vs" var="l">
<tr>
<td>${l }</td>
<td>${vs.index }</td>
<td>${vs.count }</td>
<td>${vs.first }</td>
<td>${vs.last }</td>
</tr>
</c:forEach>

JSP技术详解
1万+

被折叠的 条评论
为什么被折叠?



