JavaEE学习日志(五十六): JSP,EL表达式

JavaEE学习日志持续更新----> 必看!JavaEE学习路线(文章总汇)

JSP

JSP简介

JSP成为Java的动态服务器端页面技术(Java Server Page)。

Java嵌入HTML语言

Java嵌入的HTML的方式

  1. <% %>
  2. <%= %> 向页面输出数据
  3. <%! %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
    嵌入方式一:<% %>
--%>
<%
    int a=1;
    String s = "abc";
%>
<%--
    嵌入方式二:<%= %> 向页面输出数据
--%>
<%=a%>
<%=s%>
<%--
    嵌入方式三:<%! %>
--%>
<%!
double d=15.5;
%>
</body>
</html>

JSP运行原理

在这里插入图片描述
jsp页面,执行时被转化成java文件,再编译成.class

.java文件和.class文件的存储路径

C:\Users\admin\.IntelliJIdea2019.3\system\tomcat\Tomcat_8_5_32_JavaWeb_7\work\Catalina\localhost\Web05\org\apache\jsp

JSP本质就是Servlet

.java文件源码

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.32
 * Generated at: 2020-03-26 01:58:20 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class a_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {


double d=15.5;

  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\r\n");
      out.write("<html>\r\n");
      out.write("<head>\r\n");
      out.write("    <title>Title</title>\r\n");
      out.write("</head>\r\n");
      out.write("<body>\r\n");
      out.write('\r');
      out.write('\n');

    int a=1;
    String s = "abc";

      out.write('\r');
      out.write('\n');
      out.write('\r');
      out.write('\n');
      out.print(a);
      out.write('\r');
      out.write('\n');
      out.print(s);
      out.write('\r');
      out.write('\n');
      out.write('\r');
      out.write('\n');
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

JSP中的注释

  • <!-- HTML的注释 --> —>JSP中存在,翻译后的.java文件中存在,浏览器中存在
  • <% //或者/* %> Java的注释,JSP中存在,翻译后的.java文件中存在,浏览器中没有
  • <%-- JSP特有的注释--%>只在JSP源码中存在

JSP九大内置对象

  • request
  • response
  • ServletContext对象,在JSP中写对象,只能写application
final javax.servlet.ServletContext application;
  • ServletConfig对象,在JSP中写对象,只能写config
final javax.servlet.ServletConfig config;
  • session
  • out
  • page(this)
  • pageContext 最小域对象,作用范围是当前页面
  • exception异常

EL表达式

EL(Express Language)表达式:直接出现在JSP页面中,可以减少<%%>的书写。

EL作用:从域对象中取出数据
EL语法:${}

EL取出域对象数据(String对象)

四大域对象

  • application(ServletContext)
  • session
  • request
  • pageContext

EL取出域对象:相当于<%=域对象.getAttribute("heima")%>

  • 取出前三个域对象:${域对象Scope.key},如${applicationScope.key}
  • 取出pageContext:${pageScope.key}

简化写法${key}:EL自动从最小域开始找,一旦找到就不找了。

注意:EL取不出来,不显示null,显示""

代码示例:从四个域对象中取出数据

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <%--
        EL表达式取出域对象中的数据
    --%>
<%
    //ServletContext域对象存储数据
    application.setAttribute("heima","javaApplication");
    //session域对象存储数据
    session.setAttribute("heima","javaSession");
    //request域对象存储数据
    request.setAttribute("heima","javaRequest");
    //pageContext域对象存储数据
    pageContext.setAttribute("heima","javaPage");
%>

<%--
    取数据
--%>
<%--取ServletContext--%>
<%--<%=application.getAttribute("heima")%>--%>
${applicationScope.heima}<br>
    <%--取ServletContext--%>
${sessionScope.heima}<br>
    <%--取request--%>
${requestScope.heima}<br>
    <%--取pageContext--%>
${pageScope.heima}<br>
    <%--简化写法--%>
${heima}
</body>
</html>

EL取出域对象数据(自定义对象)

自定义address类

public class Address {
    private String city;
    private String area;
	...
	省略get和set
}

自定义User类

public class User {
    private String name;
    private int age;

    private Address addr;
	...
	省略get和set
}

需要在JSP页面中获取User中的address属性的city属性

<%@ page import="com.itheima.domain.Address" %>
<%@ page import="com.itheima.domain.User" %>


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
    向域对象存储自定义对象
    EL表达式取出来
--%>
<%
    Address addr = new Address();
    addr.setCity("北京");
    addr.setArea("昌平");

    User user = new User();
    user.setName("张三");
    user.setAge(20);
    user.setAddr(addr);

    pageContext.setAttribute("user",user);

%>
<%--取出北京--%>
<%=((User)pageContext.getAttribute("user")).getAddr().getCity()%>
<%--
EL表达式取出北京
EL使用不需要强转
EL获取成员遍历,不需要调用getXXX方法
自己会调用,直接写成员变量名即可
--%>
${user.addr.city}
</body>
</html>

注意:EL表达式不用进行强制转换,也不要写get方法,它会自己调用

${user.addr.city}

EL取出域对象数据(自定义对象存储List)

同样也是使用上面案例的User和Address

<%@ page import="com.itheima.domain.Address" %>
<%@ page import="com.itheima.domain.User" %>
<%@ page import="java.util.ArrayList" %>
<%@ page import="java.util.List" %>

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
    向域对象存储自定义对象
    EL表达式取出来
--%>
<%
    Address addr = new Address();
    addr.setCity("北京");
    addr.setArea("昌平");

    User user = new User();
    user.setName("张三");
    user.setAge(20);
    user.setAddr(addr);

    Address addr2 = new Address();
    addr2.setCity("天津");
    addr2.setArea("武清");

    User user2 = new User();
    user2.setName("李四");
    user2.setAge(22);
    user2.setAddr(addr2);

    List<User> list = new ArrayList<User>();
    list.add(user);
    list.add(user2);

    pageContext.setAttribute("list",list);
%>
<%=((List<User>)pageContext.getAttribute("list")).get(1).getAddr().getCity()%><br>
<%--
    集合索引,直接写索引编号,但需要加[]
--%>
${list[1].addr.city}
</body>
</html>

注意:

  • List<User> list = new ArrayList<User>();低版本的Tomcat必须在后面的ArrayList中也写上泛型,否则可能会报错!
  • 集合索引,直接写索引编号,但需要加[]
${list[1].addr.city}

EL取出域对象数据(自定义对象存储Map)

<%@ page import="com.itheima.domain.Address" %>
<%@ page import="com.itheima.domain.User" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
    向域对象存储自定义对象
    EL表达式取出来
--%>
<%
    Address addr = new Address();
    addr.setCity("北京");
    addr.setArea("昌平");

    User user = new User();
    user.setName("张三");
    user.setAge(20);
    user.setAddr(addr);

    Address addr2 = new Address();
    addr2.setCity("天津");
    addr2.setArea("武清");

    User user2 = new User();
    user2.setName("李四");
    user2.setAge(22);
    user2.setAddr(addr2);

    Map<String,User> map = new HashMap<String,User>();
    map.put("u1",user);
    map.put("u2",user2);
    pageContext.setAttribute("map",map);
%>
${map.u2.addr.city}
<%--
    如果键名是"u.2"这种写法
--%>
<%--${map['u.2'].addr.city}--%>
</body>
</html>

正常写法:

${map.u2.addr.city}

注意:如果键名是"u.2",则必须写成

${map['u.2'].addr.city}

EL内置对象

内置对象:这个对象内置在EL中,直接可以使用
如JSP中内置对象,直接写对象名即可

  • pageContext内置对象:它不是域对象,可以获取到其他的JSP内置对象
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--
    内置对象pageContext
--%>
<%--获取到JSP中的内置对象request,然后获取到Web应用名称--%>
${pageContext.request.contextPath}
</body>
</html>

  • cookie内置对象:${cookie.userName.value}获取cookie对象的值

EL运算符

三元运算符

${num>4?"大于4":"不大于4"}

判空运算:如果空,结果是true;否则为false

注意:数组或集合的长度大于0就不为空。

<%
    String[] str={"1","2","3"};
    request.setAttribute("str",str);
%>
${empty str}
${!empty str}

记录上一次的用户名

在这里插入图片描述
前端:用户名和保存用户名部分

<input type="text" class="form-control" id="username" placeholder="请输入用户名" name="username" value="${cookie.username.value}">
...
<input type="checkbox" name="rem" value="rem"> 记住用户名

servlet

package com.itheima.servlet;

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(urlPatterns = "/remUserName")
public class RemUserNameServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
            获取提交的用户名和密码
            判断和用户名密码是否匹配
            如果匹配,重定向到首页
            如果不匹配,转发回登陆页面
         */
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //获取复选框rem
        String rem = request.getParameter("rem");
        if("rem".equals(rem)){
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*10);
            cookie.setPath(request.getContextPath());
            response.addCookie(cookie);
        }
        if("tom".equals(username)&&"123".equals(password)){
            response.sendRedirect(request.getContextPath());
        }else {
            request.getRequestDispatcher("/login.jsp").forward(request,response);
        }

    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值