JAVA EE(四) —— JSP、El表达式

一、JSP

1、JSP概述

(1)JSP介绍

  • JSP(Java Server Pages):Java服务器页面,是由 Sun Microsystems 公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成 HTML、XML 或其他格式文档的Web网页的技术标准。
  • JSP 技术是以 Java 语言作为脚本语言的,JSP 网页为整个服务器端的 Java 库单元提供了一个接口来服务于HTTP的应用程序。
  • JSP文件后缀名为 *.jsp 。
  • JSP开发的WEB应用可以跨平台使用,既可以运行在 Linux 上也能运行在 Windows 上。

(2)JSP的特点
JSP在本质上还是Servlet,是一种简化的Servlet设计,但JSP是跨平台的,一次编写处处运行,提高了代码的健壮性和安全性。

(3)JSP的访问原理:
浏览器发起请求,请求JSP,请求被Tomcat服务器接收,执行JspServlet将请求的JSP文件转义成为对应的java 文件(也是Servlet),然后执行转义好的java文件。

2、JSP的组成部分

(1)JSP的语法、指令和标签
JSP代码示例

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>JSP</title>
    </head>
    <body>
    
    </body>
</html>

如上所示,处理第一行的代码属于JSP外,下面的和HTML页面模板代码没有差别。

(2)JSP的注释
前端注释格式:前端使用的注释格式在JSP里面能使用,虽然会被转译,也会被发送,但是不会被浏览器执行。

<!-- 注释内容 -->

Java注释格式:Java语言注释格式在JSP里面使用,虽然会被转译,但是不会被servlet执行。

第一种
//注释内容
第一种
/*注释内容*/
第一种
/**
 *注释内容
 */

JSP注释格式:JSP的专用注释格式不会被转译,一般也推荐使用这种注释。

<%-- 注释内容 --%>

(3)JSP的指令和标签
① page指令

<%@page 属性名="属性值" 属性名="属性值"...%>

常见属性

  • contentType:设置JSP数据相应给浏览器时,浏览器的解析和编码格式,一般为contentType="text/html;charset=UTF-8"
  • language:声明JSP要被转译的语言格式。
  • import:声明转译的java文件要导入的包,不同的包使用逗号隔开。
  • pageEncoding:用于设置当前文件保存数据的编码格式。
  • session:是指转译的servlet中是否开启session支持,默认为开启,true表示开启,false表示关闭
  • errorPage:设置当JSP运行错误时要跳转的页面。
  • extends:设置JSP转移的java文件要继承的父类(包名+类名)。

② taglib指令
导入标签库、命令库等

<%@ taglib uri="路径"  prefix="c"%>
  • uri:表示路径
  • prefix:表示取的别名

③ include标签
导入文件(jsp文件),jsp文件的引入,能够降低jsp代码的冗余,也便于后期的维护升级。

静态引入:表示静态引入其他jsp页面内容,将引入的jsp文件和当前的jsp文件转译成一个java文件。

<%@ include file="url路径"%>
示例
<%@ include file="test.jsp"%>
  • file:表示要引入的jsp文件的相对路径

需要注意的是,引入的jsp文件和当前jsp文件不能存中同名的变量。

动态引入:表示动态引入其他jsp文件,引入的jsp文件会被单独转译,在当前文件转译好的java文件中调用引入的jsp文件的转译文件,在页面显示时会显示两个jsp文件合并后的内容。

<jsp:include page="url路径"></jsp:include>
示例
<jsp:include page="test.jsp"></jsp:include>
  • page:表示要引入的jsp文件的相对路径。

动态引入允许引入的jsp文件和当前jsp文件存中同名变量。

④ forward标签
forward指令表示请求转发,请求转发的地址栏信息不会发生改变。
语法

<jsp:forward page="url路径" ></jsp:forward>
  • page:要转发的isp文件的相对路径

示例:

<jsp:forward page="url路径" >
	<jsp:param value="value" name= "name"/>
</jsp:forward>

<% 获取请求转发携带的数据 %>
<%=request.getParameter("name")%>

<jsp:param value="value" name= "name"/>表示在请求转发时可以携带键值对形式的数据

在转发标签的两个标签中间除了写<jsp:param value="value" name= "name"/>子标签不会报错,其他任意字符都会报错,携带的数据会一?的形式凭借在转发路径的后面。

  • name:表示数据参数的value
  • value:表示数据参数的key

3、JSP的代码段

在JSP里面可以编写很多java代码,代码的语法与java语法类似,常见的代码格式有局部代码块、全局代码块
(1)局部代码块
局部代码块格式:

<% java代码 %>

局部代码块示例
if…else语法

<body>
	<%
    	int a = 1;
        if (a > 2) {
    %>
        <p>a的值大于2</p>
    <%
        } else {
    %>
        <p>a的值小于2</p>
    <%
        }
    %>
</body>

for循环语法

<body>
   <%
    for(int i = 0; i < 10; i++){
   %>
        <%=i %>
   <%
    }
   %>
</body>

从上面的示例可以发现,局部代码块在JSP里面会被原样的转译成对应的java代码语言,使用这种代码块会使整个JSP看起来比较繁琐和复杂,书写的时候也比较麻烦,阅读也很困难,特别是在有很多逻辑结构的时候。

(2)全局代码块
全局代码块可以用来声明变量,格式为

<%! 全局代码块 %>

全局代码块示例

<body>
    <%!
       public void show() {
           System.out.print("全局代码块");
       }
    %>
</body>

全局代码块声明的java代码能作为全局代码转译到对应的servetl类中,但是全局代码声明的代码需要使用局部代码块来调用。

(3)脚本段语句(变量)
语法

<%=变量值或者方法 %>

脚本段语句能够快速的获取变量或者方法的返回值作为数据相应给浏览器,需要注意的是,这里不需要在末尾添加分号

4、JSP的九大内置对象

(1)内置对象介绍

  • 内置对象指jsp文件在转译成其对应的Servlet文件的时候自动生成的并声明的对象,这些对象可以在jsp页面中直接使用。
  • 内置对象在jsp页面中使用,使用局部代码块或者脚本段语句来使用,不能够在全局代码块中使用。

(2)九大内置对象
可以在尖括号里面直接在使用

  • pageContext:九大内置对象中最为特别,是其他八大内置对象的总称,对象里面封存了其他八个对象和当前jsp的运行信息,每个jsp文件都单独拥有一个pageContext对象,其作用域为当前页面。
  • request:封存当前请求数据的对象,由Tomcat服务器创建,request对象只存在于一次请求中。
  • session:session对象用来存储用户的不同请求的共享数据的,其作用域只在一次会话中。
  • application:application对象也就是ServletContext对象,一个项目只有一个,存储用户共享数据的对象。以及完成其他操作,这个对象作用域整个项目内。
  • response:response是响应对象,用来响应请求处理结果给浏览器的对象,可以设置响应头,重定向。
  • out:响应输出对象,jsp内部使用,带有缓冲区的响应对象,效率高于response对象。
  • page:代表当前当前jsp的对象,类似于java里面的this
  • exception:exception是异常对象,存储了当前运行的异常信息,使用此对象需要在page指定中使用属性isErrorpage= "true"开启。
  • config:config也就是ServletConfig,主要是用来获取web.xml中的配置数据,完成一些初始化数据的读取。

5、JSP的四大作用域

  • pageContext:对应PageContext类,作用于当前页面,能够解决当前页面内的数据共享问题。
  • request:对应HttpServletRequest类,作用于一次请求,能够解决一次请求的servlet的数据共享问题,将数据流转给下一个servlet。
  • session:对应HttpSession类,作用于一次会话,能够解决一个用户的不同请求的数据共享问题,将数据从一次请求流传给其他请求。
  • application:对应ServletContext类,作用于整个项目内,能够解决不同用户的数据共享问题,将数据从一个用户流转给其他用户。

四大作用域作用范围依次增大,优先级依次减小。

二、EL表达式

1、EL概述

(1)介绍
EL全称: Expression Language,是一种写法非常简介的表达式。语法简单易懂,便于使用。

(2)EL表达式的作用

  • 让jsp书写起来更加的方便。简化在jisp中获取作用域或者请求数据的写法。也会搭配Jstl来进行使用。

(3)语法
语法结构: ${expression]}提供和[ ]两种运算符来存取数据。

使用之前,需要使用jsp的命令将其jar包导入jsp之中。

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

想要前端jsp获取后端传入到前端的数据,需要使用EL表达式获取值

${变量名}

2、EL表达式示例

(1)使用EL表达式获取一个对象中的值
后端User类

public class User{
	private int age;
	
	public void setAge(int age){
		this.age = age;
	}
	public int getAge(){
		return this.age;
	}
}

Servlet类

User user = new User();
int age = 100;
user.setAge(age);
//将对象存入request域中
request.setAttribute("user",user);
//请求转发
RequestDispatcher rd = request.getRequestDispatcher("jsp的路径");
rd.forward(request, response);

前端jsp获取

${user.getAge() }

(2)EL获取一个后端传入到前端的集合数据
Servlet类

List<String> list = new ArrayList<String>();
list.add("admin");
list.add("root");
list.add("123456");
list.add("qwer");
//将对象存入request域中
request.setAttribute("list",list);
//请求转发
RequestDispatcher rd = request.getRequestDispatcher("jsp的路径");
rd.forward(request, response);

前端获取数据

//获取指定下标的单个数据
${list[index]}
//获取整个集合的值,需要遍历
<c:forEach var = "变量名" items="后端传入的变量名(如list)">
	${变量名}
</c:forEach>

(3)EL表达式处理Session数据
获取Session 的值 ${sessionScope.user}
后端代码类

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws Exception {
    String userName = request.getParameter("userName");
    String passWord = request.getParameter("passWord");
    User user = new User();
    user.setName(userName);
    user.setPassword(passWord);
    //将这个数据存放到session中,
    request.getSession().

    setAttribute("user",user);
    request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
}

前端获取session

<body>
    <p>前端获取到的后端的session中的userName为:</p>
    ${sessionScope.userName}
    <p>前端获取到的后端的session中的passWord为:</p>
    ${sessionScope.passWord}
</body>
发布了104 篇原创文章 · 获赞 58 · 访问量 7513

猜你喜欢

转载自blog.csdn.net/baidu_27414099/article/details/104440903