• JavaWeb


    JavaWeb

    1.基本概念

    1.1前言

    静态web

    • 技术栈:html,css
    • 数据始终不会发生改变

    动态web

    • 技术栈:Sevlet/JSP, ASP , PHP
    • 不同时间,不同事件,数据有所不同和改变

    1.2 动态web

    缺点:

    • 加入动态web资源出现错误需要停机维护

    优点:

    • 可以动态更新web页面
    • 可以与数据库交互

    2.web服务器

    ASP:

    • 微软研发,最早在国内流行
    • HTML中加入大量VB脚本
    • 代码混乱,维护困难

    PHP:

    • 代码简单,开发速度快,功能强大,跨平台
    • 局限性:无法承载高并发

    JSP/Servlet

    B/S:浏览器/服务器

    C/S:客户端/服务器

    • 基于JAVA语言
    • 可以承载三高(高并发,高可用,高性能)问题带来的影响

    web服务器

    服务器是一种被动操作,用来处理用户的请求和响应

    IIS

    windows系统自带的服务器

    Tomcat

    Tomcat实际上运行JSP/Servlet

    工作3–5年后可以尝试手写tomcat服务器

    3.Tomcat

    3.1安装

    tomcat官网:https://tomcat.apache.org/

    文件夹信息:

    3.2 配置

    可以配置启动端口号

    • tomcat:8080
    • http:80
    • https:443
    • mysql:3306

    可以配置启动主机名称

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

    网站是怎样访问的

    1. 输入一个域名
    2. 先查找本地host配置文件下有没有这个域名映射
      • 有,可以直接访问
      • 没有,访问本地DNS服务器,如果本地服务器也没有则会询问根服务器,然后根据域名,层层递归查询,找到则返回域名对应的IP地址
      • DNS域名服务器详解:https://blog.csdn.net/weixin_40470303/article/details/80642190

    3.3 网站怎么发布

    网站应该有的结构

    --webapps : tomcat服务器的web目录
        -Root
        -exmaple : 网站的目录名
            -static : 存放静态文件
                -css
                -js
                -img
            -WEB-INF
            	-classes : java程序
                -lib : web应用依赖的jar包
                -web.xml : 网站的配置文件
            -index.html 默认的首页
        ......
    

    4.HTTP

    4.1 什么是HTTP

    HTTP : 超文本传输协议,通常运行在应用层

    4.2 历史

    • http1.0 : 客户端与web服务器连接后,只能获得一个web资源
    • http2.0:在1.0的基础上推出了长连接(即一次连接可以传输多次)

    4.3 Http请求

    请求行

    请求网址:https://www.baidu.com/home/pcweb/data/mancardhtml?id=1&isPull=&indextype=manht&_req_seqid=0xf5d85f62000d2fc3&asyn=1&t=1590305654161&sid=1463_31325_21097_31605_22158
    请求方法:GET
    远程地址:183.232.231.172:443
    状态码:
    200
    版本:HTTP/1.1
    Referrer 政策:unsafe-url
    
    • 以上的请求方式:GET
    • 请求方式:
      • GET :能够携带的数据较少,会在浏览器显示
      • POST : 没有大小限制,不会在浏览器显示,较为安全,但不高效

    消息头

    4.4 Http响应

    响应体

    响应状态码

    200:响应成功

    3XX:重定向

    4XX:资源不存在

    5XX:服务器(500)/网关(502)错误

    面试题:

    从你在浏览器输入域名并回车到看到页面经历了什么?

    5.Maven

    5.1 Maven项目架构管理工具

    约定大于配置

    1.在javaweb开发中,需要导入大量jar包

    2.Maven帮助我们自动导入需要的jar包

    5.2 建立本地仓库

    <localRepository>D:Enviromentapache-maven-3.6.3maven-repo</localRepository>
    

    5.3 阿里云镜像

    <mirror>
      <id>nexus-aliyun</id>
      <mirrorOf>central</mirrorOf>
      <name>Nexus aliyun</name>
      <url>http://maven.aliyun.com/nexus/content/groups/public</url>
    </mirror>
    

    5.4 配置环境变量

    Path变量

    系统变量

    5.5 在IDEA中使用Maven

    1.创建一个Maven项目

    2.命名和存放地址

    3.创建一个空的Maven项目

    IDEA中标记文件夹

    4.配置Tomcat

    为什么会出现警告:

    我们访问网站,需要指定一个文件(即虚拟路径映射)

    配置完成后启动:

    5.target文件夹

    6.porm文件

    <?xml version="1.0" encoding="UTF-8"?>
    
    <!--Maven版本头文件-->
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0</modelVersion>
    
      <!--项目信息-->
      <groupId>mrh</groupId>
      <artifactId>javaweb-maven01</artifactId>
      <version>1.0-SNAPSHOT</version>
      <packaging>war</packaging>
    
      <name>javaweb-maven01 Maven Webapp</name>
      <!-- FIXME change it to the project's website -->
      <url>http://www.example.com</url>
    
      <properties>
        <!--项目默认编码-->
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
      </properties>
    
      <!--项目依赖-->
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
      </dependencies>
    
      <build>
        <finalName>javaweb-maven01</finalName>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
          <plugins>
            <plugin>
              <artifactId>maven-clean-plugin</artifactId>
              <version>3.1.0</version>
            </plugin>
            <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
            <plugin>
              <artifactId>maven-resources-plugin</artifactId>
              <version>3.0.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-compiler-plugin</artifactId>
              <version>3.8.0</version>
            </plugin>
            <plugin>
              <artifactId>maven-surefire-plugin</artifactId>
              <version>2.22.1</version>
            </plugin>
            <plugin>
              <artifactId>maven-war-plugin</artifactId>
              <version>3.2.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-install-plugin</artifactId>
              <version>2.5.2</version>
            </plugin>
            <plugin>
              <artifactId>maven-deploy-plugin</artifactId>
              <version>2.8.2</version>
            </plugin>
          </plugins>
        </pluginManagement>
      </build>
    </project>
    

    由于Maven约定大于配置,我们之后写的配置文件可能存在无法导出的问题

    解决方案:

    <build>
            <resources>
                <resource>
                    <directory>src/main/resources</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
                <resource>
                    <directory>src/main/java</directory>
                    <includes>
                        <include>**/*.properties</include>
                        <include>**/*.xml</include>
                    </includes>
                    <filtering>true</filtering>
                </resource>
            </resources>
        </build>
    

    Maven 架构树

    6.Servlet

    6.1 简介

    • Servlet是开发动态web的技术
    • Servlet小程序
      • 编写一个类,实现Servlet接口
      • 将java类部署到web服务器中

    原博客:http://www.cnblogs.com/wangjiming/

    Servlet UML关系图

    从图中,可以看出:

    1.抽象类HttpServlet继承抽象类GenericServlet,其有两个比较关键的方法,doGet()和doPost()

    2.GenericServlet实现接口Servlet,ServletConfig,Serializable

    3.MyServlet(用户自定义Servlet类)继承HttpServlet,重写抽象类HttpServlet的doGet()和doPost()方法

    ####Servlet在容器中的执行过程

    Servlet只有放在容器中,方可执行,且Servlet容器种类较多,如Tomcat,WebLogic等。下图为简单的 请求响应 模型。

    分析:

    1.浏览器向服务器发出GET请求(请求服务器ServletA)

    2.服务器上的容器逻辑接收到该url,根据该url判断为Servlet请求,此时容器逻辑将产生两个对象:请求对象(HttpServletRequest)和响应对象(HttpServletResponce)

    3.容器逻辑根据url找到目标Servlet(本示例目标Servlet为ServletA),且创建一个线程A

    4.容器逻辑将刚才创建的请求对象和响应对象传递给线程A

    5.容器逻辑调用Servlet的service()方法

    6.service()方法根据请求类型(本示例为GET请求)调用doGet()(本示例调用doGet())或doPost()方法

    7.doGet()执行完后,将结果返回给容器逻辑

    8.线程A被销毁或被放在线程池中

    注意:

    1.在容器中的每个Servlet原则上只有一个实例

    2.每个请求对应一个线程

    3.多个线程可作用于同一个Servlet(这是造成Servlet线程不安全的根本原因)

    4.每个线程一旦执行完任务,就被销毁或放在线程池中等待回收

    Servlet在JavaWeb中扮演的角色

    Servlet在JavaWeb中,扮演两个角色:页面角色和控制器角色。

    有了jsp等动态页面技术后,Servlet更侧重于控制器角色,jsp+servlert+model 形成基本的三层架构

    Servlet在容器中的生命周期

    分析:

    第一步:容器先加载Servlet类

    第二步:容器实例化Servlet(Servlet无参构造函数执行)

    第三步:执行init()方法(在Servlet生命周期中,只执行一次,且在service()方法执行前执行)

    第四步:执行service()方法,处理客户请求,doPost()或doGet()

    第五步:执行destroy(),销毁线程

    6.2 HelloServlet

    1.构建一个普通的Maven项目,删掉原来的scr文件夹,在项目中建立一个Modoul,这个工程就是Maven的主工程

    2.Maven的父子工程:

    父项目中:

    <modules>
        <module>hello</module>
    </modules>
    

    子项目中:

    <parent>
        <artifactId>helloServlet</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    

    6.3 Servlet重定向与转发

    重定向和转发的区别:

    相同:

    • 页面都会实现跳转

    不同:

    • 转发不会改变地址栏的URL
    • 重定向后,URL会改变

    登陆页面

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
    <html>
    <body>
    <h2>Hello World!</h2>
    
    <%--这里提交的路径,需要找的项目的路径--%>
    
    <form action="/s01/redirect", method="post">
        用户名:<input type="text" name="username"> <br>
        密码:<input type="password" name="password"> <br>
        爱好:
        <input type="checkbox" name="hobby" value="girl">女孩
        <input type="checkbox" name="hobby" value="movie">电影
        <input type="checkbox" name="hobby" value="game">游戏
        <br>
        <button type="submit">提交</button>
    </form>
    
    </body>
    </html>
    

    ####重定向

    public class RedirectServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username =  req.getParameter("username");
            String password =  req.getParameter("password");
            String[] hobbies = req.getParameterValues("hobby");
    
            System.out.println(username);
            System.out.println(password);
            System.out.println(Arrays.toString(hobbies));
    
    		//需要加上项目路径
            resp.sendRedirect("/s01/dispatcher");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    转发

    public class DispatcherServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            String username =  req.getParameter("username");
            String password =  req.getParameter("password");
            String[] hobbies = req.getParameterValues("hobby");
    
            System.out.println(username);
            System.out.println(password);
            System.out.println(Arrays.toString(hobbies));
    
    
            //重定向与转发不同的是,重定向默认相对地址为当前项目,所以不需要再加上项目路径
            req.getRequestDispatcher("/success.jsp").forward(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    7.Cookie和Session

    7.1 会话

    • 会话:用户从打开浏览器浏览页面到关闭浏览器的过程称之为会话。
    • 有状态会话:
      • cookie:服务器给客户端一个信件,客户端下次访问时带上信件就行了
      • session:服务器登记过你的信息,下次再来服务器会自动匹配

    7.2 保存会话的两种技术

    1.cookie

    1.从请求中拿到cookie信息

    2.服务端响应给客户端cookie

    • 一个cookie只能保存一个信息
    • 一个web站点可以给客户端发送多个cookie
    • cookie大小限制为4kb
    • 不设置cookie有效期,关闭浏览器时,自动失效
     protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //解决中文乱码
            //设置编码
            resp.setCharacterEncoding("UTF-8");
            //通知解码
            resp.setHeader("Content-Type", "text/html;charset=UTF-8");
    
            Cookie[] cookies = req.getCookies();
    
            PrintWriter out = resp.getWriter();
    
            //存在cookie
            if(cookies!=null){
                out.write("上次访问时间为: ");
    
                for (int i = 0; i < cookies.length; i++) {
                    if(cookies[i].getName().equals("lastLoginTime")){
                        //获取cookie值
                        String t = cookies[i].getValue();
                        System.out.println(t);
                        Date date = new Date(Long.parseLong(t));
                        out.write(date.toString());
                    }
                }
    
            }else {
                //不存在cookie
                out.write("第一次访问");
            }
    
            //服务端更新客户端的cookie
            Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
            //设置存活周期
            cookie.setMaxAge(24*60);
    
            resp.addCookie(cookie);
    
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            super.doPost(req, resp);
        }
    

    2.session

    • 服务器会给每一个用户(浏览器)创建一个session对象
    • 只要浏览器不关闭就一直存在
    • 主要用于存储用户信息
    • 客户端只保存Session的ID

    第一次创建Session的时候,服务端会在HTTP协议中告诉客户端,需要在 Cookie 里面记录一个Session ID,以后每次请求把这个会话ID发送到服务器,我就知道你是谁了。

    public class Session01 extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //解决乱码
            resp.setCharacterEncoding("UTF-8");
            resp.setContentType("text/html;charset=utf-8");
    
            //得到session
            HttpSession session = req.getSession();
    
            //向session存信息
           session.setAttribute("name", "mrh");
    
            //获取session的ID
            String id = session.getId();
    
            //判断session是不是新创建的
            if(session.isNew()){
                resp.getWriter().write("session创建成功:"+ id);
            }else {
                resp.getWriter().write("sessiom已经存在:"+id);
            }
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req,resp);
        }
    }
    

    手动注销Session

    //手动注销Session
    session。removeAttribute("name");
    session.invalidate();
    

    **设置Session有效期 : 配置web.xml

    <session-config>
        <!--15分钟自动失效-->
    	<session-timeout>15</session-timeout>
    </session-config>
    

    Session使用场景:

    • 保存一个登陆用户的信息
    • 购物车信息
    • 经常在网站中会使用的数据

    Session和Cookie的区别

    • Cookie是将用户的数据写给用户浏览器,由浏览器保存
    • Session把用户的数据写至用户独占Session中,有服务端保存
    • Session对象由服务端创建

    8.JSP

    8.1 什么是JSP

    Java Servlet Page : 是一种动态Web技术

    最大特点:

    • 可以写HTML代码
    • 可以嵌入java代码,为用户提供动态数据

    8.2 JSP原理

    浏览器向服务端发送请求,其实都是在访问Servlet

    JSP最终也会被转换为一个java类:

    java代码不变,html代码会转换成以下形式:

    out.write("<html>
    ");
    

    JSP本质是一个Servlet

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JTjhZZmp-1591181512815)(C:%5CUsers%5CAdministrator%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20200529153250610.png)]

    8.3 九大内置对象与四大作用域

    • PageContext (存数据)
    • Request (存数据)
    • Response
    • Session (存数据)
    • Application [ServletContext] (存数据)
    • config [ServletConfig]
    • out
    • page
    • exception

    四大作用域

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Demo01</title>
    </head>
    <body>
    
    <%--
        脚本中的代码会原封不动的生成到java中,这里必须保证java语法的正确性
    --%>
    
    <%
        pageContext.setAttribute("name01","mrh01"); //只在一个页面有效
        request.setAttribute("name02","mrh02"); //只在一次请求中有效
        session.setAttribute("name03","mrh03"); //再一次会话中有效
        application.setAttribute("name04","mrh04"); //在服务器中有效(从打开服务器到关闭服务器)
    %>
    
    <%
        String name01 = pageContext.findAttribute("name01").toString();
        String name02 = pageContext.findAttribute("name02").toString();
        String name03 = pageContext.findAttribute("name03").toString();
        String name04 = pageContext.findAttribute("name04").toString();
    %>
    
    <%--使用EL表达式取值--%>
    <h1>取出的值为:</h1>
    <h3><%=name01%></h3>
    <h3>${name02}</h3>
    <h3>${name03}</h3>
    <h3>${name04}</h3>
    
    
    </body>
    </html>
    

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Demo02</title>
    </head>
    <body>
    <h1>取出的值为:</h1>
    <h3>${name01}</h3>
    <h3>${name02}</h3>
    <h3>${name03}</h3>
    <h3>${name04}</h3>
    </body>
    </html>
    
    

    name01name02过期 , 只取出name03name04的值

    问题:如果从Demo01页面转发转到Demo02页面会访问那些数据

    请求数据会跟随转发到最终的页面

    9.JavaBean

    实体类

    写法:

    • 必须要有一个无参构造
    • 属性是优化
    • 有对应的get和set函数
    • 一般用于和数据库数据做映射(ORM)

    ORM:对象关系映射

    nameageaddress
    m110贵州
    m218贵州
    m330贵州
    class people{
    	private String name;
        private int age;
        private String address;
    }
    

    10.三层架构MVC

    两层构架:

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

    弊端:控制层要做大多的事情,使得代码过臃肿,不利于维护

    三层架构:

    Model

    • 业务处理(Service)
    • 数据持久化(Dao)

    View

    • 展示数据
    • 提供请求通道

    Controller

    • 接收请求
    • 交给业务处处理
    • 控制视图跳转

    以登陆为例

    登陆-->接收用户登陆请求-->处理请求(获取登陆信息)-->交给业务层处理-->Dao层查询用户信息是否正确-->数据库
    

    11.Filter(过滤器)

    用于过滤网站数据

    filterDemo

    package com.mrh.filter;
    
    import javax.servlet.*;
    import java.io.IOException;
    
    /**
     * CharacterFilter
     * 2020/6/2 18:15
     * 主要用于将字符编码同一变为UTF-8
     * @Author m
     **/
    public class CharacterFilter implements Filter {
        //初始化
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        /**
         *
         * @param request
         * @param response
         * @param filterChain
         * @throws IOException
         * @throws ServletException
         * Chain : 链
         *
         */
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
            request.setCharacterEncoding("UTF-8");
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/html;charset=UTF-8");
    
            System.out.println("你好Fasfsafasfasf");
            System.out.println("CharacterFilter执行前...");
            filterChain.doFilter(request,response); // 让请求往前走,否则程序会倍拦截在这
            System.out.println("CharacterFilter执行后...");
    
        }
    
        public void destroy() {
            System.out.println("CharacterFilter销毁");
        }
    }
    
    

    servletDemo

    package com.mrh.servlet;
    
    
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    
    /**
     * ShowServlet
     * 2020/6/2 18:31
     *
     * @Author m
     **/
    public class ShowServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            /*//设置编码
            resp.setCharacterEncoding("UTF-8");
            //通知解码
            resp.setHeader("Content-Type", "text/html;charset=UTF-8");*/
            resp.getWriter().write("你好!!!");
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doGet(req, resp);
        }
    }
    

    web.xml

    <servlet>
            <servlet-name>Show</servlet-name>
            <servlet-class>com.mrh.servlet.ShowServlet</servlet-class>
        </servlet>
        
        <servlet-mapping>
            <servlet-name>Show</servlet-name>
            <url-pattern>/show</url-pattern>
        </servlet-mapping>
    
        <servlet-mapping>
            <servlet-name>Show</servlet-name>
            <url-pattern>/filter/show</url-pattern>
        </servlet-mapping>
    
    
        <filter>
            <filter-name>CharacterFilter</filter-name>
            <filter-class>com.mrh.filter.CharacterFilter</filter-class>
        </filter>
    
        <filter-mapping>
            <filter-name>CharacterFilter</filter-name>
            <!--表示filter下的所有请求都经过过滤器-->
            <url-pattern>/filter/*</url-pattern>
        </filter-mapping>
    

    12.JDBC

    导入架包

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

    连接模板

    jdbc直接连接----不推荐

        public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //配置信息
            String url = "jdbc:mysql://localhost:3306/db_food?useUnicode=true&characterEncoding=utf-8";
            String username = "root";
            String password = "991024";
    
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
    
            //2.连接数据库,代表数据库
            Connection con = DriverManager.getConnection(url,username,password);
    
            //3.创建SQL发送载体
            Statement statement = con.createStatement();
    
            //4.编写SQL
            String sql = "select * from user";
    
            //5.执行查询语句,返回一个结果集
            ResultSet res = statement.executeQuery(sql);
    
            while (res.next()){
                System.out.print("id "+res.getObject("id")+" ");
                System.out.print("username "+res.getObject("username")+" ");
                System.out.print("password "+res.getObject("password")+" ");
                System.out.print("email "+res.getObject("email")+" ");
                System.out.println("rank "+res.getObject("rank")+" ");
            }
    
            //6.关闭连接,释放资源,先打开的要后关闭
            res.close();
            statement.close();
            con.close();
    
        }
    

    事务

    ACID 原则,即原子性(Atomicity)一致性(Consistency)隔离性(Isolation)持久性(Durability),这四种原则保证在事务过程当中数据的安全性

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
            //配置信息
            String url = "jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf-8";
            String username = "root";
            String password = "991024";
    
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
    
            //2.连接数据库,代表数据库
            Connection con = DriverManager.getConnection(url,username,password);
    
            //3.创建SQL发送载体
            Statement statement = con.createStatement();
    
            //4.编写SQL
            String sql1 = "update account set money = money-100 where name = 'A';";
            String sql2 = "update account set money = money+100 where name = 'B';";
    
    
            //5.执行语句,返回一个结果集
            //开启事务,false表示开启,不开启如果遇到错误可能会时数据异常
            //con.setAutoCommit(false);
    
            con.prepareStatement(sql1).executeUpdate();
    
            //制造错误,让语句无法执行
            int i = 1/0;
    
            con.prepareStatement(sql2).executeUpdate();
    
            //提交数据
            //con.commit();
    
            //6.关闭连接,释放资源,先打开的要后关闭
            statement.close();
            con.close();
    
        }
    

    Junit单元测试

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

    @Test注解只在方法上有效,可以直接运行

    13.如何搭建一个maven web项目

    1. 新建一个maven web项目

    2. 配置Tomcat

    3. 测试项目是否能运行

    4. 导入现阶段可能会用到的jar包

      <dependencies>
          <!--servlet依赖-->
          <dependency>
              <groupId>javax.servlet</groupId>
              <artifactId>javax.servlet-api</artifactId>
              <version>4.0.1</version>
          </dependency>
          <!--jsp依赖-->
          <dependency>
              <groupId>javax.servlet.jsp</groupId>
              <artifactId>jsp-api</artifactId>
              <version>2.2</version>
          </dependency>
          <!--jsp语法依赖-->
          <dependency>
              <groupId>javax.servlet.jsp.jstl</groupId>
              <artifactId>jstl</artifactId>
              <version>1.2</version>
          </dependency>
          <!--jsp标签依赖-->
          <dependency>
              <groupId>taglibs</groupId>
              <artifactId>standard</artifactId>
              <version>1.1.2</version>
          </dependency>
          <!--数据库连接依赖-->
          <dependency>
              <groupId>mysql</groupId>
              <artifactId>mysql-connector-java</artifactId>
              <version>5.1.47</version>
          </dependency>
          <!--单元测试依赖-->
          <dependency>
              <groupId>junit</groupId>
              <artifactId>junit</artifactId>
              <version>4.12</version>
          </dependency>
      
      </dependencies>
      
    5. 创建项目包结构

    6. 编写实体类

      • 表-类的映射
    7. 编写基础公共类

      1. 数据库配置文件

        url = jdbc:mysql://localhost:3306?useUnicode=true&characterEncoding=utf-8
        username = root
        password = 991024
        Driver = com.mysql.jdbc.Driver
        
      2. 编写基础数据库连接类

        package com.mrh.dao;
        
        import java.io.InputStream;
        import java.sql.*;
        import java.util.Properties;
        
        /**
         * @ClassName BaseDao
         * @Description TODO
         * @Author m
         * @Version 1.0
         */
        public class BaseDao {
        
            private static String  driver;
            private static String  url;
            private static String  username;
            private static String  password;
            private static Connection con = null;
            private static PreparedStatement preparedStatement = null;
            private static ResultSet res = null;
        
            public static Connection getCon() {
                return con;
            }
        
            public static PreparedStatement getPreparedStatement() {
                return preparedStatement;
            }
        
            public static ResultSet getRes() {
                return res;
            }
            
            //静态代码块,类加载的时候就初始化了
            static {
                Properties properties = new Properties();
                //通过类加载器读取对应资源
                InputStream inputStream = BaseDao.class.getClassLoader().getResourceAsStream("db.properties");
        
                try {
                    properties.load(inputStream);
                }catch (Exception e){
                    e.printStackTrace();
                }
        
                driver = properties.getProperty("driver");
                url = properties.getProperty("url");
                username = properties.getProperty("username");
                password = properties.getProperty("password");
        
            }
        
            //数据库连接
            public static void connection(){
                try{
                    Class.forName(driver);
                    con = DriverManager.getConnection(url,username,password);
                } catch (ClassNotFoundException e) {
                    e.printStackTrace();
                } catch (SQLException throwables) {
                    throwables.printStackTrace();
                }
            }
        
            //关闭数据库连接
            public static void close(){
                if(res != null){
                    try{
                        res.close();
                    } catch (SQLException throwable) {
                        throwable.printStackTrace();
                    }
                }
                if(preparedStatement != null){
                    try{
                        preparedStatement.close();
                    } catch (SQLException throwable) {
                        throwable.printStackTrace();
                    }
                }
                if(con != null){
                    try{
                        con.close();
                    } catch (SQLException throwable) {
                        throwable.printStackTrace();
                    }
                }
            }
        
            //查询公共类
            public static ResultSet query(String sql, Object[] parm) throws SQLException {
                preparedStatement = con.prepareStatement(sql);
                for (int i = 0; i < parm.length; i++) {
                    preparedStatement.setObject(i+1,parm[i]);
                }
                res = preparedStatement.executeQuery();
                return res;
            }
        
            //update公共类
            public static int update(String sql, Object[] parm) throws SQLException {
                preparedStatement = con.prepareStatement(sql);
                for (int i = 0; i < parm.length; i++) {
                    preparedStatement.setObject(i+1,parm[i]);
                }
                return preparedStatement.executeUpdate();
            }
        
        }
        
    8. 导入各种静态资源

    因为我喜欢追寻过程中的自己
  • 相关阅读:
    configuration details
    Java教程 Java API 模拟器学习
    如何用CSC.exe来编译Visual C#的代码文件
    finally 里不能有return语句
    J2ME(cldc/midp)简介
    eclipse+mysql+tomcat配置JNDI
    JDK+Tomcat+Servlet连接Mysql数据库
    访问 IIS 元数据库失败
    硬盘安装Ubuntu
    tomcat与IIS服务器集成
  • 原文地址:https://www.cnblogs.com/IzuruKamuku/p/14359780.html
Copyright © 2020-2023  润新知