javaWeb

JDBC

  • 说明

    • JDBC规范定义接口,具体的实现由各大数据库厂商来实现
    • 程序员如果要开发访问数据库的程序,只需要会调用JDBC接口中的方法即可,不用关注类是如何实现的。
    • 使用同一套Java代码,进行少量的修改就可以访问其他JDBC支持的数据库
  • 核心api

    • DriverManager类                		管理和注册数据库驱动,得到数据库连接对象
      Connection接口						一个连接对象,可用于创建Statement和PreparedStatement对象
      Statement接口							一个SQL语句对象,用户SQL语句发送给数据库服务器
      PreparedStatemem接口					一个SQL语句对象,是Stalement的子接口
      REsultSet接口							用于封装数据库查询的结果集,返回给客户端java程序
      
  • 导入驱动Jar包

    • 下载JDBC的包
    • 项目根目录新建lib目录,导入jar包
    • 项目Model(模块)依赖中导入jar包
  • 连接步骤

    • 1、注册驱动
      Class.forName(com.mysql.cj.jdbc.Driver);
      2、创建数据库连接
      url格式:jdbc:数据库://本地端口3306/数据库名?跨时区参数
      username:数据库账号
      password:密码
      Connection conn = DriverManager.getConnection(url,username, password);
      3、Connection获取Statement对象
      4、使用Statement对象执行SQL语句
      5、ResultSet接口 返回结果集
      6、释放资源
      

Statement中的方法

  • executeUpdate(sql)				用于发送DML语句,增删改操作,参数为:sql语句、返回值为:影响行数
    executeQuery(String sql)   		用于发送DML语句,执行查询操作,参数为:sql语句、返回值为:影响行数
    
  • 案例:

    • package JDBCDemo;
      
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.SQLException;
      import java.sql.Statement;
      
      public class CreateTable {
          public static void main(String[] args) throws ClassNotFoundException, SQLException {
              // 注册驱动
              Class.forName("com.mysql.cj.jdbc.Driver");
      
              // 创建连接
              String url = "jdbc:mysql://localhost:3306/yii2basic?serverTimezone=Asia/Shanghai";
              String username = "root";
              String password = "root";
              Connection conn = DriverManager.getConnection(url,username,password);
              System.out.println(conn);
      
              // 获取执行对象
              Statement state = conn.createStatement();
      
              // 执行sql语句
              String sql = "update goods set num = 10 where id = 1 ";
              int result =  state.executeUpdate(sql);
              System.out.println(result);
          }
      }
      

ResultSet接口

  • 作用:封装数据库查询的结果集,对结果集进行遍历,取出每一条记录

  • 方法:

    • next() 						指针向下移动1行,返回bool类型,如果还有下一条返回为true,否咋false
      get数据类型()				 通过字段名,参数是String类型。返回不同的类型,通过列号,参数是整数,从1开始。返回不同的类型
      

数据库工具类JdbcUtils

  • 把公共的方法单独封装

  • 案例

    • package JDBCDemo;
      
      import java.sql.*;
      
      public class JdbcUtils {
          private static final String URL = "jdbc:mysql://localhost:3306/yii2basic?serverTimezone=Asia/Shanghai";
          private static final String USERNAME = "root";
          private static final String PASSWORD = "root";
          private static final String DRIVER = "com.mysql.cj.jdbc.Driver";
      
          /*
            注册驱动
           */
          static {
              try{
                  Class.forName(JdbcUtils.DRIVER);
              }catch (ClassNotFoundException e){
                  e.printStackTrace();
              }
          }
      
          /*
              创建数据库连接
           */
          public static Connection getConnection() throws SQLException {
              return DriverManager.getConnection(JdbcUtils.URL,JdbcUtils.USERNAME,JdbcUtils.PASSWORD);
          }
      
          /*
              关闭所有打开的资源
           */
          public static void close (Connection connection, Statement statement) {
              if(statement != null){
                  try{
                      statement.close();
                  }catch (SQLException e){
                      e.printStackTrace();
                  }
              }
      
              if(connection != null){
                  try {
                      connection.close();
                  }catch (SQLException e){
                      e.printStackTrace();
                  }
              }
          }
      
          /*
              关闭所有打开的资源
           */
          public static void close (Connection connection, Statement statement,ResultSet resultSet) {
              if(resultSet != null){
                  try{
                      resultSet.close();
                  }catch (SQLException e){
                      e.printStackTrace();
                  }
              }
          }
      }
      

PreparedStatement接口

  • PreparedStatement 是 Statement 接口的子接口,继承于父类接口中的所有方法,他是一个预编译的sql语句 (效率较高)

  • 方法

    • PreparedStatement prepareStatement(Stringsql)		指定预编译的sql语句,sql语句中使用占位符? 创建一个语句对象
      int executeUpdate()执行DML,增删改的操作,返回影响的行数。
      ResultSet  executeQuery()执行DQL,查询的操作,返回结果集
      
  • 优势

    • prepareStatement()会先将SQL语句发送给数据库预编译
    • PreparedStatement会引用着预编译后的结果。可以多次传入不同的参数
    • PreparedStatement对象并执行。减少SQL编译次数,提高效率。2.安全性更高,没有SQL注入的隐患。3.提高了程序的可读性
  • 步骤

    • 编写SQL语句,未知内容使用?占位:“SELECT*FROMuserWHEREname=?ANDpassword=?”;
    • 2)获得PreparedStatement对象
    • 3)设置实际参数:setXxx(占位符的位置,真实的值)
    • 4)执行参数化SQL语句5)关闭资源

事务处理

  • 方法

    • setAutoCommit(boolean autoCommit)  参数是true/false  自动提交
      commit()				提交事务
      rollback()				回滚事务
      

连接池

  • 其实就是一个容器(集合),存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器
c3p0
  • 安装

    • 导入jar包 (两个) c3p0-0.9.5.2.jar 以及mchange-commons-java-0.2.12.jar

    • 定义配置文件,src新建c3p0-config.xml

      • <c3p0-config>
          <!-- 使用默认的配置读取连接池对象 -->
          <default-config>
          	<!--  连接参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql:///yii2basic?serverTimezone=UTC</property>
            <property name="user">root</property>
            <property name="password">root</property>
            
            <!-- 连接池参数 -->
        <!--    初始化连接对象-->
            <property name="initialPoolSize">5</property>
        <!--    最大的连接数-->
            <property name="maxPoolSize">10</property>
        <!--    超时时间-->
            <property name="checkoutTimeout">3000</property>
          </default-config>
        
          <named-config name="otherc3p0"> 
            <!--  连接参数 -->
            <property name="driverClass">com.mysql.jdbc.Driver</property>
            <property name="jdbcUrl">jdbc:mysql:///yii2basic?serverTimezone=UTC</property>
            <property name="user">root</property>
            <property name="password">root</property>
            
            <!-- 连接池参数 -->
            <property name="initialPoolSize">5</property>
            <property name="maxPoolSize">8</property>
            <property name="checkoutTimeout">1000</property>
          </named-config>
        </c3p0-config>
        
    • 项目模块中新增,导入的jar依赖

    • 案例:

    • package JDBCDemo;
      
      import com.mchange.v2.c3p0.ComboPooledDataSource;
      
      import java.sql.Connection;
      import java.sql.ResultSet;
      import java.sql.SQLException;
      import java.sql.Statement;
      
      public class C3P0Demo {
          public static void main(String[] args) throws SQLException {
              // 创建连接对象
              ComboPooledDataSource ds = new ComboPooledDataSource();
              Connection conn =  ds.getConnection();
              //System.out.println(conn);
              Statement statement = conn.createStatement();
              String sql = "select * from user";
              ResultSet res =  statement.executeQuery(sql);
              while (res.next()){
                  String username=res.getString("username");
                  String password=res.getString("password");
                  System.out.println(username+"\t"+password+"\t");
              }
              conn.close();
          }
      }
      
Druid
  • 安装

    • 导入druid-1.0.9.jar包

    • 项目模块引入包依赖

    • 生成配置文件(存放src目录下边)

      • driverClassName=com.mysql.cj.jdbc.Driver
        url=jdbc:mysql://localhost:3306/yii2basic?serverTimezone=UTC
        username=root
        password=root
        initialSize=5
        maxActive=10
        maxWait=3000
        
    • 案例:

      • package JDBCDemo;
        
        import com.alibaba.druid.pool.DruidDataSourceFactory;
        
        import javax.sql.DataSource;
        import java.sql.Connection;
        import java.sql.ResultSet;
        import java.sql.Statement;
        import java.util.Properties;
        import JdbcUtils.*;
        
        public class DruidDemo {
            public static void main(String[] args) throws Exception {
                // 加载配置文件
                Properties pro = new Properties();
                pro.load(DruidDemo.class.getClassLoader().getResourceAsStream("druid.properties"));
        
                // 获取连接资源
                DataSource ds = DruidDataSourceFactory.createDataSource(pro);
        
                // 获取连接
                Connection conn = ds.getConnection();
        
                Statement statement = conn.createStatement();
                String sql = "select * from user";
                ResultSet res =  statement.executeQuery(sql);
                while (res.next()){
                    String username=res.getString("username");
                    String password=res.getString("password");
                    System.out.println(username+"\t"+password+"\t");
                }
                conn.close();
        
        //        Connection conn = JDBCUtils.getConnection();
        //        Statement statement = conn.createStatement();
        //        String sql = "select * from user";
        //        ResultSet res =  statement.executeQuery(sql);
        //        while (res.next()){
        //            String username=res.getString("username");
        //            String password=res.getString("password");
        //            System.out.println(username+"\t"+password+"\t");
        //        }
        //        conn.close();
            }
        }
        
spring JDBC
  • 安装

    • 导入包:commons-logging-1.2、spring-beans-5.0.0.RELEASE、spring-core-5.0.0.RELEASE、spring-jdbc-5.0.0.RELEASE、spring-tx-5.0.0.RELEASE
    • 分别导入项目依赖
    • 创建JdbcTemplate对象。依赖于数据源DataSource, JdbcTemplate template = new JdbcTemplate(ds); (可以基于封装的Druid类)
    • 调用JdbcTemplate的方法来完成CRUD的操作
  • 方法

    • update():							执行DML语句。增、删、改语句,参数sql必填,其他未为占位符,对应的实参
      
      queryForMap():						查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合,注意:这个方法查询的结果集长度只能是1
      
      queryForList():						查询结果将结果集封装为list集合,注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中
      
      query():							查询结果,将结果封装为JavaBean对象,
      (1)query的参数:RowMapper
      (2)一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装new BeanPropertyRowMapper<类型>(类型.class)
      
      queryForObject:						查询结果,将结果封装为对象,一般用于聚合函数的查询,第一参数sql必填,第二,定影返回值类型对象,其他未为占位符,对应的实参
      
  • 案例

    • package JDBCDemo;
      
      import org.springframework.jdbc.core.JdbcTemplate;
      import JdbcUtils.*;
      
      public class SpringDemo {
          public static void main(String[] args) {
              // 创建spring jdbc数据连接对象
              JdbcTemplate template = new JdbcTemplate(JDBCUtils.getDataSource());
              String sql = "update goods set num = 100 where id = 1";
              int res = template.update(sql);
              System.out.println(res);
          }
      }
      

xml

  • 安装

    • 导入xml的jar包到lib目录下jsoup-1.11.2.jar
    • 项目模块引入jar依赖
    • 完成
  • 步骤

    • 导入jar包
    • 获取Document对象
    • 获取对应的标签Element对象
    • 获取数据
  • 案例

    • 新建一个xml文件放置src目录下

    • package Xml;
      
      
      import org.jsoup.Jsoup;
      import org.jsoup.nodes.Document;
      import org.jsoup.nodes.Element;
      import org.jsoup.select.Elements;
      
      import java.io.File;
      import java.io.IOException;
      
      public class XmlDemo {
          public static void main(String[] args) throws IOException {
              // 获取 xml资源路径
              String path = XmlDemo.class.getClassLoader().getResource("StudentsDemo.xml").getPath();
      
              // 解析xml文档,加载文档进内存,获取dom树--->Document
              Document document = Jsoup.parse(new File(path), "utf-8");
              //.获取元素对象 Element
              Elements elements = document.getElementsByTag("name");
              
              //3.1获取第一个name的Element对象
              Element element = elements.get(0);
              //3.2获取数据
              String name = element.text();
              System.out.println(name);
          }
      }
      

方法

  • Jsoup:工具类,可以解析html或xml文档,返回Document

    • parse:解析html或xml文档,返回Document
      	parse​(File in, String charsetName):	解析xml或html文件的。
      	parse​(String html):					解析xml或html字符串
      	parse​(URL url, int timeoutMillis):		通过网络路径获取指定的html或
      
  • Document:文档对象。代表内存中的dom树

    • 获取Element对象
      	getElementById​(String id):				根据id属性值获取唯一的element对象
      	getElementsByTag​(String tagName):		根据标签名称获取元素对象集合
      	getElementsByAttribute​(String key):	根据属性名称获取元素对象集合
      	getElementsByAttributeValue​(String key, String value)根据对应的属性名和属性值获取元素对象集合
      
  • Elements:元素Element对象的集合。可以当做 ArrayList来使用

  • Element:元素对象

    • 1. 获取子元素对象
      				* getElementById​(String id):根据id属性值获取唯一的element对象
      				* getElementsByTag​(String tagName):根据标签名称获取元素对象集合
      				* getElementsByAttribute​(String key):根据属性名称获取元素对象集合
      				* getElementsByAttributeValue​(String key, String value):根据对应的属性名和属性值获取元素对象集合
      
      2. 获取属性值
      				* String attr(String key):根据属性名称获取属性值
      3. 获取文本内容
      				* String text():获取文本内容
      				* String html():获取标签体的所有内容(包括字标签的字符串内容)
      

Tomcat

1. 下载:http://tomcat.apache.org/
	2. 安装:解压压缩包即可。
		* 注意:安装目录建议不要有中文和空格
	3. 卸载:删除目录就行了
	4. 启动:
		* bin/startup.bat ,双击运行该文件即可
		* 访问:浏览器输入:http://localhost:8080 回车访问自己
						  http://别人的ip:8080 访问别人
		
		* 可能遇到的问题:
			1. 黑窗口一闪而过:
				* 原因: 没有正确配置JAVA_HOME环境变量
				* 解决方案:正确配置JAVA_HOME环境变量

			2. 启动报错:
				1. 暴力:找到占用的端口号,并且找到对应的进程,杀死该进程
					* netstat -ano
				2. 温柔:修改自身的端口号
					* conf/server.xml
					* <Connector port="8888" protocol="HTTP/1.1"
		               connectionTimeout="20000"
		               redirectPort="8445" />
					* 一般会将tomcat的默认端口号修改为80。80端口号是http协议的默认端口号。
						* 好处:在访问时,就不用输入端口号
	5. 关闭:
		1. 正常关闭:
			* bin/shutdown.bat
			* ctrl+c
		2. 强制关闭:
			* 点击启动窗口的×
	6. 配置:
		* 部署项目的方式:
			1. 直接将项目放到webapps目录下即可。
				* /hello:项目的访问路径-->虚拟目录
				* 简化部署:将项目打成一个war包,再将war包放置到webapps目录下。
					* war包会自动解压缩

			2. 配置conf/server.xml文件
				在<Host>标签体中配置
				<Context docBase="D:\hello" path="/hehe" />
				* docBase:项目存放的路径
				* path:虚拟目录

			3. 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写(推荐使用这个:热部署)
				<Context docBase="D:\hello" />
				* 虚拟目录:xml文件的名称
		
		* 静态项目和动态项目:
			* 目录结构
				* java动态项目的目录结构:
					-- 项目的根目录
						-- WEB-INF目录:
							-- web.xml:web项目的核心配置文件
							-- classes目录:放置字节码文件的目录
							-- lib目录:放置依赖的jar包		
		* 将Tomcat集成到IDEA中,并且创建JavaEE的项目,部署项目。

server applet

  • 概念:运行在服务器端的小程序

    • Servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则。
    • 将来我们自定义一个类,实现Servlet接口,复写方法。
  • 安装

    • 把servlet-api.jar包导入项目jdk里面

    • 新建一个包,新建一个类继承Servlet接口,及实现其中的方法

    • 配置Servlet,在web.xml中编辑配置

      • <!--配置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>	url的资源路径
        	    </servlet-mapping>
        
  • 执行原理:

      1. 当服务器接受到客户端浏览器的请求后,会解析请求URL路径,获取访问的Servlet的资源路径
      2. 查找web.xml文件,是否有对应的标签体内容。
      3. 如果有,则在找到对应的全类名
      4. tomcat会将字节码文件加载进内存,并且创建其对象
      5. 调用其方法
  • 生命周期

    • 被创建:执行init方法,只执行一次
    • 提供服务:执行service方法,执行多次
    • 被销毁:执行destroy方法,只执行一次
  • 安全问题

    • 尽量不要在Servlet类里面定义成员变量
    • 每次访问service方法都会被调用一次

Servlet3注解

  • 前提条件jdk6以上
  • 创建JavaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
  • 定义一个类,实现Servlet接口
  • 复写方法service方法输出内容
  • 在类的上方@WebServlet(“路由”)

Servlet体系结构

GenericServlet 抽象类
  • 将Servlet接口中其他的方法做了默认空实现,只将service()方法作为抽象
  • 将来定义Servlet类时,可以继承GenericServlet,实现service()方法即可
HttpServlet 抽象类
  • 对http协议进行封装,只需重写方法即可

  • 定义类继承HttpServlet

  • 复写doGet/doPost方法既可以实现功能

    • 一个Servlet可以定义多个访问路径 : @WebServlet({"/d4","/dd4","/ddd4"})

    • 路径定义规则:

      • /xxx:路径匹配
      • /xxx/xxx:多层路径,目录结构
      • *.do:扩展名匹配

http

  • 概念
    • 超文本传输协议
    • 定义了,客户端和服务器端通信时,发送数据的格式
  • 特点
    • 基于TCP/IP的高级协议
    • 默认端口号:80
    • 基于请求/响应模型的:一次请求对应一次响应
    • 无状态的:每次请求之间相互独立,不能交互数据
  • 历史版本
    • 1.0:每一次请求响应都会建立新的连接
    • 1.1:复用连接

Request请求

  • 主要是获取请求信息的一个类

体系结构

获取请求消息数据
  • 获取请求行数据

    • String getMethod()  						获取请求方式
      String getContextPath()						获取虚拟目录
      String getServletPath()						获取Servlet路径
      String getQueryString(String name)			获取get方式请求参数
      String getRequestURI():						获取请求URI
      String getProtocol()						获取协议及版本
      String getRemoteAddr()						获取客户机的IP地址
      
  • 获取请求头

    • String getHeader(String name)			通过请求头的名称获取请求头的值
      Enumeration<String> getHeaderNames()		获取所有的请求头名称
      
  • 获取请求体数据

    • 获取流对象
      • BufferedReader getReader():获取字符输入流,只能操作字符数据
      • ServletInputStream getInputStream():获取字节输入流,可以操作所有类型数据
    • 再从流对象中拿数据
其他功能
  • 1. String getParameter(String name):			根据参数名称获取参数值    username=zs&password=123
    2. String[] getParameterValues(String name):	根据参数名称获取参数值的数组,一般用于表单的复选框  hobby=xx&hobby=game
    3. Enumeration<String> getParameterNames():		获取所有请求的参数名称
    4. Map<String,String[]> getParameterMap():		获取所有参数的map集合
    
    // 中文乱码
        get方式:tomcat 8 已经将get方式乱码问题解决了
        post方式:会乱码
        解决:在获取参数前,设置request的编码request.setCharacterEncoding("utf-8");
    
    // 请求转发:一种在服务器内部的资源跳转方式
        1. 步骤:
                        1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
                        2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 
        2. 特点:
                        1. 浏览器地址栏路径不发生变化
                        2. 只能转发到当前服务器内部资源中。
                        3. 转发是一次请求
    				
    // 共享数据:域对象:一个有作用范围的对象,可以在范围内共享数据
    			* request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据
    			* 方法:
    				1. void setAttribute(String key,Object value):存储数据
    				2. Object getAttitude(String key):通过键获取值
    				3. void removeAttribute(String name):通过键移除键值对	
    
    // 获取ServletContext:
    		ServletContext getServletContext()		
    
封装请求参数类
  • 简化数据封装

    • 安装 导入BeanUtils包
      1、创建实体类
      2、获取请求参数到map集合
      3、使用BeanUtils类的方法populate(mian,params)
      
  • 方法

    • 1. setProperty()
      2. getProperty()
      3. populate(Object obj , Map map):	将map集合的键值对信息,封装到对应的JavaBean对象中
      
  • 实体类注意事项

    • 1. 类必须被public修饰
      				2. 必须提供空参的构造器
      				3. 成员变量必须使用private修饰
      				4. 提供公共setter和getter方法
      

Response响应

  • 响应

    • 数据格式:
      		1. 请求行
      		2. 请求头
      		3. 请求空行
      		4. 请求体
      
  • * 功能:设置响应消息
    	1. 设置响应行
    		1. 格式:HTTP/1.1 200 ok
    		2. 设置状态码:setStatus(int sc) 
    	2. 设置响应头:setHeader(String name, String value) 
    		
    	3. 设置响应体:
    		* 使用步骤:
    			1. 获取输出流
    				* 字符输出流:PrintWriter getWriter()
    
    				* 字节输出流:ServletOutputStream getOutputStream()
    
    			2. 使用输出流,将数据输出到客户端浏览器
    			
    	4、乱码问题:
    				1. PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
    				2. 设置该流的默认编码
    				3. 告诉浏览器响应体使用的编码
    
    				//简单的形式,设置编码,是在获取流之前设置
        			response.setContentType("text/html;charset=utf-8");
    
  • 案例

    • package cn.itcast.web.Response;
      
      import jakarta.servlet.ServletException;
      import jakarta.servlet.annotation.WebServlet;
      import jakarta.servlet.http.HttpServlet;
      import jakarta.servlet.http.HttpServletRequest;
      import jakarta.servlet.http.HttpServletResponse;
      
      import java.io.IOException;
      
      @WebServlet("/ResDemo")
      public class ResponseDemo extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              System.out.println("我是demo1");
              //设置响应行
                  // 这种方式是通过http状态实现重定向
                  // resp.setStatus(302);
      
      
              //设置响应头
                  //resp.setHeader("location","/ResDemo2");
      
      
              //设置响应体
                  // 直接使用重定向方法
                  // resp.sendRedirect("/ResDemo2");
               // 获取输出流
              resp.setContentType("text/html;charset=utf-8");
              PrintWriter printWriter = resp.getWriter();
      
              // 输出数据
              printWriter.write("输出成功,<br>");
              printWriter.write("输出成功1111111");
          }
          @Override
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              doGet(req,resp);
          }
      }
      
      

ServletContext对象

  • 概念:代表整个web应用,可以和程序的容器(服务器)来通信

  • 获取

    • 通过request对象获取
      • request.getServletContext();
    • 通过HttpServlet获取
    • this.getServletContext();
  • 功能

    • 功能:
      	1. 获取MIME类型:
      		* MIME类型:在互联网通信过程中定义的一种文件数据类型
      			* 格式: 大类型/小类型   text/html		image/jpeg
      
      		* 获取:String getMimeType(String file)  
      	2. 域对象:共享数据
      		1. setAttribute(String name,Object value)
      		2. getAttribute(String name)
      		3. removeAttribute(String name)
      
      		* ServletContext对象范围:所有用户所有请求的数据
      	3. 获取文件的真实(服务器)路径
      		1. 方法:String getRealPath(String path)  
      			 String b = context.getRealPath("/b.txt");//web目录下资源访问
      	         System.out.println(b);
      	
      	        String c = context.getRealPath("/WEB-INF/c.txt");//WEB-INF目录下的资源访问
      	        System.out.println(c);
      	
      	        String a = context.getRealPath("/WEB-INF/classes/a.txt");//src目录下的资源访问
      	        System.out.println(a);
      

Cookie

  • 方法:

    • 快速入门:
      	* 使用步骤:
      		1. 创建Cookie对象,绑定数据
      			* new Cookie(String name, String value) 
      		2. 发送Cookie对象
      			* response.addCookie(Cookie cookie) 
      		3. 获取Cookie,拿到数据
      			* Cookie[]  request.getCookies()  获取所有cookie到数组
      			cookie.getname()  获取名字
      			cookoe.getValue()  获取cookie值
      			cookie.setMaxAge() 设置存活时间
      		4、如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
      			 Cookie c = new Cookie("JSESSIONID",session.getId());
      	         c.setMaxAge(60*60);
      	         response.addCookie(c);	
      
  • 案例

    •  protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              Cookie c = new Cookie("name","须臾钱");
              resp.addCookie(c);
          }
          
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
              resp.setContentType("text/html;charset=utf-8");
              PrintWriter printWriter = resp.getWriter();
             Cookie[] cookies = req.getCookies();
              if (cookies != null) {
                  for (Cookie a : cookies){
                      // 输出数据
                      printWriter.write(a.getName());
                      printWriter.write(a.getValue());
                  }
              }
        
          }
      

JSP基础

1. 概念:
	* Java Server Pages: java服务器端页面
		* 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
		* 用于简化书写!!!
		
2、 JSP的脚本:JSP定义Java代码的方式
	1. <%  代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
	2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
	3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。		
	
4. JSP的内置对象:
	* 在jsp页面中不需要获取和创建,可以直接使用的对象
	* jsp一共有9个内置对象。
	* 今天学习3个:
		* request
		* response
		* out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
			* response.getWriter()和out.write()的区别:
				* 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
				* response.getWriter()数据输出永远在out.write()之前	

Session

  • 概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。使用依赖于HttpSession,session基于cookie生存

  • 方法

    • 1. 获取HttpSession对象:
      		HttpSession session = request.getSession();
      2. 使用HttpSession对象:
      		Object getAttribute(String name)  
      		void setAttribute(String name, Object value)
      		void removeAttribute(String name)  
      
  • 细节

    • session的钝化:
      		* 在服务器正常关闭之前,将session对象系列化到硬盘上
      		* session的活化:
      		* 在服务器启动后,将session文件转化为内存中的session对象即可。
      		
      session什么时候被销毁?
      		1. 服务器关闭
      		2. session对象调用invalidate() 。
      		3. session默认失效时间 30分钟
      			选择性配置修改	
      			<session-config>
      		        <session-timeout>30</session-timeout>
      		    </session-config>
      		    
       session的特点
       		1. session用于存储一次会话的多次请求的数据,存在服务器端
      	 	2. session可以存储任意类型,任意大小的数据
      	 	
      session与Cookie的区别	 	
      	 	1. session存储数据在服务器端,Cookie在客户端
      		2. session没有数据大小限制,Cookie有
      		3. session数据安全,Cookie相对于不安全
      

Filter过滤器

  • web中的过滤器:当访问服务器的资源时,过滤器可以将请求拦截下来,完成一些特殊的功能。

  • 过滤器的作用:

  • 一般用于完成通用的操作。如:登录验证、统一编码处理、敏感字符过滤…

  • 步骤

    • 1. 定义一个类,实现接口Filter
      		2. 复写方法
      		3. 配置拦截路径
      			1. web.xml
      			2. 注解
      
  • 案例

    • @WebFilter("/*")
      public class FilterDemo implements Filter {
      
          @Override
          public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
              System.out.println("我是过滤器");
      
              // 放行
              filterChain.doFilter(servletRequest,servletResponse);
          }
      }
      
  • 细节

    • 过滤器细节:
      	1. web.xml配置	
      		<filter>
      	        <filter-name>demo1</filter-name>
      	        <filter-class>cn.itcast.web.filter.FilterDemo1</filter-class>
      	    </filter>
      	    <filter-mapping>
      	        <filter-name>demo1</filter-name>
      			<!-- 拦截路径 -->
      	        <url-pattern>/*</url-pattern>
      	    </filter-mapping>
      	2. 过滤器执行流程
      		1. 执行过滤器
      		2. 执行放行后的资源
      		3. 回来执行过滤器放行代码下边的代码
      	3. 过滤器生命周期方法
      		1. init:在服务器启动后,会创建Filter对象,然后调用init方法。只执行一次。用于加载资源
      		2. doFilter:每一次请求被拦截资源时,会执行。执行多次
      		3. destroy:在服务器关闭后,Filter对象被销毁。如果服务器是正常关闭,则会执行destroy方法。只执行一次。用于释放资源
      	4. 过滤器配置详解
      		* 拦截路径配置:
      			1. 具体资源路径: /index.jsp   只有访问index.jsp资源时,过滤器才会被执行
      			2. 拦截目录: /user/*	访问/user下的所有资源时,过滤器都会被执行
      			3. 后缀名拦截: *.jsp		访问所有后缀名为jsp资源时,过滤器都会被执行
      			4. 拦截所有资源:/*		访问所有资源时,过滤器都会被执行
      		* 拦截方式配置:资源被访问的方式
      			* 注解配置:
      				* 设置dispatcherTypes属性
      					1. REQUEST:默认值。浏览器直接请求资源
      					2. FORWARD:转发访问资源
      					3. INCLUDE:包含访问资源
      					4. ERROR:错误跳转资源
      					5. ASYNC:异步访问资源
      			* web.xml配置
      				* 设置<dispatcher></dispatcher>标签即可
      			
      	5. 过滤器链(配置多个过滤器)
      		* 执行顺序:如果有两个过滤器:过滤器1和过滤器2
      			1. 过滤器1
      			2. 过滤器2
      			3. 资源执行
      			4. 过滤器2
      			5. 过滤器1 
      
      		* 过滤器先后顺序问题:
      			1. 注解配置:按照类名的字符串比较规则比较,值小的先执行
      				* 如: AFilter 和 BFilter,AFilter就先执行了。
      			2. web.xml配置: <filter-mapping>谁定义在上边,谁先执行
      

增强对象的功能

		代理模式
				概念:
					1. 真实对象:被代理的对象
					2. 代理对象:
					3. 代理模式:代理对象代理真实对象,达到增强真实对象功能的目的
			 	* 实现方式:
				 	1. 静态代理:有一个类文件描述代理模式
				 	2. 动态代理:在内存中形成代理类
						* 实现步骤:
							1. 代理对象和真实对象实现相同的接口
							2. 代理对象 = Proxy.newProxyInstance();
							3. 使用代理对象调用方法。
							4. 增强方法

						* 增强方式:
							1. 增强参数列表
							2. 增强返回值类型
							3. 增强方法体执行逻辑	

Listener:监听器

* 概念:web的三大组件之一。
	* 事件监听机制
		* 事件	:一件事情
		* 事件源 :事件发生的地方
		* 监听器 :一个对象
		* 注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码

* ServletContextListener:监听ServletContext对象的创建和销毁
	* 方法:
		* void contextDestroyed(ServletContextEvent sce) :ServletContext对象被销毁之前会调用该方法
		* void contextInitialized(ServletContextEvent sce) :ServletContext对象创建后会调用该方法
	* 步骤:
		1. 定义一个类,实现ServletContextListener接口
		2. 复写方法
		3. 配置
			1. web.xml
					<listener>
 					 <listener-class>cn.itcast.web.listener.ContextLoaderListener</listener-class>
					</listener>

					* 指定初始化参数<context-param>
			2. 注解:
				* @WebListener

Redis

  • 安装

    • 下载jedis的jar包
      导入包
      //1. 获取连接
      Jedis jedis = new Jedis("localhost",6379);
      //2. 操作
      jedis.set("username","zhangsan");
      //3. 关闭连接
      jedis.close();
      
  • 方法

    •  			redis 全局方法
                      // 删除一个key
                          jedis.del(key)
                      // 设置登录密码
                          jedis.auth(password)
                      // 关闭连接
                          jedis.close();
            
                  string 类型
                      // 设置单个
                          jedis.set("name","大帅哥");
                      //设置多个键值对
                          jedis.mset("name1","liuling","age","23","qq","476777XXX");
                      // 设置过期时间
                          jedis.setex("name1",10,"hah");
                      // 获取
                          String name = jedis.get("name");
            
                  哈希类型 hash 对应map格式
                      // 设置
                          hset(key,filed1,value1)
                      // 获取key 下面的 field
                          hget(key,filed1)
                      // 获取key
                          hgetAll(key)
            
                 列表类型 list :linkedlist格式。支持重复元素
                      // 从左设置 从右获取
                          lpush / rpush
                      // 从右设置 从左获取
            			        lpop / rpop
            			    //  范围获取
            			        lrange start end
            
            			set 集合类型 不允许重复元素
            			    无序集合
            			        //设置
            			        sadd(key,value,value1)
            			        //获取所有元素
            			        smembers(key):
            			    有序集合
            			        // 设置
            			        zadd(key,num,value)
            			        zrange(key,start end)
      

json

  • ObjectMapper mapper = new ObjectMapper();
    province_json =  mapper.writeValueAsString(list);
    
    新建一个接口的流程
    
    	新建数据库实体类
    	DAO层操作数据库
    	Service层调用DAO实现业务操作逻辑
    	Servlet调用Service层方法响应数据
    

Maven

  • Maven 的一个核心特性就是依赖管理
  • 统一管理项目jar包。资源及配置的整合
  • 编译打包
  • 单元测试

执行流程

  • maven 将项目构建的过程进行标准化,每个阶段使用一个命令完成具体执行过程为L:
  • 清理----编译----测试----报告----打包------部署

安装

  • 下载安装包解压
  • 配置环境变量后输入 mvn -v可以查看版本

仓库管理

  • 默认本地仓库位置在 u s e r . d i r / . m 2 / r e p o s i t o r y , {user.dir}/.m2/repository, user.dir/.m2/repository{user.dir}表示 windows 用户目录。
  • 远程仓库:如果本地需要插件或者 jar 包,本地仓库没有,默认去远程仓库下载。
    远程仓库可以在互联网内也可以在局域网内。
  • 中央仓库 :在 maven 软件中内置一个远程仓库地址 http://repo1.maven.org/maven2 ,它是中央仓库,服务于整个互联网,它是由 Maven 团队自己维护,里面存储了非常全的 jar 包,它包含了世界上大部分流行的开源项目构件。

目录结构

  • src/main/java —— 存放项目的.java 文件
    src/main/resources —— 存放项目资源文件,如 spring, hibernate 配置文件
    src/test/java —— 存放所有单元测试.java 文件,如 JUnit 测试类
    src/test/resources —— 测试资源文件
    src/main/webapp------javaWeb工程的静态资源
    target —— 项目输出位置,编译后的 class 文件会输出到此目录
    pom.xml——maven 项目核心配置文件
    

常用命令

  • mvn -clean 删除已编译的编译文件(拉项目第一次时使用)

  • mvn -compile 的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target
    目录下

  • mvn -test 的编译命令,作用是将 src/main/java 下的文件编译为 class 文件输出到 target
    目录下

  • mvn -package package 是 maven 工程的打包命令,对于 java 工程执行 package 打成 jar 包,对于 web 工程打成 war包

  • mvn -install install 是 maven 工程的安装命令,执行 install 将 maven 打成 jar 包或 war 包发布到本地仓库。

  • 指令生命周期

    • maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,
      这三套生命周期分别是:
      Clean Lifecycle 在进行真正的构建之前进行一些清理工作。
      Default Lifecycle 构建的核心部分,编译,测试,打包,部署等等。
      Site Lifecycle 生成项目报告,站点,发布站点。
      

创建测试项目

  • 打开系统配置,file->settings->maven
    • 配置安装路径
    • 配置安装路径下的哦欸之文件路径
  • 创建 file–》new–>maven–>选择项目安装模板
  • 最后确定maven的配置路径是否正确
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值