javaweb学习心得-01(西部开源-秦疆随堂笔记)

maven

maven

创建一个maven项目的过程

1、在maven官网下载安装包

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

2、在D盘的environment目录下解压缩

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

(一开始是没有maven-repo文件夹的,是自己创建的,作为本地仓库)

3、新建一个文件夹用于作为本地仓库(存放一些常用架包)

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

4、配置镜像

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

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

<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
<!-- maven官方镜像 -->
<mirror>
<id>mirrorId</id>
<mirrorOf>central</mirrorOf>
<name>Human Readable Name </name>
<url>http://repo1.maven.org/maven2/</url>
</mirror>
<!-- 又一个镜像 -->
<mirror> 
<id>alimaven</id> 
<name>aliyun maven</name> 
<url>http://central.maven.org/maven2</url> 
<mirrorOf>central</mirrorOf> 
</mirror>
<!-- 阿里云镜像 -->
<mirror> 
<id>alimaven</id> 
<name>aliyun maven</name> 
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url> 
<mirrorOf>central</mirrorOf> 
</mirror>
<!-- junit镜像地址 -->
<mirror> 
<id>junit</id> 
<name>junit Address/</name> 
<url>http://jcenter.bintray.com/</url> 
<mirrorOf>central</mirrorOf> 
</mirror>

5、配置环境

电脑配置环境打开操作(win+R——control system——关于——高级系统设置——系统属性——环境变量)

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

变量名:MAVEN_HOME

变量值:D:\environment\apache-maven-3.8.3-bin\apache-maven-3.8.3

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

添加环境变量:%MAVEN_HOME%\bin

6、查看maven是否配置成功

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

7、打开IDEA,创建一个maven工程

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

8、输入配置

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

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

9、创建成功!

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

10、配置最新web.xml

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

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

11、在pom.xml中导入需要的依赖

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

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

<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--自动配置的GAV-->
<groupId>org.example</groupId>
<artifactId>maven7</artifactId>
<version>1.0-SNAPSHOT</version>
<!--Package:项目的打包方式
java:java应用
war:JavaWeb应用-->
<packaging>war</packaging>

<name>maven7 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<!--配置-->
<properties>
<!--项目的默认编码方式-->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<!--项目依赖-->
<dependencies>
<!--具体依赖的jar包-->
<!--Maven会帮忙导入这个jar包所依赖的其他jar-->
<!--下面是教程导入的依赖,在maven仓库可以查找到!-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-webmvc</artifactId>
    <version>5.3.4</version>
</dependency>
<!--jsp依赖-->
<dependency>
    <groupId>javax.servlet.jsp</groupId>
    <artifactId>javax.servlet.jsp-api</artifactId>
    <version>2.3.3</version>
    <scope>provided</scope>
</dependency>

<!--servlet依赖-->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <version>4.0.1</version>
</dependency>
</dependency>

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

以上已完成基本创建操作

安装一些很棒的插件

  • 翻译

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

  • 背景图片设置

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

  • 彩虹括号,方便代码查询

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

  • 代码小地图,轻松上下翻

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

  • 查看工作效果和时长等等

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

  • 查看,统计代码

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

  • 代码补全ai

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

  • 对Mybatis的帮助

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

  • 生成时序树

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

  • 检查代码规范

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

帮助导入依赖

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

maven架包显示

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

Servlet

1、Servlet简介

  • Servlet就是sun公司开发动态web的一门技术
  • Sun在这些API中提供了一个接口:Servlet,如果要开发Servlet程序,只需要完成两个小步骤
    1. 编写一个类,实现Servlet接口
    2. 把开发好的java类部署到web服务器中

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

2、HelloServlet

Servlet接口有两个:HttpServlet和GenericServlet

1、构建一个普通的Maven项目(pom.xml是maven的核心)

<?xml version="1.0" encoding="UTF-8"?>
<!--Maven版本和头文件-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
<!--自动配置的GAV-->
  <groupId>org.example</groupId>
  <artifactId>maven7</artifactId>
  <version>1.0-SNAPSHOT</version>
  <!--Package:项目的打包方式
      java:java应用
      war:JavaWeb应用-->
  <packaging>war</packaging>

  <name>maven7 Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>
<!--配置-->
  <properties>
    <!--项目的默认编码方式-->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>
<!--项目依赖-->
  <dependencies>
    <!--具体依赖的jar包-->
    <!--Maven会帮忙导入这个jar包所依赖的其他jar-->
    <!--下面是教程导入的依赖,在maven仓库可以查找到!-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
      
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>5.3.4</version>
         <dependency>
             
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>


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

    </dependency>
    </dependency>

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

</project>

2、关于Maven父子工程的理解

父项目中会有

 <modules>
    <module>servlet-01</module>
  </modules>

子项目中会有

  <parent>
        <artifactId>maven-01</artifactId>
        <groupId>com.wu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

父项目中的java子项目可以使用

son extends father

3、Maven环境优化

​ 1、修改web.xml为最新的;

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0"
         metadata-complete="true">
</web-app>

​ 2、将maven的结构搭建完成;

​ 3、没有web.iml文件

在Terminal输入:mvn idea:module

4、编写一个Servlet程序

​ 1、编写一个普通类

​ 2、实现Servlet接口

public class HelloServlet extends HttpServlet{
    //由于get和post只是请求实现的不同方式,可以互相调用,业务逻辑都一样
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doGet(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        super.doPost(req, resp);
        PrintWriter writer = resp.getWriter();
        writer.println("Hello,World!")
    }
}

5、编写Servlet的映射

为什么需要映射!我们写的java程序,要通过浏览器访问,而浏览器需要连接web服务器,所以我们需要web服务中注册我们写的Servlet,还需要给他一个能够访问的路径。在web.xml中修改

<!--注册Servlet-->
<servlet>
    <servlet-name>hello</servlet-name>
    <servlet-class>com.wu.servlet.HelloServlet</servlet-class>
</servlet>
<!--Servlet的请求路径-->

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

6、配置Tomcat

image-20211026110032463

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

7、启动测试

3、Servlet原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZxWr7qUQ-1635834582782)(C:\Users\28164\Pictures\Screenshots\屏幕截图(10)].png)

4、Mapping问题

1.一个Servlet可以指定一个映射路径

<servlet-mapping>
    <servlet-name>hello</servlet-name>
    <url-pattern>/hello</url-pattern>
</servlet-mapping>

2.一个Servlet可以指定多个映射路径

 <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>
 <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello1</url-pattern>
    </servlet-mapping>
 <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello2</url-pattern>
    </servlet-mapping>

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

 <!--默认请求路径-->
<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello/*</url-pattern>
    </servlet-mapping>

4.默认请求路径

<!--默认请求路径-->
<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>

5.指定后缀或者前缀等

<!--可以自定义后缀实现请求路径
*前面不能加项目映射路径(/)-->
<servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>*.xiaowu</url-pattern>
    </servlet-mapping>

6.优先级问题

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

<!--404处理-->
<servlet>
    <servlet-name>error</servlet-name>
    <servlet-class>com.wu.servlet.errorServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>error</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

5、ServletContent

1、数据共享

public class SetServletContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//          content.getInitParameter();初始化参数
//          this.getServletConfig();Servlet配置
//          this.getServletContext();Servlet上下文
        ServletContext context = this.getServletContext();
        String username = "小米";
        context.setAttribute("username",username);
        System.out.println("放置");
    }

}

public class GetServletContext extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");
        ServletContext context = this.getServletContext();
        String username = (String) context.getAttribute("username");
        resp.getWriter().print(username);
        System.out.println("得到!");
    }
    
}

2、资源配置

//获取初始化配置的信息
public class InitServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        ServletContext context = this.getServletContext();
      String url = context.getInitParameter("url");
      resp.getWriter().print(url);
    }
}
<!--配置web初始化文件-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>
    <servlet>
        <servlet-name>Init</servlet-name>
        <servlet-class>com.wu.servlet.InitServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Init</servlet-name>
        <url-pattern>/Init</url-pattern>
    </servlet-mapping>

3、请求转发

public class HelloServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html");
        ServletContext context = this.getServletContext();
        resp.getWriter().print("转化成功!");

    }
}
    <servlet>
        <servlet-name>Dis</servlet-name>
        <servlet-class>com.wu.servlet.DispartcherServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>Dis</servlet-name>
        <url-pattern>/dis</url-pattern>
    </servlet-mapping>
</web-app>

4、读取资源文件

Properties

  • 在Java目录下新建properties
  • 在resources目录下新建properties

都被打包到相同路径:classes,类路径

public class PropertiesServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        InputStream input = this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
        Properties properties = new Properties();
        properties.load(input);
        String name = properties.getProperty("username");
       String pwd = properties.getProperty("password");
        resp.getWriter().print(name+pwd);
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html");

    }
}

 <servlet>
        <servlet-name>pro</servlet-name>
        <servlet-class>com.wu.servlet.PropertiesServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>pro</servlet-name>
        <url-pattern>/pro</url-pattern>
    </servlet-mapping>
username = 小吴
password = 1234567890

6、HttpServletResponse

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nbepGSWH-1635834582783)(C:\Users\28164\Pictures\resp.png)]

1、简单分类

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

ServletOutputStream getOutputStream() throw IOException;
PrintWriter getWriter() threws IOException;

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

 String getCharacterEncoding();

    String getContentType();

    ServletOutputStream getOutputStream() throws IOException;

    PrintWriter getWriter() throws IOException;

    void setCharacterEncoding(String var1);

    void setContentLength(int var1);

    void setContentLengthLong(long var1);

    void setContentType(String var1);

    void setBufferSize(int var1);

    int getBufferSize();

    void flushBuffer() throws IOException;

    void resetBuffer();

    boolean isCommitted();

    void reset();

    void setLocale(Locale var1);

    Locale getLocale();

响应的状态码:

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

常见应用

1、向浏览器输出信息

2、下载文件

2、下载文件

public class DownServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        
       String path = "D:\\maven-01\\servlet-02\\target\\classes\\1.PNG";
        String fileName = path.substring(path.lastIndexOf("\\")+1);
        resp.setHeader("Content-Disposition", "attachment;filename="+ 		 URLEncoder.encode(fileName, "UTF-8"));
        FileInputStream fis = new FileInputStream(path);
        int len = 0;
        byte[] data = new byte[1024];
        ServletOutputStream os = resp.getOutputStream();
        while ((len=fis.read(data))>0){
            os.write(data,0,len);
        }
        fis.close();
        os.close();
    }
}

3、生成验证码

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_RGB);
        //得到图片
        Graphics2D g = (Graphics2D) image.getGraphics();//笔
        //设置图片的背景颜色
        g.setColor(Color.white);
        g.fillRect(0,0,100,30);
        //给图片写数据
        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 rand = new Random();
        String num = rand.nextInt(1000000)+"";
        StringBuffer buf = new StringBuffer();
        for(int i = 0;i < 7-num.length();i++){
            buf.append("0");
        }
        num = buf.toString()+num;
        return num;
    }

}

4、实现重定向

A访问B B告诉A重新访问C A再访问C

面试题:重定向和请求转发有的区别

相同点

  • 页面会实现跳转

不同点

  • 请求转发的时候,url不会产生变化 307
  • 重定向时,url会发生变化 302
public class RequestServlet 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+"<br>"+password);
        //重定向时要注意路径,否则报错404
        resp.sendRedirect("/s2/success.jsp");
    }

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

    }
}

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


<%--
  Created by IntelliJ IDEA.
  User: 28164
  Date: 2021/10/27
  Time: 18:12
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录测试成功!</title>

</head>
<body>
<p size="40" align="center">登录测试成功!</p>
</body>
</html>
  <servlet>
        <servlet-name>req</servlet-name>
        <servlet-class>com.wu.servlet.RequestServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>req</servlet-name>
        <url-pattern>/req</url-pattern>
    </servlet-mapping>

7、HttpServletRequest

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

1、获取前端页面的数据

8、Cookie和Session

会话:用户打开一个浏览器,点击了许多连接,访问多个web资源,关闭浏览器,这个过程就是会话

有状态会话

客户端 服务端

1、服务器给客户端一个 信件 客户端下次访问服务端时带上信件即可;cookie

2、服务器登记你来过了,下次你来得时候服务端来匹配你;session

1、保存会话的两种方式

cookie

  • 客户端技术(响应)

session

  • 服务器技术,利用这个技术,可以保存用户的会话信息~我们可以把信息或者数据放到Session中。

常见:网站登录之后,第二次就不用再登录,第二次访问直接就上去了

2、Cookie

服务器端像客户端发送Cookie是通过HTTP响应报文实现的,在Set-Cookie中设置需要像客户端发送的cookie,cookie格式如下:

Set-Cookie: “name=value;domain=.domain.com;path=/;expires=Sat, 11 Jun 2016 11:29:42 GMT;HttpOnly;secure”
其中name=value是必选项,其它都是可选项。Cookie的主要构成如下:

name:一个唯一确定的cookie名称。通常来讲cookie的名称是不区分大小写的。

value:存储在cookie中的字符串值。最好为cookie的name和value进行url编码

domain:cookie对于哪个域是有效的。所有向该域发送的请求中都会包含这个cookie信息。这个值可以包含子域(如:yq.aliyun.com),也可以不包含它(如:.aliyun.com,则对于aliyun.com的所有子域都有效).

path: 表示这个cookie影响到的路径,浏览器跟会根据这项配置,像指定域中匹配的路径发送cookie。

expires:失效时间,表示cookie何时应该被删除的时间戳(也就是,何时应该停止向服务器发送这个cookie)。如果不设置这个时间戳,浏览器会在页面关闭时即将删除所有cookie;不过也可以自己设置删除时间。这个值是GMT时间格式,如果客户端和服务器端时间不一致,使用expires就会存在偏差。

expiry=-1:代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了。

expiry>0:代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器自动删除,

expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。

max-age: 与expires作用相同,用来告诉浏览器此cookie多久过期(单位是秒),而不是一个固定的时间点。正常情况下,max-age的优先级高于expires。

HttpOnly: 告知浏览器不允许通过脚本document.cookie去更改这个值,同样这个值在document.cookie中也不可见。但在http请求张仍然会携带这个cookie。注意这个值虽然在脚本中不可获取,但仍然在浏览器安装目录中以文件形式存在。这项设置通常在服务器端设置。

secure: 安全标志,指定后,只有在使用SSL链接时候才能发送到服务器,如果是http链接则不会传递该信息。就算设置了secure 属性也并不代表他人不能看到你机器本地保存的 cookie 信息,所以不要把重要信息放cookie就对了服务器端设置

1、从服务器拿到cookie信息

2、服务器响应到客户端cookie

    Cookie[] cookies = req.getCookies();//  Cookie,服务器从客户端获取可能存在多个Cookie
	cookies.getName();//获取cookie中的key
	cookies.getValue();//获取cookie中的value
	new Cookie("lastLoginTime",System.currentTimeMillis()+"");//新建一个cookie
	cookie.setMaxAge(24*60*60);//设置cookie有效期
	resp.addCookie(cookie);//响应给客户端一个cookie

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

C:\Users\28164\AppData\LocalLow

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

一个网站cookie是否存在上限!

  • 一个Cookie只能保存一个信息
  • 一个web站点(客户端)可以给浏览器(载体)发送多个cookie,最多存放20个
  • 300个cookie浏览器上限
  • Cookie大小有限制4kb

删除Cookie:

  • 不设置有效期,关闭浏览器,自动失效;
  • 设置有效时间为 0;
     @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        服务器告诉你来的时间,把这个时间封装成为一个信件,下次访问时携带此信息,服务器知道你来了
//        解决乱码
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("gbk");
        PrintWriter out = resp.getWriter();
//      Cookie,服务器从客户端获取
        Cookie[] cookies = req.getCookies();//返回数组,可能存在多个Cookie
//        判断Cookies是否存在
        if(cookies!=null){
//            存在
            out.write("上次访问的时间:");
            for(int i = 0;i<cookies.length;i++){
                Cookie cookie = cookies[i];
//               获取cookie的名字
                if(cookie.getName().equals("lastTime")){
//               获取cookie的值
                    long lastTime = Long.parseLong(cookie.getValue());
                    Date date = new Date(lastTime);
                    out.write(date.toLocaleString());
                }
            }

        }else {
            out.print("第一次访问!");
        }
//        服务器给客户端响应一个cookie
        Cookie cookie = new Cookie("lastTime",System.currentTimeMillis()+"");
//        cookie有效期为20s
        cookie.setMaxAge(1*5*60);
        resp.addCookie(cookie);

    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        创建一个Cookie,名字和删除的Cookie的name一致
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//        将Cookie的有效期设置为10s
        cookie.setMaxAge(1*1*10);
//         将cookie响应给客户端
        resp.addCookie(cookie);
    }
<!--设置cookies有效时长-->
  <session-config>
      <cookie-config>
          <!--以分钟计-->
          <max-age>1</max-age>
      </cookie-config>
  </session-config>

3、Session(重点)

什么是Session

  • 服务器会给每个用户(浏览器)创建一个Session对象;
  • 一个Session独占一个浏览器,只要浏览器没有关闭,这个Session就存在。

Session和Cookie的1区别:

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存(可以多个)
  • Session是把用户数据写到用户独占Session,服务器端保存(保存重要信息,减少服务器资源的浪费)
  • Session由服务器产生
  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //预防出现乱码
        req.setCharacterEncoding("gbk");
        resp.setCharacterEncoding("utf-8");
        //得到一个Session
        HttpSession session = req.getSession();
        //在Session中存放对象
        session.setAttribute("person",new Person("小五",19,1001));
        //获取Session中的内容
        String str = (String) session.getAttribute("Person");
        //打印Session
        System.out.println(str);
        //获取时间函数
        Date date = new Date();
        //获取session最后一次交互时间
        Date date1 = new Date(session.getLastAccessedTime());
        //判断是不是新创建的Session
        if(session.isNew()){
            resp.getWriter().write("Session创建成功!id:"+session.getId());
        }else{
            resp.getWriter().write("session创建时间为:"+date1);
        }
    }
 @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题
        resp.setCharacterEncoding("utf-8");
        req.setCharacterEncoding("utf-8");
        //获得Session
        HttpSession session = req.getSession();
        //获取Session中的person
        Person person = (Person) session.getAttribute("person");
        System.out.println(person.toString());
        //显示获取到的信息
        resp.getWriter().write(person.toString());
        resp.getWriter().write(session.getId());
    }
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //获取Session
        HttpSession session = req.getSession();
        //移除person
        session.removeAttribute("person");
        //手动注销Session
        session.invalidate();
    }
}
public class Person {
    String name;
    int age;
    int id;

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

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

9、JSP

1、什么是JSP

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

  • 最大的特点:

  • 写JSP就像在写HTML

  • 区别

    • HTML只给用户提供静态的数据
    • jsp页面中可以嵌入Java代码,为用户提供动态数据

2、JSP原理

  • 代码层面看不难

  • Tomcat服务器内部工作原理

    • tomcat目录中由一个work目录
    • idea中使用Tomcat会在idea的Tomcat中产生一个work目录

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

路径:C:\Users\28164\AppData\Local\JetBrains\IntelliJIdea2021.1\tomcat

页面转变成了java程序

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

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

JSP最终也会被转换成一个java类!

JSP本质就是一个Servlet

//初始化
  public void _jspInit() {
  }
//销毁
  public void _jspDestroy() {
  }
//JSPService
  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    if (!javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      final java.lang.String _jspx_method = request.getMethod();
      if ("OPTIONS".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        return;
      }
      if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method)) {
        response.setHeader("Allow","GET, HEAD, POST, OPTIONS");
        response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS");
        return;
      }
    }

1、判断请求

2、设置内置对象

    final javax.servlet.jsp.PageContext pageContext;//页面上下文
    javax.servlet.http.HttpSession session = null;//session
    final javax.servlet.ServletContext application;//ServletContext
    final javax.servlet.ServletConfig config;//配置文件
    javax.servlet.jsp.JspWriter out = null;//页面输出
    final java.lang.Object page = this;//当前页面
   	final javax.servlet.http.HttpServletRequest request;//请求
	final javax.servlet.http.HttpServletResponse response;//响应

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

response.setContentType("text/html");
      pageContext = _jspxFactory.getPageContext(this, request, response,
      			null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

4、以上这些对象我们可在jsp页面中直接使用。

在jsp页面中

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

如果是HTML,就会被转化为

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

以此种方式,输出到前端

3、jsp基础语法

任何语言都有自己的语法

jsp作为java技术的一种应用,它拥有自己的扩展,但java的所有语法都支持

1、JSP表达式
<%--JSP表达式
    作用:用来将程序的输出,输出到客户端
    <%变量或者表达式%>--%>
    <%= new java.util.Date()%>
2、脚本片段
<%
   String str = "Hello World!";
    out.println("<h1>输出:"+str+"</h1>");
    %>
3、脚本再嵌入
 <%
    for (int i = 0; i <3;i++){
  %>
  <h2>你好,我的小楠,爱你</h2>

  <%}%>
4、JSP声明
//全局变量
  <%!
    String name = "小吴";
    int id = 007;
  %>
  <%
    out.println("name:"+name);
    out.println("id:"+id);
  %>
<!--html注释-->//会在客户端源代码显示
<%--jsp注释--%>//不会在客户端源代码显示
5、定制错误页面
<!--新建的404.jsp-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page errorPage="404.jsp" %>
<%--显示声明这是一个错误页面--%>
<%@page isErrorPage="true" %>
<html>
<head>
    <title>404错误</title>
</head>
<body>
<img src="../img/404.jpg" alt="404错误图片">
</body>
</html>
<!--在web.xml中配置-->
<error-page>
        <error-code>404</error-code>
        <location>/error/404.jsp</location>
</error-page>

<!--新建的500.jsp-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%--定制500u错误页面--%>
<%@page errorPage="500.jsp" %>
<%@page isErrorPage="true" %>
<html>
<head>
    <title>500错误</title>
</head>
<body>
<img src="../img/500.jpg" alt="500错误图片">
</body>
</html>
<!--web.xml中配置-->   
<error-page>
       <error-code>500</error-code>
       <location>/error/500.jsp</location>
</error-page>
6、页面的公用部分添加
<!--在web下新建一个common目录存放-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>头部页面</title>
</head>
<body>
<h>这是头部</h>
</body>
</html>
<!--存放在common目录-->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>底部文件</title>
</head>
<body>
<h>这是底部</h>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>测试include</title>
</head>
<body>
<%--合二为一--%>
<%@include file="/common/header.jsp"%>
<h1>这是主体1!</h1>
<%@include file="/common/footer.jsp"%>
<hr>
<%--拼接而成,较好--%>
<jsp:include page="/common/header.jsp"/>
<h1>这是主体2!</h1>
<jsp:include page="/common/footer.jsp"/>
</body>
</html>
  • 前者源码
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("    <title>头部页面</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h>这是头部</h>\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
out.write("\r\n");
out.write("<h1>这是主体1!</h1>\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("<html>\r\n");
out.write("<head>\r\n");
out.write("    <title>底部文件</title>\r\n");
out.write("</head>\r\n");
out.write("<body>\r\n");
out.write("<h>这是底部</h>\r\n");
out.write("</body>\r\n");
out.write("</html>\r\n");
out.write("\r\n");

后者源码

 static {
    _jspx_dependants = new java.util.HashMap<java.lang.String,java.lang.Long>(2);
    _jspx_dependants.put("/common/header.jsp", Long.valueOf(1635616124279L));
    _jspx_dependants.put("/common/footer.jsp", Long.valueOf(1635616124287L));
  }

out.write("</html>\r\n");
      out.write("\r\n");
      out.write("<hr>\r\n");
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/common/header.jsp", out, false);
      out.write("\r\n");
      out.write("<h1>这是主体2!</h1>\r\n");
      org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/common/footer.jsp", out, false);
      out.write("\r\n");
      out.write("\r\n");
      out.write("</body>\r\n");
      out.write("</html>\r\n");

前者如果在header.jsp或footer.jsp中添加了<% int a = 10%>,再往header-footer.jsp中添加<% int a = 0%>,此时会报500错误,因为在一个java类里不能定义两个相同变量,后者则不会出错,因为它仅仅是引用,此时是以主体的变量为主。

4、JSP内置对象及其作用域

  • pageContent 存放数据
  • respone
  • request 存放数据
  • Session 存放数据
  • Applocation【ServletContext】 存放数据
  • config【ServletConfig】 存放数据
  • out
  • page
  • exception
public static final int PAGE_SCOPE = 1;
    public static final int REQUEST_SCOPE = 2;
    public static final int SESSION_SCOPE = 3;
    public static final int APPLICATION_SCOPE = 4;
    public static final String PAGE = "javax.servlet.jsp.jspPage";
    public static final String PAGECONTEXT = "javax.servlet.jsp.jspPageContext";
    public static final String REQUEST = "javax.servlet.jsp.jspRequest";
    public static final String RESPONSE = "javax.servlet.jsp.jspResponse";
    public static final String CONFIG = "javax.servlet.jsp.jspConfig";
    public static final String SESSION = "javax.servlet.jsp.jspSession";
    public static final String OUT = "javax.servlet.jsp.jspOut";
    public static final String APPLICATION = "javax.servlet.jsp.jspApplication";
    public static final String EXCEPTION = "javax.servlet.jsp.jspException";
public void setAttribute(String name, Object attribute, int scope) {
        switch(scope) {
        case 1:
            this.mPage.put(name, attribute);
            break;
        case 2:
            this.mRequest.put(name, attribute);
            break;
        case 3:
            this.mSession.put(name, attribute);
            break;
        case 4:
            this.mApp.put(name, attribute);
            break;
        default:
            throw new IllegalArgumentException("Bad scope " + scope);
        }

    }
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>内置对象</title>
</head>
<body>
<%-- public static final int PAGE_SCOPE = 1;
    public static final int REQUEST_SCOPE = 2;
    public static final int SESSION_SCOPE = 3;
    public static final int APPLICATION_SCOPE = 4;

     public void setAttribute(String name, Object attribute, int scope) {
        switch(scope) {
        case 1:
            this.mPage.put(name, attribute);
            break;
        case 2:
            this.mRequest.put(name, attribute);
            break;
        case 3:
            this.mSession.put(name, attribute);
            break;
        case 4:
            this.mApp.put(name, attribute);
            break;
        default:
            throw new IllegalArgumentException("Bad scope " + scope);
        }--%>
<%
    //保存的数据只在一个页面中有效
    pageContext.setAttribute("name1","小吴01");
    //保存的数据只在一次请求中有效,请求转发会携带这个数据
    request.setAttribute("name2","小吴02");
    //保存的数据只在一个会话中有效,从打开浏览器到关闭浏览器
    session.setAttribute("name3","小吴03");
    //保存的数据只在服务器中有效,从打开浏览器到关闭浏览器
    application.setAttribute("name4","小吴04");
    //手动设置范围,作用域
    pageContext.setAttribute("id",12,pageContext.SESSION_SCOPE);
%>
<%--脚本里面的代码会原封不动生成到xxx_jsp.java
    要求:<%%>里面的代码必须符合java语法的正确性--%>
<%
//通过pageContext寻找取出 pageContext->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表达式输出 ${}}--%>
<h> ${name1}
    ${name2}
    ${name3}
    ${name4}
    <%=name5%>

</h>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: 28164
  Date: 2021/10/31
  Time: 13:57
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>取值</title>
</head>
<body>
<h> ${name1}
    ${name2}
    ${name3}
    ${name4}
    ${id}


</h>
</body>
</html>
<%--
  Created by IntelliJ IDEA.
  User: wu
  Date: 2021/10/31
  Time: 14:38
  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.forward("/index.jsp");
    //request.getRequestDispatcher("/index.jsp").forward(request,response);
%>
</body>
</html>

5、JSP标签、JSTL标签和EL表达式

EL表达式 ${}

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

JSP标签

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

<jsp:forward page="jsptag02.jsp">
<jsp:param name="name" value="tita"></jsp:param>
<jsp:param name="id" value='123'></jsp:param>
</jsp:forward>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
name:<%=request.getParameter("name")%>
id:<%=request.getParameter("id")%>
</body>
</html>

JSTL标签

JSTL标签库的使用就是为了弥补HTML标签的不足,有许多自定义的标签!

核心标签()

格式化标签

SQL标签

XML标签

JSTL标签库使用步骤

  • 引入对应的taglib
  • 使用其中的方法
  • 在Tomcat也需要引入jstl的包,否则会报错:JSTL解析错误

JSTL自己去看菜鸟教程或W3school

10、JavaBean

实体类

JavaBean有特定的写法:

  • 必须要有一个无参构造

  • 属性必须私有化

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

一般用来和数据库的字段做映射:ORM(Object Relation Mapping)对象关系映射

  • 表——类

  • 字段——属性

  • 行记录——对象

    people表

idnameageaddress
1吴110揭阳
2吴211上海
3吴312北京
class people{
    int id,age;
    String name,address;
    
}


代表实体类:

pojo(plain ordinary java object)= entity =dto(data transmission object)

/**
 * @author wu
 */
public class People {
    private int id,age;
    private String name,address;

    public People() {

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getAge() {
        return age;
    }

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

    public String getName() {
        return name;
    }

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

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

<%--
  Created by IntelliJ IDEA.
  User: 28164
  Date: 2021/11/1
  Time: 19:14
  To change this template use File | Settings | File Templates.
--%>
<%@page import="com.wu.pojo.People" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
</head>
<body>
<%
//  People people = new People();
//  people.setname("吴五");
//  people.setaddress("揭阳");
//  people.setid(007);
//  people.setage(10);
%>

<jsp:useBean id="people" class="com.wu.pojo.People" scope="page"/>
<jsp:setProperty name="people" property="address" value="广州"/>
<jsp:setProperty name="people" property="id" value="008"/>
<jsp:setProperty name="people" property="name" value="小吴"/>
<jsp:setProperty name="people" property="age" value="20"/>
<jsp:getProperty name="people" property="name"/>
<jsp:getProperty name="people" property="address"/>
<jsp:getProperty name="people" property="id"/>
<jsp:getProperty name="people" property="age"/>

</body>
</html>

11、MVC三层架构

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

![(C:\Users\28164\AppData\Roaming\Typora\typora-user-images\image-20211031170729884.png)

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

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

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

Model

  • 业务处理:业务逻辑(Service)
  • 数据持久层:CRUD(create 添加数据read读取数据 update 修改数据delete删除数据) (DAO)

(data access Object)

View

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

Controller (Servlet)

  • 接受用户的请求参数:(req:请求参数、Session信息)

  • 交给业务层处理对应得代码

  • 控制视图的跳转

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

12、Filter(重点 )

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

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

流程:

1、导包不要出错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CdDfaEwf-1635834582786)(C:\Users\28164\Pictures\屏幕截图(16)]_LI.jpg)

2、实现Filter接口,重写三个方法

package com.wu.filter;

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

/**
 * The type Character encoding filter.
 *
 * @author wu
 */
public class CharacterEncodingFilter implements Filter {
    @Override

/**
 1、初始化
* */
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
/**
    1、过滤中的所有代码,都过滤特定请求的时候都会执行
    2、必须让过滤器继续同行

**/
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletResponse.setContentType("text/html;charset=gbk");
        System.out.println("CharacterEncodingFilter执行前。。。");
//        让我们继续执行,若不写,则程序执行到此处被拦截!!!!!!很重要!!!
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter执行后。。。");
    }

    @Override
    /**
      销毁过滤器,和服务器同步
     * */
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

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>ShowServlet</servlet-name>
    <servlet-class>com.wu.servlet.ShowServlet</servlet-class>
</servlet>
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/show</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>ShowServlet</servlet-name>
        <url-pattern>/servlet/show</url-pattern>
    </servlet-mapping>
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>com.wu.filter.CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
<!--        只要是Servlet的任何请求都会经过这个过滤器,尽量不要这样-->
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
</web-app>

13、监听器

1、编写一个监听器

实现监听器的接口,重写里面的方法

package com.wu.filter;

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

/**
 * The type Character encoding filter.
 *
 * @author wu
 */
public class CharacterEncodingFilter implements Filter {
    @Override

/**
 1、初始化
* */
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("过滤器初始化");
    }

    @Override
/**
    1、过滤中的所有代码,都过滤特定请求的时候都会执行
    2、必须让过滤器继续同行

**/
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        servletResponse.setContentType("text/html;charset=gbk");
        System.out.println("CharacterEncodingFilter执行前。。。");
//        让我们继续执行,若不写,则程序执行到此处被拦截
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("CharacterEncodingFilter执行后。。。");
    }

    @Override
    /**
      销毁过滤器,和服务器同步
     * */
    public void destroy() {
        System.out.println("过滤器销毁");
    }
}

2、在web.xml中注册监听器

Http

1、http请求

lastTime=1635580549518; Max-Age=300; Expires=Sat, 30-Oct-2021 08:00:49 GMT

lastTime=1635580549518; Max-Age=300; Expires=Sat, 30-Oct-2021 08:00:49 GMT

2、http响应

  • 服务器——响应——客户端

    百度

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

    响应体

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

    什么是HTTP响应
    当服务器收到浏览器的请求后,会发送响应消息给浏览器。一个完整的响应消息主要包括响应首行、响应头信息、空行和响应正文。

    HTTP响应消息分析
    HTTP/1.1 200 OK

    Server: Apache-Coyote/1.1

    Content-Type: text/html;charset=UTF-8

    Content-Length: 624

    Date: Mon, 03 Nov 2014 06:37:28 GMT

    响应体内容

    (1)响应首行:其内容是”HTTP/1.1 200 OK”

    l HTTP/1.1 :表示协议版本

    l 200 :表示响应状态码,200表示响应成功。

    l OK :表示响应成功,对响应状态码的解释。

    (2)响应头信息:类似于请求消息中的请求头,其格式和请求头信息格式一样,即响应头:响应头值。

    l Server响应头:该响应头是服务器告诉浏览器,当前响应的服务类型和版本。

    l Content-Type响应头:服务器告诉浏览器响应内容是什么类型,以及采用的是什么字符编码。该响应头的值现在为:text/html;charset=utf-8。说明响应信息的类型是文本类型中的html,使用的字符编码是utf-8。

    l Content-Length响应头:服务器告诉浏览器,响应内容的长度,该响应内容的长度现在是624个字节。

    l Date响应头:表示是服务器是在什么时候响应回浏览器,注意这里的时间是按照美国时间来计算。

    (3)空行:响应头和响应体由空行连接。

    (4)响应体:该响应消息的响应体是一个html文档。浏览器可以直接识别这个html文件。而我们访问的是一个jsp文件,响应回去的是一个html文件。说明服务器将该jsp翻译成了一个html,然后再响应给浏览器。

    响应状态码
    在http响应协议中,我们通过HttpWatch抓包抓取到响应信息。其中响应首行中就包含一个状态码。状态码由三位数字组成,表示请求是否被理解或者被满足。HTTP响应状态码的第一个数字定义了响应的类别,后面两位没有具体分类,第一个数字有五种可能的取值,具体介绍如下所示:

    l 1xx :表示请求已接收,需要继续处理。

    l 2xx :表示请求已经成功被服务器接收、理解、并接受

    l 3xx :为完成请求,客户端需要进一步细化请求

    l 4xx :客户端的请求有错误

    l 5xx :服务器端出现错误

!出现的问题及解决方法:

报错405

servlet提交表单,结果出错。

出现HTTP Status 405 - HTTP method GET is not supported by this URL 原因是:
1、继承自Httpservlet的Servlet没有重写对于请求和响应的处理方法:doGet或doPost等方法,默认调用父类的doGet或doPost等方法。
2、父类HttpServlet的doGet或doPost等方法覆盖了你写的到doGet或doPost等方法。
不管是1或2,父类HttpServlet的doGet或doPost等方法默认实现是返回状态码是405的Http错误表示 对于指定资源请求方法不被允许。
解决方法:
1、子类重写doGet或doPost等方法。
2、在你扩张的Servlet中重写doGet或doPost等方法来处理请求和响应时,不要调用父类的doGet或doPost等方法即去掉supper.doGet(request,response)和super.doPost(request,response);

报错404

Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

置的 Sources 和 Dependencies 里边都是jdk 1.8的。

根据以上错误显示以及上述配置,我选择的编译器是jdk1.8的,但是在idea里边选择的编译版本是不一致的,所以会导致以上问题,

解决问题: 配置idea的编译版本
file -> settings 然后如下:

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

pom.xml文件灰色且出现中间出现删除线

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

没有web.xml文件

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

修改maven默认配置

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

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

子模块无法继承父项目依赖

子模块继承父模块依赖的方法全部报错

<parent>
        <artifactId>maven-01</artifactId>
        <groupId>com.wu</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>

maven的pom.XML

 <dependencies>

    <!--standard标签库-->
    <dependency>
      <groupId>taglibs</groupId>
      <artifactId>standard</artifactId>
      <version>1.1.2</version>
    </dependency>
    <!--JSP依赖-->

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>4.0.1</version>
      <scope>provided</scope>
    </dependency>
    <!--JSTL表达式依赖-->
    <dependency>
      <groupId>javax.servlet.jsp.jstl</groupId>
      <artifactId>jstl-api</artifactId>
      <version>1.2</version>
    </dependency>

    <!--Servlet依赖-->
    <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>servlet-api</artifactId>
    <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>javax.servlet.jsp-api</artifactId>
      <version>2.3.3</version>
      <scope>provided</scope>
    </dependency>
    <!--数据库依赖-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.26</version>
    </dependency>
  </dependencies>

最新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>
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
整理自尚硅谷视频教程springboot高级篇,并增加部分springboot2.x的内容 一、Spring Boot与缓存 一、JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, CacheManager, Cache, Entry 和 Expiry。 • CachingProvider定义了创建、配置、获取、管理和控制多个CacheManager。一个应用可 以在运行 期访问多个CachingProvider。 • CacheManager定义了创建、配置、获取、管理和控制多个唯一命名 的Cache,这些Cache 存在于CacheManager的上下文中。一个CacheManager仅被一个 CachingProvider所拥有。 • Cache是一个类似Map的数据结构并临时存储以Key为索引的值。一个 Cache仅被一个 CacheManager所拥有。 • Entry是一个存储在Cache中的key-value对。 • Expiry 每一 个存储在Cache中的条目有一个定义的有效期。一旦超过这个时间,条目为过期 的状态。一旦过期,条 目将不可访问、更新和删除。缓存有效期可以通过ExpiryPolicy设置。 二、Spring缓存抽象 Spring从3.1开始定义了org.springframework.cache.Cache 和 org.springframework.cache.CacheManager接口来统一不同的缓存技术; 并支持使用JCache(JSR- 107)注解简化我们开发; • Cache接口为缓存的组件规范定义,包含缓存的各种操作集合; • Cache接 口下Spring提供了各种xxxCache的实现;如RedisCache,EhCacheCache , ConcurrentMapCache 等; • 每次调用需要缓存功能的方法时,Spring会检查检查指定参数的指定的目标方法是否 已经被调用 过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法 并缓存结果后返回给用户。下 次调用直接从缓存中获取。 • 使用Spring缓存抽象时我们需要关注以下两点; 1、确定方法需要被缓存 以及他们的缓存策略 2、从缓存中读取之前缓存存储的数据 Cache 缓存接口,定义缓存操作。实现有:RedisCache、EhCacheCache、 ConcurrentMapCache等 CacheManager 缓存管理器,管理各种缓存(Cache)组件 @Cacheable 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存 @CacheEvict 清空缓存 @CachePut 保证方法被调用,又希望结果被缓存。 @EnableCaching 开启基于注解的缓存 keyGenerator 缓存数据时key生成策略 serialize 缓存数据时value序列化策略 @CacheConfig 抽取缓存的公共配置 三、几个重要概念&缓存注解 1、常用注解 2、常用参数 名字 位置 描述 示例 methodName root object 当前被调用的方法名 #root.methodName method root object 当前被调用的方法 #root.method.name target root object 当前被调用的目标对象 #root.target targetClass root object 当前被调用的目标对象类 #root.targetClass args root object 当前被调用的方法的参数列表 #root.args[0] 3、常用参数SPEL说明 名字 位置 描述 示例 caches root object 当前方法调用使用的缓存列表(如 @Cacheable(value= {"cache1","cache2"}) ), 则有两 个cache #root.caches[0].name argument name evaluation context 方法参数的名字. 可以直接 #参数 名 ,也可以使用 #p0或#a0 的形 式,0代表参数的索引; #iban 、 #a0 、 #p0 result evaluation context 方法执行后的返回值(仅当方法执 行之后的判断有效,如‘unless’ , ’cache put’的表达式 ’cache evict’的表达式 beforeInvocation=false ) #result 四、代码中使用缓存 1、搭建基本环境 1、导入数据库文件 创建出department和employee表 2、创建javaBean封装数据 3、整合MyBatis操作数据库 1.配置数据源信息 2.使用注解版的MyBatis; 1)、@MapperScan指定需要扫描的mapper接口所在的包

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值