JSP介绍
全称: Java Server Pages,java服务器页面。和Servlet一样,是sun公司定义的一种动态网页开发技术。
特点: 基于html模版,可以在html模版嵌入java代码和jsp中的标签。
tomcat可以包含的资源:
静态资源:
html
:静态页面。
CSS
:修饰美化html页面。
JavaScript
:动态修改html页面和css样式。
动态资源
Servlet
:运行在服务器上的java小程序。适合编写java代码,写网页困难,适合业务处理
Servlet三个用途:
1、接受浏览器发送的数据
2、转发重定向
3、 负责调用业务层
JSP
:适合编写动态内容,不适合写java代码,主要用于显示页面。
JSP优势
1、与纯 Servlet 相比: JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句
2 、与JavaScript相比: 虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
3 、与静态HTML相比: 静态HTML不包含动态信息
JSP语法
JSP页面中可以包含指令,Java语句、变量、方法或表达式、静态内容(html、css、javascript)
语法格式:
指令:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
脚本:
<% java代码 %>
<% int i=10;%>
脚本表达式:
输出变量: <%=2+3%>等价于输出语句 (注意:不能使用分号来结束表达式)
声明:
<%!
定义方法
%>
静态资源:HTML、CSS、JS
JSP注释
格式: <%-- 网页注释 --%>:安全,省流量
网页注释:<!-- 网页注释 --> ,特点,不安全,耗流量
JSP指令
告诉JSP引擎如何解析jsp文件中的内容
语法: <%@ 指令名称 属性名称1=“属性值1” 属性名称2=“属性值2” …%>
示例:
<%@ page language=*"java"* contentType="text/html; charset=UTF-8" pageEncoding=*"UTF-8"*%>
page指令
作用:用于定义JSP页面的各种属性
import和java代码的含义一样
<%@ page import="java.util.Date,java.util.List"%>
或者:
<%@ page import="java.util.Date"%>
<%@ page import="java.util.List"%>
session
:是否会自动创建session对象,默认值为true;
buffer:
JSP中有java.servlet.jsp.JspWriter输出字符流。设置输出数据的缓存大小。默认8kb.
errorPage
:如果页面中有错误,跳转到指定的资源 errorPage="/uri" 如果写“/”则代表当前应用的目录 下,绝对路径。 如果不写“/”则代表相对路径
isErrorPage
:是否创建throwable对象。默认是false
contentType
:等同于response.setContentType(“text/html;charset=utf-8”);服务器发送客户端的内容编码
pageEncoding
: Jsp文件本身的编码
isELIgnored
: 是否忽略EL表达式。 默认是false,支持表达式;是true表示不支持表达式,${1+1};false输出结果2 true按照原样输出
include指令
静态包含: 把其它资源包含到当前页面中 <%@ include file="header.jsp" %>
动态包含: <jsp:include page=“header.jsp"></jsp:include>
两者的区别: 翻译的时间段不同(可在tomcat工作目录下查看)
静态包含: 在翻译时就把两个文件进行合并,运行时效率高。属于同一个页面。
动态包含: 不会合并文件,当代码执行到include时,才包含另一个文件的内容。不属于同一个页面
taglib指令
作用: 在JSP页面中导入JSTL标签库。JSTL替换jsp中的java代码片段。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core"prefix="c" %>
JSP的6个动作标签
jsp:include
动态包含
jsp:forward
请求转发
jsp:param
请求设置参数
注意:主页面中设置编码类型utf-8 jsp:param的value属性才可以使用中文,不然会乱码
jsp:useBean
创建一个对象
jsp:setProperty
给指定的对象属性赋值
jsp:getProperty
取出指定的对象属值
内置对象
Servlet中内置对象:request 、response、session、application、out(PrintWriter)
Jsp本质是Servlet,包含九个内置对象
对象名 | 类型 | 说明 |
---|---|---|
request | javax.servlet.http.HttpServletRequest | |
response | javax.servlet.http.HttpServletResponse | |
session | javax.servlet.http.HttpSession | 由session=“true”开关 |
application | javax.servlet.ServletContext | |
config | javax.servlet.ServletConfig | |
exception | java.lang.Throwable | 由isErrorPage=“false”开关 |
out | javax.servlet.jsp.JspWriter | javax.servlet.jsp.JspWriter |
pageContext | javax.servlet.jsp.PageContext | |
page | java.lang.Object当前对象this | 当前servlet实例 |
r r s a c e o p p
代码演示:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP内置对象</title>
</head>
<body>
<%
//页面上下文对象
pageContext.setAttribute("msg", "我是PageContext对象");
System.out.println(pageContext.getAttribute("msg"));
//请求对象
System.out.println("请求对象:"+request);
//响应对象
response.getWriter().print("OK");
//当前页面对象
System.out.println(page.getClass());//输出到控制台
//输出对象
out.print(48);//输出到浏览器:48
out.write(48);//输出到浏览器:0
int no=101;
//会话对象
System.out.println(session);
//全局对象
System.out.println(application.getRealPath("/"));
//配置对象--初始化参数
System.out.println(config.getServletName());
//异常对象
System.out.println(exception);
System.out.println(application);
application.setAttribute("author", "1711");
%>
<h1>jsp脚本:<%=no %></h1>
<h1>jsp脚本:<% out.print(no); %></h1>
</body>
</html>
jsp的out和getWriter()方法的区别
1、out是JspWriter类型,getWriter()是PrintWriter类型
2、out输出到缓冲区中,没有写到response中,getWriter()直接写到response中。
3、out一般用在jsp中,getWriter()用在Servlet中
pageContext对象
pageContext作用:
1、代表页面上下文,获取其他八个内置对象
2、作用容器使用
域对象
jsp中共包含四个域对象分别是request、session、application、pageContext
request域的使用场景: 本次请求之后,数据就不再使用了,根据学号查询学生,根据新闻id查询新闻。
session域的使用场景: 同一个会话中共享的数据,使用session,用户登录信息
application域的使用场景: 所有用户共享的数据。整个程序的配置信息
pageContext域的使用场景: 当前页面。
其中pageContext可以操作其他三个域对象(request,session,application)的数据
void setAttribute(String name,Object o);
Object getAttribute(String name);
void removeAttribute(String name);
操作其它域对象的方法
void setAttribute(String name,Objecto,int Scope);
Object getAttribute(String name,intScope);
void removeAttribute(String name,intScope);
Scope
作用域,值如下:
PageContext.PAGE_SCOPE
PageContext.REQUEST_SCOPE
PageContext.SESSION_SCOPE
PageContext.APPLICATION_SCOPE
findAttribute(Stringname)
自动从pageContext,request ,session ,application依次查找,找到了就取值,结束查找 (作用域的范围由小到大)
pageContext操作四个域对象示例:
<%--设置数据--%>
<%
pageContext.setAttribute("pagedata","thisdata");
pageContext.setAttribute("requestdata","setrequest",pageContext.REQUEST_SCOPE);
pageContext.setAttribute("sessiondata","setsession",pageContext.SESSION_SCOPE);
pageContext.setAttribute("applicationdata","setapplication",pageContext.APPLICATION_SCOPE);
%>
<%--取数据--%>
<%
String pagedata = (String)pageContext.getAttribute("pagedata");
String requestdata = (String)pageContext.getAttribute("requestdata", pageContext.REQUEST_SCOPE);
String sessiondata = (String)pageContext.getAttribute("sessiondata", pageContext.SESSION_SCOPE);
String applicationdata = (String)pageContext.getAttribute("applicationdata", pageContext.APPLICATION_SCOPE);
//从四个域中查找
String pagedata1 = (String)pageContext.findAttribute("pagedata");
String requestdata1 = (String)pageContext.findAttribute("requestdata");
//从四个域中移除
pageContext.removeAttribute("pagedata");
%>
<%--输出数据--%>
<%=pagedata%>
<%=requestdata%>
<%=sessiondata%>
<%=applicationdata%>
<%=pagedata1%>
<%=requestdata1%>
它可以访问其它的8个内置对象
在普通类中可以通过PageContext获取其它JSP隐式对象,具体如下:
getException
方法返回exception
隐式对象
getPage
方法返回page
隐式对象
getRequest
方法返回request
隐式对象
getResponse
方法返回response
隐式对象
getServletConfig
方法返回config
隐式对象
getServletContext
方法返回application
隐式对象
getSession
方法返回session
隐式对象
getOut
方法返回out
隐式对象
提供了简易方法
pageContext.forward(“2.jsp”);//转发 request.getRequestDispatcher().forward();
pageContext.include(“2.jsp”);//动态包含
EL表达式
EL概述和基本语法
EL表达式:Expression Language表达式语言
目的:简化jsp中java代码开发,代替脚本表达式<%=username%>
它不是一种开发语言,是jsp中获取数据的一种规范
格式如: ${EL表达式}
等价于<%=pageContext.findAttribute(name)%>
EL的具体功能:
案例一: 简单获取数据
<%
//不同方式向域中存数据
pageContext.setAttribute("username","张三");
request.setAttribute("age","18");
session.setAttribute("phone","188888888");
application.setAttribute("address","深圳");
%>
<%--案例一:简单获取数据--%>
<%=pageContext.getAttribute("username")%>
<%=request.getAttribute("age")%>
<%=session.getAttribute("phone")%>
<%=application.getAttribute("address")%>
<%--EL表达式获取数据--%>
${username}
${age}
${phone}
${address}
案例二: 获取对象数据
<%
User user = new User("张三",18,"1888888888");
pageContext.setAttribute("user",user);
%>
${user.name}
${user.age}
${user.phone}
案例三: 使用list和map集合
注意:数字需要括号引号包起来
<%
ArrayList<String> list = new ArrayList<>();
list.add("张三");
list.add("李四");
list.add("赵五");
list.add("王麻子");
pageContext.setAttribute("list",list);
%>
${list[0]}
${list[1]}
${list[2]}
${list[3]}
<%
Map<String,String> map = new HashMap<>();
map.put("NO001","张三");
map.put("NO002","李四");
map.put("NO003","赵五");
map.put("004","王麻子");
pageContext.setAttribute("map",map);
%>
${map.NO001}
${map.NO002}
${map.NO003}
//数字需要括号引号
${map["004"]}
表达式:
<%--三目运算--%>
${score>80?"优秀":"加油!"}
<%--隐式对象--%>
上下文路径:${pageContext.request.contextPath}
隐式对象(11个)
JSP 表达式语言定义了一组隐式对象,其中许多对象在 JSP servlet和表达式中可用:
pageContext: 页面上下文,可以获取jsp中其他八个内置对象
pageScope、requestScope、sessionScope、applicationScope表示四个域对象中集合
param
表示request.getParameter(“username”); ${param.username}
paramvalues
表示request.getPrameterValues(“hobby”); ${paramValues.hobby}
header
表示 request.getHeader(“accept”); ${header.accept};
headerValues
表示 request.getHeaderValues(“accept-encoding”); ${headerValues[“accept-encoding”][0]}
cookie
表示 request.getCookies(); ${cookie.JSESSIONID}
initParam
表示 ServletContext(application)初始化参数
JSTL
JSTL:全称Java Server Pages Standard Tag Library,JSP标准标签库,代替jsp页面的脚本,实现逻辑控制。
JSTL的作用
实现JSP页面中逻辑处理。如判断, 循环等;
下载JSTL库:https://archive.apache.org/dist/tomcat/taglibs/
把jstl.jar、standard.jar放入WEB-INF/lib目录下
使用JSTL
必须在JSP页面添加tablib指令库
<% @taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c">
常用标签介绍
通用标签set,out,remove
<!-- 基础标签:声明变量,输出变量,移除变量,变量默认值 -->
<h3>基础标签:声明变量,输出变量,移除变量,变量默认值</h3>
<!--1.声明变量k var:是变量名 value:变量的值(必须是EL表达式)-->
<c:set var="k" value="${1+1}"></c:set>
<!--2.输出变量k value:使用EL表示表示变量-->
移除前输出的内容:<c:out value="${k}"></c:out><br>
<!--3.移除指定变量 -->
<c:remove var="k"/>
移除后输出的内容:<c:out value="${k}"></c:out><br>
<!--4.给指定变量赋默认值 -->
默认值:<c:out value="${m}" default="123456"></c:out>
<%--向域中设置数据--%>
<c:set var="username" value="张三" ></c:set>
<c:set var="address" value="深圳" ></c:set>
<%--标签内容会被输出,不安全--%>
<%--<c:set var="content" value="<script type='text/javascript'> alert('欢迎使用JSTL')</script>" ></c:set>--%>
${username}
${address}
${content}
<c:out value="<script type='text/javascript'> alert('欢迎使用JSTL')</script>" ></c:out>
<c:remove var="content" ></c:remove>
条件标签if,choose
<c:if test="${empty user}">没有登录</c:if>
<c:choose>
<h3>条件标签:choose(等价于java中switch)</h3>
<%-- 测试成绩等级 >90 优秀 >80 良好 >70 中等 >60及格--%>
<c:set var="score" value="80"></c:set>
<c:choose>
<c:when test="${score>=90 }">优秀</c:when>
<c:when test="${score>=80 }">良好</c:when>
<c:when test="${score>=70 }">中等</c:when>
<c:when test="${score>=60 }">及格</c:when>
<c:otherwise>不及格</c:otherwise>
</c:choose>
迭代标签foreach
for基础遍历
<!-- 遍历for:输出1到10 的值 -->
<!--var: 变量,把遍历的每一个值都存储在变量中进行输出
begin:开始 如果是变量使用EL表达式表示
end:结束 如果是变量使用EL表达式表示
step:间隔的长度
for( int i=0;i<10;i++){
System.out.println(i);
}
-->
示例代码:
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br>
</c:forEach>
foreach遍历
<h3>测试list集合遍历获取学生列表</h3>
<table border="1" width="80%" bordercolor="red" cellspacing="0"
align="center">
<tr>
<th>学号</th>
<th>姓名</th>
<th>成绩</th>
<th>班级</th>
<th>是否是第一个</th>
<th>是否是最后一个</th>
<th>计数count</th>
<th>索引index</th>
</tr>
<!-- varStatus:变量状态:遍历出的每一项内容的状态:
isFirst() first
isLast() last
getCount() count 计数 重要的
getIndex() index
-->
<!-- var :遍历出的每一项使用变量先存储
items:集合(使用El表达式)
-->
<c:forEach var="stu" items="${students}" varStatus="vs">
<tr>
<td>${stu.id}</td>
<td>${stu.name}</td>
<td>${stu.score}</td>
<td>${stu.classes}</td>
<td>${vs.first}</td>
<td>${vs.last}</td>
<td>${vs.count}</td>
<td>${vs.index}</td>
</tr>
</c:forEach>
</table>
url标签
<c:url var="" value="">
举例:
<c:url var="loc" value="/stu.jsp">
<c:param name="username" value="张三"></c:param>
</c:url>
<a href="${loc}">学生列表</a>