java | (二十七) JSP(1)指令,隐式对象,动作,标签,EL表达式

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>

结果:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值