• J2EE学习笔记:JSP


    JSP(全称JavaServer Pages)是由Sun Microsystems公司主导创建的一种动态网页技术标准。JSP部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成HTML、XML或其他格式文档的Web网页,然后返回给请求者。JSP技术以Java语言作为脚本语言,为用户[HTTP请求提供服务,并能与服务器上的其它Java程序共同处理复杂的业务需求。

    J2EE学习笔记:JSP

    <%@page contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8" import="java.util.*"%>
    

    是JSP的<%@page指令

    import="java.util.* 
    

    导入其他类,如果导入多个类,彼此用,逗号隔开,像这样 import="java.util.,java.sql."

    <%=new Date().toLocaleString()%>
    

    <%=

    执行过程

    1. 把 hello.jsp转译为hello_jsp.java
    2. hello_jsp.java 位于
      d: omcatworkCatalinalocalhost_orgapachejsp
    3. hello_jsp.java是一个servlet
    4. 把hello_jsp.java 编译为hello_jsp.class
    5. 执行hello_jsp,生成html
    6. 通过http协议把html 响应返回给浏览器

    1580716846128

    页面元素

    jsp由这些页面元素组成:

    1. 静态内容
      就是html,css,javascript等内容
    2. 指令
      以<%@开始 %> 结尾,比如<%@page import="java.util.*"%>
    3. 表达式 <%=%>
      用于输出一段html
    4. Scriptlet
      在<%%> 之间,可以写任何java 代码
    5. 声明
      在<%!%> 之间可以声明字段或者方法。但是不建议这么做。
    6. 动作
      <jsp:include page="Filename" > 在jsp页面中包含另一个页面。在包含的章节有详细的讲解
    7. 注释 <%-- -- %>
      不同于 html的注释 通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了

    两种包含

    1、 指令include

    <%@include file="footer.jsp" %>
    

    footer.jsp的内容会被插入到 hello.jsp 转译 成的hello_jsp.java中,最后只会生成一个hello_jsp.java文件

    参数方式

    因为指令<%@include 会导致两个jsp合并成为同一个java文件,所以就不存在传参的问题,在发出hello.jsp 里定义的变量,直接可以在footer.jsp中访问。

    在footer.jsp中

    <hr>
    <p style="text-align:center">copyright@<%=year%></p>
    

    在hello.jsp中

    <% int year = 2020; %>
    <%@include file="footer.jsp"%>
    

    run起来

    1580719748590

    2、 动作include

    <jsp:include page="footer.jsp" />
    

    footer.jsp的内容不会被插入到 hello.jsp 转译 成的hello_jsp.java中,还会有一个footer_jsp.java独立在。 hello_jsp.java 会在服务端访问footer_jsp.java,然后把返回的结果,嵌入到响应中。

    参数方式

    动作<jsp:include />其实是对footer.jsp进行了一次独立的访问,那么就有传参的需要。

    在footer.jsp中

    <hr>
    <p style="text-align:center">copyright@<%=request.getParameter("year")%>></p>
    

    在hello.jsp中

    <jsp:include page="footer.jsp">
        <jsp:param name="year" value="2020"></jsp:param>
    </jsp:include>
    

    run起来效果一样

    跳转

    和servlet跳转一样

    客户端跳转

    <%
        response.sendRedirect("hello.jsp");
    %>
    

    服务端跳转

    <% 
    	request.getRequestDispatcher("hello.jsp").forward(request, response);
    %>
    

    或者

    <jsp:forward page="hello.jsp"/>
    

    1、 什么是cookie

    HTTP协议本身是无状态的。什么是无状态呢,即服务器无法判断用户身份。Cookie实际上是一小段的文本信息(key-value格式)。客户端向服务器发起请求,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie,以此来辨认用户状态。

    打个比方,我们去银行办理储蓄业务,第一次给你办了张银行卡,里面存放了身份证、密码、手机等个人信息。当你下次再来这个银行时,银行机器能识别你的卡,从而能够直接办理业务。

    2、 cookie机制

    当用户第一次访问并登陆一个网站的时候,cookie的设置以及发送会经历以下4个步骤:

    客户端发送一个请求到服务器 --》 服务器发送一个HttpResponse响应到客户端,其中包含Set-Cookie的头部 --》 客户端保存cookie,之后向服务器发送请求时,HttpRequest请求中会包含一个Cookie的头部 --》服务器返回响应数据

    1580721088268

    3、 cookie属性

    属性项 属性项介绍
    NAME=VALUE 键值对,可以设置要保存的 Key/Value,注意这里的 NAME 不能和其他属性项的名字一样
    Expires 过期时间,在设置的某个时间点后该 Cookie 就会失效
    Domain 生成该 Cookie 的域名,如 domain="www.baidu.com"
    Path 该 Cookie 是在当前的哪个路径下生成的,如 path=/wp-admin/
    Secure 如果设置了这个属性,那么只会在 SSH 连接时才会回传该 Cookie

    Expires

    该属性用来设置Cookie的有效期。Cookie中的maxAge用来表示该属性,单位为秒。Cookie中通过getMaxAge()和setMaxAge(int maxAge)来读写该属性。maxAge有3种值,分别为正数,负数和0。

    • 如果maxAge属性为正数,则表示该Cookie会在maxAge秒之后自动失效。浏览器会将maxAge为正数的Cookie持久化,即写到对应的Cookie文件中(每个浏览器存储的位置不一致)。无论客户关闭了浏览器还是电脑,只要还在maxAge秒之前,登录网站时该Cookie仍然有效。下面代码中的Cookie信息将永远有效。
    • maxAge属性为负数,则表示该Cookie只是一个临时Cookie,不会被持久化,仅在本浏览器窗口或者本窗口打开的子窗口中有效,关闭浏览器后该Cookie立即失效。
    • 当maxAge为0时,表示立即删除Cookie

    那么maxAge设置为负值和0到底有什么区别呢?

    maxAge设置为0表示立即删除该Cookie,如果在debug的模式下,执行上述方法,可以看见cookie立即被删除了。

    maxAge设置为负数,能看到Expires属性改变了,但Cookie仍然会存在一段时间直到关闭浏览器或者重新打开浏览器。

    Path

    c.setPath("/");
    

    如果其值是 /a, 那么就表示仅仅访问 /a 路径的时候才会提交 cookie

    3、 一个例子

    1580721399022

    setCookie.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        Cookie c = new Cookie("name", "Gareen");
        c.setMaxAge(60 * 24 * 60);
        c.setPath("/");
        response.addCookie(c);
    %>
    
    <a href="getCookie.jsp">跳转到获取cookie的页面</a>
    </body>
    </html>
    

    getCookie.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <%
        Cookie[] cookies = request.getCookies();
        if (null != cookies)
            for (int d = 0; d <= cookies.length - 1; d++) {
                out.print(cookies[d].getName() + ":" + cookies[d].getValue() + "<br>");
            }
    %>
    </body>
    </html>
    

    1580721463255

    可以看到cookie中name的属性与上文介绍的相符合

    1580721522528

    Session

    https://www.zhihu.com/question/19786827

    https://www.cnblogs.com/xdp-gacl/p/3855702.html

    https://how2j.cn/k/jsp/jsp-session/583.html

  • 相关阅读:
    Use Visual studio 2010 build Python2.7.10
    ext4 disable journal
    ElasticSearch优化配置
    重载Python FTP_TLS 实现Implicit FTP Over TLS方式下载文件
    linux下对进程按照内存使用情况进行排序
    python 树遍历
    E: Unable to correct problems, you have held broken packages 解决方法
    C++ Lambda 表达式使用详解
    C++ 14 新特性总结
    Log4j配置
  • 原文地址:https://www.cnblogs.com/cpaulyz/p/12401616.html
Copyright © 2020-2023  润新知