java的进阶学习-第四章:JSP技术

目录

一、Session会话技术:

1.1 引入:

1.2 Session的核心:

1.3 Session的原理:

1.4 Session的细节:

1.5 Session案例-登录与退出:

二、jsp入门:

2.1 引入:

2.2 jsp的特点:

2.3 jsp的执行过程:

2.4 为什么说jsp本质上是Servlet?

2.5 jsp的生命周期:

三、jsp的语法:

3.1 jsp模板:

3.2 jsp表达式:

3.3 jsp脚本:

3.4 jsp的头文件:

3.5 jsp的声明:

3.6 jsp注释:

四、jsp三大指令:

4.1 page指令

4.2 include指令

4.3 taglib指令

五、jsp的内置对象:

5.1 引入:

5.2 九大内置对象:

5.3 out对象:

5.4 pageContext对象:

5.5 page对象:

六、jsp的域对象:

七、jsp应用的小案例:


Java基础

Web前端:

页面结构:html

Servlet、jsp(Java Server Page)=html+java

页面样式:css(Cascading Style Sheet,层叠样式表)

页面交互:js(javascript)、jQuery、AJAX

XML文件

MySQL数据库

JDBC(Java DataBase Connectivty)

JavaWeb项目:

一、Session会话技术:

1.1 引入:

Cookie的局限性:

只能存储非中文字符串,不能存储对象

1个Cookie的容量是4kB。

如果需要保存中文或对象,内容超过4KB,只能使用Session技术。

Session会话数据保存在服务器中(内存)。

1.2 Session的核心:

HttpSession

1、创建或获取Session实例对象:

request.getSession()

2、设置Session对象:

public void setMaxInactiveInterval(int interval);    设置Session的有效时间

public void invalidate()     销毁Session对象

public String getId()     获取Session的编号

3、保存会话数据到Session对象:

public void setAttribute(String name, Object value);  保存数据

public Object getAttribute(String name);    获取数据

public void removeAttribute(String name);    清除数据

public class SessionDemo01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       // 1.创建或获取Session对象

       HttpSession session = request.getSession();

       // 2.获取Session的编号

       System.out.println("SessionID:" + session.getId());

       // 设置有效时间

       // session.setMaxInactiveInterval(30 * 60);

       // 3.保存会话数据

        session.setAttribute("account", "zhao");

       session.setAttribute("loginTime", new Date());

       // 4.获取数据

       System.out.println("login time:" + session.getAttribute("loginTime"));

    }

    @Override

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doGet(request, response);

    }

}

1.3 Session的原理:

1、在第一次访问时创建Session对象,给Session对象分配一个唯一ID,名字叫做JSESSIONID。

2、把JSESSIONID作为Cookie的值发送给浏览器保存。

Cookie cookie = new Cookie(“JSESSIONID”,sessionID);

response.addCookie(cookie)

3、第二次访问,浏览器会带着JSESSIONID的cookie访问服务器。

4、服务器得到JSESSIONID,在服务器的内存中搜索是否存放着对应编号的Session对象。

5、如果找到对应编号的Session对象,直接返回该对象;如果找不到,创建一个新的Session对象,继续走1的流程。

注意:通过JSESSIONID的cookie值在服务器中找到Session对象。Session对象的数据存放在服务器的内存,ID值存放在浏览器的Cookie中。

1.4 Session的细节:

1、getSession()方法:

getSession():

getSession(Boolean create):

getSession()方法等价于getSession(true)——创建或获取Session对象,如果没有匹配的Session编号,会创建一个新的Session对象。

getSession(false)——得到一个Session对象,如果没有匹配的Session,就返回null。

2、void setMaxInactiveInterval(int interval):

设置Session对象的有效时间,默认情况下,30分钟服务器会自动回收Session,单位是秒(s)。

1.5 Session案例-登录与退出:

1、新建login.html

<body>

    <form action="login.do" method="post">

        账号:<input type="text" name="account" placeholder="请输入账号..." required/><!-- required表示该input不能为空 -->

        <br>

        密码:<input type="password" name="password" placeholder="请输入密码..." required/>

        <br>

        <input type="submit" value="登录"/>

        <input type="reset" value="取消"/>

    </form>

  </body>

2、新建LoginServlet:

public class LoginServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doPost(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       // 获取输入表单内容

       String account = request.getParameter("account").trim();

       String password = request.getParameter("password").trim();

       // 创建或获取Session对象

       HttpSession session = request.getSession();

       // 假设数据中账号为zhao,密码为1234

       if (!"zhao".equals(account)) {   // 账号不存在

           response.sendRedirect("error.html");

       } else {

           if ("1234".equals(password)) {   // 密码正确

              session.setAttribute("account", account);   // 往Session对象中存放数据

              // 当在30分钟之内,使用同一个浏览器再次进入该系统时,可以直接免密码进入

              response.sendRedirect("index.html");

           } else {   // 密码错误

              response.sendRedirect("error.html");

           }

       }

    }

}

3、新建error.html和index.html

error.html

<body>

    This is my HTML page. <br>账号不存在或密码错误,请<a href="login.html">重新登录</a>

  </body>

index.html

<body>

    This is my HTML page. <br>登录成功!

    <br>

    <a href="logout.do">退出</a>   <!-- 跳转到登录页面,底层需要清除Session -->

  </body>

4、新建LogoutServlet:

public class LogoutServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       // 先清除用户相关的Session数据

       // 获取Session

       HttpSession session = request.getSession();

       session.removeAttribute("account");  // 清除

       response.sendRedirect("login.html");   // 页面跳转

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doGet(request, response);

    }

}

Cookie与Session的关系:

二、jsp入门:

2.1 引入:

Servlet:用Java语言开发的动态资源技术。

Html:静态资源技术。

Jsp:Java Server Page,用Java语言(+html)开发的动态资源技术.

Jsp本质上就是Servlet。

2.2 jsp的特点:

Jsp需要交给Tomcat服务器处理。

Jsp页面既可以是html代码,也可以是Java代码,还可以是Java+html代码。

2.3 jsp的执行过程:

http://localhost:8080/Day30_Demo/index.jsp

1、翻译:Tomcat会到发布路径下找index.jsp文件,把它翻译成index_jsp.java文件,放在Tomcat的work目录之下。

2、编译:Tomcat服务器把index_jsp.java文件编译成index_jsp.class文件。

3、创建对象:Tomcat服务器构造一个index_jsp对象。

4、返回:Tomcat服务器调用index_jsp对象的方法,返回内容呈现在浏览器中。

2.4 为什么说jsp本质上是Servlet?

Jsp翻译成java文件:

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase

    implements org.apache.jasper.runtime.JspSourceDependent

HttpJspBase类:

org.apache.jasper.runtime

Class HttpJspBase

java.lang.Object

  extended byjavax.servlet.GenericServlet

      extended byjavax.servlet.http.HttpServlet

          extended byorg.apache.jasper.runtime.HttpJspBase

所以jsp本质上就是Servlet!

Servlet技术可以用在jsp里面。Jsp的技术不一定能用在Servlet里面。

2.5 jsp的生命周期:

Servlet的生命周期:

调用构造方法(第一次访问时执行,只会调用一次)

init()方法(第一次访问时执行,只会调用一次)

service()方法(多次访问多次执行)

destroy()方法(只会执行一次,服务器关闭时执行)

Jsp的生命周期:

翻译:jsp文件->java文件(Servlet)

编译:java文件->class文件(Servlet)

调用构造方法(第一次访问时执行,只会调用一次)

init()方法(第一次访问时执行,只会调用一次)

service()方法(多次访问多次执行)

destroy()方法(只会执行一次,服务器关闭时执行)

三、jsp的语法:

3.1 jsp模板:

Jsp中的html代码。确定了整个页面的框架架构。支持html、css、js、jQuery、UEditor......

3.2 jsp表达式:

语法:<%=变量或表达式   %>

作用:向浏览器输出变量或表达式的计算结果。

注意:

1、本质上会被Tomcat翻译成out.print(“......”),通过该方法向浏览器写出内容。

2、变量或表达式后面不需要带分号。

如:<p>当前的系统时间为:<%=new Date()%></p>

3.3 jsp脚本:

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

语法:<% java代码 %>

作用:执行java代码

原理:把jsp页面中java代码原封不动的拷贝到对应生成的java文件中,再经过编译成class文件。

3.4 jsp的头文件:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

提供页面辅助信息:语言、外部导入库、编码格式等。

3.5 jsp的声明:

<%! Void test(){...} %>

语法:<%! 声明成员变量或成员方法 %>

作用:声明jsp的变量和方法

原理:jsp的变量和方法会翻译成对应的java类的成员变量和成员方法。

<%!

        private Integer num;

        public void test(){

           System.out.println("Husbandello Wifeorld!");

           System.out.println("Husbandello Wifeorld!");

           System.out.println("Husbandello Wifeorld!");

           System.out.println("Husbandello Wifeorld!");

        }

     %>

翻译后:

3.6 jsp注释:

注意:这里强调的jsp注释主要针对jsp中java代码,html代码的注释遵循html的语法。

四、jsp三大指令:

4.1 page指令

作用:告诉Tomcat如何翻译jsp文件。

<%@ page

language=”java”   告诉服务器使用什么语言翻译jsp

import=”java.util.*”   告诉服务器java文件使用哪些包,多个包之间用逗号分隔

pageEncoding=”UTF-8”   告诉服务器使用什么编码格式翻译jsp

contentType=”text/html;charset=UTF-8”   服务器发送到浏览器的数据类型和内容编码

errorPage=”error.jsp”   当服务器运行该jsp时发生错误,就跳转到error.jsp

buffer=”8kB”   服务器发送到浏览器的数据最大值。

session=”true”或”false”   session域对象是否默认开启(默认是true)

isELIgnored=”false”或”true”   是否忽略EL表达式(默认false)

%>

4.2 include指令

语法:<%@include file=”xxxx.jsp”%>

作用:在当前页面中包含另外一个页面。

原理:把被包含的页面的内容翻译到当前这个页面,合并成一个java文件,再编译成class文件。这个包含方式被称为静态包含(源码包含)

补充:如果使用了静态包含,被包含的页面不需要出现全局的html标签(比如html、head、body等)

4.3 taglib指令

Struts2框架

五、jsp的内置对象:

5.1 引入:

在jsp开发时,会频繁使用HttpServletRequest、HttpSession、ServletContext等类的对象,如果每使用一次就创建一次很麻烦。Sun公司在设计jsp时,在页面加载完成,会自动创建这些对象,用户可以直接使用。这些对象就叫做内置对象。

举例:

在HttpServlet当中,需要使用Session:

HttpSession session=request.getSession();   (程序员手动写)

在jsp中使用Session

HttpSession session=request.getSession(true);   (Tomcat做)

session.getId()      (开发者可以直接使用)

5.2 九大内置对象:

内置对象名称

类型

request

HttpServletRequest

response

HttpServletResponse

config

ServletConfig

application

ServletContext

session

HttpSession

exception

Throwable

page

Object(this)

out

JspWriter

pageContext

PageContext

5.3 out对象:

JspWriter类型,相当于带缓存的PrintWriter。向jsp的缓冲区中写出内容。

当满足下面条件之一时,缓冲区的内容写出:

1、缓冲区满了

2、刷新缓冲区(flush()方法)

3、关闭缓冲区(close()方法)

4、执行完毕jsp页面。

5.4 pageContext对象:

类型是PageContext,jsp页面的上下文。

1、可以获取到其他8个内置对象。

2、本身也是一个内置对象,本身也是一个域对象。

保存数据

pageContext.setAttribute(name,value)

5.5 page对象:

类型是Object(this),就是当前这个jsp页面(本质是Servlet类)的引用。

六、jsp的域对象:

四个:

pageContext      page域

request          request域

session          session域

application       context域

作用:保存数据和获取数据(数据共享)

域对象的方法:

setAttribute(name,value)   保存数据

getAttribute(name)   获取数据

removeAttribute(name)   清除数据

域对象的作用范围:

page域:只能在当前jsp页面的范围。

request域:只能作用在同一个请求中使用。(转发)

session域:只能在一次会话中使用。(私有的)

context域:能够在整个web应用中使用(全局的)。

七、jsp应用的小案例:

场景:在Servlet中查询数据库,返回的数据以List类型由服务器传给浏览器,浏览器以表格的形式展示数据。

1、定义入门html:

user.html

<body>

        <p>查看全部<a href="user.do">用户列表</a></p>

  </body>b

2、定义UserServlet和User类:

UserServlet.java

public class UserServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       // 假设从数据库查询到多个用户,组成list集合,返回页面user_list.jsp

       List<User> users = new ArrayList<User>();

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       users.add(new User("李俊杰", "lijunjie", "lijunjie", "lijunjie@163.com",

              "北京"));

       request.setAttribute("users", users);

       // 转发

        request.getServletContext().getRequestDispatcher("/user_list.jsp")

              .forward(request, response);

    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       doGet(request, response);

    }

}

3、新建user_list.jsp:

user_list.jsp

<%@ page language="java" import="java.util.*,com.bw.entity.User" pageEncoding="UTF-8"%>

<%

String path = request.getContextPath();

String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";

%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>

    <base href="<%=basePath%>">

   

    <title>全部用户列表</title>

   

    <meta http-equiv="pragma" content="no-cache">

    <meta http-equiv="cache-control" content="no-cache">

    <meta http-equiv="expires" content="0">   

    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">

    <meta http-equiv="description" content="This is my page">

    <!--

    <link rel="stylesheet" type="text/css" href="styles.css">

    -->

  </head>

  <body>

    <%

         List<User> users = (List<User>)request.getAttribute("users");

         /* for(User user:users){

            System.out.println(user);

         } */

     %>

     <table border="1" cellspacing="0" cellpadding="8" width="500" align="center">

        <tr>

           <th>姓名</th>

           <th>账号</th>

           <th>密码</th>

           <th>邮箱</th>

           <th>籍贯</th>

        </tr>

        <%

           for(User user:users){

         %>

               <tr>

                  <td><%=user.getName() %></td>

                  <td><%=user.getAccont() %></td>

                  <td><%=user.getPassword() %></td>

                  <td><%=user.getEmail() %></td>

                  <td><%=user.getAddress() %></td>

               </tr>

        <%

           }

         %>

     </table>

  </body>

</html>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逼哥很疯狂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值