JavaWeb-03(Cookie、Session、JSP、JavaBean)

前言

会话

web会话可简单理解为:

用户开一个浏览器,访问某一个web站点,在这个站点点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

有状态会话

当你首次访问一个Web站点,服务端会给客户端一个cookie,即服务端标记你访问过,
当你下一次访问时客户端就会为你携带这个cookie,然后服务端就可以识别出你,这样的过程称为有状态会话

保存会话的两种技术

cookie:客户端技术 (响应,请求)
session:服务器技术,利用这个技术,可以保存用户的会话信息, 我们可以把信息或者数据放在Session中

常见案例:有的网站登录之后,你下次不用再登录了,第二次访问直接为你自动登录了!

一.Cookie

cookie:一般会保存在本地的 用户目录下 appdata;

1.Cookie的用法:

Cookie[] cookies = req.getCookies(); //获得Cookie
cookie.getName(); //获得cookie中的key
cookie.getValue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //新建一个cookie
cookie.setMaxAge(24*60*60); //设置cookie的有效期为一天
cookie.setMaxAge(0);//关闭cookie(不设置有效期或者设置有效期时间为0)
resp.addCookie(cookie); //响应给客户端一个cookie

注意

  • 一个Cookie只能保存一个信息;
  • 一个web站点可以给浏览器发送多个cookie,最多存放20个cookie;
  • Cookie大小有限制4kb;
  • 300个cookie浏览器上限

2.代码演示

用Cookie实现查看上一次访问浏览器的时间

package com.yl.demo;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class demo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        Cookie[] cookies = req.getCookies();
        if (cookies!=null){
            out.write("你上一次访问本站的时间是:");
            for (int i = 0; i <cookies.length ; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("time")){
                    String value = cookie.getValue();
                    long l = Long.parseLong(value);
                    Date date = new Date(l);
                    String string = date.toLocaleString();
                    out.write(string);

                }

            }

        }else{
            out.write("这是你第一次访问本站");
        }
        Cookie cookie = new Cookie("time", System.currentTimeMillis()+"");
        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

3.Cookie中解决乱码的方法

//存入,编码
URLEncoder.encode("张三","utf-8")
//输出,解码
URLDecoder.decode(cookie.getValue(),"UTF-8")

二.Session

服务器会给每一个用户(浏览器)创建一个Seesion对象;
一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;

例如:用户登录之后,整个网站它都可以访问!保存用户的信息;保存购物车的信息……

1.Session代码实现

(1)Session的存储

package com.yl.demo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class demo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
         //给Session中存东西
        session.setAttribute("name","杨");
         //获取Session的ID
        String id = session.getId();
        if (session.isNew()){
            resp.getWriter().write("创建成功,ID为:"+id);

        }else {
            resp.getWriter().write("已经存在,ID为:"+id);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
    }
}

(2)在控制台得到session中的值

package com.yl.demo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class demo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        String name = (String) session.getAttribute("name");
        System.out.println(name);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }
}

(3)手动注销Session

session.invalidate();

(4)会话自动过期:web.xml配置


<session-config>
    
    <session-timeout>15session-timeout>
session-config>

2.Session和cookie的区别:

(1)共同点:

都是用来临时存储来访者信息

(2)不同点:


  • Cookie对象将信息存放在客户端
  • Session对象存放在服务器端;

  • Cookie可以长期保存
  • Session的生存期仅仅到会话结束,若和数据库配合使用,可以使Session数据长期保持

  • 用户可以看到Cookie文件,并能对Cookie文件进行类似修改、删除的操作,因此Cookie数据的安全性很难得到保障
  • Session有较好的安全性

三.JSP(Java Server Pages)

1.概述

JSP全称Java Server Pages,是一种动态网页开发技术。它使用JSP标签在HTML网页中插入Java代码。标签通常以<%开头,以%>结束。

JSP是一种Java servlet,主要用于实现Java web应用程序的用户界面部分。网页开发者们通过结合HTML代码、XHTML代码、XML元素以及嵌入JSP操作和命令来编写JSP。

JSP标签有多种功能,比如访问数据库、记录用户选择信息、访问JavaBeans组件等,还可以在不同的网页中传递控制信息和共享信息。

2.特点:

  • 与纯 Servlet 相比:JSP可以很方便的编写或者修改HTML网页而不用去面对大量的println语句。
  • 与JavaScript相比:虽然JavaScript可以在客户端动态生成HTML,但是很难与服务器交互,因此不能提供复杂的服务,比如访问数据库和图像处理等等。
  • 与静态HTML相比:静态HTML不包含动态信息。
  • 写JSP就像写HML

3.JSP处理过程

(1)浏览器发送一个 HTTP 请求给服务器。
(2)Web 服务器识别出这是一个对 JSP 网页的请求,并且将该请求传递给 JSP 引擎;(通过使用 URL或者 .jsp 文件来完成)
(3)JSP 引擎从磁盘中载入 JSP 文件,然后将它们转化为 Servlet;(这种转化只是简单地将所有模板文本改用 println() 语句,并且将所有的 JSP 元素转化成 Java 代码)
(4)JSP 引擎将 Servlet 编译成可执行类,并且将原始请求传递给 Servlet 引擎。
(5)Web 服务器的某组件将会调用 Servlet 引擎,然后载入并执行 Servlet 类。在执行过程中,Servlet 产生 HTML 格式的输出并将其内嵌于 HTTP response 中上交给 Web 服务器。
(6)Web 服务器以静态 HTML 网页的形式将 HTTP response 返回到您的浏览器中。
(7)Web 浏览器处理 HTTP response 中动态产生的HTML网页,就好像在处理静态网页一样。

总结:JSP 本质上就是一个Servlet

4.源码分析

(1)JSP源码中的一些方法

//初始化
  public void _jspInit() {
      
  }
//销毁
  public void _jspDestroy() {
  }
//JSPService
  public void _jspService(.HttpServletRequest request,HttpServletResponse response)
      

(2)判断请求

public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
        return;
      }
    }

(3)内置一些对象

final javax.servlet.jsp.PageContext pageContext;  //页面上下文
javax.servlet.http.HttpSession session = null;    //session
final javax.servlet.ServletContext application;   //applicationContext
final javax.servlet.ServletConfig config;         //config
javax.servlet.jsp.JspWriter out = null;           //out
final java.lang.Object page = this;               //page:当前
HttpServletRequest request                        //请求
HttpServletResponse response                      //响应

(4) 输出页面前增加的代码

response.setContentType("text/html;charset=UTF-8");   //设置响应的页面类型
   pageContext = _jspxFactory.getPageContext(this, request, response,
   			null, true, 8192, true);
   _jspx_page_context = pageContext;
   application = pageContext.getServletContext();
   config = pageContext.getServletConfig();
   session = pageContext.getSession();
   out = pageContext.getOut();
   _jspx_out = out;

在JSP页面中,只要是 JAVA代码就会原封不动的输出;如果是HTML代码,就会被转换为out.write("< html >\r\n");这样的格式,输出到前端!

5.JSP语法

(1)脚本程序

脚本程序可以包含任意量的Java语句、变量、方法或表达式,只要它们在脚本语言中是有效的。
脚本程序的语法格式:

<% 代码片段 %>

代码演示

<html>
<head><title>Hello Worldtitle>head>
<body>
Hello World!<br/>
<%
out.println("Your IP address is " + request.getRemoteAddr());
%>
body>
html>

(2)中文编码

可以有效解决中文乱码问题

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<body>
<h2>你好h2><br/>
body>
html>

(3)JSP表达式

 <%= 变量或者表达式%>

代码演示:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>

<html>
<body>
<p>
   今天的日期是: <%= (new java.util.Date()).toLocaleString()%>
p>
body> 
html> 

(4)注释

<%-- 注释 --%>| JSP注释,注释内容不会被发送至浏览器甚至不会被编译
< !-- 注释 --> |HTML注释,通过浏览器查看网页源代码时可以看见注释内容

(5)JSP声明

一个声明语句可以声明一个或多个变量、方法,供后面的Java代码使用。
在JSP文件中,您必须先声明这些变量和方法然后才能使用它们。

语法格式:

<%! 声明内容 %>

代码演示:

<%! int i = 0; %> 
<%! int a, b, c; %> 
<%! Circle a = new Circle(2.0); %> 

注意

JSP声明会被编译到JSP生成Java的类中!
其他的则会被生成到_jspService方法中!

(6)JSP指令

<%@page args.... %>
<%@include file=""%>
<%@ taglib ... %>

page显示声明错误页面

<%@page isErrorPage="true" %>

include合并页面

<%–@include会将两个页面合二为一–%>

<html>
<body>
<%@include file="/commen/head.jsp"%>
<h2>Hello World!h2>
<%@include file="/commen/tail.jsp"%>
body>
html>
jSP标签版include合并页面
<html>
<body>
<jsp:include page="/commen/head.jsp"/>
<h2>Hello World!h2>
<jsp:include page="/commen/tail.jsp"/>
body>
html>

定制错误页面

方法1:

<%@page errorPage="error/500.jsp" %> 
<%@page errorPage="error/404.jsp" %> 

方法2:

   
        404
        /error/404.jsp
    
    
        500
        /error/500.jsp
    

6.九大内置对象

对象 作用
PageContext 页面的上下文,也可以用来存东西
Request 获取参数值,也可以用来存东西
Response 用来设置响应头信息、发送状态码、设置响应正文和重定向
Session 服务器保存数据的对象,用来存东西
Application 【SerlvetContext】 提供了项目环境属性的访问方法,也可以用来存东西
config 【SerlvetConfig】 代表当前JSP 配置信息
out out对象是JspWriter类的实例,用来输出东西
page 该对象的实质就是java.lang.Object,在JSP文件内没有实质的应用
exception 是JSP引擎在执行代码过程中抛出的种种异常

(1)几个可以用来存东西的内置对象的比较

request

客户端向服务器发送请求,产生的数据,用户看完就没用了
比如:新闻

session

客户端向服务器发送请求,产生的数据,用户用完一会还有用
比如:购物车;

application

客户端向服务器发送请求,产生的数据,一个用户用完了,其他用户还可能使用,
比如:聊天数据;

比较代码如下:

pageContext.setAttribute("name1","张三"); //保存的数据只在一个页面中有效
String name1 = (String)(pageContext.findAttribute("name1"));//取值
 
request.setAttribute("name2","李四"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
String name2 = (String)(pageContext.findAttribute("name2"));//取值

session.setAttribute("name3","王五"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
String name3 = (String)(pageContext.findAttribute("name3"));//取值

application.setAttribute("name4","赵六");  //保存的数据只在服务器中有效,从打开服务器到关闭服务器
String name4 = (String)(pageContext.findAttribute("name4"));//取值

7.JSP标签、JSTL标签、EL表达式

(1)主要功能

  • 1.获取数据
  • 2.执行运算
  • 3.获取web开发的常用对象
  • 4.调用java方法

(2)表达式

EL表达式:

${ }

EL表达式获取表单中的数据

${param.参数名}

JSP表达式:

JSTL表达式:

(3)JSP标签

转发页面代码演示:


转发时携带参数


   
   

(4)JSTL标签库

JSTL标签库的使用就是为了弥补HTML标签的不足;它自定义许多标签,可以供我们使用,标签的功能和Java代码一样!

使用步骤

  • 1.引入对应的 taglib
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 2.使用其中的方法

注意:在Tomcat 也需要引入 jstl的包,否则会报错:JSTL解析错误

用JSTL标签设置登录页面

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

登录


成绩判断代码

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

成绩判断


请输入你的成绩

优秀 良好 一般 不及格

遍历代码演示

<%@ page import="java.util.ArrayList" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>


    Title


<%
    ArrayList people = new ArrayList<>();
    people.add("1号");
    people.add("2号");
    people.add("3号");
    people.add("4号");
    request.setAttribute("list",people);
%>

    

8.JavaBean

JavaBean 是特殊的 Java 类,使用 Java 语言书写,并且遵守 JavaBean API 规范。
JavaBean一般用来和数据库的字段做映射

JavaBean有特定的写法:

  • 必须要有一个无参构造
  • 属性必须私有化
  • 必须有对应的get/set方法;

ORM :对象关系映射

数据库表与java的对应关系

数据库 java
字段 属性
行记录 对象

数据库中的people表

id name age address
1 陆仁贾 21 西安
2 陆仁倚 22 西安
3 陆仁秉 23 西安

java中对应的类

class People{
    private int id;
    private String name;
    private int id;
    private String address;
}

class A{
    new People(1,"陆仁贾",21"西安");
    new People(2,"陆仁倚",22"西安");
    new People(3,"陆仁秉",23"西安");
}

JSP使用实体类












你可能感兴趣的:(java)