Crazy God said Java Web notes with the latest video

1. Basic concepts

1.1 Preface

web development:

  • Web, the meaning of web page, www.baidu.com·
  • Static web
    • html,sss
    • The data provided to everyone will never change!
  • Dynamic web
    • Taobao, almost all websites;
    • The data provided to everyone will always change, and everyone will see different information at different times and places!
    • Technology stack: Servlet/ISP, ASP, PHP

1.2. Web application web application:

Programs that can provide browser access;

  • a.html, b.html,... Multiple web resources, which can be accessed by the outside world and provide services to the outside world;
  • Any page or resource you can access exists on a computer in a corner of the world.
  • URL
  • This unified web resource will be placed in the same folder, Web Application > Tomcat: server
  • A web application consists of many parts (static web, dynamic web)
    • html,sss,is
    • jsp,servlet
    • Java program
    • jar package
    • Configuration files (Properties)

After the Web application is written, if you want to provide external access, you need to charge a service fee for unified management

1.3. Static web

  • *. htm, *. html these are the background of network members. If these Dongsi exist on the server all the time, we can read them directly and need the network;
  • Disadvantages of static web
    • The Web page cannot be dynamically updated. All users see the same page
      • Rotation chart, click special effect: pseudo dynamic
      • JavaScript [in actual development, it is used most]
      • VBScript
    • It cannot interact with the database (data cannot be persisted, and users cannot interact)

1.4 dynamic web

The page will be displayed dynamically, "the display effect of web page varies from person to person"

Disadvantages:

  • There is an error in the dynamic web resources added to the server. We need to rewrite our background program and publish it again;
    • Advantages of shutdown maintenance:
  • Web pages can be updated dynamically, and all users see different pages
  • It can interact with the database (data persistence: registration, product information, user information...)

2. web server

2.1 technical explanation

ASP:

  • Microsoft: ASP is the first popular in China;
  • ·Embedded VB script in HTML, ASP+COM;
  • ·In ASP development, a page basically has several lines of business code, and the page is extremely messy
  • ·High maintenance cost!
  • C#
  • IIS

php:

  • PHP has fast development speed, powerful functions, cross platform, and simple code (70%, WP)
  • ·Unable to carry large traffic (limitations)

jSP/Servlet:
B/S; browse and server C/S: client and server

  • B/S architecture mainly promoted by sun company
  • Based on Java language (all large companies or some open source components are written in Java)
  • It can bear the impact of the three high problems;
  • Syntax like ASP, ASP - > JSP, strengthen market strength;

2.2. web server

Server is a passive operation, which is used to process some user requests and give users some response information;
lIS
Microsoft; ASP, which comes with windows
Tomcat


Programming for Baidu:
Tomcat is the Apache Software Foundation (Apache Software Foundation) a core project in the jakarta project, the latest Servlet and ISP specification can always be reflected in Tomcat, because Tomcat technology is advanced, stable and free, so it is loved by lava enthusiasts and has been recognized by some software developers. It has become a popular Web application server.

Tomcat server is a free open source web application server. It is a lightweight application server. It is widely used in small and medium-sized systems and when there are not many concurrent access users. It is the first choice for developing and debugging ISP programs. For a Java novice, it is the best choice

Tomcat actually runs JSP pages and serlets. The latest version of Tornct is easy 9.0

After working for 3-5 years, you can try to write Tomcat server;

Download tomcat:

  1. Install or unzip
  2. Understand the configuration file and directory structure
  3. The function of this thing

3,Tomcat

3.1 installing Tomcat

Official website: http://tomcat.apache.org/


3.2. Tomcat startup and configuration

Folder function:


Access test: http://localhost:8080/
Possible problems:

  1. Java environment variables are not configured
  2. Flash back problem: compatibility needs to be configured
  3. Garbled code problem: set in the configuration file

You can modify java.util.logging.ConsoleHandler.encoding = GBK in conf/logging.properties to solve the problem of garbled code

3.3 configuration

You can configure the port number for startup

  • The default port number of tomcat is 8080
  • mysql:3306
  • http:80
  • https: 443
<Connector port="8081" protocol="HTTP/1.1"
      connectionTimeout="20000"
      redirectPort="8443" />

You can configure the name of the host

  • The default host name is localhost - > 127.0.0.1
  • The default site application location is webapps
  <Host name="www.qinjiang.com"  appBase="webapps"
        unpackWARs="true" autoDeploy="true">

Difficult interview questions:
Please talk about how the website is accessed!

  1. Enter a domain name; enter

  2. Check whether there is this domain name mapping under the C:\Windows\System32\drivers\etc\hosts configuration file of this machine;

    1. Yes: directly return the corresponding ip address. In this address, there are web programs we need to access, which can be accessed directly

       127.0.0.1 www.qinjiang.com
      
    2. No: go to the DNS server and return if found. If not, return if not found;

4. You can configure the following environment variables (optional)

3.4. Publish a web site

If you don't, imitate first

  • Put the website written by yourself under the specified web application folder (webapps) in the server (Tomcat), and you can access it

The structure that a website should have

--webapps : Tomcat Server web catalogue
	-ROOT
	-kuangstudy : Directory name of the web site
		- WEB-INF
			-classes : java program
			-lib: web Application dependent jar package
			-web.xml : Site profile
		- index.html Default home page
		- static 
            -css
            	-style.css
            -js
            -img
         -.....

HTTP protocol: Interview
Maven: build tool

  • Maven installation package

Getting started with Servlet

  • HelloWorld!
  • Servlet configuration and principle

4,Http

4.1. What is HTTP

Hypertext Transfer Protocol (HTTP) is a simple request response protocol, which usually runs on TCP.

  • Text: html, string
  • Hypertext: picture, music, video, location, map
  • Port: 80

Https: Secure

4.2 two times

  • http1.0
    • HTTP/1.0: after the client can connect to the web server, it can only obtain one web resource and disconnect
  • http2.0
    • HTTP/1.1: after the client can connect with the web server, it can obtain multiple web resources.

4.3 Http request

  • Client – Request – server

Baidu:

Request URL:https://www.baidu.com/ request address
Request Method:GET    get method/post method
Status Code:200 OK    Status code: 200
Remote((remote) Address:14.215.177.39:443

Accept:text/html  
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.9    language
Cache-Control:max-age=0
Connection:keep-alive

1. Request line

  • Request method in request line: GET
  • Request method: get, post, head, delete, put, trace
    • get: the request can carry few parameters with limited size. The data content will be displayed in the URL address bar of the browser, which is unsafe but efficient
    • post: the parameters that the request can carry are not limited, and the size is not limited. The data content will not be displayed in the URL address bar of the browser. It is safe but not efficient.

2. Message header

Accept: Tell the browser what data types it supports
Accept-Encoding: Which encoding format is supported  GBK   UTF-8   GB2312  ISO8859-1
Accept-Language: Tell the browser its locale
Cache-Control: Cache control
Connection: Tell the browser whether to disconnect or remain connected when the request is completed
HOST: host..../.

4.4 Http response

  • Server – response....... Client

Baidu:

Cache-Control:private    Cache control
Connection:Keep-Alive    connect
Content-Encoding:gzip    code
Content-Type:text/html   type  

1. Responder

Accept: Tell the browser what data types it supports
Accept-Encoding: Which encoding format is supported  GBK   UTF-8   GB2312  ISO8859-1
Accept-Language: Tell the browser its locale
Cache-Control: Cache control
Connection: Tell the browser whether to disconnect or remain connected when the request is completed
HOST: host..../.
Refresh: Tell the client how often to refresh;
Location: Repositioning the web page;

2. Response status code

200: request response succeeded 200
3xx: request redirection · redirection: you go back to the new location I gave you;
4xx: resource not found 404 · resource does not exist;
5xx: server code error 500 502: gateway error

Common interview questions:
When you enter the address in the address bar of your browser and press enter, what happened when the page can be displayed back?

5,Maven

Why should I learn this technology?

  1. In Java Web development, we need to use a large number of jar packages, which we import manually;
  2. How can I make something automatically import and configure this jar package for me.

Thus, Maven was born!

5.1 Maven project architecture management tool

We are currently used to facilitate the import of jar packages!
Maven's core idea: Convention is greater than configuration

  • There are constraints. Don't break them.

Maven will specify how you should write our Java code, which must be in accordance with this specification;

5.2 download and install Maven

Official website: https://maven.apache.org/

After downloading, unzip it;
Little crazy God friendly suggestion: all the environments on the computer are placed in one folder for easy management;

5.3 configuring environment variables

Configure the following configuration in our system environment variable:

  • M2_ bin directory under home Maven directory
  • MAVEN_HOME maven directory
  • Configure% Maven in the path of the system_ HOME%\bin

    Test whether Maven is installed successfully and ensure that the configuration must be completed!

5.4 Alibaba cloud image

  • Mirroring: mirrors
  • Function: accelerate our download
  • Alibaba cloud image is recommended in China
<mirror>
    <id>nexus-aliyun</id>  
    <mirrorOf>*,!jeecg,!jeecg-snapshots</mirrorOf>  
    <name>Nexus aliyun</name>  
    <url>http://maven.aliyun.com/nexus/content/groups/public</url> 
</mirror>

D:Enmvironment\apache-maven-3.6.2conf\ettings.xml
(madness teacher configures the file location of source and warehouse)

5.5 local warehouse

Local warehouse, remote warehouse; Set up a local repository: localRepository

<localRepository>D:\Environment\apache-maven-3.6.2\maven-repo</localRepository>

5.6 ~ 5.13 notes - download address

(reject dial) download address: https://wo-bell.lanzous.com/ibuibxi

Later 5.6 ~ 5.13 + case demonstration (Figure)

The rest of the notes in the following part 5 suggest to cooperate with the spirit of madness
"javaweb-06: Maven operation in IDEA", "javaweb-07: solving some problems we encounter"
Look back carefully

6,Servlet

6.1 introduction to Servlet

  • Servlet is a technology for sun company to develop dynamic web
  • Sun provides an interface called Servlet in these APIs. If you want to develop a Servlet program, you only need to complete two small steps:
    • Write a class to implement the Serlet interface
    • Deploy the developed java classes to the web server.

The Java program that implements the Servlet interface is called Servlet

6.2,HelloServlet

Servlet interface Sun has two default implementation classes: HttpServlet and genericservlet

6.2,HelloServlet

  1. Build an ordinary Maven project and the sc directory of the management surface. In the future, we will build Moudel in this project; This empty project is called Maven main project;
  2. Understanding of Maven father son project;
    There will be in the parent project
      <modules>
          <module>servlet-01</module>
      </modules>

Sub projects will have

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

java subprojects in the parent project can be used directly

son extends father
  1. Maven environment optimization
    1. Modify web.xml to the latest
    2. Complete the structure of maven
      .
  2. Write a Servlet program
    1. Write a common class
    2. Implement the Servlet interface. Here we directly inherit HttpServlet
     public class HelloServlet extends HttpServlet {
    
         
         //Because get or post are only different ways of request implementation, they can call each other, and the business logic is the same;
         @Override
         protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
             //ServletOutputStream outputStream = resp.getOutputStream();
             PrintWriter writer = resp.getWriter(); //Response flow
             writer.print("Hello,Serlvet");
         }
     
         @Override
         protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
             doGet(req, resp);
         }
     }
     
  1. Write the mapping of servlets
    Why mapping is needed: we write a JAVA program, but we need to access it through the browser, and the browser needs to connect to the web server, so we need to
    To register the Servlet we wrote in the web service, we also need to give it a path that the browser can access;
      <!--register Servlet-->
      <servlet>
          <servlet-name>hello</servlet-name>
          <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
      </servlet>
      <!--Servlet Request path for-->
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
      </servlet-mapping>
  
  1. Configure Tomcat
    Note: just configure the project publishing path

  2. Start the test, OK!

6.3 Servlet principle

Servlet is called by the web server. After receiving the browser request, the web server will:

6.4. Mapping problem

  1. A Servlet can specify a mapping path
    .
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
      </servlet-mapping>
  1. A servlet can specify multiple mapping paths
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello2</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello3</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello4</url-pattern>
      </servlet-mapping>
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello5</url-pattern>
      </servlet-mapping>
  
  1. A servlet can specify a generic mapping path
      <servlet-mapping>
          <servlet-name>hello</servlet-name>
          <url-pattern>/hello/*</url-pattern>
      </servlet-mapping>
  1. Default request path
       <!--Default request path-->
       <servlet-mapping>
           <servlet-name>hello</servlet-name>
           <url-pattern>/*</url-pattern>
       </servlet-mapping>
  1. Specify some suffixes or prefixes, etc
  <!--You can customize the suffix to implement request mapping
      Be careful,*The path of the project mapping cannot be preceded
      hello/sajdlkajda.qinjiang
      -->
  <servlet-mapping>
      <servlet-name>hello</servlet-name>
      <url-pattern>*.qinjiang</url-pattern>
  </servlet-mapping>
  1. Priority issues
    It specifies the inherent mapping path with the highest priority. If it cannot be found, it will go to the default processing request;
  <!--404-->
  <servlet>
      <servlet-name>error</servlet-name>
      <servlet-class>com.kuang.servlet.ErrorServlet</servlet-class>
  </servlet>
  <servlet-mapping>
      <servlet-name>error</servlet-name>
      <url-pattern>/*</url-pattern>
  </servlet-mapping>
  

6.5,ServletContext

When the web container starts, it will create a corresponding ServletContext object for each web application, which represents the current web application;

1. Shared data

The data I saved in this servlet can be obtained in another servlet;

public class HelloServlet extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        
        //this.getInitParameter() initialization parameter
        //This. Getservletconfig() servlet configuration
        //This. Getservletcontext() servlet context
        ServletContext context = this.getServletContext();

        String username = "Qin Jiang"; //data
        context.setAttribute("username",username); //A data is saved in the ServletContext with the name username. Value username

    }

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

        resp.setContentType("text/html");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().print("name"+username);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        doGet(req, resp);
    }
}
    <servlet>
        <servlet-name>hello</servlet-name>
        <servlet-class>com.kuang.servlet.HelloServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>hello</servlet-name>
        <url-pattern>/hello</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>getc</servlet-name>
        <servlet-class>com.kuang.servlet.GetServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>getc</servlet-name>
        <url-pattern>/getc</url-pattern>
    </servlet-mapping>

Test access results;

2. Get initialization parameters

    <!--Configure some web Application initialization parameters-->
    <context-param>
        <param-name>url</param-name>
        <param-value>jdbc:mysql://localhost:3306/mybatis</param-value>
    </context-param>
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    ServletContext context = this.getServletContext();
    String url = context.getInitParameter("url");
    resp.getWriter().print(url);
}

3. Request forwarding

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    ServletContext context = this.getServletContext();
    System.out.println("Entered ServletDemo04");
    //RequestDispatcher requestDispatcher = context.getRequestDispatcher("/gp"); // Forwarded request path
    //requestDispatcher.forward(req,resp); // Call forward to forward the request;
    context.getRequestDispatcher("/gp").forward(req,resp);
}


4. Read resource file
Properties

  • Create new properties in the java directory
  • Create new properties in the resources directory

Discovery: they are all packaged in the same path: classes. We commonly call this path classpath:
Idea: you need a file stream

username=root12312
password=zxczxczxc

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

        InputStream is = this.getServletContext().getResourceAsStream("/WEB-INF/classes/com/kuang/servlet/aa.properties");

        Properties prop = new Properties();
        prop.load(is);
        String user = prop.getProperty("username");
        String pwd = prop.getProperty("password");

        resp.getWriter().print(user+":"+pwd);

    }

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

Access the test, ok;

6.6,HttpServletResponse

web The server received a message from the client http Request. For this request, create a representative request HttpServletRequest
 Object that represents a response HttpServletResponse;
  • If you want to get the parameters requested by the client: find HttpServletRequest

  • If you want to respond to the client with some information: find HttpServletResponse

    1. Simple classification

Method responsible for sending data to browser

 servletOutputstream getOutputstream() throws IOException;
    Printwriter getwriter() throws IOException;

Method responsible for sending response header to browser

void setCharacterEncoding(String var1);
void setContentLength(int var1);
void setContentLengthLong(long var1);
void setContentType(String var1);
void setDateHeader(String varl,long var2)
void addDateHeader(String var1,long var2)
void setHeader(String var1,String var2);
void addHeader(String var1,String var2);
void setIntHeader(String var1,int var2);
void addIntHeader(String varl,int var2);

Response status code

2. Download File

  1. Output a message to the browser (keep talking, don't talk)
  2. Download File
    1. To get the path of the downloaded file
    2. What is the name of the downloaded file?
    3. Set up a way to make the browser support downloading what we need
    4. Gets the input stream of the downloaded file
    5. Create buffer
    6. Get OutputStream object
    7. Writes the FileOutputStream stream to the bufer buffer
    8. Use OutputStream to output the data in the buffer to the client!
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    // 1. To get the path of the downloaded file
    String realPath = "F:\\Class management\\Xikai [19525]\\2,code\\JavaWeb\\javaweb-02-servlet\\response\\target\\classes\\Qin Jiang.png";
    System.out.println("Path to download file:"+realPath);
    // 2. What is the name of the downloaded file?
    String fileName = realPath.substring(realPath.lastIndexOf("\\") + 1);
    // 3. Set up a way to make the browser support (content disposition) to download what we need. The Chinese file name is URLEncoder.encode, otherwise it may be garbled
    resp.setHeader("Content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
    // 4. Obtain the input stream of the downloaded file
    FileInputStream in = new FileInputStream(realPath);
    // 5. Create buffer
    int len = 0;
    byte[] buffer = new byte[1024];
    // 6. Get OutputStream object
    ServletOutputStream out = resp.getOutputStream();
    // 7. Write the FileOutputStream stream to the buffer, and use OutputStream to output the data in the buffer to the client!
    while ((len=in.read(buffer))>0){
    
        out.write(buffer,0,len);
    }

    in.close();
    out.close();
}

3. Verification code function

How did the verification come from?

  • Front end implementation
  • The back-end implementation needs to use the Java picture class to produce a picture
package com.kuang.servlet;

import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;

public class ImageServlet extends HttpServlet {
    

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

        //How to make the browser refresh automatically every 3 seconds;
        resp.setHeader("refresh","3");
        
        //Create a picture in memory
        BufferedImage image = new BufferedImage(80,20,BufferedImage.TYPE_INT_RGB);
        //Get pictures
        Graphics2D g = (Graphics2D) image.getGraphics(); //pen
        //Set the background color of the picture
        g.setColor(Color.white);
        g.fillRect(0,0,80,20);
        //Write data to pictures
        g.setColor(Color.BLUE);
        g.setFont(new Font(null,Font.BOLD,20));
        g.drawString(makeNum(),0,20);

        //Tell the browser that the request is opened in the form of a picture
        resp.setContentType("image/jpeg");
        //There is a cache in the website. Do not let the browser cache
        resp.setDateHeader("expires",-1);
        resp.setHeader("Cache-Control","no-cache");
        resp.setHeader("Pragma","no-cache");

        //Write the picture to the browser
        ImageIO.write(image,"jpg", resp.getOutputStream());

    }

    //Generate random number
    private String makeNum(){
    
        Random random = new Random();
        String num = random.nextInt(9999999) + "";
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < 7-num.length() ; i++) {
    
            sb.append("0");
        }
        num = sb.toString() + num;
        return num;
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        doGet(req, resp);
    }
}
<servlet>
	<servlet-name>ImageServlet</servlet-name>
	<servlet-class>com.kuang.servlet.ImageServlet</servlet-class>
</servlet>
<servlet-mapping>
	<servlet-name>Imageservlet</servlet-name>
	<url-pattern>/img</url-pattern>
</servlet-mapping>


Common scenarios:

  • User login
 void sendRedirect(String var1) throws IOException;

Test:

@override
protected void doGet(HttpservletRequest req, HttpservletResponse resp) throws ServletException, IOException {
    

    resp. sendRedirect("/r/img");//redirect
    /*
    resp. setHeader("Location","/r/img");
    resp. setstatus (302);
    *
}



index.jsp

<html>
	<body>
		<h2>Hel1o World!</h2>
		
		<%--Here is the path of intersection,You need to find the path to the project--%>
		<%--${pageContext. request, contextPath}Represents the current project--%>
		<form action="${pageContext. request.contextPath}/login" method="get">
			user name: <input type="text" name="username"> <br>
			password: <input type="password" name="password"> <br>
			<input type="submit">
		</form>
	
	</body>
</html>

RequestTest.java

public class RequestTest extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    //Processing method
    String username = req.getParameter( s: "username");
    String password  rea.getParameter( s: "password");

    System.out.println(username+":"+password);

    resp.sendRedirect(s: "/r/success.jsp");
}

Redirect page success.jsp

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

web.xml configuration

    <servlet>
    <servlet-name>requset</servlet-name>
    <servlet-class>com. kuang. servlet. RequestTest</servlet-class>
    </servlet>
    <servlet-mapping>
    <servlet-name>requset</servlet-name>
    <url-pattern>/login</url-pattern>
    </servlet-mapping>

Import dependent jar packages

    <dependencies>
    <!-- https://mvnrepository. com/artifact/javax. servLet/javax. servlet-opi -->
    <dependency>
    <groupld>javax.servlet</grouptd>
    <artifactId>javax. servlet-api</artifactId>
    <version>4.0.1</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/javax. servLet.jsp/javax. servLet.jsp-opi -->
    <dependency>
    <groupId>javax.servlet.jsp</groupld>
    <artifactId>javax. servlet.jsp-api</artifactId>
    <version>2.3.3</version>
    </dependency>
    </dependencies>
    </project>

6.7,HttpServletRequest

HttpServletRequest represents the request of the client. The user accesses the server through the HTTP protocol. All the information in the HTTP request will be encapsulated in HttpServletRequest. All the information of the client will be obtained through this HttpServletRequest method;

Get parameters and request forwarding


Create your own class and inherit the HttpServlet class

@Override
protected void doGet(HttpservletRequest req. HttpservletResponse resp) throws ServletException, IOException {
    

	req. setcharacterEncoding("utf-8");
	resp.setcharacterEncoding("utf-8");
	String username = req.getParameter("username");
	String password = req.getParameter("password");
	String[] hobbys = req.getParameterValues("hobbys");
	System.out.println("==========");
	//Background receiving Chinese garbled code
	System. out.println(username);
	System. out.println(password);
	System. out.println(Arrays.tostring(hobbys));
	System. out.println("============");
	system. out.println(req.getContextPath());
	//Forward by request
	/// here represents the current web application
	req.getRequestDispatcher("/success.jsp").forward(req,resp);
}

7,Cookie,Session

7.1 conversation

Session: users open a browser, click many hyperlinks, access multiple web resources, and close the browser. This process can be called session;

Stateful conversation: when a classmate comes to the classroom next time, we will know that the classmate has been here, which is called stateful conversation;

How can you prove that you are a student of Xikai?

You drive west

  1. I'll give you an invoice
  2. School registration mark Xikai. You've been here

A website, how to prove you've been here?

Client server

  1. The server sends a letter to the client, and the client can bring the letter to the server next time; cookie
  2. The server registers that you have been here. Next time you come, I will match you; seesion

7.2. Two techniques for saving sessions

cookie

  • Client Technology (response, request)

session

  • Server technology, which can save the user's Session information? We can put information or data in the Session!

Common: after you log in to the website, you don't need to log in again next time. You can go up directly for the second visit!

7.3,Cookie

  1. Get cookie information from the request
  2. The server responds to the client cookie
Cookie[] cookies = req.getCookies(); //Get cookies
cookie.getName(); //Get the key in the cookie
cookie.getValue(); //Get vlaue in cookie
new Cookie("lastLoginTime", System.currentTimeMillis()+""); //Create a new cookie
cookie.setMaxAge(24*60*60); //Set the validity period of the cookie
resp.addCookie(cookie); //Respond to a cookie to the client

cookie: usually saved in the local user directory appdata;

Whether there is an upper limit for a website cookie! Talk about the details

  • A Cookie can only save one information;
  • A web site can send multiple cookies to the browser and store up to 20 cookies;
  • The Cookie size is limited to 4kb;
  • 300 cookie browser limit

Delete cookies;

  • If the validity period is not set, close the browser and it will automatically become invalid;
  • Set the validity time to 0;

Encoding and decoding:

URLEncoder.encode("Qin Jiang","utf-8")
URLDecoder.decode(cookie.getValue(),"UTF-8")

7.4. Session (key)


What is a Session:

  • The server will create a Seesion object for each user (browser);
  • A Session monopolizes a browser. As long as the browser is not closed, the Session exists;
  • Once the user logs in, the entire website can be accessed! – > Save user information; Save cart information

...
...
...

The difference between Session and cookie:

  • Cookie is to write the user's data to the user's browser, and the browser saves it (multiple can be saved)
  • Session writes the user's data to the user's exclusive session and saves it on the server (saves important information and reduces the waste of server resources)
  • The Session object is created by the service;

Usage scenario:

  • Save the information of a login user;
  • Shopping cart information;
  • We save the data often used in the whole website in Session;

Using Session:

package com.kuang.servlet;

import com.kuang.pojo.Person;

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

public class SessionDemo01 extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        
        //Solve the problem of garbled code
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        resp.setContentType("text/html;charset=utf-8");
        
        //Get Session
        HttpSession session = req.getSession();
        //Save something in the Session
        session.setAttribute("name",new Person("Qin Jiang",1));
        //Gets the ID of the Session
        String sessionId = session.getId();

        //Judge whether the Session is newly created
        if (session.isNew()){
    
            resp.getWriter().write("session Created successfully,ID:"+sessionId);
        }else {
    
            resp.getWriter().write("session And exists in the server,ID:"+sessionId);
        }

        //What was done when the Session was created;
//        Cookie cookie = new Cookie("JSESSIONID",sessionId);
//        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
        doGet(req, resp);
    }
}
//Get Session
HttpSession session = req.getSession();

Person person = (Person) session.getAttribute("name");

System.out.println(person.toString());

HttpSession session = req.getSession();
session.removeAttribute("name");
//Manually unregister Session
session.invalidate();

Automatic session Expiration: web.xml configuration

<!--set up Session Default expiration time-->
<session-config>
    <!--15 Minutes later Session Automatic failure, in minutes-->
    <session-timeout>15</session-timeout>
</session-config>

8,JSP

8.1. What is JSP

Java Server Pages: Java server-side pages, like servlets, are used for dynamic Web technology!

Biggest features:

  • Writing JSP is like writing HTML
  • difference:
    • HTML only provides users with static data
    • JAVA code can be embedded in JSP pages to provide users with dynamic data;

8.2 JSP principle

Idea: how to execute JSP!

  • There are no problems at the code level

  • Server internal work

    There is a work directory in tomcat;

    If Tomcat is used in the IDEA, a work directory will be produced in Tomcat of the IDEA

    My computer address:

    C:\Users\Administrator.IntelliJIdea2018.1\system\tomcat\Unnamed_javaweb-session-cookie\work\Catalina\localhost\ROOT\org\apache\jsp

    Found that the page has been transformed into a Java program!

The browser sends a request to the server. No matter what resources it accesses, it is actually accessing the Servlet!

JSP will eventually be converted into a Java class!

JSP is essentially a Servlet

//initialization
  public void _jspInit() {
    
      
  }
//Destroy
  public void _jspDestroy() {
    
  }
//JSPService
  public void _jspService(.HttpServletRequest request,HttpServletResponse response)
  1. Judgment request

  2. Built in some objects

    final javax.servlet.jsp.PageContext pageContext;  //Page context
    javax.servlet.http.HttpSession session = null;    //session
    final javax.servlet.ServletContext application;   //applicationContext
    final javax.servlet.ServletConfig config;         //config
    javax.servlet.jsp.JspWriter out = null;           //out
    final java.lang.Object page = this;               //page: current
    HttpServletRequest request                        //request
    HttpServletResponse response                      //response
    
  3. Code added before output page

    response.setContentType("text/html");       //Set the page type of the response
    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. The above objects can be used directly in JSP pages!

In JSP page;

As long as it is JAVA code, it will be output intact;

If it is HTML code, it will be converted to:

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

In this format, output to the front end!

8.3. JSP basic syntax

Any language has its own syntax, which is found in Java,. As an application of Java technology, JSP has its own extended syntax (understand, know!). All Java syntax supports!

JSP expression

  <%--JSP expression
  Function: used to output the program to the client
  <%= Variable or expression%>
  --%>
  <%= new java.util.Date()%>

jsp script fragment

  <%--jsp Script fragment--%>
  <%
    int sum = 0;
    for (int i = 1; i <=100 ; i++) {
    
      sum+=i;
    }
    out.println("<h1>Sum="+sum+"</h1>");
  %>

Re implementation of script fragments

  <%
    int x = 10;
    out.println(x);
  %>
  <p>This is a JSP file</p>
  <%
    int y = 2;
    out.println(y);
  %>

  <hr>


  <%--Embedding in code HTML element--%>
  <%
    for (int i = 0; i < 5; i++) {
    
  %>
    <h1>Hello,World  <%=i%> </h1>
  <%
    }
  %>

JSP declaration

  <%!
    static {
    
      System.out.println("Loading Servlet!");
    }

    private int globalVar = 0;

    public void kuang(){
    
      System.out.println("Entered the method Kuang!");
    }
  %>

JSP declaration: it will be compiled into the Java class generated by JSP! Others will be generated to_ jspService method!

In JSP, embed Java code!

<%%>
<%=%>
<%!%>

<%--notes--%>

JSP comments will not be displayed on the client, and HTML will!

8.4. JSP instruction

<%@page args.... %>
<%@include file=""%>

<%--@include The two pages will be combined into one--%>

<%@include file="common/header.jsp"%>
<h1>Web page subject</h1>

<%@include file="common/footer.jsp"%>

<hr>


<%--jSP label
    jsp:include: Splicing pages, the essence is still three
    --%>
<jsp:include page="/common/header.jsp"/>
<h1>Web page subject</h1>
<jsp:include page="/common/footer.jsp"/>

8.5 and 9 built-in objects

  • PageContext store
  • Request to store things
  • Response
  • Session storage
  • Application [servvetcontext] save things
  • config [SerlvetConfig]
  • out
  • page, don't understand
  • exception
pageContext.setAttribute("name1","Qinjiang 1"); //The saved data is only valid in one page
request.setAttribute("name2","Qinjiang 2"); //The saved data is only valid in one request, and the request forwarding will carry this data
session.setAttribute("name3","Qinjiang 3"); //The saved data is valid only in one session, from opening the browser to closing the browser
application.setAttribute("name4","Qinjiang 4");  //The saved data is only valid in the server, from opening the server to closing the server

Request: the client sends a request to the server. The generated data is useless after the user reads it. For example, news is useless after the user reads it!

session: the client sends a request to the server, and the generated data is still useful when the user runs out, such as a shopping cart;

application: when the client sends a request to the server, the generated data is used up by one user and may be used by other users, such as chat data;

8.6. JSP tag, JSTL tag, EL expression

<!-- JSTL Dependency of expression -->
<dependency>
    <groupId>javax.servlet.jsp.jstl</groupId>
    <artifactId>jstl-api</artifactId>
    <version>1.2</version>
</dependency>
<!-- standard Tag library -->
<dependency>
    <groupId>taglibs</groupId>
    <artifactId>standard</artifactId>
    <version>1.1.2</version>
</dependency>

EL expression: ${}

  • get data
  • Perform operations
  • Get common objects for web development

JSP tag

<%--jsp:include--%>

<%--
http://localhost:8080/jsptag.jsp?name=kuangshen&age=12
--%>

<jsp:forward page="/jsptag2.jsp">
    <jsp:param name="name" value="kuangshen"></jsp:param>
    <jsp:param name="age" value="12"></jsp:param>
</jsp:forward>

JSTL expression

The use of JSTL tag library is to make up for the shortage of HTML tags; It can customize many tags for us to use. The function of tags is the same as that of Java code!

Format label

SQL tag

XML tag

Core label (master part)

Steps for using JSTL tag library

  • Introduce the corresponding taglib
  • Use one of the methods
  • In Tomcat, you also need to introduce the JSTL package, otherwise an error will be reported: JSTL parsing error

c: if

<head>
    <title>Title</title>
</head>
<body>


<h4>if test</h4>

<hr>

<form action="coreif.jsp" method="get">
    <%--
    EL Expression to get the data in the form
    ${
    param.Parameter name}
    --%>
    <input type="text" name="username" value="${param.username}">
    <input type="submit" value="Sign in">
</form>

<%--Judge that if the submitted user name is administrator, the login is successful--%>
<c:if test="${param.username=='admin'}" var="isAdmin">
    <c:out value="Welcome to the administrator!"/>
</c:if>

<%--Self closing label--%>
<c:out value="${isAdmin}"/>

</body>

c:choose c:when

<body>

<%--Define a variable score,The value is 85--%>
<c:set var="score" value="55"/>

<c:choose>
    <c:when test="${score>=90}">
        Your grades are excellent
    </c:when>
    <c:when test="${score>=80}">
        Your grades are average
    </c:when>
    <c:when test="${score>=70}">
        Your grades are good
    </c:when>
    <c:when test="${score<=60}">
        Your grade is a failure
    </c:when>
</c:choose>

</body>

c:forEach

<%

    ArrayList<String> people = new ArrayList<>();
    people.add(0,"Zhang San");
    people.add(1,"Li Si");
    people.add(2,"Wang Wu");
    people.add(3,"Zhao Liu");
    people.add(4,"Tian Liu");
    request.setAttribute("list",people);
%>


<%--
var , Variables traversed each time
items, Object to traverse
begin,   Where to start
end,     Where to go?
step,   step
--%>
<c:forEach var="people" items="${list}">
    <c:out value="${people}"/> <br>
</c:forEach>

<hr>

<c:forEach var="people" items="${list}" begin="1" end="3" step="1" >
    <c:out value="${people}"/> <br>
</c:forEach>

9,JavaBean

Entity class

JavaBean s have specific ways to write:

  • Must have a parameterless construct
  • Property must be privatized
  • There must be a corresponding get/set method;

It is generally used to map ORM with database fields;

ORM: Object Relational Mapping

  • Table - > class
  • Fields – > Properties
  • Line record - > object

people table

idnameageaddress
1Qinjiang 13Xi'an
2Qinjiang 218Xi'an
3Qinjiang 3100Xi'an
class People{
    
    private int id;
    private String name;
    private int id;
    private String address;
}

class A{
    
    new People(1,"Qinjiang 1",3,"Xi'an");
    new People(2,"Qinjiang 2",3,"Xi'an");
    new People(3,"Qinjiang 3",3,"Xi'an");
}
  • filter
  • File upload
  • Mail sending
  • jdbc review: how to use jdbc, jdbc crud, jdbc transaction

10. MVC three-tier architecture

  • What is MVC: Model view Controller

10.1 previous architecture

Users directly access the control layer, and the control layer can directly operate the database;

servlet--CRUD-->database
 Disadvantages: the program is very bloated, which is not conducive to maintenance  
servlet In the code: processing request, response, view jump, processing JDBC,Processing business code and processing logic code

Architecture: nothing can't be solved by adding one layer!
Program call
↑
JDBC ((implement this interface)
↑
Mysql Oracle SqlServer ....((different manufacturers)

10.2 MVC three-tier architecture

Model

  • Business processing: business logic (Service)
  • Data persistence layer: CRUD (Dao - data persistence object)

View

  • Display data
  • Provide link to initiate Servlet request (a, form, img...)

Controller (Servlet)

  • Receive user's request: (req: request parameters, Session information...)

  • Give it to the business layer to process the corresponding code

  • Control view jump

    Sign in--->Receive user login request--->Process the user's request (get the user login parameters, username,password)---->Give it to the business layer to handle the login business (judge whether the user name and password are correct: Transaction)--->Dao Check whether the user name and password are correct-->database
    

11. Filter (key)

For example, Shiro security framework technology is implemented with Filter

Filter: filter, used to filter website data;

  • Deal with Chinese garbled code
  • Login authentication

(for example, I * * * myself 0-0 if I use it to filter the curse on the Internet)


Filter development steps:

  1. Guide Package
  2. Write filter
    1. Guide the package correctly (note)

Implement the Filter interface and rewrite the corresponding method

  ```java
  public class CharacterEncodingFilter implements Filter {
  
      //Initialization: when the web server is started, it is initialized, waiting for the filter object to appear at any time!
      public void init(FilterConfig filterConfig) throws ServletException {
          System.out.println("CharacterEncodingFilter initialization");
      }
  
      //Chain: Chain
      /*
      1. All code in the filter will be executed when filtering specific requests
      2. The filter must continue to travel
          chain.doFilter(request,response);
       */
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
          request.setCharacterEncoding("utf-8");
          response.setCharacterEncoding("utf-8");
          response.setContentType("text/html;charset=UTF-8");
  
          System.out.println("CharacterEncodingFilter Before execution....");
          chain.doFilter(request,response); //Let our request continue. If we don't write, the program will be intercepted and stopped here!
          System.out.println("CharacterEncodingFilter After execution....");
      }
  
      //Destroy: when the web server is shut down, the filter is destroyed
      public void destroy() {
          System.out.println("CharacterEncodingFilter Destroy");
      }
  }
  
3. stay web.xml Medium configuration Fil ter
    
   ```xml
   <filter>
       <filter-name>CharacterEncodingFilter</filter-name>
       <filter-class>com.kuang.filter.CharacterEncodingFilter</filter-class>
   </filter>
   <filter-mapping>
       <filter-name>CharacterEncodingFilter</filter-name>
       <!--As long as it is /servlet Any request from will pass through this filter-->
       <url-pattern>/servlet/*</url-pattern>
       <!--<url-pattern>/*</url-pattern>-->
       <!-- Don't be lazy to write /* -->
   </filter-mapping>

12. Listener

Implement the interface of a listener; (there are n kinds of listeners)

  1. Write a listener

    Implement the listener interface

    Dependent jar package

    //Count the number of people online: session
    public class OnlineCountListener implements HttpSessionListener {
          
    
        //Create session monitor: watch your every move
        //This event will be triggered once the Session is created!
        public void sessionCreated(HttpSessionEvent se) {
          
            ServletContext ctx = se.getSession().getServletContext();
    
            System.out.println(se.getSession().getId());
    
            Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount==null){
          
                onlineCount = new Integer(1);
            }else {
          
                int count = onlineCount.intValue();
                onlineCount = new Integer(count+1);
            }
    
            ctx.setAttribute("OnlineCount",onlineCount);
    
        }
    
        //Destroy session listening
        //This event will be triggered once the Session is destroyed!
        public void sessionDestroyed(HttpSessionEvent se) {
          
            ServletContext ctx = se.getSession().getServletContext();
    
            Integer onlineCount = (Integer) ctx.getAttribute("OnlineCount");
    
            if (onlineCount==null){
          
                onlineCount = new Integer(0);
            }else {
          
                int count = onlineCount.intValue();
                onlineCount = new Integer(count-1);
            }
    
            ctx.setAttribute("OnlineCount",onlineCount);
    
        }
    
    
        /*
        Session Destruction:
        1. Manually destroy getSession().invalidate();
        2. Automatic destruction
         */
    }
    
  2. Register listeners in web.xml

    <!--Register listener-->
    <listener>
        <listener-class>com.kuang.listener.OnlineCountListener</listener-class>
    </listener>
    
  3. It depends on whether it is used!

13. Common applications of filters and listeners

Listener: often used in GUI programming;

public class TestPanel {
    
    public static void main(String[] args) {
    
        Frame frame = new Frame("Happy Mid-autumn Day ");  //Create a new form
        Panel panel = new Panel(null); //panel
        frame.setLayout(null); //Set the layout of the form

        frame.setBounds(300,300,500,500);
        frame.setBackground(new Color(0,0,255)); //Set background color

        panel.setBounds(50,50,300,300);
        panel.setBackground(new Color(0,255,0)); //Set background color

        frame.add(panel);

        frame.setVisible(true);

        //Listen for events. Listen for closing events
        frame.addWindowListener(new WindowAdapter() {
    
            @Override
            public void windowClosing(WindowEvent e) {
    
                super.windowClosing(e);
            }
        });

    }
}

Users can only enter the home page after logging in! Users can't enter the home page after logging out!

  1. After the user logs in, put the user's data into Sison

  2. When entering the home page, judge whether the user has logged in; requirements: implement in the filter!

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) resp;
    
    if (request.getSession().getAttribute(Constant.USER_SESSION)==null){
          
        response.sendRedirect("/error.jsp");
    }
    
    chain.doFilter(request,response);
    

14,JDBC

What is JDBC: Java connection database!

jar package support is required:

  • java.sql
  • javax.sql
  • MySQL connector Java... Connection driver (must be imported)

Establishment of experimental environment

CREATE TABLE users(
    id INT PRIMARY KEY,
    `name` VARCHAR(40),
    `password` VARCHAR(40),
    email VARCHAR(60),
    birthday DATE
);

INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(1,'Zhang San','123456','zs@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(2,'Li Si','123456','ls@qq.com','2000-01-01');
INSERT INTO users(id,`name`,`password`,email,birthday)
VALUES(3,'Wang Wu','123456','ww@qq.com','2000-01-01');


SELECT	* FROM users;

Import database dependencies

<!--mysql Drive of-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.47</version>
</dependency>

Connect to the database in IDEA:

JDBC fixing steps:

  1. Load driver
  2. Connect to the database, representing the database
  3. Object statement to send SQL to database: CRUD
  4. Write SQL (different SQL according to business)
  5. Execute SQL
  6. Close the connection (open first and then close)
public class TestJdbc {
    
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
    
        //configuration information
        //Useunicode = true & characterencoding = UTF-8 to solve Chinese garbled code
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";

        //1. Load drive
        Class.forName("com.mysql.jdbc.Driver");
        //2. Connect to the database and represent the database
        Connection connection = DriverManager.getConnection(url, username, password);

        //3. Send SQL object statement to the database, Preparedstatement: CRUD
        Statement statement = connection.createStatement();

        //4. Write SQL
        String sql = "select * from users";

        //5. Execute SQL query and return a ResultSet: result set
        ResultSet rs = statement.executeQuery(sql);

        while (rs.next()){
    
            System.out.println("id="+rs.getObject("id"));
            System.out.println("name="+rs.getObject("name"));
            System.out.println("password="+rs.getObject("password"));
            System.out.println("email="+rs.getObject("email"));
            System.out.println("birthday="+rs.getObject("birthday"));
        }

        //6. Close the connection and release resources (be sure to do it) first on and then off
        rs.close();
        statement.close();
        connection.close();
    }
}

Precompiled SQL

public class TestJDBC2 {
    
    public static void main(String[] args) throws Exception {
    
        //configuration information
        //Useunicode = true & characterencoding = UTF-8 to solve Chinese garbled code
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username = "root";
        String password = "123456";

        //1. Load drive
        Class.forName("com.mysql.jdbc.Driver");
        //2. Connect to the database and represent the database
        Connection connection = DriverManager.getConnection(url, username, password);

        //3. Write SQL
        String sql = "insert into  users(id, name, password, email, birthday) values (?,?,?,?,?);";

        //4. Precompiling
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setInt(1,2);//Assign the value of the first placeholder "1";
        preparedStatement.setString(2,"Madness theory Java");//Assign the value of the second placeholder? To crazy God speaking Java;
        preparedStatement.setString(3,"123456");//Assign 123456 to the value of the third placeholder;
        preparedStatement.setString(4,"24736743@qq.com");//For the fourth placeholder? The value of is assigned to 1;
        preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//For the fifth placeholder? The value of is assigned as new Date(new java.util.Date().getTime());

        //5. Execute SQL
        int i = preparedStatement.executeUpdate();

        if (i>0){
    
            System.out.println("Insert successful@");
        }

        //6. Close the connection and release resources (be sure to do it) first on and then off
        preparedStatement.close();
        connection.close();
    }
}

affair

Either all succeed or all fail!

ACID principle: ensure data security.

Open transaction
 Transaction commit  commit()
Transaction rollback  rollback()
Close transaction

transfer accounts:
A:1000
B:1000
    
A(900)   --100-->   B(1100) 

Junit unit test

rely on

<!--unit testing -->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
</dependency>

Simple use

@The Test annotation is only valid for methods. As long as the annotated method is added, it can be run directly!

@Test
public void test(){
    
    System.out.println("Hello");
}

Failure is red:

Build an environment

Tags: Java

Posted on Sun, 05 Dec 2021 16:24:27 -0500 by nicknax