• 2-39 JSP之EL表达式


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

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

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

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        out输出和getWriter输出的区别
    
    
         <%
             out.write("out输出1
    "); out.write("out输出2
    "); response.getWriter().write("response输出1
    "); response.getWriter().write("response输出2
    "); %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    请添加图片描述

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

    问题:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        out输出数据问题
    
    
        <%
            out.write("65");
            out.print("65");
        %>
        
    <%-- 修改代码 --%> <% out.write(65); out.print(65); %>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    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" %>
    
    
        九九乘法表
         
    
    
        

    九九乘法表

    <% for(int i = 1 ;i<=9;i++){%> <%for (int j = 1;j<=i;j++){%> <%}%> <%}%>
    <%= j+"x"+i+"="+(i*j)%>
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    作业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 + '\'' +
                    '}';
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60

    创建一个类处理学生信息的类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);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    创建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" %>
    
    
        展示学生信息
        
    
    
                <%--   获取存在request作用域中数据--%>
            <% List studentList = (List)request.getAttribute("stuList");%>
            
                <% for(Student student : studentList) {%>
                
                <%}%>
            
    编号 姓名 年龄 电话 操作
    <%=student.getId()%> <%=student.getName()%> <%=student.getAge()%> <%=student.getPhone()%> 删除、修改
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    扩展: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. */
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

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

    EmpProject页面进行JSP整合

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

    1.修改showAllEmpController类的跳转语句

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

    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" %>
    
    
        查询所有员页面
    
    
           
             <%
                 List emps = (List)request.getAttribute("emps");
                 for(Emp emp:emps) {
             %>
                       
              <%
                 }
              %>
           
    编号 姓名 工资 年龄 操作
    <%=emp.getId()%> <%=emp.getName()%> <%=emp.getSalary()%> <%=emp.getAge()%> 删除 修改
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    3.修改ShowEmpController类

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

    添加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" %>
    
    
        修改员工信息页面
    
    
           <%
               Emp emp = (Emp)request.getAttribute("emp");
           %>
    
           
    编号:
    姓名:
    工资:
    年龄:

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    EL表达式

    概念

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

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

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

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

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

    演示:

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        简单演示EL表达式
    
    
         <%
             //存储在request作用域中数据
             request.setAttribute("name","tom");
             request.setAttribute("age",18);
         %>
    JSP通过表达式脚本输出key的值是:<%=request.getAttribute("name")%>
    EL表达式使出key的值是:${age}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    需要注意:

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

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

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        EL表达式输出问题
    
    
         <%
             //存储在request作用域中数据
             request.setAttribute("name","tom");
             request.setAttribute("age",18);
         %>
    JSP通过表达式脚本输出key的值是:<%=request.getAttribute("name1")%>
    EL表达式使出key的值是:${age1}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

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

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

    JSP页面中有4个域对象【pageContext、reques、session、application】
    当四个域中都有相同key的时候,EL表达式会按照【四个域从小到大的熟顺序进行搜索,找到并输出】
    
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        EL表达式搜索域问题
    
    
         <%
             //存储在域中数据
             request.setAttribute("key","req");
             session.setAttribute("key","sess");
             pageContext.setAttribute("key","page");
             application.setAttribute("key","app");
         %>
          key值是:${key}
    
    
    
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

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

    ps: XXXScope方法点的是key名字

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

    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 +
                    '}';
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65

    在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" %>
    
    
        EL表达式输出引用类型
    
    
         <%
             Person person = new Person();
             person.setName("大宝");
             person.setPhones(new String[]{
                     "18888886666",
                     "18666668888",
                     "13112345678",
             });
             List cities = new ArrayList<>();
             cities.add("北京");
             cities.add("上海");
             cities.add("沈阳");
             person.setCities(cities);
             Map map = new HashMap<>();
             map.put("key1","value1");
             map.put("key2","value2");
             map.put("key3","value3");
             person.setMap(map);
    
             //将Person对象存作用域中
             pageContext.setAttribute("p",person);
         %>
            输出存储在Person对象中的值:
    name的值:${p.name}
    取出电话号码phones:${p.phones[2]}
    取出所有工作的城市: ${p.cities}
    去过哪个工作的城市: ${p.cities[1]}
    输出map集合中数据:${p.map}
    输出map集合某个key的数据: ${p.map.key1}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

    使用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 list = new ArrayList<>();
    request.setAttribute("list",list);
    //map中特殊的key名
    Mapmap = 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的情况
    
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    EL表达式中隐式对象

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

    隐含对象描述数据类型
    pageScopepage作用域,它可以获取pageContext域中存储的数据【但是已经不再使用】Map
    requestScoperequest作用域,它可以获取request域中数据Map
    SessionScopesession作用域,它可以获取session域中数据Map
    applicationScopeapplication作用域,它可以获取application域中数据Map
    paramrequest对象的参数,它可以获取请求中的参数值Map
    paramValuesrequest独享的参数,它可以获取请求中的参数值【多个值的使用】Map
    headerHTTP信息头,它可以获取请求头中信息Map
    headerValuesHTTP信息头,它可以获取请求头中信息【多个数据值是使用】Map
    initParam上下文初始化参数,它可以读取web.xml或注解中编写数据Map
    cookiecookie值,它可以获取当前请求的cookie信息Map
    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);
        }
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    完成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" %>
    
    
        获取Cookie值[JSPAndCookie]
    
    
           
    <%--       <%--%>
    <%--           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%>
    --%> <%-- <%=password%>--%> <%-- EL表达式获取Cookie数据--%>

    ${cookie.username.value}

    ${cookie.password.value}



    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    如何获取URL路径中参数

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    
        通过EL获取数据
    
    
    <%--   http://localhost:8080/EL/GetParam.jsp?username=zhangsan&password=123456&hobby=java&hobby=JSP--%>
            请求URL中username的值:${param.username}
    请求URL中password的值:${param.password}
    <%-- 当面临key相同value值不同时候,如果获取出值--%> 请求URL中hobby的值是:${paramValues.hobby[0]}
    请求URL中hobby的值是:${paramValues.hobby[1]}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    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" %>
    
    
        JSTL核心标签库【set、if、choose、when、otherwise】
    
    
        <%--
           此标签了解即可set,可以将数据保存在作用域中
           ps:这里完全可以使用域对象完成
           scope 作用域   var key名字  value 存储的值
        --%>
         
         获取值:${sessionScope.abc}
          
    <%-- if标签判断执行逻辑 test属性是判断条件(是同EL表达式) --%>

    12等于12


    <%-- choose、when、otherwise 标签组成 choose标签开始选择判断 when表示每一种判断情况配置test属性进行条件判断 otherwise 表示剩余的最后一种情况 需要注意: 这个标签使用的时候,不能使用html注释,要使用jsp注释 when标签父标签一定要是choose标签--%> <% request.setAttribute("height",180); %>

    小巨人

    很高

    还可以

    <%-- 这个默认情况即可以是输出语句,也可以是判断语句 --%>

    ok

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51

    < 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" %>
    
    
        JSTL核心标签库【foreach标签】
        
    
    
             <%--
             遍历1到10,输出
             for(int i = 1;i<10;i++)
             对照形式写c:foreach可以写成
             begin属性是开始索引【1】   end属性是结束索引【10】   var属性是变量【i】
             --%>
        
                
    第${i}行
    <%--遍历集合和数组--%> <% request.setAttribute("arr",new String[]{ "zhangsan", "lisi", "dabao" }); %>
    <%-- items属性参数设需要是一个集合或数组 var获取存在集合或数组值 for(String str : arr)--%> ${item}
    <%-- map集合的遍历 需要注意取值的位置有些类似之前学习map中entrySet--%> <% Map map = new HashMap<>(); map.put("key1","value1"); map.put("key2","value2"); request.setAttribute("map",map); %>
    <%-- items属性参数设需要是一个集合或数组 var获取存在集合或数组值 for(String str : arr)--%> <%-- entry值相当于存储一个完整的键值对--%> ${entry.key}= ${entry.value}

    <%-- 遍历Student是实体类进行打印--%> <% //模拟得到请求参数,并且已经查询出结果 List 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); %> <%-- 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 --%>
    编号 姓名 年龄 电话 操作
    ${stu.id} ${stu.name} ${stu.age} ${stu.phone} 删除、修改
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119

    < 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" %>
    
    
        JSTL核心标签库【url标签】
    
         
          
          
          <%
              String newURL = response.encodeRedirectURL(request.getContextPath()+"/JSTLLable3.jsp");
          %>
          <%=newURL%> 
          
         ">跳转
            
    <%-- 书写案例: --%> 跳转
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

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

    MVC框架(Model-View-Controller)

    MVC概念

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

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

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

    请添加图片描述

    三层架构

    请添加图片描述

    请添加图片描述

  • 相关阅读:
    Java项目:ssm毕业论文管理系统
    java项目-第92期基于ssm+shiro的物联及生产管理系统-java毕业设计
    Docker使用笔记
    无代码开发单条数据分享入门教程
    C++语言之输入输出介绍
    原汁多功能榨汁机触摸芯片-DLT8T02S-杰力科创
    SBCS、DBCS、ASCII、MBCS(ANSI)、Unicode
    cspj2022 T4 上升点列(point)题解(floyd)
    生命周期钩子函数
    有哪些挣钱软件一天能赚几十元?盘点十个能长期做下去的挣钱软件
  • 原文地址:https://blog.csdn.net/WilsonDone/article/details/127559330