月佩半琪
为什么要努力,因为喜欢的东西很贵,想去的地方很远,我爱的人超完美。

转载于狂神老师 ,本文仅作为笔记使用

1、基本概含
2、web服务器
3、Tomcat
4、Http
5、Maven
6、Servlet
7、Cookie、Session
8、JSP
9、JavaBean
10、MVC三层架构
11.过滤器(Filter)重点
12、监听器(Listener)
13、过滤器、监听器常见应用
14、JDBC
15、邮件发送
100、可能用到的依赖

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. .多个web资源,这些web资源可以被外界访问,对外界提供服务;

  • 你们能访问到的任何-个页面或者资源,都存在于这个世界的某-个角落的计算机上。

  • URL

  • 这个统一的web资源会被放在同一个文件夹下,web应用程序-->Tomcat:服务器

    • html, CSS, js

    • jsp, servlet

    • 一个web应用由多部分组成(静态web,动态web)

    • Java程序

    • jar包 配置文件(Properties)

  • web应用程序编写完毕后,若想提供给外界访问:需要一个服务器来统一 管理;

1.3、静态web

  1. *.htm, *.html,这些都是网页的后缀,如果服务器.上一直存在这些东西,我们就可以直接进行读取。联络

  1. 静态web存在的缺点
    • Web页面无法动态更新,所有用户看到都是同一个页面
      • 轮播图,点击特效:伪动态
      • JavaScript [实际开发中,它用的最多]
      • VBScript
    • 它无法和数据库交互(数据无法持久化,用户无法交互)

1.4、动态web

  1. 页面会动态展示: "Web的页面展示的效果因人而异";

  2. 缺点

    加入服务器的动态web资源出现了错误,我们需要重新编写我们的后台程序,重新发布;-----停机维护

  3. 优点

    • Web页面可以动态更新,所有用户看到的都不是同一个页面

    • 它可以与数据库交互(数据持久化:注册,商品信息,用户信息...)

2、web服务器

2.1、三种

ASP:

  • 微软:国内最早流行的就是ASP;
  • 在HTML中嵌入了VB的脚本, ASP + COM;
  • 在ASP开发中,基本-个页面都有几千行的业务代码, 页面极其换乱●维护成本高!●C#|

php:

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

JSP/Servlet :

  • B/S:浏览和服务器;
  • C/S:客户端和服务器
    • sun公司主推的B/S架构
    • 基于Java语言的(所有的大公司,或者些开源的组件,都是用Java写的)
    • 可以承载三高(高并发,高可用,高性能)问题带来的影响;
    • 语法像ASP,ASP-->JSP ,加强市场强度;

2.2、web服务器简介

  • 服务器是一种被动的操作,用来处理用户的- -些请求和给用户-一些响应信息;
  • 两种服务器
    • IIS:微软的; ASP...Windows中自带的
    • Tomcat 面向百度编程;
      • Tomcat是Apache软件基金会(Apache Software Foundation)的Jakarta项目中的一个核心项目, 最新的
      • Servlet和ISP规范总是能在Tomcat中得到体现,因为Tomcat 技术先进、性能稳定,而且免费,因而深受ava爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web应用服务器。
      • Tomcat服务器是一个免费的开放源代码的Web应用服务器, 属于轻量级应用服务器,
        在中小型系统和并发访问用户不是很多的场合下被昔遍使用,是开发和调试JSP程序的
        首选。对于-个Java初学web的人来说,它是最佳的选择
      • Tomcat实际上运行ISP页面和Servlet. Tomcat最新版本为9.0.*

3、Tomcat

3.1、下载安装解压

3.2、Tomcat启动和配置

文件夹作用

启动关闭Tomcat

访问测试http://localhost:8080/

  • 一个完整的URL地址由_协议.主机 ,端口和文件四部分组成。
    超文本传输协议//本地主机(当前这台计算机) :端口号/省略的index.jsp文件

可能遇到的问题

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

3.3、配置

服务器核心配置

可以配置启动的端口号

Tomcat默认端口号: 8080

MySQL:3306
http:80
https:443

可以配置的主机的名称

默认的主机名称:localhost--> 127.0.0.1
默认网站应用存放的位置为:webapps

高难度面试题::请你谈谈网站是如何进行访问的

  1. 输入一个域名:回车

  2. 检查本机的C:\Windows\System32\drivers\etc\hosts配置文件下有没有这个域名映

    • 有:直接返回对应ip地址,这个地址中,有我们需要访问的web程序,可以直接访问

    • 没有:去DNS服务器找,找到的话就返回,找不到就返回找不到

  3. 过程分析图

    https//www.kuanstudy.com/不能访问
    有的域名需要解析到其它位置才可以访问------------例如日解析到blog 上https//blog.kuanstudy.com/可以访问

    服务器上跑的是程序

  4. 可以配置下环境变量

3.4、发布一个web网站到Tomcat上

将自己写的网站,放到服务器(Tomcat) 指定web应用文件夹(webapps)下,就可以进
行本地访问了(远程访问)

网站应该有的结构

4、Http

了解里面如何传输数据,如何交互

4.1、什么是Http

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

  • 文本: html,字符串, ...
  • 超文本:图片,音乐,视频定位,地图....
  • 端口号:80

Https:安全的日

  • 443

4.2、两个时代

http1.0
HTTP/1.0:客户端可以与web服务器连接后,只能获得一个web资源, 断开连接
http2.0
HTTP/1.1:客户端可以与web服务器连接后,可以获得多个web资源。

4.3、Http请求

客户端-发送请求(Request) -到-服务器

百度

Request URL :https://www.baidu.com/ 请求地址
Request Method:GET get方法/post方法
status Code:200 OK 状态码: 200
Remote (远程) Address:14.215.177.39:443

Accept: text/htm1
Accept - Encoding:gzip,deflate, br
Accept-Language :zh-CN, zh;q=0.9 语言
Cache-Contro1 :max-age=0
Connection : keep-alive

1.请求行

请求行中的请求方式: GET

请求方式: Get, Post, HEAD,DELETE,PUT.,RAC... .

get、post的区别

get:请求能够携带的参数比较少。大小有限制,会在浏览器的URL地址栏显示数据内容,不安全,但高效
post:请求能够携带的参数没有限制,大小没有限制,不会在浏览器的URL地址栏显示数据内容,安全,但不高效。

2.消息头

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

4.4、Http响应

服务器--响应(Response) --客户端

百度

Cache-Contro1 :private 缓存控制
Connection :Keep-Alive 连接
Content- Encoding:gzip 编码
Content -Type :text/html 类型

1.响应体

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

2.响应状态码

200:请求响应成功

  • 200

3xx:请求重定向

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

4xx:找不到资源404

  • 404 资源不存在;

5xx:服务器代码错误

  • 502 网关错误

常见面试题:

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

5、Maven

5.1、Maven项目架构管理工具

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

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

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

  • 有约束,不要去违反。

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

Maven会规定好你该如何去编写我们的lava代码,必须要按照这个规范来;

5.2、下载安装Maven

下载完解压即可

5.3、配置环境变量

系统变量 ------> 配置

  • M2_ HOME maven 目录下的bin目录
  • MAVEN HOME maven的目录
  • 在系统的path中配置%MAVEN_ HOME%\bin

mvn -version --------> 检查是否安装成功

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、本地仓库

在本地的仓库,远程仓库

建立一个本地仓库存放下载的jar包

  • localRepository

5.6、在IDEA中使用Maven

5.6.1、启动idea

5.6.2、创建一个MavenWeb项目

a.使用模板创建的MavenWeb项目

5.6.3、等待项目初始化完毕

5.6.4、观察Maven仓库多了些什么东西

5.6.5、IDEA中的Maven设置

注意IDEA项目创建成功后,看一眼Maven的配置

5.6.6、到这里,Maven在IDE中的配置使用就OK了

5.7、(b)创建一个普通的Maven项目

这个只有在web应用下才会有

5.8、IDEA标记文件夹功能

第一种

第二种

5.9、在IDEA中配置Tomcat

解决警告问题------>为什么会有这个问题,我们访问一个网站,需要指定一个文件夹的名字

5.10、pom文件

pom.xml是Maven的核心配置文件

一个简单的web项目

Maven由于它的约定大于配置,我们之后可能遇到我们写的配置文件,无法被导出或者生效的问题(就是例如Java代码写.xml文件,.properties文件或者其它文件时),解决方案

5.11、IDEA操作

jar生成目录树

5.12、解决maven项目搭建中可能遇到的一些问题

5.12.1、Maven 3.6.2

降级为Maven 3.6.1

5.12.2、Tomcat闪退

5.12.3、IDEA中每次都要重复配置Maven

在IDEA的默认全局配置中去配置

5.12.4、Maven项目中Tomcat无法配置

5.12.5、maven默认web项目中的web.xml版本问题

替换为webapp4.0版本和tomcat一致

<?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"
         metadata-complete="true">

</web-app>

6、Servlet

用IDEA写一 个简单的Servlet

1.使用Maven创建一个web项目 (带模板)

2.在main文件下建java和resource文件------>然后标记文件类型

3.配置pom.xml主配置文件

<?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>

  <groupId>com.lenovo.servlet</groupId>
  <artifactId>javaweb-maven-02</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>javaweb-maven-02 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>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>
  
  </dependencies>

  <build>
    <finalName>javaweb-maven-02</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>

    <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>
</project>

4.书写Servlet的java类

package com.lenovo.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.io.PrintWriter;

public class Servlet02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //响应的类型
        response.setContentType(" text/html");
        //配置字符集
        response.setCharacterEncoding("utf-8");
        //获取响应的输入流
        PrintWriter out = response.getWriter();
        out.println("<html)");
        out.println(" <head>");
        out.println("<title>Hello World!</title>");
        out.println("</head>");
        out.println(" <body>");
        out.println("<h1>我爱Java</hl>");
        out.println("</body>");
        out.println("</html>");
    }

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

5.web.xml中注册Servlet,以及配置Servlet的mapping映射请求路径

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
  <display-name>Archetype Created Web Application</display-name>

  <!--web. xmL中是配置我们web的核心应用-->
  <!--注册ServLet-->
  <servlet>
    <servlet-name>helloselvlet</servlet-name>
    <servlet-class>com.lenovo.servlet.Servlet02</servlet-class>
  </servlet>
  <!--一一个Servlet对应一Mapping: 映射-->
  <servlet-mapping>
    <servlet-name>helloselvlet</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/zhuchengbo</url-pattern>
  </servlet-mapping>

</web-app>

6.配置Tomcat服务器并启动

Run---->Edit Configurations...---->Tomcat---->本地----->Deployment---->添加该项目

7.启动Tomcat服务器并访问映射路径

6.1、Servlet简介

Servlet就是sun公司开发动态web的一 门技术

Sun在这些API中提供--个接口叫做: Servlet, 如果你想开发一个Servlet程序, 只需要完成两个小步骤:

  • 编写一个类,实现Servlet接口
  • 把开发好的Java类部署到web服务器中。

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

6.2、HelloServlet

★Serlvet接口Sun公司有两个默认的实现类: HttpServlet,GenericServlet

6.2.1.构建-一个普通的Maven项目,删掉里面的src目录以后我们的学习就在这个项目里建立Moudel,这个空的工程就是Maven主工程

6.2.2.关于Maven父子工程的理解:

父项目中会有子模块

<modules>
     <module>servlet01</module>
</modules>

子项目会有父模块

<parent>
     <artifactId> javaweb-02-servlet</artifactId>
     <groupId>com.kuang</groupId>
	<version>1.0-SNAPSHOT</version>
</parent>

父项目中pom文件依赖子项目可以直接使用

6.2.3.Maven环境优化

1.修改web.xml为最新的

2.将maven的结构搭建完整

6.2.4.编写一个Servlet程序

1.编写一个普通类
2.实现Servlet接口,
这里我们直境承 HttpServlet

  • 我们写的是AVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他-一个浏览器能够访问的路径;

    <?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"
             metadata-complete="true">
        <!--web. xmL中是配置我们web的核心应用-->
        <!--注册ServLet-->
        <servlet>
            <servlet-name>helloselvlet</servlet-name>
            <servlet-class>com.lenovo.servlet.Servlet03</servlet-class>
        </servlet>
        <!--一一个Servlet对应一Mapping: 映射-->
        <servlet-mapping>
            <servlet-name>helloselvlet</servlet-name>
            <!--映射的请求路径-->
            <url-pattern>/zhuchengbo</url-pattern>
        </servlet-mapping>
    
    </web-app>
    
    

6.2.5.编写Servlet的映射

为什么需要映射:

我们写的是AVA程序,但是要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要再web服务中注册我们写的Servlet,还需给他一个浏览器能够访问的路径;

6.2.6.配置Tomcat

注意配置项目发布的路径就可以了

6.2.7.启动测试

6.3、Servlet原理

Servlet是由web服务器调用,web服务器在收到浏览器请求后会

6.4、Mapping问题

6.4.1、一个Servlet可以指定一个映射路径

<!----个Servlet对应一Mapping: 映射-->
<servlet-mapping>
    <servlet-name>helloselvlet</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/zhuchengbo</url-pattern>
</serv1et-mapping>

6.4.2、一个Servlet可以指定多个映射路径

<!--Servlet的请求路径-->
<!--Localhost: 8088/s1/hello/hello-->
<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>/he11o1</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>/he11o2</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>/he11o3</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>/he11o4</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>/he11o5</url-pattern>
</servlet-mapping>

6.4.3、一个Servlet可以指定通用映射路径

<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>/he11o/*</url-pattern>
</servlet-mapping>

6.4.4、默认的请求路径

<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

6.4.5、指定一些后缀或者前缀等等...

<!--可以自定义后级实现请求映射
注意点,* 前面不能加项目映射的路径
hello/sajdlkaida.xibei-->
<servlet-mapping>
    <servlet-name>he11o</servlet-name>
    <url-pattern>*.xibei</url-pattern>
</servlet-mapping>

6.4.6、优先级问题

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

  <!--404-->
<servlet>
        <servlet-name>error</servlet-name>
        <servlet-class>com.lenovo.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应用

6.5.1、实现共享数据

1.我在这个Serlet中保存的数据,可以在另外一个servlet中拿到:

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //this. getInitParameter() 初始化参数
        //this. getServletConfig() Servlet配置
        //this. getServletContext() Servlet 上下文
        ServletContext context = this.getServletContext();
        String name = "西贝";
        context.setAttribute("name",name); //将一个 数据保存在了ServletContext中,名字为: username 。值username

    }

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

2.读取它的类

public class GetServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String name = (String) context.getAttribute("name");

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().println("名字是"+name);

    }

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

3.配置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"
         metadata-complete="true">
  <!--web. xmL中是配置我们web的核心应用-->
  <!--注册ServLet-->
  <servlet>
    <servlet-name>helloselvlet</servlet-name>
    <servlet-class>com.lenovo.servlet.HelloServlet</servlet-class>
  </servlet>
  <!--一一个Servlet对应一Mapping: 映射-->
  <servlet-mapping>
    <servlet-name>helloselvlet</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/zhuchengbo</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>getc</servlet-name>
    <servlet-class>com.lenovo.servlet.GetServlet</servlet-class>
  </servlet>
  <!--一一个Servlet对应一Mapping: 映射-->
  <servlet-mapping>
    <servlet-name>getc</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/getc</url-pattern>
  </servlet-mapping>

</web-app>

4.测试访问结果

先访问/zhuchengbo再访问/getc

6.5.2、获取初始化参数

1、

public class ServletDemo03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        String url = context.getInitParameter("url");
        resp.getWriter().println(url);
    }

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

2、

 <!--配置一些web应用初始化参数-->
   <context-param>
       <param-name>url</param-name>
       <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
   </context-param>
  <servlet>
    <servlet-name>url</servlet-name>
    <servlet-class>com.lenovo.servlet.ServletDemo03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>url</servlet-name>
    <url-pattern>/url</url-pattern>
  </servlet-mapping>

3、

6.5.3、请求转发

1、

public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        //RequestDispatcher requestDispatcher =context. getRequestDispatcher("/gp"); //转发的请求路径
        //requestDispatcher.forward(req, resp); //调用forward实现请求转发;
        context.getRequestDispatcher("/url").forward(req, resp);
    }

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

2、

<servlet>
        <servlet-name>sd1</servlet-name>
        <servlet-class>com.lenovo.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>sd1</servlet-name>
        <url-pattern>/sd1</url-pattern>
 </servlet-mapping>

3、

6.5.4、读取资源文件

Properties

1.在resources目录下新建properties

1、

2、

public class ServletDemo05 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties prop = new Properties();
        prop.load(is);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");
        resp.getWriter().print(user + " :" + pwd);
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }

3、

<servlet>
        <servlet-name>db</servlet-name>
        <servlet-class>com.lenovo.servlet.ServletDemo05</servlet-class>
</servlet>
<servlet-mapping>
        <servlet-name>db</servlet-name>
        <url-pattern>/db</url-pattern>
 </servlet-mapping>

4、

2.在java目录下新建properties

        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/lenovo/servlet/aa.properties");
发现:都被打包到了同一个路径下: classes,我们俗称这个路径为classpath: .
思路:需要一个文件流;

6.6、HttpServletResponse

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

  • 如果要获取客户端请求过来的参数找HttpServletRequest
  • 如果要给客户端响应一些信息:找HttpServletResponse

1、方法的一些简单分类

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

1 Servletoutputstream getoutputstream0 throws IOException;
2 Printwriter getwriter0 throws IOException;

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

void setCharacterEncoding(string var1);
void setContentLength(int var1);
void setContentlengthLpng(long var1);
void setcontentType(string var1);
void setDateHeader(string var1, 1ong var2) ;
void addDateHeader(string var1, long var2) ;
void setHeader(string var1 string var2);
void addHeader(string var1,string var2);
void setIntHeader(string var1, int var2);
void addIntHeader(string var1, int var2);

负责设置文本的方法

void setCharacterEncoding(string var1);
void setContentLength(int varl);
void setContentLengthLong(long var1);
void setContentType(string var1);

响应的状态码

2.常见应用

1.向浏览器输出消息(一直在讲,就不说了)
2.下载文件

步骤

  1. 要获取下载文件的路径
  2. 下载的文件名是啥?
  3. 设置想办法让浏览器能够支持(Content-Disposition) 下载我们需要的东西,中文文件
    名URLEncoder . encode编码,否则有可能乱码
  4. .获取下载文件的输入流
  5. 创建缓冲区
  6. 获取0utputStream对象
  7. 将FileOutputStream流写入到buffer缓中区,使用Outputstream将缓冲区中的数据
    输出到客户端!

例题

public class FileServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1.要获取下载文件的路径
        String realPath = "D:\\Project\\IdeaProject\\javaweb-01-servlet\\response\\src\\main\\resource\\西贝.jpg";
        System.out.println("下载文件的路径: " + realPath);
        // 2.下载的文件名是啥?
        String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
        // 3.设置想办法让浏览器能够支持(Content -Disposition)下载我们需要的东西,中文文件名URLEncoder . encode编码,否则有可能乱码
        resp.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
        // 4.获取下载文件的输入流
        FileInputStream in = new FileInputStream(realPath);
        // 5.创建缓冲区
        int len = 0;
        byte[] buffer = new byte[1024];
        // 6.获取0utputStream对象
        ServletOutputStream out = resp.getOutputStream();
        // 7.将FileOutputStream流 写入到buffer缓冲区,使用Outputstream将缓冲区中的数据输出到客户端!
        while ((len = in.read(buffer)) > 0) {
            out.write(buffer, 0, len);
        }
        in.close();
        out.close();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
3.验证码功能

验证怎么来的?
●前端实现

●后端实现,需要用到Java的图片类,生产一个图片

步骤

1、

public class ImageServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //如何让湖览器3秒自动刷新-次
        resp.setHeader("refresh", "3");
        //在内存中创建一个图片
        BufferedImage image = new BufferedImage(80, 20, BufferedImage.TYPE_INT_BGR);
        //得到图片
        Graphics2D g = (Graphics2D) image.getGraphics(); //笔
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0, 0, 80, 20);
        //给图片写数据
        g.setColor(Color.BLUE);
        g.setFont(new Font(null, Font.BOLD, 20));
        g.drawString(makeNum(), 0, 20);
        //告诉沟览器,这个请求用图片的方式打开
        resp.setContentType("image/jpeg");
        //网站存在缓存,不让测览器缓存
        resp.setDateHeader("expires", -1);
        resp.setHeader("Cache-Control", "no-cache");
        resp.setHeader("Pragma", "no-cache");
        //把图片写给浏览器
        ImageIO.write(image, "jpg", resp.getOutputStream());

    }
    //.生成随机数
    private String makeNum() {
        Random random = new Random();
        String num = random.nextInt(999999) + "";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7 - num.length(); i++) {
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;
    }

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

2、

<servlet>
    <servlet-name>y</servlet-name>
    <servlet-class>com.lenovo.servlet.ImageServlet</servlet-class>
  </servlet>
  <!--一个Servlet对应一Mapping: 映射-->
  <servlet-mapping>
    <servlet-name>y</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/img</url-pattern>
  </servlet-mapping>

3、

4.实现重定向

过程

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

常见场景:

  • 用户登录.
  • void sendRedi rect(S tring var1) throws IOException;

测试

public class RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        /**
         * 原理
         *  resp.setHeader("Location","/response/img");
         *  resp.setStatus(302);
         */
      resp.sendRedirect("/response/img");
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
    <servlet-name>redirect</servlet-name>
    <servlet-class>com.lenovo.servlet.RedirectServlet</servlet-class>
  </servlet>
  <!--一一个Servlet对应一Mapping: 映射-->
  <servlet-mapping>
    <servlet-name>redirect</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/red</url-pattern>
  </servlet-mapping>

面试题:请你聊聊重定向和转发的区别?
相同点

  • 页面都会实现跳转

不同点

  • 请求转发的时候,url不会产生变化;----307
  • 重定向时候,url地址栏会发生变化;----302

6.7、HttpServletRequest

Request测试

1、

<html>
<body>
<h2>Hello World!</h2>
<%--这里提交的路径,需要寻找到项目的路径--%>
<%--${pageContext. request. contextPath}代表当前的项目--%>
<form action=" ${pageContext.request.contextPath}/login" method="get">
    用户名: <input type="text" name="username"> <br>
    密码: <input type="password" name="password"> <br>
    <input type="submit">
</form>
</body>
</html>

2、

public class RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //处理请求
        String username = req . getParameter("username");
        String password = req. getParameter( "password");
        System. out. println(username+" : "+password);
       //重定向时候一定要注意。路径问题。否则404:
        resp. sendRedirect( "/response/success.jsp");

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

3、

<servlet>
    <servlet-name>request</servlet-name>
    <servlet-class>com.lenovo.servlet.RequestTest</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>request</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

4、success.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>success</h1>
</body>
</html>

获取参数,请求转发

登录实例
1、index.jsp
<html>
<body>
<h2>登录</h2>
<div style="text-align: center">
<%--  这里表单表示的意思:以post方式提交表单,提交到我们的Login请求  --%>
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名:<input type="text" name="username"><br>
        密码:<input type="password" name="password"><br>
        爱好:
        <input type="checkbox" name="hobbys" value="代码">
        <input type="checkbox" name="hobbys" value="java">
        <input type="checkbox" name="hobbys" value="唱歌">
        <input type="checkbox" name="hobbys" value="跳舞">
        <input type="checkbox" name="hobbys" value="电影">
        <br>
        <input type="submit">
    </form>
</div>

</body>
</html>

2、LoginServlet
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req, resp);
    }
    @Override
    protected void doPost(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[] hobbys = req.getParameterValues("hobbys");
        System.out.println("=========================");
        //后台接收中文乱码问题
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbys));
        System.out.println("========================");
        System.out.println(req.getContextPath());
        //通过请求转发
        //这里的 / 代表当前的web应用
        req.getRequestDispatcher("/success.jsp").forward(req, resp);

    }
}
3、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"
         metadata-complete="true">

  <servlet>
    <servlet-name>request</servlet-name>
    <servlet-class>com.lenovo.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>request</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
</web-app>
4.success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录成功</h1>
</body>
</html>

7、Cookie、 Session

7.1、会话

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

有状态会话:个同学来过教室,下次再来教室, 我们会知道这个同学,曾经来过

你能怎么证明你是学校的学生?

  • 你 学校

  • 1.发票 学校 给你发票

  • 2.学校的登记 学校 标记你来过了

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

客户端 服务器

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

7.2、 保存会话的两种技术 。

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

session

●服务器技术利用这个技术,可以保存用户的会话信息?我们可以把信息或者数据放在Session中.
常见:网站登录之后,你下次不用再登录了,第二次访问直接就上去了!

7.3、Cookie

7.3.1、从请求中拿到cookie信息

7.3.2、服务器响应给客户端cookie

Cookie[] cookies = req. getcookiesO); //获得Cookie
cookie. getName(; //获得cookie中的key
cookie. getvalue(); //获得cookie中的vlaue
new Cookie("lastLoginTime", System. currentTimeMillisO+""); //新建一个cookie
cookie. setMaxAge(24*60*60); //设置cookie的有 效期
resp. addcookie(cookie); //响应给客户端 - -个cookie

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

7.3.4、一个网站cookie是否存在上限!聊聊细节问题

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

7.3.5、删除Cookie;

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

7.3.6、编码解码:

URLEncoder.encode("西贝","utf-8")
URL Decoder.decode(cookie.getvalue(),"UTF-8")

例题:

1、cookie的缓存
//保存用户上一次访问的时间
public class CookieDome01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器,告诉你,你来的时间,把这个时间封装成为一个信件,你下带来,我就知道你来了
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=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("这是您第一次访问本站");
        }
        //服务给客户端响应一rcookie;
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //cookie有效期为1天
        cookie.setMaxAge(24 * 60 * 60);
        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
            ServletException, IOException {
        doGet(req, resp);
    }
}
2、删除Cookie;
public class CookieDome02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建一个cookie.名字必须要 和要删除的名字-致
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis() + "");
        //将cookie有效期设置为,立马过期
        cookie.setMaxAge(0);
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws
            ServletException, IOException {
        doGet(req, resp);
    }
}
3、编码解码:
public class CookieDome03 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        resp.setCharacterEncoding("utf-8");
        //Cookie,服务器端从客户端获取呀:
        Cookie[] cookies = req.getCookies(); //这里返回数组。说明cookie可能存在多 个
        PrintWriter out = resp.getWriter();
        //判断iCookie是否存在
        if (cookies != null) {
            //如果存在怎么办
            out.write("你上一次访问的时间是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                System.out.println("111111111111");
                //获取cookie的名字
                if (cookie.getName().equals("name")) {
                    System.out.println("2222222222222222");
                    System.out.println(cookie.getValue());
                    //解码
                    //out.write(URLDecoder.decode(cookie.getValue(), "UTF-8"));
                    out.write(cookie.getValue());
                }
            }
        } else {
            out.write("这是您第一次访问本站");
            //编码
            Cookie cookie = new Cookie("name", URLEncoder.encode("西贝", "utf-8"));
            resp.addCookie(cookie);
        }
    }

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

7.4、 Session(重点)

7.4.1、什么是Session:

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

7.4.2、Session和cookie的区别:

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

7.4.3、使用场景:

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

7.4.4、session使用

1、获取session以及session的一些方法
public class SessionDome01 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; charset=utf-8");
        //得到Session
        HttpSession session = req.getSession();
        //给Session中存东西
        session.setAttribute("name", "西贝");
        //获取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);
    }
}
2、
public class SessionDome02 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; charset=utf-8");
       //得到Session
        HttpSession session = req.getSession();
        String name = (String) session.getAttribute("name");
        System.out.println(name);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
3、手动设置session失效
public class SessionDome03 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);
    }
}

7.4.5、会话自动过期,web.xml中设置

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

7.4.6、流程图

session

ServletContext

8、JSP

8.1、什么是JSP

Java Server Pages : Java服务器端页面, 也和Servlet- 样,用于动态Web技术! .
最大的特点:
●写JSP就像在写HTML
●区别:
。HTML只给用户提供静态的数据
。JSP页面中可以嵌入AVA代码,为用户提供动态数据;

8.2、JSP原理

思路: JSP到底怎么执行的!|

  • 代码层面没有任何问题

  • 服务器内部工作
    tomcat中有一个work目录;
    IDEA中使用Tomcat的会在IDEA的tomcat中生产一个work目录

发现页面转变成了Java程序!

浏览器向服务器发送请求,不管访问什么资源,其实都是在访问Servlet!
JSP最终也会被转换成为一个Java类!
JSP本质上就是一个Servlet

//初始化
public void._jspInit(){    
}
//销毁
public void._jspDestroy(){
}
//JSPService
public void.jspService(. HttpServletRequest request ,HttpServletResponse response){}

1.判断请求
2.内置一些对象

final javax.servlet.jsp.PageContext pageContext; //页面上下文
javax.serv1et.http.HttpSession session = nu11;
//session
final javax.serv1et.ServletContext application; / /applicati onContext
fina1 javax.servlet.ServletConfig config;
//config
javax.servlet.jsp.Jspwriter out = nu11;
//out
final java.lang.object page = this;
//page:当前
HttpServletRequest request
//请求
HttpServ1etResponse response
//响应

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

response.setContentType ("text/htm1");
//设置响应的页面类型
pageContext = _jspxFactory.getPageContext(this,request,response,nu11,true, 8192,true) ;
_jspx_page_ context = pageContext;
application = pageContext.getserv1etContextO;
config = pageContext.getServ1etConfigO;
session = pageContext.getSessionO;
out = pageContext.getoutO;
_jspx_ _out = out;

4.以上的这些个对象我们可以在JSP页面中直接使用!

在JSP页面中; .
只要是JAVA代码就会原封不动的输出;
如果是HTML代码,就会被转换为:

out.write ("<htm1>\r\n");

这样的格式,输出到前端

8.3、JSP基础语法

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

JSP表达式

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

jsp脚本片段

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


JSP声明

<%!
static{
System.out.println("Loading Servlet!");
}
private int g1obalvar = 0;
public void kuang(){
System.out.print1n("进入了方法Kuang! ");
}
%>

JSP声明:会被编译JSP生成ava的类中!其他的,就会被生成到jspService方法中!
在JSP,嵌入ava代码即可!

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

JSP的注释,在客户端打开时不会在客户端显示,HTML就会!

8.4、JSP指令

<%@page args.... %>
<%@include file=""%>
<%--@include会将两个页面合二为---%>
<%@include file="common/header.jsp"%>
<h1>网页主体</hl>
<%@include file="common/footer.jsp"%>
<hr>

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

可定制错误页面(404,500)以及公共页面

8.5、九大内置对象和四大作用域

8.5.1、四大作用域

page域:只能在当前jsp页面使用(当前页面)
request域:只能在同一个请求中使用(转发)
session域:只能在同一个会话(session对象)中使用(私有 的)
context域:只能在同一个web应用中使用(全局的)

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
    pageContext.setAttribute("name1", "秦疆1号"); //保存的数据只在一个页面中有效
    request.setAttribute("name2", "秦疆2号"); //保存的数据只在一次请求中有效,请求转发会携带这个数据
    session.setAttribute("name3", "秦疆3号"); //保存的数据只在一次会话中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4", "秦疆4号"); // 保存的数据只在服务器中有效。从打开服务器到关闭服务器
%>
<%--脚本片段中的代码。会被原封不动生成到。JSP.java
要求:这里面的代码:必须保证Java语法的正确性--%>
//从pageContext取出,我们通过寻找的方式来
//从起层到高层(作用城) : page->request-->session-->application
<%
    String name1 = (String) pageContext.findAttribute("name1");
    String name2 = (String) pageContext.findAttribute("name2");
    String name3 = (String) pageContext.findAttribute("name3");
    String name4 = (String) pageContext.findAttribute("name4");
    String name5 = (String) pageContext.findAttribute("name5"); // 不存在
%>
<%--使EL表达式输出${} --%>
<h1>取出的值为: </h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3><%=name5%>
</h3>
</body>
</html>

page:

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

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

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

8.5.1、九大内置对象

内置对象名 类型
request HttpServletRequest
response HttpServletResponse
config ServletConfig
application ServletContext
session HttpSession
exception Throwable
page object(this)
out JspWriter
pageContext PageContext

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

8.6.1、JSP标签

往上翻

8.6.2、JSTL标签

  1. 相关依赖

     <!--JSTL的依赖-->
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <!-- standard标签库-->
            <dependency>
                <groupId>taglibs</groupId>
                <artifactId>standard</artifactId>
                <version>1.1.2</version>
            </dependency>
    
    
    1. JSTL表达式

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

      • 格式化标签

      • SQL标签

      • XML标签

      • 核心标签(掌握部分)

    1 实例演示<c:if>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h4>if测试</h4>
<hr>
<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">
    8 <c:out value="管理员欢迎您! "/>
</c:if>
<c:out value="${isAdmin}"/>
</body>
</html>

2实例演示<c:choose>

<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>c:choose 标签实例</title>
</head>
<body>
<c:set var="salary" scope="session" value="${2000*2}"/>
<p>你的工资为 : <c:out value="${salary}"/></p>
<c:choose>
    <c:when test="${salary <= 0}">
        太惨了。
    </c:when>
    <c:when test="${salary > 1000}">
        不错的薪水,还能生活。
    </c:when>
    <c:otherwise>
        什么都没有。
    </c:otherwise>
</c:choose>
</body>
</html>

运行结果如下:

你的工资为 : 4000

不错的薪水,还能生活。

3.实例演示<c:forEach>

<%@ page import="java.util.ArrayList" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
         pageEncoding="UTF-8" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
    <title>c:forEach 标签实例</title>
</head>
<body>
<%
    ArrayList<String> people = new ArrayList<>();
    people.add(0, "张三");
    people.add(1, "李四");
    people.add(2, "王五");
    people.add(3, "赵六");
    people.add(4, "田七");
    request.setAttribute("list", people);
%>
<%--
var,每一一次遍历出米的变量
items,要遍历的对象
begin,哪里开始
end,到哪里
step,步长
--%>
<c:forEach var="people" items="${list}">
<c:out value="${people}"/> <br>
</c:forEach>
<hr>
<c:forEach var="people" items="${list}" begin="1" end="3" step="1">
<c:out value="${people}"/> <br>
</c:forEach>
</body>
</html>

运行结果如下:

  1. JSTL标签库使用步骤
  • 引用核心标签库taglib
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 使用其中的方法
  • 在Tomcat也需要引入jstl的包,否则会报错: JSTL解析错误 (需手动导包至lib目录下)500错误

8.6.3、EL表达式

EL表达式: ${}作用:

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

9、JavaBean

实体类

JavaBean有特定的写法:

  • 必须要有一个无参构造

  • 属性必须私有化

  • 必须有对应的get/set方法;

一般用来和数据库的字段做映射ORM;
ORM:对象关系映射

  • 表-->类
  • 字段-->属性
  • 行记--->对象
序号 name age address
1 鸣人 12 木叶
2 佐助 13 木叶
3 雏田 14 木叶
class Peop1e {
    private int id;
    private string name;
    private int id;
    private string address;
}

class A {
	new Peop1e(1,"鸣人",12,"木叶");
	new Peop1e(2,"佐助",13,"木叶");
	new Peop1e(3,"雏田",14,"木叶");
}

10、 MVC三层架构

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

Controller层:接受用户参数,调用业务层,转发视图

业务层;主要处理对应业务

持久层:增删改查的事

前端:展示页面

10.1、早些年

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

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

程序猿调用
JDBC
Mysql oracle sqlServer...

10.2、MVC三层架构

Model

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

View

  • 展示数据
  • 提供链接发起Servlet请求(a, form, img..)

Controller (Servlet)

  • 接收用户的请求: (req: 请求参数、Session信息...
  • 交给业务层处理对应的代码
  • 控制视图的跳转

登录--->接收用户的登录请求--->处理用户的请求(获取用户登录的参数,username, password) ----> 交
给业务层处理登录业务(判断用户名密码是否正确:事务) --->Dap层查询用户名和密码是否正确-->数据库

11、过滤器(Filter)(重点)

11.1、Filter:过滤器,用来过滤网站的数据;

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

Filter开发步骤:

1.导包

  <!--servlet的依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!--jsp的依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>
        <!--JSTL的依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- standard标签库-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!--连接数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.17</version>
        </dependency>
    </dependencies>

2.编写过滤器

  1. 导包不要错

  1. 实现Filter接口,重写对应的方法即可
public class CharacterEncodingFilter implements Filter {
    //初始化:web服务器启动。就以及初始化了随时等待过滤对象出现!
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterEncodingFilter创建");
    }

    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销毁");
    }
}
  1. 在web.xml中配置Fiter
 <!--web. xmL中是配置我们web的核心应用-->
    <!--注册ServLet-->
    <servlet>
        <servlet-name>Servlet</servlet-name>
        <servlet-class>com.lenovo.filter.Servlet</servlet-class>
    </servlet>
    <!--一一个Servlet对应一Mapping: 映射-->
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <!--映射的请求路径-->
        <url-pattern>/servlet/show</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Servlet</servlet-name>
        <!--映射的请求路径-->
        <url-pattern>/show</url-pattern>
    </servlet-mapping>

    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.lenovo.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <!--只要是/servlet的任何请求。会经过这个过滤器-->
        <url-pattern>/servlet/*</url-pattern>
        <!--<url -pattern>/*</url-pattern>-->
    </filter-mapping>
  1. 编写一个Servlet类可以发现

    public class Servlet 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;charset=UTF-8");
            resp.getWriter().println("你好,世界");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    
    1. 可以观察到过滤器筛选了哪些路径可通过过滤器

12、监听器(listener)

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

12.1、session监听器

  1. 编写一个监听器
    实现监听器的接口.
//统计网站在线人数:统计session
public class listener implements HttpSessionListener {
    //创建session监听:看你的一举一动
    //一旦创建Session就会触发一次这 个事件!
    public void sessionCreated(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();
        System.out.println(se.getSession().getId());

        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
        if (onlineCount == null) {
            onlineCount = new Integer(1);
        } else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count + 1);
        }
        ctx.setAttribute("OnlineCount", onlineCount);
    }

    //销毁session监听
    //一旦销毁Session就会触发一次这个事件!
    public void sessionDestroyed(HttpSessionEvent se) {
        ServletContext ctx = se.getSession().getServletContext();
        Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
        if (onlineCount == null) {
            onlineCount = new Integer(0);
        } else {
            int count = onlineCount.intValue();
            onlineCount = new Integer(count - 1);
        }
        ctx.setAttribute("OnlineCount", onlineCount);
    }
    /*Session销毁:
        1.手动销毁
        getSession(). invalidate();
        2.自动销毁*/
}
  1. web.xml中注册监听器
<!--注册监听器-->
    <listener>
        <listener-class>com.lenovo.filter.listener</listener-class>
    </listener>
    <!--设置session过期时间-->
    <session-config>
        <session-timeout>1</session-timeout>
    </session-config>
  1. 看情况是否使用!

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
      <head>
        <title>$Title$</title>
      </head>
      <body>
      <h1>当前有<span><%=this.getServletConfig().getServletContext().getAttribute("OnlineCount")%></span>人在线</h1>
      </body>
    </html>
    

12.2、键盘监听器

12.3、窗口监听器

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

13.1、监听器

13.1.1、CUI编程(图形界面编程)游戏等

  1. 监听器: GUI编程中经常使用;
public class TestPanel {
    public static void main(String[] args) {
        Frame frame = new Frame("中秋节快乐"); //新建一 一个窗体
        Panel panel = new Panel(null); //面板
        frame.setLayout(null); //设置窗体的布局
        frame.setBounds(300, 300, 500, 500);
        frame.setBackground(new Color(8, 8, 255)); //设置背景颜色
        panel.setBounds(50, 50, 300, 300);
        panel.setBackground(new Color(0, 255, 0)); //设置背景颜色
        frame.add(panel);
        frame.setVisible(true);
        //监听事件,监听关闭事件
        frame.addWindowListener(new WindowListener() {
            public void windowOpened(WindowEvent e) {
                System.out.println("打开");
            }
            public void windowClosing(WindowEvent e) {
                System.out.println("关闭ing");
                System.exit(0);
            }
            public void windowClosed(WindowEvent e) {
                System.out.println("关闭ed");
            }
            public void windowIconified(WindowEvent e) {
            }
            public void windowDeiconified(WindowEvent e) {
            }
            public void windowActivated(WindowEvent e) {
                System.out.println("激活");
            }
            public void windowDeactivated(WindowEvent e) {
                System.out.println("未激活");
            }
        });

    }
}

  1. 当必须重写方法过多,而且用不到时,可以new其子类,这样就可以选择自己需要用的方法重写
public class TestPanel {
    public static void main(String[] args) {
        Frame frame = new Frame("中秋节快乐"); //新建一 一个窗体
        Panel panel = new Panel(null); //面板
        frame.setLayout(null); //设置窗体的布局
        frame.setBounds(300, 300, 500, 500);
        frame.setBackground(new Color(8, 8, 255)); //设置背景颜色
        panel.setBounds(50, 50, 300, 300);
        panel.setBackground(new Color(0, 255, 0)); //设置背景颜色
        frame.add(panel);
        frame.setVisible(true);
        //监听事件,监听关闭事件
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

    }

  1. 结果相同

13.1.2、统计在线人数(往上看)

13.2、过滤器

13.2.1、用户登录拦截

用户登录之后才能进入主页!用户注销后就不能进入主页了!(即不能直接访问http://localhost:8080/sys/success.jsp,需要先登录才可以,否则直接跳到http://localhost:8080/error.jsp)
1.用户登录之后,向Sesison中放入用户的数据
2.进入主页的时候要判断用户是否已经登录;没有登录过则返回登录页面。

要求:在过滤器中实现!

  1. Login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>登录</h1>
<form action="/servlet/login" method="post">
    用户名:<input type="text" name="username">
    <input type="submit">
</form>

</body>
</html>

  1. web.xml
 <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.lenovo.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/servlet/login</url-pattern>
    </servlet-mapping>
    
    <servlet>
        <servlet-name>LogoutServlet</servlet-name>
        <servlet-class>com.lenovo.servlet.LogoutServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LogoutServlet</servlet-name>
        <url-pattern>/servlet/logout</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.lenovo.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/sys/*</url-pattern>
    </filter-mapping>
  1. Constan
public class Constant {
    public final static String USER_SESSION	="USER_SESSION";
}
  1. LoginServle
public class LoginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取前端清求的参数
        String username = req.getParameter( "username");
        if (username. equals("admin")){ // 登录成功
            req.getSession().setAttribute(Constant.USER_SESSION, req.getSession().getId());
            resp.sendRedirect("/sys/success.jsp");
        }else { //登录失败
            resp.sendRedirect("/error.jsp");
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  1. success.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>主页</h1>
<p><a href="/servlet/logout">注销</a></p>

</body>
</html>

  1. error.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>错误</h1>
<h3>没有权限,用户名错误</h3>
<a href="/Login.jsp">返回登录页面</a>

</body>
</html>

  1. LogoutServlet
public class LogoutServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        Object user_session = req.getSession().getAttribute("USER_SESSION");
        if (user_session != null) {
            req.getSession().removeAttribute("USER_SESSION");
            resp.sendRedirect("/Login.jsp");
        }
    }
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  1. SysFilter
public class SysFilter implements Filter {
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        //IServLetRequest HttpServLetRequest
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
            response.sendRedirect("/error.jsp");
        }
        chain.doFilter(request, response);

    }

    public void destroy() {

    }
}


项目结构

13.2.2、字符乱码问题(往上看)

14、JDBC

14.1、什么是JDBC,Java连接数据库

需要jar包的支持:
●java.sql
●javax.sql
●mysql-connector-java... 连接驱动(必须要导入)

14.2、实验环境搭建(步骤)

14.2.1、通过Navicat/SQLyog或者直接用MySQL建立数据库(jdbc)、数据表

14.2.2、导入连接数据库依赖

 <!--连接数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.17</version>
        </dependency>

14.2.3、使用IDEA连接MySQL数据库

14.2.4、JDBC固定步骤:

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

//配置信息
    //url地址:"jdbc:mysql://localhost:3306
    //数据库名称:jdbc
    //useUnicode=true&characterEncoding=utf-8解决中文乱码
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "981204";
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库。代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.向数据库发送SQL的对象Statement : CRUD
        Statement statement = connection.createStatement();
        //4.编写SQL
        String sql = "select * from users";
        //5.执行查询SQL.返回一个 ResultSet :结果集
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()) {
            System.out.println("id=" + rs.getObject("id"));
            System.out.println("id=" + rs.getObject("name"));
            System.out.println("id=" + rs.getObject("password"));
            System.out.println("id=" + rs.getObject("email"));
            System.out.println("id=" + rs.getObject("birthday"));
        }
        //6.关闭连接:释放资源(一定要做)先开后关
        rs.close();
        statement.close();
        connection.close();

    }

String sql = "delete from users where id=4";
//受影响的行数i,增删改都是用executeUpdate即可
//int i = statement . executeUpdate(sql);

预编译SQL

使用preparedStatement

public class TestJDBC02 {
    //配置信息
    //url地址:"jdbc:mysql://localhost:3306
    //数据库名称:jdbc
    //useUnicode=true&characterEncoding=utf-8解决中文乱码
    public static void main(String[] args) throws Exception {
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "981204";
        //1.加载驱动
        Class.forName("com.mysql.jdbc.Driver");
        //2.连接数据库。代表数据库
        Connection connection = DriverManager.getConnection(url, username, password);
        //3.编写SQL
        String sql = "insert into users(id,name,password,email,birthday) values (?,?,?,?,?);";
        //4.预编译
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setInt(1, 2);//给第一个占位符? 的值赋值为2:
        preparedStatement.setString(2, "西贝");//给第二个占位符?的值赋值为西贝;
        preparedStatement.setString(3, "123456");//给第三个占位符?的值赋值为123456;
        preparedStatement.setString(4, "24736743@qq.com");//给第四个占位符?的值赋值为24736743@qq. com;
        preparedStatement.setDate(5, new Date(new java.util.Date().getTime()));//给第五个占位符?的值赋值为new Date(new java.util.Date().getTime())
        //5.执行SQL
        int i = preparedStatement.executeUpdate();
        if (i > 0) {
            System.out.println("插入成功@");
        }
        //6.关闭连接,释放资源(一定要做)先开后关
        preparedStatement.close();
        connection.close();
    }

事务1

要么都成功,要么都失败!
ACID原则:保证数据的安全。

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

例:转账:

A:1000 B:1000

A(900)--100-->B(1100)

Junit单元测试

依赖

   <!--单元测试-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
        </dependency>

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

public class TestJDBC03 {
    @Test
    public void test(){
        System.out.println("插入成功");
    }
}

失败的时候是红色:

事务2

转账原表

1.使用MySQL执行一条事务
start transaction; #开启事务
update account set money = money-100 where name ='张三';
commit;

结果

2.使用Java执行一条事务
public class TestJDBC03 {
    @Test
    public void test() {
        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "981204";
        Connection connection = null;
        //1.加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //2.连接数据库。代表数据库
            connection = DriverManager.getConnection(url, username, password);
            //3.通知数据库开启事务,false开启
            connection.setAutoCommit(false);
            String sql = "update account set money = money-100 where name = '张三'";
            connection.prepareStatement(sql).executeUpdate();
            //制造错误
            //int i = 1 / 0;
            String sql2 = "update account set money = money+100 where name = '李四'";
            connection.prepareStatement(sql2).executeUpdate();
            connection.commit();//以上两条SQL都执行成功了,就提交事务!
            System.out.println("success");
        } catch (Exception e) {
            try {
                //如果出现异常,就通知数据库回滚事务
                connection.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        } finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

结果

15、邮件发送

15.1、一个简单的邮件发送

15.1.1、

简单邮件:没 有附件和图片,纯文本邮件
复杂邮件:有附件和图片
要发送邮件,需要获得协议和支持!开启服务POP3/SMTP服务
授权码:ikteyhtmiwmieajb

15.1.2、流程

15.1.3、相关依赖

 <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>

15.1.4、java代码

package com.lenovo.mail;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

//发送一封简单的邮件
public class MailDemo01 {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com"); //// 设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议
        prop.setProperty("mail.smtp.auth", "true"); //需要验证用户名密码
        //关于Q邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        //使用JavaMail发送邮件的5个步骤
        //1、创建定义整个应用程序所需的环境信息的Session 对象
        //创建定义整个应用程序所需的环境信息的Session对象
        //QQ才有!其他邮箱就不用
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名授权码
                return new PasswordAuthentication("2458736697@qq.com", "ikteyhtmiwmieajb");
            }
        });
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);

        //2、通过session 得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com", "2458736697@qq.com", "ikteyhtmiwmieajb");
        //4、创建邮件:写邮件
        //注意需要传递Session;
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("2458736697@qq.com"));
        //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("2458736697@qq.com"));
        //邮件的标题
        message.setSubject("感谢秦老师教授的Java知识");
        //邮件的文本内容
        message.setContent("<h1 style='color: red'>你好啊!</h1>", "text/html; charset=UTF-8");
        //5.发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        //6.关闭连接
        ts.close();

    }
}

15.1.5、结果

15.2、带图片和附件的邮件发送

1、

MIME (多用途互联网邮件扩展类型)
MimeBodyPart类(javax.mailinternet.MimeBodyPart类)

MimeMultipart类

15.2.1、带图片的邮件

package com.lenovo.mail;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

//发送一封简单的邮件
public class MailDemo01 {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com"); //// 设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议
        prop.setProperty("mail.smtp.auth", "true"); //需要验证用户名密码
        //关于Q邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        //使用JavaMail发送邮件的5个步骤
        //1、创建定义整个应用程序所需的环境信息的Session 对象
        //创建定义整个应用程序所需的环境信息的Session对象
        //QQ才有!其他邮箱就不用
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名授权码
                return new PasswordAuthentication("2458736697@qq.com", "ikteyhtmiwmieajb");
            }
        });
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);

        //2、通过session 得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com", "2458736697@qq.com", "ikteyhtmiwmieajb");
        //4、创建邮件:写邮件
        //注意需要传递Session;
        MimeMessage message = new MimeMessage(session);
        //指明邮件的发件人
        message.setFrom(new InternetAddress("2458736697@qq.com"));
        //指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
        message.setRecipient(Message.RecipientType.TO, new InternetAddress("2458736697@qq.com"));
        //邮件的标题
        message.setSubject("感谢秦老师教授的Java知识");

        //=========================================================
        //邮件的文本内容
        //准备图片数据
        MimeBodyPart image = new MimeBodyPart();
        //图片需要经过数据处理... DataHandLer: 数据处理
        DataHandler dh = new DataHandler(new FileDataSource("D:\\Project\\IdeaProject\\mail\\src\\1.bmp"));
        image.setDataHandler(dh);//在我们的Body中放入这个处理的图片数据
        image.setContentID("bz.jpg");//给图片设置一个ID, 我们在后面可以使用!
        //准备正文数据.
        MimeBodyPart text = new MimeBodyPart();
        text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件", "text/html ;charset=UTF-8");
        //描述数据关系
        MimeMultipart mm = new MimeMultipart();
        mm.addBodyPart(text);
        mm.addBodyPart(image);
        mm.setSubType("related");
        //设置到消息中,保存修改
        message.setContent(mm);//把最后编辑好的邮件放到消息当中
        message.saveChanges();//保存修改!

        //=========================================================

        //5.发送邮件
        ts.sendMessage(message, message.getAllRecipients());
        //6.关闭连接
        ts.close();

    }
}

15.2.2、带图片和附件的邮件

package com.lenovo.mail;

import com.sun.mail.util.MailSSLSocketFactory;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.util.Properties;

public class MailDemo02 {
    public static void main(String[] args) throws Exception {
        Properties prop = new Properties();
        prop.setProperty("mail.host", "smtp.qq.com"); //// 设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol", "smtp"); //邮件发送协议
        prop.setProperty("mail.smtp.auth", "true"); //需要验证用户名密码
        //关于Q邮箱,还要设置SSL加密,加上以下代码即可
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        prop.put("mail.smtp.ssl.enable", "true");
        prop.put("mail.smtp.ssl.socketFactory", sf);

        //使用JavaMail发送邮件的5个步骤
        //1、创建定义整个应用程序所需的环境信息的Session 对象
        //创建定义整个应用程序所需的环境信息的Session对象
        //QQ才有!其他邮箱就不用
        Session session = Session.getDefaultInstance(prop, new Authenticator() {
            public PasswordAuthentication getPasswordAuthentication() {
                //发件人邮件用户名授权码
                return new PasswordAuthentication("2458736697@qq.com", "ikteyhtmiwmieajb");
            }
        });
        //开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
        session.setDebug(true);

        //2、通过session 得到transport对象
        Transport ts = session.getTransport();
        //3、使用邮箱的用户名和授权码连上邮件服务器
        ts.connect("smtp.qq.com", "2458736697@qq.com", "ikteyhtmiwmieajb");
        //4.连接上之后我们需要发送邮件;
        MimeMessage mimeMessage = imageMail(session);
        //5.发送邮件
        ts.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
        //6.关闭连接
        ts.close();
    }

    public static MimeMessage imageMail(Session session) throws MessagingException {
        //消息的固定信息
        MimeMessage mimeMessage = new MimeMessage(session);
        //邮件发送人
        mimeMessage.setFrom(new InternetAddress("2458736697@qq.com"));
        //邮件接收人,可以同时发送给很多人,我们这里只发给自己;
        mimeMessage.setRecipient(Message.RecipientType.TO, new InternetAddress("2458736697@qq.com"));
        mimeMessage.setSubject("我也不知道是个什么东西就发给你了"); //邮件主题
        /*
        编写邮件内容
        1.图片
        2.附件
        3.文本
        */
        //图片
        MimeBodyPart body1 = new MimeBodyPart();
        body1.setDataHandler(new DataHandler(new FileDataSource("D:\\Project\\IdeaProject\\mail\\src\\qq.jpg")));
        body1.setContentID("yhbxb.png"); //图片设置ID
        //文本
        MimeBodyPart body2 = new MimeBodyPart();
        body2.setContent("请注意,我不是广告<img src='cid:yhbxb.png'>","text/html; charset=utf-8");
        //附件
        MimeBodyPart body3 = new MimeBodyPart();
        body3.setDataHandler(new DataHandler(new FileDataSource("D:\\Project\\IdeaProject\\mail\\src\\main\\resource\\log4j.properties")));
        body3.setFileName("log4j.properties"); //附件设置名字
        MimeBodyPart body4 = new MimeBodyPart();
        body4.setDataHandler(new DataHandler(new FileDataSource("D:\\Project\\IdeaProject\\mail\\src\\main\\resource\\1.txt")));
        body4.setFileName(""); //附件设置名字
        //拼装邮件正文内容
        MimeMultipart multipart1 = new MimeMultipart();
        multipart1.addBodyPart(body1);
        multipart1.addBodyPart(body2);
        multipart1.setSubType("related"); //1. 文本和图片内嵌成功!
        //new MimeBodyPart(). setContent (multipart1); //将拼装好的正文内容设置为主体
        MimeBodyPart contentText = new MimeBodyPart();
        contentText.setContent(multipart1);
        //拼接附件
        MimeMultipart allFile = new MimeMultipart();
        allFile.addBodyPart(body3); //附件
        allFile.addBodyPart(body4); //附件
        allFile.addBodyPart(contentText);//正文
        allFile.setSubType("mixed"); //正 文和附件都存在邮件中,所有类型设置为mixed;
        //放到Message消息中
        mimeMessage.setContent(allFile);
        mimeMessage.saveChanges();//保存修改
        return mimeMessage;
    }
}

项目结构

15.2.3、JavaWeb网站注册成功发送邮件

项目结构

所需依赖

 <dependencies>
    <!--servlet的依赖-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
    </dependency>
    <!--jsp的依赖-->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>
    <!-- 小辣椒 -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.16.20</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

1.实体类

package com.lenovo.pojo;

import jdk.nashorn.internal.objects.annotations.Constructor;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
    private String username ;
    private String password;
    private String email;
}

2.发送邮件工具类

package com.lenovo.util;

import com.lenovo.pojo.User;
import com.sun.mail.util.MailSSLSocketFactory;

import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;

//网站3秒原则:用户体验
//多线程实现用户体验! (异步处理)
public class Sendmail extends Thread {
    //用于给用户发送邮件的邮箱
    private String from = "2458736697@qq.com";
    //邮箱的用户名
    private String username ="2458736697@qq.com";
    //邮箱的密码
    private String password = "ikteyhtmiwmieajb";
    //发送邮件的服务器地址
    private String host = "smtp.qq.com";

    private User user;

    public Sendmail(User user) {
        this.user = user;
    }

    //重写run方法的实现,在run方法中发送邮件给指定的用户
    @Override
    public void run() {
        try {
            Properties prop = new Properties();
            prop.setProperty("mail.host", host);
            prop.setProperty("mail.transport.protocol", "smtp");
            prop.setProperty("mail.smtp.auth", "true");
            //关于QQ邮箱。还要设置SSL加密,加上以下代码即可
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
            //1、创建定义整个应用程序所需的环境信息的Session对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、报权码
                    return new PasswordAuthentication("2458736697@qq.com", "ikteyhtmiwmieajb");
                }
            });
            //开启Sessiondebug模式,这样就可以查看到程序发送Email的运行状态
            session.setDebug(true);
            //2.通i过session 得transport对象
            Transport ts = session.getTransport();
            //3、使用邮前的用户名和技权码连上:邮件服务器
            ts.connect(host, username, password);
            //4、创建邮件
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(from)); //发件人
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(user.getEmail())); //收件人
            message.setSubject("用户注册邮件"); //邮件的标题
            String info = "基喜您注册成功,您的用户名:" + user.getUsername() + ",您的密码:" + user.getPassword() + ",请妥普保管,如有问题请联系网站客服!!";
            message.setContent(info, "text/html; charset=UTF-8");
            message.saveChanges();
            //发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

3.Servlet

package com.lenovo.servlet;

import com.lenovo.pojo.User;
import com.lenovo.util.Sendmail;
import com.sun.org.apache.bcel.internal.generic.NEW;

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

public class RegisterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //按收用户请求,封装成对象
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String email = request.getParameter("email");
        User user = new User(username, password, email);

        //用户注册成功之后,给用户发送一封邮件
        //我们使用线程米专们发送邮件,防止出现耗时,那网站注册人数过多的情况;
        Sendmail send = new Sendmail(user);
        //启动线程。线程启动之后就会执f行run方法来发送邮件
        send.start();
        //注册用户
        request.setAttribute("message", "注册成功,我们已经发了一封带了注册信息的电子邮件,请查收!如网络不稳定,可能过会儿才能收到! !");
        request.getRequestDispatcher("info.jsp").forward(request, response);

        System.out.println(username);
        System.out.println(password);
        System.out.println(email);

    }

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

4.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"
         metadata-complete="true">
  <servlet>
    <servlet-name>RegisterServlet</servlet-name>
    <servlet-class>com.lenovo.servlet.RegisterServlet</servlet-class>
  </servlet>
  <!--一一个Servlet对应一Mapping: 映射-->
  <servlet-mapping>
    <servlet-name>RegisterServlet</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/RegisterServlet.do</url-pattern>
  </servlet-mapping>

</web-app>

5.注册页面,提示页面

index.jsp

<%@ page contentType="text/html ;charset=UTF-8" language="java" %>
<html>
    <head>
        <title>注册</title>
    </head>
    <body>
        <form action="${pageContext.request.contextPath}/RegisterServlet.do" method="post">
            用户名: <input type="text" name="username"/><br/>
            密码: <input type="password" name="password"/><br/>
            邮箱: <input type="text" name="email"/><br/>
            <input type="submit" value="注册"/>
        </form>
    </body>
</html>

info.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java"%>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>xxx网站温馨提示</h1>
${message}
</body>
</html>

100、可能用到的依赖

1、Servlet

  <!--servlet的依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>
        <!--jsp的依赖-->
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>javax.servlet.jsp-api</artifactId>
            <version>2.3.3</version>
            <scope>provided</scope>
        </dependency>
        <!--JSTL的依赖-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <!-- standard标签库-->
        <dependency>
            <groupId>taglibs</groupId>
            <artifactId>standard</artifactId>
            <version>1.1.2</version>
        </dependency>
        <!--连接数据库-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.17</version>
        </dependency>
        <!--单元测试-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
        </dependency>




 <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.2</version>
    </dependency>
      <!-- https://mvnrepository.com/artifact/org.duracloud/common -->
      <dependency>
          <groupId>org.duracloud</groupId>
          <artifactId>common</artifactId>
          <version>6.0.0</version>
      </dependency>
    <!-- log4j -->
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <!-- 将java对象转化为json格式的对象 -->
    <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>fastjson</artifactId>
      <version>1.2.58</version>
    </dependency>




<!--文件上传,导入文件上传的jar包,commons-fileupload ,Maven会自动帮我们导入他的依赖包 commons-io包;-->
    <dependency>
      <groupId>commons-fileupload</groupId>
      <artifactId>commons-fileupload</artifactId>
      <version>1.3.3</version>
    </dependency>




<!-- 邮件发送相关依赖 -->
 <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>mail</artifactId>
      <version>1.4.7</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax.activation/activation -->
    <dependency>
      <groupId>javax.activation</groupId>
      <artifactId>activation</artifactId>
      <version>1.1.1</version>
    </dependency>
    

2、

 <dependencies>
     <!-- 小辣椒 
          @Data
          @NoArgsConstructor
          @AllArgsConstructor-->
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.16.20</version>
		<scope>provided</scope>
	</dependency>
	<!-- spring-context -->
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-context</artifactId>
		<version>4.3.3.RELEASE</version>
	</dependency>
     <!-- spring-webmvc -->
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-webmvc</artifactId>
		<version>4.3.3.RELEASE</version>
	</dependency>
     <!-- spring-mybatis -->
	<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring Spring整合Mybatis需要的整合包 -->
	<dependency>
		<groupId>org.mybatis</groupId>
		<artifactId>mybatis-spring</artifactId>
		<version>1.3.2</version>
	</dependency>
     <!-- AOP注解扫包 -->
	<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
	<dependency>
		<groupId>aopalliance</groupId>
		<artifactId>aopalliance</artifactId>
		<version>1.0</version>
	</dependency>
     <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->
	<dependency>
		<groupId>org.aspectj</groupId>
		<artifactId>aspectjweaver</artifactId>
		<version>1.8.10</version>
	</dependency>

	<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
	<dependency>
		<groupId>com.fasterxml.jackson.core</groupId>
		<artifactId>jackson-databind</artifactId>
		<version>2.9.8</version>
	</dependency>
     <!-- tx配置事务管理器 -->
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-tx</artifactId>
		<version>4.3.3.RELEASE</version>
	</dependency>

	<!-- 数据源 可以使用dbcp2,c3p0,druid... -->
	<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-dbcp2 -->
	<dependency>
		<groupId>org.apache.commons</groupId>
		<artifactId>commons-dbcp2</artifactId>
		<version>2.1.1</version>
	</dependency>
	<!-- 文件上传 -->
	<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
	<dependency>
		<groupId>commons-fileupload</groupId>
		<artifactId>commons-fileupload</artifactId>
		<version>1.3.3</version>
	</dependency>
	<!-- Jackson -->

	<!-- 配置声明式事务 -->
	<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-jdbc</artifactId>
		<version>4.3.3.RELEASE</version>
	</dependency>
	<!-- jedisjar -->
	<dependency>
		<groupId>redis.clients</groupId>
		<artifactId>jedis</artifactId>
		<version>2.9.0</version>
	</dependency>
	<!-- 连接池 -->
	<!-- https://mvnrepository.com/artifact/commons-pool/commons-pool -->
	<dependency>
		<groupId>commons-pool</groupId>
		<artifactId>commons-pool</artifactId>
		<version>1.5.6</version>
	</dependency>
	<!-- spring整合Redis包 -->
	<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
	<dependency>
		<groupId>org.springframework.data</groupId>
		<artifactId>spring-data-redis</artifactId>
		<version>1.6.0.RELEASE</version>
	</dependency>
 </dependencies>

3、pom.xml中设置资源通配

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

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

4、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"
         metadata-complete="true">
  

</web-app>

5、web.xml中可以配置

	<display-name>Archetype Created Web Application</display-name>


  <!--web. xmL中是配置我们web的核心应用-->
  <!--注册ServLet-->
  <servlet>
    <servlet-name>helloselvlet</servlet-name>
    <servlet-class>com.lenovo.servlet.Servlet02</servlet-class>
  </servlet>
  <!--一一个Servlet对应一Mapping: 映射-->
  <servlet-mapping>
    <servlet-name>helloselvlet</servlet-name>
    <!--映射的请求路径-->
    <url-pattern>/zhuchengbo</url-pattern>
  </servlet-mapping>


 <!--配置一些web应用初始化参数-->
   <context-param>
       <param-name>url</param-name>
       <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
   </context-param>
  <servlet>
    <servlet-name>url</servlet-name>
    <servlet-class>com.lenovo.servlet.ServletDemo03</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>url</servlet-name>
    <url-pattern>/url</url-pattern>
  </servlet-mapping>


	<!--注册监听器-->
    <listener>
        <listener-class>com.lenovo.filter.listener</listener-class>
    </listener>


    <!--设置Session默认的失效时间:真实业务需球-->
    <session-config>
        <!--15 分钟后Session自动失效。以分钟为单位-->
        <session-timeout>1</session-timeout>
    </session-config>


 	<!--设置欢迎页面-->
	<!--启动服务器后直接展示的页面-->
    <welcome-file-list>
    	<welcome-file>admin_login.jsp</welcome-file>
    </welcome-file-list>


  	<!--用户登录过滤器-->
	<!--设置admin_list.jsp不能直接访问,需要先进行登录-->
    <filter>
        <filter-name>SysFilter</filter-name>
        <filter-class>com.neuedu.filter.SysFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SysFilter</filter-name>
        <url-pattern>/admin_list.jsp</url-pattern>
    </filter-mapping>


posted on 2020-04-01 13:21  月佩半琪  阅读(379)  评论(0编辑  收藏  举报