JSP
JSP可以跟前端嵌套使用
基本语法
page指令:用于定义各种属性
- import用于导入包
- session:第一次访问jsp时创建session,默认为true
- buffer:设置输出数据的缓存大小,默认8kb
- errorPage:如果页面有错误可以跳转到指定资源
errorPage="/uri"
,斜杠用于服务器,表示项目根目录 - isErrorPage:是否创建throwable对象,默认false;true表示该页面是错误页面
- contentType:服务器发送客户端的内容编码
- pageEncoding:页面本身编码
- isELIgnore:是否支持El表达式,默认false表示支持
include指令:包含另外的页面
静态包含:
<!-- 在服务器的文件不会出现被包含文件,效率较高 -->
<%@include file = "文件名"%>
动态包含:
<!-- 在服务器会生成文件 -->
<jsp:include page="/文件名"></jsp:include>
tablib指令
在jsp页面中导入JSTL
标签库,替换jsp中的java代码
<%@ taglib uri="url"%>
<%--page用于定义JSP页面的各种属性--%>
<%@ page import="java.util.Date" %>
<%@ page import="java.text.DateFormat" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>第一个jsp页面</title>
</head>
<body>
欢迎使用jsp技术
<!--脚本-->
<%
//嵌套java代码
int num = 10;
Date date = new Date();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
String now = df.format(date);
//输出,jsp内置了一个out用于输出网页内容
out.print(num+"<br/>");
out.print(now+"<br/>");
for (int i = 0; i < 10; i++) {
out.print("有点像php了小老弟<br/>");
}
%>
<%--jsp注释--%>
<%--脚本表达式--%>
<%--直接打印--%>
<%=num%><br>
<%=now%><br>
<%--声明语法--%>
<%!
public String letterToUpper(String s){
String result = Character.toUpperCase(s.charAt(0))+s.substring(1);
return result;
}
%>
<%
String s = letterToUpper("hello");
out.print(s+"<br/>");
%>
<%
out.print("这个输出在后面");//写入缓冲区,没有直接放到response中
response.getWriter().write("这个先输出");//直接放在response中
%>
</body>
</html>
out和response的区别:
- out为
JspWriter
类型,response.getWriter()是PrintWriter
类型 - out的输出会放入缓存中,response.getWriter()直接放入response中
- servlet使用后者,jsp中使用前者
JSP的6个动作标签
include
:包含forward
:转发
<jsp:forward page="/xxx.jsp"></jsp:forward>
param
:请求参数设置
<jsp:param value="值" name="key"/>
useBean
:创建一个对象setProperty
:设置属性值getProperty
:获取属性值
<!-- 创建对象 -->
<jsp:useBean id="user" class="com.xm.domain.User"></jsp:useBean>
<!-- 赋值 -->
<jsp:setProperty property="username" name="user" value="xm"/>
<jsp:setProperty property="password" name="user" value="xxx"/>
<!-- 获取值,会在页面直接输出 -->
<jsp:getProperty property="username" name="user"/>
JSP九大内置对象
- request
- response
- session
- application
- config
- exception
- out
- pageContext
- page
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>JSP九大内置对象</title>
</head>
<body>
<%
//request对象
out.print(request.getRequestURL()+"<br>");
out.print(request.getContextPath()+"<br>");//相对路径
//response对象
response.getWriter().write("最先输出"+"<br>");
//session对象
session.setAttribute("username","xxx");
//application对象(上下文)
application.setAttribute("count",0);
//config配置对象
//out对象输出
//exception异常类
//pageContext页面上下文 可以获取其他八个对象 可以作为容器
pageContext.setAttribute("age",18);
pageContext.getAttribute("age");
//获取其他三个域(容器)的数据(request,session,application)
pageContext.findAttribute("usename");//寻找顺序:pageContext,request,session,application
//向其他容器存放数据
pageContext.setAttribute("age",18,PageContext.APPLICATION_SCOPE);
pageContext.setAttribute("age",18,PageContext.SESSION_SCOPE);
pageContext.setAttribute("age",18,PageContext.REQUEST_SCOPE);
pageContext.setAttribute("age",18,PageContext.PAGE_SCOPE);
//转发和包含
pageContext.forward("firstjsp.jsp");
pageContext.include("/firstjsp.jsp");//动态包含
//page当前对象(当前Servlet实例)
%>>
</body>
</html>
四个域对象
域对象即为容器,可以存放属性值,分别是request,session,application,pageContext,其中pageContext的范围最小,作用于只能在当前页面访问,但可以获取其他三个域对象的内容
从引用范围上来说,从小到大分别为:pageContext,request,session,application
pageContext适合在一个页面上使用,request适合在同一请求中,session适合同一会话中,application适合所有用户中,在实际使用时尽量用小范围的
EL表达式
是jsp中获取数据的一种规范,代替脚本表达式,EL表达式获取数据都是从域里面获取
EL的几种用法:
- 输出数据
- 输出对象
- 输出集合
- 执行运算
- 使用
empty
关键字判断是否为空(空引用,空字符串)
<%@ page import="com.xm.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL表达式</title>
</head>
<body>
<%
//el读取数据之前需要先把数据放入域里
pageContext.setAttribute("username","apple");
request.setAttribute("age",6);
session.setAttribute("address","American");
application.setAttribute("email","123123123");
User user = new User("patota","123","163");
session.setAttribute("user",user);
List<String> list = new ArrayList<>();
list.add("apple");
list.add("huawei");
list.add("xiaomi");
list.add("oppo");
list.add("vivo");
request.setAttribute("list",list);
HashMap<String,String> map = new HashMap<>();
map.put("phone","xiaomi");
map.put("computer","asus");
request.setAttribute("map",map);
%>
<%--输出--%>
<%=pageContext.getAttribute("username")%>
<%--使用el表达式输出--%>
<%--可以省略前面的内容,不省略表示指定在哪里找,省略的话按照域范围从小到大找--%>
<%--输出变量--%>
${pageScope.username}<br>
${requestScope.age}<br>
${sessionScope.address}<br>
${applicationScope.email}<br>
<%--输出对象--%>
${user}<br>
${user.username}<br>
<%--输出集合--%>
${list[0]}<br>
${list[1]}<br>
${map.phone}<br>
${map.computer}<br>
<%--对于key是数字的时候,只能用下面这种写法--%>
${map["phone"]}<br>
${map["computer"]}<br>
<%--执行运算--%>
${1+2}<br>
${10/5}<br>
${1==1}<br>
${"xzm" == "mzx"}<br>
${10>5?"nice":"emmm"}<br>
<%--使用empty关键字--%>
${empty user}<br>
${empty hello}
</body>
</html>
EL隐士对象(11个)
pageContext
:页面上下文,可以获取其他八个内置对象pageScope
requestScope
sessionScope
applicationScope
:容器集合param
:从request里面取数据,相当于request.getParameter()paramValues
:将获取到的值存到数组里,相当于request.getParameterValues()header
:获取请求头,相当于request.getHeader()headerValues
:将请求头的值存到数组里,相当于request.getHeaderValues()cookie
:获取cookie,相当于request.getCookies()initParam
:获取初始化参数,需要先在web.xml中写出来
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>EL11个隐士对象</title>
</head>
<body>
<%--1. pageScope requestScope sessionScope applicationScope--%>
<%--2. pageContext--%>
${pageContext.request.contextPath}<br>
${pageContext.session}<br>
${pageContext.servletContext}<br>
<%--3. param--%>
${param.username}<br>
<%--4. paramValues--%>
${paramValues.hobby[0]}<br>
${paramValues.hobby[1]}<br>
<%--5. header--%>
${header.accept}<br>
${header["accept-Encoding"]}<br>
<%--6. cookie--%>
${cookie.JSESSIONID.value}<br>
</body>
</html>
JSTL通用标签
实现jsp中的逻辑处理,使用前需要先下载JSTL库,要放入web下的lib目录
使用前在JSP中需要先声明
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
只要有一下几个通用标签
set
:设置变量标签,默认放入pageContext中,可以指定放入的域
<c:set var="username" value="可以用了吗"></c:set>
<c:set var="age" value="可以用了" scope="request"></c:set>
<%--为对象的属性赋值--%>
<jsp:useBean id="user" class="com.xm.domain.User"></jsp:useBean>
<c:set property="name" target="${user}" value="Test"></c:set>
${username}<br>
${requestScope.age}<br>
${user.name}<br>
out
:输出标签
<c:out value="${age}" default="6"></c:out><br>
<c:out value="${email}" default="aaa@a.com"></c:out><br>
<%--默认为true,不会输出成html标签,false会按照html、css、js等编码输出--%>
<c:out value="<h1>标题</h1>" escapeXml="false"></c:out>
<c:out value="<script type='text/javascript'>while(true){alert('恶搞你')}></script>" escapeXml="false"></c:out><br>
remove
:移除标签,从四个域中删除,可以指定删除域
<c:remove var="username" scope="request"></c:remove>
${username}
if
:条件判断
<c:if test="${10>5}">
10>5没错
</c:if><br>
choose
:类似于switch,case
<c:set var="scope" value="90">
</c:set>
<c:choose>
<c:when test="${scope>=90}">优秀</c:when>
<c:when test="${scope>=80}">良好</c:when>
<c:when test="${scope>=70}">一般</c:when>
<c:when test="${scope>=60}">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
foreach
:遍历
<c:forEach var="i" begin="0" end="10" step="2">
${i}<br>
</c:forEach>
<%
List<String> list = new ArrayList<>();
list.add("China");
list.add("England");
list.add("Singapore");
pageContext.setAttribute("list",list);
%>
<c:forEach var="s" items="${list}" varStatus="vs">
值:${s}---状态:${vs.index},${vs.count}<br>
</c:forEach>