JSP 上手笔记(上)

JSP

JSP,能够直接使用Html代码,然后在html中写java代码的工具

学习网站:how2java

(一)、JSP的执行过程

以 hello.jsp文件为例:

<%@page contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="java.util.*"%>
 
你好 JSP
 
<br>
 
<%=new Date().toLocaleString()%>
  1. 将hello.jsp转译为 hello_jsp.java;(hello_jsp.java位于tomat\work\Catalina\_\org\apache\jsp)
  2. hello_jsp.java是一个servlet,把hello_jsp.java编译为 hello_jsp.class;
  3. 执行hello_jsp , 生成html
  4. 通过http协议将html响应返回给浏览器
  • jsp文件转译成的Java程序是一个servlet

    因为该类继承了 HttpJspBase ,而HttpJspBase继承了HttpServlet类所以可以说jsp文件转译生成的Java是一个servlet。
    在这里插入图片描述

Jsp 执行过程

(二)、JSP的页面元素

  1. 静态内容

    html,css,javascript等内容

  2. 指令

    以<%@开始%>结尾,比如<%@page import=“java.util.*”%>

  3. 表达式 <%=%>

    输出一段html

    <%=%>与<%out.println%><

    两者是等价的,out是jsp的隐式对象,可以直接使用。隐式对象一共有9种,参考 隐式对象 章节。

    注: <%=%> 不需要分号结尾,<%%> 需要以分号结尾,和java代码一样

  4. Scriptlet

    在<%%>之间,可以写任何Java代码

  5. 声明

    在<%!%>之间可以声明字段或方法,但不建议这么做

  6. 动作

    <jsp:include page=“Filename”>

    在jsp页面中包含另外一个页面。

  7. 注释<%-- --%>

    不同于html的注释 ,通过jsp的注释,浏览器也看不到相应的代码,相当于在servlet中注释掉了

JSP页面元素

Jsp 页面元素

(三)、Jsp中的include

几乎每个页面都需要加上的信息部分页面,比如每个网页最下方的版权声明信息,可以使用include包含,就可以避免每个网页都要单独写还有修改公共信息页面的工作量

  • 指令include

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

    指令include中footer.jsp的内容会被插入到 jsp转译成的 .Java中,最后只会生成一个Java文件。所以在hello.jsp中定义的变量,可以直接在footer.jsp访问

  • 动作include

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

    动作include中footer.jsp的内容不会被插入到jsp转译的.Java文件中,会有一个footer.java独立存在。每个包含footer.jsp的页面在服务器访问footer_jsp.java,然后把返回的结果嵌入到响应中。

    动作include 是对footer.jsp进行一次独立的访问,需要进行传参。

    <%! hello.jsp %>
    <%@page contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8" import="java.util.*"%>
      
    你好 JSP
    <%=new Date().toLocaleString()%>
     
    <jsp:include page="footer.jsp">
        <jsp:param  name="year" value="2017" />
    </jsp:include>
    
    <%! footer.jsp %>
    <hr>
        <p style="text-align:center">copyright@<%=request.getParameter("year")%>
    </p>
    

(四)、跳转

​ 跳转分为客户端跳转服务端跳转

  • 客户端跳转

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

    客户端跳转效果在浏览器的调试工具中可以看到,访问jump.jsp时返回302(指临时客户端跳转),再跳转到hello.jsp中

  • 服务端跳转

    <%
    	request.getRequestDispatcher("hello.jsp").forward(request, response);
    %>
    <%! 或者 %>
    <jsp:forward page="hello.jsp"/>
    

客户端跳转和服务端跳转的区别:

服务端跳转
客户端跳转

(五)、cookie

cookie是一种浏览器和服务器交互数据的方式

  1. Cookie由服务器创建,但不会保存在服务器
  2. 创建好之后发送给浏览器保存在用户本地。
  3. 在下次访问网站时候,就会把cookie发送给服务器

setCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
    Cookie c = new Cookie("name", "Gareen");
    c.setMaxAge(60 * 24 * 60);//cookie保留时间
    c.setPath("127.0.0.1");	//服务器主机名
    response.addCookie(c);	//通过response将这个cookie保存到浏览器端口
%>
 
<a href="getCookie.jsp">跳转到获取cookie的页面</a>

getCookie.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
    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>");
        }
%>

(六)、Session(会话)

​ 会话Session指的是从用户打开浏览器访问网站开始,无论在这个网站中访问了多少个页面,点击了多少链接,都属于同一个会话,知道该用户关闭浏览器为止,这都属于一个会话Session。

setSession.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
   session.setAttribute("name", "teemo");
%>
 
<a href="getSession.jsp">跳转到获取session的页面</a>

getSession.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" import="javax.servlet.http.Cookie"%>
 
<%
    String name = (String)session.getAttribute("name");
%>
 
session中的name: <%=name%>

Session 的有效期

​ 登录一个网站后,在短时间内可以继续访问而不用重新登录。但如果长时间不登陆,过了Session的有效期,依然会要求重新登录。

​ Session的有效期在Tomcat中默认配置是30min。

可以通过在tomcat/conf/web.xml中的session-config配置中进行调整


(七)、JSP作用域

Jsp中的四个作用域:

  • pageContext 当前页面
  • requestContext 一次请求
  • sessionContext 当前会话
  • applicationContext 全局,所有用户共享

7.1 pageContext 当前页面

通过pageContext.setAttribute(key,value)的数据,只能在当前页面访问,在其他页面不能访问。

7.2 requestContext 一次请求

表示随着本次请求结束,其中的数据也就被回收了。

常用写法如下:

request.setAttribute("name","gareen"); 
request.getAttribute("name")

还可以用pageContext来做,不过不常用,如下:

 
pageContext.setAttribute("name","gareen",pageContext.REQUEST_SCOPE);
pageContext.getAttribute("name",pageContext.REQUEST_SCOPE)

(1)requestContext与服务端跳转

requestContext指的是一次请求
如果发生了服务端跳转,从setContext.jsp跳转到getContext.jsp,这其实,还是一次请求。 所以在getContext.jsp中,可以取到在requestContext中设置的值

这也是一种页面间传递数据的方式

setContext.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    request.setAttribute("name","gareen");
%>
<jsp:forward page="getContext.jsp"/>

getContext.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%=request.getAttribute("name")%>

(2)requestContext与客户端跳转

客户端跳转时,浏览器会发生一次新的访问,新的访问会产生一个新的request对象

所以再页面跳转的情况下,是无法通过request传递数据的。

setContext.jsp

<%@ page language="java" contentType="text/html;charset=UTF-8"
    pageEncoding="UTF-8" %>
<%
	request.setAttribute("name","gareen");
	response.sendRedirect("getContext.jsp");
%>

getContext.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%=request.getAttribute("name")%>

7.3 sessionContext 当前会话

​ 指的是会话,从一个用户打开网站的那一刻起,无论访问了多少网页,链接都属于同一个会话,直到浏览器关闭。

​ 故页面间的传递数据,也是可以通过Session传递的。但不同用户对应的session是不一样的,所以session无法在不同的用户之间共享数据。

sessionContext的用法与requestContext类似:

  • setContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%
    session.setAttribute("name","gareen");
    response.sendRedirect("getContext.jsp");
%>
  • getContext.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
 
<%=session.getAttribute("name")%>

也可以用如下方式:

pageContext.setAttribute("name","gareen",pageContext.SESSION_SCOPE);
pageContext.getAttribute("name",pageContext.SESSION_SCOPE)

7.4 applicationContext 全局

所有用户共享同一个数据。

在JSP中使用application对象,application对象是ServletContext接口的实例

可以通过request.getSevletContext()来获取;application映射的就是web应用本身。

故application == request.getServletContext()会返回true

下文待续

Jsp上手笔记(下)更新中,待续……

猜你喜欢

转载自blog.csdn.net/weixin_40849588/article/details/95678121