JSP,EL,JSTL

Posted ascto

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JSP,EL,JSTL相关的知识,希望对你有一定的参考价值。

JSP

由于csdn不支持jsp代码块,所以阅读起来不太舒适,还望理解~

jsp全称为Java server pages 。Java的服务器页面。

jsp的主要作用是:代替servlet程序回传html页面的数据。

因为servlet程序回传HTML页面是一件非常繁琐的事情,开发成本和维护成本都极高。

jsp的本质:一个servlet程序。

当我们第一次访问jsp页面的时候,tomcat服务器会帮我们把jsp页面翻译成为一个Java源文件,并且对它进行编译成为.class字节码程序

jsp的page指令

<%--配置指令,可以修改jsp页面中一些重要的属性或行为--%>
<%--
language:翻译后是啥语言
contentType:表示jsp返回的数据类型是什么,也是源码中response.setContentType参数值
pageEncoding:当前页面本身字符集
import:导包
autoFlush属性:设置当out输出流缓冲区满了之后,是否自动刷新,默认为true
buffer属性:设置out缓冲区大小,默认为8kb
errorPage:设置当jsp页面运行时出错,自动跳转去的错误页面路径
isErrorPage:设置当前jsp页面是否是错误信息页面,默认是false,如果是true可以获取异常信息。	
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
这是jsp数据
</body>
</html>

jsp中的常用脚本

1.声明脚本:

声明脚本的格式:<%! 声明Java代码 %>

作用:可以给jsp翻译出来的Java类定义属性和方法,甚至是静态代码块,内部类等。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--1.定义属性--%>
<%!
private  Integer id;
private String name;
private static Map<Object,String> map;
%>
<%--2.定义static代码块--%>
    <%!
        static 
            map = new HashMap<Object, String>();
            map.put("key1","value1");
            map.put("key2","value2");
        
    %>
<%--3.声明类的方法--%>
    <%!
         public  int abc()
             return 1;
         
    %>
<%--4.声明内部类--%>
    <%!
        public static class A 
            private Integer a=12;
            private String abc="abc";
    
    %>
</body>
</html>

2.表达式脚本

表达式脚本的格式是: <%=表达式%>

作用:在jsp页面上输出数据。

<%--表达式脚本--%>
    <%=12%><br/>
    <%=12.12%><br/>
    <%="我是字符串"%> <br/>
    <%=map%> <br/>

表达式脚本的特点:

1.所有的表达式脚本都会被翻译到_jspService方法中

2.表达式脚本都会被翻译成为out.print()输出到页面上

3.由于表达式脚本翻译的内容都在_jspService方法中,所以_jspService方法中的对象都可以直接使用

4.表达式脚本中的表达式不能以分号结束。

3.代码脚本

代码脚本的格式:<% Java语句 %>

作用:可以在jsp页面中编写我们自己需要的功能(写的是Java语句)。

特点:

1.代码脚本翻译之后都在_jspService方法中

2.代码脚本由于翻译到_jspService()方法中,所以在_jspService()方法中的现有对象都可以直接使用。

3.代码脚本还可以由多个代码脚本块组合完成一个完整的Java语句

4.代码脚本还可以和表达式脚本组合使用,在jsp页面上输出数据。

<%--代码脚本--%>
<%--if语句--%>
    <%
        int i=12;
        if (i==12)
            System.out.println("yes");
        else
            System.out.println("no");
        
    %>
<%--for语句--%>
    <%
        for (int j=0;j<9;j++)
            System.out.println(j);
        
    %>
<%--翻译后Java文件中_jspService方法内的代码都可以写--%>
    <%
        String username=request.getParameter("password");
        System.out.println("用户名的请求参数:"+username);
    %>

jsp中的三种注释

1.html注释: html注释会被翻译到Java源代码中

2.Java注释: // /**/ Java注释会被翻译到Java源代码中

3.jsp注释:<%-- --%> jsp注释可以注掉jsp页面中所有的代码。

jsp中九大内置对象

jsp中的内置对象是指:tomcat在翻译jsp页面成为servlet源代码后,内部提供的九大对象,叫内置对象。

request 请求对象 pageContext jsp的上下文对象 application ServletContext对象

response 响应对象 session 会话对象 config ServletConfig对象

out jsp输出流对象 page 指向当前jsp的对象 exception 异常对象

jsp四大域对象

pageContext(pageContextImpl类) 当前jsp页面范围内有效

request(HttpServletRequest类) 一次请求内有效

session(HttpSession类) 一个会话范围内有效(打开浏览器访问服务器,直到关闭浏览器)

application(ServletContext类) 整个web工程范围内都有效(只要web工程不停止,数据都在)

域对象是可以像map一样可以存取数据的对象。四个域对象功能一样,不同的是:对数据的存取范围。

虽然四个域对象都是可以存取数据的,但是他们在使用上是有优先顺序的

优先顺序是:从小到大范围的顺序,先使用pageContext,其次request,然后session,最后application。

jsp中的out输出和response.getWriter输出的区别

response中表示响应,我们经常用于设置返回给客户端的内容(输出)

out也是给用户做输出使用的。

由于jsp翻译之后,底层源代码都是使用out来进行输出,所以一般情况下,我们在jsp页面中统一使用out来进行输出。

避免打乱页面输出内容的输出顺序。

out.write()输出字符串没有问题

out.print()输出任意数据都没有问题(都转换为字符串后利用write输出)

jsp常用标签

jsp静态包含

当需要修改多处时,可以利用静态包含。方便修改

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
头部信息
主题内容
<%@include file="footer.jsp"%>
</body>
</html>

--------
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
页脚信息
</body>
</html>

jsp动态包含

动态包含也可以像静态包含一样,将内容输出
动态包含的特点;
1.动态包含会把包含的jsp页面也翻译成Java代码
2.动态包含底层代码使用如下:JspRuntimeLibrary.include(request,response,"/include/footer.jsp",out,false);
3.动态包含还可以传递参数

<jsp:include page="footer.jsp">
    <jsp:param name="username" value="bbj"/>
    <jsp:param name="password" value="132"/>
</jsp:include>

动态包含的底层原理

jsp标签-转发

请求转发

   <%--请求转发--%>
<jsp:forward page="output.jsp"></jsp:forward>

Listener监听器

什么是listener监听器?

Javaweb的三大组件之一,javaweb的三大组件分别是:servlet程序,filter过滤器,listener监听器

listener是JavaEE规范(接口)

作用:监听某种事物的变化,然后通过回调函数。反馈给客户(程序),去做一些响应的处理。

ServletContextListener监听器

它可以监听servletContext对象的创建和销毁。servletContext对象在web启动创建,停止时销毁。

监听到创建和销毁之后都会分别调用servletContextListener监听器的方法反馈

EL表达式

什么是EL表达式?作用是什么

EL表达式全称是:Expression language。是表达式语言

EL表达式作用:EL表达式作用主要是:替代jsp页面中的表达式脚本在jsp页面中进行数据的输出。

因为EL表达式在输出数据更简洁

<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    request.setAttribute("key","值");

%>
表达式脚本输出key的值是
<%=request.getAttribute("key")%><br/>
EL表达式输出key的值是:$key
</body>
</html>

EL表达式的格式::$表达式

EL表达式在输出null值的时候,输出的是空串,jsp输出null的时候就是null字符串(用户未必认识)

当四个域中都有key数据时,EL表达式会按照四个域的从小到大去进行搜索

输出复杂的bean对象:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="test.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
    Person person=new Person();
    person.setName("刘畅");
    person.setPhones(new String[]"111","132","155");
    List<String> cities=new ArrayList<>();
    cities.add("北京");
    cities.add("上海");
    cities.add("深圳");
    person.setCities(cities);
    Map<String,Object> map=new HashMap<>();
    map.put("key1","value1");
    map.put("key2","value2");
    person.setMap(map);
    pageContext.setAttribute("p",person);
%>
输出person:$p<br/>
输出person的name属性:$p.name<br/>
输出person的phones值:$p.phones[0]<br/>
输出Perosn的cities集合中的元素值:$p.cities[0]
输出person的map集合某个key:$p.map.key1
</body>
</html>

EL关系运算

EL逻辑运算

EL算数运算

empty运算

empty运算可以判断一个数据是否为空,如果为空输出true,反之输出false。

<%
    request.setAttribute("emptyNull",null);
%>
$empty emptyNull<br/>
返回true

点运算和中括号运算

点运算可以输出Bean对象中某个属性的值 []运算可以输出某个集合元素值,还可以用作map中特殊key的keyvalue输出

如下例子:

EL表达式中11个隐含对象

EL表达式中11个隐含对象,是EL表达式中自己定义的,可以直接使用。

pageContext对象的使用

JSTL

什么是jstl标签库:全称:JSP Standard Tag Library 即 JSP标准标签库。是一个不断完善的开放源代码的JSP标签库。

EL表达式主要是为了替换jsp中的表达式脚本,而标签库则是为了替换代码脚本。这样使得整个jsp页面变得更加简洁。

core核心库使用

<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ 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>

    <%--
    1.<c:set/>
    作用:set 标签可以往域中保存数据
    域对象.setAttribute(key,value);
    scope 属性设置保存到哪个域
        page表示pageContext域(默认值)
        request表示Request域
        session表示Session域
        application表示ServiceContext域
        key是多少
        value是多少
    --%>
    保存之前:$requestScope.abc <br/>
    <c:set scope="request" var="abc" value="abc123"/>
    保存之后:$requestScope.abc <br/>
    <hr/>
<%--if标签用来做if判断
test属性表示判断的条件(使用EL表达式输出)
--%>
<c:if test="$12==12">
    <h1>成立!</h1>
</c:if>
<%--
<c:choose><c:when><c:otherwise>标签
作用:多路判断。跟switch..case..default很接近
choose 标签开始选择判断 when标签表示每一种判断情况
不需要break那样,
otherwise表示剩下的情况
<c:choose><c:when><c:otherwise>标签使用时需要注意的点:
1.标签里不能使用HTML注释,要使用jsp注释
2.when标签的父标签一定要是choose标签
--%>
<%
    request.setAttribute("height",178);
%>
<c:choose>
    <%--这是jsp注释--%>
    <c:when test="$requestScope.height>190">
        <h2>小巨人</h2>
    </c:when>
    <c:when test="$requestScope.height>180">
        <h2>很高</h2>
    </c:when>
    <c:when test="$requestScope.height>170">
        <h2>还可以</h2>
    </c:when>
    <c:otherwise>
        <h2>快长高高</h2>
    </c:otherwise>
</c:choose>
<%--
<c:forEach />
作用:遍历输出使用。
begin设置开始的索引,end设置结束的索引,var属性表示循环的变量
--%>
    <%--遍历1-10--%>
<c:forEach begin="1" end="10" var="i">
    $i
</c:forEach>
<%--遍历object数组
var表示当前遍历到的数据
--%>
<%
    request.setAttribute("arr",new String[]"111","222","333");
%>
<c:forEach items="$requestScope.arr" var="item">
    $item
</c:forEach>
<%--遍历map--%>
<%
    Map<String,Object> map=new HashMap<>();
    map.put("key1","value1");
    map.put("key2","value2");
    request.setAttribute("map",map);
    %>
<c:forEach items="$requestScope.map" var="entry">
    $entry.key
</c:forEach>
</body>
</html>

文件的上传和下载

文件的上传和下载是非常常见的功能,很多系统中,或者软件中都经常使用文件的上传和下载。比如qq头像,就是使用了上传。邮箱中也有附件的上传和下载功能。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8080/07_EL_JSTL/uploadServlet" method="post" enctype="multipart/form-data">
    用户名:<input type="text" name="username"/> <br>
    头像:<input type="file" name="photo"><br>
    <input type="submit" value="上传">
</form>
</body>
</html>

文件上传的介绍

1.要有一个form标签,method=post请求

2.form标签的encType属性值必须为multipart/form-data值

3.在form标签中使用input type=file添加上传的文件

4.编写服务器(servlet)代码接收,处理上传的数据。

encType=mutipart/form-data表示提交的数据,以多段的形式


package test;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.sampled.Line;
import java.io.File;
import java.io.IOException;
import java.util.List;

public class UploadServlet extends HttpServlet 

    /*用来处理上传数据*/
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       //1.判断上传的数据是否是多段数据,只有多段数据才是文件上传



        if (ServletFileUpload.isMultipartContent(req))
            //创建FileItemFactory工厂实现类
            FileItemFactory fileItemFactory=new DiskFileItemFactory();
            //创建用于解析上传数据的工具类ServletFileUpload类
            ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
            try 
                List<FileItem> list =servletFileUpload.parseRequest(req);
                //循环判断,每一个表单项是普通类型还是上传的文件
                for (FileItem fileItem : list) 
                    if (fileItem.isFormField())
                        //普通表单项
                        System.out.println("表单项的name属性值:"+fileItem.getFieldName());
                        //参数UTF-8乱码问题
                        System.out.println("表单项的value属性值:"+fileItem.getString("UTF-8"));
                    else
                        //上传的文件
                        System.out.println("表单项的name属性值:"+fileItem.getFieldName());
                        System.out.println("上传的文件名:"+fileItem.getName());

                        fileItem.write(new File("e:\\\\"+fileItem.getName()));
                    
                
             catch (Exception e) 
                e.printStackTrace();
            
        else 

        
    

文件下载


package test;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sound.sampled.Line;
import java.io.File;
import java.io.IOException;
import java.util.List;

public class UploadServlet extends HttpServlet 

    /*用来处理上传数据*/
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
       //1.判断上传的数据是否是多段数据,只有多段数据才是文件上传



        if (ServletFileUpload.isMultipartContent(req))
            //创建FileItemFactory工厂实现类
            FileItemFactory fileItemFactory=new DiskFileItemFactory();
            //创建用于解析上传数据的工具类ServletFileUpload类
            ServletFileUpload servletFileUpload=new ServletFileUpload(fileItemFactory);
            try 
                List<FileItem> list =servletFileUpload.parseRequest(req);
                //循环判断,每一个表单项是普通类型还是上传的文件
                for (FileItem fileItem : list) 
                    if (fileItem.isFormField())
                        //普通表单项
                        System.out.println("表单项的name属性值:"+fileItem.getFieldName());
                        //参数UTF-8乱码问题
                        System.out.println("表单项的value属性值:"+fileItem.getString("UTF-8"));
                    else
                        //上传的文件
                        System.out.println("表单项的name属性值:"+fileItem.getFieldName());
                        System.out.println("上传的文件名:"+fileItem.getName());

                        fileItem.write(new File("e:\\\\"+fileItem.getName()));
                    
                
             catch (Exception e) 
                e.printStackTrace();
            
        else 

        
    

MVC

MVC全称:Model模型,View视图,Controller控制器

MVC最早出现在JavaEE三层中的Web层,它可以有效的指导Web层的代码如何有效的分离,单独工作。

View视图:只负责数据和页面显示,不接受任何与显示数据无关的代码,便于美工与程序员分工合作—jsp/HTML

Controller控制器:只负责接收请求,调用业务层的代码处理请求,然后派发页面,是一个调度者的角色—servlet。转到某个页面或者重定向到某个页面。

Model模型:将与业务逻辑相关的数据封装为具体的JavaBean类,其中不掺杂任何与数据处理相关的代码—JavaBean/domain/entity

MVC是一种思想:MVC的理念是将软件代码拆分成为组件,单独开发,组合使用(解耦合)。

以上是关于JSP,EL,JSTL的主要内容,如果未能解决你的问题,请参考以下文章

jsp+el+jstl

JavaLearn#(24)SessionCookieServletContextMVC开发模式JSP九大内建对象及四个作用域JSTL及EL表达式过滤器监听器

动态页面技术(JSP/EL/JSTL)

jsp&el&jstl

EL/JSTL-jsp页面更简单的输出方式

JSTL和EL