Javaweb学习04 Cookie Session JSP

HttpServletRequest

  • 代表客户端的请求,用户通过Http协议访问服务器 HTTP请求中的所有信息会被封装到HttpServletRequest 通过这个HttpServletRequest的方法,获得客户端的信息
获取前端传递的参数并且请求转发
  • req.getparamter()
  • req.getparamterValues()
<%--
  Created by IntelliJ IDEA.
  User: My
  Date: 2020/9/25
  Time: 17:59
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h1>登录</h1>
<div style="text-align: center">
    <form action="${pageContext.request.contextPath}/login" method="get">
        用户名:<input type="text" name="account" required><br>
        密码:<input type="password" name="password" ><br>
        爱好:
        <input type="checkbox" name="hobbys" value="编程">编程
        <input type="checkbox" name="hobbys" value="音乐">音乐
        <input type="checkbox" name="hobbys" value="美术">美术
        <input type="checkbox" name="hobbys" value="乒乓球">乒乓球
        <br>
        <input type="submit" value="提交" />
    </form>
</div>
</body>
</html>

package com.wu.servlet;

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

public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        String account = req.getParameter("account");
        String password = req.getParameter("password");
        String[] hobbys = req.getParameterValues("hobbys");
        System.out.println("===================");
        System.out.println(account);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("====================");
        // resp.sendRedirect("/Servlet_03_war/success.jsp");
        //servletContext.getRequestDispatcher("/content").forward(req,resp);
        //通过请求转发  这里/  代表当前路径
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
        
         // resp.sendRedirect(req.getContextPath() +"/success.jsp");
       // this.getServletContext().getRequestDispatcher("/success.jsp").forward(req,resp);

        resp.setCharacterEncoding("utf-8");
    }

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

Cookie

  • 会话:用户打开一个浏览器 点击了很多链接 访问多个web资源 关闭浏览器 这个过程称之为会话
  • 有状态会话:曾经来过

保持会话的两种技术

cookie: 客户端技术(响应 请求)

session:服务器技术 利用这个技术 可以保存会话信息. 把信息或者数据放在session中

//1.从请求中拿到cookie信息
//2.服务器响应给客户端cookie

  • cookie:一般保存在本地 用户目录appdata
  • 一个Cookie只能保存一条信息
  • 一个web站点可以给浏览器发送多个cookie, 每个站点最多存放20个cookie
  • cookie大小限制4kb
  • 浏览器cookie上限300个
  • 删除cookie : 将有效期设置为0
  • 乱码问题:URLEncoder.encode() URLDecoder.decode() 谷歌浏览器中要设置resp.setHeader(“Content-Type”,“text/html;charset=utf-8”);
package com.wu.servlet;

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.net.URLEncoder;
import java.util.Date;

public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        req.setCharacterEncoding("utf-8");
//        resp.setCharacterEncoding("utf-8");
        resp.setHeader("Content-type","text/html;charset=UTF-8");
        PrintWriter out = resp.getWriter();

        //服务器从客户端中获取cookie
        Cookie[] cookies = req.getCookies();
        //判断cookie是否存在
        if(cookies != null){
            //如果存在  则取出cookie值
            out.write("你上一次访问的时间是:");
            for (int i = 0; i <cookies.length; i++) {
                Cookie cookie = cookies[i];
                //获取cookie的名字
                if(cookie.getName().equals("lastLoginTime")){
                    //获取cookie的值
                    long lastLoginTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.write("这是你第一次访问本站");
        }
        //服务器给客户端响应一个cookie
        Cookie lastLoginTime = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //cookie有效期 1天
        lastLoginTime.setMaxAge(24*60*60);
        resp.addCookie(lastLoginTime);

    }

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

Session(重点)

  • 服务器会给每一个用户(浏览器)创建一个Session对象
  • 一个Session独占一个浏览器 只要浏览器没有关闭 这个Seesion就存在
  • 用户登录后 整个网站它都可以访问->保存用户的信息 保存购物车信息
//设置Session
package com.wu.servlet;

import com.wu.proj.Person;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class SessionServlet  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        //获得Session
        HttpSession session = req.getSession();
        //Session中存东西
        session.setAttribute("name",new Person("张三",29));
        //获得Session给客户端分配的ID
        String SessionId = session.getId();
        //判断Session是否新创建
        if(session.isNew()){
            resp.getWriter().write("Session已经创建,ID为" + SessionId);
        }else {
            resp.getWriter().write("Session新创建ID为" + SessionId);
        }

        //Session创建时候所做的事情
//        Cookie cookie = new Cookie("JSESSIONID", SessionId);
//        resp.addCookie(cookie);

    }

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

package com.wu.servlet;

//Session可以传递对象  自创建一个Person类
import com.wu.proj.Person;

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 SessionDeamon extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        HttpSession session = req.getSession();
//        String name = (String) session.getAttribute("name");
        Person name = (Person) session.getAttribute("name");
        resp.getWriter().write(name.getName() + name.getAge());

    }

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

//注销Session(手动)
package com.wu.servlet;

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 SessionDeamon2  extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        session.invalidate();
    }

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

//web.xml配置session失效(自动)
<session-config>
        <!--1分钟后Session失效-->
        <session-timeout>1</session-timeout>
    </session-config>

Cookie与Session区别

  • Cookie是把用户的数据写给用户的浏览器 浏览器保存(可以多个)
  • Session把用户的数据写到用户独占Session中, 用ID区分不同用户 用户数据在服务器端保存(保存重要信息 减少服务器资源浪费)
  • Session对象由服务器创建

JSP

  • java server page(java服务器端页面)和Servlet一样 用于开发动态web
  • 最大特点

写JSP就像在写HTML

区别:

  • HTML只给用户提供静态数据
  • JSP页面中可以潜入JAVA代码 为用户提供动态数据
  • JSP原理

服务器内部工作

tomcat中work目录

idea中目录

C:\Users\My\AppData\Local\JetBrains\IntelliJIdea2020.1\tomcat\Unnamed_javaweb-02-servlset\work\Catalina\localhost\requestt_war\org\apache\jsp

浏览器向服务器发送请求 不管访问什么资源 其实都是在访问Servlet

JSP 最终也会被转换为一个JAVA类

JSP(extends HttpJspBase extends HttpServlet)本质上就是Servlet

//jsp初始化 
public void _jspInit() {
}
//jsp销毁
public void _jspDestroy() {
}
//jsp service
public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)

判断请求

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;
 }
}

内置一些对象

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  当前

输出页面前的代码

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页面中直接使用

JSP基本语法

//2个依赖包
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>


<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

<%= java语句(变量或者表达式)%>

<%=
 new java.util.Date()
%>

<% jsp脚本片段 %>

<%
 int sum=0;
 for (int i = 0; i <= 100; i++) {
     sum += i;
 }
 out.println("<h1>Sum:" +sum + "</h1>" );
%>

JSP声明<%! %>

<%!
 static {
 System.out.println("Loading Service!");
}
private  int globalvar=1;
public void fun(){
 System.out.println("globalvar=" + globalvar);
}
%>

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

JSP指令<%@ page %>

<%@ page import="java.util.Date" %>
<%@ page errorPage="error/error.jsp" %>

<%@ include file="error/error.jsp"%>
<jsp:include page="error/error.jsp" />

JSP 九大内置对象
  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application [ServletContext] 存东西
  • config [ServerletConfig]
  • out
  • page
  • exception
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值