JavaWeb-不得不学习的Jsp

0. 引言

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

1. 安装Tomacat

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

  • 配置环境变量:

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

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

2. Tomcat闪退

  • 配置JAVA环境变量即可

3. Tomcat目录结构

JavaWeb-不得不学习的Jsp_第1张图片
Tomcat目录结构.png

4. 编写第一个java web程序

  • Tomcat-webapps下创建index.jsp文件


 
我的第一个jsp页面




欢迎大家访问我的个人主页

  • Tomcat-webapps下创建WEB-INF文件夹
  • WEB-INF文件夹下面创建名为classes和lib的文件夹和web.xml文件,web.xml内容如下:





  • 访问http://172.25.164.79:8080/myhome/index.jsp即可
  • 如果遇到乱码:修改浏览器的编码为utf-8(Google安装Charset插件便于修改编码方式)
  • 总结步骤如下:
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:




    
        /abc.jsp
    



  • class文件夹,用以放置.class文件
  • lib文件夹,用以存放需要的jar包

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

  • https://www.cnblogs.com/shindo/p/7272646.html

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注释:
     //客户端可见
  • 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 %>

5+6 = <%=add(5, 6)%>

16. JSP的生命周期

JavaWeb-不得不学习的Jsp_第2张图片
JSP页面的声明周期.png

JavaWeb-不得不学习的Jsp_第3张图片
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 + " ";
        }
        s += "
"; } 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
缓冲区剩余大小:<%=out.getRemaining()%>byte
是否自动清空缓冲区:<%=out.isAutoFlush()%>
缓冲区大小:8192byte 缓冲区剩余大小:8101byte 是否自动清空缓冲区:true
<%
    out.println("

静夜思

"); out.println("窗前明月光
"); out.println("疑是地上霜
"); out.println("举头望明月
"); out.println("低头思故乡
"); %> 缓冲区大小:<%=out.getBufferSize()%>byte
缓冲区剩余大小:<%=out.getRemaining()%>byte
是否自动清空缓冲区:<%=out.isAutoFlush()%>
静夜思
窗前明月光
疑是地上霜
举头望明月
低头思故乡
缓冲区大小:8192byte
缓冲区剩余大小:8046byte
是否自动清空缓冲区:true
<%
    out.println("

静夜思

"); out.println("窗前明月光
"); out.println("疑是地上霜
"); out.flush(); out.println("举头望明月
"); out.println("低头思故乡
"); %> 缓冲区大小:<%=out.getBufferSize()%>byte
缓冲区剩余大小:<%=out.getRemaining()%>byte
是否自动清空缓冲区:<%=out.isAutoFlush()%>
静夜思
窗前明月光
疑是地上霜
举头望明月
低头思故乡
缓冲区大小:8192byte
缓冲区剩余大小:8142byte
是否自动清空缓冲区:true

说明:因为执行了flush,所以缓冲区变大了
<%
    out.println("

静夜思

"); out.println("窗前明月光
"); out.println("疑是地上霜
"); out.flush(); out.clear(); out.println("举头望明月
"); out.println("低头思故乡
"); %> 缓冲区大小:<%=out.getBufferSize()%>byte
缓冲区剩余大小:<%=out.getRemaining()%>byte
是否自动清空缓冲区:<%=out.isAutoFlush()%>
静夜思
窗前明月光
疑是地上霜

说明:out.clear()不能在out.flush()之后调用否则会抛出异常,后面的代码不会执行,但是out.clearBuffer()不会抛出异常。

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

JavaWeb-不得不学习的Jsp_第4张图片
表单提交方式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" %>




    我的个人主页



用户注册

用户名:
爱好: 读书 音乐 电影 上网
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" %>




    我的个人主页



request内置对象

用户名: <%=request.getParameter("username")%>
爱好: <% String[] favorites = request.getParameterValues("favorite"); if (favorites != null) { for (int i = 0; i < favorites.length; i++) { out.println(favorites[i] + "  "); } } %>
request内置对象
用户名: ä»�å�¯å¼º
爱好: read   music   movie   internet  
获取表单数据出现中文乱码的解决办法是在体交表单的时候:
<%
    request.setCharacterEncoding("utf-8");
%>
request内置对象
用户名: 付凯强
爱好: read   music  
  • 通过URL传递参数:
测试URL传递参数
用户名: lisi
测试URL传递参数
用户名: 中æ��
但是通过request设置参数无法解决URL传递中文出现的乱码问题
但是通过配置Tomcat服务器里面conf-server.xml文件可以解决
    

25. request对象(下)

  • setAttribute和getAttribute
<%
    request.setCharacterEncoding("utf-8");
    request.setAttribute("password","123456");
%>
密码:<%=request.getAttribute("password")%>
密码:<%=request.getAttribute("password")%> 
请求的MIME类型:<%=request.getContentType()%>
协议类型及版本号:<%=request.getProtocol()%>
服务器主机名:<%=request.getServerName()%>
服务器端口号:<%=request.getServerPort()%>
请求文件的长度:<%=request.getContentLength()%>
请求文件的ip地址:<%=request.getRemoteAddr()%>
请求的真实路径:<%=request.getRealPath("request.jsp")%>
请求的上下文路径:<%=request.getContextPath()%>
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("

reponse对象

"); out.println("
"); 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("

reponse对象

"); out.println("
"); out.flush(); PrintWriter outer = response.getWriter(); outer.println("大家好,我是response对象生成的输出流outer对象"); %>
out.flush();刷新缓冲区,刷新的时候会把数据刷新到浏览器上。
<%
    response.setContentType("text/html;charset=UTF-8"); //设置响应的MIMI类型

    out.println("

reponse对象

"); out.println("
"); 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()%>
Session创建时间:1520565423914
<%!
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
%>
Session创建时间:<%=simpleDateFormat.format(new Date(session.getCreationTime()))%>
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()))%>
Session的ID编号:<%=session.getId()%>
从Session中获取用户名:<%=session.getAttribute("username")%> 跳转到Session_page2.jsp
session_page2:


session内置对象


Session的ID编号:<%=session.getId()%>
从Session中获取用户名:<%=session.getAttribute("username")%>
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] + "  ");
    }
%>
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配置


10

 //单位是分

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() + "  ");
    }
%>
JSP(SERVLET)引擎名及版本号: <%=application.getServerInfo()%>
名字是: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对象

JavaWeb-不得不学习的Jsp_第5张图片
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")%>
用户名是: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()%> 
异常的字符串描述是:<%=exception.toString()%>

42. 用户登录小栗子

  • 用户名admin,密码admin,登录成功使用服务器内部转发到login_success.jsp页面,并且提示登录成功的用户名。如果登录失败则请求重定向到login_failure.jsp页面。
login.jsp页面:

登录小案例

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%>登录成功!
登录失败,请检查用户名或密码
返回登录

43. Javabean简介

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

44. Javabean设计原则

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

45. Jsp动作元素

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

46. Jsp动作分类

  • 第一类:与存取JavaBean有关的:

  • 第二类:JSP1.2就开始有的基本元素,包括6个动作元素

  • 第三类:JSP2.0新增加的元素,主要与JSP Document有关,包括6个元素

  • 第四类:JSP2.0新增的动作元素,主要是用来动态生成XML元素标签的值,包括3个动作

  • 第五类:JSP2.0新增的动作元素,主要是用在Tag FIle中,有2个元素

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


使用javabean动作创建javabean实例

账户名是: <%=myUser.getmUserName()%> 密码是:<%=myUser.getmPassword()%>
账户名是: null 密码是:null
  • jsp:setProperty:给已经实例化的javabean对象的属性赋值,一共有四种形式
(跟表单关联)
(跟表单关联)
(手工设置)
(跟request参数关联)
第一种:备注:根据表单自动匹配所有的属性



    


系统登录


用户名:
密码:
我的个人主页

setProperty动作元素


用户名:<%=myUsers.getUsername()%>
密码:<%=myUsers.getPassword()%> 用户名:fukaiqiang 密码:123456
第二种:备注:根据表单匹配部分的属性



用户名:fukaiqiang
密码:null
第三种:备注:和表单无关,通过手工赋值给属性




用户名:Lisi
密码:654321
第四种:通过Url传参数给属性赋值



用户名:<%=myUsers.getUsername()%>
密码:<%=myUsers.getPassword()%>
用户名:fukaiqiang 密码:789456123
  • jsp:getProperty

用户名:<%=myUsers.getUsername()%>
密码:<%=myUsers.getPassword()%> 用户名: 用户名:

49. Javabean四个作用域范围

  • 使用usebeans的scope属性可以用来指定javabean的作用范围.
 1. page:尽在当前页面有效.
 2. request:可以用过HttpRequest.getAttribute()方法取得javabean对象.
 3. session:可以通过HttpSession.getAttribute()方法取得javabean对象.
 4.application:可以通过applicaion.getAttribute()方法取得javabean对象.
  • application:

javabean的四个作用域范围


用户名:
密码:

用户名:<%=((User) application.getAttribute("myUsers")).getUsername()%>
密码:<%=((User) application.getAttribute("myUsers")).getPassword()%>
  • session:
用户名:<%=((User) session.getAttribute("myUsers")).getUsername()%>
密码:<%=((User) session.getAttribute("myUsers")).getPassword()%>
  • request:

<%
 request.getRequestDispatcher("testscope.jsp").forward(request,response);
%>
用户名:<%=((User) request.getAttribute("myUsers")).getUsername()%>
密码:<%=((User) request.getAttribute("myUsers")).getPassword()%>
  • 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:数据:


    JavaWeb-不得不学习的Jsp_第6张图片
    Model1简介.png

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

login: 

    
用户名:
密码:
dologin:



<%
    //如果用户和密码都等于admin,则登录成功
    if (UserDao.userLogin(loginUser)) {
        session.setAttribute("loginUser", loginUser.getUsername());
        request.getRequestDispatcher("login_success.jsp").forward(request, response);
    } else {
        response.sendRedirect("login_failure.jsp");
    }
%>



    Title


    我是登录失败页面





    Title


    我是成功登录页面


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



<%
    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");
            }
        }
    }
%>
用户名:
密码:
十天内记住我的登录状态
dologin.jsp



<%
    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); //重新保存。
                }
            }
        }
    }
%>
查看用户信息

user.jsp


用户信息

<% 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"); } } } %>
用户名:<%=username %>
密码:<%=password %>
解决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动作


page:要包含的页面
flush:被包含的页面是否从缓冲区读取

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

JavaWeb-不得不学习的Jsp_第7张图片
指令与动作.png

61. forward动作


相当于转发:
request.getRequestDispatcher("user.jsp").forward(request,response);

62. param动作

jsp:param :用于增加一个参数

    

jsp:param :用于修改一个参数的参数值

    

63. 支持

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

你可能感兴趣的:(JavaWeb-不得不学习的Jsp)