美文网首页Java后端
JavaWeb-不得不学习的Jsp

JavaWeb-不得不学习的Jsp

作者: 付凯强 | 来源:发表于2018-03-13 20:45 被阅读95次

    0. 引言

    • 学习Jsp的目的是为了解技术从前后端强耦合到前后端分离的过程,增加自己的技术积淀。了解并且体会这个过程,非常有利于后台知识的学习和后台相关技术的开发。

    1. 安装Tomacat

    • 官网下载Tomcat 7.0,下载到本地,然后解压即可。

    • 配置环境变量:

      我的电脑-属性-高级-环境变量-高级环境变量-新建-变量名:CATALINA_HOME-变量值:Tomcat路径(bin的上一个目录级)

    • 验证:输入ip+端口号,出现Tomcat的页面,表示配置成功

    2. Tomcat闪退

    • 配置JAVA环境变量即可

    3. Tomcat目录结构

    Tomcat目录结构.png

    4. 编写第一个java web程序

    • Tomcat-webapps下创建index.jsp文件
    <HTML>
    
    <head> 
    <title>我的第一个jsp页面</title>
    </head>
    
    <body>
    
    <h1>欢迎大家访问我的个人主页</h1>
    
    </body>
    
    </HTML>
    
    
    • Tomcat-webapps下创建WEB-INF文件夹
    • WEB-INF文件夹下面创建名为classes和lib的文件夹和web.xml文件,web.xml内容如下:
    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0"
      metadata-complete="true">
    
    </web-app>
    
    1. 在webapps下创建项目目录
    2. 编写index.jsp
    3. 创建WEB-INF目录
    4. 测试运行
    

    5. WEB-INF目录结构详解

    • WEB-INF是Java的Web应用的安全目录。所谓安全就是客户端无法访问,只有服务端才可以访问。
    1. 在WEB-INF里面创建test.html文件
    2. 访问http://172.25.164.79:8080/myhome/WEB-INF/test.html
    
    HTTP Status 404 -
    type Status report
    
    message
    
    description The requested resource is not available.
    
    Apache Tomcat/7.0.85
    
    • web.xml :项目部署文件,项目的配置信息
    1. 访问:http://172.25.164.79:8080/myhome/ 会默认访问项目myhome文件夹下面的index.jsp
    
    2. 修改index.jsp名字为abc.jsp 访问:http://172.25.164.79:8080/myhome/
    
    HTTP Status 404 - /myhome/
    type Status report
    
    message /myhome/
    
    description The requested resource is not available.
    
    Apache Tomcat/7.0.85
    
    3. 在web.xml中配置欢迎页面后,即可访问abc.jsp:
    
    <?xml version="1.0" encoding="ISO-8859-1"?>
    
    <web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                          http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0"
      metadata-complete="true">
    
        <welcome-file-list>
            <welcome-file>/abc.jsp</welcome-file>
        </welcome-file-list>
    
    </web-app>
    
    
    • class文件夹,用以放置.class文件
    • lib文件夹,用以存放需要的jar包

    6. IDEA 配置服务器并关联项目(创建了第一个jsp项目)

    7. JSP简介

    • JSP全名是Java Server Pages
    • 其根本是一个简化的Servlet设计
    • 实现了在Java当中使用HTML标签
    • Jsp是一种动态网页技术标准,也是JAVAEE的标准
    • JSP与Servlet一样,是在服务器端执行的。

    8. JSP特点

    • Java平台,安全性高,适合开发大型的,企业级的Web应用程序。

    9. JSP页面元素构成

    • 静态内容
    • 指令
    • 表达式
    • 小脚本
    • 声明
    • 注释

    10. 指令分类

    • page指令:

      通常位于jsp页面的顶端,同一个页面可以有多个page指令。

    • include指令:

      将一个外部文件嵌入到当前JSP文件中,同时解析这个页面中的JSP语句。

    • taglib指令:

      使用标签库定义新的自定义标签,在JSP页面中启用定制行为。

    11. page指令:

    <%@ page contentType="text/html;charset=UTF-8" language="java"  %>
    
    1. language:制定JSP页面使用的脚本语言。默认值:java
    2. import:通过该属性来引用脚本语言中使用到的类文件。默认值:无
    3. contentType:用来指定JSP页面所采用的编码方式。默认值:text/html,ISO-8859-1
    

    12. JSP注释

    • JSP注释:
        <%--这是title标签--%> //客户端不可见的
    
    • HTML注释:
        <!--html注释--> //客户端可见
    
    • JSP脚本注释:
        //单行注释
       /*
       多行注释
        */
    

    13. JSP脚本

    在JSP页面中执行的java代码
    <%
       out.println("我只不过想做一个好人");
    %>
    
    这句代码在idea里面不会自动提示生成,而eclispe会。
    

    14. JSP声明

    在JSP页面中定义变量和方法
    <%!
        String s = "张三丰"; //声明了一个字符串变量
    
        int add(int x, int y) { //声明了一个返回整形的函数,实现两个整数的求和
            return x + y;
        }
    %>
    

    15. JSP表达式

    在JSP表达式中可以用到声明中声明的变量和函数
    你好<%=s %>
    <br>
    5+6 = <%=add(5, 6)%>
    

    16. JSP的生命周期

    JSP页面的声明周期.png
    JSP生命周期详述.png

    17. 用脚本打印九九乘法表

    • 表达式
    <%! String printForm99() {
        String s = "";
        for (int i = 1; i <= 9; i++) {
            for (int j = 1; j <= i; j++) {
                s += i + "*" + j + "=" + i * j + "&nbsp;";
            }
            s += "<br>";
        }
        return s;
    }
    %>
    <%=printForm99() %>
    
    1*1=1 
    2*1=2 2*2=4 
    3*1=3 3*2=6 3*3=9 
    4*1=4 4*2=8 4*3=12 4*4=16 
    5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 
    6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 
    7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 
    8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 
    9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81 
    

    18. JSP的内置对象简介

    • JSP内置对象是Web容器创建的一组对象,不适用new关键字就可以使用的内置对象

    19.JSP九大内置对象

    • out对象
    比如out对象:
    <%
        int[] value = {1, 2, 3};
        for (int i : value) {
            out.print(i);
        }
    %>
    
    • request对象
    • response对象
    • session对象
    • application对象
    • Page、pageContext、exception、application对象

    20. Web程序的请求响应模式

    • 用户发送请求(request)
    • 服务器给用户响应(response)
    登录:
    输入账号和密码,登录:相当于请求
    服务器接收账号和密码后判断是否合法,跳转到响应页面:相当于reponse
    

    21. 什么是缓冲区

    • 缓冲区:Butter,所谓缓冲区就是内存的一块区域,用来保存临时数据。
    一锅米饭一粒一粒吃——米饭一碗一碗吃——这个碗就是缓冲区
    

    22. out对象

    • out对象是JspWriter类的实例,是向客户端输出内容常用的对象。
    1. void println 向客户端打印字符串
    2. void clear 清除换成从去的内容,如果在flust之后调用会抛出异常
    3. void clearBuffer();清除缓冲区的内容,如果在flush之后调用不会抛出异常
    4. void flush() 将缓冲区内容输出到客户端
    5. int getBufferSize() 返回缓冲区以字节数的大小,如不设缓冲区则为0
    6. int getRemaining()返回缓冲区还剩余多少可用
    7. boolean isAutoFulsh() 返回缓冲区满时,时自动清空还是抛出异常
    8. void close() 关闭输出流
    
    <%
        int[] value = {1, 2, 3};
        for (int i : value) {
            out.print(i);
        }
    %>
    缓冲区大小:<%=out.getBufferSize()%>byte<br>
    缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
    是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
    
    缓冲区大小:8192byte
    缓冲区剩余大小:8101byte
    是否自动清空缓冲区:true
    
    <%
        out.println("<h2>静夜思</h2>");
        out.println("窗前明月光<br>");
        out.println("疑是地上霜<br>");
        out.println("举头望明月<br>");
        out.println("低头思故乡<br>");
    %>
    缓冲区大小:<%=out.getBufferSize()%>byte<br>
    缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
    是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
    
    静夜思
    窗前明月光
    疑是地上霜
    举头望明月
    低头思故乡
    缓冲区大小:8192byte
    缓冲区剩余大小:8046byte
    是否自动清空缓冲区:true
    
    <%
        out.println("<h2>静夜思</h2>");
        out.println("窗前明月光<br>");
        out.println("疑是地上霜<br>");
        out.flush();
        out.println("举头望明月<br>");
        out.println("低头思故乡<br>");
    %>
    缓冲区大小:<%=out.getBufferSize()%>byte<br>
    缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
    是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
    
    静夜思
    窗前明月光
    疑是地上霜
    举头望明月
    低头思故乡
    缓冲区大小:8192byte
    缓冲区剩余大小:8142byte
    是否自动清空缓冲区:true
    
    说明:因为执行了flush,所以缓冲区变大了
    
    <%
        out.println("<h2>静夜思</h2>");
        out.println("窗前明月光<br>");
        out.println("疑是地上霜<br>");
        out.flush();
        out.clear();
        out.println("举头望明月<br>");
        out.println("低头思故乡<br>");
    %>
    缓冲区大小:<%=out.getBufferSize()%>byte<br>
    缓冲区剩余大小:<%=out.getRemaining()%>byte<br>
    是否自动清空缓冲区:<%=out.isAutoFlush()%><br>
    
    静夜思
    窗前明月光
    疑是地上霜
    
    说明:out.clear()不能在out.flush()之后调用否则会抛出异常,后面的代码不会执行,但是out.clearBuffer()不会抛出异常。
    

    23. 表单提交方式get和post的区别

    表单提交方式get和post的区别.png

    24. request对象(上)

    • 客户端的请求信息被封装在request对象中,通过它我们可以获取用户输入的信息。
    • request对象是HttpServletRequest类的实例。
    • request对象具有请求域,即完成客户端的请求之前,该对象一直有效。
    1. String getParameter(String name):返回name指定参数的参数值(返回单个值)
    2. String[] getParameterValues(String name):返回包含参数name的所有值的数组(返回集合)
    3. void setAttribute(String,Object):存储此请求中的属性。
    4. object getAttribute(String name):返回指定属性的属性值。
    5. String getContentType():得到请求体的MIME类型
    6. String getProtocol():返回请求用的协议类型和版本号
    7. String getSeverName():返回接受请求的服务器主机名
    
    • 示例:通过表单传递参数:
    index.jsp文件:
    
    <%@ page import="java.util.List" %><%--
      Created by IntelliJ IDEA.
      User: fukq
      Date: 2018/3/7
      Time: 14:47
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    <HTML>
    
    <head>
        <title>我的个人主页</title>
    </head>
    
    <body>
    <h1>用户注册</h1>
    <form name="reqForm" action="request.jsp" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username"/></td>
            </tr>
            <tr>
                <td>爱好:</td>
                <td>
                    <input type="checkbox" name="favorite" value="read">读书
                    <input type="checkbox" name="favorite" value="music">音乐
                    <input type="checkbox" name="favorite" value="movie">电影
                    <input type="checkbox" name="favorite" value="internet">上网
                </td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="提交"/></td>
            </tr>
        </table>
    </form>
    </body>
    
    </HTML>
    
    request.jsp文件:
    
    <%@ page import="java.util.List" %><%--
      Created by IntelliJ IDEA.
      User: fukq
      Date: 2018/3/7
      Time: 14:47
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    
    <HTML>
    
    <head>
        <title>我的个人主页</title>
    </head>
    
    <body>
    <h1>request内置对象</h1>
    用户名:
    <%=request.getParameter("username")%><br>
    爱好:
    <%
        String[] favorites = request.getParameterValues("favorite");
        if (favorites != null) {
            for (int i = 0; i < favorites.length; i++) {
                out.println(favorites[i] + "&nbsp;&nbsp;");
            }
        }
    %>
    </body>
    
    </HTML>
    
    request内置对象
    用户名: ä»�å�¯å¼º
    爱好: read   music   movie   internet  
    
    获取表单数据出现中文乱码的解决办法是在体交表单的时候:
    <%
        request.setCharacterEncoding("utf-8");
    %>
    
    request内置对象
    用户名: 付凯强
    爱好: read   music  
    
    • 通过URL传递参数:
    <a href="request.jsp?username= lisi">测试URL传递参数</a>
    
    用户名: lisi
    
    <a href="request.jsp?username= 中文">测试URL传递参数</a>
    
    用户名: 中æ��
    
    但是通过request设置参数无法解决URL传递中文出现的乱码问题
    
    但是通过配置Tomcat服务器里面conf-server.xml文件可以解决
        <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443" URIEncoding="utf-8"/>
    

    25. request对象(下)

    • setAttribute和getAttribute
    <%
        request.setCharacterEncoding("utf-8");
        request.setAttribute("password","123456");
    %>
    
    密码:<%=request.getAttribute("password")%>
    
    密码:<%=request.getAttribute("password")%> <br>
    请求的MIME类型:<%=request.getContentType()%><br>
    协议类型及版本号:<%=request.getProtocol()%><br>
    服务器主机名:<%=request.getServerName()%><br>
    服务器端口号:<%=request.getServerPort()%><br>
    请求文件的长度:<%=request.getContentLength()%><br>
    请求文件的ip地址:<%=request.getRemoteAddr()%><br>
    请求的真实路径:<%=request.getRealPath("request.jsp")%><br>
    请求的上下文路径:<%=request.getContextPath()%><br>
    
    request内置对象
    用户名: 您好好
    爱好: music   movie   internet   密码:123456 
    请求的MIME类型:application/x-www-form-urlencoded
    协议类型及版本号:HTTP/1.1
    服务器主机名:localhost
    服务器端口号:8888
    请求文件的长度:84
    请求文件的ip地址:127.0.0.1
    请求的真实路径:G:\javaSpace\webDemo\out\artifacts\firstweb_war_exploded\request.jsp
    请求的上下文路径:/fkq
    

    26. response对象简介

    • response对象包含了响应客户请求的有关信息,但是JSP中很少直接用到它。
    • 它是HttpServletResponse类的实例。
    • response对象具有页面作用域,即访问一个页面时,该页面内的response对象只能对这次访问有效,其他页面的response对象对当前页面无效。

    27. response对象常用方法如下:

    • String getCharacterEncoding()返回响应用的是何种字符编码
    • void setContentType(String Type)设置响应的MIME类型
    • PrintWriter getWriter() 返回可以向客户端输出字符的一个对象(也称为输出流对象)(注意比较:PrintWriter与内置out对象的区别)
    • sendRedirect(java.lang.String.location)重新定向客户端的请求
    <%@ page import="java.util.List" %>
    <%@ page import="java.io.PrintWriter" %><%--
      Created by IntelliJ IDEA.
      User: fukq
      Date: 2018/3/7
      Time: 14:47
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
        response.setContentType("text/html;charset=UTF-8"); //设置响应的MIMI类型
    
        out.println("<h1>reponse对象</h1>");
        out.println("<hr>");
    
        PrintWriter outer  = response.getWriter();
        outer.println("大家好,我是response对象生成的输出流outer对象");
    %>
    
    PrintWriter对象总是提前于内置的out对象打印
    
    <%@ page import="java.util.List" %>
    <%@ page import="java.io.PrintWriter" %><%--
      Created by IntelliJ IDEA.
      User: fukq
      Date: 2018/3/7
      Time: 14:47
      To change this template use File | Settings | File Templates.
    --%>
    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <%
        response.setContentType("text/html;charset=UTF-8"); //设置响应的MIMI类型
    
        out.println("<h1>reponse对象</h1>");
        out.println("<hr>");
        out.flush();
        PrintWriter outer  = response.getWriter();
        outer.println("大家好,我是response对象生成的输出流outer对象");
    %>
    
    out.flush();刷新缓冲区,刷新的时候会把数据刷新到浏览器上。
    
    <%
        response.setContentType("text/html;charset=UTF-8"); //设置响应的MIMI类型
    
        out.println("<h1>reponse对象</h1>");
        out.println("<hr>");
    
        PrintWriter outer  = response.getWriter(); //获得输出流对象
        outer.println("大家好,我是response对象生成的输出流outer对象");
    
        response.sendRedirect("index.jsp"); //请求重定向
    %>
    

    28. 请求重定向与请求转发

    • 请求重定向:客户端行为,response.sendRedirect(),从本质上讲等同于两次请求,前一次的请求对象不会保存,地址栏的URL地址会改变。
    • 请求转发:服务器行为,request.getRequestDispatcher().forward(req,resp);是一次请求,转发后请求对象会保存,地址蓝的URL地址不会改变。

    29. session简介

    • session表示客户端与服务器的一次会话
    • Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭这个网页所经过的这段时间,也就是用户浏览这个网站所花费的时间
    • 从上述定义中可以看到,session实际上时一个特定的时间概念
    • session的中文意思就是一段时间
    • 在服务器的内存中保存着不同用户的session。

    30. session详细介绍

    • session对象是一个JSP内置对象。
    • session对象在第一个JSP页面被装载时自动创建,完成会话期管理。
    • 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。
    • 当一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束被成为一个会话。
    • 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法知道这是一个客户,就需要session对象。
    • session对象是HttpSession类的实例。

    31. session常用方法

    • long getCreationTime():返回session创建时间
    Session创建时间:<%=session.getCreationTime()%><br>
    
    Session创建时间:1520565423914
    
    <%!
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    %>
    Session创建时间:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
    
    Session创建时间:2018年03月09日 11:17:03
    
    • public String getId():返回session创建时JSP引擎为它设的唯一ID号
    • public Object setAttribute(String name,Object value):使用指定名称将对象绑定到此会话
    session.setAttribute("username","admin");
    
    • public Object getAttribute(String name):返回此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null
    从Session中获取用户名:<%=session.getAttribute("username")%>
    
    从Session中获取用户名:admin
    
    session_page1: 
    
    <%!
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
    %>
    <%
        session.setAttribute("username", "admin");
    %>
    Session创建时间:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%><br>
    Session的ID编号:<%=session.getId()%><br>
    从Session中获取用户名:<%=session.getAttribute("username")%>
    
    <a href="session_page2.jsp" target="_blank">跳转到Session_page2.jsp</a>
    
    session_page2:
    
    <body>
    <h1>session内置对象</h1>
    <hr>
    Session的ID编号:<%=session.getId()%><br>
    从Session中获取用户名:<%=session.getAttribute("username")%>
    </body>
    
    session_page1: 
    
    Session的ID编号:866631F646E26184FB1F4FCC3AAB4AE6
    
    session_page2:
    
    Session的ID编号:866631F646E26184FB1F4FCC3AAB4AE6
    从Session中获取用户名:admin
    
    page1跳转到page2,id编号一致;只有关闭相关的两个页面,才表示会话结束。
    
    • String[] getValueNames():返回一个包含此SESSION中所有可用属性的数组
    <%
        session.setAttribute("username", "admin");
        session.setAttribute("password","123456");
        session.setAttribute("age","5");
    %>
    
    Session中保存的属性有:
    <%
        String[] names = session.getValueNames();
        for (int i = 0; i < names.length; i++) {
            out.println(names[i] + "&nbsp;&nbsp;");
        }
    %>
    
    Session的ID编号:9E503181AE514CD3C56EDD9289DCE286
    从Session中获取用户名:admin Session中保存的属性有: password   age   username  
    
    • int setMaxInactiveInterval():设置两次请求间隔多长时间此SESSION被取消(单位秒)
    session.setMaxInactiveInterval(10);
    

    32. session的生命周期

    • 访问阶段: 当客户但第一次访问某个jsp或者Servlet的时候,服务器会为当前会话创建一个SessionId,每次客户端向服务端发送请求时,都会将此SessionId携带过去,服务器端会对此SessionId及进行校验。

    • 会话阶段:

      1. 以下情况属于同一个会话:

        1. 某次会话当中通过超链接打开的新页面属于同一次会话。
        2. 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
        3. 除非本次会话的所有页面都关闭后再重新访问某个Jsp或者Servlet将会创建新的会话。
      2. 注意事项: 注意原有会话还存在,只是这个旧的SessionId仍然存在与服务端,只不过再也没有客户端会携带它然后交予服务端校验。

    • 销毁阶段:
      Session的销毁只有三种方式:
      1. 调用了session.invalidate()方法
      2. Session过期(超时)
      3. 服务器重新启动

    33. Session对象的超时

    • Tomcat默认session超时时间为30分钟。
    • 设置session超时有两种方式:
      1. session.setMaxInactiveInterval(时间)://单位是秒
      2. 在web.xml配置
    <session-config>
    <session-timeout>
    10
    </session-timeout>
    </session-config> //单位是分
    

    34. application对象

    • application对象实现了用户间数据的共享,可存放全局变量。
    • application开始于服务器的启动,终止与服务器的关闭。
    • 在用户的前后连接或不同用户之间的连接中,可以对application对象的同一属性进行操作。
    • 在任何地方对application对象属性的操作,都将影响到其他用户对此的访问。
    • 服务器的启动和关闭决定了application对象的生命。
    • application对象是ServletContext类的实例。

    35. application对象的常用方法

    • public void setAttribute(String name,Object value):使用指定名称将对象绑定到此对话。
    • public Object getAttribute(String name)返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回null。
    • Enumeration getAttributeNames() 返回所有可用属性名的枚举
    • String getServerInfo() 返回JSP(SERVLET)引擎名及版本号
    <%
        application.setAttribute("username", "fukq");
        application.setAttribute("age", "123");
        application.setAttribute("sex", "男");
    %>
    名字是:<%=application.getAttribute("username")%>
    application中的属性有:
    <%
        Enumeration enumeration = application.getAttributeNames();
        while (enumeration.hasMoreElements()) {
            out.println(enumeration.nextElement() + "&nbsp;&nbsp");
        }
    %><br>
    JSP(SERVLET)引擎名及版本号:    <%=application.getServerInfo()%><br>
    
    名字是:fukq 
    application中的属性有: javax.servlet.context.tempdir   org.apache.catalina.resources   org.apache.tomcat.util.scan.MergedWebXml   org.apache.tomcat.InstanceManager   sex   org.apache.catalina.jsp_classpath   org.apache.jasper.compiler.ELInterpreter   org.apache.jasper.compiler.TldLocationsCache   org.apache.tomcat.JarScanner   javax.websocket.server.ServerContainer   age   org.apache.jasper.runtime.JspApplicationContextImpl   username   
    JSP(SERVLET)引擎名及版本号Apache Tomcat/7.0.85
    

    36. page对象

    page对象.png

    page对象的常用方法与object对象的常用方法是基本一致的:

    • 举例:
    当前page页面对象的字符串描述:   <%=page.toString()%>
    
    当前page页面对象的字符串描述: org.apache.jsp.page_jsp@7c5d9ae
    
    toString 打印的实际是对象的hashcode值
    

    37. pageContext对象

    • pageContext对象提供了对JSP页面内所有得对象及名字空间得访问。
    • pageContext对象可以访问到本页所在得session,也可以取本页面所在的application的某一个属性值。
    • pageContext对象相当于页面中所有功能的集大成者。
    • pageContext对象的本类名也叫pageContext。

    38. pageContext对象常用方法

    • JspWriter getOut():返回当前客户端响应被使用的JspWriter流(out)
    • HttpSession getSession():返回当前页中的HttpSession对象(session)
    • Object getPage()返回当前页的Object对象(page)
    • ServletRequest getRequest()返回当前页的ServletRequest对象(request)
    • ServletResponse getResponse()返回当前页的ServletResponse对象(response)
    • void setAttribute(String name,Object attribute)设置属性及属性值
    • Object getAttribute(String name,int scope)在指定范围内取属性的值
    • int getAttributeScope(String name)返回某属性的作用范围
    • void forward(String relativeUrlPath)使当前页面重导到另一页面
    • void include(String relativeUrlPath)在当前位置包含另一文件
        session.setAttribute("username", "admin");
        session.setAttribute("password", "123456");
        session.setAttribute("age", "5");
    
    用户名是:<%=pageContext.getSession().getAttribute("username")%><br>
    
    用户名是:admin
    
    //包含这个页面
        pageContext.include("index.jsp");
    
    //跳转到其他页面
    //    pageContext.forward("index.jsp");
    

    39. Config对象

    • 简介:config对象是在一个Servlet初始化时,Jsp引擎向它传递信息用的,此信息包括Servlet初始化时所要用到的参数(通过属性名和属性值构成)以及服务器的有关信息(通过传递一个ServetConext对象)。
    • 常用方法:
      1. ServletContext getServletContext 返回含有服务器相关信息的ServletContext对象
      2. String getInitParameter(String name)返回初始化参数的值
      3. Enumeration getInitParameterNames()返回Servlet初始化所需所有参数的枚举

    40. exception对象

    • exception对象时一个异常对象,当一个页面在运行过程中发生了异常,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。它实际上时java.lang.Throwable的对象。

    41. exception常用方法

    • String getMessage()返回描述异常的消息
    • String toString()返回关于异常的简短描述信息
    • void printStackTrace()显示异常及其栈轨迹
    • Throwable FillInStackTrace 重写异常的执行栈轨迹
    errorPage="exception.jsp"
    
    <% System.out.print(1 / 0);%>
    
     isErrorPage="true"
     
     异常的消息是: <%=exception.getMessage()%> <br>
    异常的字符串描述是:<%=exception.toString()%><br>
    

    42. 用户登录小栗子

    • 用户名admin,密码admin,登录成功使用服务器内部转发到login_success.jsp页面,并且提示登录成功的用户名。如果登录失败则请求重定向到login_failure.jsp页面。
    login.jsp页面:
    
    <h1>登录小案例</h1>
    <form action="dologin.jsp" method="post">
        <p class="main">
            <label>用户名: </label>
            <input name="username" value=""/>
            <label>密码: </label>
            <input type="password" name="password" value="">
        </p>
        <p class="space">
            <input type="submit" value="登录"/>
        </p>
    </form>
    
    dologin.jsp页面
    <%
        String username = "";
        String password = "";
        request.setCharacterEncoding("utf-8"); //防止中文乱码
    
        username = request.getParameter("username");
        password = request.getParameter("password");
    
        //如果用户和密码都等于admin,则登录成功
        if ("admin".equals(username) && "admin".equals(password)) {
            session.setAttribute("loginUser", username);
            request.getRequestDispatcher("login_success.jsp").forward(request, response);
        } else {
            response.sendRedirect("login_failure.jsp");
        }
    %>
    
    login_success页面
        <%
            String loginUser = "";
            if (session.getAttribute("loginUser") != null) {
                loginUser = session.getAttribute("loginUser").toString();
            }
        %>
    
    
    login_failure页面
        欢迎<%=loginUser%>登录成功!
    <div>登录失败,请检查用户名或密码<br>
        <a href="login.jsp">返回登录</a>
    </div>
    

    43. Javabean简介

    • javabean就是符合某种特定规范的java类.
    • 使用javabean可以减少代码冗余,功能区分明确,提高了代码的维护性.

    44. Javabean设计原则

    • 公有类
    • 无参的公有构造方法
    • 属性私有
    • 提供geter和setter方法

    45. Jsp动作元素

    • 动作元素为请求处理阶段提供信息.
    • 遵循XML元素的语法:有一个包含元素名的开始标签,可以有属性\可选的内容\与开始标签匹配的结束标签.

    46. Jsp动作分类

    • 第一类:与存取JavaBean有关的:
    <jsp:useBean><jsp:setProperty><jsp:getProperty>
    
    • 第二类:JSP1.2就开始有的基本元素,包括6个动作元素
    <jsp:include><jsp:forward><jsp:param><jsp:plugin><jsp:params><jsp:fallback>
    
    • 第三类:JSP2.0新增加的元素,主要与JSP Document有关,包括6个元素
    <jsp:root><jsp:declaration><jsp:scriptlet><jsp:expression><jsp:text><jsp:output>
    
    • 第四类:JSP2.0新增的动作元素,主要是用来动态生成XML元素标签的值,包括3个动作
    <jsp:attribute><jsp:body><jsp:element>
    
    • 第五类:JSP2.0新增的动作元素,主要是用在Tag FIle中,有2个元素
    <jsp:invoke><jsp:dobody>
    

    47. 普通方式创建JavaBean

    <%@ page import="com.test.User" %> 
    
    <%
        User user = new User();
        user.setmUserName("admin"); //设置用户名
        user.setmPassword("123456");//设置密码
    %>
    
    账户名是: <%=user.getmUserName()%>
    密码是:<%=user.getmPassword()%>
    

    48. Jsp页面中使用jsp动作标签使用javabean

    • jsp:useBeans : 在jsp页面中实例化或者在指定范围内使用javabean
    <jsp:userBean id="标识符" class = "java类名" scope = "作用范围"/>
    
    <jsp:useBean id="myUser" class="com.test.User" scope="page"></jsp:useBean>
    <h1>使用javabean动作创建javabean实例</h1>
    账户名是: <%=myUser.getmUserName()%>
    密码是:<%=myUser.getmPassword()%>
    
    账户名是: null 密码是:null
    
    • jsp:setProperty:给已经实例化的javabean对象的属性赋值,一共有四种形式
    <jsp:setProperty name ="javaBean实例名" property = "*"/>(跟表单关联)
    <jsp:setProperty name = "javabean实例名" property = "javabean属性名"/>(跟表单关联)
    <jsp:setProperty name = "javabean实例名" property = "javabean属性名" value = "beanvalue"/>(手工设置)
    <jsp:setProperty name = "javabean实例名" property = "propertyName" param = "request对象中的参数名"/>(跟request参数关联)
    
    第一种:备注:根据表单自动匹配所有的属性
    
    <html>
    <head>
        <title></title>
    </head>
    <body>
    <h1>系统登录</h1>
    <hr>
    <form name="loginForm" action="dologin.jsp" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value=""/></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password" value=""></td>
            </tr>
            <tr>
                <td colspan="2" align="center"><input type="submit" value="登录"></td>
                <td></td>
            </tr>
        </table>
    </form>
    </body>
    </html>
    
    <html>
    <head>
        <title>我的个人主页</title>
    </head>
    <body>
    <jsp:useBean id="myUsers" class="com.test.User" scope="page"/>
    <h1>setProperty动作元素</h1>
    <hr>
    
    <jsp:setProperty name="myUsers" property="*"></jsp:setProperty>
    用户名:<%=myUsers.getUsername()%><br>
    密码:<%=myUsers.getPassword()%>
    </body>
    </html>
    
    用户名:fukaiqiang
    密码:123456
    
    第二种:备注:根据表单匹配部分的属性
    
    <jsp:setProperty name="myUsers" property="username"></jsp:setProperty>
    
    用户名:fukaiqiang
    密码:null
    
    第三种:备注:和表单无关,通过手工赋值给属性
    
    <jsp:setProperty name="myUsers" property="username" value="Lisi"></jsp:setProperty>
    <jsp:setProperty name="myUsers" property="password" value="654321"></jsp:setProperty>
    
    用户名:Lisi
    密码:654321
    
    第四种:通过Url传参数给属性赋值
    
    <jsp:setProperty name="myUsers" property="username"></jsp:setProperty>
    <jsp:setProperty name="myUsers" property="password" param="myPass"></jsp:setProperty>
    用户名:<%=myUsers.getUsername()%><br>
    密码:<%=myUsers.getPassword()%>
    
    <form name="loginForm" action="dologin.jsp?myPass=789456123 " method="post">
    
    用户名:fukaiqiang
    密码:789456123
    
    • jsp:getProperty
    <!--使用传统的表达式方式来获取用户名和密码-->
    用户名:<%=myUsers.getUsername()%><br>
    密码:<%=myUsers.getPassword()%>
    <!--使用getProperty方式来获取用户名和密码-->
    用户名:<jsp:getProperty name="myUsers" property="username"></jsp:getProperty>
    用户名:<jsp:getProperty name="myUsers" property="password"></jsp:getProperty>
    

    49. Javabean四个作用域范围

    • 使用usebeans的scope属性可以用来指定javabean的作用范围.
     1. page:尽在当前页面有效.
     2. request:可以用过HttpRequest.getAttribute()方法取得javabean对象.
     3. session:可以通过HttpSession.getAttribute()方法取得javabean对象.
     4.application:可以通过applicaion.getAttribute()方法取得javabean对象.
    
    • application:
    <h1>javabean的四个作用域范围</h1>
    <hr>
    <jsp:useBean id="myUsers" class="com.test.User" scope="application"/>
    用户名:
    <jsp:getProperty name="myUsers" property="username"/>
    <br>
    密码:
    <jsp:getProperty name="myUsers" property="password"/>
    <br>
    <!--使用内置对象获取用户名和密码-->
    <hr>
    用户名:<%=((User) application.getAttribute("myUsers")).getUsername()%><br>
    密码:<%=((User) application.getAttribute("myUsers")).getPassword()%>
    
    • session:
    用户名:<%=((User) session.getAttribute("myUsers")).getUsername()%><br>
    密码:<%=((User) session.getAttribute("myUsers")).getPassword()%>
    
    • request:
    <jsp:useBean id="myUsers" class="com.test.User" scope="request"/>
    <%
     request.getRequestDispatcher("testscope.jsp").forward(request,response);
    %>
    用户名:<%=((User) request.getAttribute("myUsers")).getUsername()%><br>
    密码:<%=((User) request.getAttribute("myUsers")).getPassword()%>
    
    • page:
    <jsp:useBean id="myUsers" class="com.test.User" scope="page"/>
    
    <%
        String username = "";
        String password = "";
        if (pageContext.getAttribute("myUsers") != null) {
            username = ((User) pageContext.getAttribute("myUsers")).getUsername();
            password = ((User) pageContext.getAttribute("myUsers")).getPassword();
        }
    %>
    用户名:<%=username%>
    密码:<%=password%>
    

    50. Model1简介

    • Model1模型出现前,整个Web应用的情况:几乎全部由Jsp页面组成,Jsp页面接受处理客户端的请求,对请求处理后直接做出响应.
    • 弊端:在界面层充斥着大量的业务逻辑的代码和数据访问层的代码,Web程序的可扩展性和可维护性非常差.
    • Javabean的出现可以使jsp页面中使用javabean封装的数据或者调用javabean的业务逻辑代码,这样大大提升了程序的可维护性.
    • Model1模型:Jsp:页面;JavaBean:逻辑;javabean:数据:


      Model1简介.png

    51. jsp+javabean完成用户登录功能

    login: 
    <form name="loginForm" action="dologin.jsp" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value=""/></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password" value=""></td>
            </tr>
            <tr>
                <td colspan="2" align="center"><input type="submit" value="登录"></td>
                <td></td>
            </tr>
        </table>
    </form>
    
    dologin:
    <jsp:useBean id="loginUser" class="com.test.User" scope="page"/>
    <jsp:useBean id="userdao" class="com.test.UserDao" scope="page"/>
    <jsp:setProperty name="loginUser" property="*"/>
    <%
        //如果用户和密码都等于admin,则登录成功
        if (UserDao.userLogin(loginUser)) {
            session.setAttribute("loginUser", loginUser.getUsername());
            request.getRequestDispatcher("login_success.jsp").forward(request, response);
        } else {
            response.sendRedirect("login_failure.jsp");
        }
    %>
    
    
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        我是登录失败页面
    </body>
    </html>
    
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
        我是成功登录页面
    </body>
    </html>
    

    52. http协议的无状态性

    • 无状态是指:当浏览器发送请求给服务器的时候,服务器响应客户端请求.但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道它是刚才那个浏览器.简单地说:就是服务器不会去记得你,所以就是无状态协议.

    53. Cookie概述

    • 保存用户的状态的两大机制
      1. Session
      2. Cookie
    • Cookie是web服务器保存在客户端的一些列文本信息.
    • 典型应用一:判定注册用户是否已经登录网站.
    • 典型应用二:"购物车"的处理.

    54. Cookie的作用

    • 对特定对象的追踪.
    • 保存用户网页浏览记录与习惯
    • 简化登录

    55. Jsp页面中创建与使用Cookie

    • 创建Cookie对象
    Cookie newCookie = new Cookie(String key,Object value);
    
    • 写入Cookie对象
    response.addCookie(new Cookie);
    
    • 读取Cookie对象
    Cookie[] cookies = request.getCookies();
    
    • 与Cookie有关的常用方法
    1. void setMaxAge(int expiry):设置cookie的有效期,以秒为单位.
    2. void setValue(String value):在cookie创建后,对cookie进行赋值.
    3. String getName():获取cookie的名称.
    4. String getValue():获取cookie的值.
    5. int getMaxAge():获取cookie的有效时间,以秒为单位.
    

    56. Cookie在登录中的应用

    • 实现记忆用户名和密码功能
    login.jsp
    
    <body>
    
    <%
        request.setCharacterEncoding("utf-8");
        String username = "";
        String password = "";
        Cookie[] cookies = request.getCookies();
        if (cookies != null && cookies.length > 0) {
            for (Cookie c : cookies) {
                if (c.getName().equals("username")) {
                    username = URLDecoder.decode(c.getValue(), "utf-8");
                }
                if (c.getName().equals("password")) {
                    password = URLDecoder.decode(c.getValue(), "utf-8");
                }
            }
        }
    %>
    <form name="loginForm" action="dologin.jsp" method="post">
        <table>
            <tr>
                <td>用户名:</td>
                <td><input type="text" name="username" value="<%=username%>"/></td>
            </tr>
            <tr>
                <td>密码:</td>
                <td><input type="password" name="password" value="<%=password%>"/></td>
            </tr>
            <tr>
                <td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天内记住我的登录状态</td>
            </tr>
            <tr>
                <td colspan="2" align="center"><input type="submit" value="登录"/><input type="reset" value="取消"/></td>
            </tr>
        </table>
    </form>
    
    dologin.jsp
    
    <body>
    
    <%
        request.setCharacterEncoding("utf-8");
        //首先判断用户是否选择了记住登录状态
        String[] isUseCookies = request.getParameterValues("isUseCookie");
        if (isUseCookies != null && isUseCookies.length > 0) {
            //把用户名和密码保存在Cookie对象里面
            String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
            //使用URLEncoder解决无法在Cookie当中保存中文字符串问题
            String password = URLEncoder.encode(request.getParameter("password"), "utf-8");
    
            Cookie usernameCookie = new Cookie("username", username);
            Cookie passwordCookie = new Cookie("password", password);
            usernameCookie.setMaxAge(864000);
            passwordCookie.setMaxAge(864000);//设置最大生存期限为10天
            response.addCookie(usernameCookie);
            response.addCookie(passwordCookie);
        } else {
            Cookie[] cookies = request.getCookies();
            if (cookies != null && cookies.length > 0) {
                for (Cookie c : cookies) {
                    if (c.getName().equals("username") || c.getName().equals("password")) {
                        c.setMaxAge(0); //设置Cookie失效
                        response.addCookie(c); //重新保存。
                    }
                }
            }
        }
    %>
    <a href="user.jsp" target="_blank">查看用户信息</a>
    </body>
    
    user.jsp
    
    <body>
    <h1>用户信息</h1>
    <%
        request.setCharacterEncoding("utf-8");
        String username="";
        String password = "";
        Cookie[] cookies = request.getCookies();
        if(cookies!=null&&cookies.length>0) {
            for(Cookie c:cookies) {
                if(c.getName().equals("username")) {
                    username = URLDecoder.decode(c.getValue(),"utf-8");
                }
                if(c.getName().equals("password")) {
                    password = URLDecoder.decode(c.getValue(),"utf-8");
                }
            }
        }
    %>
    <br>
    用户名:<%=username %><br>
    密码:<%=password %><br>
    </body>
    
    解决Cookie中文乱码的问题:
    1. request.setCharacterEncoding("utf-8");
    2. URLEncoder 编码
    3. URLDecoder 解码
    

    57. Session与Cookie的对比

    • session
      1. 在服务器端保存用户信息
      2. session中保存的是Object类
      3. 随会话的结束而将其存储的数据销毁
      4. 保存重要的信息
      5. 保存对象的大小没有限制
    • cookie
      1. 在客户端保存用户信息
      2. cookie保存的是String类型
      3. cookie可以长期保存在客户端
      4. 保存不重要的用户信息
      5. 保存对象的大小有限制

    58. include指令

    <%@ include file = "URL"%>
    <%@ include file = "date.jsp"%>
    

    59. include动作

    <jsp:include page = "URL" flush = "true|false"/>
    page:要包含的页面
    flush:被包含的页面是否从缓冲区读取
    

    60. include指令与include动作的区别

    指令与动作.png

    61. forward动作

    <jsp:forward page="user.jsp"></jsp:forward>
    相当于转发:
    request.getRequestDispatcher("user.jsp").forward(request,response);
    

    62. param动作

    jsp:param :用于增加一个参数
    <jsp:forward page="user.jsp">
        <jsp:param name="email" value="123@163.com"></jsp:param>
    </jsp:forward>
    
    jsp:param :用于修改一个参数的参数值
    <jsp:forward page="user.jsp">
        <jsp:param name="password" value="88888"></jsp:param>
    </jsp:forward>
    

    63. 支持

    希望阅读本篇能够让你对Jsp有更全面的理解,还请多多支持,多多关注,多多点赞,多多收藏.

    相关文章

      网友评论

        本文标题:JavaWeb-不得不学习的Jsp

        本文链接:https://www.haomeiwen.com/subject/vwqofftx.html