JAVAWeb

Servlet API

<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
    <scope>provided</scope>
</dependency> 

Jsp API

<!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
    <scope>provided</scope>
</dependency>

静态Web

  • html,css
  • 提供给所有人看的数据始终不会发生变化!

动态web

  • 淘宝,几乎是所有的网站
  • 提供给所有看的数据始终会发生变化,每个人在不同的时间不同的地点看到的信息各不相同
  • 技术栈:Servlet/JSP , ASP ,PHP

在java中,动态Web资源开发的技术统称为JavaWeb

Web应用程序

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

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

  • html css js
  • jsp servlet
  • java程序
  • jar包
  • 配置文件(properties)

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

静态web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2IzLd1En-1659084486640)(D:\桌面\javaPicture\1646894856582.png)]

缺点 :web页面无法动态更新,所有用户看到都是同一个页面

动态web

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nVq4kW94-1659084486641)(D:\桌面\javaPicture\1646894977372.png)]

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

优点:web页面可以动态更新,所有用户看到都不是同一个页面,可以与数据库交互.

安装TomCat

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

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

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

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

测试网站:localhost:8080

可能遇到的问题:

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

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

可以配置端口号

<Connector port="8080" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

配置主机名称 需先到host文件里修改本机名

  <Host name="localhost"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VU5zK0Z9-1659084486646)(C:\Users\ADMINI~1\AppData\Local\Temp\1646910035634.png)]

访问网站过程

  1. 输入一个域名
  2. 检查本机host文件下有没有该域名的映射,有的话返回对应的IP地址,如果该ip地址有对应的web应用程序,则直接访问
  3. 没有该域名的映射的话去DNS服务器找,找到的话就返回改地址并访问,没有的话就返回找不到;

Http响应

200:请求响应成功

3xx:请求重定向

404:资源不存在

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

Maven

我为什么要学习这个技术

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

Maven项目架构管理工具

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yj1cBZaR-1659084486646)(C:\Users\ADMINI~1\AppData\Local\Temp\1646920849742.png)]

配置环境变量

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

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

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

阿里云镜像

  • 镜像:mirrors

    • 作用:加速我们的下载
  • 国内建议使用阿里云的镜像

  • <!--配置阿里云镜像-->
    <mirror>
       <id>alimaven</id>
       <mirrorOf>central</mirrorOf>
       <name>aliyun maven</name>
       <url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
      </mirror>
    
![image-20211225102033517](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225102033517.png)

## 测速是否配置成功

![image-20211225103337412](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225103337412.png)

![image-20211225103429106](C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211225103429106.png)

# 本地仓库

在本地的仓库,远程仓库;

**建立一个本地仓库**: localRepository

​```xml
  <localRepository>D:\环境\apache-maven-3.8.4\maven-repo</localRepository>

发布一个web网站

-- webapps:Tomcat服务器的web目录
  -ROOT
  -zhangyu:网站的目录名
  -WEB-INF
  -classes:java程序
  -lib.web 应用锁依赖的jar包
  -web.xml:网站配置文件
  -index.html
  -static
  -css
  -js
  img
  .....

在IDEA中使用Maven

  1. 启动idea
  2. 创建一个maven项目

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMfXqlCa-1659084486649)(D:\桌面\javaPicture\1646984512388.png)]

创建一个普通的Maven项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNwwMhHR-1659084486649)(D:\桌面\javaPicture\1646985047072.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EkX0UxgC-1659084486650)(D:\桌面\javaPicture\1646985127659.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SOuVMSZM-1659084486650)(D:\桌面\javaPicture\1646985070501.png)][外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JVTx5b9H-1659084486650)(D:\桌面\javaPicture\1646985241397.png)]

标记文件夹功能

方法一

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6DbAOQv-1659084486651)(D:\桌面\javaPicture\1646985494990.png)]

方法二

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPn5kj43-1659084486651)(D:\桌面\javaPicture\1646985848230.png)]

配置Tomcat

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cKVG0fGn-1659084486651)(D:\桌面\javaPicture\1646985934148.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PRxgIwLE-1659084486651)(D:\桌面\javaPicture\1646986066256.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uLH7eMw7-1659084486652)(D:\桌面\javaPicture\1646986165167.png)]

解决警告:

为什么会有警告:我们访问网站必须要指定一个文件夹的名字(必须要解决该警告)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pQMcC0sI-1659084486652)(D:\桌面\javaPicture\1646986479939.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4hRXDlus-1659084486652)(D:\桌面\javaPicture\1646986631734.png)]

pom文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4sxcJVEG-1659084486653)(D:\桌面\javaPicture\1647002132882.png)]

<!-- 在bulid中配置resource 来防止资源导出失败的问题  并不是每个人都会遇到 遇到时可以使用-->
<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

问题

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

替换

webapp 头文件

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vvApzPy2-1659084486654)(D:\桌面\javaPicture\1647009308427.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZVkr6kN-1659084486654)(D:\桌面\javaPicture\1647009348228.png)]

source和javadoc爆红 下载source和doc就行

Servlet

  • Sun公司开发动态web的一门技术

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

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

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

    HelloServle

    Servlet API

    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency> 
    

    Jsp API

    <!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api -->
    <dependency>
        <groupId>javax.servlet.jsp</groupId>
        <artifactId>javax.servlet.jsp-api</artifactId>
        <version>2.3.3</version>
        <scope>provided</scope>
    </dependency>
    
    
    1. 构建一个Maven项目,删掉里面的src目录,以后就在这个项目里建Moudel;这个空的工程就是Maven工程;

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

      • 父项目中会有一个Modules

      • <modules>
            <module>Servlet-01</module>
        </modules>
        

        parents

      • 子项目中会有parent 如果没有就手动添加一下

      • <parent>
          <groupId>com.DYZ</groupId>
          <artifactId>JavaWeb-01-Servlet</artifactId>
          <version>1.0-SNAPSHOT</version>
        </parent>
        
    3. 父项目中的依赖子项目可以直接使用 //son extends father

    4. Maven环境优化

      • 修改web.xml为最新的
      • 将maven的结构搭建完成(java resources)
    5. 编写一个servlet程序

      • 编写一个普通类
      • 实现Servlet接口,直接继承HttpServlet
package com.DYZ;

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 HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        PrintWriter writer = resp.getWriter();//响应流  回应请求(写)
        writer.print("Hello Servlet");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
  1. 编写Servlet的映射

    为什么需要映射:我们写的是JAVA程序,但是要通过浏览器访问,而浏览器需要连接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">
        <!--注册Servlet-->
        <servlet>
            <!-- servlet名字-->
            <servlet-name>hello</servlet-name>
            <!-- 在web服务器上注册的地址-->
            <servlet-class>com.DYZ.HelloServlet</servlet-class>
        </servlet>
        <!-- servlet的请求路径-->
        <servlet-mapping>
            <!-- servlet名字-->
            <servlet-name>hello</servlet-name>
           <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
            <url-pattern>hello</url-pattern>
        </servlet-mapping>
    </web-app>
    
  2. 配置Tomcat

    配置项目发布的路径

Servlet原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2zkoikDP-1659084486655)(D:\桌面\javaPicture\1647606827204.png)]

Mapping问题

  1. 一个Servlet可以有多个映射路径

  2. 一个Servlet可以指定一个通用的映射路径

    <servlet-mapping>
        <!-- servlet名字-->
        <servlet-name>hello</servlet-name>
        <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
        <url-pattern>/hello/*</url-pattern>  <!-- /hello 后面输任何数据都能进入目标网址不输也可以>
    </servlet-mapping>
    
  3. 指定映射路径的后缀

    <servlet-mapping>
        <!-- servlet名字-->
        <servlet-name>hello</servlet-name>
        <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
        <url-pattern>*.DYZ</url-pattern>   <!-- 只要以.DYZ结尾的映射路径都可以访问到目标Servlet网址>
    </servlet-mapping>
    
  4. *.hello前面不能加路径

    <!-- servlet的请求路径-->
    <servlet-mapping>
        <!-- servlet名字-->
        <servlet-name>error</servlet-name>
        <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
        <url-pattern>/*.hello</url-pattern>
    </servlet-mapping>
    
<!-- servlet的请求路径-->
<servlet-mapping>
    <!-- servlet名字-->
    <servlet-name>error</servlet-name>
    <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
    <url-pattern>/hello/*.hello</url-pattern>
</servlet-mapping>
  1. 优先级

    当Servlet映射的地址是/*首页将默认为该页,如果输入另一个Servlet映射的地址则会跳转到该地址对应的页面,不会/*页面冲突

    <!--注册Servlet-->
    <servlet>
        <!-- servlet名字-->
        <servlet-name>hello</servlet-name>
        <!-- 在web服务器上注册的地址-->
        <servlet-class>com.DYZ.HelloServlet</servlet-class>
    </servlet>
    <!-- servlet的请求路径-->
    <servlet-mapping>
        <!-- servlet名字-->
        <servlet-name>hello</servlet-name>
        <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
    <!--注册Servlet-->
    <servlet>
        <!-- servlet名字-->
        <servlet-name>error</servlet-name>
        <!-- 在web服务器上注册的地址-->
        <servlet-class>com.DYZ.error</servlet-class>
    </servlet>
    <!-- servlet的请求路径-->
    <servlet-mapping>
        <!-- servlet名字-->
        <servlet-name>error</servlet-name>
        <!-- 创建能够在浏览器上访问映射在web服务器上注册的地址-->
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    

ServletContext

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

整个会话和整个web应用的区别

● 客户端请求Web服务器时,针对每次HTTP请求,Web服务器都会创建一个HttpServletRequest对象,该对象只能保存本次请求所传递的数据。由于购买和结账是两个不同的请求,因此,在发送结账请求时,之前购买请求中的数据将会丢失。

● 使用ServletContext对象保存数据时,由于同一个Web应用共享的是同一个ServletContext对象,因此,当用户在发送结账请求时,由于无法区分哪些商品是哪个用户所购买的,而会将该购物网站中所有用户购买的商品进行结算,这显然也是不可行的。

为了保存会话过程中产生的数据,在Servlet技术中,提供了两个用于保存会话数据的对象,分别是Cookie和Session。关于Cookie和Session的相关知识,将在下面的小节进行详细讲解。

共享数据

我在Servlet中保存的数据,可以在另一个Servlet中拿到

  • 创建放置数据的类

    package com.DYZ.servlet;
    
    import javax.servlet.ServletContext;
    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 HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("Hello");
    //      this.getInitParameter()//初始化参数
    //      this.getServletConfig();//servlet配置
            ServletContext context = this.getServletContext();//
            String userName="张宇";
            context.setAttribute("userName",userName);//设置一个键值对的形式保存在Servletcontext中将一个数据保存在
    
    
        }
    }
    
  • 创建读取数据的类

    package com.DYZ.servlet;
    
    import javax.servlet.ServletContext;
    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 getServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            ServletContext context = this.getServletContext();
            String useName = (String) context.getAttribute("userName");
            resp.setContentType("text/html");
            resp.setCharacterEncoding("utf8");
            PrintWriter writer = resp.getWriter();
            writer.println("名字为:"+useName);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
  • 配置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">
        
        <servlet>
            <servlet-name>hello1</servlet-name>
            <servlet-class>com.DYZ.servlet.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>hello1</servlet-name>
            <url-pattern>/helloservlet</url-pattern>
        </servlet-mapping>
        <servlet>
            <servlet-name>hello2</servlet-name>
            <servlet-class>com.DYZ.servlet.getServlet</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>hello2</servlet-name>
            <url-pattern>/getservlet</url-pattern>
        </servlet-mapping>
    </web-app>
    

获取初始化参数

<!-- 创建初始化参数-->
<context-param>
    <param-name>url</param-name>
    <param-value>jdbc:mysql://localhost:8080/mybatis</param-value>
</context-param>
package com.DYZ.servlet;

import javax.servlet.ServletContext;
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 ServletDemo01 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);
    }
}

请求转发

转发的特点

  1. 地址栏不发生变化,显示的是上一个页面的地址

  2. 请求次数:只有1次请求

  3. 根目录:http://localhost:8080/项目地址/,包含了项目的访问地址

  4. 请求域中数据不会丢失

  5. //转发时页面名称是什么路径就是什么不需要加斜杠(如果页面路径没有斜杠 转发到Servlet页面有斜杠)
    
<servlet>
    <servlet-name>ServletDemo02</servlet-name>
    <servlet-class>com.DYZ.servlet.ServletDemo02</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo02</servlet-name>
    <url-pattern>/servletdemo02</url-pattern>
</servlet-mapping>
package com.DYZ.servlet;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
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 ServletDemo02 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        //转发的请求路径
        RequestDispatcher requestDispatcher = context.getRequestDispatcher("/getservlet");
        //调用forward进行转发
        requestDispatcher.forward(req,resp);
    }

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

读取资源文件

资源文件的绝对路径要在是在WEB-INF里的路径而不是在classes里的(class里是java自己生成的100%会有 web-inf里的是网页生成如果没有需要加一段web代码)

<!-- 在bulid中配置resource 来防止资源导出失败的问题  并不是每个人都会遇到 遇到时可以使用-->
<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/java</directory>
      <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
      </includes>
      <filtering>true</filtering>
    </resource>
  </resources>
</build>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Fofo5Utt-1659084486660)(C:\Users\ADMINI~1\AppData\Local\Temp\1647236509123.png)]

properties

username=root
password=123456
<servlet>
    <servlet-name>ServletDemo04</servlet-name>
    <servlet-class>com.DYZ.servlet.ServletDemo04</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ServletDemo04</servlet-name>
    <url-pattern>/servletdemo04</url-pattern>
</servlet-mapping>
package com.DYZ.servlet;

import javax.servlet.ServletContext;
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.InputStream;
import java.util.Properties;

public class ServletDemo04 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
        InputStream stream = context.getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties properties = new Properties();
        properties.load(stream);
        String username = properties.getProperty("username");
        String password = properties.getProperty("password");
        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf8");
        resp.getWriter().println("账号:"+username);
        resp.getWriter().println("密码:"+password);
    }

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

HttpServletResponse

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

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

简单分类

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

  • public PrintWriter getWriter() throws IOException;
    
  • public ServletOutputStream getOutputStream() throws IOException;
    

负责向浏览器发送响应头

  • public void setCharacterEncoding(String charset);
    
  • public void setContentType(String type);
    
    public void setContentLengthLong(long len);
    
  • public void setContentLength(int len);
    
  • public void setDateHeader(String name, long date);
        
    public void addDateHeader(String name, long date);
        
    public void setHeader(String name, String value);
    
    public void addHeader(String name, String value);
    
    public void setIntHeader(String name, int value);
    
    public void addIntHeader(String name, int value);
    

    响应状态码

        public static final int SC_CONTINUE = 100;
    
    
        public static final int SC_SWITCHING_PROTOCOLS = 101;
    
     
        public static final int SC_OK = 200;
    
    
        public static final int SC_CREATED = 201;
    
    
        public static final int SC_ACCEPTED = 202;
    
        public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    
    
        public static final int SC_NO_CONTENT = 204;
    
        public static final int SC_RESET_CONTENT = 205;
    
    
        public static final int SC_PARTIAL_CONTENT = 206;
    
    
        public static final int SC_MULTIPLE_CHOICES = 300;
    
    
        public static final int SC_MOVED_PERMANENTLY = 301;
    
    
        public static final int SC_MOVED_TEMPORARILY = 302;
    
    
        public static final int SC_FOUND = 302;
    
     
        public static final int SC_SEE_OTHER = 303;
    
    
        public static final int SC_NOT_MODIFIED = 304;
    
        public static final int SC_USE_PROXY = 305;
    
    
        public static final int SC_TEMPORARY_REDIRECT = 307;
    
    
        public static final int SC_BAD_REQUEST = 400;
    
     
        public static final int SC_UNAUTHORIZED = 401;
    
    
        public static final int SC_PAYMENT_REQUIRED = 402;
    
    
        public static final int SC_FORBIDDEN = 403;
    
    
        public static final int SC_NOT_FOUND = 404;
    
    
        public static final int SC_METHOD_NOT_ALLOWED = 405;
    
    
        public static final int SC_NOT_ACCEPTABLE = 406;
    
        public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    
      
        public static final int SC_REQUEST_TIMEOUT = 408;
    
        public static final int SC_CONFLICT = 409;
    
    
        public static final int SC_GONE = 410;
    
    
        public static final int SC_LENGTH_REQUIRED = 411;
    
        public static final int SC_PRECONDITION_FAILED = 412;
    
    
        public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    
    
        public static final int SC_REQUEST_URI_TOO_LONG = 414;
    
    
        public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    
    
        public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    
    
        public static final int SC_EXPECTATION_FAILED = 417;
    
    
        public static final int SC_INTERNAL_SERVER_ERROR = 500;
    
    
        public static final int SC_NOT_IMPLEMENTED = 501;
    
        public static final int SC_BAD_GATEWAY = 502;
    
    
        public static final int SC_SERVICE_UNAVAILABLE = 503;
    
    
        public static final int SC_GATEWAY_TIMEOUT = 504;
    
    
        public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
    

    常用应用

    1. 向浏览器输出消息

    2. 下载文件

      • 要获取文件的路径

      • 下载文件名是什么

      • 设置办法让浏览器能够支持下载我们需要的东西

      • 获取下载文件的输入流

      • 创建缓冲区

      • 获取OutputStream对象

      • 将FileOutputStream流写入到buffer缓冲区

      • 使用OutputStream将缓冲区中的数据输入到客户端

        package com.DYZ.Servlet;
        
        import javax.servlet.ServletContext;
        import javax.servlet.ServletException;
        import javax.servlet.ServletOutputStream;
        import javax.servlet.http.HttpServlet;
        import javax.servlet.http.HttpServletRequest;
        import javax.servlet.http.HttpServletResponse;
        import java.io.FileInputStream;
        import java.io.IOException;
        import java.io.InputStream;
        import java.net.URLEncoder;
        
        public class FileServlet extends HttpServlet {
            @Override
            protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //       - 要获取文件的路径
                ServletContext context = this.getServletContext();//获取上下文
                String realPath = "D:\\桌面\\project\\JavaWeb\\JavaWeb-01-Servlet\\response\\src\\main\\resources\\1.jpg";//获取文件的绝对路径
        //       - 下载文件名是什么
                String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);//引用字符串中的字符要变为转义字符
        //       - 设置办法让浏览器能够支持下载我们需要的东西
                resp.setHeader("Content-Disposition","attachment;filename="+ URLEncoder.encode(fileName,"UTF8"));
                /*
                格式说明: content-disposition = "Content-Disposition" ":" disposition-type *( ";" disposition-parm )  
        字段说明:Content-Disposition为属性名disposition-type是以什么方式下载,如attachment为以附件方式下载
                 */
        //       - 获取下载文件的输入流
                FileInputStream fileInputStream = new FileInputStream(realPath);
        //       - 创建缓冲区
                byte[] b=new byte[1024];
                int count;
        //       - 获取OutputStream对象
                ServletOutputStream outputStream = resp.getOutputStream();
        //       - 将FileOutputStream流写入到buffer缓冲区,使用OutputStream将缓冲区中的数据输入到客户端
                while((count=fileInputStream.read(b))!=-1){
                    outputStream.write(b,0,count);
                }
                fileInputStream.close();
                outputStream.close();
            }
        
            @Override
            protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
               doGet(req, resp);
            }
        }
        
        

验证码功能

验证怎么来的?(熟悉就行)

  • package com.DYZ.Servlet;
    
    import javax.imageio.ImageIO;
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.awt.*;
    import java.awt.image.BufferedImage;
    import java.io.IOException;
    import java.util.Random;
    
    public class ImageServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //图片设置每3秒自动刷新一次
            resp.setHeader("refresh","0.1");
            //在内存中创建一个图片
            BufferedImage image = new BufferedImage(80, 100, BufferedImage.TYPE_INT_RGB);
            //得到图片 创建画笔
            Graphics2D graphics =(Graphics2D) image.getGraphics();
            //设置图片背景颜色
            graphics.setColor(Color.white);
            graphics.fillRect(0,0,80,100);
            //给图片写数据
            graphics.setColor(Color.blue);
            graphics.setFont(new Font(null,Font.BOLD,20));
            graphics.drawString(makeNum(),0,20);
            //告诉浏览器你消息打开的方式
            resp.setContentType("image/jpg");
            //网站存在缓存,不让浏览器缓存
            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 stringBuffer = new StringBuffer();
            for (int i=0;i<7-num.length();i++){
                stringBuffer.append(0);
            }
            String s=stringBuffer.toString()+num;
            return num;
        }
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

重定向

  1. 地址栏:显示新的地址
  2. 请求次数:2次
  3. 根目录:http://localhost:8080/ 没有项目的名字
  4. 请求域中的数据会丢失,因为是2次请求
package com.DYZ.Servlet;

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 RedirectServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       /* resp.setHeader("Location","/r/download");
        resp.setStatus(302); //设置状态码
        */
        resp.sendRedirect("/response_war/download1");//重定向  需要加上Tomcat中的上级目录

    }

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

重定向和转发的区别

相同点:都会实现页面跳转

不同点:请求转发,url不会发生变化,重定向url会发生变化(变化为重定向页面的url)

对于重定向中的第一个/ :表示的是项目服务器的根目录 表示的是localhost:8080/     如果不指定mg就无法找到具体项目,出现404无法找到资源路径。

对于请求转发中的第一个/:表示服务器中项目的名称mg 表示”localhost:8080/mg(项目的名)/ 也就是到大了webapp

登录重定向

<html>
<body>
<h2>Hello World!</h2>
<!-- 点提交就会跳转到login界面-->
<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>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<h1>Success</h1>
</body>
</html>
package com.DYZ.Servlet;

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 RequestTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("进入请求了!");
        //处理请求
        String username = req.getParameter("username");//从请求中获取参数
        String password = req.getParameter("password");//从请求中获取参数
        System.out.println(username+":"+password);
        resp.sendRedirect("/response_war/success.jsp");
    }

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

HttpServletRequest

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBQNdf5o-1659084486661)(D:\桌面\javaPicture\1647489739540.png)]

获取前端传送的参数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4orJpKGG-1659084486662)(D:\桌面\javaPicture\1647490153696.png)]

请求转发

index.jps

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/15 0015
  Time: 13:31
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>login</title>
</head>
<body>
<div>
    <form action="${pageContext.request.contextPath}/login" method="post">
        用户名: <input type="text" name="username"> </br>
        密码: <input type="password" name="password"></br>
        爱好:
        <input type="checkbox" name="hobbies" value="swim">游泳
        <input type="checkbox" name="hobbies" value="basketball">篮球
        <input type="checkbox" name="hobbies" value="game">游戏
        </br>
        <input type="submit" name="submit">
    </form>
</div>

</body>
</html>

LoginServlet

package com.DYZ.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.util.Arrays;

public class LonginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置接受前端输入数据时采用的编码 防止接受乱码
        req.setCharacterEncoding("utf8");
        //设置回复给前端时采用的编码 防止接受乱码
       resp.setContentType("text/html");
        resp.setCharacterEncoding("utf8");
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String[] hobbies = req.getParameterValues("hobbies");
        System.out.println(username);
        System.out.println(password);
        System.out.println(Arrays.toString(hobbies));
        //通过请求转发
        resp.setContentType("text/html");
        //这里的/代表当前的web应用
        req.getRequestDispatcher("/success.jsp").forward(req,resp);
    }

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

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/17 0017
  Time: 12:49
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登陆成功</title>
</head>
<body>
<h1>登陆成功</h1>

</body>
</html>

Cookies Sessions

会话

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

有状态回话

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

保存会话的两种技术

cookie

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

session

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

Cookie通过在客户端记录信息确定用户身份Session通过在服务器端记录信息确定用户身份

package com.DYZ.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;

public class Cookiedemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        resp.setCharacterEncoding("utf8");
        PrintWriter out = resp.getWriter();
        //客户端向服务器发送请求request,其中携带cookie,从request中获取cookie
        Cookie[] cookies = req.getCookies();
        if(cookies!=null){
            out.println("你上一次记访问的时间是:");
            for (Cookie cookie : cookies) {
                if(cookie.getName().equals("LastLoginTime")){
                    //new Date()里面必须是Long类型的时间数据 所以通过parseLong将字符串转换成Long
                    long lastTime = Long.parseLong(cookie.getValue());
                    out.write(new Date(lastTime).toLocaleString());
                }
            }
        }
        //服务器给客户端一个cookie
        Cookie cookie = new Cookie("LastLoginTime",System.currentTimeMillis()+""); //+""变成字符串 或者用String.valueof
        //设置cookie的有效期为1天
        cookie.setMaxAge(60*60*24);
        //给当前访问的客户端设置cookie
        resp.addCookie(cookie);

    }

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

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

删除cookie

package com.DYZ.servlet;

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

public class Cookiedemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //创建一个cookie 与之前设置的cookie的name(键)要相同 因为键不能重复 相同的键就会替换掉之前的值
        Cookie cookie = new Cookie("LastLoginTime", System.currentTimeMillis() + "");
        //设置cookie的有效值为0
        cookie.setMaxAge(0);
        resp.addCookie(cookie);

    }

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

Session

什么是Session:

  • 服务器会给每一个用户(浏览器)创建一个Session对象.
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在.
  • 用户登录只有,整个网站他都可以访问.
package com.DYZ.servlet;

import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;

public class Sessiondemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf8");
        resp.setCharacterEncoding("utf8");
        resp.setContentType("text/html;charset=utf8");
        //从客户端得到一个session(服务器会给自动每个客户端创建一个session,每个session都会自带一个sessionId(类似于创建cookie))
        HttpSession session = req.getSession();
        //往session中存东西
        session.setAttribute("name",new Person("张宇",20)); //既可以存字符串也可以存对象
        //得到sessionId
        String id = session.getId();
        //判断session是不是新的
        if(session.isNew()){
            System.out.println("恭喜Session成功创建,ID为"+id);
            resp.getWriter().println("恭喜Session成功创建,ID为"+id);
        }
        else{
            System.out.println("Session已经在服务器中存在了,ID为"+id);
            resp.getWriter().println("Session已经在服务器中存在了,ID为"+id);
        }
        //系统自动创建Session时的操作
//        Cookie cookie = new Cookie("JSESSIONID", "sessionId");
//        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       doGet(req, resp);
    }
}
package com.DYZ.servlet;

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

public class Sessiondemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       req.setCharacterEncoding("utf8");
       resp.setCharacterEncoding("utf8");
       resp.setContentType("text/html;charset=utf8");
       //得到Session
        HttpSession session = req.getSession();
        Person name =(Person) session.getAttribute("name");
        System.out.println("Session的属性为"+name.toString());
        resp.getWriter().println("Session的属性为"+name.toString());
    }

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

手动注销session

package com.DYZ.servlet;

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

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

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

自动注销

<session-config>
    <!-- session失效时间 以分钟为单位-->
    <session-timeout>1</session-timeout>
</session-config>

Session和Cookie的区别

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)
  • Session由服务器创建,用户通过Servlet地址访问服务器,服务器传给用一个SessionID(即cookie),Session中保存的东西在服务器中,通过唯一的一个SessionId访问.

Session使用场景:

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

Jsp

什么是jsp

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

最大的特点:

  • 写JSP就像在写HTML
  • 区别:
    • HTML只给用户提供静态的数据
    • JSP页面中可以嵌入JAVA代码,为用户提供动态数据.

JSP原理

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

Jsp最终也会被转换成为一个java类

JSP本质上就是一个Servlet(继承了Servlet接口的java程序)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5oBPSbWR-1659084486663)(D:\桌面\javaPicture\1647606379022.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BDIhAl4T-1659084486664)(C:\Users\ADMINI~1\AppData\Local\Temp\1647606757491.png)]

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

out.write("<html>\r\n")

这样的格式

JSP基础语法

JSP表达式和脚本片段

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/18 0018
  Time: 20:55
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
  <head>
    <title>$Title$</title>
  </head>
  <body>
  <%--JSP表达式 作用:将程序的输出 输出到客户端--%>
  <%=new java.util.Date()%>
  <%--脚本片段--%>
  <%
    int sum=0;
    for (int i=0;i<10;i++){
      sum=sum+i;
    }
   out.println("<h1>SUM="+sum+"</h1>");
  %>


  </body>
</html>
<%
  for(int i=0;i<10;i++){
%>
<%=i%>或者 ${i}
<h1>Hello world!</h1>
<%
  }
%>

JSP声明

<%--放在jspservice方法外面,所以没有jsp的内置方法out,需要用java的输出方法--%>
<%!
  static{
    System.out.println("这是在");
  }
  public void Zhang(){
    System.out.println("张宇!!!");
  }
%>

定制错误页面

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EwqmXpNP-1659084486665)(D:\桌面\javaPicture\1647611267772.png)]

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

或者在web.xml界面

<error-page>
    <error-code>404</error-code>
    <location>/error/404.jsp</location>
</error-page>
<error-page>
    <error-code>500</error-code>
    <location>/error/500.jsp</location>
</error-page>
<body>
<%-- 拼接页面 本质还是三个页面 顶部和底部页面独立到主体外面--%>
<%@include file="Common/TOP.jsp"%>
<h1>主体</h1>
<%@include file="Common/foot.jsp"%>
<hr>
<jsp:include page="Common/TOP.jsp"></jsp:include>
<jsp:include page="Common/foot.jsp"></jsp:include>

</body>

JSP内置对象及其作用域

<%@ page import="java.beans.AppletInitializer" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/19 0019
  Time: 15:27
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
    pageContext.setAttribute("name","张宇");//保存的数据只在一个页面中有效
    request.setAttribute("name2","张宇");//保存的数据只在一次请求中有效
    session.setAttribute("name3","张宇");//保存的数据只在一次绘画中有效,即打开和关闭浏览器
    application.setAttribute("name4","张宇");//保存的数据只在服务器中有效,从打开服务器到关闭服务器
%>
<%--EL表达式--%>
<%
    String name =(String) pageContext.getAttribute("name");
    String name2 =(String) request.getAttribute("name2");
    String name3 =(String) session.getAttribute("name3");
    String name4 =(String) application.getAttribute("name4");
%>

<h1>属性为:</h1>
<h1>${name}</h1>
<h1>${name2}</h1>
<h1>${name3}</h1>
<h1>${name4}</h1>

</body>

</html>

request里面存用户看完就没用的比如新闻

session存放用户看完还有用的 比如购物车

application存放一个用户看完了其他用户还有用的比如聊天数据

JSP标签 JSTL标签 EL表达式

EL表达式:${}

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

jsp标签

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/19 0019
  Time: 16:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<jsp:forward page="jsp5.jsp">
    <jsp:param name="name" value="zhangyu"/>
    <jsp:param name="age" value="22"/>
</jsp:forward>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/19 0019
  Time: 16:39
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
姓名:<%=request.getParameter("name")%>
年龄:<%=request.getParameter("age")%>
</body>
</html>

JSTL标签库使用步骤

  • 引入对应的taglib
  • 使用其中的方法
  • 在Tomcat lib文件夹下也需要引入jstl包和standard包
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/19 0019
  Time: 16:52
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="jsp6.jsp" method="get">
    <%-- EL表达式获取表单中的数据
        ${param.参数名}}--%>
       用户名: <input type="text" name="username" value="${param.username}">
        <hr>
        <input type="submit" value="登录">
        <!-- 判断是不是管理员登录-->
    <c:if test="${param.username=='admin'}" var="isadmin">
        <c:out value= "欢迎您,管理员!"/>
    </c:if>
</form>

</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/19 0019
  Time: 17:36
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<c:set var="score" value="85"/>
    <c:choose>
        <c:when test="${score}>=90">
           成绩优秀
        </c:when>
        <c:when test="${score}>=80">
           成绩良好
        </c:when>
        <c:when test="${score}>=70">
           成绩中等
        </c:when>
    </c:choose>
</body>
</html>

JavaBean

实体类

JavaBean有特定的写法:

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

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

ORM:对象关系映射

  • 表–>类
  • 字段—>属性
  • 行记录—>对象
<%@ page import="com.DYZ.pojo.Person" %><%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/19 0019
  Time: 18:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<%
//    Person person = new Person();
//    person.setAddress();
//    person.setAge();
//    person.setId();
//    person.setName();
%>
<jsp:useBean id="person" class="com.DYZ.pojo.Person" scope="page"/>
<jsp:setProperty name="person" property="address" value="江宁区"/>
<jsp:setProperty name="person" property="name" value="张宇"/>
<jsp:setProperty name="person" property="age" value="22"/>
<jsp:setProperty name="person" property="id" value="1"/>

ID:<jsp:getProperty name="person" property="id"/>
姓名:<jsp:getProperty name="person" property="name"/>
年龄:<jsp:getProperty name="person" property="age"/>
地址:<jsp:getProperty name="person" property="address"/>
</body>
</html>

MVC 三层架构

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jCYsG5OT-1659084486666)(D:\桌面\javaPicture\1647753195543.png)]

Model(模型层)

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

View(视图层)

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

Controller(控制层)

  • 接收用户请求:(requ:用户请求参数,Session信息)
  • 交给业务层处理对应的代码
  • 控制视图的跳转
登录--->接收用户登录的请求--->处理用户请求(获取用户登录的参数,username password) --->交给业务层处理登录业务(判断用户密码是否争取)--->持久层查询用户名和密码是否正确--->数据库-->正确 跳转到视图层

Filter

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-42vEflfW-1659084486666)(D:\桌面\javaPicture\1647754175133.png)]

Filter开发步骤:

  1. 导包

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>servlet-api</artifactId>
            <version>2.5</version>
        </dependency>
        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.1</version>
        </dependency>
        <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>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
    </dependencies>
    
  2. 编写过滤器

    1. 导Filter包

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uuRYOeXK-1659084486667)(D:\桌面\javaPicture\1647755099234.png)]

package com.DYZ.filter;

import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {
    //初始化 Web服务启动时初始化,随时等待过滤对象出现
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    //Chain:链
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletRequest.setCharacterEncoding("utf8");
        servletResponse.setCharacterEncoding("utf8");
        servletResponse.setContentType("text/html;charset=utf8");
        System.out.println("执行前");
        filterChain.doFilter(servletRequest,servletResponse);//让我们的请求继续走下去,如果不写,程序到这里就会被拦截停止
        System.out.println("执行后");


    }
    //销毁 Web服务器关闭的时候,过滤器就会销毁
    @Override
    public void destroy() {

    }
}
<servlet-mapping>
    <servlet-name>servlet</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<filter>
    <filter-name>Filter</filter-name>
    <filter-class>com.DYZ.filter.CharacterEncodingFilter</filter-class>
</filter>
<!-- servlet下的路径都会执行过滤器-->
<filter-mapping>
    <filter-name>Filter</filter-name>
    <url-pattern>/servlet/*</url-pattern>
</filter-mapping>
<!--如果有多个网站需要过滤可以写多个mapping 例如sys下-->
    <filter-mapping>
    <filter-name>Filter</filter-name>
    <url-pattern>/sys/*</url-pattern>
</filter-mapping>

监听器

实现一个监听器接口

  1. 编写一个监听器

  2. 实现一个监听器的接口

    package com.DYZ.listener;
    
    import com.sun.corba.se.spi.orbutil.fsm.Input;
    
    import javax.servlet.ServletConfig;
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpSessionContext;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    public class OnlineCountListener implements HttpSessionListener {
        //创建Session监听
        @Override
        public void sessionCreated(HttpSessionEvent httpSessionEvent) {
            //需要监听整个web应用(即整个网站) 所以需要getServletContext() 整个web应用共享ServletContext的键值
            ServletContext sct = httpSessionEvent.getSession().getServletContext();
             Integer onlineCount = (Integer)sct.getAttribute("OnlineCount");
             if(onlineCount==null){
                 onlineCount=1;
             }
             else {
                 onlineCount=onlineCount+1;
             }
            sct.setAttribute("OnlineCount",onlineCount);
            System.out.println(sct.getAttribute("OnlineCount"));
    
        }
    //监听器销毁 销毁一个 减一个
        @Override
        public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
            ServletContext sct = httpSessionEvent.getSession().getServletContext();
            Integer onlineCount = (Integer)sct.getAttribute("OnlineCount");
            if(onlineCount==null){
                onlineCount=0;
            }
            else {
                onlineCount=onlineCount-1;
            }
            sct.setAttribute("OnlineCount",onlineCount);
    
        }
    }
    
  3. 注册监听器

    <listener>
        <listener-class>com.DYZ.listener.OnlineCountListener</listener-class>
    </listener>
    
  4. 注销手动或自动注销session

Filter实现权限拦截

案例要求:需要用户输入正确的用户名之后才能进入主页,并且用户注销与以后不能再通过输入主页的网址进入(报错,进入error页面).

  1. 用户输入正确的用户名之后,向Session中存放用户的数据,因为使用的是重定向,数据不会保留,所以使用Session(数据存储在web服务器中)

    package com.DYZ.Servlet;
    
    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 LoginServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username = req.getParameter("username");
            if (username.equals("admin")){
                resp.sendRedirect(req.getContextPath()+"/success.jsp");
                //session的值就是个贯通全局的标记,用这个标记可以来判断是否输入正确的用户名
                //此处的 User_Session可以创建一个 Constant类来专门存放,该常量一旦更改,只需要去该类中更改一次即可
                req.getSession().setAttribute("User_Session",req.getSession().getId());
            }
            else
                resp.sendRedirect(req.getContextPath()+"/error.jsp");
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    
    <servlet>
        <servlet-name>loginServlet</servlet-name>
        <servlet-class>com.DYZ.Servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>
        <url-pattern>/login</url-pattern>
    </servlet-mapping>
    
  2. 进入主页的时候判断用户是否已经登录(即Session中是否有(User_Session)对应的属性.在过滤器中

    package com.DYZ.Servlet;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    public class SysFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest req1 = (HttpServletRequest) req;
            HttpServletResponse resp1 = (HttpServletResponse) resp;
            Object user_session = req1.getSession().getAttribute("User_Session");
            if(user_session==null){
                resp1.sendRedirect(req1.getContextPath()+"/error.jsp");
            }
            filterChain.doFilter(req,resp);
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
<filter>
    <filter-name>SysFilter</filter-name>
    <filter-class>com.DYZ.Servlet.SysFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>SysFilter</filter-name>
    <!-- 进入success界面必须要经过过滤器来判断,因此可以将success界面放入一个固定的文件夹-->
    <url-pattern>/success.jsp/*</url-pattern>
</filter-mapping>

LOGIN.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/21 0021
  Time: 18:02
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<!-- 提交给login地址 但实际上login默认的前面有TomCat中的上级目录,所以需要加上 pageContext.request.contextPath-->
<form action="${pageContext.request.contextPath}/login" method="post" >
   用户名: <input type="text" name="username" >
    <input type="submit">

</form>

</body>
</html>
    

success.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/21 0021
  Time: 17:38
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
</head>
<body>
<h1>登陆成功!</h1>
<a href="${pageContext.request.contextPath}/logout">注销</a>

</body>
</html>

error.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/3/21 0021
  Time: 18:01
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录失败</title>
</head>
<body>
<h1>登录失败</h1>
<a href="${pageContext.request.contextPath}/LOGIN.jsp">返回登录页面</a>
</body>
</html>

Junit单元测试

package com.DYZ.jdbc;

import org.junit.Test; //需要导junit依赖

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

事务复习

package com.DYZ.jdbc;

import java.sql.*;

public class TestJdbc2 {
    public static void main(String[] args) {
        //配置信息
        //解决中文乱码
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8&useSSL=false";
        String username="root";
        String password="123456";
        Connection connection=null;
        //加载驱动
        try {
            Class.forName("com.mysql.jdbc.Driver");
            //连接数据库,代表数据库
            connection= DriverManager.getConnection(url, username, password);
            //关闭自动提交
            connection.setAutoCommit(false);
            //编写Sql 并向数据库发送Sql的对象PrepareStatement;
            String sql="update jdbc.account set money=money-1000 where name='张宇'";
            connection.prepareStatement(sql).executeUpdate();
            String sql2="update jdbc.account set money=money+500 where  name='王宇'";
            connection.prepareStatement(sql2).executeUpdate();
            String sql3="update jdbc.account set money=money+500 where  name='黄宇'";
            connection.prepareStatement(sql3).executeUpdate();
            connection.commit();
            if (connection!=null) {
                connection.close();
            }
        } catch (ClassNotFoundException | SQLException e) {
            try {
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }

    }
}

SMBMS

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SvhndiIY-1659084486667)(D:\桌面\javaPicture\1647940540564.png)]

数据库:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmlPQ0vr-1659084486667)(D:\桌面\javaPicture\1647940520172.png)]

项目搭建

  1. 搭建一个maven web项目

  2. 配置Tomcat

  3. 测试项目是否能够跑起来进入主页

  4. 导入项目中需要的jar包 jsp.servlet,mysql,jstl,standard

  5. 创建项目包结构

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UdRkG4zL-1659084486668)(D:\桌面\javaPicture\1647940997090.png)]

  6. 编写实体类

    ORM映射:表-类映射(根据数据库编写实体类(无参构造 有参构造 get set 方法))

    编写基础公共类(公共类的方法一般写为静态方法 在别的类中可以用类名.方法名直接调用)

    1. db.properties (数据库配置文件)

      driver=com.mysql.jdbc.Driver
      url=jdbc:mysql://localhost:3306/smbms?useUnicode=true&characterEncoding=utf8
      username=root
      password=123456
      
    2. 编写数据库公共类

      package com.DYZ.dao;
      
      import java.io.IOException;
      import java.io.InputStream;
      import java.sql.*;
      import java.util.Properties;
      
      public class BaseDao {
          static String url=null;
          static String driver=null;
          static String username=null;
          static String password=null;
          static {
              InputStream is = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
              Properties properties = new Properties();
              try {
                  properties.load(is);
              } catch (IOException e) {
                  e.printStackTrace();
              }
               url=properties.getProperty("url");
               driver = properties.getProperty("driver");
               username = properties.getProperty("username");
               password = properties.getProperty("password");
          }
      
              //获取数据库的连接
              public static Connection getConnection(){
                  Connection connection=null;
                  try {
                      Class.forName(driver);
                     connection = DriverManager.getConnection(url, username, password);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
                  return connection;
              }
              //编写查询公共类
          public static ResultSet execute(Connection connection , String sql, Object[] params,ResultSet resultSet, PreparedStatement preparedStatement)throws Exception {
              preparedStatement = connection.prepareStatement(sql);
              for (int i = 0; i < params.length; i++) {
                  preparedStatement.setObject(i + 1, params[i]);
              }
              resultSet = preparedStatement.executeQuery();
              return resultSet;
          }
          //编写增删改公共类
          public static int execute(Connection connection , String sql, Object[] params, PreparedStatement preparedStatement)throws Exception {
              preparedStatement = connection.prepareStatement(sql);
              for (int i = 0; i < params.length; i++) {
                  preparedStatement.setObject(i + 1, params[i]);
              }
             int updateRows= preparedStatement.executeUpdate();
              return updateRows;
          }
          //释放资源
          public static boolean closeResource(Connection connection ,PreparedStatement preparedStatement , ResultSet resultSet){
              boolean flag=true;
              if (connection!=null) {
                  try {
                      connection.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                      flag = false;
                  }
              }
              if (preparedStatement!=null) {
                  try {
                      preparedStatement.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                      flag = false;
                  }
              }
              if (resultSet!=null) {
                  try {
                      resultSet.close();
                  } catch (SQLException e) {
                      e.printStackTrace();
                      flag = false;
                  }
              }
              return flag;
          }
      
      }
      
    3. 编写字符编码过滤器

      package com.DYZ.filter;
      
      import javax.servlet.*;
      import java.io.IOException;
      
      public class CharacterEncodingFilter implements Filter {
      
          public void init(FilterConfig filterConfig) throws ServletException {
      
          }
      
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              servletRequest.setCharacterEncoding("utf8");
              servletResponse.setCharacterEncoding("utf8");
              servletResponse.setContentType("text/html;charset=utf8");
              filterChain.doFilter(servletRequest,servletResponse);
          }
      
          public void destroy() {
      
          }
      }
      
    4. 导入静态资源(webapp下)

    5. 设置首页

      <!--这只欢迎界面(首页)-->
      <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
      </welcome-file-list>
      
    6. 如果css不显示需要加一个样式过滤器

      过滤代码:

      package com.DYZ.filter;
      
      import javax.servlet.*;
      import java.io.IOException;
      
      public class CssEncodingFilter implements Filter {
      
          public void init(FilterConfig filterConfig) throws ServletException {
      
          }
      
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              servletResponse.setContentType("text/css;charset=utf-8");
      
              filterChain.doFilter(servletRequest,servletResponse);
          }
      
          public void destroy() {
      
          }
      }
      
      

      web注册:

      <!-- css过滤器 -->
      <filter>
        <filter-name>CssEncodingFilter</filter-name>
        <filter-class>com.DYZ.filter.CssEncodingFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>CssEncodingFilter</filter-name>
        <url-pattern>*.css</url-pattern>
      </filter-mapping>
      
      1. [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PiJJBdDd-1659084486668)(C:\Users\ADMINI~1\AppData\Local\Temp\1648294671042.png)]
      2. 编写Dao层接口并实现接口方法,获取登录用户的信息
      package com.DYZ.dao.user;
      
      import com.DYZ.pojo.User;
      
      import java.sql.Connection;
      import java.util.Collection;
      
      public interface UserDao {
          /*得到登录的用户信息,只要在登录界面输入用户名,
         即可得到该用户信息(所以该方法返回值为User类)
           */
          public User getLoginUser(String userCode, Connection connection);
      }
      
      package com.DYZ.dao.user;
      
      import com.DYZ.dao.BaseDao;
      import com.DYZ.pojo.User;
      import com.sun.org.apache.bcel.internal.generic.IF_ACMPEQ;
      
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.sql.ResultSet;
      import java.util.Collection;
      
      public class UserDaoImpl implements UserDao{
          public User getLoginUser(String userCode, Connection connection) {
              PreparedStatement pstm=null;
              ResultSet rs=null;
              User user=null;
              String sql="select * from smbms_user where userCode='userCode'";
              String[] params={userCode};
              try {
                  if (connection!=null) {
                     rs = BaseDao.execute(connection, sql, params, rs, pstm);
                     while(rs.next()){
                         user = new User();
                         user.setId(rs.getInt("id"));
                         user.setUserCode(rs.getString("userCode"));
                         user.setUserName(rs.getString("userName"));
                         user.setUserPassword(rs.getString("usePassword"));
                         user.setGender(rs.getString("gender"));
                         user.setBirthday(rs.getDate("birthday"));
                         user.setPhone(rs.getString("phone"));
                         user.setAddress(rs.getString("address"));
                         user.setUserRole(rs.getInt("userRole"));
                         user.setCreatedBy(rs.getInt("createBy"));
                         user.setCreationDate(rs.getDate("creationDate"));
                         user.setModifyBy(rs.getInt("modifyBy"));
                         user.setModifyDate(rs.getDate("modifyDate"));
                     }
                      BaseDao.closeResource(null,pstm,rs);
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return user;
          }
      }
      
    7. 编写业务层接口并实现接口方法

      package com.DYZ.service.user;
      
      import com.DYZ.pojo.User;
      
      public interface UserService {
          public User login(String userName , String passWord);
      }
      
      package com.DYZ.service.user;
      
      import com.DYZ.dao.BaseDao;
      import com.DYZ.dao.user.UserDao;
      import com.DYZ.dao.user.UserDaoImpl;
      import com.DYZ.pojo.User;
      import org.junit.Test;
      
      import java.sql.Connection;
      
      public class UserServiceImpl implements UserService{
          //业务层会用到Dao层,所以需要创建Dao层的实例化对象
          UserDaoImpl userDao=null;
          public UserServiceImpl() {
             userDao = new UserDaoImpl();
          }
      
          public User login(String userName, String passWord) {
              Connection connection = BaseDao.getConnection();
              User loginUser = userDao.getLoginUser(userName, connection);
              BaseDao.closeResource(connection,null,null);
              return  loginUser;
          }
          @Test
          public void Test(){
              UserServiceImpl userService = new UserServiceImpl();
              User admin = userService.login("admin", "123156");//此处密码无用
              System.out.println(admin.getUserPassword());
          }
      
      }
      

      编写Servlet并注册

      package com.DYZ.servlet.user;
      
      import com.DYZ.pojo.User;
      import com.DYZ.service.user.UserServiceImpl;
      import com.DYZ.util.Constants;
      
      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 LoginServlet extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              //获取前端用户输入的用户名和密码
              String userCode = req.getParameter("userCode");
              String userPassword = req.getParameter("userPassword");
              //调用业务层判断用户名和密码是否匹配
              UserServiceImpl userService = new UserServiceImpl();
              User user = userService.login(userCode, userPassword);
              if (user!=null){ //用户名与密码匹配,能查到此人
                  //将查到的该用户信息存到从前端请求中得到的Session中
                  //Session的键为常量,可以存在常量文件中
                  req.getSession().setAttribute(Constants.User_Session,user);
                  //跳转到主页
                  resp.sendRedirect("jsp/frame.jsp");
              }
              else  //查不到该人
              {
                  System.out.println("user为空");
                  //给前端请求中设置参数,前端读取${error}得到属性
                  req.setAttribute("error","用户名或密码不正确");
                  //转发回登录页面
                  req.getRequestDispatcher("login.jsp").forward(req,resp);
              }
      
          }
      
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req, resp);
          }
      }
      
      <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.DYZ.servlet.user.LoginServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/login.do</url-pattern>
      </servlet-mapping>
      

密码修改

UserDao接口及其实现方法

//修改密码(通过前端传来的唯一的id来判断修改密码的用户 因为人们可能会重复 )
public int UpdatePwd(Connection connection ,int id,String userPassword);
 public int UpdatePwd(Connection connection,int id, String userPassword) {
        PreparedStatement pstm=null;
        int count=0;
        if(connection!=null) { //业务层负责连接数据库 如果数据库没有连接就执行就会返回0个行数
            System.out.println(userPassword);
            String sql = "update smbms_user set usePassword=? where id=?";
            Object[] params = {userPassword, id};
            try {
                count = BaseDao.execute(connection, sql, params, pstm);
                System.out.println("count等于"+count);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                //当时此处在调用execute之前使用导致connection和pstm关闭了 无法执行execute
                BaseDao.closeResource(connection,pstm,null);
            }
        }
        return count;

UserService接口及其实现方法

public boolean updatePwd(int id , String password);
    public boolean updatePwd(int id, String password) {
        boolean flag=false;
        Connection connection = BaseDao.getConnection();
        int i = userDao.UpdatePwd(connection, id, password);
        System.out.println("i的值为"+i);//当时此处为0肯定为UpdatePwd方法执行出问题
        if (i>0){
            System.out.println("密码2"+password);//错误调试
            flag=true;
        }
        BaseDao.closeResource(connection,null,null);
        return flag;
    }

updatePwdServlet

package com.DYZ.servlet.user;

import com.DYZ.pojo.User;
import com.DYZ.service.user.UserServiceImpl;
import com.DYZ.util.Constants;
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 updatePwdServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //Servlet复用
        String method = req.getParameter("method");
        System.out.println("method="+method);
        if (method!=null&&method.equals("savepwd")){
            System.out.println("进入updatePwd方法");
            this.updatePwd(req,resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
    public void updatePwd(HttpServletRequest req, HttpServletResponse resp) {
        Object attribute = req.getSession().getAttribute(Constants.User_Session);
        String newpassword = req.getParameter("newpassword");
        if (attribute != null && newpassword != null) {
            System.out.println("第一个密码" + newpassword);
            System.out.println(attribute != null);
            UserServiceImpl userService = new UserServiceImpl();
            Integer id = ((User) attribute).getId();
            boolean b = userService.updatePwd(id, newpassword);
            System.out.println("b的值为" + b);
            if (b) {
                System.out.println("进入重登界面");
                //密码修改成功,退出使用新密码重新登陆
                req.setAttribute("message", "密码修改成功,退出使用新密码重新登陆!");
                req.getSession().removeAttribute(Constants.User_Session);
                try {
                    req.getRequestDispatcher("/login.jsp").forward(req, resp);
                } catch (ServletException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else {
                req.setAttribute("message", "密码修改失败");
            }
        } else {
            req.setAttribute("message", "新密码有问题!");
        }
    }
        //验证旧密码
    public void pwdmodify(HttpServletRequest req , HttpServletResponse resp){
        System.out.println("进去该方法");
        Object attribute = req.getSession().getAttribute(User_Session);
        String oldpassword = req.getParameter("oldpassword");
        System.out.println(oldpassword);
        HashMap<String, String> Map = new HashMap<String, String>();
        //判断两个密码相同的前提1 取到了Session中的用户 即Session没过期
        if (attribute==null){
            System.out.println("用户信息过期");
            Map.put("result","sessionerror");
        }
        //前提2 输入的旧密码不能为空
        else if(StringUtils.isNullOrEmpty(oldpassword)){
            System.out.println("旧密码为空");
            Map.put("result","error");
        }
        //前提2 输入的旧密码正确
        else if (oldpassword.equals(((User) attribute).getUserPassword())){
            System.out.println("密码正确");
            Map.put("result","true");
        }
        else{
            System.out.println("密码不正确");
            Map.put("result", "false");
        }

        try {
            resp.setContentType("application/json");
            PrintWriter writer = resp.getWriter();
            writer.write(JSONArray.toJSONString(Map)); //将Map转换为Json键值对形式
            writer.flush();
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

}

$.ajax({
   type:"GET",
   url:path+"/jsp/user.do",
   //Ajax传递的参数 method相当于在Pol.XML中注册了 因此pwdmodify方法中取到的前端参数一定是吃醋Ajax方法中的参数
   data:{method:"pwdmodify",oldpassword:oldpassword.val()},
   dataType:"json", //Ajax传递来的参数以json键值对的形式存储

servlet注册

<!--修改密码-->
<servlet>
  <servlet-name>updatePwd</servlet-name>
  <servlet-class>com.DYZ.servlet.user.updatePwdServlet</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>updatePwd</servlet-name>
  <url-pattern>/jsp/user.do</url-pattern>
</servlet-mapping>
<!--设置会话时间为30分钟-->
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值