2-39 JSP之EL表达式

JSP中Out输出和response.getWriter输出的区别

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

out也是给用户做输出使用【JSP】

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>out输出和getWriter输出的区别</title>
</head>
<body>
     <%
         out.write("out输出1<br/>");
         out.write("out输出2<br/>");
         response.getWriter().write("response输出1<br/>");
         response.getWriter().write("response输出2<br/>");

     %>

</body>
</html>

请添加图片描述

总结:由于JSP翻译之后,底层代码都是使用out来进行输出了,所以一般情况下,我们建议在JSP页面中统一使用out来进行输出,这样可以避免页面输出顺序被打乱

问题:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>out输出数据问题</title>
</head>
<body>
    <%
        out.write("65");
        out.print("65");
    %>
    <br/>
     <%--   修改代码  --%>
    <%
        out.write(65);
        out.print(65);
    %>

</body>
</html>

jsp中out输出有两个方法,一个是write、一个是print

out.write 输出字符串没有任何问题

out.print 输出任意数据都没有问题

原因:在于org.apache.jasper.runtime包中有一个类JspWriterImpl,这个类正好是out类的JspWriter的实现了

在原码中write方法会输入的数字转换为对应字符进行存储print方法会将会所有写入的数据都转换为字符串处理【print的处理核心转换完字符串之后还是调用write方法】

作业1:在JSP页面中输出九九乘法表

<%--
  Created by IntelliJ IDEA.
  User: jkmaster
  Date: 2020/10/15
  Time: 8:48
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>九九乘法表</title>
     <style type="text/css">
         table{
             width: 650px;
         }
     </style>
</head>
<body>
    <h1 align="center">九九乘法表</h1>
    <table align="center">
        <% for(int i = 1 ;i<=9;i++){%><tr>
        <%for (int j = 1;j<=i;j++){%>
        <td><%= j+"x"+i+"="+(i*j)%></td>
        <%}%></tr>
        <%}%>
    </table>

</body>
</html>

作业2: jsp输出一个表格。里面有10个学生信息

1.需要先创建一个实体类Student类

package com.qfedu.entity;

public class Student {
       private Integer id;
       private String name;
       private Integer age;
       private String phone;
    public Student() {
    
    }
    public Student(Integer id, String name, Integer age, String phone) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.phone = phone;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", phone='" + phone + '\'' +
                '}';
    }
}

创建一个类处理学生信息的类Servlet

package com.qfedu.controller;

import com.qfedu.entity.Student;

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;
import java.util.ArrayList;
import java.util.List;

@WebServlet(name = "SerchStudentServlet",value="/sss")
public class SerchStudentServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //模拟得到请求参数,并且已经查询出结果
        List<Student> list = new ArrayList<>();
        for(int i = 0;i<10;i++){
              int t = i+1;
              list.add(new Student(t,"name"+t,18+t,"phone"+t));
        }
        //用到一个作用域了【请求转发 request】
        //保存查询到数据
        request.setAttribute("stuList",list);
        //请求转发
        request.getRequestDispatcher("/showStudnet.jsp").forward(request,response);
    }
}

创建showStudent.jsp页面

<%@ page import="com.qfedu.entity.Student" %>
<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: jkmaster
  Date: 2020/10/15
  Time: 9:04
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>展示学生信息</title>
    <style type="text/css">
        table{
            border:  1px blue solid;
            width: 600px;
            border-collapse: collapse;
        }
        td,th{
            border: 1px blue solid;
        }
    </style>
</head>
<body>
            <%--   获取存在request作用域中数据--%>
        <% List<Student> studentList = (List<Student>)request.getAttribute("stuList");%>
        <table>
            <tr>
                <td>编号</td>
                <td>姓名</td>
                <td>年龄</td>
                <td>电话</td>
                <td>操作</td>
            </tr>
            <% for(Student student : studentList) {%>
            <tr>
                <td><%=student.getId()%></td>
                <td><%=student.getName()%></td>
                <td><%=student.getAge()%></td>
                <td><%=student.getPhone()%></td>
                <td>删除、修改</td>
            </tr>
            <%}%>
        </table>

</body>
</html>

扩展:Listener监听器【了解】

Listener监听器是JavaWeb三大组件之一,JavaWeb的三大组件分别是:Servlet程序、Filter过滤器、Listener监听器

Listener它是JavaEE的规范即接口,主要作用是监听某些事物的变化,然后用过回调函数,反馈给客户(程序)做一些响应处理

JavaWeb中原始监听器一共有8个,但是随着技术的迭代监听器逐渐被淘汰了

现在如果还在使用无非就是这个几个监听器【ServletContextListener、HttpSessionListener】

ServletContextListener监听是服务器对象创建和销毁

HttpSessionListener 监听是代码中第一次调用request.getSession()或第一次访问jsp页面的时候和服务器非正常关闭、超时、手动销毁【监听这几个变化】

@WebListener()  
// -------------------------------------------------------
    // ServletContextListener implementation
    // -------------------------------------------------------
    public void contextInitialized(ServletContextEvent sce) {
      /* This method is called when the servlet context is
         initialized(when the Web application is deployed). 
         You can initialize servlet context related data here.
      */
    }

    public void contextDestroyed(ServletContextEvent sce) {
      /* This method is invoked when the Servlet Context 
         (the Web application) is undeployed or 
         Application Server shuts down.
      */
    }
   
    // -------------------------------------------------------
    // HttpSessionListener implementation
    // -------------------------------------------------------
    public void sessionCreated(HttpSessionEvent se) {
        /* Session is created. */
    }

    public void sessionDestroyed(HttpSessionEvent se) {
        /* Session is destroyed. */
    }

ps:剩余监听器【ServletContextAttributeListener、ServletRequestAttributeListener、HttpSessionAttributeListener(这个是三个监听的式属性变化)、HttpSessionBindingListener(监听JavaBean)、HttpSessionActivationListener(钝化和活化【序列化、反序列化(回到Session中)】)】

EmpProject页面进行JSP整合

将EmpProject项目所有显示页面使用JSP替代原有Servlet输出

1.修改showAllEmpController类的跳转语句

  request.getRequestDispatcher("/manager/safe/showAllEmp.jsp").forward(request,response);

2.在web目录下创建manager目录结构/manager/safe/showAllEmp.jsp

<%@ page import="com.qf.emp.entity.Emp" %>
<%@ page import="java.util.List" %><%--
  Created by IntelliJ IDEA.
  User: jkmaster
  Date: 2020/10/15
  Time: 9:46
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>查询所有员页面</title>
</head>
<body>
       <table border='1'>
            <tr>
                   <td>编号</td>
                   <td>姓名</td>
                   <td>工资</td>
                   <td>年龄</td>
                   <td colspan='2'>操作</td>
            </tr>
         <%
             List<Emp> emps = (List<Emp>)request.getAttribute("emps");
             for(Emp emp:emps) {
         %>
                   <tr>
                       <td><%=emp.getId()%></td>
                       <td><%=emp.getName()%></td>
                       <td><%=emp.getSalary()%></td>
                       <td><%=emp.getAge()%></td>
                       <td><a href="<%=request.getContextPath()+"/manager/safe/removeEmpController?id="+emp.getId()%>">删除</a></td>
                       <td><a href="<%=request.getContextPath()+"/manager/safe/showEmpController?id="+emp.getId()%>">修改</a></td>
                   </tr>
          <%
             }
          %>
       </table>


</body>
</html>


3.修改ShowEmpController类

request.getRequestDispatcher("/manager/safe/showUpdateEmpInfo.jsp").forward(request,response);

添加Jsp页面

<%@ page import="com.qf.emp.entity.Emp" %><%--
  Created by IntelliJ IDEA.
  User: jkmaster
  Date: 2020/10/15
  Time: 9:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>修改员工信息页面</title>
</head>
<body>
       <%
           Emp emp = (Emp)request.getAttribute("emp");
       %>

       <form  action='/empproject/manager/safe/updateEmpController' method='post'>
               编号:<input type='text' name='id' value="<%=emp.getId()%>" readonly/><br/>
               姓名:<input type='text' name='name' value="<%=emp.getName()%>" /><br/>
               工资:<input type='text' name='salary' value="<%=emp.getSalary()%>" /><br/>
               年龄:<input type='text' name='age' value="<%=emp.getAge()%>" /><br/>
               <input type='submit' value='修改'/><br/>
       </form>
   
</body>
</html>


EL表达式

概念

EL表达式的全称 Expression language 是表达语言

EL表达式的作用**:EL表达式的作用就是替代JSP页面中表达式脚本在JSP页面中进行数据输出**

因为EL表达式在输出数据的时候,要比JSP的表达式脚本要简洁很多

EL使用JSP写起来更加简单、简洁。主要作用【获取作用域中数据】

如果使用EL表达式? EL表达式的格式${表达式}

演示:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>简单演示EL表达式</title>
</head>
<body>
     <%
         //存储在request作用域中数据
         request.setAttribute("name","tom");
         request.setAttribute("age",18);
     %>
JSP通过表达式脚本输出key的值是:<%=request.getAttribute("name")%><br/>
EL表达式使出key的值是:${age}

</body>
</html>


需要注意:

EL表达式在输出null值的时候,输出的式一个空字符串【空串】

jsp表达式脚本输出null值的时候,输出的式null的字符串

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式输出问题</title>
</head>
<body>
     <%
         //存储在request作用域中数据
         request.setAttribute("name","tom");
         request.setAttribute("age",18);
     %>
JSP通过表达式脚本输出key的值是:<%=request.getAttribute("name1")%><br/>
EL表达式使出key的值是:${age1}

</body>
</html>


EL表达式的作用就是替代JSP在页面中输出数据,主要输出的式域对象中存储的数据

EL表达式搜索域存数据顺序

JSP页面中有4个域对象【pageContext、reques、session、application】
当四个域中都有相同key的时候,EL表达式会按照【四个域从小到大的熟顺序进行搜索,找到并输出】

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式搜索域问题</title>
</head>
<body>
     <%
         //存储在域中数据
         request.setAttribute("key","req");
         session.setAttribute("key","sess");
         pageContext.setAttribute("key","page");
         application.setAttribute("key","app");
     %>
      key值是:${key}

</body>
</html>



如果需要精确查找某个范围内是否存在数据,有一个处理方法 XXXScope例如${requestScope.key},这样就可以取出这个作用域范围内的值,但是这个操作不包括pageContext

ps: XXXScope方法点的是key名字

 request作用域中存储key的值:${requestScope.key}

EL表达式可以引用数据类型

EL表达式输出Bean(实体类)的普通属性,数组属性,List集合属性,map集合属性

创建一个Person实体类

package com.qfedu.entity;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class Person {
      private String name;
      private String[] phones;
      private List<String> cities;
      private Map<String,Object> map;
    public Person() {

    }
    public Person(String name, String[] phones, List<String> cities, Map<String, Object> map) {
        this.name = name;
        this.phones = phones;
        this.cities = cities;
        this.map = map;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String[] getPhones() {
        return phones;
    }

    public void setPhones(String[] phones) {
        this.phones = phones;
    }

    public List<String> getCities() {
        return cities;
    }

    public void setCities(List<String> cities) {
        this.cities = cities;
    }

    public Map<String, Object> getMap() {
        return map;
    }

    public void setMap(Map<String, Object> map) {
        this.map = map;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", phones=" + Arrays.toString(phones) +
                ", cities=" + cities +
                ", map=" + map +
                '}';
    }
}


在JSP页面中输出实体类中数据【使用EL表达式】

<%@ page import="com.qfedu.entity.Person" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %><%--
  Created by IntelliJ IDEA.
  User: jkmaster
  Date: 2020/10/15
  Time: 10:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>EL表达式输出引用类型</title>
</head>
<body>
     <%
         Person person = new Person();
         person.setName("大宝");
         person.setPhones(new String[]{
                 "18888886666",
                 "18666668888",
                 "13112345678",
         });
         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");
         map.put("key3","value3");
         person.setMap(map);

         //将Person对象存作用域中
         pageContext.setAttribute("p",person);
     %>
        输出存储在Person对象中的值:<br/>
        name的值:${p.name}<br/>
        取出电话号码phones:${p.phones[2]}<br/>
        取出所有工作的城市: ${p.cities}<br/>
        去过哪个工作的城市: ${p.cities[1]}<br/>
        输出map集合中数据:${p.map}<br/>
        输出map集合某个key的数据: ${p.map.key1}<br/>



</body>
</html>


使用EL获取作用域中的对象,并调用对象属性时,【只能访问对象的get方法】,所以必须满足命名规范【get属性】

PS:EL获取对象中的属性时,本质不是访问对象属性,而是访问类中定个get方,就算不提供属性,只要给get依旧可以获取值

​ 这里有一个特殊的boolean因为boolean类型的get方法是isXXX,但是不影响取值

EL可以获取数组、List、map集合中的元素,但是set集合也可以获取但不能获取单个值,因为没有下标也没key值,遍历获取里面的值

EL支持运算符

语法:${运算符+表达式} EL表达式支持的运算符如下

关系运算符
关系运算符说 明范 例结 果
== 或 eq等于${5 == 5} 或 ${5 eq 5}true
!= 或 ne不等于 5 ! = 5 或 {5 != 5}或 5!=5{5 ne 5}false
< 或 lt小于 3 < 5 或 {3 < 5}或 3<5{3 lt 5}true
> 或 gt大于 2 > 10 或 {2 > 10}或 2>10{2 gt 10}false
<= 或 le小于等于 5 < = 12 或 {5 <=12}或 5<=12{5 le 12}true
>= 或 ge大于等于 3 > = 5 或 {3 >= 5}或 3>=5{3 ge 5}false
逻辑运算符
逻辑运算符说 明范 例结 果
&& 或 and逻辑与KaTeX parse error: Expected '}', got '&' at position 9: {12==12 &̲& 12<11}或{12==12 and 12<11}false
|| 或 or逻辑或 12 = = 12 ∣ ∣ 12 < 11 或 {12==12 || 12<11}或 12==12∣∣12<11{12==12 or 12<11}true
! 或 not取非值${!true} 或 ${not true}false
算数运算符
算数运算符说 明范 例结 果
+加法${12+18}30
-减法${1-1}0
*乘法${1*1}1
/ 或 div除法 1 / 1 或 {1/1}或 1/1{1 div 1}1
% 或 mod取余KaTeX parse error: Expected '}', got 'EOF' at end of input: {144%10}或{144 mod 10}4

其他操作运算符

操作符描述
.访问Bean(实体类)中属性或一个map的key
[]访问一个数组或链表中的元素,list集合
empty运算符可以判断一个数据是否为空,如果为空,则输出true,否则false
?:判断?之前的表达式是否为真,如果为真就执行:之前的第一个执行语句,否则执行:后面的执行语句

empty运算符判断的情况

1.值为null的时候,为空

2.值为空串的时候,为空

3.值是Object类型数据并且长度为零,为空

4.list集合中没有任何元素,为空

5.map集合中没有任何元素,为空

<%
request.setAttribute("Emptynull",null);
List<String> list = new ArrayList<>();
request.setAttribute("list",list);
//map中特殊的key名
Map<String,String>map = new HashMap<>();
map.put("key1","value1")
map.put("a.a.a","value2")    
request.setAttribute("map",map);    
%>
${empty Emptynull}
${empty list}
${empty list ? "list中没有数据":"逗你玩"}
${ map["a.a.a"]} 处理特殊key的情况



EL表达式中隐式对象

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

隐含对象描述数据类型
pageScopepage作用域,它可以获取pageContext域中存储的数据【但是已经不再使用】Map<String,Object>
requestScoperequest作用域,它可以获取request域中数据Map<String,Object>
SessionScopesession作用域,它可以获取session域中数据Map<String,Object>
applicationScopeapplication作用域,它可以获取application域中数据Map<String,Object>
paramrequest对象的参数,它可以获取请求中的参数值Map<String,String>
paramValuesrequest独享的参数,它可以获取请求中的参数值【多个值的使用】Map<String,String[]>
headerHTTP信息头,它可以获取请求头中信息Map<String,String>
headerValuesHTTP信息头,它可以获取请求头中信息【多个数据值是使用】Map<String,String[]>
initParam上下文初始化参数,它可以读取web.xml或注解中编写数据Map<String,String>
cookiecookie值,它可以获取当前请求的cookie信息Map<String,Cookie>
pageContext当前页面对象PageContextImpl

EL表达式依支持四个作用域中数据获取

pageContext域、Request域、Session域、ServletContext域

ps:request对象可以在JSP页面中进行传递,可以通过动作标签< jsp:forward>,可以将request对象存储到作用域中,在作用域获取并操作

在JSP页面通过EL表达式获取Cookie

1.先编写一个Servlet将Cookie发送给客户端

package com.qfedu.controller;

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

@WebServlet(name = "CookieServlet",value="/cookie")
public class CookieServlet 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 {
        Cookie cookie = new Cookie("username","tom");
        Cookie cookie1 = new Cookie("password","123456");
        response.addCookie(cookie);
        response.addCookie(cookie1);
    }
}


完成JSP页面

<%@ page import="java.util.Objects" %><%--
  Created by IntelliJ IDEA.
  User: jkmaster
  Date: 2020/10/15
  Time: 13:29
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>获取Cookie值[JSPAndCookie]</title>
</head>
<body>
       <!--JSP写法-->
<%--       <%--%>
<%--           Cookie[] cookies = request.getCookies();--%>
<%--           String  username = "";--%>
<%--           String  password = "";--%>
<%--           if(Objects.nonNull(cookies)){--%>
<%--               for(Cookie cookie : cookies){--%>
<%--                   if(cookie.getName().equalsIgnoreCase("username")){--%>
<%--                       username = cookie.getValue();--%>
<%--                   }--%>
<%--                   if(cookie.getName().equalsIgnoreCase("password")){--%>
<%--                       password = cookie.getValue();--%>
<%--                   }--%>
<%--               }--%>
<%--           }--%>
<%--       %>--%>
<%--        <%=username%><br/>--%>
<%--        <%=password%>--%>
         <%--        EL表达式获取Cookie数据--%>
        <h1>${cookie.username.value}</h1>
        <h1>${cookie.password.value}</h1>
     <!--登录时自动填充用户和密码-->
      <input type="text" name="username" value="${cookie.username.value}"/><br/>
       <input type="password" name="password" value="${cookie.password.value}"/><br/>
</body>
</html>


如何获取URL路径中参数

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>通过EL获取数据</title>
</head>
<body>
<%--   http://localhost:8080/EL/GetParam.jsp?username=zhangsan&password=123456&hobby=java&hobby=JSP--%>
        请求URL中username的值:${param.username}<br/>
        请求URL中password的值:${param.password}  <br/>
<%--         当面临key相同value值不同时候,如果获取出值--%>
        请求URL中hobby的值是:${paramValues.hobby[0]}<br/>
        请求URL中hobby的值是:${paramValues.hobby[1]}<br/>
</body>
</html>


JSTL标准标签库

JSTL标签库全称是: JSP Standard Tag Library --》 JSP标准标签库,这个是一个不断完善的开源的JSP标签库代码

EL表达式的主要作用是替换JSP中表达式脚本,而标签库(JSTL)则是为了替换代码脚本,可以使整个JSP页面变得更加简洁

现有问题:

EL主要作用是获取作用域中数据,虽然可以做运算判断,但是得到都是一个结果

EL不存在流程控制,比如判断

EL对集合只能做单点访问【一次只能访问一个数据】,不能实现遍历操作,比如循环

解决方案:

通过JSTL可对EL获取到的数据进行逻辑操作,并与EL合作完成后数据的展示

JSTL是由五个不同功能标签组成

功能范围URI前缀
核心标签库【重要】http://java.sun.com/jsp/jstl/corec
格式化http://java.sun.com/jsp/jstl/fmtfmt
函数http://java.sun.com/jsp/jstl/functionsfn
数据库【不用】http://java.sun.com/jsp/jstl/sqlsql
XML【不用】http://java.sun.com/jsp/jstl/xmlx

JSTL的使用

1.需要导入核心类库包standard.jar和jstl.jar,在WEB-INF下

2.在jsp页面中使用taglib指令引用标签库

ps:即在JSP页面中写入一下这句话【核心库的引入】

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

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

core核心类库使用

< c:set/ >(使用较少)

作用: set标签可以往作用域中保存数据

< c:if/ >

作用 if标签可以和用来做if判断

< c:choose > < c:when > < c:otherwise >

作用: 多路判断类似于java中 switch …case …default

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSTL核心标签库【set、if、choose、when、otherwise】</title>
</head>
<body>
    <%--
       此标签了解即可set,可以将数据保存在作用域中
       ps:这里完全可以使用域对象完成
       scope 作用域   var key名字  value 存储的值
    --%>
     <c:set scope="session" var="abc" value="abcValue"/>
     获取值:${sessionScope.abc}
      <hr>
     <%--   if标签判断执行逻辑
            test属性是判断条件(是同EL表达式)
        --%>
     <c:if test="${12 == 12}">
         <h1>12等于12</h1>
     </c:if>
     <hr>
     <%--  choose、when、otherwise 标签组成
        choose标签开始选择判断
        when表示每一种判断情况配置test属性进行条件判断
        otherwise 表示剩余的最后一种情况
        需要注意:
        这个标签使用的时候,不能使用html注释,要使用jsp注释
        when标签父标签一定要是choose标签--%>
      <%
          request.setAttribute("height",180);
      %>
    <c:choose>
        <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>ok</h2>
        </c:otherwise>
    </c:choose>

</body>
</html>

< c:forEach >

作用:遍历输出使用

<c: foreach

​ var = “变量名”

​ items=“集合”

​ begin=“起始下标”

​ end=“结束下标”

​ step=“间隔或步长”

varstatus=“遍历状态”>

< /c:foreach >

<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.qfedu.entity.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--
  Created by IntelliJ IDEA.
  User: jkmaster
  Date: 2020/10/15
  Time: 14:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSTL核心标签库【foreach标签】</title>
    <style type="text/css">
        table{
            width: 500px;
            border: 1px red solid;
            border-collapse:  collapse;
        }
        th,td{
            border:  1px red solid;
        }
    </style>
</head>
<body>
         <%--
         遍历1到10,输出
         for(int i = 1;i<10;i++)
         对照形式写c:foreach可以写成
         begin属性是开始索引【1】   end属性是结束索引【10】   var属性是变量【i】
         --%>
    <table>
        <c:forEach begin="1" end="10" var="i">
            <tr>
                <td>第${i}行</td>
            </tr>
        </c:forEach>
    </table>
     <%--遍历集合和数组--%>
    <%
        request.setAttribute("arr",new String[]{
                "zhangsan",
                "lisi",
                "dabao"
        });
    %>
         <hr>
    <%--    items属性参数设需要是一个集合或数组  var获取存在集合或数组值
            for(String  str : arr)--%>
    <c:forEach items="${requestScope.arr}" var="item">
        ${item}<br/>
    </c:forEach>
          <%--     map集合的遍历
          需要注意取值的位置有些类似之前学习map中entrySet--%>
         <%
             Map<String,String> map = new HashMap<>();
             map.put("key1","value1");
             map.put("key2","value2");
             request.setAttribute("map",map);
         %>
         <hr>
         <%--    items属性参数设需要是一个集合或数组  var获取存在集合或数组值
                 for(String  str : arr)--%>
         <c:forEach items="${requestScope.map}" var="entry">
       <%--             entry值相当于存储一个完整的键值对--%>
             ${entry.key}= ${entry.value}<br/>
         </c:forEach>
        <hr>
         <%--        遍历Student是实体类进行打印--%>
        <%
            //模拟得到请求参数,并且已经查询出结果
            List<Student> list = new ArrayList<>();
            for(int i = 0;i<10;i++){
                int t = i+1;
                list.add(new Student(t,"name"+t,18+t,"phone"+t));
            }
            //用到一个作用域了【请求转发 request】
            //保存查询到数据
            request.setAttribute("stuList",list);
        %>
         <table>
             <tr>
                 <td>编号</td>
                 <td>姓名</td>
                 <td>年龄</td>
                 <td>电话</td>
                 <td>操作</td>
             </tr>
            <%--             varStatus="status" 设置了状态对象
                    通过对象可以获取到的属性
                    current 表示获取哦当前遍历到底的数据
                    index 表示遍历索引
                    count 表示遍历个数
                    first和lase 表示当前遍历的数据是否是第一条或最后一条件
                    begin、end和step 获取这些属性设置的值
                    begin="2" end="7" step="2" ---> 翻译成for --》 for(int stu=2;stu<=7;stu+=2)
    				默认不设置step,就相当于与是 i++ 一次步长为1
                --%>
             <c:forEach begin="2" end="7" step="2" items="${requestScope.stuList}" var="stu" varStatus="status">
                 <tr>
                     <td>${stu.id}</td>
                     <td>${stu.name}</td>
                     <td>${stu.age}</td>
                     <td>${stu.phone}</td>
                     <td>删除、修改</td>

                 </tr>
             </c:forEach>
         </table>
</body>
</html>




< c:url >

作用在Cookie禁用的情况下,通过重写URL片接JSESSIONID来传递ID值,便于下一次访问时可查找到上一次的Session对象

<%@ page import="java.util.HashMap" %>
<%@ page import="java.util.Map" %>
<%@ page import="com.qfedu.entity.Student" %>
<%@ page import="java.util.List" %>
<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>JSTL核心标签库【url标签】</title>
</head>
<body>     
      <!--这个操作一定要禁用浏览器cookie-->
      <!--以前处理cookie禁用我们可以使用encodeRedirectURL进行重写URL-->
      <%
          String newURL = response.encodeRedirectURL(request.getContextPath()+"/JSTLLable3.jsp");
      %>
      <%=newURL%> <!--这个打印会打印出URL和JSESSIONID地址-->
      <!--在实际开发中我们是不能确定,用户是否禁用了Cookie,所以项目中如果出现页面跳转时,可以使用这样方式完成-->
     <a href="<%=response.encodeRedirectURL(request.getContextPath()+"/JSTLLable3.jsp")%>">跳转</a>
        <br/>

      <!--一般我们会使用这种方式处理,以保证是同一次会话-->
<%--      书写案例: <c:url context="${pageContext.request.contextPath}" value="/JSTLLable3.jsp"></c:url>--%>
      <a href="<c:url context='${pageContext.request.contextPath}' value='/JSTLLable3.jsp'></c:url>">跳转</a>
</body>
</html>




个人意见:在实际开发中所有涉及到页面跳转或重定向时,都应该使用URL重写

MVC框架(Model-View-Controller)

MVC概念

首先我们需要知道MVC模式并不是JavaWeb项目中独有的,MVC是一种软件工程中的一种设计模式,把软件系统分为三个基本部分

模型(model)-视图(view)-控制器(Controller),即为MVC,它是一种软件设计的规范

ps:MVC是一种遍成模式,将数据操作、页面展示、业务逻辑分为三个层级,独立完成,互相调用

请添加图片描述

三层架构

请添加图片描述

请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值