JavaWeb.png

1 JDBC

1.1 JDBC是什么

Java数据库连接,提供了一种与平台无关的用于执行SQL语句的标准javaAPI,可以方便实现多种关系型数据库的统一操作。

1.2 使用示例

1.2.1 使用步骤

  1. 注册驱动:主要告诉 JVM 我们的程序将要使用哪一种数据库
  2. 获取连接:使用 JDBC 中的类,获得数据库的连接对象 Connection
  3. 获得语句执行平台:通过 Connection 可以获取执行者对象,Statement、PreparedStatement
  4. 执行 SQL 语句:使用执行者对象执行 SQL 语句,可以得到对应的接口,有单个结果也可能有结果集 ResultSet
  5. 处理结果
  6. 释放对象

    1.2.2 代码示例

    1. public static void main(String[] args) throws ClassNotFoundException, SQLException {
    2. //1.注册驱动(静态方法)(包名+类名)
    3. Class.forName("com.mysql.jdbc.Driver");
    4. //2.获取连接对象
    5. Connection conn=DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/exam?characterEncoding=UTF-8","root", "admin");
    6. //3.获取语句执行平台
    7. Statement sta=conn.createStatement();
    8. //4.执行SQL语句
    9. String sql="insert into sort(sname) values('口红')";
    10. int row=sta.executeUpdate(sql);
    11. System.out.println(row);
    12. //6.释放资源(先开后关)
    13. sta.close();
    14. conn.close();
    15. }
  • Sql语句的执行对象一般使用PreparedStatement,因为PreparedStatement性能比statement更快且能够防止SQL注入攻击
  • 注册驱动和获取连接对象以及释放资源是每次JDBC都需要用到的所以可以抽取出工具类进行优化

    1.3 数据库连接池

    1.3.1 数据库连接池介绍

    因为数据库连接是相当昂贵的操作,所以我们要提高程序的性能就要减少数据库访问连接及访问的此时。数据库连接池允许重用许多现有的连接,可以有效地节省数据库访问的成本。

    1.3.2 常用开源的连接池

    (1)c3p0连接池
    创建连接池核心对象
    ComboPooledDataSource dataSource=new ComboPooledDataSource()
    从连接池对象中获取数据库连接
    Connection con=dataSource.getConnection();
    
    (2)Druid连接池
    Druid的工具类,与c3p0不同的是Fruid需要手动加载配置文件.
    public class Druid {
    //通过单例模式来创建连接池对象
    private static DataSource dataSource;
    static {
      try {
          InputStream inputStream = DBCP.class.getClassLoader().getResourceAsStream("dbconfig.properties");
          Properties properties = new Properties();
          properties.load(inputStream);
          dataSource = DruidDataSourceFactory.createDataSource(properties);
      } catch (Exception e) {
          e.printStackTrace();
      }
    }
    //获得连接
    public static Connection getConnection() throws SQLException {
      return dataSource.getConnection();
    }
    }
    

2.HTTP

JavaWeb - 图2

3 Tomcat

3.1 Tomcat是什么

Tomcat 是由 Apache 开发的一个 Servlet 容器,实现了对 Servlet 和 JSP 的支持,并提供了作为Web服务器的一些特有功能(默认线程数200)。

3.2 Tomcat的结构

3.2.1 重要的目录结构

  • bin - Tomcat 脚本存放目录(如启动、关闭脚本)。 *.sh 文件用于 Unix 系统; *.bat 文件用于 Windows 系统。
  • conf - Tomcat 配置文件目录。
  • lib:该目录放置运行tomcat运行需要的jar包
  • logs - Tomcat 默认日志目录。
  • webapps - webapp 运行的目录。

    • webapp - 工程文件夹。其实每个 war 包都可以视为 webapp 的压缩包。
    • /WEB-INF/web.xml - web 应用的部署配置文件

      3.2.2 组件结构

      Tomcat是一个基于组件形式的的Web容器,由Server(服务器)、Service(服务)、Connector(连接器)、Engine(引擎)、Host(主机)、Context(应用服务)组成,它们在server.xml里配置:

      <?xml version="1.0" encoding="UTF-8"?>
      //代表整个Tomcat,它包含所有的容器;
      <Server port="8005" shutdown="SHUTDOWN">
      //相当于一个集合,包含多个Connector(连接)、一个Engine(引擎),它还负责处理所有Connector(连接)获取的客户请求
      <Service name="Catalina">
      //一个Connector(连接)在指定的接口上侦听客户的请求,并将客户的请求交给Engine(引擎)来进行处理并获得回应返回给客户请求;
      <Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>
      <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/>
      //一个Engine(引擎)下可以配置多个虚拟主机Host,每个主机都有一个域名,当Engine获得一个请求时,会把这个请求发送的相应的Host上;
      <Engine defaultHost="localhost" name="Catalina">
      
       <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">
      //一个context对应一个web aplication,一个web由一个或多个servlet组成
       <Context docBase="src-ConsumptionAnalysisSystem" path="/ConsumptionAnalysisSystem" reloadable="true" source="org.eclipse.jst.jee.server:src-ConsumptionAnalysisSystem"/>
       </Host>
      </Engine>
      </Service>
      </Server>
      

      3.3 Tomcat的使用

      在Idea里使用Tomcat

  1. 点击 Run/Debug Configurations > New Tomcat Server > local ,打开 Tomcat 配置页面。
  2. 点击 Confiure… 按钮,设置 Tomcat 安装路径。
  3. 点击 Deployment 标签页,设置要启动的应用。
  4. 设置启动应用的端口、JVM 参数、启动浏览器等。
  5. 成功后,可以访问 http://localhost:8080/(可以在 url 中设置上下文名称)。

4 Servlet、filter和listener

4.1 Servlet

4.1.1 Servlet原理

运行在服务器端的小程序。最大的作用就是能够处理浏览器带来HTTP请求,并返回一个响应给浏览器,从而实现浏览器和服务器的交互。
一般情况下,服务器只创建一个Servlet对象(单例),当多个用户访问Servlet的时候,服务器会为每个用户创建一个线程。
当多个用户并发访问Servlet共享资源的时候就会出现线程安全问题。

4.1.2 编写Servlet程序

  • 定义一个类实现httpservlet接口
  • 重写方法(3个生命周期方法,2个其他方法),一般开发的时候重写doGet()和doPost()方法就可以
  • 在Tomcat的web.xml中配置及映射,可使用注解@WebServlet(“地址”)替代xml配置

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
           version="3.1">
      <!--配置Servlet-->
      <servlet>
          <servlet-name>demo1</servlet-name>
          <servlet-class>cn.itcast.web.servlet.ServletDemo1</servlet-class>
      </servlet>
      <servlet-mapping>
          <servlet-name>demo1</servlet-name>
          <url-pattern>/demo1</url-pattern>
      </servlet-mapping>
    </web-app>
    

    4.1.3 生命周期方法

  • init() - 只有第一次访问Servlet的时候才会被调用。

  • service() - 只要访问Servlet,就会被调用。
  • destroy() - 只有在Tomcat关闭的时候才会被调用。

    4.1.4 常用对象

    (1)ServletConfig对象

    可以Servlet中获取ServletConfig对象,通过ServletConfig对象获取在web.xml文件配置的参数。

    (2)ServletContext对象

    ServletContext官方叫servlet上下文。服务器会为每一个工程创建一个对象,这个对象就是ServletContext对象。这个对象全局唯一,而且工程内部的所有servlet都共享这个对象。所以叫全局应用程序共享对象。

  • 通过request对象request.getServletContext()

  • HttpServlet的this.getServletContext()

所有Servlet都共享着一个ServletContext对象,所以Servlet之间可以通过ServletContext实现通讯。一般这个对象就使用这个功能。

(3) request对象

使用Request对象可以获取浏览器提交过来的数据,如完整URL。
使用Request对象进行转发

  • 地址栏发生不会变化
  • 只能访问服务器内部资源
  • 只有一次请求

    //获取到requestDispatcher对象      
    RequestDispatcher requestDispatcher = request.getRequestDispatcher("/Servlet");   
    //调用requestDispatcher对象的forward()实现转发,传入request和response方法
    requestDispatcher.forward(request,response);
    

    (4) Response对象

    使用Response对象可以向浏览器输出数据。
    使用Response对象进行重定向

  • 地址栏发生发生改变

  • 可以访问外部资源
  • 浏览器要发送两次请求
    //重定向到index.jsp页面
    response.sendRedirect("/Demo/index.jsp");
    

    4.2 Filter

    截传入的请求和传出的响应,保护Servlet
    实现Filter接口,剩余用法和Servlet一样。

    4.3 Listener

    监听作用域对象request、session、application的创建、销毁和内容的变更
    实现Listener接口,用法和Servlet一样。

5.会话

5.1 Cookie

客户端会话技术,将数据保存在客户端

使用:  
  1)创建Cookie对象,绑定数据
      * new Cookie(String name, String value)
  2)发送Cookie对象
      * response.addCookie(Cookie cookie)
  3)获取Cookie,拿到对象
      * Cookie[ ]  request.getCookies()
  4)默认情况下,当浏览器关闭后,cookie数据被销毁
    * 持久化存储:
           ** setMaxAge(int seconds)
                   <1> 正数:将Cookie数据写到硬盘的文件中。持久化存储。cookie存活时间。
                   <2> 负数:默认值
                   <3> 零:删除cookie信息
   5) cookie共享
    * 同一个tomcat服务器中
    setPath(String path):设置cookie的获取范围。
    * 不同的tomcat服务器
    setDomain(String path):如果设置一级域名相同,那多个服务器之间cookie可以共享

5.2 Session

服务器端会话技术,将数据保存在服务器端的对象中。

使用:
1)获取HttpSession对象:
    ** HttpSession session = request.getSession();
2)当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?
    ** 默认不是,如果需要相同,则可以创建Cookie键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
    Cookie c = new Cookie("JSESSIONID", session.getId());
    c.setMaxAge(60*60);
    response.addCookie(c);
* 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
    ** 不是同一个,但是要确保数据不丢失
    ** session的钝化: 在服务器正常关闭之前,将session对象序列化到硬盘上
    ** session的活化: 在服务器启动后,将session文件转化为内存中的session对象即可
* session什么时候被销毁?
    ** 服务器关闭
    ** session对象调用invalidate()
    ** session默认失效时间(30分钟)
        选择性配置修改:tomcat/conf目录下web.xml文件
    <session-config>
            <session-timeout>30</session-timeout>
    </session-config>

5.3 session和cookie的区别

  • session存储在服务器端,cookie存储在客户端
  • session没有数据大小的限制,cookie有
  • session数据安全,cookie相对不安全

6.Json

6.1 Json是什么

JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。现在基本不使用XML传输数据了。

  • []中括号代表的是一个数组;、
  • {}大括号代表的是一个对象
  • 双引号“”表示的是属性值
  • 冒号:代表的是前后之间的关系,冒号前面是属性的名称,后面是属性的值。

    6.2 Json的转换

    6.2.1 前端

    //JSON字符串转换为JavaScript 对象,使用 JSON.parse() 方法:
    var obj = JSON.parse('{"a": "Hello", "b": "World"}');
    //JavaScript 对象转换为JSON字符串,使用 JSON.stringify() 方法:
    var json = JSON.stringify({a: 'Hello', b: 'World'});
    

    6.2.1 后端

    一般使用第三方类库进行转换,如FastJson、Gson等