• javaweb笔记


    JavaWeb

    java web

    1、基本概念

    1.1、前言

    web开发:

    • web,网页的意思,www.baidu.com
    • 静态web
      • HTML,css
      • 提供给所有人看的页面始终都不会发生变化
    • 动态web
      • 淘宝,几乎所有的网站;
      • 提供给所有人看到的数据始终都会发生变化,每个人在不同的时间,不同的地点看到的信息各不相同
      • 技术栈:Servlet/JSP,ASP.php
    • 在java中,动态web资源开发的技术统称为javaweb

    1.2、web应用程序

    web应用程序:可以提供浏览器访问的程序。

    • a.html,b.html。这些web资源都可以被外部访问,对外界提供服务
    • 你们能访问的任何一个页面或者资源,都存在于这个世界的某一个角落的计算机上。
    • URL
    • 这个 统一的web资源会被放在同一个文件夹下,web应用程序-->Tomcat:服务器
    • 一个微博应用有多部分组成(静态web,动态web)
      • HTML,css,js
      • jsp,Servlet
      • java程序
      • jar包
      • 配置文件(properties)
    • web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一管理;

    1.3、静态web

    • ​ *.html, *.htm这些都是网页的后缀,如果服务器上一直存这些东西,我们就可以直接进行读取。
    • 静态web存在的缺点
      • web页面无法动态更新,所有用户看到的都是同一个页面
      • 轮播图,点击特效:伪动态
      • JavaScript[实际开发中用的最多]
      • VBScript
      • 它无法和数据库进行交互(数据无法持久化,用户无法交互)

    1.4动态web

    • 页面动态展示:"web页面的展示的效果因人而异"
    • 缺点
      • 加入服务器的动态web资源出现了 错误,我们需要重新编写我们的后台程序,重新发布;
      • 停机维护
    • 优点
      • web页面可以动态更新,所有用户看到的都不是同一个页面
      • 它可以和数据库交互(数据持久化,注册,商品信息)

    2、web服务器

    2.1、技术讲解

    ASP

    • 微软:国内最早流行的就是ASP;
    • 在HTML里面嵌入VB的脚本,ASP+COM;
    • 在ASP开发中,基本上每一个页面都有几千行的业务代码,页面及其混乱
    • 维护成本高

    PHP

    • PHP开发速度很快,功能很强大,跨平台,代码很简单
    • 无法承载大访问量的情况(局限性)

    JSP/Servlet

    B/S浏览器和服务器

    C/S客户端和服务器

    • sun公司主推的B/S架构
    • 基于java语言的(所有的大公司,或者一些开源的组件,都是java写的)
    • 可以承载三高问题带来的影响;
    • 语法像ASP,ASP--->JSP加强市场强度;

    2.2web服务器

    服务器是一种被动的操作,用来处理用户一些请求,和用户一些响应的信息

    IIS

    微软的 ASP……Windows自带的

    3、Tomcat

    免费,轻量级。

    3.1、下载Tomcat:

    1. 安装or解压
    2. 了解配置文件及目录结构
    3. 这个东西的作用

    3.2、Tomcat启动与配置

    文件夹作用

    1. bin 启动关闭的脚本文件
    2. conf 配置
    3. lib 依赖的jar
    4. logs 存放日志
    5. webapps 存放网站的

    启动关闭Tomcat

    1. startup.sh
    2. 访问测试网站:localhost:8080/

    可能遇到的问题

    1. java环境变量没有配置
    2. 闪退问题,需要配置兼容性
    3. 乱码问题,配置文件中设置

    3.3、配置

    server.xml可以配置启动的端口号

    • Tomcat的默认端口号:8080
    • mysql:3306
    • http:80
    • HTTPS:443
    <Connector port="8080" protocol="HTTP/1.1"
    			connectionTimeout="20000"
    			redirecPort="8443">
    

    可以配置主机名称

    • 默认主机名为:localhost8080---->127.0.0.1
    • 默认网站应用存放的位置为:webapps
    <Host name="localhost" appBase="webapps"
        	unpackWARs="true" autoDeploy="true">
    

    3.4、发布网站

    • 将自己写的网站,放到服务器中指定web应用的文件夹下就可以了。
    • 网站应该有的结构
    --webapps:Tomcat服务器的目录
        --Root
        --kuangstudy:网站的目录名
        	-WEB-INF
        		-class: java程序
        		-lib:    web应用所依赖的jar包
                -web.xml 网站配置文件
            - index.html 默认的首页
            - static
                    -css
                    	-style.css
                    -js
                    -img
                    -……
    

    4、HTTP

    4.1、什么是HTTP

    HTTP(超文本传输协议)是一个简单请求。它通常运行在TCP之上

    • 文本:HTML,字符串,
    • 超文本:图片,音乐,视频,定位,地图
    • 80

    HTTPS:安全的

    • 443

    4.2、两个时代

    • HTTP1.0
      • HTTP/1.0:客户端可以与web服务器连接后,只获得一个web资源,断开连接
    • HTTP2.0
      • HTTP/1.0:客户端可以与web服务器连接后,可以获得多个连接

    4.3、http请求

    • 客户端---发请求---服务器

    百度:

    Request URL: https://www.baidu.com/   请求地址
    Request Method: GET       get/post方法
    Status Code: 200 OK         状态码
    Remote Address: 112.80.248.76:443  远程
    
    Accept: text/html
    Accept-Encoding: gzip, deflate, br
    Accept-Language: zh-CN,zh;q=0.9  语言
    Cache-Control: max-age=0
    Connection: keep-alive
    

    1、请求行

    • 请求行中的方式:GET
    • 请求方式:GetPost,HEAD,delete,put,tract……
      • get:请求能够携带的参数比较少,大小有限制,会在浏览器中的URL地址栏中显示数据内容,不安全,但是高效。
      • post:请求能够携带的参数没有限制,大小没有限制,会在浏览器中的URL地址栏中显示数据内容,安全,但是不高效。

    2、消息头

    Accept:  告诉浏览器,它所支持的数据类型
    Accept-Encoding: 支持哪种编码
    Accept-Language: 告诉浏览器,它的语言环境
    Cache-Control:缓存控制
    Connection:告诉浏览器请求完成是断开还是保持连接
    HOST:主机
    

    4.4、http响应

    • 服务器--响应--客户端
    Cache-Control: private    缓存控制    
    Connection: keep-alive    连接:
    Content-Encoding: gzip    编码 
    Content-Type: text/html   类型
    

    1、响应体

    Accept:  告诉浏览器,它所支持的数据类型
    Accept-Encoding: 支持哪种编码
    Accept-Language: 告诉浏览器,它的语言环境
    Cache-Control:缓存控制
    Connection:告诉浏览器请求完成是断开还是保持连接
    HOST:主机
    Refrush:告诉客户端多久刷新一次
    Location:让网页重定位
    

    2、响应状态码

    200:请求成功

    3XX:请求重定向

    • ​ 重定向:你给我到给你的新位置去

    4XX 找不到资源 404

    • ​ 资源不存在

    5XX :服务器代码错误 500 502网关错误

    常见面试题:

    当你的浏览器地址栏中输入地址并回车的一瞬间到页面展示回来,经历了什么?

    5、Maven

    我为什么要学习这个技术?

    1. 在Javaweb开发中,需要使用大量的jar包,我们手动去导入
    2. 如何能够让一个东西自动帮我导入和配置这个jar包,由此maven诞生了。

    5.1、maven项目架构管理工具

    我们目前用来就是方便导入jar包的!

    maven的核心思想:约定大于配置

    • 有约束,不要去违反
    • maven会规定好你该如何去编写我们的java代码,必须按照这个规范来。

    5.2、下载安装maven

    • 下载完成后解压即可

    5.3、配置环境变量

    在我们的系统环境变量中配置如下配置

    • M2_HOME maven 目录下的bin目录
    • MAVEN_HOME maven的目录
    • 在系统的path中配置 %MAVEN_HOME%in

    测试Maven是否安装成功,保证配置完毕。

    5.4、阿里云镜像

    • 镜像:mirrors
      • 作用:加速我们的下载
    • 国内建议使用阿里云的镜像
        <mirror>
            <id>nexus-aliyun</id>
            <mirrorOf>central</mirrorOf>
            <name>Nexus aliyun</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public</url>
        </mirror>
    

    5.5、本地仓库

    在本地的仓库,本地仓库

    建立一个本地仓库:localRepository

    <localRepository>D: epository<localRepository>

    5.6、在idea中使用maven

    1. 启动idea
    2. 创建一个Maven项目
    3. 等待项目初始化
    4. 观察maven仓库中多了什么东西
    5. IDEA中的Maven配置
    6. 到这里就OK了

    5.7、在idea中配置Tomcat

    5.8、pom文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    <!--刚刚配置的GAV-->
      <groupId>com.kuang</groupId>
      <artifactId>javaweb-01-maven</artifactId>
      <version>1.0-SNAPSHOT</version>
    <!-- Package:项目的打包方式
        jar:项目的打包方式
         war:Javaweb 的打包方式
     -->
    <!-- 项目的打包方式-->
      <packaging>war</packaging>
      <name>javaweb-01-maven Maven Webapp</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    <!--配置-->
      <properties>
    <!--项目的默认构建编码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <!--    编码版本-->
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    <!--项目依赖-->
      <dependencies>
    <!--   具体依赖jar包配置文件-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <finalName>javaweb-01-maven</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.2.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    
    
    • Maven的高级之处在于会帮你导入这个jar包所依赖的其他jar包

    • Maven由于他的约定大于配置,我们之后可能会遇到我们写的配置文件,无法被导出或者生效的问题,解决方案:

      <!--在build中配置resource,来防止我们资源导出失败的问题-->
      <build>
          <resources>
              <resource>
                  <directory>src/main/resources</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>true</filtering>
              </resource>
              <resource>
                  <directory>src/main/java</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>true</filtering>
              </resource>
          </resources>
      </build>
      
      

    6 、Servlet

    6.1、Servlet简介

    • Servlet就是sun公司开发动态web的技术
    • sun这些api提供一个接口叫做:Servlet,如果你想开发一个Servlet,只需要完成两个小步骤:
      • 编写一个类,实现Servlet接口
      • 把开发好的java类部署到web服务器中

    把实现了Servlet接口的java程序叫做,Servlet

    6.2、HelloServlet

    ​ Servlet接口有两个默认实现类:HTTPServlet

    1. 创建一个maven项目,删除里面的src目录,以后学习就在这项目里面建立Module这个空的工程就是maven主工程。
    2. 关于maven父子工程的理解
    <module>
    		<module>servlet-01<module>
    </module>  
    
    
    子项目会有
    
        <parent>
            <artifactId>javaweb-02-servlet</artifactId>
            <groupId>com.kaung</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
    
    父项目中的java子项目可以直接使用
    
    son extends father
    
    
    1. Maven环境优化

      1. 修改web.xml为最新的
      <?xml version="1.0" encoding="UTF-8"?>
      <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
               version="4.0">
      </web-app>
      
      
      1. 将Maven的结构搭建完整
    2. 编写一个Servlet程序

      1. 编写一个普通类
      2. 实现Servlet接口,这里我们直接继承HTTPServlet
    public class HelloServlet extends HttpServlet {
        //get或者post只是实现的不同方式,可以互相调用,业务逻辑都一样
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            PrintWriter writer=resp.getWriter();//响应流
            writer.println("Hello,Servlet");
            
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    
    1. 编写Servlet的映射
      • 为什么需要映射:我们写的是java程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务器中,注册我们写的Servlet,还需给他一个浏览器能够访问的路径。
    <!--注册Servlet-->
      <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.kaung.servlet.HelloServlet</servlet-class>
      </servlet>
    <!-- Servlet的请求路径-->
        <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    
    
    1. 配置Tomcat
      1. 配置项没有发布路径。
    2. 启动测试 OK!

    6.3、Servlet原理

    6.4、Mapping问题

    1. 一个Servlet可以指定一个映射路径
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
    
    
    1. 一个Servlet可以指定多个映射路径
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello3</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello4</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello5</url-pattern>
      </servlet-mapping>
    
    1. 一个Servlet可以指定通用路径
        <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello/*</url-pattern>
        </servlet-mapping>
    
    1. 指定一些前缀或者是后缀
        <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>*.qinjiang</url-pattern><!--注意 * 前面不能加项目的映射路径-->
        </servlet-mapping>
    
    1. 默认请求路径
        <!--默认请求路径-->
        <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/*</url-pattern>
        </servlet-mapping>
    
    1. 优先级问题

      指定了固定的映射路径优先级最高,如果找不到就会走默认的处理请求;

     <servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.kaung.servlet.ErrorServlet</servlet-class>
      </servlet>
    
      <servlet-mapping>
        <servlet-name>error</servlet-name>
        <url-pattern>/*</url-pattern>
      </servlet-mapping>
    

    6.5、ServletContext

    web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext,它代表了当前的web应用:

    1. 共享数据
    • 我在这个Servlet中保存的数据,可以在另外一个Servlet中拿到。
    public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //this.getInitParameter();  初始化参数
            //this.getServletConfig();  Servlet配置
            //this.getServletContext();
            ServletContext context=this.getServletContext();
            String username="王峰";//数据
            context.setAttribute("username",username);//讲一个数据保存在ServletContext中,名字为username。值为username
        }
    }
    
    
    public class GetServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
          ServletContext context = this.getServletContext();
          String username= (String) context.getAttribute("username");
          resp.setContentType("text/html");
          resp.setCharacterEncoding("utf-8");
          resp.getWriter().println("名字"+username);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
        <servlet>
            <servlet-name>getc</servlet-name>
            <servlet-class>com.kuang.servlet.GetServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>getc</servlet-name>
            <url-pattern>/getc</url-pattern>
        </servlet-mapping>
    
    

    测试访问结果:OK!

    2、获取初始化参数
    <!--配置一些微博应用初始化参数-->
        <context-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql//localhost:3306/mybatis</param-value>
        </context-param>
        
    
    
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context= this.getServletContext();
            String url = context.getInitParameter("url");
            resp.getWriter().println(url);
        }
    
    
    
    3、请求转发
    4、读取资源文件

    properties

    • ​ 在java目录下新建properties
    • 在resource目录下新建properties

    发现:都被打包到同一目录下:classpath,我们俗称路径为classpath

    思路:需要一个文件流

    访问测试即可;

    6.6、HttpServletResponse

    ​ web服务器接收到客户端的HTTP请求,针对这个请求,分别创建一个代表请求的HttpServletRequest对象,代表响应一个HttpServletResponse

    • 如果要获取客户端请求过来的参数:找httpServletRequest
    • 如果要给客户端响应一些信息:找HttpServletResponse
    1. 简单分类

    负责向浏览器发送数据的方法

    负责向浏览器发送响应头的方法

    响应的状态码

    2. 常见应用
    1. 向浏览器输出消息
    2. 下载文件
      1. 要获取下载的路径
      2. 下载的文件名是啥
      3. 设置项办法让浏览器能支持下载我们需要的东西
      4. 获取下载文件的输入流
      5. 创建缓冲区
      6. 获取outputStream对象
      7. 将FileOutputStream流写到buffer缓冲区
      8. 使用OutputStream将缓冲区中的数据输出到客户端
    3. 验证码功能

      验证码怎么来的?

      • 前端实现
      • 后端实现,需要用到java的图片类,生产一个图片
    4. 实现重定向

      ​ B一个web资源收到客户端请求后,B他会通知客户端A去访问另外一个web资源C,这个过程叫做重定向。

      常见场景:

      • 用户登录

      面试题:请你聊聊转发重定向的区别

      • 请求转发的时候URL地址栏不会发生变化
      • 重定向的时候URL地址栏会发生变化

    6.7、HttpServletRequest

    HttPServletRequest代表客户端的请求,用户通过Http协议访问服务器,Http请求中的所有信息会被封装到HttpServletRequest,通过这个HttpServletRequest的方法,获得客户端的所有信息。

    • 获取前端传递的参数以及请求转发。
    public class LoginServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
            String username = req.getParameter("username");
            String password = req.getParameter("password");
            String[] hobbies = req.getParameterValues("hobby");
            System.out.println("++++++++++++++++++++++++");
            System.out.println(username);
            System.out.println(password);
            System.out.println(Arrays.toString(hobbies));
            //通过请求转发
            // 这里的   /  代表当前应用
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
    
        }
    
    

    7、Cookie,Session

    7.1、会话

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

    有状态会话:一个同学来教室,下次在来教室,我们会知道这个同学曾经来过,称之为有状态会话。

    ​ 你怎么证明你是西开的学生

    ​ 你 西开

    1. 发票 西开给你发票
    2. 学校登记 西开标记你来过了

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

    客户端 服务端

    1. 服务端给客户端一个信件 客户端下次访问服务器端带上信件就可以了;cookie
    2. 服务器登记你来过了,下次你的时候我来匹配你;session

    7.2、保存会话的两个技术

    cookie

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

    session

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

    常见案例:网站登录之后,你下次登录就不用在登录了,第二次访问直接就上去了。

    7.3、Cookie

    1. 从请求中拿到cookie
    2. 服务器响应给客户端cookie
     Cookie[] cookies= req.getCookies();//返回数组,说明cookie可能有多个
     cookie.getName();
     cookie.getValue();
     new Cookie("lastLoginTime", System.currentTimeMillis()+"");//新建一个cookie
     cookie.setMaxAge(24*60*60);//设置cookie的有效期
     resp.addCookie(cookie);//响应给客户端一个cookie
    
    

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

    • 一个网站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中

    使用session

    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目录
    • 浏览器向服务器发送请求,不管访问什么资源,其实都在访问Servlet!
    • JSP也会转换成一个java类
    • JSP本质上就是一个Servlet
    1. 判断请求
    2. 内置对象
    3. 输出页面前增加的代码
    4. 以上的对象这些对象可以在我们JSP页面中直接使用!

    在JSP页面中:

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

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

    out.write("name");
    
    

    这样的格式输出到前端!

    8.3、JSP基础语法

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

    JSP表达式
    <%-- JSP表达式 
    作用:用来将程序的输出,输出到客户端
    <%= 变量或者表达式%>
    --%>
      <%= new java.util.Date()%>
    
    
    jsp脚本片段
    <%--jsp脚本片段--%>
    <%
      int sum=0;
      for (int i = 0; i <=100 ; i++) {
        sum+=i;
      }
      out.println("<h1>Sum="+sum+"<h1>");
    %>
    
    
    脚本片段的在实现
    <%--jsp脚本片段--%>
    <%
      int sum=0;
      for (int i = 0; i <=100 ; i++) {
        sum+=i;
      }
      out.println("<h1>Sum="+sum+"<h1>");
    %>
      <% int x=10;
      out.println(x);
      %>
      <P>这是一个JSP文档</P>
      <%
        int y=2;
        out.println(y);
      %>
      <hr>
    
      <%
        for (int i = 0; i <5 ; i++) {
      %>
      <h1>Hello,World <%=i%> <h1>
    
      <%
        }
      %>
    
    
    
    
    jsp声明
    <%!
          static {
            System.out.println("Loading Servlet!");
          }
          private int globaVar=0;
          public void kaung(){
            System.out.println("进入了方法kaung!");
          }
          %>
    
    

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

    在jsp中嵌入java代码即可!

    <%%>
    <%=%>
    <%!%>
    <!--注释-->
    
    

    JSP的注释,不会再客户端显示,HTML的注释会显示

    8.4、JSP指令

    <body>
    <%--@include会将两个页面合二为一--%>
        <%@include file="common/header.jsp"%>
        <h1>网页主体</h1>
        <%@include file="common/footer.jsp"%>
    <%--jsp标签--%>
        <hr>
    <%--jsp:include 本质还是3个页面   拼接页面--%>
    <jsp:include page="common/header.jsp"/>
    <h1>网页主体</h1>
    <jsp:include page="common/footer.jsp"/>
    </body>
    
    

    8.5、9大内置对象

    • PageContext 存东西
    • Request 存东西
    • Response
    • Session 存东西
    • Application 【Servlet Context】存东西
    • config 【ServletConfig】
    • page 不用了解
    • out
    • exception
    <%
        pageContext.setAttribute("name1","wangfeng1号");//保存的数据在一个页面有效
        request.setAttribute("name2","wangfeng2号");//保存的数据在一次请求中有效,请求转发会携带这个数据
        session.setAttribute("name3","wangfeng3号");//保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
        application.setAttribute("name4","wangfeng4号");//保存的数据在服务器中有效,从打开浏览器到关闭服务器
    %>
    

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

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

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

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

    		<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>
    
    • EL表达式:${}

      • 获取数据
      • 执行运算
      • 获取web开发常见应用

      JSP标签

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

    核心标签

    1597633787268

    JSTL标签库使用步骤

    • 引入对应的taglib

    • 使用其中的方法

    • 在Tomcat中也需要jstl包,否则会报错。jstl解析错误

      <h4>if测试</h4>
        <form action="coreif.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}"></c:out>
    
    
    <c:set var="score" value="78"/>
        <c:choose>
            <c:when test="${score>=90}">
                你的成绩为优秀
            </c:when>
            <c:when test="${score>=80}">
                你的成绩为一般
            </c:when>
            <c:when test="${score>=70}">
                你的成绩为良好
            </c:when>
            <c:when test="${score>=60}">
                你的成绩为及格
            </c:when>
        </c:choose>
    
    
    <%--
        var 每次遍历出来的变量
        items 要遍历的对象
        begin 从哪里开始
        end 到哪里结束
        step 步长
    --%>
    <c:forEach var="people" items="${list}" begin="1" end="3" step="2">
        <c:out value="${people}"></c:out>
    </c:forEach>
    
    
    

    格式化标签

    SQL标签

    9、JavaBean

    实体类

    Javabean有特定的写法

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

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

    ORM对象关系映射

    • 表--------->类
    • 字段------>属性
    • 行记录---->对象
    id name age address
    1 王峰1号 3 西安
    2 王峰2号 18 西安
    3 王峰3号 100 西安
    class people{
        private int id;
        private String name;
        private int age;
        private String address;
    }
    class A{
        new People("1","王峰1号","3");
        new People("2","王峰2号","18");
        new People("3","王峰3号","100");
    }
    
    • 过滤器
    • 文件上传
    • 邮件发送
    • JDBC复习:如何使用JDBC,JDBCcrud JDBC事务

    10、三层架构

    10.1、什么是mvc:model view Controller 模型 视图 控制器。

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

    Servlet---CRUD--数据库
    弊端:程序臃肿,不利于维护 
    Servlet 的代码中:处理请求、响应、视图跳转、处理JDBC、处理业务代码、处理逻辑代码
    架构:没有什么是加一层解决不了的!
    

    10.2、三层架构

    model

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

    view

    • 展示数据
    • 提供链接发起的Servlet请求
    • 接受用户的请求
    • 交给业务层处理对应的代码
    • 控制视图的跳转
    登录--->接受用户的登录请求--->处理用户的请求(获取用户的登录参数)--->交给业务层处理登录业务--->Dao层查询用户名和密码是否正确
    

    11、Fliter(重点)

    fliter:过滤器,用来过滤网站的数据

    • 处理中文乱码
    • 登录验证

    fliter开发步骤

    1. 导包

    2. 编写过滤器

      1. public class CharacterEncodingFilter implements Filter {
        
            //初始化 web服务器启动,就已经开始初始化了。随时等待过滤对象出现
            public void init(FilterConfig filterConfig) throws ServletException {
                System.out.println("已经初始化");
            }
            //Chain链
        
            /*
             *1、过滤中的所有代码,在过滤特定请求都会执行
             *2、必须要让过滤器继续通行
             */
            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("CharacterEncodingFilter执行前");
                    filterChain.doFilter(servletRequest, servletResponse);//让我们的请求继续走,如果不写,程序到这里就停止了
                    System.out.println("CharacterEncodingFilter执行后");
            }
            //销毁;web服务器关闭的时候,过滤器会销毁
            public void destroy() {
                System.out.println("CharacterEncodingFilter已经销毁");
            }
        }
        

        3.在web.xml中配置filter

        <filter>
                <filter-name>CharacterEncodingFilter</filter-name>
                <filter-class>com.kaung.fliter.CharacterEncodingFilter</filter-class>
            </filter>
            <filter-mapping>
                <filter-name>CharacterEncodingFilter</filter-name>
                    <!--只要是Servlet的任何请求都会经过这个过滤器-->
                <url-pattern>/servlet/*</url-pattern>
            </filter-mapping>
        

    12、监听器

    实现一个监听器接口;(有很多种方法)

    1、编写一个监听器

    • 实现监听器的接口
    public class OnlineCountListener implements HttpSessionListener {
        //创建session的监听 :看你的一举一动
        //一旦创建一个session就会触发一次这个事件
        public void sessionCreated(HttpSessionEvent httpSessionEvent) {
            ServletContext context = httpSessionEvent.getSession().getServletContext();
            Integer onlineCount = (Integer) context.getAttribute("OnlineCount");
            if (onlineCount==null){
                onlineCount= new Integer(1);
            }else {
                int count=onlineCount.intValue();
                count=new Integer(count+1);
            }
            context.setAttribute("onlineCount",onlineCount);
        }
        //销毁session的监听
        public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
            ServletContext context = httpSessionEvent.getSession().getServletContext();
            Integer onlineCount = (Integer) context.getAttribute("OnlineCount");
            if (onlineCount==null){
                onlineCount= new Integer(0);
            }else {
                int count=onlineCount.intValue();
                count=new Integer(count-1);
            }
            context.setAttribute("onlineCount",onlineCount);
        }
        //手动销毁
    }
    

    2、web.xml配置监听器

    <listener>
            <listener-class>com.kaung.listener.OnlineCountListener</listener-class>
     </listener>
    

    3、看情况是否使用

    13、过滤器,监听器常见应用

    用户登录之后才能进入首页!用户注销后就不能登录首页

    • 用户登录之后,向session中存放用户的数据
    • 进入主页的时候要判断用户是否已经登录,在过滤器中实现
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
    
        if (request.getSession().getAttribute(Contanst.USER_SESSION)==null){
            response.sendRedirect("/error.jsp");
        }
            filterChain.doFilter(servletRequest, servletResponse);//让程序继续往下走
        }
    

    14、JDBC

    需要jar包的支持

    • java.sql
    • javax.sql
    • mysql-connerter-java 连接驱动
     <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.6</version>
            </dependency>
    

    实验环境搭建

    public class TestJdbc {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //配置信息
            String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF8";
            String username="root";
            String password="root";
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库
            Connection connection = DriverManager.getConnection(url, username, password);
            //向数据库发送SQL对象的statement :CRUD
            Statement statement=connection.createStatement();
    
            //编写SQl语句
            String sql="select * from users";
            //执行SQL ,返回一个结果集
            ResultSet resultSet = statement.executeQuery(sql);
            while (resultSet.next()){
                System.out.println("id="+resultSet.getObject("id"));
                System.out.println("name="+resultSet.getObject("name"));
                System.out.println("password="+resultSet.getObject("password"));
                System.out.println("email="+resultSet.getObject("email"));
                System.out.println("birthday="+resultSet.getObject("birthday"));
            }
            //关闭连接 释放资源
            resultSet.close();
            connection.close();
            statement.close();
    
    
        }
    
    }
    
    

    JDBC固定步骤:

    1. 加载驱动
    2. 连接数据库,代表数据库
    3. 想数据库发送SQL的对象statement:CRUD
    4. 编写SQL(根据业务,不同的SQL)
    5. 执行SQL
    6. 关闭连接

    预编译SQL

    public class TestJdbc2 {
        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF8";
            String username="root";
            String password="root";
            //加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库
            Connection connection = DriverManager.getConnection(url, username, password);
    
            String sql="insert into users(id,name,PASSWORD,email,birthday)values (?,?,?,?,?);";
    
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
    
            preparedStatement.setInt(1,5);//给第一个占位符?赋值为1
            preparedStatement.setString(2,"狂神说java");
            preparedStatement.setString(3,"123456");
            preparedStatement.setString(4,"123412@qq.com");
            preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));
    
            //预编译完成在执行SQL
            int i = preparedStatement.executeUpdate();
            if (i>0){
                System.out.println("插入成功");
            }
            preparedStatement.close();
            connection.close();
        }
    }
    

    事物

    要么都成功,要么都失败

    ACID原则:保证数据的安全

    1. 开启事务
    2. 事务提交 commit
    3. 事务回滚 rollback
    4. 关闭事务

    Junit单元测试

    依赖

     <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
     </dependency>
    

    简单实用

    @Test只在方法上有效,只要加上了这个注解的方法,就可以直接运行。

    public class TestJdbc3 {
        @Test
        public void test(){
            System.out.println("hello");
        }
    }
    

    测试成功显示的是绿色的:

    测试失败显示的是红色的:

    搭建一个环境测试一个事务:

     @Test
        public void test()  {
    
                String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=UTF8";
                String username="root";
                String password="root";
                Connection  connection=null;
    
                //加载驱动
            try {
                Class.forName("com.mysql.jdbc.Driver");
                //连接数据库
                 connection = DriverManager.getConnection(url, username, password);
    
                //通知数据库开启事务false 是开启
                connection.setAutoCommit(false);
    
                String sql1="update account set money =money-100 where name='A'";
                connection.prepareStatement(sql1).executeUpdate();
                //制造错误
                //int i=1/0;
    
                String sql2="update account set money =money+100 where name='B'";
                connection.prepareStatement(sql2).executeUpdate();
                connection.commit();//以上两条SQL语句都执行成功了,就提交事务
            } catch (Exception e) {
                try {//如果出现异常,就通知数据库进行回滚。
                    connection.rollback();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
                e.printStackTrace();
            }
            finally {
                try{
                    connection.close();
                }catch (SQLException e){
                    e.printStackTrace();
                }
            }
    
        }
    
    努力学习java的Cherish
  • 相关阅读:
    RaisedButton
    Icon
    RichText
    GridView
    HTML常用标签
    HTML语法
    HTML简史
    17_继承
    16_Math
    16_ArrayList
  • 原文地址:https://www.cnblogs.com/cherish-code/p/13478147.html
Copyright © 2020-2023  润新知