美文网首页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