目录
JavaServerPage,处理JavaWeb动态页面标准J EE服务器技术,必需运行在JSP/Servlet容器上。
JSP元素:JSP声明、java脚本、JSP表达式、JSP动作、JSP注释
java脚本代码
<% 任意合法代码 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%!
int dual = 18;
final boolean YES = true;
final boolean NO = false;
boolean checkAge(int age){
if(age > dual){
return YES;
}else{
return NO;
}
}
%>
</head>
<body>
</body>
</html>
表达式
<%= 表达式 %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<%!
int dual = 18;
String color = "red";
final boolean YES = true;
final boolean NO = false;
boolean checkAge(int age){
if(age > dual){
return YES;
}else{
return NO;
}
}
%>
</head>
<body style="color: <%=color%>">
<%=checkAge(2)%>
</body>
</html>
结果:
注释:
跟html一样
JSP指令
Page指令
include指令
taglib指令
Page指令
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" buffer="8kb" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat();
%>
</body>
</html>
buffer:内存大小
import : 导入包
include指令
将目标资源页面中内容在编译阶段合并到档期那JSP页面中来统一进行编辑(静态包含);目标如果是JSP文件则不生成单独的JDPjava文件;档期那JSP页面可以使用被包含页面的所有资源(java对象以及JS内容)
index.jsp:
<%@ page import="java.util.Date" %>
<%@ page import="java.text.SimpleDateFormat" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" buffer="8kb" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<div class="top" style="height: 120px; width: 100%; ">
<%@ include file="top.jsp"%>
</div>
<div class="left" style="float: left; width: 30%; height: 600px; background: red">
</div>
<div class="right" style="float: left; width: 70%; height: 600px; background: blue">
</div>
</body>
</html>
top.jsp:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Top</title>
</head>
<body>
<div style='background: gray ; text-align: center ; line-height: 120px' >顶部</div>
</body>
</html>
结果:
taglib指令
出了点错误,明天解决了再写
JSP隐式对象
目标JSP页面被请求成功后,被创建的Java对象隐式地存在于JSP中
这些隐式对象名称固定,只能再JSP Java脚本中及JSP表达式中使用
out、response
out对象提供向页面输出文本信息功能
response对象实现对用户请求做出响应处理功能
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% out.println("yes"); %>
</body>
</html>
结果:
response用法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<% out.println("yes"); %>
<%
response.sendRedirect("222.jsp");
%>
</body>
</html>
跳转到222.jsp页面
JSP作用域隐式对象
request:请求对象
pageContext:当前页面上下文作用域对象,主要提供本页面作用域中对象的试着及获取方法,pageContext作用域储存的对象只对当前JSP页面有效
session:是web会话最重要对象,表示用户和服务器交互的一个过程,此对象对于每个用户是私有的,只存储当前用户的个人信息,多个用户间的session对象是不透明的
aplication:表示当前整个web应用程序,被所有于web服务器交互用户共享
例子:
request和session实现用户登录
login1.jsp
<form action="login2.jsp">
用户名<input type="text" name="name"><br>
密码<input type="text" name="password">
<input type="submit">
</form>
跳转到login2.jsp
<body>
<%
String name = request.getParameter("name");
String password = request.getParameter("password");
if(name != null && !name.equals("") && name.equals("admin") &&
password != null && !password.equals("") && password.equals("123456")){
User user = new User(name,password);
session.setAttribute("user",user);
}
%>
<a href="index.jsp" >访问主页面</a>
</body>
跳转到index.jsp,在它的top上显示:
<div style='background: white ; text-align: center ; line-height: 30px' >
<%=((User)session.getAttribute("user")).getName()%><br>
<%=((User)session.getAttribute("user")).getPassword()%>
</div>
结果:
pageContext用法
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>pageContext</title>
</head>
<body>
<%
pageContext.setAttribute("name","chen");
%>
当前从pageContext取出数据 :<%=pageContext.getAttribute("name")%>
</body>
</html>
其它
page,config,exception
用的比较少,下面展示exception的用法
<%@ page contentType="text/html;charset=UTF-8" language="java" errorPage="error.jsp"%>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
double i = 27 / 0;
%>
</body>
</html>
会报错,设置了errorPage=error.jsp,报错了就跳转到这个页面
error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isErrorPage="true" %>
<html>
<head>
<title>Title</title>
</head>
<body>
粗错了!
<%
exception.getMessage();
exception.printStackTrace();
%>
</body>
</html>
isErrorPage这个属性要设为true,否则无法使用exception对象
结果:
jsp动作
include动作
下面展示用include指令和用include动作分别插入一个jsp
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
<div class="top">
<%--用jsp动作来导入--%>
<jsp:include page="top.jsp"></jsp:include>
</div>
<div class="end">
<%--用jsp指令来导入--%>
<%@include file="end.jsp"%>
</div>
</body>
</html>
top.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body style="text-align: center; font-size: 30px">
这里是头部
</body>
</html>
end.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body style="text-align: center; font-size: 50px; background: yellow; color: red;">
这里是尾部
</body>
</html>
结果:
但style里的样式没有导入进去啊,也不知道什么原因
forward动作
等效于request对象获取RequestDispatcher并调用其forward方法功能
<jsp:include page="end.jsp"></jsp:include>
param动作
<jsp:include page="end.jsp">
<jsp:param name="color" value="blue"/>
</jsp:include>
<jsp:forward page="end.jsp">
<jsp:param name="color" value="blue"/>
</jsp:forward>
useBean动作
useBean动作实现在jsp页面中创建javaBean对象并设置其作用域范围,以实现javaBean的功能重用
属性:
id:必需,标识bean对象的唯一引用标识符
class:标识bean对象的实际类型
type:标识bean类的父类型名称
scope:试着bean对象的作用域(page,request,session,application)
Java Bean
Java Bean为可重用功能组件
分为 功能bean, 实体bean
定义标准:
1、必需是非抽象类或接口的普通类java组件
2、必需具有公共访问级别无参构造方法定义
3、建议通常将类属性定义private并设置set和get公共方法
<%@ page import="com.domin.User" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<jsp:useBean id="userObj" class="com.domin.User" scope="page"></jsp:useBean>
<%
Object obj = pageContext.getAttribute("userObj");
User sysUser = null;
if(obj == null){
sysUser = (User)obj;
%>
用户名:<%=sysUser.getName()%>
<% }
%>
</body>
</html>
setProperity动作
用来为某个bean对象的属性设置值
<body>
<jsp:useBean id="userObj" class="com.domin.User" scope="page"></jsp:useBean>
<jsp:setProperty name="userObj" property="name" value="liang"></jsp:setProperty>
<%
Object obj = pageContext.getAttribute("userObj");
User user = (User)obj;
System.out.println(user.getName());
%>
</body>
结果:控制台输出liang
当然可以通过param来用户给它赋值
<jsp:useBean id="userObj" class="com.domin.User" scope="page"></jsp:useBean>
<jsp:setProperty name="userObj" property="name" param="userName"></jsp:setProperty>
<%
Object obj = pageContext.getAttribute("userObj");
User user = (User)obj;
System.out.println(user.getName());
%>
在浏览器中,
控制台输出:
getProperty动作
用来获取某个bean对象的属性值
<jsp:useBean id="userObj" class="com.domin.User" scope="page"></jsp:useBean>
<jsp:setProperty name="userObj" property="name" value="liang"></jsp:setProperty>
用户名:<jsp:getProperty name="userObj" property="name"/>
EL(jsp表达式语言)
基本语法
${表达式}
<body>
<%
String name = "chen";
pageContext.setAttribute("user_name",name);
Student stu = new Student("yang",23);
pageContext.setAttribute("stuObj",stu);
%>
从作用域中取出对象:${
user_name}<br>
从作用域中访问复合类型对象:${
stuObj.name}
</body>
展示:
注意:这里的类中的属性一定要有get,set方法!!
运算符
隐式对象
EL表达式隐式对象是预定义好的EL对象,利用此对象可以访问此对象中的变量
请求参数隐式对象
index.jsp
<a href="1.jsp?name=liang&age=11">点击访问el</a>
1.jsp
${
"名字:"}
${
param.name}
<%--判断参数是否为空--%>
${
empty param.name}
结果:
还有带有checkbox相关的参数的
index.jsp
<form action="1.jsp" method="get">
<input type="checkbox" name="likes" value="basketball">篮球
<input type="checkbox" name="likes" value="football">足球
<input type="checkbox" name="likes" value="paiqiu">排球<br>
<input type="submit" value="提交"/>
</form>
1.jsp
第一个:${
paramValues.likes[0]}<br>
第二个:${
paramValues.likes[1]}<br>
第三个:${
paramValues.likes[2]}
展示:
index一个复选框
1.jsp结果
EL cookie隐式对象
EL隐式对象cookie用来获取存储在客户端机器上的cookie信息
index.jsp
<a href="/myweb/ELServlet">点击创建cookie</a>
ELSerrvlet:创建cookie
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("user","liang");
resp.addCookie(cookie);
req.getRequestDispatcher("1.jsp").forward(req,resp);
}
1.jsp
判断cookie是否为空:${
empty cookie}<br>
cookie中的对象:${
cookie["user"]}<br>
cookie中的代号:${
cookie["user"].name}<br>
cookie中的值:${
cookie["user"].value}
结果:
jstl标签
JSTL
JSP标准标签库,其使用java语言实现,为简化JSP页面制作开发的自定义功能标签,必需在JSP中使用taglib指令设置标签使用信息。
大致分为四类:Core,Format,XML,SQL
tip:在idea貌似要导入相关的jstl包,然后在jsp头顶加上
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
类似的语句
Core核心标签
通用标签:set、out、remove
set标签
用来设置一个变量并指定其作用域范围
var 设置变量的名称
value:设置变量的值,支持合法的表达式
scope:设置变量的作用域,默认为page
target:设置变量为一个对象
property:设置变量对象的属性与target合用
<body>
<c:set var="name" value="liang" scope="page"></c:set>
<%=pageContext.getAttribute("name")%>
</body>
结果:
set设置复合类型的某个属性
out标签
用来输出一个变量的值,通常此标签使用少,常用EL表达式代替
value:以表达式方式查找目标变量
default:设置未找到时使用的默认值
escapeXml:设置是否解析xml及html标记
<body>
<c:set var="name" value="liang" scope="page"></c:set>
<c:out value="${pageScope.name}" default="chen"></c:out><br>
<c:out value="${pageScope.age}" default="18"></c:out>
</body>
结果:
remov标签
<c:set var="name" value="liang"></c:set>
未删除之前:<c:out value="${pageScope.name}"></c:out><br>
<c:remove var="name"></c:remove>
删除后:<c:out value="${pageScope.name}"></c:out>
结果:
逻辑条件标签
if标签
用来实现逻辑条件判断,条件成立则执行if标签内的内容
test必需属性,设置if标签boolean表达式
var设置此if标签计算结果的变量名称
scope设置变量的作用域
做个表格:
<form action="/myweb/Servlet">
姓名:<input type="text" name="name"><br>
性别:<input type="radio" name="sex" value="man">男<input type="radio" name="sex" value="woman">女<br>
<input type="submit" value="提交">
</form>
Servlet:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Student stu = new Student();
stu.setName(req.getParameter("name"));
stu.setSex(req.getParameter("sex"));
req.setAttribute("student",stu);
req.getRequestDispatcher("1.jsp").forward(req,resp);
}
(Student是一个有sex和name两个属性的自创类,懒得贴了)
1.jsp
<body>
<c:if test="${requestScope.student ne null}">
<c:if test="${requestScope.student.sex eq 'man'}">
${
"这是个男同学"}
</c:if>
<c:if test="${requestScope.student.sex eq 'woman'}">
${
"这是个女同学"}
</c:if>
</c:if>
</body>
结果:
choose和when标签(相当于switch,case功能)
修改上面1.jsp代码,用choose和when来代替:
<c:choose>
<c:when test="${requestScope.student.sex eq 'man'}">
${
"这是个男同学"}
</c:when>
<c:when test="${requestScope.student.sex eq 'woman'}">
${
"这是个女同学"}
</c:when>
</c:choose>
结果功能同if标签中的代码
当然,还有otherwise标签,跟java中default类似
<c:otherwise>
${
"未知性别"}
</c:otherwise>
循环迭代标签
foreach
index.jsp
<a href="/myweb/servlet">点击进入servlet</a>
DataBase类:
(其中,Student类是一个由name和sex变量组成的类,不列出来了
package com.domin;
import java.util.ArrayList;
public class DataBase {
private static String name;
private static ArrayList<Student> carList = new ArrayList<Student>();
static {
name = "NO1,NO2,NO3,NO4";
carList.add(new Student("chen","男"));
carList.add(new Student("hell","男"));
carList.add(new Student("mike","女"));
carList.add(new Student("john","男"));
}
public DataBase() {
}
public static String getName() {
return name;
}
public static void setName(String name) {
DataBase.name = name;
}
public static ArrayList<Student> getCarList() {
return carList;
}
public static void setCarList(ArrayList<Student> carList) {
DataBase.carList = carList;
}
}
1.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<c:if test="${sessionScope.student ne null}">
<table style="width: 100%" border="1">
<tr>
<th>序号</th>
<th>姓名</th>
<th>性别</th>
</tr>
<c:forEach items="${sessionScope.student}" var="stu" varStatus="sta">
<tr>
<td>${
sta.index+1}</td>
<td>${
stu.name}</td>
<td>${
stu.sex}</td>
</tr>
</c:forEach>
</table>
</c:if>
</body>
</html>
结果:
forTakens
forTakens标签用来对目标字符串按照给定的分隔符进行分割迭代
delims:设置被操作的集合查找表达式
servlet:
req.getSession().setAttribute("name",DataBase.getName());
resp.sendRedirect("1.jsp");
1.jsp
<c:if test="${sessionScope.name ne null}">
<c:forTokens items="${sessionScope.name}" delims="," varStatus="sta">
第${
sta.count}个人:${
sta.current}<br>
</c:forTokens>
</c:if>
结果: