zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    谷歌眼镜--参考文档
    谷歌眼镜--与菜单项互动
    谷歌眼镜--UI指南
    【cl】工程导入
    Ylmf_Ghost_Win7_SP1_x64_2017_0113.iso虚拟机安装
    win7_64
    linux下安装jdk
    rar x 解压rar文件,提示permission denied
    linux下安装rar解压包
    Red Hat Linux虚拟机与主机共享文件
  • 原文地址:https://www.cnblogs.com/feng-ying/p/9840545.html
Copyright © 2011-2022 走看看