学习笔记day03(session jsp javabean)

学习笔记day03

1、Session

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BpGuc48i-1586259937835)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407103852083.png)]

1.1、理解

用户通过浏览器访问web服务器的时候 web服务器会创建一个session

然后将这个session的ID传回给用户

服务器中存储Session中的所有信息,由于要节省服务器资源,所以Session中只存储重要信息

存储之后用户再在网页中的其他页面中浏览时Session中的信息都不会改变

例如:登录账号、购物车、在整个网页中经常存储的信息。。。。

浏览器的session流程

先获取浏览器中的Session

 //取出浏览器中的Session
        HttpSession session = req.getSession();

判断Session是否是最新的

 if (session.isNew()) {
            resp.getWriter().write("创建Session成功,ID" + session.getId());
        } else {
            resp.getWriter().write("服务器中已存在Session,ID" + session.getId());
        }

此时检查网页源码抓包发现session是以cookie的形式发送的

所以等同于

//在浏览器中看到Session被当作Cookie来存储和创建了
//        Cookie cookie = new Cookie("JSSESSIONID","sessionID");
//        resp.addCookie(cookie);

1.2、session的作用域和传输object

  		//取出浏览器中的Session
        HttpSession session = req.getSession();
        //给Session中存储东西
        session.setAttribute("name", new Person("游",1));

Person对象的创建

package com.you.pojo;

public class Person {
    private String name;
    private int age;

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

然后我们再创建一个类去获取刚刚传输进去的Person对象

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        //取出浏览器中的Session
        HttpSession session = req.getSession();
        //获取SessionDemo01中创建的Session
        Person person = (Person) session.getAttribute("name");
        System.out.println("获取到的id是"+person);
    }

这样从控制台输出了person的变量“name+age”

由此说明session是可以用来存储一个共有数据,给任何新的页面都可以读取

用户登录和购物车的实现就是这样的原理

1.3、注销session

手动注销

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        HttpSession session = req.getSession();
        session.removeAttribute("name");
        session.invalidate();//手动注销 session.invalidate
    }

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

 <!--设置Session默认失效时间,单位时分钟-->
    <session-config>
        <session-timeout>1440</session-timeout>
    </session-config>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-znU2Qbno-1586259937838)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407104110318.png)]

2、JSP

2.1、理解

JSP实际上也是一种servlet,如何理解呢?

其实在我们创建web工程并访问一个JSP页面的时候Tomcat自动生成了jsp.java和jsp.class文件在

C:\Users\你的用户名.IntelliJIdea2018.2\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp 之中

打开jsp.java去阅读源码会发现它实际上就是一个Servlet

package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

其中有一个方法将html代码按照sevrlet输出方式输出到浏览器中(就这样实现了HTML代码的书写)

 	  out.write("<html>\n");
      out.write("<body>\n");
      out.write("<h2>Hello World!</h2>\n");
      out.write("</body>\n");
      out.write("</html>\n");

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

JSP其实就是Servlet

详细图解

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UXY1LVxI-1586259937840)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407111336531.png)]

而对于java代码JSP则会原封不动的输出。

2.2、JSP的一些基础语法

<% %><%--脚本片段用于书写java代码--%>
 <%! %>//)<%--JSP声明标签 这之中填写的java代码是直接在最大的java类之中(作用域很广 整个JSP页面都可以获取到声明的对象或者变量--%>
${}<%--用于输出变量或者对象例如:${i}--%>

2.3、JSP的指令

<%@ page args....%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--格式(一般在最开始的时候去声明)--%>
<%@ page/include>  

例子:显示将所有网页中共有的元素

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

另一种写法

<%--<jsp:include page则是拼接页面,本质他们还是三个页面--%>
        <jsp:include page="commen/header.jsp"></jsp:include>
        <h1>网页主体</h1>
        <jsp:include page="commen/footer.jsp"></jsp:include>

下面这种更灵活,可以随意在其他共有部分去做修改而不会影响到主体内容

2.4、9大内置对象

  • PageContext 存东西

  • Request 存东西

  • Respones

  • Session 存东西

  • Application(ServletContext)存东西

  • config(ServletConfig)

  • out

  • page,几乎不用

  • exception、

    作用域从低到高:page->request->session–>application

    例子:

    在一个A.jsp页面设定了几个存储数据的方式并存储了数据

     pageContext.setAttribute("name1","游1");//保存的数据只在一个页面中有效
     request.setAttribute("name2","游2");//保存的数据只在一个请求中有效,请求转发也会携带
     session.setAttribute("name3","游3");          //在一次会话中有效 (从打开浏览器到关闭)
     application.setAttribute("name4","游4");      //在服务器中有效,从打开服务器到关闭服务器
    

    在其他的B.jsp页面中试图打印这些方法的数值时

    游1 2无法打印

    butt why?

    因为pageContext只能在一个页面中有效,request只在一次请求中有效

    而如果此时我在A.JSP中设置一个请求转发

     pageContext.forward("/B.jsp");
    

    这时候就只有游1无法打印了

2.5、JSP标签、JSTL标签、EL表达式

要用jstl需要导入jar包 搜索JSTl maven下载JSTL-api

  <!-- jstl的依赖 -->
        <dependency>
            <groupId>javax.servlet.jsp.jstl</groupId>
            <artifactId>jstl-api</artifactId>
            <version>1.2-rev-1</version>
        </dependency>
        <!--standard标签库-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>

EL表达式${}

  • 可以输出变量或者对象
  • 可以执行运算
  • 获取web开发中的对象

Jsp的一些标签

<%--localhost:8080/jsptag.jsp?name=you&age=23--%>
<%--相当于转发之后携带了参数--%>
<jsp:forward page="jsptag2.jsp">
    <jsp:param name="name" value="you"></jsp:param>
    <jsp:param name="age" value="23"></jsp:param>
</jsp:forward>

JSTL表达式

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

同样在jsp页面中使用JSTL标签库也需要声明并导入

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--引入JSTL核心标签库--%>

此处可能会报错 因为jsp实在web服务器中运行的 但是tomcat服务器没有包含JSTL的jar包 此时需要我们手动导入

核心标签

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fOpElA4T-1586259937841)(C:\Users\you\AppData\Roaming\Typora\typora-user-images\image-20200407153004096.png)]

c:if

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--引入JSTL核心标签库--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>if测试</h4>
<hr>
<form action="coreif.jsp" method="get">
    <%--
    EL表达式获取表单的数据
    ${parm.参数名}
    --%>
    <input type="text"name="username"value="${param.username}">
        <input type="submit"value="登录">
</form>
<%--判断如果提交的用户名是管理员,则登录成功--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
<%--c:if test="中间放判断体" var="中放的是if返回值 ture/fales"--%>
<c:out value="管理员欢迎你"/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>
<c:if test="${param.username=='admin'}" var="isAdmin">
<%--c:if test="中间放判断体" var="中放的是if返回值 ture/fales"--%>

c:when

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定义一个标签叫score 并且给它赋值--%>
<c:set var="score" value="85"></c:set>
<c:choose>
    <c:when test="${score >= 90}">
        你的成绩良好
    </c:when>
    <c:when test="${score >= 80}">
        你的成绩一般 ${score}
    </c:when>
</c:choose>
</body>
</html>
<c:choose>
    <c:when test="${score >= 90}">
        你的成绩良好
    </c:when>
    <c:when test="${score >= 80}">
        你的成绩一般 ${score}
    </c:when>
</c:choose>

类似于switch

c:foreach

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--定义一个字符串数组存储数据--%>
<%
    ArrayList<String> people = new ArrayList<>();
    people.add("张三");
    people.add("李四");
    people.add("王五");
    people.add("赵六");
    //然后存放到request中
    request.setAttribute("list",people);

%>
<%--
var,每一次遍历出来的变量,相当于
    for (String person : people) {
    }
items,要遍历的变量
begin=""从哪里开始遍历 0默认
end=""在哪里结束 last 默认
step="" 遍历步长 1 默认
--%>
<c:forEach var="people" items="${list}">
    <c:out value="${people}"/>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
    <c:out value="${people}"></c:out>
</c:forEach>
</body>
</html>

<c:forEach var="people" items="${list}" begin="1" end="3" step="2">
    <c:out value="${people}"></c:out>
</c:forEach>
<%--
var,每一次遍历出来的变量,相当于
    for (String person : people) {
    }
items,要遍历的变量
begin=""从哪里开始遍历 0默认
end=""在哪里结束 last 默认
step="" 遍历步长 1 默认
--%>

3、JavaBean实体类

JavaBean有特定的写法:

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

一般用来和数据库的字端作映射 ORM;

ORM:对象关系映射

  • 表–>类
  • 字段–>类的属性
  • 行记录–>对象
idnameageaddress
1游13湖北
2游22湖北
3游3100湖北
public class people{
    private int id;
     private String name;
      private int age;
      private String address;
}
class A{
    new people(1,"游1"3,”湖北)
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值