Java教程

javaweb03

本文主要是介绍javaweb03,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

javaweb

7、Cookie、Session

7.1、会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话。

一个网站,怎么证明你来过?

客户端 服务端

​ 1.服务端给客户端一个信件,客户端下次访问服务端带上信件就可以了;cookie

​ 2.服务器登记你来过了,下次你来的时候我来匹配你;session

7.2、保存会话的两种技术

cookie

  • 客户端技术(响应,请求)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息,我们可以把信息或者数据放在session中

7.3、cookie

1.从请求中拿到cookie信息

2.服务器响应给客户端cookie

@WebServlet("/c1")
//保存用户上次访问的时间
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器告诉你,你来的时间,把这个时间封装成一个信件,你下次来我就知道你来了
        //解决中文乱码
        resp.setContentType("text/html");
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();
        //cookie,服务器从客户端获取
        Cookie[] cookies = req.getCookies();//获得cookie
        //判断cookie是否存在
        if(cookies!=null){
            //如果存在怎么办
            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 cookie = new Cookie("LastLoginTime", System.currentTimeMillis()+"");
        //cookie有效时间
        cookie.setMaxAge(24*60*60);

        resp.addCookie(cookie);//响应给客户端一个cookie

    }

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

一个网站cookie是否存在上限

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

删除cookie

  • 不设置有限期,关闭浏览器,自动失效
  • 设置有效期时间为0

7.4、Session

什么是Session:

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

Session和Cookie的区别

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

使用场景

  • 保存一个登录用户的信息;
  • 购物车信息;
  • 在整个网站中会经常使用到的数据,我们将它保存在Session中;

使用Seesion:

@WebServlet("/s1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        //得到Session
        HttpSession session = req.getSession();
        //给Session中存东西
        session.setAttribute("name","张三");
        //获取Session的id
        String id = session.getId();
        //判断Session是否已经存在
        if (session.isNew()){
            resp.getWriter().write("Session创建成功,ID:"+id);
        }else{
            resp.getWriter().write("Session已经存在,ID:"+id);
        }
        //session创建的时候做了什么事情
        //Cookie cookie = new Cookie("JSESSIONID", "sessionId");
        //resp.addCookie(cookie);
    }
@WebServlet("/s2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        //得到Session
        HttpSession session = req.getSession();
        String name = (String) session.getAttribute("name");
        System.out.println(name);
    }


@WebServlet("/s3")
public class SessionDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        //手动注销Session
        session.invalidate();

    }

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

  <!-- 设置Session的默认失效时间-->
  <session-config>
    <!--15分钟后Session自动失效,以分钟为单位-->
    <session-timeout>15</session-timeout>
  </session-config>


8、JSP

8.1、什么是jsp

java Server Pages : java服务器端页面,也和Servlet一样,用于动态web技术

最大的特点:

  • 写JSP就像在写HTML

  • 区别:

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

8.2、JSP原理

思路:jsp到底怎么执行的

  • 代码底层没有任何问题
  • 服务器内部工作
    • tomcat中有一个work目录
    • IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录

发现页面转变成了java程序

image

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

JSP最终也会被转换成为java类

jsp本质上就是一个Servlet

//初始化
  public void _jspInit() {
  }
//销毁
  public void _jspDestroy() {
  }
//jspService
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

1、判断请求

2、内置一些对象

    final javax.servlet.jsp.PageContext pageContext;  //页面上下文
    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				//请求
    http.HttpServletResponse response		//响应

3、输出页面前增加的代码

      response.setContentType("text/html; charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, false, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      out = pageContext.getOut();
      _jspx_out = out;

4、以上这些对象我们可以在JSP中直接使用

image

在jsp页面中:

​ 只要是java代码就会原封不动的输出;

​ 如果是HTML代码,就会被转换成为

out.write("\r\n");

​ 这样的格式输出到前端

8.3、jsp基础语法

任何语言都有自己的语法,java中有。jsp作为java技术的一种应用,它拥有一些自己的扩充语法(了解、知道即可),java所有语法都支持。

jsp表达式

  <%--jsp表达式
  作用:用来将程序的输出,输出到客户端
  <%= 变量或者表达式%>
   --%>
  <%= new java.util.Date() %>

jsp脚本片段

  <%-- jsp脚本片段 --%>
  <%
    int sum = 0;
    for (int i = 1; i <= 100; i++) {
        sum+=i;
    }
    out.println("<h1>sum="+sum+"</h1>");
  %>

脚本片段的再实现

  <%
      int x = 10;
      out.println(x);
  %>
  <p>这是一个jsp文档</p>
  <%
      int y = 20;
      out.println(y);
  %>

  <hr>
  <%--在代码嵌入HTML元素--%>
  <%
    for (int i = 0; i < 5; i++) {
  %>
  <h1>hello,world</h1>
  <%
    }
  %>

jsp声明

  <%!
  static {
    System.out.println("loading servlet");
  }
  private int globalVar = 0;
  public void zhang(){
    System.out.println("进入了方法zhang");
  }
  %>

jsp声明:会被编译到jsp生成的java类中,其他的,就会被生成到jspService方法中

在jsp中嵌入java代码即可

jsp的注释,不会在客户端显示,HTML就会

8.4、jsp指令

<%@include file=""%>
<%--<%@page errorPage="error/500.jsp" %>--%>

<%-- @include会将两个页面合二为一   --%>
<%@include file="commom/header.jsp"%>
<h1>网页主体</h1>
<%@include file="commom/footer.jsp"%>

<hr>
<%--jsp标签
jsp:include:拼接页面,本质还是三个
--%>
<jsp:include page="commom/header.jsp"></jsp:include>
<h1>网页主体</h1>
<jsp:include page="commom/footer.jsp"></jsp:include>

8.5、九大内置对象

  • PageContext 存东西
  • Request 存东西
  • Response
  • Session 存东西
  • Application (ServletContext) 存东西
  • config (ServletConfig)
  • out
  • page
  • exception
<%
    pageContext.setAttribute("name1","张三");     //保存的数据只在一个页面中有效
    request.setAttribute("name2","李四");         //保存的数据在只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3","王五");         //保存的数据在只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","法外狂徒");   //保存的数据在只在服务器中有效,从打开服务器到关闭服务器
%>

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

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

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

8.6、jsp标签、JSTL标签、EL表达式

        <!-- jstl 表达式的依赖 -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2</version>
        </dependency>

        <!-- standard 标签库 -->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表达式:${ }

  • 获取数据
  • 执行运算
  • 获取web开发的常用对象

JSP标签

<jsp:forward page="jsptag01.jsp">
    <jsp:param name="name" value="张三"/>
    <jsp:param name="age" value="18"/>
</jsp:forward>

JSTL标签

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

核心标签(掌握部分)

image

JSTL标签库使用步骤

  • 引入对应的taglib,JSP 标准标签库(JSTL) | 菜鸟教程 (runoob.com)

  • 使用其中的方法

  • 在tomcat也需要引入jstl的包,否则就会报错,JSTL解析错误

<body>
<h3>if测试</h3>
<hr>
<form action="coreif.jsp" method="get">
<%--EL表达式获取表单中的数据
    ¥{param.参数名}
--%>

    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="登录">
</form>

<%--判断如果是admin,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isadmin">
    <c:out value="您好,管理员!"></c:out>
</c:if>
<%--自闭合标签--%>
<c:out value="${isadmin}"></c:out>
</body>
这篇关于javaweb03的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!