JavaWeb——(11)JSP

目录

一、JSP概述

二、JSP原理

三、JSP与Servlet

四、JSP的基本语法

4.1 JSP模板元素

4.2 JSP的脚本

4.3 JSP的注释

4.4 JSP的三个指令

4.4.1 Page指令

4.4.2 Include指令

4.4.3 Taglib指令

4.5 JSP的六个动作

4.6 JSP的九个内置对象

五、四大域对象

六、EL表达式

6.1 EL概述和基本语法

6.2 EL的具体功能

6.2.1获取数据

6.2.2运算

6.2.3隐式对象

七、JSTL


 

一、JSP概述

JSP全称是Java Server Pages,它和servle技术一样,是一种用于开发动态web资源的技术。用我自己的话理解就是可以在html中写java语句的一门技术。

JSP实际上就是Servlet,主要用于实现Java web应用程序的用户界面部分,JSP可以通过网页表单获取用户输入数据、访问数据库及其他数据源,然后动态地创建网页,

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

开发网页静态内容的技术包括html、css和javascript等,动态内容的技术包括jsp、asp和php等。

与其他语言相比,JSP有如下的优点:

  • 与ASP相比:JSP有两大优势。首先,动态部分用Java编写,而不是VB或其他MS专用语言,所以更加强大与易用。第二点就是JSP易于移植到非MS平台上。
  • 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
  • 与SSI相比:SSI无法使用表单数据、无法进行数据库链接。
  • 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
  • 与静态HTML相比:静态HTML不包含动态信息。

 

 

二、JSP原理

我们写一个简单的jsp的例子,在网页中显示系统当前时间,新建web工程,修改index.jsp文件,

<%@ page import="java.util.Date" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%
    Date date=new Date();
    out.write(date.toLocaleString());//输出当前时间
  %>
  </body>
</html>

查看网页输出结果如下,

查看网页源代码发现java语句已经在后台处理好了,在网页中只显示了最后的结果,

当客户端向服务器发送请求时,index.jsp会转译为java文件index_jsp.java,然后通过编译生成class文件index_jsp.class,最后执行的是字节码文件index_jsp.class,

而且jsp文件中的html代码都是通过字符流写入到网页的,和之前在servlet中写网页一样,遇到java代码则顺序执行,执行完后如果有数据写入到网页也通过字符流写到网页,没有则继续执行后续代码。

 

三、JSP与Servlet

JSP和Servlet的最大不同在于Servlet重点在于编写java代码逻辑,包括获取表单数据,处理业务逻辑和分发转向等等,而JSP重点在于显示数据。

所以在实际的开发中,我们通常将业务处理代码放在servlet中,而仅仅在JSP中利用java语句获取一些需要显示的数据,在网页中显示出来,我们使用登录的Demo来体会一下具体如何设计,

我们将与用户交互的界面用jsp实现,和用户不需要交互的用servlet实现,整体设计如图所示:

首先是登陆界面Login.jsp,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <form action="http://localhost:8080/doLogin" method="post">
        用户名:<input type="text" name="userName"/><br>
        密码:<input type="password" name="passWord"/><br>
        <input type="submit" value="登录"/><br>
    </form>
</body>
</html>

然后是业务处理的servlet,

package LoginDemo;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet(name = "ServletDoLogin")
public class ServletDoLogin extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取表单数据
        String userName = request.getParameter("userName");//获取用户名
        String passWord = request.getParameter("passWord");//获取密码

        //处理业务逻辑,分发转向
        if("admin".equals(userName) && "123".equals(passWord)){
            request.getRequestDispatcher("/LoginDemo/succeed.jsp").forward(request,response);//跳转到成功登录界面
        }else {
            response.sendRedirect("/LoginDemo/Login.jsp");//重定向到重新登录界面
        }
    }
}

登陆成功的跳转界面succeed.jsp,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    欢迎:<%
        String userName = request.getParameter("userName");//获取用户名
        out.print(userName);//输出用户名
    %>
</body>
</html>

我们看一下运行的截图,

 

四、JSP的基本语法

4.1 JSP模板元素

JSP模板元素就是网页的静态内容,比如html标签和文本,所以在jsp中可以写html的代码

 

4.2 JSP的脚本

JSP脚本就是java代码的片段,可以分为三种:

  • <%...%>:Java语句;
  • <%=…%>:Java表达式,并将表达式结果输出(注意表达式的结尾不能加分号);
  • <%!...%>:Java定义类中的全局成员(包括变量和方法),和静态块;

 

4.3 JSP的注释

在JSP中注释有两种,包含JSP注释和网页注释:

  • JSP注释:<%-- JSP注释 --%> 特点:安全,省流量,不会显示在网页源代码中

  • 网页注释:<!-- 网页注释 -->特点:不安全,费流量,会显示在网页源代码中

 

4.4 JSP的三个指令

JSP指令是为了用来设置JSP界面相关的属性,如网页的编码方式和脚本语言,

在JSP2.0规范中共定义了三个指令:Page指令,Include指令,Taglib指令。

语法格式为:

<%@ 指令名称 属性1=“属性值1” 属性2=“属性值2” ...%>
or
<%@ 指令名称 属性1=“属性值1” %>
<%@ 指令名称 属性2=“属性值2” %>

 

4.4.1 Page指令

Page指令用于定义JSP页面的各种属性

1.import

import和java代码中的import是一样的,用于导入额外需要的java包,从而可以使用其中的类对象,

<%@ page import="java.util.Date,java.util.List"%>
or
<%@ 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.*;

 

2.session

设置是否自动创建session对象,默认值为true;

 

3.buffer

JSP中有javax.servlet.jsp.JspWriter输出字符流,buffer属性可以设置输出数据的缓存大小,默认为8kb;

 

4. errorPage

如果页面中有错误,则跳转到指定的资源:errorPage=“url”;

 

5.isErrorPage

设置是否创建throwable对象,默认为false;

 

6.contextType

设置网页编码格式,等同于:response.setContextType("text/html;charset=utf-8");

 

7.pageEncoding

告知JSP引擎要翻译的文件使用的编码格式;

 

8.isELIgnored

是否忽略EL表达式的语法,默认为false,即支持EL表达式

 

4.4.2 Include指令

Include包括静态包含和动态包含,但是Include指令是指静态包含:

  • 静态包含:<%@ include file = "文件名.jsp"%>,在<body>的标签外定义。在没有编译的时候,两个java文件都已经包含起来了(合并成一个)。
  • 动态包含:<%jsp:include page = "/文件名.jsp"> <jsp:include>,在<body>标签内定义。在编译之前永远是两个java文件。

 

4.4.3 Taglib指令

可以在JSP页面中导入JSTL标签库,替换jsp中的java代码片段。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

 

4.5 JSP的六个动作

JSP六个动作分别为

  1. Include:动态包含,<jsp:include>
  2. Forward:请求转发,<jsp:forward>
  3. Param:设置请求参数,<jsp:param>
  4. UseBean:创建一个对象,<jsp:useBean>
  5. GetProperty:获得指定对象的属性值,<jsp:getProperty>
  6. SetProperty:设置指定对象的属性值,<jsp:setProperty>

 

我们先来看看跟对象相关的动作操作怎么使用,新建一个实体类Student,有两个私有属性name和password,实现他们的set和get方法,然后我们分别通过传统java代码和JSP的动作来对Student进行操作,

<%@ page contentType="text/html;charset=UTF-8" language="java" import="entity.Student"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    //java代码
    <%
        Student stu1=new Student();//创建对象
        stu1.setName("rose");//设置对象的姓名
        out.print(stu1.getName());//获取对象的姓名并输出
    %>

    //jsp动作
    <jsp:useBean id="stu2" class="entity.Student"></jsp:useBean>//创建对象
    <jsp:setProperty name="stu2" property="name" value="jack"></jsp:setProperty>//设置对象的姓名
    <jsp:getProperty name="stu2" property="name"></jsp:getProperty>//获取对象的姓名并输出
</body>
</html>

可以看到二者都可以达到操作对象的效果,只不过jsp动作常用于前端设计开发人员,更符合他们的开发语言习惯,

 

然后我们测试一下请求转发和参数的动作,

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--请求转发,并在转发时携带参数--%>
    <jsp:forward page="RequestForward.jsp">
        <jsp:param name="age" value="18"></jsp:param>
    </jsp:forward>
</body>
</html>

接收转发的参数,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--输出获得的参数--%>
    <%=request.getParameter("age")%>
</body>
</html>

可以看到消息转发成功,并且获得了转发的参数,

 

4.6 JSP的九个内置对象

指在JSP中不需要创建就可以直接使用的对象,即在<%=...%>和<%...%>中可以直接使用的对象,

对象名

类型

说明

request

javax.servlet.http.HttpServletRequest

存储请求信息

response

javax.servlet.http.HttpServletResponse

存储响应信息

session

javax.servlet.http.HttpSession

存储会话信息,由session="true"开关

application

javax.servlet.ServletContext

存储应用信息,所有用户都可以获取

exception

java.lang.Throwable

存储异常信息,由isErrorPage="false"开关

page

java.lang.Object当前对象this

当前servlet实例

config

javax.servlet.ServletConfig

存储应用的配置信息

out

 javax.servlet.jsp.JspWriter

字符输出流,相当于 printWriter对象

pageContext

 javax.servlet.jsp.PageContext

代表页面上下文,可以获得其他的八个对象

前面的几个我们在学习中都见到过了,我们着重学习一下pageContext对象,

pageContext本身也是一个域对象,它可以操作其他三个域对象(request、session、application)的数据,pageContext主要有如下的方法,

//操作本身的数据
void setAttribute(String name,Object o);//设置属性数据
Object getAttribute(String name);//获取属性数据
void removeAttribute(String name);//移除属性

//操作其他三大域对象的数据,根据Scope的取值确定操作的域对象
void setAttribute(String name,Object o,int Scope);//设置属性数据
Object getAttribute(String name,int Scope);//获取属性数据
void removeAttribute(String name,int Scope);//移除属性

//查找属性
findAttribute(String name);//自动从page,request,session,application依次查找,找到了就取值结束查找

//提供了简单方法
pageContext.forward("url");//转发
pageContext.include("url");//包含

//参数Scope对应的域对象取值
PageContext.PAGE_SCOPE//page作用域
PageContext.REQUEST_SCOPE//request作用域
PageContext.SESSION_SCOPE//session作用域
PageContext.APPLICATION_SCOPE//application作用域

我们测试一下如何设置其他域和获取其他域对象的属性,

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        pageContext.setAttribute("name","tom",PageContext.REQUEST_SCOPE);//在request域中设置属性
        request.getRequestDispatcher("get.jsp").forward(request,response);//转发请求
    %>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%
        String name = (String) request.getAttribute("name");
        out.print(name);
    %>
</body>
</html>

输出结果如下:

 

五、四大域对象

四大域对象分别为PageContext、ServletRequest、HttpSession和ServletContext,他们的区别如下:

  • PageContext:pageConext 存放的数据在当前页面有效,在开发时使用较少
  • ServletRequest:request 存放的数据在一次请求(转发)内有效,使用非常多
  • HttpSession:session 存放的数据在一次会话中有效,使用的比较多。如:存放用户的登录信息,购物车功能
  • ServletContext:application 存放的数据在整个应用范围内都有效,因为范围太大,应尽量少用

 

六、EL表达式

6.1 EL概述和基本语法

EL表达式全称为Expression Language,即表达式语言,

EL表达式其实不是一种语言,是jsp中获取数据的一种规范,其作用为简化JSP中java的代码开发

注意EL表达式只能获取数据,不能设置数据!

 

6.2 EL的具体功能

6.2.1获取数据

我们可以利用EL表达式来获取数据,EL表达式只能获取存在于4大域对象PageContext、ServletRequest、HttpSession和ServletContext中的数据,EL表达式格式为:

${EL表达式}

等价于pageContext.findAttribute();

该表达式会在四个域对象中依次查找属性,若查找到的属性为null,则会在网页输出为空字符串,现在我们用一个例子来体会一下EL表达式如何获取数据的,首先设置属性数据,然后在jsp中利用EL表达式获取数据,

<%@ page import="entity.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SetStudent</title>
</head>
<body>
    <%
        Student student=new Student();
        student.setName("admin");
        request.setAttribute("student",student);//在request域中设置属性Student
        request.getRequestDispatcher("getStudent.jsp").forward(request,response);//转发请求
    %>
</body>
</html>
<%@ page import="entity.Student" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>GetStudent</title>
</head>
<body>
    <%--等价于Student student=(Student) pageContext.findAttribute("student");out.print(student.getName())--%>
    ${student.name }
    <%--student.name等价于student.getName()方法,点.运算符相当于调用了getter方法,后面跟的是属性名--%>
</body>
</html>

获取结果:

 

6.2.2运算

在EL表达式中还可以进行一些运算:

1、empty

判断是否为null,空字符串和没有元素的集合(即使集合对象本身不为null)都返回true。

<%
    String str1=null;
    pageContext.setAttribute("str1",str1);
    String str2="";
    pageContext.setAttribute("str2",str2);
    String str3="";
    pageContext.setAttribute("str3",str3);

    List list1=new ArrayList();
    pageContext.setAttribute("list1",list1);
    List list2=new ArrayList();
    list2.add("aaa");
    pageContext.setAttribute("list2",list2);
%>
${empty str1}
${empty str2}
${empty str3}
${empty list1}
${empty list2}

比如上述这样的EL表达式输出结果为:

 

 

2、三元运算符

在EL表达式中还可以使用三元运算符,

<%
    List list1=new ArrayList();
    pageContext.setAttribute("list1",list1);
%>
${empty list1 ? "集合为空":"集合不为空"}

 

6.2.3隐式对象

 

EL隐式对象引用名称类型JSP内置对象名称说明
pageContextjavax.servlet.jsp.PageContextpageContext一样的
pageScopejava.util.Map<String,Object>没有对应的pageContext范围中存放的数据,页面范围
requestScopejava.util.Map<String,Object>没有对应的请求范围数据
sessionScopejava.util.Map<String,Object>没有对应的会话范围数据
applicationScopejava.util.Map<String,Object>没有对应的应用范围数据
paramjava.util.Map<String,String>没有对应的一个请求参数
paramValuesjava.util.Map<String,String[]>没有对应的重名请求参数
headerjava.util.Map<String,String>没有对应的一个请求消息头
headerValuesjava.util.Map<String,String[]>没有对应的重名请求消息头
initParamjava.util.Map<String,String>没有对应的web.xml中全局参数
cookiejava.util.Map<String,Cookie>没有对应的key:cookie对象的name值

 

七、JSTL

JSTL全称为JavaServerPages Standard Tag Library,为JSP的标准标签库,

其作用为实现JSP页面中的逻辑处理,比如判断、循环等,

IDEA编译器需要下载JSTL的jar包然后再导入,下载地址为:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/,我们下载 jakarta-taglibs-standard-1.1.2.zip 这个文件即可,解压后将文件夹中lib目录下的两个jar包拷贝到工程目录的WEB-INF的lib文件夹下:

然后依次点击File->Project Structure->Libraries,然后新建项目库选择lib文件夹下的两个jar包即可,

在使用JSTL之前还需要先在jsp页面中添加taglib指令,并指定它的别名,

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

一些常用的标签如下:

  • 通用标签:
    • set:设置变量
      • var:变量名
      • value:变量值
      • scope:变量的作用域,可取page、session、request等
      • 例<c:set var="num" value="10" scope="page"></c:set>,设置一个变量num=10,作用域为page
    • out:输出变量
      • value:输出的变量名,格式为${变量名}
      • default:若变量为空则输出default的内容
      • 例<c:out value="${num}"></c:out>,输出变量num
    • remove:移除变量
      • var:需要移除的变量名
      • scope:需要移除的变量名的作用域
      • 例<c:remove var="num" scope="page"></c:remove>,移除变量num
  • 条件标签:
    • if:条件判断
      • test:后跟条件表达式,格式为${条件表达式}
      • 例<c:if test="${5<num}">结果为真</c:if>
    • choose:多情况判断,类似switch
      • <%--判断num的奇偶性--%>
        <c:choose>
            <c:when test="${num%2==0}">num为偶数</c:when>
            <c:when test="${num%2!=0}">num为奇数</c:when>
        </c:choose>
  • 迭代标签:foreach
    • 普通循环:
      • var:声明变量名
      • begin:初始化变量值
      • end:循环结束条件
      • step:循环的步长
      • <%--从1到5循环打印输出i的值--%>
        <c:forEach var="i" begin="1" end="5" step="1">
            <br>${i}
        </c:forEach>
    • 迭代器:
      • items:集合对象的变量名
      • var:遍历的变量名称
      • varStatus:为一个对象,该对象记录着当前遍历的元素的一些信息
        • index:该元素的下标,从0开始
        • count:计数,计算集合中存储的元素个数,从1开始
        • first:是否为集合的第一个元素,返回值为bool
        • last:是否为集合的最后一个元素,返回值为bool

我们就测试一下foreach用作迭代器来显示集合中的元素,

<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--创建集合--%>
    <%
        List list=new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        request.setAttribute("list",list);
    %>

    <table border="1">
        <%--表头--%>
        <tr>
            <th>数据</th>
            <th>下标</th>
            <th>计数</th>
            <th>是否第一个元素</th>
            <th>是否最后一个元素</th>
        </tr>
        <%--数据--%>
        <c:forEach items="${list}" var="letters" varStatus="vs">
            <tr>
                <td>${letters}</td>
                <td>${vs.index}</td>
                <td>${vs.count}</td>
                <td>${vs.first}</td>
                <td>${vs.last}</td>
            </tr>
        </c:forEach>
    </table>
</body>
</html>

显示结果:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值