JSP&EL&JSTL

1. JSP

什么是jsp:其实也是一个网页,从程序员角度看待,是一个java类,它继承了servlet,所以jsp就是一个servlet

为什么会有jsp:html多数情况下用来显示静态内容,但是有些时候,需要在网页上面显示动态的数据,比如查询所有的学生信息,或者根据姓名来查询某个学生,然后在网页上面显示,html是不支持java代码的,但是jsp里面可以写java代码。

如何使用jsp:

指令写法:

<%@ 指令名字 %>

Page指令:

language = "java":jsp页面中写java代码

contentType="text/html;charset=UTF-8":这是一个文本html页面

pageEncoding="UTF-8":jsp内容编码

extends="":用于指定jsp翻译成java文件继承的父类,一般不用修改

import = "":导包

session = "":值只能选择true或者false,用于控制在这个jsp界面中能否直接使用session对象

errorPage=“”:指的是错误的界面,当发生错误时,将显示错误界面的内容

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"
    errorPage="error.jsp"%>
  <body>
    <%
        int i = 10/0;
     %>
  </body>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" isErrorPage="true" %>
  <body>
    出错了: 
    <%=exception.toString() %>
  </body>

errorPage用于指定发生错误时跳转到哪个页面

isErrorPage用于说明这是一个errorPage界面

include指令

<%@ include file = "other.jsp"%>:插入一个页面

<%taglib prefix="" uri="" %>:uri:标签库路径  prefix:标签库的别名

JSP动作标签

 jsp:param:意思是在包含某个页面的时候,或者跳转到某个页面时候,加入这个参数

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" contentType="text/html;charset=UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>jsp_action.jsp</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
      <%-- 
          <jsp:include page = ""></jsp:include>
          <jsp:param value = "" name = "" />
          <jsp:forward page = ""></jap:forward>
       --%>
      这是jsp——action的页面
      <%-- 包含指定的页面,这里是动态包含,也就是不把包含页面所有元素的标签拿过来输出,而是把它的运行结果拿过来 --%>
      <%-- <jsp:include page = "login.jsp"></jsp:include> --%><%-- 跳转到哪个界面,页面会直接显示cart.jsp的内容 --%>
      <%-- <jsp:forward page = "cart.jsp"></jsp:forward> --%>
      <%-- 等同于以下的代码
      <%
          request.getRequestDispatcher("cart.jsp").forward(request, response);
       %> 
       --%>
       
       <%-- 
       jsp:param:在包含某个页面时候,或者跳转某个页面时候,带上这个参数
        --%>
    <jsp:forward page = "login.jsp">
        <jsp:param name = "address" value = "beijing" />
    </jsp:forward>
  </body>
</html>

调用方法:

<%= request.getParameter("address") %>
使用EL表达式
$(param.address);
<%--
response.addCookie(new Cookie("name", "value");
$(cookie.name)
--%>

JSP内置对象

所谓的内置对象,就是直接可以在jsp页面中直接使用这些对象

pageContext[PageContext]:作用域仅限于当前页面,重定向请求就没有了,可以通过get...()得到其它八个对象

request[HttpServletRequest]:作用域仅限于一次请求,只要服务器对该请求做出了响应,域中存的值就没有了。请求转发以后就没有了

session[HttpSession]:作用域限于一次会话,多次请求和响应,关闭浏览器重新打开转发的界面就没有了

application[ServletContext]:整个工程都可以访问,服务器关闭以后就不能访问了

以上四个是作用域对象

作用域:表示这些对象可以存值,取值范围有限定,setAttribute,getAttribute

 <body>
       使用作用域来存储对象<br />
     <% 
         pageContext.setAttribute("name", "pagecontext");
         request.setAttribute("name", "request");
         session.setAttribute("name", "session");
         application.setAttribute("name", "application");
      %>
      
      <%= pageContext.getAttribute("name")%> <br />
      <%= request.getAttribute("name")%> <br />
      <%= session.getAttribute("name")%> <br />
      <%= application.getAttribute("name")%> <br />
 </body>

out[JspWriter]:

response[HttpServletResponse]:

exception[Threadable]:isErrorPage="true",才能使用这个对象

page[Object]:就是这个jsp翻译成java类的实例对象this

config[ServletConfig]:

<body>
      使用作用域来存储对象<br />
    <% 
        pageContext.setAttribute("name", "pagecontext");
        request.setAttribute("name", "request");
        session.setAttribute("name", "session");
        application.setAttribute("name", "application");
     %>
     
     <%= pageContext.getAttribute("name")%> <br />
     <%= request.getAttribute("name")%> <br />
     <%= session.getAttribute("name")%> <br />
     <%= application.getAttribute("name")%> <br />
     
     <% out.write("这是使用out对象输出的内容"); %>
     
     <%
         response.getWriter().write("这是response.getWrite的内容");
      %>
</body>

先输出response的内容,然后才是输出out的内容

2. EL表达式

1. 目的:为了简化jsp代码,具体一点就是为了简化在jsp里面写的那些java代码

2. 写法格式:${表达式}

3. 取值方式

如果这个值是带下标的,那么使用 内置对象名[]

如果没有下标,使用 内置对象名.属性 的方式去取

4. 隐式对象

<%@ page language="java" import="java.util.*,com.wang.servlet.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>jsp_class.jsp</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
    <body>
          使用作用域来存储对象<br />
        <% 
            /* pageContext.setAttribute("name", "pagecontext"); */
            request.setAttribute("name", "request");
            session.setAttribute("name", "session");
            application.setAttribute("name", "application");
            String[] a = {"aa", "bb", "cc", "dd"};
            pageContext.setAttribute("array", a);    // 存放数组
            List<String> list = new ArrayList<String>();
            list.add("20151411");
            list.add("20151412");
            list.add("20151413");
            list.add("20151414");
            pageContext.setAttribute("list", list);    // 存放arraylist集合,arraylist的底层是数组
            Map<String, String> map =new HashMap<String, String>();
            map.put("name", "wanging");
            map.put("age", "wangun");
            map.put("address", "xiaoa");
            pageContext.setAttribute("map", map);    // 存放Map集合
            User user = new User("wang", 21);
            pageContext.setAttribute("use", user);    // 存放对象
         %>
         使用jsp代码取值<br />
         <%= pageContext.getAttribute("name")%> <br />
         <%= request.getAttribute("name")%> <br />
         <%= session.getAttribute("name")%> <br />
         <%= application.getAttribute("name")%> <br />
         使用EL表达式取值<br />
         ${ name } <br />    <!-- 先去pageContext找,再去request找,再去session找,再去application找,都找不到就不找了 -->
         ${ pageScope.name } <br />        <!-- 只到pageContext中找,如果找不到就不找了,返回"",不报错 -->
         ${ requestScope.name } <br />
         ${ sessionScope.name } <br />
         ${ applicationScope.name } <br />
         ${ array[0] }, ${ array[1] }, ${ array[2] }, ${ array[3] } <br /> <!-- 取数组的元素 -->
         ${ list[0] }, ${ list[1] }, ${ list[2] }, ${ list[3] } <br /> <!-- 取arraylist集合的元素 -->
         ${ map.name }, ${ map.age }, ${ map.address } <br /> <!-- 取map集合的元素 -->
         ${ use.name }, ${ use.age }    <!-- 对象方法中必须要有getName(),getAge(),这两个方法 -->
    </body>
</html>

页面的输出结果

3. JSTL

全称:JSP Standard Tag Library: jsp标准标签库:简化jsp代码的编写,替换<%%>的写法,一般与EL表达式配合使用

使用:

1. 导入JSTL支持的jar文件jstl.jar 和 standard.jar,拷贝到WebRoot/web-INF/lib目录下

2. 在页面上使用tablib来引入标签库

3. 如果想支持EL表达式,则选择1.1版本,1.0不支持

<%@ page language="java" import="java.util.*,com.wang.servlet.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>jstl.jsp</title>
    
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>
  
  <body>
      常用的标签:指明一个对象name,存储到了page(默认),指定为session <br />
    <c:set var="name" value="zhangsan" scope="session"></c:set>
    ${ sessionScope.name } <br />
    
    <c:set var="age" value="18" ></c:set>
    判断text里面的表达式是否满足,如果满足,就执行c:if标签中的输出,c:if是没有else的,可以加入var scope标签 <br />
    <c:if test="${ age > 16 }" var = "flag" scope = "session">年龄大于了十六岁</c:if> <br />
    <c:if test="${ age > 20 }">年龄大于了二十岁</c:if> <br />
    ${ sessionScope.flag }
    
    从begin开始遍历到end结束,得到的结果,赋值给i,会存储到page中,step表示增幅    <br />
    <c:forEach begin = "1" end = "10" step = "2" var = "i">
        ${ i }
    </c:forEach> <br />
    
    <%
         List<User> list = new ArrayList<User>();
         list.add(new User("张三", 13));
         list.add(new User("李四", 14));
         list.add(new User("王五", 15));
         list.add(new User("赵六", 16));
         pageContext.setAttribute("list", list);
     %>
    
    items:表示遍历哪一个对象,注意,这里必须填写EL表达式 <br />
    value:遍历出来的每一个元素使用user去接收
    <c:forEach var = "user" items = "${ list }">
        ${user.name } ------ ${user.age } <br />
    </c:forEach>
    
  </body>
</html>

页面的输出结果:

 学生信息管理系统:

1. 先写login.jsp,并且搭配一个LoginServlet去获取登陆信息

2. 创建用户表,里面只要有id,username和password

3. 创建UserDao,定义登录的方法

4. 创建UserDaoImpl,实现之前定义的登录方法

5. 在LoginServlet里面访问UserDao,判断登录结果,以区分对待

6. 创建stu_list.jsp,让登录成功的时候跳转过去

7. 创建学生表,里面定义相关学生的信息

8. 定义学生的StudentDao

9. 实现学生的StudentDaoImpl

10. 登录成功,完成以下的步骤:

  a. 查询所有的学生

  b. 把这些所有的学生集合存储到一个作用域中

  c. 跳转到stu_list.jsp

11. 在stu_list.jsp中,取出域中的集合,然后使用c标签,去遍历集合

项目托管的地址:https://github.com/fenyying/StudentManage

原文地址:https://www.cnblogs.com/feng-ying/p/9840545.html