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>alimavenid>
<mirrorOf>centralmirrorOf>
<name>aliyun mavenname>
<url>http://maven.aliyun.com/nexus/content/groups/publicurl>
mirror>

<mirror>
<id>mirrorIdid>
<mirrorOf>centralmirrorOf>
<name>Human Readable Name name>
<url>http://repo1.maven.org/maven2/url>
mirror>

<mirror> 
<id>alimavenid> 
<name>aliyun mavenname> 
<url>http://central.maven.org/maven2url> 
<mirrorOf>centralmirrorOf> 
mirror>

<mirror> 
<id>alimavenid> 
<name>aliyun mavenname> 
<url>http://maven.aliyun.com/nexus/content/repositories/central/url> 
<mirrorOf>centralmirrorOf> 
mirror>

<mirror> 
<id>junitid> 
<name>junit Address/name> 
<url>http://jcenter.bintray.com/url> 
<mirrorOf>centralmirrorOf> 
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)]


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



<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.0modelVersion>

<groupId>org.examplegroupId>
<artifactId>maven7artifactId>
<version>1.0-SNAPSHOTversion>

<packaging>warpackaging>

<name>maven7 Maven Webappname>

<url>http://www.example.comurl>

<properties>

<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<maven.compiler.source>1.7maven.compiler.source>
<maven.compiler.target>1.7maven.compiler.target>
properties>

<dependencies>



<dependency>
    <groupId>junitgroupId>
    <artifactId>junitartifactId>
    <version>4.11version>
    <scope>testscope>
dependency>

<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-webmvcartifactId>
    <version>5.3.4version>
dependency>

<dependency>
    <groupId>javax.servlet.jspgroupId>
    <artifactId>javax.servlet.jsp-apiartifactId>
    <version>2.3.3version>
    <scope>providedscope>
dependency>


<dependency>
    <groupId>javax.servletgroupId>
    <artifactId>javax.servlet-apiartifactId>
    <version>4.0.1version>
dependency>
dependency>

dependencies>

<build>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<excludes>
<exclude>**/*.propertiesexclude>
<exclude>**/*.xmlexclude>
excludes>
<filtering>falsefiltering>
resource>
<resource>
<directory>src/main/javadirectory>
<includes>
<include>**/*.propertiesinclude>
<include>**/*.xmlinclude>
includes>
<filtering>falsefiltering>
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的核心)



<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.0modelVersion>

  <groupId>org.examplegroupId>
  <artifactId>maven7artifactId>
  <version>1.0-SNAPSHOTversion>
  
  <packaging>warpackaging>

  <name>maven7 Maven Webappname>
  
  <url>http://www.example.comurl>

  <properties>
    
    <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    <maven.compiler.source>1.7maven.compiler.source>
    <maven.compiler.target>1.7maven.compiler.target>
  properties>

  <dependencies>
    
    
    
    <dependency>
      <groupId>junitgroupId>
      <artifactId>junitartifactId>
      <version>4.11version>
      <scope>testscope>
    dependency>
      
    <dependency>
      <groupId>org.springframeworkgroupId>
      <artifactId>spring-webmvcartifactId>
      <version>5.3.4version>
         <dependency>
             
      <groupId>javax.servlet.jspgroupId>
      <artifactId>javax.servlet.jsp-apiartifactId>
      <version>2.3.3version>
      <scope>providedscope>
    dependency>


    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>javax.servlet-apiartifactId>
      <version>4.0.1version>

    dependency>
    dependency>

  dependencies>
  
    <build>
      <resources>
        <resource>
          <directory>src/main/resourcesdirectory>
          <excludes>
            <exclude>**/*.propertiesexclude>
            <exclude>**/*.xmlexclude>
          excludes>
          <filtering>falsefiltering>
        resource>
        <resource>
          <directory>src/main/javadirectory>
          <includes>
            <include>**/*.propertiesinclude>
            <include>**/*.xmlinclude>
          includes>
          <filtering>falsefiltering>
        resource>
      resources>
    build>

project>

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

父项目中会有

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

子项目中会有

  <parent>
        <artifactId>maven-01artifactId>
        <groupId>com.wugroupId>
        <version>1.0-SNAPSHOTversion>
    parent>

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

son extends father

3、Maven环境优化

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


<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-name>helloservlet-name>
    <servlet-class>com.wu.servlet.HelloServletservlet-class>
servlet>


<servlet-mapping>
    <servlet-name>helloservlet-name>
    <url-pattern>/hellourl-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>helloservlet-name>
    <url-pattern>/hellourl-pattern>
servlet-mapping>

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

 <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hellourl-pattern>
    servlet-mapping>
 <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hello1url-pattern>
    servlet-mapping>
 <servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>/hello2url-pattern>
    servlet-mapping>

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

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

4.默认请求路径


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

5.指定后缀或者前缀等


<servlet-mapping>
        <servlet-name>helloservlet-name>
        <url-pattern>*.xiaowuurl-pattern>
    servlet-mapping>

6.优先级问题

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


<servlet>
    <servlet-name>errorservlet-name>
    <servlet-class>com.wu.servlet.errorServletservlet-class>
servlet>
<servlet-mapping>
    <servlet-name>errorservlet-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);
    }
}

    <context-param>
        <param-name>urlparam-name>
        <param-value>jdbc:mysql://localhost:3306/mybatisparam-value>
    context-param>
    <servlet>
        <servlet-name>Initservlet-name>
        <servlet-class>com.wu.servlet.InitServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>Initservlet-name>
        <url-pattern>/Initurl-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>Disservlet-name>
        <servlet-class>com.wu.servlet.DispartcherServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>Disservlet-name>
        <url-pattern>/disurl-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>proservlet-name>
        <servlet-class>com.wu.servlet.PropertiesServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>proservlet-name>
        <url-pattern>/prourl-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+"
"
+password); //重定向时要注意路径,否则报错404 resp.sendRedirect("/s2/success.jsp"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }


Hello World!

<%--这里提交的路径,需要寻找到项目的路径--%> <%--${pageContext.request.contextPath}代表当前的项目--%>
用户名:
密码:
<%-- 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" %> 登录测试成功!

登录测试成功!

  <servlet>
        <servlet-name>reqservlet-name>
        <servlet-class>com.wu.servlet.RequestServletservlet-class>
    servlet>
    <servlet-mapping>
        <servlet-name>reqservlet-name>
        <url-pattern>/requrl-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);
    }

  <session-config>
      <cookie-config>
          
          <max-age>1max-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("\r\n");

以此种方式,输出到前端

3、jsp基础语法

任何语言都有自己的语法

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

1、JSP表达式
<%--JSP表达式
    作用:用来将程序的输出,输出到客户端
    <%变量或者表达式%>--%>
    <%= new java.util.Date()%>
2、脚本片段
<%
   String str = "Hello World!";
    out.println("

输出:"+str+"

"
); %>
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("\r\n");
out.write("\r\n");
out.write("    头部页面\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("这是头部\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("\r\n");
out.write("

这是主体1!

\r\n"
); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("\r\n"); out.write(" 底部文件\r\n"); out.write("\r\n"); out.write("\r\n"); out.write("这是底部\r\n"); out.write("\r\n"); out.write("\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("\r\n");
      out.write("\r\n");
      out.write("
\r\n"
); org.apache.jasper.runtime.JspRuntimeLibrary.include(request, response, "/common/header.jsp", out, false); out.write("\r\n"); out.write("

这是主体2!

\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("\r\n"); out.write("\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" %>


    内置对象


<%-- 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表达式输出 ${}}--%>
 ${name1}
    ${name2}
    ${name3}
    ${name4}
    <%=name5%>




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


    取值


 ${name1}
    ${name2}
    ${name3}
    ${name4}
    ${id}





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


    Title


<%
    pageContext.forward("/index.jsp");
    //request.getRequestDispatcher("/index.jsp").forward(request,response);
%>



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

EL表达式 ${}

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

JSP标签

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


    jstl








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


    Title


name:<%=request.getParameter("name")%>
id:<%=request.getParameter("id")%>


JSTL标签

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

核心标签()

格式化标签

SQL标签

XML标签

JSTL标签库使用步骤

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

JSTL自己去看菜鸟教程或W3school

10、JavaBean

实体类

JavaBean有特定的写法:

  • 必须要有一个无参构造

  • 属性必须私有化

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

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

  • 表——类

  • 字段——属性

  • 行记录——对象

    people表

id name age address
1 吴1 10 揭阳
2 吴2 11 上海
3 吴3 12 北京
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" %>




<%
//  People people = new People();
//  people.setname("吴五");
//  people.setaddress("揭阳");
//  people.setid(007);
//  people.setage(10);
%>













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


<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>ShowServletservlet-name>
    <servlet-class>com.wu.servlet.ShowServletservlet-class>
servlet>
    <servlet-mapping>
        <servlet-name>ShowServletservlet-name>
        <url-pattern>/showurl-pattern>
    servlet-mapping>
    <servlet-mapping>
        <servlet-name>ShowServletservlet-name>
        <url-pattern>/servlet/showurl-pattern>
    servlet-mapping>
    <filter>
        <filter-name>CharacterEncodingFilterfilter-name>
        <filter-class>com.wu.filter.CharacterEncodingFilterfilter-class>
    filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilterfilter-name>

        <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-01artifactId>
        <groupId>com.wugroupId>
        <version>1.0-SNAPSHOTversion>
    parent>

maven的pom.XML

 <dependencies>

    
    <dependency>
      <groupId>taglibsgroupId>
      <artifactId>standardartifactId>
      <version>1.1.2version>
    dependency>
    

    <dependency>
      <groupId>javax.servletgroupId>
      <artifactId>javax.servlet-apiartifactId>
      <version>4.0.1version>
      <scope>providedscope>
    dependency>
    
    <dependency>
      <groupId>javax.servlet.jsp.jstlgroupId>
      <artifactId>jstl-apiartifactId>
      <version>1.2version>
    dependency>

    
    <dependency>
    <groupId>javax.servletgroupId>
    <artifactId>servlet-apiartifactId>
    <version>2.5version>
    dependency>
    <dependency>
      <groupId>javax.servlet.jspgroupId>
      <artifactId>javax.servlet.jsp-apiartifactId>
      <version>2.3.3version>
      <scope>providedscope>
    dependency>
    
    <dependency>
      <groupId>mysqlgroupId>
      <artifactId>mysql-connector-javaartifactId>
      <version>8.0.26version>
    dependency>
  dependencies>

最新web.xml


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

你可能感兴趣的:(maven,java)