2021-08-12

今日拓展

  • TCP是底层通讯协议,定义的是数据传输和连接方式的规范

  • HTTP是应用层协议,定义的是传输数据的内容的规范

  • HTTP协议中的数据是利用TCP协议传输的,所以支持HTTP也就一定支持TCP

  • HTTP支持的是www服务
    而TCP/IP是协议
    它是Internet国际互联网络的基础。TCP/IP是网络中使用的基本的通信协议。
    TCP/IP实际上是一组协议,它包括上百个各种功能的协议,如:远程登录、文件传输和电子邮件等,而TCP协议和IP协议是保证数据完整传输的两个基本的重要协议。通常说TCP/IP是Internet协议族,而不单单是TCP和IP。

  • WWW(World Wide Web)服务是一种建立在超文本基础上的浏览、查询因特网信息的方式,它以交互方式查询并且访问存放于远程计算机的信息,为多种因特网浏览与检索访问提供一个单独一致的访问机制。Web 页将文本、超媒体、图形和声音结合在一起。因特网给企业带来通信与获取信息资源的便利条件.

  • WWW服务是目前应用最广的一种基本互联网应用,我们每天上网都要用到这种服务。通过WWW服务,只要用鼠标进行本地操作,就可以到达世界上的任何地方。由于WWW服务使用的是超文本链接(HTML),所以可以很方便的从一个信息页转换到另一个信息页。它不仅能查看文字,还可以欣赏图片、音乐、动画。最流行的WWW服务的程序就是微软的IE浏览器

  • 核心技术包括:超文本传输协议(Hypertext Transfer Protocol,HTTP)与超文本标记语言(Hypertext Markup language,HTML)。其中,HTTP是WWW服务使用的应用层协议,用于实现WWW客户机与WWW服务器之间的通信;HTML语言是WWW服务的信息组织形式,用于定义在WWW服务器中存储的信息格式

JavaWeb

JSP

9大内置对象

  • PageContext 存
  • Requst 存
  • Response
  • Session 存
  • Application 【ServletContext】 存东西的
  • config
  • out
  • page
  • exception

主要了解这四个作用域!!!

  • page(1)->request(2)->session(3)->application(4)
pageContext.setAttribute("name1","小明1号");//保存的数据只在一个页面中有效
    request.setAttribute("name2","小明2号");//保存的数据只在一次请求中有效,请求转发会携带这个数据(如果这个请求没有在被继续转发,或者这个请求崩了,那么这个数据也就没了)
    session.setAttribute("name3","小明3号");//保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","小明4号");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
    
    /*源码
    * public void setAttribute(String name, Object attribute, int scope) {
        switch(scope) {
        case 1: 再第一层page作用域
            this.mPage.put(name, attribute);
            break;
        case 2: 在第二层request作用域
            this.mRequest.put(name, attribute);
            break;
        case 3: 再第三层session作用域
            this.mSession.put(name, attribute);
            break;
        case 4: 再第四层application作用域
            this.mApp.put(name, attribute);
            break;
        default:
            throw new IllegalArgumentException("Bad scope " + scope);
        }
    * */

//跨页面取数据
//从pageContext中取出,我们通过寻找的方式来
    //从底层到高层(作用域)page(1)->request(2)->session(3)->application(4)
    //跨页面取数据,前两个都取不出来
    String name1 = (String) pageContext.getAttribute("name1");//取不出来
    String name2 = (String) pageContext.getAttribute("name2");//取不出来
    String name3 = (String) pageContext.getAttribute("name3");//取得出
    String name4 = (String) pageContext.getAttribute("name4");//取得出
    String name5 = (String) pageContext.getAttribute("name5");//不存在

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

session:客户向服务器发送请求,产生的数据,用户用完一会还有用,比如:购物车;(用户没买就存到数据库中太浪费资源)

application:客户向服务器发送请求,产生的数据,一个用户用完了,其它用户还可以使用,比如:聊天数据,(我不用了,你可能还要用)

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:include--%>

<%--转发到哪个页面--%>
<%--从forward转发的时候可以用标签的形式携带参数--%>
<%--http://localhost:8080/jsptag.jsp?name=小明&age=18--%>
    <%--jsp:forward标签里面不能写注释,写了页面中就会报500--%>
<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="sdf"></jsp:param>
    <jsp:param name="age" value="18"></jsp:param>
</jsp:forward>
JSTL表达式
  • **JSP 标准标签库(JSTL)**是一个JSP标签集合,它封装了JSP应用的通用核心功能。
  • JSTL支持通用的、结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签。 除了这些,它还提供了一个框架来使用集成JSTL的自定义标签

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

核心标签(掌握部分)

引用核心标签库的语法如下:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

使用其中的方法:

在这里插入图片描述

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

c:if

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

c:when

<body>
<%--定义一个var类型的变量score,它的值为80--%>
<c:set var="score" value="80"/>

<c:choose>
<%--它的判断顺序是按照语句从上到下的
假如成绩为100;
    那么如果大于90的这条语句在前就会输出成绩优秀
    如果大于80 的这条语句在前就会输出成绩良好
    它是按照语句的顺序,只要语句在上面,且满足条件,就会输出
--%>
    <c:when test="${score>=90}">
        你的成绩为优秀
    </c:when>
    <c:when test="${score>=80}">
        你的成绩为良好
    </c:when>
    <c:when test="${score>=70}">
        你的成绩为一般
    </c:when>
</c:choose>
</body>

c:forEach

<%
    ArrayList<String> people = new ArrayList<>();
    people.add("张三");
    people.add("李四");
    people.add("王五");
    people.add("赵六");
    people.add("田七");
    //存入值
    session.setAttribute("peopl",people);
%>


<%--用c:foreach取--%>
<%--
var :每次遍历出来的变量
items:要遍历的对象
begin:从哪开始
end: 到哪里
step:步长
--%>
<c:forEach var="people" items="${peopl}">
    <c:out value="${people}" /><br>
</c:forEach>
<hr>
<c:forEach var="people" items="${peopl}" begin="1" end="3" step="2">
    <c:out value="${people}"/> <br>
</c:forEach>

JavaBean

bean:是豆子的意思

通常叫它实体类

JavaBean有特定的写法:

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

一般用来和数据库的字段做映射 ORM;

ORM:对象关系映射

  • 表—>类
  • 字段–>属性
  • 行记录—>对象
<%
//    People people = new People();
//    people.setAddress();
//    people.setAge();
//    people.setName();
//    people.setId();
%>
<jsp:useBean id="people" class="com.feng.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="长沙"/>
<jsp:setProperty name="people" property="age" value="18"/>
<jsp:setProperty name="people" property="name" value="小明"/>
<jsp:setProperty name="people" property="id" value="1"/>

<%--jsp:getProperty --%>
<jsp:getProperty name="people" property="id"/>
<jsp:getProperty name="people" property="name"/>
<jsp:getProperty name="people" property="age"/>
<jsp:getProperty name="people" property="address"/>

MVC三成架构

  • 什么是MVC :Model view Controller 模型、视图、控制器

早些年

在这里插入图片描述

用户直接访问控制层,控制层就可以直接操作数据库:

  • 直接再Servlet中写增删改查去操作数据中的对象
  • 弊端:会把JDBC的代码也写到处理请求中去,程序异常臃肿,不利于维护。
  • 因为:Servlet的代码中本来就要写:处理请求,响应,视图跳转(重定向,转发)、初次之外还要:处理JDBC、处理业务代码、处理逻辑代码

架构:没有什么是加一层解决不了的!如果有就 再加一层。

例如:

程序员调用

|

JDBC //加的一层

|

MysqlOracleSqlServer

MVC三层架构

在这里插入图片描述

View

  • 展示数据
  • 提供连接发起Servlet请求(可以通过:a、form、img…)

Controller (Servlet)

  • 接受用户的请求:(req:请求的参数、Session信息…)
  • 交给业务层处理对应的代码
  • 控制视图的跳转
登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,如:username,password)--->交给业务层处理登录业务(判断密码是否正确:事务)--->Dao层查询用户名和密码是否正确。=--->数据库

Model

  • 业务处理:业务逻辑(Servlet)
  • 数据持久层:CRUD (Dao)

Filter(过滤器)(重点)

  • 用来过滤网站的数据;
    • 处理中文乱码
    • 登录验证…

在这里插入图片描述

Filter开发步骤:

  • 导包

  • 编写过滤器

    1. 导包不要错了:javax.servlet.Filter包

    2. 实现Filter接口,重写方法

//web服务器启动的时候 这个类就初始化了,因为他要随时等待监听
public class CharacterEncodingFilter implements Filter {
    //初始化
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("初始化");
    }

    /*
    * filterChain:链
    1.过滤器中的所有代码,再过滤特定请求的时候都会执行
    2.必须要让过滤器继续通行:filterChain.doFilter(servletRequest,servletResponse);
    *
    * */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");
        servletResponse.setContentType("text/html;charset=utf-8");
        System.out.println("执行前!!");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走转发下去,如果不写,程序到这里就被拦截停了
        System.out.println("执行后!!");

    }

    //销毁:web服务器关闭的时候,过滤器会销毁
    @Override
    public void destroy() {
        System.out.println("销毁");
    }
}

  1. 再web.xml中配置Filter
	<filter>
        <filter-name>characterencodingfilter</filter-name>
        <filter-class>com.feng.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>characterencodingfilter</filter-name>
        <!--只要是/servlet下的然和请求,都会经过这个过滤器-->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

监听器

实现一个监听器的接口:(有N种)

  1. 编写一个监听器

    实现监听器的接口

    package com.feng.listener;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    //统计网站在线人数:统计session个数
    public class OnlineContListtener implements HttpSessionListener {
        //创建session监听
        //一旦创建一个Session就会触发一次这个事件!
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            ServletContext servletContext = se.getSession().getServletContext();
            Integer onlineCont = (Integer) servletContext.getAttribute("onlineCont");
    
            if (servletContext==null){
                onlineCont=new Integer(1);
            }else {
                int count = onlineCont.intValue();
                onlineCont=new Integer(count++);
            }
            servletContext.setAttribute("onlineCont",onlineCont);
    
        }
    
        //销毁session监听
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            ServletContext servletContext = se.getSession().getServletContext();
            Integer onlineCont = (Integer) servletContext.getAttribute("onlineCont");
    
            if (servletContext==null){
                onlineCont=new Integer(0);
            }else {
                int count = onlineCont.intValue();
                onlineCont=new Integer(count--);
            }
            servletContext.setAttribute("onlineCont",onlineCont);
    
        }
    }
    
    
    1. web.xml中注册监听器
     <!--注册一个监听器-->
        <listener>
            <listener-class>com.feng.listener.OnlineContListtener</listener-class>
        </listener>
    

    3.几乎不用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值